VideoMgmt.c 7.9 KB
/**************************************************
 * 
 *    文件名:VideoMgmt.c
 *    视频流模块
 *    版本:V1.0
 *    作用:
 *      在视频流完成处理之后
 *          1、将视频流数据发送到视频流推送模块
 *          2、将视频流数据发送到视频流录制块
 *          3、将视频流数据发送到视频流拍照模块   
 * 
 * **********************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

#include "JZsdkLib.h"
#include "./VideoMgmt.h"
#include "version_choose.h"
#include "BaseConfig.h"

#include "./VideoStreamPush/VideoStream_Push.h"
#include "./VideoStreamRecord/VideoStream_Record.h"
#include "./VideoStreamPhoto/VideoStream_ShootPhoto.h"
#include "UI_control/UI_control.h"
#include "../MediaParm.h"

#include "../MultProc/RTK_mmp/RTK_mmp.h"


JZ_VideoStreamUseStatus g_VideoStreamDealStatus = VIDEO_STREAM_IDLE;  //视频流的处理状态
static int g_VideoFreezeFlag = JZ_FLAGCODE_OFF; //视频流冻结功能

/*********************************************************************************************************************************************
 * 
 * 
 *  视频流流转部分
 * 
 * 
 * *********************************************************************************************************************************************/


static int g_VideoStreamFlowIndexNum = JZ_FLAGCODE_OFF; //视频流转的索引值

int VideoMgmt_GetVideoStreamFlowIndexNum()
{
    return g_VideoStreamFlowIndexNum;
}

