VideoStreamTransCode.c 5.7 KB

/* Includes ------------------------------------------------------------------*/
#include <fcntl.h>
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>

// 自建库 
#include "JZsdkLib.h"

#include "version_choose.h"
#include "./VideoStreamTransCode.h"
#include "../VideoMgmt.h"
#include "./ffmpeg_VideoTranscode.h"
#include "../VideoMgmt.h"

int VideoTransCodeMode = JZ_FLAGCODE_OFF; //视频转码模式 off关闭 其他数为数量 通常数量只能为1
int PhotoTransCodeMode = JZ_FLAGCODE_OFF; //拍照转码模式 off关闭 其他数为数量

extern JZ_VideoStreamUseStatus g_VideoStreamDealStatus ;  //视频流的处理状态
extern int ShootModeFlag;  //拍照模式的标志

/*************
 * 
 *  转码通知函数
 *  mode 添加的是什么模式的转码
 * #define VIDEO_TRANSCODE 0x00    //录像转码
    #define SHOOT_TRANSCODE 0x01    //拍照转码
    #define BURSTSHOOT_TARNSCODE 0x02 //连拍转码
 *  num转码的数量
 * **********/
T_JZsdkReturnCode VideoStream_TransCodeIn(int mode, int num)
{
    //如果转码未完成
    if (g_VideoStreamDealStatus == VIDEO_STREAM_TRANSCODE)
    {
        JZSDK_LOG_ERROR("视频转码未完成,禁止进行新的视频转码");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    else if (g_VideoStreamDealStatus == VIDEO_STREAM_IDLE)
    {
        JZSDK_LOG_ERROR("相机处于空闲,不在录像或者拍摄状态,不进行转码");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    
    //如果要求的是转码视频
    if (mode == VIDEO_TRANSCODE && g_VideoStreamDealStatus == VIDEO_STREAM_RECORD)
    {
        //打开转码模式
        VideoTransCodeMode += 1;

        //相机状态为转码
        g_VideoStreamDealStatus = VIDEO_STREAM_TRANSCODE;
    }

    //如果要求的是相片
    else if (mode == SHOOT_TRANSCODE && g_VideoStreamDealStatus == VIDEO_STREAM_SHOOTPHOTO)
    {
        //打开转码模式
        PhotoTransCodeMode += num;

        //相机状态为转码
        g_VideoStreamDealStatus = VIDEO_STREAM_TRANSCODE;
    }

    //要求的是连拍
    else if (mode == BURSTSHOOT_TARNSCODE && g_VideoStreamDealStatus == VIDEO_STREAM_BRUSTSHOORPHOTO)
    {
        /* code */
    }
    
    //都不是
    else
    {
        JZSDK_LOG_ERROR("要求的转码没有与模式对应,禁止转码");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/***************************************************************************************************************

            转码函数部分

*******************************************************************************************************************/
// 拍照转码函数
static void ShootPhoto_transcode()
{
    JZSDK_LOG_INFO("拍照转码");

    //获取当前流的图片尺寸
    int width = 0, height = 0;
    VideoMgmt_Get_StreamWidthAndHeight(&width, &height);
    FFMPEG_ShootPhotoTransCode(width, height);

    //转码数量超出0时
    if (PhotoTransCodeMode > 0)
    {
        //减少拍照的数量
        PhotoTransCodeMode -= 1;
    }

    //如果转码照片数量已经结束了
    if (PhotoTransCodeMode == 0)
    {
        //如果拍照模式已经关闭
        if (ShootModeFlag == JZ_FLAGCODE_OFF)
        {
            //说明拍照 以及 照片的解码都结束了,将相机转为空闲模式
            g_VideoStreamDealStatus = VIDEO_STREAM_IDLE;

            //对外发布相机状态
            VideoMgmt_Send_StreamStatus(VIDEO_STREAM_IDLE);
        }
        //如果拍照模式还没关闭
        else if (ShootModeFlag == JZ_FLAGCODE_ON)
        {
            //说明是定时拍照,继续拍照
            g_VideoStreamDealStatus = VIDEO_STREAM_SHOOTPHOTO;
        }
    }
}

// 录像转码函数
static void RecordVideo_transcode()
{
    JZSDK_LOG_INFO("录像转码");

    FFMPEG_RecordVideoTransCode();

    VideoTransCodeMode = JZ_FLAGCODE_OFF;
    //如果已经完成了所有的录像转码任务,
    if (VideoTransCodeMode == JZ_FLAGCODE_OFF)
    {
        g_VideoStreamDealStatus = VIDEO_STREAM_IDLE;
        
        //对外发布相机状态
        VideoMgmt_Send_StreamStatus(VIDEO_STREAM_IDLE);
    }
}


// 连拍转码函数 暂不使用
static void ShootPhoroBurst_transcode()
{
    
}

/***********
 * 
 * 转码线程
 * 
 * ************/
static void *JZsdk_VideoTranscodeTask(void *args)
{
    while (1)
    { 
        if (VideoTransCodeMode != JZ_FLAGCODE_OFF && g_VideoStreamDealStatus == VIDEO_STREAM_TRANSCODE)
        {
            RecordVideo_transcode();
        }

        if (PhotoTransCodeMode != JZ_FLAGCODE_OFF && g_VideoStreamDealStatus == VIDEO_STREAM_TRANSCODE)
        {
            ShootPhoto_transcode();
        }
        
        //每100ms检测一次是否需要转码
        delayMs(100);
    }
}


/***********
 * 
 *  转码线程初始化
 * 
 * ************/
static int Video_TransCode_Thread_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_VideoTranscodeTask,NULL);		//线程
	if(opus_Protection != 0)
	{
		JZSDK_LOG_ERROR("创建视频转码线程失败!");
		return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
	}

}

/*****
 * 
 * 
 *  视频转码模块初始化
 * 
 * ********/
T_JZsdkReturnCode VideoStreamTransCode_Init()
{
    if (DEVICE_VERSION == JZ_H150S 
        || DEVICE_VERSION == JZ_H150T 
        || DEVICE_VERSION == JZ_C1)
    {
        Video_TransCode_Thread_Init();
    }
    else
    {
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}