Camera_InAndOut.c
7.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include "version_choose.h"
#include "UI_control.h"
#include "BaseConfig.h"
#include "JZsdkLib.h"
#include "./CameraParameter.h"
#include "./V4L2/V4L2_Record.h"
#include "./V4L2/V4L2_CameraParameterSetting.h"
#include "./CameraFeatures/CameraFeatures.h"
#include "./Camera_InAndOut.h"
#include "./VideoTranscode/VideoTranscode.h"
#include "./VideoTranscode/ALLWINER_CedarX/CedarX_InAndOut.h"
int Camera_PushVideoInitFlag = JZ_FLAGCODE_OFF;
int g_CameraStatus = CAMERA_IDLE;
/***********
*
* 检测是否有摄像头
*
* ************/
int CameraCedarX_Test()
{
#if ALLWINNER_CEDAR == VERSION_SWITCH_ON
CedarX_Test();
#endif
}
/**
*
* cedar解码
*
* ****/
int CameraCedarX_H264_TO_NV21_DecodeOneFrame(unsigned char *InputBuffer, int InputBufferLenth)
{
#if ALLWINNER_CEDAR == VERSION_SWITCH_ON
CedarX_DecodeOneFrame(InputBuffer, InputBufferLenth);
#endif
}
/***********
*
* 检测是否有摄像头
*
* ************/
static T_JZsdkReturnCode Camera_CheckForThePresenceOfCameras()
{
//检测是否存在摄像头
if (CAMERA_DEVICE_NAME == NULL)
{
JZSDK_LOG_ERROR("无摄像头设备号设置");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
if(access(CAMERA_DEVICE_NAME, F_OK ) == 0)
{
JZSDK_LOG_INFO("摄像头存在");
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
else
{
JZSDK_LOG_ERROR("摄像头不存在,关闭推流模块");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
/***********
*
* 建立保存文件夹
*
* ************/
static T_JZsdkReturnCode Camera_MediaFolderBuild()
{
char RmCmdStr[256];
snprintf(RmCmdStr, 256,"mkdir /root/sdcard/DCIM/");
if( JZsdk_RunSystemCmd(RmCmdStr) ==-1)
{
JZSDK_LOG_INFO("已经存在DCIM文件夹");
}
snprintf(RmCmdStr, 256,"mkdir /root/sdcard/DCIM/Videos");
if( JZsdk_RunSystemCmd(RmCmdStr) ==-1)
{
JZSDK_LOG_INFO("已经存在Videos文件夹");
}
snprintf(RmCmdStr, 256,"mkdir /root/sdcard/DCIM/Photos");
if( JZsdk_RunSystemCmd(RmCmdStr) ==-1)
{
JZSDK_LOG_INFO("已经存在Photos文件夹");
}
snprintf(RmCmdStr, 256,"rm /root/sdcard/DCIM/Videos/temp.h264");
if( JZsdk_RunSystemCmd(RmCmdStr) ==-1)
{
JZSDK_LOG_INFO("Videos/temp.h264不存在");
}
snprintf(RmCmdStr, 256,"rm /root/sdcard/DCIM/Photos/temp.h264");
if( JZsdk_RunSystemCmd(RmCmdStr) ==-1)
{
JZSDK_LOG_INFO("Photos/temp.h264不存在");
}
}
/***********
*
* 相机初始化
*
* ************/
static T_JZsdkReturnCode JZsdk_CameraInit()
{
T_JZsdkReturnCode ret;
int dev_fd;
//1、摄像头录制初始化
#if DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T
ret = V4l2_Camarainit(&dev_fd);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("摄像头录制初始化失败");
return ret;
}
//2、摄像头参数调整
ret = V4L2_Parameter_Setting(dev_fd);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("摄像头参数调整失败");
return ret;
}
#elif DEVICE_VERSION == JZ_IRC
ret = V4l2_Camarainit(&dev_fd);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("摄像头录制初始化失败");
return ret;
}
//2、摄像头参数调整
ret = V4L2_Parameter_Setting(dev_fd);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("摄像头参数调整失败");
return ret;
}
#else
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
#endif
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
T_JZsdkReturnCode JZsdk_Camera_FrameDealThread_UnlockFun()
{
//解锁一次帧处理函数。以用于处理一帧视频流画面
CameraFeatures_FrameDealThread_UnlockFun();
}
/***********
*
* 非psdk推流计时线程
*
* ************/
static void *JZsdk_Camera_PushFrame_TimerThread(void *args)
{
while (1)
{
delayMs(1000/CAMERA_RECORD_FRAME);
//解锁一次帧处理函数。以用于处理一帧视频流画面
CameraFeatures_FrameDealThread_UnlockFun();
}
}
/***********
*
* 推流计时线程初始化
*
* ************/
static int JZsdk_Camera_PushFrame_TimerThread_Init()
{
pthread_t WriteDataTask;
pthread_attr_t task_attribute; //线程属性
pthread_attr_init(&task_attribute); //初始化线程属性
pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
int opus_Protection = pthread_create(&WriteDataTask,&task_attribute,JZsdk_Camera_PushFrame_TimerThread,NULL); //线程
if(opus_Protection != 0)
{
JZSDK_LOG_ERROR("创建视频转码线程失败!");
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
}
/***********
*
* 相机模块初始化
*
* ************/
T_JZsdkReturnCode JZsdk_CameraMuduleInit()
{
T_JZsdkReturnCode ret;
//1、建立保存文件夹
Camera_MediaFolderBuild();
//2、检测是否有摄像头
ret = Camera_CheckForThePresenceOfCameras();
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE)
{
JZSDK_LOG_ERROR("摄像头不存在,相机模块初始化失败");
return ret;
}
//3、摄像头初始化
ret = JZsdk_CameraInit();
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE)
{
JZSDK_LOG_ERROR("摄像头参数配置错误,摄像头初始化失败");
return ret;
}
//4、摄像头帧处理线程初始化
ret = CameraFeatures_FrameDeal_thread_Init();
if (ret<0)
{
JZSDK_LOG_ERROR("4、摄像头帧处理线程初始化线程失败");
return ret;
}
//5、如果是串口模式,则进行推流,推流计时线程初始化
if (APP_VERSION == APP_UART)
{
//JZsdk_Camera_PushFrame_TimerThread_Init();
}
//6、转码功能线程初始化
Video_TransCode_Moudele_Init();
JZSDK_LOG_INFO("相机模块初始化完成");
Camera_PushVideoInitFlag = JZ_FLAGCODE_ON;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*************************
*
* 检测是否处于录像或是录制中
*
* ******************/
static T_JZsdkReturnCode Camera_CheckVideoMode()
{
}
/**************
*
* 相机功能 录制功能传递函数
* 1开启录制 0关闭录制并进行转码
*
* ************/
T_JZsdkReturnCode Camera_VideoRecord_TransMode(int status)
{
JZSDK_LOG_INFO("录像功能被调用,模式为%d",status);
return CameraFeatures_VideoRecord_SetMode(status);
}
/**************
*
* 相机功能 拍照功能传递函数
* 1开启录制 0关闭录制并进行转码
*
* ************/
T_JZsdkReturnCode Camera_ShootPhoto_TransMode(int num)
{
JZSDK_LOG_INFO("拍照功能被调用,拍摄数量为%d",num);
return FrameDeal_ShootPhoto_trans(num);
}
/**************
*
* 用于对外发送相机情况
*
* **************/
int Camera_Send_CameraStatus(int status)
{
UIcontrol_Send_CameraStatus(status);
}
/*************
*
* 获取当前相机状态
*
* ********/
T_JZsdkReturnCode Camera_Get_Camera_status(int *Status)
{
*Status = g_CameraStatus;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}