作者 ookk303

.9保存

@@ -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 57
58 - //初始化摄像头  
59 - ret = V4l2_Camarainit2(&CameraFd,width,height,frame_num);  
60 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 58 + //从相机中读取一张照片
  59 + V4L2_CameraFrameRecord_OnlyGetFrame(&buf, &buf_size);
  60 +
  61 + //printf("read: len:%d data[3]:%x data[4]:%x\n", buf_size, buf[3], buf[4]);
  62 +
  63 + if (buf == NULL)
61 { 64 {
62 - return ret; 65 + JZSDK_LOG_ERROR("相机数据读取失败");
  66 + continue;
63 } 67 }
64 68
65 - //初始化摄像头参数  
66 - ret = V4L2_Parameter_Setting(CameraFd);  
67 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
68 - {  
69 - JZSDK_LOG_ERROR("摄像头参数调整失败");  
70 - return ret; 69 + //进行数据处理
  70 +
  71 +
  72 + //归还图片
  73 + V4L2_CameraFrameRecord_OnlyReturnFrame();
71 } 74 }
  75 +}
72 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); //线程 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); //线程
80 if(opus_Protection != 0) 105 if(opus_Protection != 0)
81 { 106 {
82 - JZSDK_LOG_ERROR("创建v4l2线程失败!"); 107 + JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
83 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 108 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
84 } 109 }
  110 + }
85 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 +{
  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()
19 { 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);  
62 -  
63 - //3、启用推流模块  
64 - VideoMgmt_VideoStreamFlow_Init(FIRST_FRAME_NUM, &VideoMgmt_FirstVideo_index, VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); 86 +}
65 87
66 - //转码模块  
67 - VideoStreamTransCode_Init(); 88 +//视频流模块初始化
  89 +T_JZsdkReturnCode MediaProc_Init()
  90 +{
68 91
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的初始化
202 * 45 *
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 - 46 + *
  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 +}