Camera_InAndOut.c 7.5 KB
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>

#include "version_choose.h"
#include "UI_control.h"
#include "BaseConfig.h"

#include "JZsdkLib.h"

#include "./CameraParameter.h"
#include "./V4L2/V4L2_Record.h"
#include "./V4L2/V4L2_CameraParameterSetting.h"
#include "./CameraFeatures/CameraFeatures.h"
#include "./Camera_InAndOut.h"
#include "./VideoTranscode/VideoTranscode.h"
#include "./VideoTranscode/ALLWINER_CedarX/CedarX_InAndOut.h"

int Camera_PushVideoInitFlag = JZ_FLAGCODE_OFF;
int g_CameraStatus = CAMERA_IDLE;

/***********
 * 
 * 检测是否有摄像头
 * 
 * ************/
int CameraCedarX_Test()
{
#if ALLWINNER_CEDAR == VERSION_SWITCH_ON
    CedarX_Test();
#endif
}

/**
 * 
 *  cedar解码
 * 
 * ****/
int CameraCedarX_H264_TO_NV21_DecodeOneFrame(unsigned char *InputBuffer, int InputBufferLenth)
{
#if ALLWINNER_CEDAR == VERSION_SWITCH_ON
    CedarX_DecodeOneFrame(InputBuffer, InputBufferLenth);
#endif
}

/***********
 * 
 * 检测是否有摄像头
 * 
 * ************/
static T_JZsdkReturnCode Camera_CheckForThePresenceOfCameras()
{
    //检测是否存在摄像头
    if (CAMERA_DEVICE_NAME == NULL)
    {
        JZSDK_LOG_ERROR("无摄像头设备号设置");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    
    if(access(CAMERA_DEVICE_NAME, F_OK ) == 0)
	{
		JZSDK_LOG_INFO("摄像头存在");
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
	}
    else
    {
        JZSDK_LOG_ERROR("摄像头不存在,关闭推流模块");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
}

/***********
 * 
 * 建立保存文件夹
 * 
 * ************/
static T_JZsdkReturnCode Camera_MediaFolderBuild()
{
    char RmCmdStr[256];    
    snprintf(RmCmdStr, 256,"mkdir /root/sdcard/DCIM/");
    if( JZsdk_RunSystemCmd(RmCmdStr) ==-1)
    {
        JZSDK_LOG_INFO("已经存在DCIM文件夹");
    }

    snprintf(RmCmdStr, 256,"mkdir /root/sdcard/DCIM/Videos");
    if( JZsdk_RunSystemCmd(RmCmdStr) ==-1)
    {
        JZSDK_LOG_INFO("已经存在Videos文件夹");
    }

    snprintf(RmCmdStr, 256,"mkdir /root/sdcard/DCIM/Photos");
    if( JZsdk_RunSystemCmd(RmCmdStr) ==-1)
    {
        JZSDK_LOG_INFO("已经存在Photos文件夹");
    }

    snprintf(RmCmdStr, 256,"rm /root/sdcard/DCIM/Videos/temp.h264");
    if( JZsdk_RunSystemCmd(RmCmdStr) ==-1)
    {
        JZSDK_LOG_INFO("Videos/temp.h264不存在");
    }

    snprintf(RmCmdStr, 256,"rm /root/sdcard/DCIM/Photos/temp.h264");
    if( JZsdk_RunSystemCmd(RmCmdStr) ==-1)
    {
        JZSDK_LOG_INFO("Photos/temp.h264不存在");
    }
}

/***********
 * 
 * 相机初始化
 * 
 * ************/
static T_JZsdkReturnCode JZsdk_CameraInit()
{
    T_JZsdkReturnCode ret;
    int dev_fd;

    //1、摄像头录制初始化
#if DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T
    ret = V4l2_Camarainit(&dev_fd);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("摄像头录制初始化失败");
        return ret;
    }

    //2、摄像头参数调整
    ret = V4L2_Parameter_Setting(dev_fd);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("摄像头参数调整失败");
        return ret;
    }
#elif DEVICE_VERSION == JZ_IRC
    ret = V4l2_Camarainit(&dev_fd);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("摄像头录制初始化失败");
        return ret;
    }

    //2、摄像头参数调整
    ret = V4L2_Parameter_Setting(dev_fd);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        JZSDK_LOG_ERROR("摄像头参数调整失败");
        return ret;
    }
