CameraFeatures.c 3.1 KB
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>


#include "../CameraParameter.h"
#include "../V4L2/V4L2_Record.h"
#include "JZsdkLib.h"
#include "./CameraFeatures.h"

#include "version_choose.h"

#define DATA_SEND_FROM_VIDEO_STREAM_MAX_LEN  60000
#define VIDEO_FRAME_AUD_LEN                  6

#if APP_VERSION == APP_PSDK
    #include "Dji_Control/DJI_VideoDeal.h"
#endif

static const uint8_t s_frameAudInfo[VIDEO_FRAME_AUD_LEN] = {0x00, 0x00, 0x00, 0x01, 0x09, 0x10};

extern int Camera_PushVideoInitFlag;

pthread_mutex_t FrameDealMutex;

//推流入口
static void CameraFeatures_PsdkPushFrame(char* h264_data, uint32_t data_len, int AudLength)
{

    unsigned int FrameBufSize = 0;
    FrameBufSize = data_len;

    //如果视频为大疆H264型
    if (PUSHFRAME_VIDEO_TPYE == VIDEO_TPYE_DJIH264) 
    {
        FrameBufSize += VIDEO_FRAME_AUD_LEN;
        memcpy(h264_data + data_len, s_frameAudInfo, VIDEO_FRAME_AUD_LEN);
        //printf("大疆264型\n");
    }
    else
    {
        //printf("普通h264\n");
    }

    //放入到对应的传输函数 
#if APP_VERSION == APP_PSDK
    //大疆模式,往大疆入口推流
    DJI_VideoDeal_Push_DJIH264Frame(h264_data, FrameBufSize);
#endif

}


//线程方案
static void *JZsdk_CameraFrameDeal_thread(void *args)
{
   
    int FrameLength;
    int AudLength ;                  //帧尾长度

    JZSDK_LOG_INFO("JZsdk_CameraFrameDeal_thread创建完毕\n");

    while (1)
    {
        pthread_mutex_lock(&FrameDealMutex);

        //如果已经初始化了摄像头及推流部分
        if (Camera_PushVideoInitFlag == JZ_FLAGCODE_OFF)
        {
            continue;
        }
        
        //创建一个缓存区,用于存放视频数据
        char *FrameDealBuffer;
        FrameLength = 0;

        //如果要求的推送的视频流是 djih264
        if (PUSHFRAME_VIDEO_TPYE == VIDEO_TPYE_DJIH264) 
        {
            AudLength = VIDEO_FRAME_AUD_LEN ;
        }
        //如果要求的是普通的h264
        else if (PUSHFRAME_VIDEO_TPYE == VIDEO_TPYE_H264)
        {
            AudLength = 0 ;
        }
        else
        {
            AudLength = 0 ;
        }

        //从摄像头录制并取出一帧数据
        V4L2_CameraFrameRecord(&FrameDealBuffer, &FrameLength, AudLength);

        //拍照处理函数
        V4L2_ShootPhotoDeal(FrameDealBuffer, FrameLength);

        //录像处理函数
        V4L2_RecordVedioDeal(FrameDealBuffer, FrameLength);

        //连拍处理函数
        //FrameDeal_ShootPhotoBurstDeal(FrameDealBuffer, FrameLength);

        //推送一帧
        CameraFeatures_PsdkPushFrame(FrameDealBuffer, FrameLength, AudLength);

        free(FrameDealBuffer);
    }
    
    

    pthread_exit(NULL);
}

T_JZsdkReturnCode CameraFeatures_FrameDeal_thread_Init()
{
    pthread_mutex_init(&FrameDealMutex, NULL); // 创建互斥锁

    pthread_t FrameDeal_thread;

    pthread_create(&FrameDeal_thread, NULL, JZsdk_CameraFrameDeal_thread,  NULL);
}

T_JZsdkReturnCode CameraFeatures_FrameDealThread_UnlockFun()
{
    //解锁帧处理线程
    pthread_mutex_unlock(&FrameDealMutex);

    return 0;
}