VideoStream_ShootPhoto.c 3.9 KB
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>  

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

#define PHOTO_TEMP_FILE "/root/sdcard/DCIM/Photos/temp.h264"

static int ShootPhotoNum = 0; 
int ShootModeFlag = JZ_FLAGCODE_OFF;
extern JZ_VideoStreamUseStatus g_VideoStreamDealStatus ;  //视频流的处理状态

//拍摄计数
T_JZsdkReturnCode VideoStreamPhoto_SetShootPhotoNum(int num)
{
    //如果传入数量值不为0
    if (num > 0)
    {
        //如果相机处于空闲状态
        if (g_VideoStreamDealStatus == VIDEO_STREAM_IDLE)
        {
            //拍摄计数值
            ShootPhotoNum += num;
            ShootModeFlag = JZ_FLAGCODE_ON;
            //将视频流的状态改为拍照
            g_VideoStreamDealStatus = VIDEO_STREAM_SHOOTPHOTO;
            JZSDK_LOG_INFO("单拍模式已开启");
        }

        //如果处于录像中
        else if (g_VideoStreamDealStatus == VIDEO_STREAM_RECORD)
        {
            JZSDK_LOG_ERROR("相机已经处于录像中,请勿重复打开单拍功能");
            return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
        }

        //如果处于拍摄中
        else if (g_VideoStreamDealStatus == VIDEO_STREAM_SHOOTPHOTO)
        {
            //则增加拍摄的数量
            ShootPhotoNum += num;
            JZSDK_LOG_INFO("拍摄中,单拍数量增加%d 当前为未拍摄数量为%d",num,ShootPhotoNum);
        }

        //如果处于连拍中
        else if (g_VideoStreamDealStatus == VIDEO_STREAM_BRUSTSHOORPHOTO)
        {
            JZSDK_LOG_ERROR("相机已经处于连拍中,请勿重复打开单拍功能");
            return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
        }

        //如果处于转码中
        else if (g_VideoStreamDealStatus == VIDEO_STREAM_TRANSCODE)
        {
            //如果不处于拍摄转码
            if (ShootModeFlag != JZ_FLAGCODE_ON)
            {
                JZSDK_LOG_ERROR("相机已经处于转码中,请勿重复打开单拍功能");
                return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
            }
            
            //如果是拍摄转码状态
            ShootPhotoNum += num;
            JZSDK_LOG_INFO("转码中,单拍数量增加%d 当前为未拍摄数量为%d",num,ShootPhotoNum);
        }
    }
    //如果传入的是0张
    else if(num == 0)
    {
        JZSDK_LOG_ERROR("单拍数量传入为0");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    //传入的是其他参数
    else
    {
        JZSDK_LOG_ERROR("错误的单拍数量");
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}



/******************************
 * 
 *  将拍照数据存入临时文件
 *  并通知转码线程处理
 * 
 * *********************************/
T_JZsdkReturnCode VideoStramPhoto_PhotoDataIn(unsigned char *h264_data, unsigned int data_len)
{
    T_JZsdkReturnCode ret;

    if (g_VideoStreamDealStatus != VIDEO_STREAM_SHOOTPHOTO || ShootModeFlag != JZ_FLAGCODE_ON)
    {
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }   

    if(h264_data[4] == 0x67)
    {
        JZSDK_LOG_INFO("是I帧 拍照一次");
    }
    else
    {
        VideoStramPhoto_DevelopH264FlowGenerateIDR();
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }

    // 照片先用h264流保存
    FILE *FrameDeal_ShootPhoto_fp = NULL;
    FrameDeal_ShootPhoto_fp = fopen(PHOTO_TEMP_FILE, "wb");
    fwrite(h264_data, data_len, 1, FrameDeal_ShootPhoto_fp);
    fclose(FrameDeal_ShootPhoto_fp);

    //如果数量为0,关闭拍摄模式
    ShootPhotoNum--;
    if (ShootPhotoNum == 0)
    {
        ShootModeFlag = JZ_FLAGCODE_OFF;
    } 

    //调用转码线程
    VideoStream_TransCodeIn(SHOOT_TRANSCODE,1);

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}