#else
    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
#endif



    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

T_JZsdkReturnCode JZsdk_Camera_FrameDealThread_UnlockFun()
{
    //解锁一次帧处理函数。以用于处理一帧视频流画面
    CameraFeatures_FrameDealThread_UnlockFun();
}

/***********
 * 
 *  非psdk推流计时线程
 * 
 * ************/
static void *JZsdk_Camera_PushFrame_TimerThread(void *args)
{
    while (1)
    { 
        delayMs(1000/CAMERA_RECORD_FRAME);

        //解锁一次帧处理函数。以用于处理一帧视频流画面
        CameraFeatures_FrameDealThread_UnlockFun();
    }
}

/***********
 * 
 * 推流计时线程初始化
 * 
 * ************/
static int JZsdk_Camera_PushFrame_TimerThread_Init()
{
    pthread_t WriteDataTask;
	pthread_attr_t task_attribute; //线程属性
	pthread_attr_init(&task_attribute);  //初始化线程属性
	pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED);      //设置线程分离属性
	int opus_Protection = pthread_create(&WriteDataTask,&task_attribute,JZsdk_Camera_PushFrame_TimerThread,NULL);		//线程
	if(opus_Protection != 0)
	{
		JZSDK_LOG_ERROR("创建视频转码线程失败!");
		return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
	}

}

/***********
 * 
 * 相机模块初始化
 * 
 * ************/
T_JZsdkReturnCode JZsdk_CameraMuduleInit()
{
    T_JZsdkReturnCode ret;

    //1、建立保存文件夹
    Camera_MediaFolderBuild();

    //2、检测是否有摄像头
    ret = Camera_CheckForThePresenceOfCameras();
    if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE)
    {
        JZSDK_LOG_ERROR("摄像头不存在,相机模块初始化失败");
        return ret;
    }
    
    //3、摄像头初始化
    ret  = JZsdk_CameraInit();
    if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE)
    {
        JZSDK_LOG_ERROR("摄像头参数配置错误,摄像头初始化失败");
        return ret;
    }

    //4、摄像头帧处理线程初始化
    ret = CameraFeatures_FrameDeal_thread_Init();
    if (ret<0)
    {
        JZSDK_LOG_ERROR("4、摄像头帧处理线程初始化线程失败");
        return ret;
    }

    //5、如果是串口模式,则进行推流,推流计时线程初始化
    if (APP_VERSION == APP_UART)
    {
        //JZsdk_Camera_PushFrame_TimerThread_Init();
    }

    //6、转码功能线程初始化
    Video_TransCode_Moudele_Init();

    JZSDK_LOG_INFO("相机模块初始化完成");
    Camera_PushVideoInitFlag = JZ_FLAGCODE_ON;

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/*************************
 * 
 *  检测是否处于录像或是录制中
 * 
 * ******************/
static T_JZsdkReturnCode Camera_CheckVideoMode()
{

}

/**************
 * 
 *  相机功能 录制功能传递函数    
 *  1开启录制 0关闭录制并进行转码
 * 
 * ************/
T_JZsdkReturnCode Camera_VideoRecord_TransMode(int status)
{   
    JZSDK_LOG_INFO("录像功能被调用,模式为%d",status);
    
    return CameraFeatures_VideoRecord_SetMode(status);
}

/**************
 * 
 *  相机功能 拍照功能传递函数    
 *  1开启录制 0关闭录制并进行转码
 * 
 * ************/
T_JZsdkReturnCode Camera_ShootPhoto_TransMode(int num)
{   
    JZSDK_LOG_INFO("拍照功能被调用,拍摄数量为%d",num);

    return FrameDeal_ShootPhoto_trans(num);
}

/**************
 * 
 *   用于对外发送相机情况
 * 
 * **************/
int Camera_Send_CameraStatus(int status)
{
    UIcontrol_Send_CameraStatus(status);
}

/*************
 * 
 *  获取当前相机状态
 * 
 * ********/
T_JZsdkReturnCode Camera_Get_Camera_status(int *Status)
{
    *Status = g_CameraStatus;
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}