//设置流转的视频流
T_JZsdkReturnCode VideoMgmt_VideoStreamFlowIndex(int index)
{
    switch (index)
    {
        case JZ_FLAGCODE_OFF:
        {
            JZSDK_LOG_INFO("切换视频流为关");
            g_VideoStreamFlowIndexNum = index;
        }
        break;
        
        case VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST:
        {
            JZSDK_LOG_INFO("切换视频流为一号");
            g_VideoStreamFlowIndexNum = index;
        }
        break;     

        case VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND:
        {
            JZSDK_LOG_INFO("切换视频流为二号");
            g_VideoStreamFlowIndexNum = index;
        }
        break;   

        case VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD:
        {
            JZSDK_LOG_INFO("切换视频流为三号");
            g_VideoStreamFlowIndexNum = index;
        }
        break;  

        default:
            JZSDK_LOG_ERROR("错误的视频流设置");
            return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
        break;
    }
    
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/**************
 * 
 *   视频流的录像流回放开关
 *  
=
 * ************/
static int Temp_LastVideoStatus = JZ_FLAGCODE_NORMAL;
T_JZsdkReturnCode VideoMgmt_VideoStreamFlow_RecordPlay(int status)
{
    if (status == JZ_FLAGCODE_ON && Temp_LastVideoStatus == JZ_FLAGCODE_NORMAL)
    {
        Temp_LastVideoStatus = g_VideoStreamFlowIndexNum;
        g_VideoStreamFlowIndexNum = VIDEOMGMT_STREAMING_FLOW_INDEX_RECORD;
    }
    else if (status == JZ_FLAGCODE_OFF && Temp_LastVideoStatus != JZ_FLAGCODE_NORMAL)
    {
        g_VideoStreamFlowIndexNum = Temp_LastVideoStatus;
        Temp_LastVideoStatus = JZ_FLAGCODE_NORMAL;
    }
    else
    {
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/******************************
 * 
 *  指定h264流产生一个i帧
 * 
 * *********************************/
T_JZsdkReturnCode VideoStramPhoto_DevelopH264FlowGenerateIDR()
{
#if DEVICE_VERSION == JZ_C1
    switch (g_VideoStreamFlowIndexNum)
    {
        case VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST:
        {
            JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(0);
        }
        break;     

        case VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND:
        {
            JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(1);
        }
        break;

        default:
            return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
        break;
    }
#endif

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/**************
 * 
 *   视频流流转的线程 
 *   视频流处理完成后,可以通过此函数完成拍照记录 录像记录 以及推送
 * 
 * ************/
T_JZsdkReturnCode VideoMgmt_VideoStreamToDeal(unsigned char *data, unsigned int data_len)
{
    //拍照数据
    VideoStramPhoto_PhotoDataIn(data, data_len);

    //录像处理函数
    VideoStramRecord_RecordDataIn(data, data_len);

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

    //推流
    VideoStream_PushFrame(data, data_len);
    //JZSDK_LOG_INFO("推送一帧%d,数据大小%d\n",VideoPush->VideoStreamFlowIndex,data_len);
}


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

/**************
 * 
 *  相机功能 拍摄功能传递函数    
 *  注意,这里需要先检查相机的状态是否是空闲状态
 * 
 * ************/
T_JZsdkReturnCode VideoRecord_ShootPhotoNum(int num)
{
    //通知拍照张数    
    VideoStreamPhoto_SetShootPhotoNum(num);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/**************
 * 
 *   视频流使用状态 
 *  
 * 
 * ************/
T_JZsdkReturnCode VideoStream_GetVideoStreamUseStatus(int *status)
{
    *status = g_VideoStreamDealStatus;
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}

/**************
 * 
 *   视频流冻结 
 *  
 * 
 * ************/
static T_JZsdkReturnCode VideoStream_FreezeVideo(int value)
{
    if (value == JZ_FLAGCODE_ON)
    {
        JZSDK_LOG_INFO("视频流冻结");
        g_VideoFreezeFlag = JZ_FLAGCODE_ON;
    }
    else if (value == JZ_FLAGCODE_OFF)
    {
        JZSDK_LOG_INFO("关闭视频流冻结");
        g_VideoFreezeFlag = JZ_FLAGCODE_OFF;
    }
    else
    {
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}


/*******************************
 * 
 *  设置视频流参数
 * 
 * 
 * *****************************/
T_JZsdkReturnCode VideoMgmt_param(int flagcode, enum VideoMgmtParm paramflag, int *value)
{
    T_JZsdkReturnCode ret;

    if (flagcode == JZ_FLAGCODE_GET)
    {
        switch (paramflag)
        {
            case VIDEO_MGMT_FREEZE:
            {
               *value = g_VideoFreezeFlag;
            }
            break;     

            default:
            {
                *value = JZ_FLAGCODE_OFF;
            }
            break;
        }
    
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }
    else if (flagcode == JZ_FLAGCODE_SET)
    {
        switch (paramflag)
        {
            case VIDEO_MGMT_FREEZE:
            {
                return VideoStream_FreezeVideo(*value);
            }
            break;

            default:
            {
                *value = JZ_FLAGCODE_OFF;
            }
            break;
        }
    
        return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    }

    JZSDK_LOG_ERROR("参数获取出错");
    return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}


/**************
 * 
 *   用于对外发送视频流情况
 * 
 * **************/
T_JZsdkReturnCode VideoMgmt_Send_StreamStatus(JZ_VideoStreamUseStatus status)
{
    UIcontrol_Send_CameraStatus(status);
}

/************
 * 
 *  获取流的宽高信息
 * 
 * 
 * **********************/
T_JZsdkReturnCode VideoMgmt_Get_StreamWidthAndHeight(int *width, int *height)
{
#if DEVICE_VERSION  == JZ_C1
    if (g_VideoStreamFlowIndexNum == VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST)
    {
        *width = FIRST_WIDTH;
        *height = FIRST_HEIGHT;
    }
    else
    {
        *width = SECOND_WIDTH;
        *height = SECOND_HEIGHT;
    }
#endif

#if DEVICE_VERSION  == JZ_H150S || DEVICE_VERSION  == JZ_H150T
    *width = FIRST_WIDTH;
    *height = FIRST_HEIGHT;
#endif

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}