正在显示
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 | +} |
-
请 注册 或 登录 后发表评论