正在显示
11 个修改的文件
包含
524 行增加
和
282 行删除
| @@ -43,7 +43,11 @@ | @@ -43,7 +43,11 @@ | ||
| 43 | "espeak_tts.h": "c", | 43 | "espeak_tts.h": "c", |
| 44 | "buffersrc.h": "c", | 44 | "buffersrc.h": "c", |
| 45 | "audiodeal.h": "c", | 45 | "audiodeal.h": "c", |
| 46 | - "wiringpi.h": "c" | 46 | + "wiringpi.h": "c", |
| 47 | + "v4l2_cameraparametersetting.h": "c", | ||
| 48 | + "rtk_mmp.h": "c", | ||
| 49 | + "videostream_shootphoto.h": "c", | ||
| 50 | + "videostream_record.h": "c" | ||
| 47 | }, | 51 | }, |
| 48 | "Codegeex.GenerationPreference": "automatic" | 52 | "Codegeex.GenerationPreference": "automatic" |
| 49 | } | 53 | } |
| @@ -15,16 +15,12 @@ | @@ -15,16 +15,12 @@ | ||
| 15 | #include "../../MediaParm.h" | 15 | #include "../../MediaParm.h" |
| 16 | #include "../../VideoMgmt/VideoMgmt.h" | 16 | #include "../../VideoMgmt/VideoMgmt.h" |
| 17 | #include "../../StreamProc/StreamProc.h" | 17 | #include "../../StreamProc/StreamProc.h" |
| 18 | -#include "Ircut/ircut.h" | ||
| 19 | #include "../Camera.h" | 18 | #include "../Camera.h" |
| 20 | 19 | ||
| 21 | -#include "UI_control/UI_control.h" | ||
| 22 | - | ||
| 23 | - | ||
| 24 | static int CameraFd = 0; | 20 | static int CameraFd = 0; |
| 25 | 21 | ||
| 26 | -//光学相机数据读取线程 | ||
| 27 | -static void *JZsdk_Cam_Data_Thread(void *args) | 22 | +//多线程抓取数据线程 |
| 23 | +static void *JZsdk_Catch_MultiThread(void *args) | ||
| 28 | { | 24 | { |
| 29 | while (1) | 25 | while (1) |
| 30 | { | 26 | { |
| @@ -42,7 +38,7 @@ static void *JZsdk_Cam_Data_Thread(void *args) | @@ -42,7 +38,7 @@ static void *JZsdk_Cam_Data_Thread(void *args) | ||
| 42 | continue; | 38 | continue; |
| 43 | } | 39 | } |
| 44 | 40 | ||
| 45 | - //放入缓冲池 | 41 | + //放入缓冲池 //将数据放入缓冲池,从而被其他线程使用 |
| 46 | VideoMgmt_write_data(&VideoMgmt_FirstVideo_index, buf, buf_size); | 42 | VideoMgmt_write_data(&VideoMgmt_FirstVideo_index, buf, buf_size); |
| 47 | 43 | ||
| 48 | //归还图片 | 44 | //归还图片 |
| @@ -50,38 +46,68 @@ static void *JZsdk_Cam_Data_Thread(void *args) | @@ -50,38 +46,68 @@ static void *JZsdk_Cam_Data_Thread(void *args) | ||
| 50 | } | 46 | } |
| 51 | } | 47 | } |
| 52 | 48 | ||
| 53 | -//150st相机初始化 | ||
| 54 | -T_JZsdkReturnCode JZsdk_H150ST_CameraInit(int width, int height, int frame_num) | 49 | + |
| 50 | +//单线程抓取数据线程 | ||
| 51 | +static void *JZsdk_Catch_SingleThread(void *args) | ||
| 55 | { | 52 | { |
| 56 | - T_JZsdkReturnCode ret; | 53 | + while (1) |
| 54 | + { | ||
| 55 | + unsigned int buf_size = 0; | ||
| 56 | + unsigned char *buf = NULL; | ||
| 57 | + | ||
| 58 | + //从相机中读取一张照片 | ||
| 59 | + V4L2_CameraFrameRecord_OnlyGetFrame(&buf, &buf_size); | ||
| 57 | 60 | ||
| 58 | - //初始化摄像头 | ||
| 59 | - ret = V4l2_Camarainit2(&CameraFd,width,height,frame_num); | ||
| 60 | - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) | ||
| 61 | - { | ||
| 62 | - return ret; | ||
| 63 | - } | 61 | + //printf("read: len:%d data[3]:%x data[4]:%x\n", buf_size, buf[3], buf[4]); |
| 64 | 62 | ||
| 65 | - //初始化摄像头参数 | ||
| 66 | - ret = V4L2_Parameter_Setting(CameraFd); | ||
| 67 | - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) | ||
| 68 | - { | ||
| 69 | - JZSDK_LOG_ERROR("摄像头参数调整失败"); | ||
| 70 | - return ret; | 63 | + if (buf == NULL) |
| 64 | + { | ||
| 65 | + JZSDK_LOG_ERROR("相机数据读取失败"); | ||
| 66 | + continue; | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + //进行数据处理 | ||
| 70 | + | ||
| 71 | + | ||
| 72 | + //归还图片 | ||
| 73 | + V4L2_CameraFrameRecord_OnlyReturnFrame(); | ||
| 71 | } | 74 | } |
| 72 | - | 75 | +} |
| 76 | + | ||
| 77 | +/****************************** | ||
| 78 | + * | ||
| 79 | + * 相机抓取初始化 | ||
| 80 | + * ThreadMode: 0为单线程 1为多线程 | ||
| 81 | + * | ||
| 82 | + * ******************************/ | ||
| 83 | +T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode) | ||
| 84 | +{ | ||
| 85 | + T_JZsdkReturnCode ret; | ||
| 73 | 86 | ||
| 74 | //初始化数据接收线程 | 87 | //初始化数据接收线程 |
| 75 | pthread_t ReadDataTask; | 88 | pthread_t ReadDataTask; |
| 76 | pthread_attr_t task_attribute; //线程属性 | 89 | pthread_attr_t task_attribute; //线程属性 |
| 77 | pthread_attr_init(&task_attribute); //初始化线程属性 | 90 | pthread_attr_init(&task_attribute); //初始化线程属性 |
| 78 | pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性 | 91 | pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性 |
| 79 | - int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Cam_Data_Thread,NULL); //线程 | ||
| 80 | - if(opus_Protection != 0) | ||
| 81 | - { | ||
| 82 | - JZSDK_LOG_ERROR("创建v4l2线程失败!"); | ||
| 83 | - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | ||
| 84 | - } | ||
| 85 | 92 | ||
| 93 | + if (ThreadMode == 0) | ||
| 94 | + { | ||
| 95 | + int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_SingleThread,NULL); //线程 | ||
| 96 | + if(opus_Protection != 0) | ||
| 97 | + { | ||
| 98 | + JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!"); | ||
| 99 | + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | ||
| 100 | + } | ||
| 101 | + } | ||
| 102 | + else if (ThreadMode == 1) | ||
| 103 | + { | ||
| 104 | + int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_MultiThread,NULL); //线程 | ||
| 105 | + if(opus_Protection != 0) | ||
| 106 | + { | ||
| 107 | + JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!"); | ||
| 108 | + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | ||
| 109 | + } | ||
| 110 | + } | ||
| 111 | + | ||
| 86 | return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | 112 | return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; |
| 87 | } | 113 | } |
| 1 | /** | 1 | /** |
| 2 | ******************************************************************** | 2 | ******************************************************************** |
| 3 | - * @file H150ST_Cam.h | ||
| 4 | - * H150ST_Cam.h 的头文件 | 3 | + * @file Cam_FrameCatch.h |
| 4 | + * Cam_FrameCatch.c 的头文件 | ||
| 5 | * | 5 | * |
| 6 | ********************************************************************* | 6 | ********************************************************************* |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/ | 9 | /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/ |
| 10 | -#ifndef H150ST_CAM_H | ||
| 11 | -#define H150ST_CAM_H | 10 | +#ifndef CAM_FRAMECATCH_H |
| 11 | +#define CAM_FRAMECATCH_H | ||
| 12 | 12 | ||
| 13 | /* Includes ------------------------------------------------------------------*/ | 13 | /* Includes ------------------------------------------------------------------*/ |
| 14 | #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h" | 14 | #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h" |
| @@ -24,7 +24,7 @@ extern "C" { | @@ -24,7 +24,7 @@ extern "C" { | ||
| 24 | /* Exported types ------------------------------------------------------------*/ | 24 | /* Exported types ------------------------------------------------------------*/ |
| 25 | 25 | ||
| 26 | /* Exported functions --------------------------------------------------------*/ | 26 | /* Exported functions --------------------------------------------------------*/ |
| 27 | -T_JZsdkReturnCode JZsdk_H150ST_CameraInit(int width, int height, int frame_num); | 27 | +T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode); |
| 28 | 28 | ||
| 29 | 29 | ||
| 30 | 30 |
| @@ -14,6 +14,12 @@ | @@ -14,6 +14,12 @@ | ||
| 14 | 14 | ||
| 15 | #include "MediaProc/IRC_funtion/IRC_funtion.h" | 15 | #include "MediaProc/IRC_funtion/IRC_funtion.h" |
| 16 | 16 | ||
| 17 | +#include "./V4L2_camera/V4L2_CameraParameterSetting.h" | ||
| 18 | +#include "./V4L2_camera/V4L2_Record.h" | ||
| 19 | +#include "./Cam_FrameCatch/Cam_FrameCatch.h" | ||
| 20 | + | ||
| 21 | +static int g_CameraFd = 0; //摄像头文件描述符 | ||
| 22 | + | ||
| 17 | 23 | ||
| 18 | static int PseudoColor = JZ_FLAGCODE_OFF; //伪彩颜色 | 24 | static int PseudoColor = JZ_FLAGCODE_OFF; //伪彩颜色 |
| 19 | static int PixelColorMode = JZ_FLAGCODE_OFF; //像素颜色模式 | 25 | static int PixelColorMode = JZ_FLAGCODE_OFF; //像素颜色模式 |
| @@ -25,6 +31,42 @@ int g_CameraRegionBox_FirstPixel[2] = {0, 0}; // 初始化第一点坐标(x, y) | @@ -25,6 +31,42 @@ int g_CameraRegionBox_FirstPixel[2] = {0, 0}; // 初始化第一点坐标(x, y) | ||
| 25 | int g_CameraRegionBox_SecondPixel[2] = {0, 0}; // 初始化第二点坐标(x, y)为(0, 0) | 31 | int g_CameraRegionBox_SecondPixel[2] = {0, 0}; // 初始化第二点坐标(x, y)为(0, 0) |
| 26 | int g_CameraRegionBox_ClickTime = 0; | 32 | int g_CameraRegionBox_ClickTime = 0; |
| 27 | 33 | ||
| 34 | +/****************************** | ||
| 35 | + * | ||
| 36 | + * 相机初始化 | ||
| 37 | + * ThreadMode: 0为单线程 1为多线程 | ||
| 38 | + * width: 宽 | ||
| 39 | + * height: 高 | ||
| 40 | + * frame_num: 帧数 | ||
| 41 | + * | ||
| 42 | + * ******************************/ | ||
| 43 | +T_JZsdkReturnCode Camera_Init(int ThreadMode, int width, int height, int frame_num) | ||
| 44 | +{ | ||
| 45 | + T_JZsdkReturnCode ret; | ||
| 46 | + | ||
| 47 | + //初始化摄像头 | ||
| 48 | + ret = V4l2_Camarainit2(&g_CameraFd,width,height,frame_num); | ||
| 49 | + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) | ||
| 50 | + { | ||
| 51 | + return ret; | ||
| 52 | + } | ||
| 53 | + | ||
| 54 | +#if DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T | ||
| 55 | + //初始化摄像头参数 | ||
| 56 | + ret = V4L2_Parameter_Setting(g_CameraFd); | ||
| 57 | + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) | ||
| 58 | + { | ||
| 59 | + JZSDK_LOG_ERROR("摄像头参数调整失败"); | ||
| 60 | + return ret; | ||
| 61 | + } | ||
| 62 | +#endif | ||
| 63 | + | ||
| 64 | + //根据线程模式初始化抓取和初步处理的线程 | ||
| 65 | + JZsdk_FrameCatch_Init(ThreadMode); | ||
| 66 | + | ||
| 67 | + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 68 | + | ||
| 69 | +} | ||
| 28 | 70 | ||
| 29 | //快门开关 | 71 | //快门开关 |
| 30 | /*********************************** | 72 | /*********************************** |
| @@ -32,7 +32,8 @@ T_JZsdkReturnCode JZsdk_Camera_BadPixelSwitch(); | @@ -32,7 +32,8 @@ T_JZsdkReturnCode JZsdk_Camera_BadPixelSwitch(); | ||
| 32 | T_JZsdkReturnCode JZsdk_CameraSPC_ResetSwitch(); | 32 | T_JZsdkReturnCode JZsdk_CameraSPC_ResetSwitch(); |
| 33 | T_JZsdkReturnCode JZsdk_Camera_GasEnhancementCorrectSwitch(); | 33 | T_JZsdkReturnCode JZsdk_Camera_GasEnhancementCorrectSwitch(); |
| 34 | 34 | ||
| 35 | -T_JZsdkReturnCode JZsdk_H150ST_CameraInit(int width, int height, int frame_num); | 35 | +T_JZsdkReturnCode Camera_Init(int ThreadMode, int width, int height, int frame_num); |
| 36 | + | ||
| 36 | 37 | ||
| 37 | #ifdef __cplusplus | 38 | #ifdef __cplusplus |
| 38 | } | 39 | } |
| @@ -14,9 +14,41 @@ | @@ -14,9 +14,41 @@ | ||
| 14 | #include "./Camera/Camera.h" | 14 | #include "./Camera/Camera.h" |
| 15 | #include "./Camera/Kt_Irc/Kt_Irc.h" | 15 | #include "./Camera/Kt_Irc/Kt_Irc.h" |
| 16 | 16 | ||
| 17 | -//视频流模块初始化 | ||
| 18 | -T_JZsdkReturnCode MediaProc_Init() | 17 | +//单线程方案 |
| 18 | +static T_JZsdkReturnCode MediaProc_SingleThreading() | ||
| 19 | { | 19 | { |
| 20 | + //如果是150S相机 150T相机 | ||
| 21 | + if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T) | ||
| 22 | + { | ||
| 23 | + //1、相机初始化 | ||
| 24 | + Camera_Init(0,FIRST_WIDTH, FIRST_HEIGHT, FIRST_FRAME_NUM); | ||
| 25 | + | ||
| 26 | + //2、转码模块初始化 | ||
| 27 | + VideoStreamTransCode_Init(); | ||
| 28 | + } | ||
| 29 | +} | ||
| 30 | + | ||
| 31 | +//多线程方案 | ||
| 32 | +static T_JZsdkReturnCode MediaProc_MultiThreading() | ||
| 33 | +{ | ||
| 34 | + //如果是150S相机 150T相机 | ||
| 35 | + if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T) | ||
| 36 | + { | ||
| 37 | + //1、启动视频流缓冲区模块 | ||
| 38 | + VideoMgmt_init_buffer(&VideoMgmt_FirstVideo_index); | ||
| 39 | + | ||
| 40 | + //2、相机初始化 | ||
| 41 | + Camera_Init(1,FIRST_WIDTH, FIRST_HEIGHT, FIRST_FRAME_NUM); | ||
| 42 | + | ||
| 43 | + //3、启用推流模块 | ||
| 44 | + VideoMgmt_VideoStreamFlow_Init(FIRST_FRAME_NUM, &VideoMgmt_FirstVideo_index, VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); | ||
| 45 | + | ||
| 46 | + //转码模块 | ||
| 47 | + VideoStreamTransCode_Init(); | ||
| 48 | + | ||
| 49 | + VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送光学摄像头 | ||
| 50 | + } | ||
| 51 | + | ||
| 20 | //如果是昆腾相机 红外+光学 则红外为1号,光学为2号 | 52 | //如果是昆腾相机 红外+光学 则红外为1号,光学为2号 |
| 21 | if (DEVICE_VERSION == JZ_C1) | 53 | if (DEVICE_VERSION == JZ_C1) |
| 22 | { | 54 | { |
| @@ -51,23 +83,17 @@ T_JZsdkReturnCode MediaProc_Init() | @@ -51,23 +83,17 @@ T_JZsdkReturnCode MediaProc_Init() | ||
| 51 | Camera_param(JZ_FLAGCODE_SET, CAMERA_PIXEL_PSEUDO_COLOR_MODE, &value); | 83 | Camera_param(JZ_FLAGCODE_SET, CAMERA_PIXEL_PSEUDO_COLOR_MODE, &value); |
| 52 | } | 84 | } |
| 53 | 85 | ||
| 54 | - //如果是150S相机 150T相机 | ||
| 55 | - if (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T) | ||
| 56 | - { | ||
| 57 | - //1、启动视频流缓冲区模块 | ||
| 58 | - VideoMgmt_init_buffer(&VideoMgmt_FirstVideo_index); | ||
| 59 | - | ||
| 60 | - //2、相机初始化 | ||
| 61 | - JZsdk_H150ST_CameraInit(FIRST_WIDTH, FIRST_HEIGHT, FIRST_FRAME_NUM); | 86 | +} |
| 62 | 87 | ||
| 63 | - //3、启用推流模块 | ||
| 64 | - VideoMgmt_VideoStreamFlow_Init(FIRST_FRAME_NUM, &VideoMgmt_FirstVideo_index, VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); | 88 | +//视频流模块初始化 |
| 89 | +T_JZsdkReturnCode MediaProc_Init() | ||
| 90 | +{ | ||
| 65 | 91 | ||
| 66 | - //转码模块 | ||
| 67 | - VideoStreamTransCode_Init(); | ||
| 68 | - | ||
| 69 | - VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送光学摄像头 | ||
| 70 | - } | 92 | +#if DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T |
| 93 | + MediaProc_SingleThreading(); | ||
| 94 | +# elif DEVICE_VERSION == JZ_C1 | ||
| 95 | + MediaProc_MultiThreading(); | ||
| 96 | +#endif | ||
| 71 | 97 | ||
| 72 | return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | 98 | return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; |
| 73 | } | 99 | } |
| 1 | +/************************************************** | ||
| 2 | + * | ||
| 3 | + * 文件名:VideoMgmt.c | ||
| 4 | + * 视频流模块 | ||
| 5 | + * 版本:V1.0 | ||
| 6 | + * 作用: | ||
| 7 | + * 在视频流完成处理之后 | ||
| 8 | + * 1、将视频流数据发送到视频流推送模块 | ||
| 9 | + * 2、将视频流数据发送到视频流录制块 | ||
| 10 | + * 3、将视频流数据发送到视频流拍照模块 | ||
| 11 | + * | ||
| 12 | + * **********************************************************/ | ||
| 1 | #include <stdio.h> | 13 | #include <stdio.h> |
| 2 | #include <string.h> | 14 | #include <string.h> |
| 3 | #include <stdlib.h> | 15 | #include <stdlib.h> |
| @@ -19,241 +31,26 @@ | @@ -19,241 +31,26 @@ | ||
| 19 | 31 | ||
| 20 | //额外头文件声明 | 32 | //额外头文件声明 |
| 21 | 33 | ||
| 22 | - | ||
| 23 | -#define DATA_SEND_FROM_VIDEO_STREAM_MAX_LEN 60000 | ||
| 24 | #define VIDEO_FRAME_AUD_LEN 6 | 34 | #define VIDEO_FRAME_AUD_LEN 6 |
| 25 | - | ||
| 26 | static const unsigned char s_frameAudInfo[VIDEO_FRAME_AUD_LEN] = {0x00, 0x00, 0x00, 0x01, 0x09, 0x10}; | 35 | static const unsigned char s_frameAudInfo[VIDEO_FRAME_AUD_LEN] = {0x00, 0x00, 0x00, 0x01, 0x09, 0x10}; |
| 27 | 36 | ||
| 28 | JZ_VideoStreamUseStatus g_VideoStreamDealStatus = VIDEO_STREAM_IDLE; //视频流的处理状态 | 37 | JZ_VideoStreamUseStatus g_VideoStreamDealStatus = VIDEO_STREAM_IDLE; //视频流的处理状态 |
| 29 | 38 | ||
| 30 | -/*视频流缓冲区地址说明 | ||
| 31 | - 留有三对缓冲区,一队中的数据分别为成型数据,以及原始数据 | ||
| 32 | - | ||
| 33 | - 如果设备只有一个摄像头,则使用一号视频流 | ||
| 34 | - | ||
| 35 | - 如果设备为 红外+光学 则红外为1号,光学为2号 | ||
| 36 | - | ||
| 37 | -*/ | ||
| 38 | -void *VideoMgmt_FirstVideo_index = NULL; //一号视频流的缓冲地址 | ||
| 39 | -void *VideoMgmt_SecondVideo_index = NULL; //二号视频流的缓冲地址 | ||
| 40 | -void *VideoMgmt_ThirdVideo_index = NULL; //三号视频流的缓冲地址 | ||
| 41 | - | ||
| 42 | -void *VideoMgmt_FirstRaw_index = NULL; //一号原始流的缓冲地址 | ||
| 43 | -void *VideoMgmt_SecondRaw_index = NULL; //二号原始流的缓冲地址 | ||
| 44 | -void *VideoMgmt_ThirdRaw_index = NULL; //三号原始流的缓冲地址 | ||
| 45 | 39 | ||
| 46 | static int VideoFreezeFlag = JZ_FLAGCODE_OFF; //视频流冻结功能 | 40 | static int VideoFreezeFlag = JZ_FLAGCODE_OFF; //视频流冻结功能 |
| 47 | 41 | ||
| 48 | -//视频流缓冲区结构 | ||
| 49 | -typedef struct JZsdk_VideoBuffer{ | ||
| 50 | - unsigned char *data; //缓冲区数据 | ||
| 51 | - unsigned int data_len; | ||
| 52 | - int is_ready; // 标志位,表示数据是否准备好被读取 | ||
| 53 | - pthread_mutex_t lock; // 互斥锁,用于线程同步 | ||
| 54 | - pthread_cond_t cond; // 条件变量,用于通知读取线程数据已准备好 | ||
| 55 | -} JZsdk_VideoBuffer; | ||
| 56 | - | ||
| 57 | -// 初始化缓冲区 | ||
| 58 | -T_JZsdkReturnCode VideoMgmt_init_buffer(void **index) | ||
| 59 | -{ | ||
| 60 | - //从索引值获取对应的缓冲区 | ||
| 61 | - //创建一个缓冲区 | ||
| 62 | - struct JZsdk_VideoBuffer *VideoBuffer = NULL; | ||
| 63 | - | ||
| 64 | - //为编码器参数注册内存 | ||
| 65 | - VideoBuffer = (struct JZsdk_VideoBuffer *)malloc(sizeof(struct JZsdk_VideoBuffer)); | ||
| 66 | - if (VideoBuffer == NULL) { | ||
| 67 | - JZSDK_LOG_ERROR("视频流缓冲区注册失败"); | ||
| 68 | - return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; | ||
| 69 | - } | ||
| 70 | - | ||
| 71 | - VideoBuffer->data = NULL; | ||
| 72 | - VideoBuffer->data_len = 0; | ||
| 73 | - VideoBuffer->is_ready = 0; | ||
| 74 | - pthread_mutex_init(&VideoBuffer->lock, NULL); | ||
| 75 | - pthread_cond_init(&VideoBuffer->cond, NULL); | ||
| 76 | - | ||
| 77 | - if (*index != NULL) | ||
| 78 | - { | ||
| 79 | - free(*index); | ||
| 80 | - } | ||
| 81 | - | ||
| 82 | - *index = (void *)VideoBuffer; | ||
| 83 | - | ||
| 84 | - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 85 | -} | ||
| 86 | - | ||
| 87 | -//缓冲区清理 | ||
| 88 | -T_JZsdkReturnCode VideoMgmt_VideoBuffer_Deinit(void **index) | ||
| 89 | -{ | ||
| 90 | - if (index == NULL || *index == NULL) { | ||
| 91 | - // 如果索引或缓冲区指针为空,则直接返回 | ||
| 92 | - return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; | ||
| 93 | - } | ||
| 94 | - | ||
| 95 | - //从索引值获取对应的缓冲区 | ||
| 96 | - struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index; | ||
| 97 | - | ||
| 98 | - if (VideoBuffer->data != NULL) | ||
| 99 | - { | ||
| 100 | - free(VideoBuffer->data); | ||
| 101 | - VideoBuffer->data = NULL; | ||
| 102 | - } | ||
| 103 | - | ||
| 104 | - VideoBuffer->data_len = 0; | ||
| 105 | - VideoBuffer->is_ready = 0; | ||
| 106 | - pthread_mutex_destroy(&VideoBuffer->lock); | ||
| 107 | - pthread_cond_destroy(&VideoBuffer->cond); | ||
| 108 | - | ||
| 109 | - free(VideoBuffer); | ||
| 110 | - index = NULL; // 防止悬挂指针 | ||
| 111 | - | ||
| 112 | - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 113 | -} | ||
| 114 | - | ||
| 115 | -//缓冲区写入 | ||
| 116 | -T_JZsdkReturnCode VideoMgmt_write_data(void **index, unsigned char *data, unsigned int data_len) | ||
| 117 | -{ | ||
| 118 | - //从索引值获取对应的缓冲区 | ||
| 119 | - struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index; | ||
| 120 | - | ||
| 121 | - pthread_mutex_lock(&VideoBuffer->lock); | ||
| 122 | - | ||
| 123 | - // 释放旧数据 | ||
| 124 | - if (VideoBuffer->data) | ||
| 125 | - { | ||
| 126 | - free(VideoBuffer->data); | ||
| 127 | - VideoBuffer->data = NULL; | ||
| 128 | - } | ||
| 129 | - | ||
| 130 | - // 分配新内存并复制数据 | ||
| 131 | - VideoBuffer->data = (unsigned char *)malloc(data_len); | ||
| 132 | - memcpy(VideoBuffer->data, data, data_len); | ||
| 133 | - VideoBuffer->data_len = data_len; | ||
| 134 | - VideoBuffer->is_ready = 1; // 标记数据已准备好 | ||
| 135 | - | ||
| 136 | - // 通知读取线程数据已准备好 | ||
| 137 | - pthread_cond_signal(&VideoBuffer->cond); | ||
| 138 | - | ||
| 139 | - pthread_mutex_unlock(&VideoBuffer->lock); | ||
| 140 | -} | ||
| 141 | - | ||
| 142 | -//缓冲区读取 | ||
| 143 | -//输入的参数,缓冲区索引地址 回复的数据地址 回复的数据长度 帧头帧尾模式 帧头帧尾长度 | ||
| 144 | -T_JZsdkReturnCode VideoMgmt_read_data(void **index, unsigned char **data, unsigned int *data_len, unsigned int mode, unsigned int extra_len) | ||
| 145 | -{ | ||
| 146 | - //从索引值获取对应的缓冲区 | ||
| 147 | - struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index; | ||
| 148 | - | ||
| 149 | - // 检查缓冲区指针是否有效 | ||
| 150 | - if (VideoBuffer == NULL) | ||
| 151 | - { | ||
| 152 | - return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示参数无效 | ||
| 153 | - } | ||
| 154 | - | ||
| 155 | - pthread_mutex_lock(&VideoBuffer->lock); | ||
| 156 | - | ||
| 157 | - // 等待数据准备好 | ||
| 158 | - while (!VideoBuffer->is_ready) | ||
| 159 | - { | ||
| 160 | - pthread_cond_wait(&VideoBuffer->cond, &VideoBuffer->lock); | ||
| 161 | - } | ||
| 162 | - | ||
| 163 | - // 检查数据指针是否有效 | ||
| 164 | - if (VideoBuffer->data == NULL) | ||
| 165 | - { | ||
| 166 | - pthread_mutex_unlock(&VideoBuffer->lock); | ||
| 167 | - return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示没有数据可供读取 | ||
| 168 | - } | ||
| 169 | - | ||
| 170 | - // 返回数据和长度 | ||
| 171 | - *data_len = VideoBuffer->data_len; | ||
| 172 | - if (mode == JZ_FLAGCODE_OFF) | ||
| 173 | - { | ||
| 174 | - *data = (unsigned char *)malloc(*data_len); | ||
| 175 | - memcpy(*data, VideoBuffer->data, *data_len); | ||
| 176 | - } | ||
| 177 | - else if (mode == VIDEOMGMT_USE_FRAMEHEAD) | ||
| 178 | - { | ||
| 179 | - *data = (unsigned char *)malloc(*data_len + extra_len); | ||
| 180 | - memcpy(*data+extra_len, VideoBuffer->data, VideoBuffer->data_len); | ||
| 181 | - } | ||
| 182 | - else if (mode == VIDEOMGMT_USE_FRAMEEND) | ||
| 183 | - { | ||
| 184 | - *data = (unsigned char *)malloc(*data_len + extra_len); | ||
| 185 | - memcpy(*data, VideoBuffer->data, VideoBuffer->data_len); | ||
| 186 | - } | ||
| 187 | - else | ||
| 188 | - { | ||
| 189 | - *data = (unsigned char *)malloc(*data_len); | ||
| 190 | - memcpy(*data, VideoBuffer->data, *data_len); | ||
| 191 | - } | ||
| 192 | - | ||
| 193 | - VideoBuffer->is_ready = 0; | ||
| 194 | - pthread_mutex_unlock(&VideoBuffer->lock); | ||
| 195 | - | ||
| 196 | - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 197 | -} | ||
| 198 | - | ||
| 199 | -/********** | 42 | +/**************************** |
| 200 | * | 43 | * |
| 201 | - * 直接返回地址略有风险,暂时不考虑使用这个以下注释的方法 | 44 | + * videoMgmt的初始化 |
| 45 | + * | ||
| 202 | * | 46 | * |
| 203 | - * ************/ | ||
| 204 | -// //缓冲区读取 | ||
| 205 | -// T_JZsdkReturnCode VideoMgmt_read_data(void **index, unsigned char **data, unsigned int *data_len) | ||
| 206 | -// { | ||
| 207 | -// //从索引值获取对应的缓冲区 | ||
| 208 | -// struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index; | ||
| 209 | - | ||
| 210 | -// // 检查缓冲区指针是否有效 | ||
| 211 | -// if (VideoBuffer == NULL) | ||
| 212 | -// { | ||
| 213 | -// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示参数无效 | ||
| 214 | -// } | ||
| 215 | - | ||
| 216 | -// pthread_mutex_lock(&VideoBuffer->lock); | ||
| 217 | - | ||
| 218 | -// // 等待数据准备好 | ||
| 219 | -// while (!VideoBuffer->is_ready) | ||
| 220 | -// { | ||
| 221 | -// pthread_cond_wait(&VideoBuffer->cond, &VideoBuffer->lock); | ||
| 222 | -// } | ||
| 223 | - | ||
| 224 | -// // 检查数据指针是否有效 | ||
| 225 | -// if (VideoBuffer->data == NULL) | ||
| 226 | -// { | ||
| 227 | -// pthread_mutex_unlock(&VideoBuffer->lock); | ||
| 228 | -// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示没有数据可供读取 | ||
| 229 | -// } | ||
| 230 | - | ||
| 231 | -// // 返回数据和长度 | ||
| 232 | -// *data = (VideoBuffer->data); | ||
| 233 | -// *data_len = VideoBuffer->data_len; | ||
| 234 | - | ||
| 235 | -// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 236 | -// } | ||
| 237 | - | ||
| 238 | -// //回复已经读取完成,在read函数,且数据处理完成后调用 | ||
| 239 | -// T_JZsdkReturnCode VideoMgmt_ReplyRead(void **index) | ||
| 240 | -// { | ||
| 241 | -// //从索引值获取对应的缓冲区 | ||
| 242 | -// struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index; | ||
| 243 | - | ||
| 244 | -// // 检查缓冲区指针是否有效 | ||
| 245 | -// if (VideoBuffer == NULL) | ||
| 246 | -// { | ||
| 247 | -// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示参数无效 | ||
| 248 | -// } | ||
| 249 | - | ||
| 250 | -// VideoBuffer->is_ready = 0; | ||
| 251 | -// pthread_mutex_unlock(&VideoBuffer->lock); | ||
| 252 | - | ||
| 253 | -// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 254 | -// } | ||
| 255 | - | ||
| 256 | - | 47 | + * |
| 48 | + * **************************/ | ||
| 49 | +T_JZsdkReturnCode VideoMgmt_Init() | ||
| 50 | +{ | ||
| 51 | + //1 | ||
| 52 | + VideoMgmt_VideoStreamFlow_Init(int FrameNumber, void **index, int VideoStreamFlowIndex); | ||
| 53 | +} | ||
| 257 | 54 | ||
| 258 | /********************************************************************************************************************************************* | 55 | /********************************************************************************************************************************************* |
| 259 | * | 56 | * |
| @@ -375,10 +172,10 @@ T_JZsdkReturnCode VideoStramPhoto_DevelopH264FlowGenerateIDR() | @@ -375,10 +172,10 @@ T_JZsdkReturnCode VideoStramPhoto_DevelopH264FlowGenerateIDR() | ||
| 375 | /************** | 172 | /************** |
| 376 | * | 173 | * |
| 377 | * 视频流流转的线程 | 174 | * 视频流流转的线程 |
| 378 | - * | 175 | + * 视频流处理完成后,可以通过此函数完成拍照记录 录像记录 以及推送 |
| 379 | * | 176 | * |
| 380 | * ************/ | 177 | * ************/ |
| 381 | -static T_JZsdkReturnCode VideoStreamToDeal(unsigned char *data, unsigned int data_len) | 178 | +T_JZsdkReturnCode VideoMgmt_VideoStreamToDeal(unsigned char *data, unsigned int data_len) |
| 382 | { | 179 | { |
| 383 | //拍照数据 | 180 | //拍照数据 |
| 384 | VideoStramPhoto_PhotoDataIn(data, data_len); | 181 | VideoStramPhoto_PhotoDataIn(data, data_len); |
| @@ -394,6 +191,16 @@ static T_JZsdkReturnCode VideoStreamToDeal(unsigned char *data, unsigned int dat | @@ -394,6 +191,16 @@ static T_JZsdkReturnCode VideoStreamToDeal(unsigned char *data, unsigned int dat | ||
| 394 | //JZSDK_LOG_INFO("推送一帧%d,数据大小%d\n",VideoPush->VideoStreamFlowIndex,data_len); | 191 | //JZSDK_LOG_INFO("推送一帧%d,数据大小%d\n",VideoPush->VideoStreamFlowIndex,data_len); |
| 395 | } | 192 | } |
| 396 | 193 | ||
| 194 | + | ||
| 195 | +/****************************************************************************** | ||
| 196 | + * | ||
| 197 | + * 多线程下的处理 | ||
| 198 | + * | ||
| 199 | + * | ||
| 200 | + * | ||
| 201 | + * ***********************************************************/ | ||
| 202 | + | ||
| 203 | + | ||
| 397 | static void *VideoMgmt_VideoStreamFlow_Thread(void *args) | 204 | static void *VideoMgmt_VideoStreamFlow_Thread(void *args) |
| 398 | { | 205 | { |
| 399 | struct VideoMgmt_VideoStreamFlow *VideoPush = (struct VideoMgmt_VideoStreamFlow *)args; | 206 | struct VideoMgmt_VideoStreamFlow *VideoPush = (struct VideoMgmt_VideoStreamFlow *)args; |
| @@ -442,13 +249,15 @@ static void *VideoMgmt_VideoStreamFlow_Thread(void *args) | @@ -442,13 +249,15 @@ static void *VideoMgmt_VideoStreamFlow_Thread(void *args) | ||
| 442 | } | 249 | } |
| 443 | } | 250 | } |
| 444 | 251 | ||
| 252 | + //冻结开了就推送冻结画面 | ||
| 445 | if (VideoFreezeFlag == JZ_FLAGCODE_ON && FreezeDataLen != 0) | 253 | if (VideoFreezeFlag == JZ_FLAGCODE_ON && FreezeDataLen != 0) |
| 446 | { | 254 | { |
| 447 | - VideoStreamToDeal(FreezeData, FreezeDataLen); | 255 | + VideoMgmt_VideoStreamToDeal(FreezeData, FreezeDataLen); |
| 448 | } | 256 | } |
| 257 | + //否则推送正常画面 | ||
| 449 | else | 258 | else |
| 450 | { | 259 | { |
| 451 | - VideoStreamToDeal(data, data_len); | 260 | + VideoMgmt_VideoStreamToDeal(data, data_len); |
| 452 | } | 261 | } |
| 453 | 262 | ||
| 454 | // 释放数据(如果有必要的话) | 263 | // 释放数据(如果有必要的话) |
| @@ -472,6 +281,7 @@ static void *VideoMgmt_VideoStreamFlow_Thread(void *args) | @@ -472,6 +281,7 @@ static void *VideoMgmt_VideoStreamFlow_Thread(void *args) | ||
| 472 | return NULL; | 281 | return NULL; |
| 473 | } | 282 | } |
| 474 | 283 | ||
| 284 | + | ||
| 475 | //视频流流转模块的初始化 | 285 | //视频流流转模块的初始化 |
| 476 | T_JZsdkReturnCode VideoMgmt_VideoStreamFlow_Init(int FrameNumber, void **index, int VideoStreamFlowIndex) | 286 | T_JZsdkReturnCode VideoMgmt_VideoStreamFlow_Init(int FrameNumber, void **index, int VideoStreamFlowIndex) |
| 477 | { | 287 | { |
| @@ -93,6 +93,15 @@ T_JZsdkReturnCode VideoStramPhoto_DevelopH264FlowGenerateIDR(); | @@ -93,6 +93,15 @@ T_JZsdkReturnCode VideoStramPhoto_DevelopH264FlowGenerateIDR(); | ||
| 93 | * *********/ | 93 | * *********/ |
| 94 | T_JZsdkReturnCode VideoRecord_TransMode(int status); | 94 | T_JZsdkReturnCode VideoRecord_TransMode(int status); |
| 95 | 95 | ||
| 96 | + | ||
| 97 | +/********* | ||
| 98 | + * | ||
| 99 | + * 内部交互函数 | ||
| 100 | + * | ||
| 101 | + * *****************/ | ||
| 102 | +T_JZsdkReturnCode VideoMgmt_VideoStreamToDeal(unsigned char *data, unsigned int data_len); | ||
| 103 | + | ||
| 104 | + | ||
| 96 | #ifdef __cplusplus | 105 | #ifdef __cplusplus |
| 97 | } | 106 | } |
| 98 | #endif | 107 | #endif |
| 1 | +/************************************************** | ||
| 2 | + * | ||
| 3 | + * 文件名:缓冲区管理文件 | ||
| 4 | + * | ||
| 5 | + * **********************************************************/ | ||
| 6 | +#include <stdio.h> | ||
| 7 | +#include <string.h> | ||
| 8 | +#include <stdlib.h> | ||
| 9 | +#include <pthread.h> | ||
| 10 | +#include <unistd.h> | ||
| 11 | + | ||
| 12 | +#include "JZsdkLib.h" | ||
| 13 | +#include "./VideoMgmt.h" | ||
| 14 | +#include "version_choose.h" | ||
| 15 | +#include "BaseConfig.h" | ||
| 16 | + | ||
| 17 | +#include "./VideoStreamPush/VideoStream_Push.h" | ||
| 18 | +#include "./VideoStreamRecord/VideoStream_Record.h" | ||
| 19 | +#include "./VideoStreamPhoto/VideoStream_ShootPhoto.h" | ||
| 20 | +#include "UI_control/UI_control.h" | ||
| 21 | +#include "../MediaParm.h" | ||
| 22 | + | ||
| 23 | +#include "../StreamProc/RTK_mmp/RTK_mmp.h" | ||
| 24 | + | ||
| 25 | + | ||
| 26 | +/*视频流缓冲区地址说明 | ||
| 27 | + 留有三对缓冲区,一队中的数据分别为成型数据,以及原始数据 | ||
| 28 | + | ||
| 29 | + 如果设备只有一个摄像头,则使用一号视频流 | ||
| 30 | + | ||
| 31 | + 如果设备为 红外+光学 则红外为1号,光学为2号 | ||
| 32 | + | ||
| 33 | +*/ | ||
| 34 | +void *VideoMgmt_FirstVideo_index = NULL; //一号视频流的缓冲地址 | ||
| 35 | +void *VideoMgmt_SecondVideo_index = NULL; //二号视频流的缓冲地址 | ||
| 36 | +void *VideoMgmt_ThirdVideo_index = NULL; //三号视频流的缓冲地址 | ||
| 37 | + | ||
| 38 | +void *VideoMgmt_FirstRaw_index = NULL; //一号原始流的缓冲地址 | ||
| 39 | +void *VideoMgmt_SecondRaw_index = NULL; //二号原始流的缓冲地址 | ||
| 40 | +void *VideoMgmt_ThirdRaw_index = NULL; //三号原始流的缓冲地址 | ||
| 41 | + | ||
| 42 | +//视频流缓冲区结构 | ||
| 43 | +typedef struct JZsdk_VideoBuffer{ | ||
| 44 | + unsigned char *data; //缓冲区数据 | ||
| 45 | + unsigned int data_len; | ||
| 46 | + int is_ready; // 标志位,表示数据是否准备好被读取 | ||
| 47 | + pthread_mutex_t lock; // 互斥锁,用于线程同步 | ||
| 48 | + pthread_cond_t cond; // 条件变量,用于通知读取线程数据已准备好 | ||
| 49 | +} JZsdk_VideoBuffer; | ||
| 50 | + | ||
| 51 | +// 初始化缓冲区 | ||
| 52 | +T_JZsdkReturnCode VideoMgmt_init_buffer(void **index) | ||
| 53 | +{ | ||
| 54 | + //从索引值获取对应的缓冲区 | ||
| 55 | + //创建一个缓冲区 | ||
| 56 | + struct JZsdk_VideoBuffer *VideoBuffer = NULL; | ||
| 57 | + | ||
| 58 | + //为编码器参数注册内存 | ||
| 59 | + VideoBuffer = (struct JZsdk_VideoBuffer *)malloc(sizeof(struct JZsdk_VideoBuffer)); | ||
| 60 | + if (VideoBuffer == NULL) { | ||
| 61 | + JZSDK_LOG_ERROR("视频流缓冲区注册失败"); | ||
| 62 | + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; | ||
| 63 | + } | ||
| 64 | + | ||
| 65 | + VideoBuffer->data = NULL; | ||
| 66 | + VideoBuffer->data_len = 0; | ||
| 67 | + VideoBuffer->is_ready = 0; | ||
| 68 | + pthread_mutex_init(&VideoBuffer->lock, NULL); | ||
| 69 | + pthread_cond_init(&VideoBuffer->cond, NULL); | ||
| 70 | + | ||
| 71 | + if (*index != NULL) | ||
| 72 | + { | ||
| 73 | + free(*index); | ||
| 74 | + } | ||
| 75 | + | ||
| 76 | + *index = (void *)VideoBuffer; | ||
| 77 | + | ||
| 78 | + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 79 | +} | ||
| 80 | + | ||
| 81 | +//缓冲区清理 | ||
| 82 | +T_JZsdkReturnCode VideoMgmt_VideoBuffer_Deinit(void **index) | ||
| 83 | +{ | ||
| 84 | + if (index == NULL || *index == NULL) { | ||
| 85 | + // 如果索引或缓冲区指针为空,则直接返回 | ||
| 86 | + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + //从索引值获取对应的缓冲区 | ||
| 90 | + struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index; | ||
| 91 | + | ||
| 92 | + if (VideoBuffer->data != NULL) | ||
| 93 | + { | ||
| 94 | + free(VideoBuffer->data); | ||
| 95 | + VideoBuffer->data = NULL; | ||
| 96 | + } | ||
| 97 | + | ||
| 98 | + VideoBuffer->data_len = 0; | ||
| 99 | + VideoBuffer->is_ready = 0; | ||
| 100 | + pthread_mutex_destroy(&VideoBuffer->lock); | ||
| 101 | + pthread_cond_destroy(&VideoBuffer->cond); | ||
| 102 | + | ||
| 103 | + free(VideoBuffer); | ||
| 104 | + index = NULL; // 防止悬挂指针 | ||
| 105 | + | ||
| 106 | + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 107 | +} | ||
| 108 | + | ||
| 109 | +//缓冲区写入 | ||
| 110 | +T_JZsdkReturnCode VideoMgmt_write_data(void **index, unsigned char *data, unsigned int data_len) | ||
| 111 | +{ | ||
| 112 | + //从索引值获取对应的缓冲区 | ||
| 113 | + struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index; | ||
| 114 | + | ||
| 115 | + pthread_mutex_lock(&VideoBuffer->lock); | ||
| 116 | + | ||
| 117 | + // 释放旧数据 | ||
| 118 | + if (VideoBuffer->data) | ||
| 119 | + { | ||
| 120 | + free(VideoBuffer->data); | ||
| 121 | + VideoBuffer->data = NULL; | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + // 分配新内存并复制数据 | ||
| 125 | + VideoBuffer->data = (unsigned char *)malloc(data_len); | ||
| 126 | + memcpy(VideoBuffer->data, data, data_len); | ||
| 127 | + VideoBuffer->data_len = data_len; | ||
| 128 | + VideoBuffer->is_ready = 1; // 标记数据已准备好 | ||
| 129 | + | ||
| 130 | + // 通知读取线程数据已准备好 | ||
| 131 | + pthread_cond_signal(&VideoBuffer->cond); | ||
| 132 | + | ||
| 133 | + pthread_mutex_unlock(&VideoBuffer->lock); | ||
| 134 | +} | ||
| 135 | + | ||
| 136 | +//缓冲区读取 | ||
| 137 | +//输入的参数,缓冲区索引地址 回复的数据地址 回复的数据长度 帧头帧尾模式 帧头帧尾长度 | ||
| 138 | +T_JZsdkReturnCode VideoMgmt_read_data(void **index, unsigned char **data, unsigned int *data_len, unsigned int mode, unsigned int extra_len) | ||
| 139 | +{ | ||
| 140 | + //从索引值获取对应的缓冲区 | ||
| 141 | + struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index; | ||
| 142 | + | ||
| 143 | + // 检查缓冲区指针是否有效 | ||
| 144 | + if (VideoBuffer == NULL) | ||
| 145 | + { | ||
| 146 | + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示参数无效 | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + pthread_mutex_lock(&VideoBuffer->lock); | ||
| 150 | + | ||
| 151 | + // 等待数据准备好 | ||
| 152 | + while (!VideoBuffer->is_ready) | ||
| 153 | + { | ||
| 154 | + pthread_cond_wait(&VideoBuffer->cond, &VideoBuffer->lock); | ||
| 155 | + } | ||
| 156 | + | ||
| 157 | + // 检查数据指针是否有效 | ||
| 158 | + if (VideoBuffer->data == NULL) | ||
| 159 | + { | ||
| 160 | + pthread_mutex_unlock(&VideoBuffer->lock); | ||
| 161 | + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示没有数据可供读取 | ||
| 162 | + } | ||
| 163 | + | ||
| 164 | + // 返回数据和长度 | ||
| 165 | + *data_len = VideoBuffer->data_len; | ||
| 166 | + if (mode == JZ_FLAGCODE_OFF) | ||
| 167 | + { | ||
| 168 | + *data = (unsigned char *)malloc(*data_len); | ||
| 169 | + memcpy(*data, VideoBuffer->data, *data_len); | ||
| 170 | + } | ||
| 171 | + else if (mode == VIDEOMGMT_USE_FRAMEHEAD) | ||
| 172 | + { | ||
| 173 | + *data = (unsigned char *)malloc(*data_len + extra_len); | ||
| 174 | + memcpy(*data+extra_len, VideoBuffer->data, VideoBuffer->data_len); | ||
| 175 | + } | ||
| 176 | + else if (mode == VIDEOMGMT_USE_FRAMEEND) | ||
| 177 | + { | ||
| 178 | + *data = (unsigned char *)malloc(*data_len + extra_len); | ||
| 179 | + memcpy(*data, VideoBuffer->data, VideoBuffer->data_len); | ||
| 180 | + } | ||
| 181 | + else | ||
| 182 | + { | ||
| 183 | + *data = (unsigned char *)malloc(*data_len); | ||
| 184 | + memcpy(*data, VideoBuffer->data, *data_len); | ||
| 185 | + } | ||
| 186 | + | ||
| 187 | + VideoBuffer->is_ready = 0; | ||
| 188 | + pthread_mutex_unlock(&VideoBuffer->lock); | ||
| 189 | + | ||
| 190 | + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 191 | +} | ||
| 192 | + | ||
| 193 | +/********** | ||
| 194 | + * | ||
| 195 | + * 直接返回地址略有风险,暂时不考虑使用这个以下注释的方法 | ||
| 196 | + * | ||
| 197 | + * ************/ | ||
| 198 | +// //缓冲区读取 | ||
| 199 | +// T_JZsdkReturnCode VideoMgmt_read_data(void **index, unsigned char **data, unsigned int *data_len) | ||
| 200 | +// { | ||
| 201 | +// //从索引值获取对应的缓冲区 | ||
| 202 | +// struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index; | ||
| 203 | + | ||
| 204 | +// // 检查缓冲区指针是否有效 | ||
| 205 | +// if (VideoBuffer == NULL) | ||
| 206 | +// { | ||
| 207 | +// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示参数无效 | ||
| 208 | +// } | ||
| 209 | + | ||
| 210 | +// pthread_mutex_lock(&VideoBuffer->lock); | ||
| 211 | + | ||
| 212 | +// // 等待数据准备好 | ||
| 213 | +// while (!VideoBuffer->is_ready) | ||
| 214 | +// { | ||
| 215 | +// pthread_cond_wait(&VideoBuffer->cond, &VideoBuffer->lock); | ||
| 216 | +// } | ||
| 217 | + | ||
| 218 | +// // 检查数据指针是否有效 | ||
| 219 | +// if (VideoBuffer->data == NULL) | ||
| 220 | +// { | ||
| 221 | +// pthread_mutex_unlock(&VideoBuffer->lock); | ||
| 222 | +// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示没有数据可供读取 | ||
| 223 | +// } | ||
| 224 | + | ||
| 225 | +// // 返回数据和长度 | ||
| 226 | +// *data = (VideoBuffer->data); | ||
| 227 | +// *data_len = VideoBuffer->data_len; | ||
| 228 | + | ||
| 229 | +// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 230 | +// } | ||
| 231 | + | ||
| 232 | +// //回复已经读取完成,在read函数,且数据处理完成后调用 | ||
| 233 | +// T_JZsdkReturnCode VideoMgmt_ReplyRead(void **index) | ||
| 234 | +// { | ||
| 235 | +// //从索引值获取对应的缓冲区 | ||
| 236 | +// struct JZsdk_VideoBuffer *VideoBuffer = (struct JZsdk_VideoBuffer *)*index; | ||
| 237 | + | ||
| 238 | +// // 检查缓冲区指针是否有效 | ||
| 239 | +// if (VideoBuffer == NULL) | ||
| 240 | +// { | ||
| 241 | +// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; // 假设的错误码,表示参数无效 | ||
| 242 | +// } | ||
| 243 | + | ||
| 244 | +// VideoBuffer->is_ready = 0; | ||
| 245 | +// pthread_mutex_unlock(&VideoBuffer->lock); | ||
| 246 | + | ||
| 247 | +// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 248 | +// } |
| 1 | +/************************************************** | ||
| 2 | + * | ||
| 3 | + * 文件名:VideoMgmt的多线程处理模式 | ||
| 4 | + * | ||
| 5 | + * **********************************************************/ | ||
| 6 | +#include <stdio.h> | ||
| 7 | +#include <string.h> | ||
| 8 | +#include <stdlib.h> | ||
| 9 | +#include <pthread.h> | ||
| 10 | +#include <unistd.h> | ||
| 11 | + | ||
| 12 | +#include "JZsdkLib.h" | ||
| 13 | +#include "./VideoMgmt.h" | ||
| 14 | +#include "version_choose.h" | ||
| 15 | +#include "BaseConfig.h" | ||
| 16 | + | ||
| 17 | +#include "./VideoStreamPush/VideoStream_Push.h" | ||
| 18 | +#include "./VideoStreamRecord/VideoStream_Record.h" | ||
| 19 | +#include "./VideoStreamPhoto/VideoStream_ShootPhoto.h" | ||
| 20 | +#include "UI_control/UI_control.h" | ||
| 21 | +#include "../MediaParm.h" | ||
| 22 | + | ||
| 23 | +#include "../StreamProc/RTK_mmp/RTK_mmp.h" | ||
| 24 | + |
| 1 | +/************************************************** | ||
| 2 | + * | ||
| 3 | + * 文件名:VideoMgmt的单线程处理模式 | ||
| 4 | + * | ||
| 5 | + * **********************************************************/ | ||
| 6 | +#include <stdio.h> | ||
| 7 | +#include <string.h> | ||
| 8 | +#include <stdlib.h> | ||
| 9 | +#include <pthread.h> | ||
| 10 | +#include <unistd.h> | ||
| 11 | + | ||
| 12 | +#include "JZsdkLib.h" | ||
| 13 | +#include "./VideoMgmt.h" | ||
| 14 | +#include "version_choose.h" | ||
| 15 | +#include "BaseConfig.h" | ||
| 16 | + | ||
| 17 | +#include "./VideoStreamPush/VideoStream_Push.h" | ||
| 18 | +#include "./VideoStreamRecord/VideoStream_Record.h" | ||
| 19 | +#include "./VideoStreamPhoto/VideoStream_ShootPhoto.h" | ||
| 20 | +#include "UI_control/UI_control.h" | ||
| 21 | +#include "../MediaParm.h" | ||
| 22 | + | ||
| 23 | +#include "../StreamProc/RTK_mmp/RTK_mmp.h" | ||
| 24 | + | ||
| 25 | +/************************ | ||
| 26 | + * | ||
| 27 | + * 视频管理模块 | ||
| 28 | + * 单线程模式下的数据输入接口 | ||
| 29 | + * | ||
| 30 | + * *************************/ | ||
| 31 | +T_JZsdkReturnCode VideoMgmt_Single_FrameIn(unsigned char *FrmaeData,unsigned int FrmaeDataLen) | ||
| 32 | +{ | ||
| 33 | + //判断数据是否为空 | ||
| 34 | + if(FrmaeData == NULL) | ||
| 35 | + { | ||
| 36 | + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; | ||
| 37 | + } | ||
| 38 | + | ||
| 39 | + //判断数据长度是否为空 | ||
| 40 | + if(FrmaeDataLen == 0) | ||
| 41 | + { | ||
| 42 | + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + //进行数据后处理,即加入帧头,帧尾等 | ||
| 46 | + | ||
| 47 | + | ||
| 48 | + //将数据输入到流转函数中 | ||
| 49 | + VideoMgmt_VideoStreamToDeal(FrmaeData,FrmaeDataLen); | ||
| 50 | + | ||
| 51 | + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 52 | +} |
-
请 注册 或 登录 后发表评论