作者 ookk303

10更新

正在显示 45 个修改的文件 包含 1344 行增加423 行删除
@@ -64,7 +64,15 @@ @@ -64,7 +64,15 @@
64 "rtk_mmp_enc.h": "c", 64 "rtk_mmp_enc.h": "c",
65 "videostreamtranscode.h": "c", 65 "videostreamtranscode.h": "c",
66 "time.h": "c", 66 "time.h": "c",
67 - "cam_framecatch.h": "c" 67 + "cam_framecatch.h": "c",
  68 + "audiostreamdeal.h": "c",
  69 + "ff_statement.h": "c",
  70 + "configparams.h": "c",
  71 + "im2d.hpp": "c",
  72 + "rk_rga.h": "c",
  73 + "rgautils.h": "c",
  74 + "im2d_type.h": "c",
  75 + "im2d.h": "c"
68 }, 76 },
69 "Codegeex.GenerationPreference": "automatic", 77 "Codegeex.GenerationPreference": "automatic",
70 "C_Cpp.dimInactiveRegions": false 78 "C_Cpp.dimInactiveRegions": false
@@ -7,7 +7,8 @@ set(IFLAY_TTS_MODULE VERSION_SWITCH_OFF) @@ -7,7 +7,8 @@ set(IFLAY_TTS_MODULE VERSION_SWITCH_OFF)
7 set(ESPEAK_TTS_MODULE VERSION_SWITCH_OFF) 7 set(ESPEAK_TTS_MODULE VERSION_SWITCH_OFF)
8 set(ALSALIB_MODULE VERSION_SWITCH_OFF) 8 set(ALSALIB_MODULE VERSION_SWITCH_OFF)
9 set(OPUS_MODULE VERSION_SWITCH_OFF) 9 set(OPUS_MODULE VERSION_SWITCH_OFF)
10 -set(LIB_RTK_MMP VERSION_SWITCH_OFF) 10 +set(LIB_RK_MMP VERSION_SWITCH_OFF)
  11 +set(LIB_RK_RGB VERSION_SWITCH_OFF)
11 set(LIB_USB VERSION_SWITCH_OFF) 12 set(LIB_USB VERSION_SWITCH_OFF)
12 set(LIB_KT_IRC VERSION_SWITCH_OFF) 13 set(LIB_KT_IRC VERSION_SWITCH_OFF)
13 14
@@ -93,8 +94,11 @@ if(${MEDIA_PROC_MODULE} STREQUAL "VERSION_SWITCH_ON") @@ -93,8 +94,11 @@ if(${MEDIA_PROC_MODULE} STREQUAL "VERSION_SWITCH_ON")
93 message("加载红外相机模块") 94 message("加载红外相机模块")
94 add_definitions(-DMACRO_IRC_MODULE) 95 add_definitions(-DMACRO_IRC_MODULE)
95 96
96 - message("加载RTK模块")  
97 - set(LIB_RTK_MMP VERSION_SWITCH_ON) 97 + message("加载RK MMP模块")
  98 + set(LIB_RK_MMP VERSION_SWITCH_ON)
  99 +
  100 + message("加载RK RGA模块")
  101 + set(LIB_RK_RGB VERSION_SWITCH_ON)
98 102
99 message("加载USB模块") 103 message("加载USB模块")
100 set(LIB_USB VERSION_SWITCH_ON) 104 set(LIB_USB VERSION_SWITCH_ON)
@@ -130,16 +130,28 @@ if(${FFMPEG_MODULE} STREQUAL "VERSION_SWITCH_ON") @@ -130,16 +130,28 @@ if(${FFMPEG_MODULE} STREQUAL "VERSION_SWITCH_ON")
130 endif() 130 endif()
131 131
132 132
133 -#rtk_mmp库  
134 -if(${LIB_RTK_MMP} STREQUAL "VERSION_SWITCH_ON")  
135 - message("RTK_MMP库已加载\n")  
136 - add_definitions(-DMACRO_RTK_MPP_MODULE) #加载usb模块 133 +#RK_mmp库
  134 +if(${LIB_RK_MMP} STREQUAL "VERSION_SWITCH_ON")
  135 + message("RK_MMP库已加载\n")
  136 + add_definitions(-DMACRO_RK_MPP_MODULE) #加载模块
137 137
138 - include_directories(${ROOT_DIRS}/ThirdParty/RTK_mmp/aarch64-none-linux-gnu/include) 138 + include_directories(${ROOT_DIRS}/ThirdParty/RK_mmp/aarch64-none-linux-gnu/include)
139 target_link_libraries( 139 target_link_libraries(
140 ${PROJECT_NAME} 140 ${PROJECT_NAME}
141 - ${ROOT_DIRS}/ThirdParty/RTK_mmp/aarch64-none-linux-gnu/lib/librockchip_mpp.so.0  
142 - ${ROOT_DIRS}/ThirdParty/RTK_mmp/aarch64-none-linux-gnu/lib/librockchip_vpu.so.0 141 + ${ROOT_DIRS}/ThirdParty/RK_mmp/aarch64-none-linux-gnu/lib/librockchip_mpp.so.0
  142 + ${ROOT_DIRS}/ThirdParty/RK_mmp/aarch64-none-linux-gnu/lib/librockchip_vpu.so.0
  143 + )
  144 +endif()
  145 +
  146 +#RK_rgb库
  147 +if(${LIB_RK_RGB} STREQUAL "VERSION_SWITCH_ON")
  148 + message("RK_RGB库已加载\n")
  149 + add_definitions(-DMACRO_RK_RGA_MODULE) #加载模块
  150 +
  151 + include_directories(${ROOT_DIRS}/ThirdParty/RK_rga/aarch64-none-linux-gnu/include)
  152 + target_link_libraries(
  153 + ${PROJECT_NAME}
  154 + ${ROOT_DIRS}/ThirdParty/RK_rga/aarch64-none-linux-gnu/lib/librga.so
143 ) 155 )
144 endif() 156 endif()
145 157
@@ -32,7 +32,7 @@ typedef enum JZsdk_Widget_Control @@ -32,7 +32,7 @@ typedef enum JZsdk_Widget_Control
32 JZSDK_WIDGET_SHUTTER_SWITCH = 0x0023, //快门开关 32 JZSDK_WIDGET_SHUTTER_SWITCH = 0x0023, //快门开关
33 JZSDK_WIDGET_FREEZE_VIDEO = 0x0024, //冻结视频流 33 JZSDK_WIDGET_FREEZE_VIDEO = 0x0024, //冻结视频流
34 JZSDK_WIDGET_PSEUDO_MODE = 0x0025, //色彩输出模式 34 JZSDK_WIDGET_PSEUDO_MODE = 0x0025, //色彩输出模式
35 - JZSDK_WIDGET_FOCAL_LENGTH = 0x0026, //焦距 35 + JZSDK_WIDGET_ZOOM_SIZE = 0x0026, //焦距
36 JZSDK_WIDGET_SPC_RESET = 0x0027, //spc重置 36 JZSDK_WIDGET_SPC_RESET = 0x0027, //spc重置
37 JZSDK_WIDGET_PSEUDO_COLOR = 0x0028, //伪彩颜色 37 JZSDK_WIDGET_PSEUDO_COLOR = 0x0028, //伪彩颜色
38 JZSDK_WIDGET_CAMERA_CORRECT_MODE = 0x0029, //相机纠正模式 38 JZSDK_WIDGET_CAMERA_CORRECT_MODE = 0x0029, //相机纠正模式
@@ -205,6 +205,7 @@ T_JZsdkReturnCode JZsdk_LoggerInit() @@ -205,6 +205,7 @@ T_JZsdkReturnCode JZsdk_LoggerInit()
205 char logMessage[256]; 205 char logMessage[256];
206 snprintf(logMessage,256,"LOG_FILE:%s\n",LogFileName); 206 snprintf(logMessage,256,"LOG_FILE:%s\n",LogFileName);
207 fprintf(logFile, "%s", logMessage); 207 fprintf(logFile, "%s", logMessage);
  208 + fflush(logFile);
208 209
209 //dfclose(logFile); 210 //dfclose(logFile);
210 211
@@ -248,7 +249,7 @@ T_JZsdkReturnCode writeToLogFile(const char *data) @@ -248,7 +249,7 @@ T_JZsdkReturnCode writeToLogFile(const char *data)
248 } 249 }
249 250
250 fprintf(logFile, "%s", data); // 写入新的数据 251 fprintf(logFile, "%s", data); // 写入新的数据
251 - 252 + fflush(logFile);
252 //fclose(logFile); 253 //fclose(logFile);
253 254
254 // 解锁 255 // 解锁
@@ -279,6 +280,7 @@ T_JZsdkReturnCode HexToLogFile(const char *data) @@ -279,6 +280,7 @@ T_JZsdkReturnCode HexToLogFile(const char *data)
279 } 280 }
280 281
281 fprintf(logFile, "%x ", data[0]); // 写入新的数据 282 fprintf(logFile, "%x ", data[0]); // 写入新的数据
  283 + fflush(logFile);
282 284
283 //fclose(logFile); 285 //fclose(logFile);
284 286
@@ -48,6 +48,8 @@ extern "C" { @@ -48,6 +48,8 @@ extern "C" {
48 #define JZ_MATH_SWAP(a, b) do { typeof(a) temp = (a); (a) = (b); (b) = temp; } while (0) //交换两个变量的值(这个宏使用了一个临时变量,但它仍然是通过宏来完成的): 48 #define JZ_MATH_SWAP(a, b) do { typeof(a) temp = (a); (a) = (b); (b) = temp; } while (0) //交换两个变量的值(这个宏使用了一个临时变量,但它仍然是通过宏来完成的):
49 49
50 50
  51 +#define JZ_ALIGN(x, a) (((x)+(a)-1)&~((a)-1)) //用于将 x 的值对齐到最近的 a 的倍数。这里的对齐是通过加上 a-1 然后使用位运算 &~((a)-1) 来实现的。
  52 +
51 #ifdef __cplusplus 53 #ifdef __cplusplus
52 } 54 }
53 #endif 55 #endif
@@ -19,7 +19,7 @@ @@ -19,7 +19,7 @@
19 #define MAJOR_VERSION 0x01 19 #define MAJOR_VERSION 0x01
20 #define MINOR_VERSION 0x03 20 #define MINOR_VERSION 0x03
21 #define MODIFY_VERSION 0x09 21 #define MODIFY_VERSION 0x09
22 -#define DEBUG_VERSION 0x05 22 +#define DEBUG_VERSION 0x07
23 23
24 //禁止修改行 滤波方式 24 //禁止修改行 滤波方式
25 #define FILTERING_TYPE HIGH_PASS_FILTERING 25 #define FILTERING_TYPE HIGH_PASS_FILTERING
@@ -74,14 +74,14 @@ @@ -74,14 +74,14 @@
74 #endif 74 #endif
75 75
76 //是否加载RTK_MPP模块 76 //是否加载RTK_MPP模块
77 - #ifdef MACRO_RTK_MPP_MODULE  
78 - #define RTK_MPP_STATUS VERSION_SWITCH_ON 77 + #ifdef MACRO_RK_MPP_MODULE
79 #define RTK_MPP_STATUS_ON 78 #define RTK_MPP_STATUS_ON
80 - #else  
81 - #define RTK_MPP_STATUS VERSION_SWITCH_OFF  
82 #endif 79 #endif
83 80
84 - 81 + //是否加载RTK_RGA模块
  82 + #ifdef MACRO_RK_RGA_MODULE
  83 + #define RTK_RGA_STATUS_ON
  84 + #endif
85 85
86 //是否加载WIRINGPI模块 86 //是否加载WIRINGPI模块
87 #ifdef MACRO_WIRINGPI_MODULE 87 #ifdef MACRO_WIRINGPI_MODULE
@@ -113,9 +113,11 @@ @@ -113,9 +113,11 @@
113 #define USB_CONFIG_STATUS VERSION_SWITCH_ON 113 #define USB_CONFIG_STATUS VERSION_SWITCH_ON
114 114
115 //是否加载RTK_MPP模块 115 //是否加载RTK_MPP模块
116 - #define RTK_MPP_STATUS VERSION_SWITCH_ON  
117 #define RTK_MPP_STATUS_ON 116 #define RTK_MPP_STATUS_ON
118 117
  118 + //是否加载RGA模块
  119 + #define RTK_RGA_STATUS_ON
  120 +
119 //是否加载WIRINGPI模块 121 //是否加载WIRINGPI模块
120 #define WIRINGPI_STATUS_ON 122 #define WIRINGPI_STATUS_ON
121 123
@@ -401,7 +401,7 @@ static int RecvDeal_RealTimeMP2_Limit_transmission(int Port, char *getbuf, int l @@ -401,7 +401,7 @@ static int RecvDeal_RealTimeMP2_Limit_transmission(int Port, char *getbuf, int l
401 T_JZsdkReturnCode ret; 401 T_JZsdkReturnCode ret;
402 402
403 //提取出数据 403 //提取出数据
404 - int DataLen = ((int)getbuf[3] << 8 ) + (int)getbuf[4] - 2 - 9; 404 + int DataLen = (((int)getbuf[3] << 8 ) + (int)getbuf[4]) - 9 - 2;
405 if (DataLen > 128) 405 if (DataLen > 128)
406 { 406 {
407 JZSDK_LOG_ERROR("传输得到的mp2实时数据帧长度超出128上限"); 407 JZSDK_LOG_ERROR("传输得到的mp2实时数据帧长度超出128上限");
@@ -1065,6 +1065,8 @@ static T_JZsdkReturnCode RecvDeal_CheckStatus_AudioDetailMessage(int Port, char @@ -1065,6 +1065,8 @@ static T_JZsdkReturnCode RecvDeal_CheckStatus_AudioDetailMessage(int Port, char
1065 **********/ 1065 **********/
1066 static int RecvDeal_Amplifier_stop(int Port, char *getbuf) 1066 static int RecvDeal_Amplifier_stop(int Port, char *getbuf)
1067 { 1067 {
  1068 + T_JZsdkReturnCode ret;
  1069 +
1068 JZSDK_LOG_INFO("%s,强制关闭功放",RecvDeal_GetPortName(Port)); 1070 JZSDK_LOG_INFO("%s,强制关闭功放",RecvDeal_GetPortName(Port));
1069 1071
1070 //获取帧的序列号 1072 //获取帧的序列号
@@ -1073,7 +1075,15 @@ static int RecvDeal_Amplifier_stop(int Port, char *getbuf) @@ -1073,7 +1075,15 @@ static int RecvDeal_Amplifier_stop(int Port, char *getbuf)
1073 int status = JZ_FLAGCODE_OFF; 1075 int status = JZ_FLAGCODE_OFF;
1074 1076
1075 #if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON 1077 #if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
1076 - return Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &status); 1078 +
  1079 + //先关闭播放
  1080 + ret = UIcontrol_StopPlayAudio(NO_SPECIFIED);
  1081 + if (ret == JZ_ERRORCODE_REALTIMEVOICE_HAS_BEEN_ON) //如果喊话器正处于实时播放,禁止关闭功放操作
  1082 + {
  1083 + JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
  1084 + }
  1085 +
  1086 + Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &status);
1077 #endif 1087 #endif
1078 1088
1079 //回复操作成功 1089 //回复操作成功
@@ -1088,6 +1098,8 @@ static int RecvDeal_Amplifier_stop(int Port, char *getbuf) @@ -1088,6 +1098,8 @@ static int RecvDeal_Amplifier_stop(int Port, char *getbuf)
1088 **********/ 1098 **********/
1089 static int RecvDeal_Amplifier_open(int Port, char *getbuf) 1099 static int RecvDeal_Amplifier_open(int Port, char *getbuf)
1090 { 1100 {
  1101 + T_JZsdkReturnCode ret;
  1102 +
1091 JZSDK_LOG_INFO("%s,强制开启功放",RecvDeal_GetPortName(Port)); 1103 JZSDK_LOG_INFO("%s,强制开启功放",RecvDeal_GetPortName(Port));
1092 1104
1093 //获取帧的序列号 1105 //获取帧的序列号
@@ -1096,7 +1108,15 @@ static int RecvDeal_Amplifier_open(int Port, char *getbuf) @@ -1096,7 +1108,15 @@ static int RecvDeal_Amplifier_open(int Port, char *getbuf)
1096 int status = JZ_FLAGCODE_ON; 1108 int status = JZ_FLAGCODE_ON;
1097 1109
1098 #if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON 1110 #if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
1099 - return Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &status); 1111 +
  1112 + //先关闭播放
  1113 + ret = UIcontrol_StopPlayAudio(NO_SPECIFIED);
  1114 + if (ret == JZ_ERRORCODE_REALTIMEVOICE_HAS_BEEN_ON) //如果喊话器正处于实时播放,禁止关闭功放操作
  1115 + {
  1116 + JZsdk_Uart_SendDeal_Reply_Failure(Port, FrameSequence);
  1117 + }
  1118 +
  1119 + Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &status);
1100 #endif 1120 #endif
1101 1121
1102 //回复操作成功 1122 //回复操作成功
@@ -1123,12 +1143,13 @@ static int RecvDeal_Amplifier_auto(int Port) @@ -1123,12 +1143,13 @@ static int RecvDeal_Amplifier_auto(int Port)
1123 **********/ 1143 **********/
1124 static int RecvDeal_SetVolume(int Port, char *getbuf) 1144 static int RecvDeal_SetVolume(int Port, char *getbuf)
1125 { 1145 {
1126 - JZSDK_LOG_INFO("%s,调节音量",RecvDeal_GetPortName(Port));  
1127 -  
1128 //获取帧的序列号 1146 //获取帧的序列号
1129 int FrameSequence = JZsdk_Get_FrameSequence(getbuf); 1147 int FrameSequence = JZsdk_Get_FrameSequence(getbuf);
1130 1148
1131 int value = (int)getbuf[9]; 1149 int value = (int)getbuf[9];
  1150 +
  1151 + JZSDK_LOG_INFO("%s,调节音量:%d",RecvDeal_GetPortName(Port),value);
  1152 +
1132 UIcontrol_SetVolume(Port, value); 1153 UIcontrol_SetVolume(Port, value);
1133 1154
1134 //回复操作成功 1155 //回复操作成功
@@ -3384,9 +3405,9 @@ static int RecvDeal_ObtainGimbalLinkage(int Port, char *getbuf) @@ -3384,9 +3405,9 @@ static int RecvDeal_ObtainGimbalLinkage(int Port, char *getbuf)
3384 * 3405 *
3385 * 3406 *
3386 **********/ 3407 **********/
3387 -static int RecvDeal_FrameErrorReply(int Port, char *getbuf) 3408 +static int RecvDeal_FrameErrorReply(int Port, char *getbuf, int len)
3388 { 3409 {
3389 - JZSDK_LOG_INFO("%s,帧指令错误:帧错误或者是帧无对应操作",RecvDeal_GetPortName(Port)); 3410 + JZSDK_LOG_INFO("%s,帧指令错误:帧错误或者是帧无对应操作,长度为:%d",RecvDeal_GetPortName(Port),len);
3390 3411
3391 //无法正常获取帧的序列号 3412 //无法正常获取帧的序列号
3392 //回复操作失败 3413 //回复操作失败
@@ -4024,13 +4045,13 @@ int RecvDeal_InstructInput(int Port, int Receive_mode, unsigned char *getbuf, in @@ -4024,13 +4045,13 @@ int RecvDeal_InstructInput(int Port, int Receive_mode, unsigned char *getbuf, in
4024 4045
4025 //帧错误回复操作失败 4046 //帧错误回复操作失败
4026 case JZ_ERROR_SYSTEM_FRAME_ERROR: 4047 case JZ_ERROR_SYSTEM_FRAME_ERROR:
4027 - RecvDeal_FrameErrorReply(Port,getbuf); 4048 + RecvDeal_FrameErrorReply(Port,getbuf,len);
4028 return JZ_ERROR_SYSTEM_FRAME_ERROR; 4049 return JZ_ERROR_SYSTEM_FRAME_ERROR;
4029 break; 4050 break;
4030 4051
4031 default: 4052 default:
4032 //无指令,发送操作失败 4053 //无指令,发送操作失败
4033 - RecvDeal_FrameErrorReply(Port,getbuf); 4054 + RecvDeal_FrameErrorReply(Port,getbuf,len);
4034 return JZ_ERROR_SYSTEM_FRAME_ERROR; 4055 return JZ_ERROR_SYSTEM_FRAME_ERROR;
4035 break; 4056 break;
4036 4057
@@ -399,15 +399,15 @@ int UartDeal_Recv_interface(int type, int Uart_fd , unsigned char *getbuf, int g @@ -399,15 +399,15 @@ int UartDeal_Recv_interface(int type, int Uart_fd , unsigned char *getbuf, int g
399 { 399 {
400 if (Uart_fd == Uart_DEV1_fd) 400 if (Uart_fd == Uart_DEV1_fd)
401 { 401 {
402 - JZSDK_LOG_INFO("串口-设备1号,接受到数据+未处理数据的长度len: %d", getbufLen); 402 + //JZSDK_LOG_INFO("串口-设备1号,接受到数据+未处理数据的长度len: %d", getbufLen);
403 } 403 }
404 else if (Uart_fd == Uart_DEV2_fd) 404 else if (Uart_fd == Uart_DEV2_fd)
405 { 405 {
406 - JZSDK_LOG_INFO("串口-设备2号,接受到数据+未处理数据的长度len: %d", getbufLen); 406 + //JZSDK_LOG_INFO("串口-设备2号,接受到数据+未处理数据的长度len: %d", getbufLen);
407 } 407 }
408 else if (Uart_fd == Uart_4G_fd) 408 else if (Uart_fd == Uart_4G_fd)
409 { 409 {
410 - JZSDK_LOG_INFO("串口-设备4G,接受到数据+未处理数据的长度len: %d", getbufLen); 410 + //JZSDK_LOG_INFO("串口-设备4G,接受到数据+未处理数据的长度len: %d", getbufLen);
411 } 411 }
412 else 412 else
413 { 413 {
@@ -419,7 +419,7 @@ int UartDeal_Recv_interface(int type, int Uart_fd , unsigned char *getbuf, int g @@ -419,7 +419,7 @@ int UartDeal_Recv_interface(int type, int Uart_fd , unsigned char *getbuf, int g
419 { 419 {
420 if (Uart_fd == HAL_DATA_TRANSMISSION) 420 if (Uart_fd == HAL_DATA_TRANSMISSION)
421 { 421 {
422 - JZSDK_LOG_INFO("hal_data,接受到数据+未处理数据的长度len: %d", getbufLen); 422 + //JZSDK_LOG_INFO("hal_data,接受到数据+未处理数据的长度len: %d", getbufLen);
423 } 423 }
424 else 424 else
425 { 425 {
@@ -549,7 +549,7 @@ int UartDeal_Recv_interface(int type, int Uart_fd , unsigned char *getbuf, int g @@ -549,7 +549,7 @@ int UartDeal_Recv_interface(int type, int Uart_fd , unsigned char *getbuf, int g
549 HaveReadLen = HaveReadLen + FrameLen; 549 HaveReadLen = HaveReadLen + FrameLen;
550 HaveDealLen = HaveReadLen; 550 HaveDealLen = HaveReadLen;
551 551
552 - JZSDK_LOG_INFO("framelen%d read%d [read]:%x get%d",FrameLen ,HaveReadLen, getbuf[HaveReadLen], getbufLen); 552 + JZSDK_LOG_INFO("fd:%x f_len%d h_r%d [h_r]:%x get%d", Uart_fd,FrameLen ,HaveReadLen, getbuf[HaveReadLen-1], getbufLen);
553 553
554 FrameLen = 0; 554 FrameLen = 0;
555 FrameFlag = 0; 555 FrameFlag = 0;
@@ -69,6 +69,9 @@ T_JZsdkReturnCode AudioDeal_Init() @@ -69,6 +69,9 @@ T_JZsdkReturnCode AudioDeal_Init()
69 AudioDeakInfo_index->FilterInfo = NULL; 69 AudioDeakInfo_index->FilterInfo = NULL;
70 FF_Filter_Init(AudioDeakInfo_index, 0x00); 70 FF_Filter_Init(AudioDeakInfo_index, 0x00);
71 71
  72 + //初始化mp2音频流
  73 + File_Stream_deal_Init(AV_CODEC_ID_MP2);
  74 +
72 Audiodeal_status = JZ_FLAGCODE_ON; 75 Audiodeal_status = JZ_FLAGCODE_ON;
73 76
74 JZSDK_LOG_INFO("MODULE_AUDIODEL_INIT_COMPLETE"); 77 JZSDK_LOG_INFO("MODULE_AUDIODEL_INIT_COMPLETE");
@@ -261,6 +264,9 @@ T_JZsdkReturnCode AudioDeal_StopDeal() @@ -261,6 +264,9 @@ T_JZsdkReturnCode AudioDeal_StopDeal()
261 //清空alsa里的缓冲区 264 //清空alsa里的缓冲区
262 Alsa_DropPcm(AudioDeakInfo_index); 265 Alsa_DropPcm(AudioDeakInfo_index);
263 266
  267 + //清空mp3音频流
  268 + Stream_Player_Stop(AudioDeakInfo_index);
  269 +
264 while (AudioDeakInfo_index->AudioDeal_Alsa_Finish_Flag != JZ_FLAGCODE_OFF) 270 while (AudioDeakInfo_index->AudioDeal_Alsa_Finish_Flag != JZ_FLAGCODE_OFF)
265 { 271 {
266 delayMs(1); 272 delayMs(1);
@@ -31,6 +31,8 @@ int PCM_PooL_Interface_PcmData_WithoutReply(struct AudioDealInfo *AD_Info,unsign @@ -31,6 +31,8 @@ int PCM_PooL_Interface_PcmData_WithoutReply(struct AudioDealInfo *AD_Info,unsign
31 T_JZsdkReturnCode AudioFile_Stream_Interface_PcmData(struct AudioDealInfo *AD_Info, AVFrame *frame); 31 T_JZsdkReturnCode AudioFile_Stream_Interface_PcmData(struct AudioDealInfo *AD_Info, AVFrame *frame);
32 T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize); 32 T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize);
33 33
  34 +T_JZsdkReturnCode File_Stream_deal_Init(enum AVCodecID id);
  35 +T_JZsdkReturnCode Stream_Player_Stop(struct AudioDealInfo *AD_Info);
34 36
35 #ifdef __cplusplus 37 #ifdef __cplusplus
36 } 38 }
@@ -21,52 +21,71 @@ static const AVCodec *codec; @@ -21,52 +21,71 @@ static const AVCodec *codec;
21 21
22 T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame); 22 T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame);
23 23
24 -int File_Stream_deal_Init(enum AVCodecID id) 24 +T_JZsdkReturnCode File_Stream_deal_Init(enum AVCodecID id)
25 { 25 {
  26 + //注册包
26 pkt = av_packet_alloc(); 27 pkt = av_packet_alloc();
27 if(!pkt) 28 if(!pkt)
28 { 29 {
29 JZSDK_LOG_ERROR("av_packet_alloc failed."); 30 JZSDK_LOG_ERROR("av_packet_alloc failed.");
30 } 31 }
31 32
  33 + //寻找解码器
32 codec = avcodec_find_decoder(id); 34 codec = avcodec_find_decoder(id);
33 if (!codec) { 35 if (!codec) {
34 JZSDK_LOG_ERROR("Codec not found\n"); 36 JZSDK_LOG_ERROR("Codec not found\n");
35 } 37 }
36 38
  39 + //获得裸流的解析器
37 parser = av_parser_init(codec->id); 40 parser = av_parser_init(codec->id);
38 if (!parser) { 41 if (!parser) {
39 JZSDK_LOG_ERROR("Parser not found\n"); 42 JZSDK_LOG_ERROR("Parser not found\n");
40 } 43 }
41 44
  45 + //分配解码上下文
42 cdc_ctx = avcodec_alloc_context3(codec); 46 cdc_ctx = avcodec_alloc_context3(codec);
43 if (!cdc_ctx) { 47 if (!cdc_ctx) {
44 JZSDK_LOG_ERROR("Could not allocate audio codec context\n"); 48 JZSDK_LOG_ERROR("Could not allocate audio codec context\n");
45 } 49 }
46 50
47 - /* open it */ 51 + //将解码器和解码上下文绑定
48 if (avcodec_open2(cdc_ctx, codec, NULL) < 0) 52 if (avcodec_open2(cdc_ctx, codec, NULL) < 0)
49 { 53 {
50 JZSDK_LOG_ERROR("Could not open codec\n"); 54 JZSDK_LOG_ERROR("Could not open codec\n");
51 } 55 }
52 56
53 - //如果解码器不存在,初始化解码器  
54 - if (!decoded_frame)  
55 - {  
56 - if (!(decoded_frame = av_frame_alloc()))  
57 - {  
58 - JZSDK_LOG_ERROR("Could not allocate audio frame\n");  
59 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
60 - }  
61 - } 57 + JZSDK_LOG_INFO("file stream init complete");
  58 +
  59 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
62 } 60 }
63 61
64 //输入mp3的实时数据,以及本次数据的长度 62 //输入mp3的实时数据,以及本次数据的长度
65 T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize) 63 T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize)
66 { 64 {
  65 + //JZSDK_LOG_DEBUG("mp3 stream输入 %d 字节数据", dataSize);
  66 +
  67 + //重置重采样器
  68 + FF_Resample_Reset(AD_Info, in_sampleRate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16);
  69 +
  70 + //检查滤波器
  71 + FF_Filter_Init(AD_Info, 0x01);
  72 +
  73 + int ret = 0;
  74 + unsigned char *databufPtr = data;
  75 + int databufSize = dataSize;
  76 +
67 //将数据输入到 77 //将数据输入到
68 - while(dataSize > 0) 78 + while(databufSize > 0)
69 { 79 {
  80 + //如果解码器不存在,初始化解码器
  81 + if (!decoded_frame)
  82 + {
  83 + if (!(decoded_frame = av_frame_alloc()))
  84 + {
  85 + JZSDK_LOG_ERROR("Could not allocate audio frame\n");
  86 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  87 + }
  88 + }
70 89
71 //检查参数,并将正确的数据输入到pkt中 90 //检查参数,并将正确的数据输入到pkt中
72 //parser 解析器 91 //parser 解析器
@@ -74,22 +93,16 @@ T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, un @@ -74,22 +93,16 @@ T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, un
74 //pkt输出的数据指针 93 //pkt输出的数据指针
75 //data datasize 输入的数据指针 94 //data datasize 输入的数据指针
76 //pts、dts、pos:时间戳和位置信息,一般可以设置为AV_NOPTS_VALUE和0。 95 //pts、dts、pos:时间戳和位置信息,一般可以设置为AV_NOPTS_VALUE和0。
77 - int ret = av_parser_parse2(parser, cdc_ctx, &pkt->data, &pkt->size, data, dataSize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0); 96 + ret = av_parser_parse2(parser, cdc_ctx, &pkt->data, &pkt->size, databufPtr, databufSize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0);
78 if (ret < 0) { 97 if (ret < 0) {
79 printf("Error while parsing\n"); 98 printf("Error while parsing\n");
80 - return -1; 99 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
81 } 100 }
82 -  
83 - //重置重采样器  
84 - FF_Resample_Reset(AD_Info, in_sampleRate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16);  
85 -  
86 - //检查滤波器  
87 - FF_Filter_Init(AD_Info, 0x01);  
88 101
89 //数据指针 往后一个解析长度 102 //数据指针 往后一个解析长度
90 //长度指针 减少一个被解析数据的长度 103 //长度指针 减少一个被解析数据的长度
91 - data += ret;  
92 - dataSize -= ret; 104 + databufPtr += ret;
  105 + databufSize -= ret;
93 106
94 //如果输出有长度 解码输出的数据 107 //如果输出有长度 解码输出的数据
95 if (pkt->size > 0) 108 if (pkt->size > 0)
@@ -97,6 +110,8 @@ T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, un @@ -97,6 +110,8 @@ T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, un
97 Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame); 110 Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame);
98 } 111 }
99 } 112 }
  113 +
  114 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
100 } 115 }
101 116
102 117
@@ -108,7 +123,13 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon @@ -108,7 +123,13 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
108 123
109 //发送数据包给解码器解码,已将数据解码为pcm原始数据 124 //发送数据包给解码器解码,已将数据解码为pcm原始数据
110 ret = avcodec_send_packet(dec_ctx, pkt); 125 ret = avcodec_send_packet(dec_ctx, pkt);
111 - if (ret < 0) 126 + if (ret == AVERROR(EAGAIN))
  127 + {
  128 + char errbuf[128];
  129 + av_strerror(ret, errbuf, sizeof(errbuf));
  130 + JZSDK_LOG_ERROR("Error while sending a packet to the decoder %s",errbuf);
  131 + }
  132 + else if (ret < 0)
112 { 133 {
113 JZSDK_LOG_ERROR("Error submitting the packet to the decoder, ret=%d\n",ret); 134 JZSDK_LOG_ERROR("Error submitting the packet to the decoder, ret=%d\n",ret);
114 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 135 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
@@ -120,7 +141,7 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon @@ -120,7 +141,7 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
120 141
121 /* read all the output frames (in general there may be any number of them */ 142 /* read all the output frames (in general there may be any number of them */
122 //读取输出的帧 143 //读取输出的帧
123 - while ( (ret >= 0) && (AD_Info->Flag_AudioDataGenerationImplement == JZ_FLAGCODE_ON) ) 144 + while ( (ret >= 0) && AD_Info->AudioDeal_ResampleAndFilter_Execute_Flag == JZ_FLAGCODE_ON)
124 { 145 {
125 //从解码器中读取解码后的音频帧数据 146 //从解码器中读取解码后的音频帧数据
126 ret = avcodec_receive_frame(dec_ctx, frame); 147 ret = avcodec_receive_frame(dec_ctx, frame);
@@ -134,6 +155,8 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon @@ -134,6 +155,8 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
134 JZSDK_LOG_ERROR("Error during decoding\n"); 155 JZSDK_LOG_ERROR("Error during decoding\n");
135 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 156 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
136 } 157 }
  158 +
  159 + //printf("输出了:%d的数据\n",frame->nb_samples);
137 160
138 int out_nb_samples = 0; 161 int out_nb_samples = 0;
139 162
@@ -149,7 +172,7 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon @@ -149,7 +172,7 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
149 //将临时帧 放入 均衡滤波器 172 //将临时帧 放入 均衡滤波器
150 FF_Filter_push_frame_to_fliter(AD_Info, temp_frame); 173 FF_Filter_push_frame_to_fliter(AD_Info, temp_frame);
151 174
152 - while(AD_Info->Flag_AudioDataGenerationImplement == JZ_FLAGCODE_ON) 175 + while(AD_Info->AudioDeal_ResampleAndFilter_Execute_Flag == JZ_FLAGCODE_ON)
153 { 176 {
154 //得到滤波器输出的音频帧 eq_frame 177 //得到滤波器输出的音频帧 eq_frame
155 int fret = FF_Filter_get_frame_from_filter(AD_Info, eq_frame); 178 int fret = FF_Filter_get_frame_from_filter(AD_Info, eq_frame);
@@ -158,6 +181,8 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon @@ -158,6 +181,8 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
158 break; 181 break;
159 } 182 }
160 183
  184 + //printf("pcm播放 %d 数据\n",eq_frame->nb_samples);
  185 +
161 //播放改滤波后的帧 186 //播放改滤波后的帧
162 Pcm_AlsaPlay(AD_Info, (unsigned char*)eq_frame->data[0], eq_frame->nb_samples); 187 Pcm_AlsaPlay(AD_Info, (unsigned char*)eq_frame->data[0], eq_frame->nb_samples);
163 188
@@ -179,4 +204,14 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon @@ -179,4 +204,14 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
179 //释放掉输出的变量 204 //释放掉输出的变量
180 av_frame_unref(temp_frame); 205 av_frame_unref(temp_frame);
181 av_frame_unref(eq_frame); 206 av_frame_unref(eq_frame);
  207 +
182 } 208 }
  209 +
  210 +T_JZsdkReturnCode Stream_Player_Stop(struct AudioDealInfo *AD_Info)
  211 +{
  212 + pkt->data = NULL;
  213 + pkt->size = 0;
  214 + Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame);
  215 +
  216 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  217 +}
@@ -296,13 +296,25 @@ T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int AudioType) @@ -296,13 +296,25 @@ T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int AudioType)
296 { 296 {
297 T_JZsdkReturnCode ret; 297 T_JZsdkReturnCode ret;
298 298
299 - int NewType = FILTER_NORMAL; 299 + int NewType = FILTER_NORMAL_AUDIO;
300 300
301 //通过g_FilterMode 与 音频内容 得出滤波类型 301 //通过g_FilterMode 与 音频内容 得出滤波类型
302 if (g_FilterMode == 0x00) //默认滤波 302 if (g_FilterMode == 0x00) //默认滤波
303 { 303 {
304 //无须管音频类型,直接同一个默认滤波器 304 //无须管音频类型,直接同一个默认滤波器
305 - NewType = FILTER_NORMAL; 305 + if (AudioType == 0x00) //文本类型
  306 + {
  307 + NewType = FILTER_NORMAL_AUDIO;
  308 + }
  309 + else if (AudioType == 0x01) //音频类型
  310 + {
  311 + NewType = FILTER_NORMAL_TTS;
  312 + }
  313 + else
  314 + {
  315 + JZSDK_LOG_ERROR("错误的音频类型");
  316 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  317 + }
306 } 318 }
307 else if (g_FilterMode == 0x01) //30M滤波 319 else if (g_FilterMode == 0x01) //30M滤波
308 { 320 {
@@ -348,8 +360,12 @@ T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int AudioType) @@ -348,8 +360,12 @@ T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int AudioType)
348 //初始化滤波器 360 //初始化滤波器
349 switch (NewType) 361 switch (NewType)
350 { 362 {
351 - case FILTER_NORMAL:  
352 - ret = FF_Filter_ParamInit(AD_Info, FILTER_PARAM_NORMAL); 363 + case FILTER_NORMAL_AUDIO:
  364 + ret = FF_Filter_ParamInit(AD_Info, FILTER_PARAM_NORMAL_AUDIO);
  365 + break;
  366 +
  367 + case FILTER_NORMAL_TTS:
  368 + ret = FF_Filter_ParamInit(AD_Info, FILTER_PARAM_NORMAL_TTS);
353 break; 369 break;
354 370
355 case FILTER_NORMAL_M30_TTS: 371 case FILTER_NORMAL_M30_TTS:
@@ -361,7 +377,7 @@ T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int AudioType) @@ -361,7 +377,7 @@ T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int AudioType)
361 break; 377 break;
362 378
363 default: 379 default:
364 - ret = FF_Filter_ParamInit(AD_Info, FILTER_PARAM_NORMAL); 380 + ret = FF_Filter_ParamInit(AD_Info, FILTER_PARAM_NORMAL_AUDIO);
365 break; 381 break;
366 } 382 }
367 383
@@ -12,7 +12,7 @@ @@ -12,7 +12,7 @@
12 12
13 /* Includes ------------------------------------------------------------------*/ 13 /* Includes ------------------------------------------------------------------*/
14 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h" 14 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
15 - 15 +#include "BaseConfig.h"
16 16
17 #ifdef __cplusplus 17 #ifdef __cplusplus
18 extern "C" { 18 extern "C" {
@@ -46,7 +46,18 @@ extern "C" { @@ -46,7 +46,18 @@ extern "C" {
46 equalizer=f=8000:t=q:w=2.0:g=0, \ 46 equalizer=f=8000:t=q:w=2.0:g=0, \
47 equalizer=f=16000:t=q:w=2.0:g=0" 47 equalizer=f=16000:t=q:w=2.0:g=0"
48 48
49 -#define FILTER_FORMAL_3 "equalizer=f=31:t=q:w=2.0:g=-48, \ 49 +#define FILTER_FORMAL_3_AUDIO "equalizer=f=31:t=q:w=2.0:g=-48, \
  50 + equalizer=f=62:t=q:w=2.0:g=-36, \
  51 + equalizer=f=125:t=q:w=2.0:g=-30, \
  52 + equalizer=f=250:t=q:w=2.0:g=-26, \
  53 + equalizer=f=500:t=q:w=2.0:g=-20, \
  54 + equalizer=f=1000:t=q:w=2.0:g=-12, \
  55 + equalizer=f=2000:t=q:w=2.0:g=-8, \
  56 + equalizer=f=4000:t=q:w=2.0:g=+1, \
  57 + equalizer=f=8000:t=q:w=2.0:g=+2, \
  58 + equalizer=f=16000:t=q:w=2.0:g=+2"
  59 +
  60 +#define FILTER_FORMAL_3_TTS "equalizer=f=31:t=q:w=2.0:g=-48, \
50 equalizer=f=62:t=q:w=2.0:g=-36, \ 61 equalizer=f=62:t=q:w=2.0:g=-36, \
51 equalizer=f=125:t=q:w=2.0:g=-30, \ 62 equalizer=f=125:t=q:w=2.0:g=-30, \
52 equalizer=f=250:t=q:w=2.0:g=-26, \ 63 equalizer=f=250:t=q:w=2.0:g=-26, \
@@ -83,6 +94,21 @@ extern "C" { @@ -83,6 +94,21 @@ extern "C" {
83 anequalizer=c0 f=3800 w=1200 g=-22 t=0|c1 f=3800 w=1200 g=-22 t=0, \ 94 anequalizer=c0 f=3800 w=1200 g=-22 t=0|c1 f=3800 w=1200 g=-22 t=0, \
84 anequalizer=c0 f=3100 w=600 g=-16 t=0|c1 f=3100 w=600 g=-16 t=0" 95 anequalizer=c0 f=3100 w=600 g=-16 t=0|c1 f=3100 w=600 g=-16 t=0"
85 96
  97 +
  98 +#define FILTER_FORMAL_1_M30_2 "equalizer=f=31:t=q:w=2.0:g=-48, \
  99 + equalizer=f=62:t=q:w=2.0:g=-36, \
  100 + equalizer=f=125:t=q:w=2.0:g=-30, \
  101 + equalizer=f=250:t=q:w=2.0:g=-26, \
  102 + equalizer=f=500:t=q:w=2.0:g=-20, \
  103 + equalizer=f=1000:t=q:w=2.0:g=-12, \
  104 + equalizer=f=2000:t=q:w=2.0:g=-8, \
  105 + equalizer=f=4000:t=q:w=2.0:g=+1, \
  106 + equalizer=f=8000:t=q:w=2.0:g=+2, \
  107 + equalizer=f=16000:t=q:w=2.0:g=+2, \
  108 + anequalizer=c0 f=4000 w=1400 g=-28 t=0|c1 f=4000 w=1400 g=-28 t=0, \
  109 + anequalizer=c0 f=3700 w=1400 g=-24 t=0|c1 f=3700 w=1400 g=-24 t=0"
  110 +
  111 +
86 /*00 35 112 /*00 35
87 02 37 113 02 37
88 05 39 114 05 39
@@ -118,15 +144,31 @@ extern "C" { @@ -118,15 +144,31 @@ extern "C" {
118 144
119 145
120 typedef enum FilterList{ 146 typedef enum FilterList{
121 - FILTER_NORMAL = 1, 147 + FILTER_NORMAL_AUDIO = 1,
  148 + FILTER_NORMAL_TTS = 2,
122 FILTER_NORMAL_M30_AUDIO = 5, 149 FILTER_NORMAL_M30_AUDIO = 5,
123 FILTER_NORMAL_M30_TTS = 6, 150 FILTER_NORMAL_M30_TTS = 6,
124 }FilterList; 151 }FilterList;
125 152
126 -#define FILTER_PARAM_NORMAL FILTER_FORMAL_3 153 +//普通音频滤波参数
  154 +#define FILTER_PARAM_NORMAL_AUDIO FILTER_FORMAL_3_AUDIO
  155 +//普通TTS滤波参数
  156 +#define FILTER_PARAM_NORMAL_TTS FILTER_FORMAL_3_TTS
  157 +
  158 +
  159 +
127 #define FILTER_PARAM_M30_TTS FILTER_FORMAL_1_M30_TTS 160 #define FILTER_PARAM_M30_TTS FILTER_FORMAL_1_M30_TTS
  161 +
  162 +//h10t的滤波器跟其他的不一样,所以单独定义
  163 +#if DEVICE_VERSION == JZ_H10T
  164 +
  165 +#define FILTER_PARAM_M30_AUDIO FILTER_FORMAL_1_M30_2
  166 +
  167 +#else
  168 +
128 #define FILTER_PARAM_M30_AUDIO FILTER_FORMAL_1_M30_1 169 #define FILTER_PARAM_M30_AUDIO FILTER_FORMAL_1_M30_1
129 170
  171 +#endif
130 /* Exported types ------------------------------------------------------------*/ 172 /* Exported types ------------------------------------------------------------*/
131 173
132 /* Exported functions --------------------------------------------------------*/ 174 /* Exported functions --------------------------------------------------------*/
@@ -6,7 +6,6 @@ @@ -6,7 +6,6 @@
6 #include <time.h> 6 #include <time.h>
7 #include <unistd.h> 7 #include <unistd.h>
8 8
9 -  
10 #include "JZsdkLib.h" 9 #include "JZsdkLib.h"
11 #include "BaseConfig.h" 10 #include "BaseConfig.h"
12 #include "JZsdk_usb_bulk/JZsdk_usb_bulk.h" 11 #include "JZsdk_usb_bulk/JZsdk_usb_bulk.h"
@@ -18,6 +17,33 @@ @@ -18,6 +17,33 @@
18 #include "MediaProc/MultProc/RTK_mmp/RTK_mmp.h" 17 #include "MediaProc/MultProc/RTK_mmp/RTK_mmp.h"
19 #include "MediaProc/MultProc/RTK_mmp/Dec/RTK_mmp_dec.h" 18 #include "MediaProc/MultProc/RTK_mmp/Dec/RTK_mmp_dec.h"
20 #include "MediaProc/MultProc/RTK_mmp/Enc/RTK_mmp_enc.h" 19 #include "MediaProc/MultProc/RTK_mmp/Enc/RTK_mmp_enc.h"
  20 +#include "MediaProc/Camera/Camera.h"
  21 +
  22 +#endif
  23 +
  24 +#ifdef RTK_RGA_STATUS_ON
  25 +
  26 +#include "MediaProc/RgaProc/RK_Rga/RK_Rga.h"
  27 +
  28 +//c1的rga结构体
  29 +typedef struct C1_RgaInfo
  30 +{
  31 + //源图像
  32 + RK_RgaImage *src_img;
  33 +
  34 + //裁剪图像
  35 + RK_RgaImage *corp_img;
  36 +
  37 + //目标图像
  38 + RK_RgaImage *dst_img;
  39 +
  40 + //放大倍数
  41 + int scale;
  42 +
  43 +}C1_RgaInfo;
  44 +
  45 +static C1_RgaInfo *g_C1_RgaIrcInfo = NULL;
  46 +static C1_RgaInfo *g_C1_RgaOptInfo = NULL;
21 47
22 #endif 48 #endif
23 49
@@ -45,6 +71,10 @@ static unsigned char FrameBuffer[FIRST_HEIGHT * FIRST_WIDTH *2]; //用于存储 @@ -45,6 +71,10 @@ static unsigned char FrameBuffer[FIRST_HEIGHT * FIRST_WIDTH *2]; //用于存储
45 static unsigned int FrameBufferLen = 0; //用于存储帧数据的长度 71 static unsigned int FrameBufferLen = 0; //用于存储帧数据的长度
46 static FrameBuffer_UseFlag = JZ_FLAGCODE_OFF; 72 static FrameBuffer_UseFlag = JZ_FLAGCODE_OFF;
47 73
  74 +#ifdef RTK_RGA_STATUS_ON
  75 +static T_JZsdkReturnCode JZC1_RgaDeal(C1_RgaInfo *rga_info, int resize, unsigned char *image, unsigned int *imgage_size);
  76 +static T_JZsdkReturnCode JZC1_RgaInit(C1_RgaInfo **rgaInfo, int dst_width, int dst_height, int dst_format);
  77 +#endif
48 78
49 //数据推送函数 79 //数据推送函数
50 static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, unsigned int data_len) 80 static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, unsigned int data_len)
@@ -74,12 +104,14 @@ static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, un @@ -74,12 +104,14 @@ static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, un
74 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 104 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
75 } 105 }
76 106
77 -  
78 static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len) 107 static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len)
79 { 108 {
80 - //JZSDK_LOG_INFO("JZC1_OptDeal"); 109 +
81 110
82 #ifdef RTK_MPP_STATUS_ON 111 #ifdef RTK_MPP_STATUS_ON
  112 +
  113 + //JZSDK_LOG_INFO("JZC1_OptDeal");
  114 +
83 MppFrame yuv_data = NULL; //用于传递yuv数据的地址 115 MppFrame yuv_data = NULL; //用于传递yuv数据的地址
84 MppPacket Packet = NULL; 116 MppPacket Packet = NULL;
85 117
@@ -93,6 +125,68 @@ static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len @@ -93,6 +125,68 @@ static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len
93 125
94 // JZSDK_LOG_INFO("w:%d h:%d hor:%d ver:%d",width,height,h_stride,v_stride); 126 // JZSDK_LOG_INFO("w:%d h:%d hor:%d ver:%d",width,height,h_stride,v_stride);
95 127
  128 + //光学数据缩放
  129 + int resize = JZ_FLAGCODE_OFF;
  130 + Camera_param(JZ_FLAGCODE_GET, CAMERA_RESIZE, &resize);
  131 +
  132 + //将size转化为倍数
  133 + int ZoomRatio = 0;
  134 + switch (resize)
  135 + {
  136 + case 0:
  137 + ZoomRatio = JZ_FLAGCODE_OFF;
  138 + break;
  139 +
  140 + case 1:
  141 + ZoomRatio = 2;
  142 + break;
  143 +
  144 + case 2:
  145 + ZoomRatio = 4;
  146 + break;
  147 +
  148 + case 3:
  149 + ZoomRatio = 8;
  150 + break;
  151 +
  152 + default:
  153 + ZoomRatio = JZ_FLAGCODE_OFF;
  154 + break;
  155 + }
  156 +
  157 +
  158 + if (ZoomRatio != JZ_FLAGCODE_OFF)
  159 + {
  160 +
  161 + MppBuffer temp = mpp_frame_get_buffer(yuv_data);
  162 + RK_U32 h = mpp_frame_get_hor_stride(yuv_data);
  163 + RK_U32 w = mpp_frame_get_ver_stride(yuv_data);
  164 +
  165 + int size = (h * w * 1.5);
  166 +
  167 + unsigned char *temp_data = (unsigned char *)malloc(size);
  168 + memcpy(temp_data, mpp_buffer_get_ptr(temp), size);
  169 +
  170 + JZC1_RgaDeal(g_C1_RgaOptInfo, ZoomRatio, temp_data, &size);
  171 +
  172 + //重新将数据放回
  173 + memcpy(mpp_buffer_get_ptr(temp), temp_data, size);
  174 +
  175 + free(temp_data);
  176 +
  177 + }
  178 +
  179 + //测试
  180 + MppBuffer temp = mpp_frame_get_buffer(yuv_data);
  181 + RK_U32 h = mpp_frame_get_hor_stride(yuv_data);
  182 + RK_U32 w = mpp_frame_get_ver_stride(yuv_data);
  183 +
  184 + int size = (h * w * 1.5);
  185 +
  186 + unsigned char *temp_data = (unsigned char *)malloc(size);
  187 + memcpy(temp_data, mpp_buffer_get_ptr(temp), size);
  188 +
  189 +
96 //将返回的数据输入进编码器 190 //将返回的数据输入进编码器
97 RTK_mmp_enc_yuv_to_h264_byFrame(JZsdk_RtkMmpGetEncHandleAddr(1), yuv_data, &Packet); 191 RTK_mmp_enc_yuv_to_h264_byFrame(JZsdk_RtkMmpGetEncHandleAddr(1), yuv_data, &Packet);
98 192
@@ -150,6 +244,41 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len @@ -150,6 +244,41 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len
150 //将原始码流数据转换为rgb数据 244 //将原始码流数据转换为rgb数据
151 IRC_FrameDeal(u16Data, u16DataSize, &raw_data, &raw_data_len); 245 IRC_FrameDeal(u16Data, u16DataSize, &raw_data, &raw_data_len);
152 246
  247 + //获取放大的倍数
  248 + //光学数据缩放
  249 + int resize = JZ_FLAGCODE_OFF;
  250 + Camera_param(JZ_FLAGCODE_GET, CAMERA_RESIZE, &resize);
  251 +
  252 + //将size转化为倍数
  253 + int ZoomRatio = 0;
  254 + switch (resize)
  255 + {
  256 + case 0:
  257 + ZoomRatio = JZ_FLAGCODE_OFF;
  258 + break;
  259 +
  260 + case 1:
  261 + ZoomRatio = 2;
  262 + break;
  263 +
  264 + case 2:
  265 + ZoomRatio = 4;
  266 + break;
  267 +
  268 + case 3:
  269 + ZoomRatio = 8;
  270 + break;
  271 +
  272 + default:
  273 + ZoomRatio = 0;
  274 + break;
  275 + }
  276 +
  277 + if (ZoomRatio != JZ_FLAGCODE_OFF)
  278 + {
  279 + JZC1_RgaDeal(g_C1_RgaIrcInfo, ZoomRatio, raw_data, &raw_data_len);
  280 + }
  281 +
153 //将原始码流数据写入到编码器 并转换为h264 282 //将原始码流数据写入到编码器 并转换为h264
154 unsigned char *h264Data = NULL; 283 unsigned char *h264Data = NULL;
155 unsigned int h264DataLen = 0; 284 unsigned int h264DataLen = 0;
@@ -436,6 +565,205 @@ static T_JZsdkReturnCode JZsdk_JZC1_Irc_Data_Init() @@ -436,6 +565,205 @@ static T_JZsdkReturnCode JZsdk_JZC1_Irc_Data_Init()
436 } 565 }
437 566
438 567
  568 +
  569 +/********************
  570 + *
  571 + * 混合视频说明
  572 + *
  573 + * 1920*1088 做处理 并输出为 1920*1080
  574 + * __________________________________________________________________
  575 + * |_________________________________ |
  576 + * | |________________________________|
  577 + * | | |
  578 + * | | 1920*1088 /2 960* 544 |
  579 + * | | |
  580 + * | 320*256 拉伸4到 1280*1024 | |
  581 + * | 裁剪出 3/4 到 960 * 768 | |
  582 + * | | |
  583 + * | |________________________________|
  584 + * |_________________________________| |
  585 + * |__________________________________________________________________|
  586 + *
  587 + * ******************/
  588 +
  589 +static unsigned char *g_MixedIrc_Buffer = NULL;
  590 +static unsigned char *g_MixedOpt_Buffer = NULL;
  591 +
  592 +/******************
  593 + *
  594 + * 混合视频处理
  595 + *
  596 + *
  597 + * ********************/
  598 +static void JZC1_MixedVideo_Deal()
  599 +{
  600 +
  601 +}
  602 +
  603 +
  604 +static void *MixedVideo_Thread(void *args)
  605 +{
  606 +#ifdef RTK_RGA_STATUS_ON
  607 + struct timespec now;
  608 + int d_ret = 0;
  609 +
  610 + //获取起始时间
  611 + struct timespec start_time;
  612 + clock_gettime(CLOCK_MONOTONIC, &start_time);
  613 + long long prev_time = start_time.tv_sec * NSEC_PER_SEC + start_time.tv_nsec;
  614 +
  615 + //设置间隔时间
  616 + long long period = NSEC_PER_SEC / TARGET_FPS;
  617 +
  618 + //混合视频缓冲区
  619 + unsigned char * MixedIrc_Buffer = (unsigned char *)malloc((JZ_ALIGN(FIRST_WIDTH, 16)) * (JZ_ALIGN(FIRST_HEIGHT, 16)) * 3 / 2);
  620 + unsigned char * MixedOpt_Buffer = (unsigned char *)malloc(JZ_ALIGN(SECOND_WIDTH, 16) * JZ_ALIGN(SECOND_HEIGHT, 16) * 3 / 2);
  621 +
  622 + //初始化混合视频的rga
  623 + int Irc_width = JZ_ALIGN(FIRST_WIDTH, 16);
  624 + int Irc_height = JZ_ALIGN(FIRST_HEIGHT, 16);
  625 + int IRc_Rect_x = 0;
  626 + int IRc_Rect_y = 0;
  627 + int Irc_Rect_w = JZ_ALIGN(FIRST_WIDTH, 16);
  628 + int Irc_Rect_h = JZ_ALIGN(FIRST_HEIGHT, 16);
  629 + int Irc_Format = RK_FORMAT_YCbCr_420_SP;
  630 +
  631 + int Opt_width = JZ_ALIGN(SECOND_WIDTH, 16);
  632 + int Opt_height = JZ_ALIGN(SECOND_HEIGHT, 16);
  633 + int Opt_Rect_x = 0;
  634 + int Opt_Rect_y = 0;
  635 + int Opt_Rect_w = JZ_ALIGN(SECOND_WIDTH, 16);
  636 + int Opt_Rect_h = JZ_ALIGN(SECOND_HEIGHT, 16);
  637 + int Opt_Format = RK_FORMAT_YCbCr_420_SP;
  638 +
  639 + //红外源图像
  640 + RK_RgaImage *Irc_SrcImg = NULL;
  641 + RK_Rga_ImageInit(&Irc_SrcImg, Irc_width, Irc_height, Irc_Format, IRc_Rect_x, IRc_Rect_y, Irc_Rect_w, Irc_Rect_h);
  642 +
  643 + //红外放大图像
  644 + RK_RgaImage *Irc_ResizeImg = NULL;
  645 + RK_Rga_ImageInit(&Irc_ResizeImg, Irc_width*4, Irc_height*4, Irc_Format, IRc_Rect_x, IRc_Rect_y, Irc_Rect_w*4, Irc_Rect_h*4);
  646 +
  647 + //红外裁剪图像
  648 + RK_RgaImage *Irc_CropImg = NULL;
  649 + RK_Rga_ImageInit(&Irc_CropImg, (Irc_width*4) /4 *3, (Irc_height*4) /4 *3, Irc_Format, (Irc_width*4)/4, (Irc_height*4)/4, (Irc_width*4) /4 *3, (Irc_height*4) /4 *3);
  650 +
  651 + //光学源图像
  652 + RK_RgaImage *Opt_SrcImg = NULL;
  653 + RK_Rga_ImageInit(&Opt_SrcImg, Opt_width, Opt_height, Opt_Format, Opt_Rect_x, Opt_Rect_y, Opt_Rect_w, Opt_Rect_h);
  654 +
  655 + //光学的缩小图像
  656 + RK_RgaImage *Opt_ResizeImg = NULL;
  657 + RK_Rga_ImageInit(&Opt_ResizeImg, Opt_width/2, Opt_height/2, Opt_Format, Opt_Rect_x, Opt_Rect_y, Opt_Rect_w/2, Opt_Rect_h/2);
  658 +
  659 + //目标图像
  660 + RK_RgaImage *DstImg = NULL;
  661 + RK_Rga_ImageInit(&DstImg, Irc_width, Irc_height, Irc_Format, IRc_Rect_x, IRc_Rect_y, Irc_Rect_w, Irc_Rect_h);
  662 +
  663 + while (1)
  664 + {
  665 + //获取当前时间
  666 + clock_gettime(CLOCK_MONOTONIC, &now);
  667 + long long current_time = now.tv_sec * NSEC_PER_SEC + now.tv_nsec;
  668 +
  669 + //计算时间差
  670 + long long elapsed_time = current_time - prev_time;
  671 +
  672 + //超过33ms
  673 + if (elapsed_time >= period)
  674 + {
  675 + // while (FrameBuffer_UseFlag == JZ_FLAGCODE_ON)
  676 + // {
  677 + // delayUs(100);
  678 + // }
  679 +
  680 + //将数据放入缓冲区
  681 + memcpy(MixedIrc_Buffer, g_MixedIrc_Buffer, (JZ_ALIGN(FIRST_WIDTH, 16)) * (JZ_ALIGN(FIRST_HEIGHT, 16)) * 3 / 2);
  682 + memcpy(MixedOpt_Buffer, g_MixedOpt_Buffer, JZ_ALIGN(SECOND_WIDTH, 16) * JZ_ALIGN(SECOND_HEIGHT, 16) * 3 / 2);
  683 +
  684 + //混合视频处理
  685 + memset(MixedIrc_Buffer, 0, sizeof(MixedIrc_Buffer));
  686 + memset(MixedOpt_Buffer, 0, sizeof(MixedOpt_Buffer));
  687 +
  688 + memcpy(MixedIrc_Buffer, g_MixedIrc_Buffer, (JZ_ALIGN(FIRST_WIDTH, 16)) * (JZ_ALIGN(FIRST_HEIGHT, 16)) * 3 / 2);
  689 + memcpy(MixedOpt_Buffer, g_MixedOpt_Buffer, JZ_ALIGN(SECOND_WIDTH, 16) * JZ_ALIGN(SECOND_HEIGHT, 16) * 3 / 2);
  690 +
  691 + //FrameBuffer_UseFlag = JZ_FLAGCODE_OFF;
  692 +
  693 + //光学数据处理
  694 + //缩小图像到1/2
  695 + d_ret = imresize(Opt_SrcImg->img, Opt_ResizeImg->img);
  696 + if (d_ret != IM_STATUS_SUCCESS)
  697 + {
  698 + printf("irc resize failed\n");
  699 + continue;
  700 + }
  701 +
  702 + //红外数据处理
  703 + //放大图像到4倍
  704 + d_ret = imresize(Irc_SrcImg->img, Irc_ResizeImg->img);
  705 + if (d_ret != IM_STATUS_SUCCESS)
  706 + {
  707 + printf("opt resize failed\n");
  708 + continue;
  709 + }
  710 +
  711 + //裁切红外图像
  712 + d_ret = imcrop(Irc_ResizeImg->img, Irc_CropImg->img, Irc_CropImg->rect);
  713 + if (d_ret != IM_STATUS_SUCCESS)
  714 + {
  715 + printf("opt crop failed\n");
  716 + continue;
  717 + }
  718 +
  719 + //以下参考rga_alpha_yuv_demo.cpp
  720 +
  721 + //将缩放好的光学画面放入目标画面
  722 + int usage = IM_SYNC | IM_ALPHA_BLEND_DST_OVER | IM_ALPHA_BLEND_PRE_MUL;
  723 + // d_ret = improcess()
  724 +
  725 +
  726 + // prev_time = current_time;
  727 + }
  728 +
  729 + // 为了防止过于频繁地调用 clock_gettime,可以添加一个小的睡眠时间
  730 + // 例如,休眠1毫秒(100000000纳秒),以减少CPU占用
  731 + struct timespec req = { .tv_sec = 0, .tv_nsec = 1000000 };
  732 + nanosleep(&req, NULL);
  733 + }
  734 +#endif
  735 +}
  736 +
  737 +
  738 +/******************
  739 + *
  740 + * 混合视频初始化
  741 + *
  742 + *
  743 + * ********************/
  744 +static JZC1_MixedVideo_Init()
  745 +{
  746 + g_MixedIrc_Buffer = (unsigned char *)malloc(JZ_ALIGN(FIRST_WIDTH, 16)*JZ_ALIGN(FIRST_HEIGHT, 16)*3/2);
  747 + g_MixedOpt_Buffer = (unsigned char *)malloc(JZ_ALIGN(SECOND_WIDTH, 16)*JZ_ALIGN(SECOND_HEIGHT, 16)*3/2);
  748 +
  749 + //混合视频初始化
  750 + pthread_t Task;
  751 + pthread_attr_t attribute; //线程属性
  752 + pthread_attr_init(&attribute); //初始化线程属性
  753 + pthread_attr_setdetachstate(&attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
  754 + int bufferdata_Protection = pthread_create(&Task,&attribute,MixedVideo_Thread,NULL); //线程
  755 + if(bufferdata_Protection != 0)
  756 + {
  757 + JZSDK_LOG_ERROR("创建混合视频初始化失败!");
  758 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  759 + }
  760 +
  761 + JZSDK_LOG_INFO("MixedVidoe_Init Success");
  762 +
  763 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  764 +}
  765 +
  766 +
439 #endif 767 #endif
440 768
441 //JZ_C1 的媒体初始化 769 //JZ_C1 的媒体初始化
@@ -453,11 +781,14 @@ static T_JZsdkReturnCode JZC1_MediaInit() @@ -453,11 +781,14 @@ static T_JZsdkReturnCode JZC1_MediaInit()
453 //初始化Mulit模块 781 //初始化Mulit模块
454 #ifdef RTK_MPP_STATUS_ON 782 #ifdef RTK_MPP_STATUS_ON
455 //初始化红外的编解码器 783 //初始化红外的编解码器
456 - RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(0), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420P, FIRST_WIDTH, FIRST_HEIGHT, 30, 5); 784 + RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(0), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, FIRST_WIDTH, FIRST_HEIGHT, 30, 5);
457 785
458 //初始化光学的编解码器 786 //初始化光学的编解码器
459 RTK_mmp_dec_Init(JZsdk_RtkMmpGetDecHandleAddr(1), MPP_VIDEO_CodingMJPEG, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT); 787 RTK_mmp_dec_Init(JZsdk_RtkMmpGetDecHandleAddr(1), MPP_VIDEO_CodingMJPEG, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT);
460 RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(1), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT, 30, 15); 788 RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(1), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT, 30, 15);
  789 +
  790 + // RTK_mmp_dec_Init(JZsdk_RtkMmpGetDecHandleAddr(1), MPP_VIDEO_CodingMJPEG, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT);
  791 + // RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(1), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT, 30, 15);
461 #endif 792 #endif
462 793
463 //初始化Camera模块 794 //初始化Camera模块
@@ -469,6 +800,7 @@ static T_JZsdkReturnCode JZC1_MediaInit() @@ -469,6 +800,7 @@ static T_JZsdkReturnCode JZC1_MediaInit()
469 } 800 }
470 else 801 else
471 { 802 {
  803 +
472 //光学相机的抓取 804 //光学相机的抓取
473 ret = JZsdk_FrameCatch_Single(JZC1_OptDeal); 805 ret = JZsdk_FrameCatch_Single(JZC1_OptDeal);
474 } 806 }
@@ -505,12 +837,132 @@ static T_JZsdkReturnCode JZC1_MediaInit() @@ -505,12 +837,132 @@ static T_JZsdkReturnCode JZC1_MediaInit()
505 value = 0; 837 value = 0;
506 Camera_param(JZ_FLAGCODE_SET, CAMERA_PIXEL_PSEUDO_COLOR_MODE, &value); 838 Camera_param(JZ_FLAGCODE_SET, CAMERA_PIXEL_PSEUDO_COLOR_MODE, &value);
507 839
  840 + //初始化变焦模块
  841 + Cam_Zoom_Init();
  842 +
  843 + //初始化RGA模块
  844 +#ifdef RTK_RGA_STATUS_ON
  845 + ret = JZC1_RgaInit(&g_C1_RgaIrcInfo, JZ_ALIGN(FIRST_WIDTH, 16), JZ_ALIGN(FIRST_HEIGHT, 16), RK_FORMAT_YCbCr_420_SP);
  846 + ret = JZC1_RgaInit(&g_C1_RgaOptInfo, JZ_ALIGN(SECOND_WIDTH, 16), JZ_ALIGN(SECOND_HEIGHT, 16), RK_FORMAT_YCbCr_420_SP);
  847 +#endif
  848 +
  849 +#endif
  850 +
  851 +
  852 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  853 +}
  854 +
  855 +#ifdef RTK_RGA_STATUS_ON
  856 +
  857 +static T_JZsdkReturnCode JZC1_RgaInit(C1_RgaInfo **rgaInfo, int dst_width, int dst_height, int dst_format)
  858 +{
  859 +
  860 +
  861 + //初始化rga结构体
  862 + (*rgaInfo) = (C1_RgaInfo *)malloc(sizeof(C1_RgaInfo));
  863 + if ((*rgaInfo) == NULL)
  864 + {
  865 + JZSDK_LOG_ERROR("RGA初始化失败");
  866 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  867 + }
  868 +
  869 + int width = dst_width;
  870 + int height = dst_height;
  871 + int rect_x = 0;
  872 + int rect_y = 0;
  873 + int rect_w = dst_width;
  874 + int rect_h = dst_height;
  875 +
  876 +
  877 + (*rgaInfo)->src_img = NULL;
  878 + RK_Rga_ImageInit(&(*rgaInfo)->src_img, width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化输入模块
  879 +
  880 + (*rgaInfo)->corp_img = NULL;
  881 + RK_Rga_ImageInit(&(*rgaInfo)->corp_img, width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化裁剪模块
  882 +
  883 + (*rgaInfo)->dst_img = NULL;
  884 + RK_Rga_ImageInit(&(*rgaInfo)->dst_img, width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化输出模块
  885 +
  886 +
  887 +
  888 +}
  889 +
508 #endif 890 #endif
509 891
  892 +//rga处理
  893 +#ifdef RTK_RGA_STATUS_ON
  894 +static T_JZsdkReturnCode JZC1_RgaDeal(C1_RgaInfo *rga_info, int resize, unsigned char *image, unsigned int *imgage_size)
  895 +{
  896 + int d_ret;
  897 +
  898 +
  899 + if (g_C1_RgaIrcInfo == NULL || *imgage_size != rga_info->src_img->buf_size)
  900 + {
  901 + printf("C1_Rga_Deal failed imagesize:%d bufsize:%d\n", *imgage_size, rga_info->src_img->buf_size);
  902 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  903 + }
  904 +
  905 + //检查裁剪倍数是否改变
  906 + if (resize != rga_info->scale)
  907 + {
  908 + rga_info->scale = resize;
  909 +
  910 + //释放裁剪区域, 并重新注册
  911 + if (rga_info->corp_img != NULL)
  912 + {
  913 + RK_Rga_ImageDeInit(&(rga_info->corp_img));
  914 +
  915 + int width = rga_info->src_img->width / resize;
  916 + int height = rga_info->src_img->height / resize;
  917 + int rect_x = (rga_info->src_img->width) / 2 - width / 2;
  918 + int rect_y = (rga_info->src_img->height) / 2 - height / 2;
  919 + int rect_w = width;
  920 + int rect_h = height;
  921 + int dst_format = rga_info->src_img->format;
  922 +
  923 + RK_Rga_ImageInit(&(rga_info->corp_img), width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化裁剪模块
  924 + }
  925 + }
  926 +
  927 + //将图像放入处理器
  928 + memcpy(rga_info->src_img->buf, image, *imgage_size);
  929 +
  930 + //JZSDK_LOG_DEBUG("裁剪倍率%d",resize);
  931 +
  932 + if (resize == 0)
  933 + {
  934 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  935 + }
  936 +
  937 + //裁剪图像
  938 + d_ret = imcrop(rga_info->src_img->img, rga_info->corp_img->img, rga_info->corp_img->rect);
  939 + if (d_ret != IM_STATUS_SUCCESS)
  940 + {
  941 + printf("crop failed\n");
  942 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  943 + }
  944 +
  945 + //缩放图像
  946 + d_ret = imresize(rga_info->corp_img->img, rga_info->dst_img->img);
  947 + if (d_ret != IM_STATUS_SUCCESS)
  948 + {
  949 + printf("resize failed\n");
  950 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  951 + }
  952 +
  953 + //返回图像
  954 + memcpy(image, rga_info->dst_img->buf, rga_info->dst_img->buf_size);
  955 + //printf("image[0]:%d image[1]:%d\n", image[0], image[1]);
  956 + *imgage_size = rga_info->dst_img->buf_size;
510 957
511 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 958 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  959 +
  960 +
  961 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  962 +
512 } 963 }
513 964
  965 +#endif
514 966
515 T_JZsdkReturnCode JZC1_Init() 967 T_JZsdkReturnCode JZC1_Init()
516 { 968 {
@@ -14,7 +14,6 @@ sysfs接口与GPIO(通用输入/输出)模块 @@ -14,7 +14,6 @@ sysfs接口与GPIO(通用输入/输出)模块
14 **/ 14 **/
15 15
16 /******************* 16 /*******************
17 - *  
18 * sysfs的gpio引脚注册 17 * sysfs的gpio引脚注册
19 * 引脚号计算公式为 pin = bank * 32 + number, number = group*8 + X 18 * 引脚号计算公式为 pin = bank * 32 + number, number = group*8 + X
20 * 格式为 GPIO + bank + '_' + group + X 19 * 格式为 GPIO + bank + '_' + group + X
  1 +#include <stdio.h>
  2 +#include <pthread.h>
  3 +
  4 +
  5 +#include "BaseConfig.h"
  6 +#include "JZsdkLib.h"
  7 +
  8 +#define ZOOM_VALUE_DETECTION_FREQUENCY 50 //每秒检测50次变焦值
  9 +
  10 +static int g_Cam_ZoomTempValue = 0; //相机对焦临时变量 用于各个模块的输入使用
  11 +static int g_Cam_ZoomValue = 0; //相机对焦变量的实际对焦值, 0为最远(完整画面), 1000为最近(最大放大画面)
  12 +
  13 +/*****************
  14 + *
  15 + *
  16 + * 设置临时变焦值
  17 + *
  18 + *
  19 + * *******************/
  20 +T_JZsdkReturnCode Cam_Zoom_SetTempValue(int *value)
  21 +{
  22 + if (*value > 1000)
  23 + {
  24 + *value = 1000;
  25 + }
  26 + else if (*value < 0)
  27 + {
  28 + *value = 0;
  29 + }
  30 +
  31 + g_Cam_ZoomTempValue = *value;
  32 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  33 +}
  34 +
  35 +/*************
  36 + *
  37 + *
  38 + * 获取变焦值
  39 + *
  40 + *
  41 + * *****************/
  42 +T_JZsdkReturnCode Cam_Zoom_GetValue(int *value)
  43 +{
  44 + *value = g_Cam_ZoomValue;
  45 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  46 +}
  47 +
  48 +/*********************
  49 + *
  50 + *
  51 + * 设置实际变焦值
  52 + *
  53 + *
  54 + * *********************/
  55 +static T_JZsdkReturnCode Cam_Zoom_SetValue(int value)
  56 +{
  57 + g_Cam_ZoomValue = value;
  58 +
  59 + //对外广播变焦值
  60 +
  61 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  62 +}
  63 +
  64 +
  65 +static void *ZoomValue_Thread(void *args)
  66 +{
  67 + while (1)
  68 + {
  69 + //每一段时间检测输入的变焦值是否有变化
  70 + delayMs(1000/ZOOM_VALUE_DETECTION_FREQUENCY);
  71 + if (g_Cam_ZoomTempValue != g_Cam_ZoomValue)
  72 + {
  73 + Cam_Zoom_SetValue(g_Cam_ZoomTempValue);
  74 + }
  75 +
  76 + //JZSDK_LOG_DEBUG("g_Cam_ZoomValue = %d , g_Cam_ZoomTempValue = %d", g_Cam_ZoomValue, g_Cam_ZoomTempValue);
  77 + }
  78 +}
  79 +
  80 +/******************
  81 + *
  82 + *
  83 + * 变焦模块初始化
  84 + *
  85 + * *****************/
  86 +T_JZsdkReturnCode Cam_Zoom_Init()
  87 +{
  88 + //初始化处理现场
  89 + pthread_t ZoomValue_Task;
  90 + pthread_attr_t attribute; //线程属性
  91 + pthread_attr_init(&attribute); //初始化线程属性
  92 + pthread_attr_setdetachstate(&attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
  93 + int bufferdata_Protection = pthread_create(&ZoomValue_Task,&attribute,ZoomValue_Thread,NULL); //线程
  94 + if(bufferdata_Protection != 0)
  95 + {
  96 + JZSDK_LOG_ERROR("创建变焦模块失败!");
  97 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  98 + }
  99 +
  100 +
  101 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  102 +}
  1 +/**
  2 + ********************************************************************
  3 + * @file Cam_Zoom.h
  4 + * Cam_Zoom.c 的头文件
  5 + *
  6 + *********************************************************************
  7 + */
  8 +
  9 +/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
  10 +#ifndef CAM_ZOOM_H
  11 +#define CAM_ZOOM_H
  12 +
  13 +/* Includes ------------------------------------------------------------------*/
  14 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  15 +
  16 +#ifdef __cplusplus
  17 +extern "C" {
  18 +#endif
  19 +
  20 +/* Exported constants --------------------------------------------------------*/
  21 +/* 常亮定义*/
  22 +
  23 +
  24 +/* Exported types ------------------------------------------------------------*/
  25 +
  26 +/* Exported functions --------------------------------------------------------*/
  27 +T_JZsdkReturnCode Cam_Zoom_SetTempValue(int *value);
  28 +T_JZsdkReturnCode Cam_Zoom_GetValue(int *value);
  29 +T_JZsdkReturnCode Cam_Zoom_Init();
  30 +
  31 +#ifdef __cplusplus
  32 +}
  33 +#endif
  34 +
  35 +#endif
@@ -313,6 +313,13 @@ T_JZsdkReturnCode Camera_param(int flagcode, enum CameraParam paramflag, int *va @@ -313,6 +313,13 @@ T_JZsdkReturnCode Camera_param(int flagcode, enum CameraParam paramflag, int *va
313 { 313 {
314 *value = g_CameraGasEnhancementColor; 314 *value = g_CameraGasEnhancementColor;
315 } 315 }
  316 + break;
  317 +
  318 + case CAMERA_RESIZE:
  319 + {
  320 + Cam_Zoom_GetValue(value);
  321 + }
  322 + break;
316 323
317 default: 324 default:
318 { 325 {
@@ -389,6 +396,15 @@ T_JZsdkReturnCode Camera_param(int flagcode, enum CameraParam paramflag, int *va @@ -389,6 +396,15 @@ T_JZsdkReturnCode Camera_param(int flagcode, enum CameraParam paramflag, int *va
389 } 396 }
390 break; 397 break;
391 398
  399 + case CAMERA_RESIZE:
  400 + {
  401 + Cam_Zoom_SetTempValue(value);
  402 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  403 + {
  404 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  405 + }
  406 + }
  407 +
392 default: 408 default:
393 { 409 {
394 *value = JZ_FLAGCODE_OFF; 410 *value = JZ_FLAGCODE_OFF;
@@ -14,6 +14,11 @@ @@ -14,6 +14,11 @@
14 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h" 14 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
15 #include "MediaProc/MediaProc_Param.h" 15 #include "MediaProc/MediaProc_Param.h"
16 16
  17 +#include "MediaProc/Camera/Cam_FrameCatch/Cam_FrameCatch.h"
  18 +#include "MediaProc/Camera/V4L2_camera/V4L2_CameraParameterSetting.h"
  19 +#include "MediaProc/Camera/V4L2_camera/V4L2_Record.h"
  20 +#include "MediaProc/Camera/Cam_Zoom/Cam_Zoom.h"
  21 +
17 #ifdef __cplusplus 22 #ifdef __cplusplus
18 extern "C" { 23 extern "C" {
19 #endif 24 #endif
@@ -71,8 +71,11 @@ typedef struct IRC_param @@ -71,8 +71,11 @@ typedef struct IRC_param
71 unsigned int SPC_auto_time_flag; //spc定时自动打档标志位,用于计算打档时间 71 unsigned int SPC_auto_time_flag; //spc定时自动打档标志位,用于计算打档时间
72 72
73 //两点矫正(Two-Point Correction -> TPC) 73 //两点矫正(Two-Point Correction -> TPC)
74 - double *TPC_Diff; // tpc截距数组 即计算得到的增益  
75 - double *TPC_Slope; // tpc斜率数组 即计算得到的补正 74 + double *TPC_Gain; // tpc斜率数组 即计算得到的校准增益
  75 + double *TPC_Offset; // tpc截距数组 即计算得到的校正偏移值
  76 +
  77 + unsigned int TPC_ResetFlag; //tpc校准标志位 开启时进行tpc校准
  78 +
76 79
77 unsigned int TPC_mode; //tpc模式 0出厂打档 1手动打档 80 unsigned int TPC_mode; //tpc模式 0出厂打档 1手动打档
78 81
@@ -407,7 +407,8 @@ T_JZsdkReturnCode IRC_FrameDeal(U16_t *rawData ,unsigned int dataSize, unsigned @@ -407,7 +407,8 @@ T_JZsdkReturnCode IRC_FrameDeal(U16_t *rawData ,unsigned int dataSize, unsigned
407 U8_t *yuv_frame = (U8_t *)malloc(g_IRC_Param->Width*g_IRC_Param->Height*3/2 *sizeof(U8_t)); 407 U8_t *yuv_frame = (U8_t *)malloc(g_IRC_Param->Width*g_IRC_Param->Height*3/2 *sizeof(U8_t));
408 408
409 // 调用转换函数 409 // 调用转换函数
410 - Stream_rgb888_to_yuv420p(RGB_data,g_IRC_Param->Width,g_IRC_Param->Height, yuv_frame); 410 + //Stream_rgb888_to_yuv420p(RGB_data,g_IRC_Param->Width,g_IRC_Param->Height, yuv_frame);
  411 + Stream_rgb888_to_yuv420sp(RGB_data,g_IRC_Param->Width,g_IRC_Param->Height, yuv_frame);
411 412
412 *outData = yuv_frame; 413 *outData = yuv_frame;
413 *outDataSize = g_IRC_Param->Width*g_IRC_Param->Height*3/2; 414 *outDataSize = g_IRC_Param->Width*g_IRC_Param->Height*3/2;
@@ -1044,16 +1045,16 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in @@ -1044,16 +1045,16 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
1044 IrcDealCfg->LowT_flag = JZ_FLAGCODE_OFF; 1045 IrcDealCfg->LowT_flag = JZ_FLAGCODE_OFF;
1045 IrcDealCfg->HighT_flag = JZ_FLAGCODE_OFF; 1046 IrcDealCfg->HighT_flag = JZ_FLAGCODE_OFF;
1046 1047
1047 - IrcDealCfg->TPC_Diff = (double *)malloc(IrcDealCfg->PixelNum * sizeof(double));  
1048 - if (IrcDealCfg->TPC_Diff == NULL) 1048 + IrcDealCfg->TPC_Offset = (double *)malloc(IrcDealCfg->PixelNum * sizeof(double));
  1049 + if (IrcDealCfg->TPC_Offset == NULL)
1049 { 1050 {
1050 - JZSDK_LOG_ERROR("TPC_Diff注册失败"); 1051 + JZSDK_LOG_ERROR("TPC_Offset注册失败");
1051 } 1052 }
1052 1053
1053 - IrcDealCfg->TPC_Slope = (double *)malloc(IrcDealCfg->PixelNum * sizeof(double));  
1054 - if (IrcDealCfg->TPC_Slope == NULL) 1054 + IrcDealCfg->TPC_Gain = (double *)malloc(IrcDealCfg->PixelNum * sizeof(double));
  1055 + if (IrcDealCfg->TPC_Gain == NULL)
1055 { 1056 {
1056 - JZSDK_LOG_ERROR("TPC_Slope注册失败"); 1057 + JZSDK_LOG_ERROR("TPC_Gain注册失败");
1057 } 1058 }
1058 1059
1059 IrcDealCfg->HighT_NineFrameAdd = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t)); 1060 IrcDealCfg->HighT_NineFrameAdd = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t));
@@ -1137,6 +1138,9 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in @@ -1137,6 +1138,9 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
1137 //填入低温数据 1138 //填入低温数据
1138 IRC_Set_LowTempData(IrcDealCfg); 1139 IRC_Set_LowTempData(IrcDealCfg);
1139 1140
  1141 + //开启tpc校验标志
  1142 + IrcDealCfg->TPC_ResetFlag = JZ_FLAGCODE_ON;
  1143 +
1140 //获取markdata的本地数据 1144 //获取markdata的本地数据
1141 ret = IRC_LocalFrame_DataRead(SPC_MARK_DATA, IrcDealCfg); 1145 ret = IRC_LocalFrame_DataRead(SPC_MARK_DATA, IrcDealCfg);
1142 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 1146 if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
@@ -202,274 +202,6 @@ static T_JZsdkReturnCode JZsdk_vKT(U16_t *in_str, U8_t **out_str, int *out_str_l @@ -202,274 +202,6 @@ static T_JZsdkReturnCode JZsdk_vKT(U16_t *in_str, U8_t **out_str, int *out_str_l
202 } 202 }
203 203
204 204
205 -  
206 -// //将14位灰度图数据转换为原始码流  
207 -// T_JZsdkReturnCode IRC_14bitGrayData_to_RawData(U8_t *data, int data_len, U8_t **raw_data, int *raw_data_len, struct IRC_param *dealInfo, int rawType)  
208 -// {  
209 -// T_JZsdkReturnCode ret;  
210 -  
211 -// //无图像  
212 -// if (data == NULL || dealInfo == NULL)  
213 -// {  
214 -// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;  
215 -// }  
216 -  
217 -// U16_t u16_RawData[dealInfo->PixelNum]; //原始16位码流  
218 -// U16_t u16_CorrentData[dealInfo->PixelNum];  
219 -// unsigned int u16_data_len; //16位码流的数据长度  
220 -  
221 -// //1、合成像素,u8转换合并成u16  
222 -// JZsdk_Merge_U8_to_U16_byReverse(data, data_len,u16_RawData, &u16_data_len);  
223 -// if (u16_data_len != dealInfo->PixelNum)  
224 -// {  
225 -// JZSDK_LOG_ERROR("像素合成失败");  
226 -// }  
227 -  
228 -// //2、数据检查  
229 -// for (int i = 0; i < dealInfo->PixelNum; i++)  
230 -// {  
231 -// if (u16_RawData[i] > dealInfo->ExpectedMax)  
232 -// {  
233 -// u16_RawData[i] = dealInfo->ExpectedMax;  
234 -// }  
235 -// }  
236 -  
237 -// //3、如果开启了原始流坏点寻找  
238 -// if (dealInfo->AutoBadPixelReset == JZ_FLAGCODE_ON)  
239 -// {  
240 -// JZsdk_RawCheckisBadPixel_U16(u16_RawData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, &dealInfo->BadPixelNum);  
241 -// dealInfo->AutoBadPixelReset = JZ_FLAGCODE_OFF;  
242 -// }  
243 -// //盲元纠正  
244 -// JZsdk_CutBadPixel_U16(u16_RawData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, dealInfo->BadPixelNum,dealInfo->BadPixelExtern, 1);  
245 -  
246 -  
247 -// /***************************************************************************  
248 -// *  
249 -// * 图像标定记录  
250 -// *  
251 -// *  
252 -// * *******************************************************************/  
253 -// //3、如果开启了低温循环标定  
254 -// if (dealInfo->LowT_flag != JZ_FLAGCODE_OFF)  
255 -// {  
256 -// IRC_LowT_CycleCalibration(u16_RawData, dealInfo);  
257 -// }  
258 -  
259 -// //4、如果开启了高温循环标定  
260 -// if (dealInfo->HighT_flag != JZ_FLAGCODE_OFF)  
261 -// {  
262 -// IRC_HighT_CycleCalibration(u16_RawData, dealInfo);  
263 -// }  
264 -  
265 -  
266 -// //单点校正spc如果未进行过数据的标定,则进行一次  
267 -// if (dealInfo->FirstSPC_flag == JZ_FLAGCODE_ON)  
268 -// {  
269 -// JZSDK_LOG_INFO("未进行过数据标定");  
270 -// memcpy(dealInfo->SPC_Mark_Data, u16_RawData, dealInfo->PixelNum * sizeof(U16_t));  
271 -// IRC_SPC_FrameSaveOrRead(dealInfo, 1, dealInfo->SPC_Mark_Data);  
272 -// IRC_SPC_ParamCorrect(dealInfo, dealInfo->SPC_Mark_Data);  
273 -// dealInfo->FirstSPC_flag = JZ_FLAGCODE_OFF;  
274 -// }  
275 -  
276 -// //如果开启spc重置标定  
277 -// if (dealInfo->SPC_ResetFlag == JZ_FLAGCODE_ON)  
278 -// {  
279 -// JZSDK_LOG_INFO("SPC重置标定");  
280 -// memcpy(dealInfo->SPC_Mark_Data, u16_RawData, dealInfo->PixelNum * sizeof(U16_t));  
281 -// IRC_SPC_FrameSaveOrRead(dealInfo, 1, dealInfo->SPC_Mark_Data);  
282 -// IRC_SPC_ParamCorrect(dealInfo, dealInfo->SPC_Mark_Data);  
283 -// dealInfo->SPC_ResetFlag = JZ_FLAGCODE_OFF;  
284 -// }  
285 -  
286 -// //标记气体增图像图像  
287 -// //如果开启气体增强时,未标记过  
288 -// if (dealInfo->OutputPixelColorMode == 2 && dealInfo->First_DGCE_flag == JZ_FLAGCODE_ON)  
289 -// {  
290 -// memcpy(dealInfo->DGCE_Mark_Data, u16_RawData, dealInfo->PixelNum * sizeof(U16_t) );  
291 -// dealInfo->First_DGCE_flag = JZ_FLAGCODE_OFF;  
292 -// }  
293 -// //如果开启气体增强重置标定  
294 -// if (dealInfo->DGCE_ResetFlag == JZ_FLAGCODE_ON)  
295 -// {  
296 -// JZSDK_LOG_INFO("气体增强重置标定");  
297 -// memcpy(dealInfo->DGCE_Mark_Data, u16_RawData, dealInfo->PixelNum * sizeof(U16_t));  
298 -// dealInfo->DGCE_ResetFlag = JZ_FLAGCODE_OFF;  
299 -// }  
300 -  
301 -// /***************************************************************************  
302 -// *  
303 -// * 校正  
304 -// *  
305 -// *  
306 -// * *******************************************************************/  
307 -// //5、校正  
308 -// //先复制一份纠正用数据  
309 -// memcpy(u16_CorrentData, u16_RawData, dealInfo->PixelNum * sizeof(U16_t));  
310 -  
311 -  
312 -// //如果打开了两点校正  
313 -// if (dealInfo->FrameCorrectMode == IRC_CORRCTION_TPC)  
314 -// {  
315 -// IRC_TPC(u16_CorrentData, dealInfo);  
316 -// }  
317 -  
318 -// if (dealInfo->FrameCorrectMode == IRC_CORRCTION_SPC)  
319 -// {  
320 -// IRC_SPC(u16_CorrentData, dealInfo);  
321 -// }  
322 -  
323 -// //7、图像输出模式  
324 -// U8_t *GrayImage = NULL; //灰度图数组  
325 -// unsigned int GrayImageLen = 0; //灰度图长度  
326 -// U8_t *RgbImage = NULL; //rgb888的图像数组  
327 -// unsigned int RgbImageLen = 0; //rgb数组的长度  
328 -  
329 -// switch (dealInfo->OutputPixelColorMode)  
330 -// {  
331 -// case 0: //默认输出模式  
332 -// {  
333 -// //u16转换为灰度图  
334 -// //IRC_Histogram_vKT(u16_CorrentData, &GrayImage, &GrayImageLen, dealInfo);  
335 -// JZsdk_vKT(u16_CorrentData, &GrayImage, &GrayImageLen, dealInfo);  
336 -  
337 -// if (JZsdk_GrayBadPixelCheck_flag == JZ_FLAGCODE_ON)  
338 -// {  
339 -// JZsdk_GrayCheckisBadPixel_U8(GrayImage, dealInfo->Width, dealInfo->Height, dealInfo->GrayPixel, &dealInfo->GrayPixelNum);  
340 -// JZsdk_GrayBadPixelCheck_flag = JZ_FLAGCODE_OFF;  
341 -// }  
342 -  
343 -// //JZsdk_CutBadPixel_U8(GrayImage, dealInfo->Width, dealInfo->Height, dealInfo->GrayPixel, dealInfo->GrayPixelNum,dealInfo->GrayPixelExtern, 1);  
344 -  
345 -// //灰度图转rgb888  
346 -// IRC_GrayTo_RGB(GrayImage, &RgbImage, &RgbImageLen,dealInfo);  
347 -// }  
348 -// break;  
349 -  
350 -// case 1: //伪彩输出模式  
351 -// {  
352 -// //u16转换为灰度图  
353 -// //IRC_Histogram_vKT(u16_CorrentData, &GrayImage, &GrayImageLen, dealInfo);  
354 -// JZsdk_vKT(u16_CorrentData, &GrayImage, &GrayImageLen, dealInfo);  
355 -  
356 -// if (JZsdk_GrayBadPixelCheck_flag == JZ_FLAGCODE_ON)  
357 -// {  
358 -// JZsdk_GrayCheckisBadPixel_U8(GrayImage, dealInfo->Width, dealInfo->Height, dealInfo->GrayPixel, &dealInfo->GrayPixelNum);  
359 -// JZsdk_GrayBadPixelCheck_flag = JZ_FLAGCODE_OFF;  
360 -// }  
361 -  
362 -// //JZsdk_CutBadPixel_U8(GrayImage, dealInfo->Width, dealInfo->Height, dealInfo->GrayPixel, dealInfo->GrayPixelNum,dealInfo->GrayPixelExtern, 1);  
363 -  
364 -// //灰度图转伪彩rgb888  
365 -// ret = PseudoColor_Gray2Rgb(GrayImage, &RgbImage, &RgbImageLen, dealInfo->PixelNum);  
366 -// if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
367 -// {  
368 -// IRC_GrayTo_RGB(GrayImage, &RgbImage, &RgbImageLen,dealInfo);  
369 -// }  
370 -  
371 -// }  
372 -// break;  
373 -  
374 -// case 2: //气体色彩增强输出模式  
375 -// {  
376 -// //进行前需要自动打开单点纠正模式  
377 -// //u16转换为灰度图  
378 -// //IRC_Histogram_vKT(u16_CorrentData, &GrayImage, &GrayImageLen, dealInfo);  
379 -// JZsdk_vKT(u16_CorrentData, &GrayImage, &GrayImageLen, dealInfo);  
380 -  
381 -// // if (JZsdk_GrayBadPixelCheck_flag == JZ_FLAGCODE_ON)  
382 -// // {  
383 -// // JZsdk_GrayCheckisBadPixel_U8(GrayImage, dealInfo->Width, dealInfo->Height, dealInfo->GrayPixel, &dealInfo->GrayPixelNum);  
384 -// // JZsdk_GrayBadPixelCheck_flag = JZ_FLAGCODE_OFF;  
385 -// // }  
386 -// // JZsdk_CutBadPixel_U8(GrayImage, dealInfo->Width, dealInfo->Height, dealInfo->GrayPixel, dealInfo->GrayPixelNum,dealInfo->GrayPixelExtern, 1);  
387 -  
388 -// //转为rgb  
389 -// IRC_GrayTo_RGB(GrayImage, &RgbImage, &RgbImageLen,dealInfo);  
390 -  
391 -// //灰度图转气体增强rgb888  
392 -// IRC_DynamicGasesColorEnhance(RgbImage, u16_RawData, dealInfo);  
393 -// }  
394 -// break;  
395 -  
396 -// default:  
397 -// return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
398 -// break;  
399 -// }  
400 -  
401 -// // 在rgb图上画图形  
402 -// IRC_WriteGraphical(RgbImage, dealInfo);  
403 -  
404 -// /*****************  
405 -// *  
406 -// *  
407 -// * 如果码流类型要求为yuv420p  
408 -// *  
409 -// * **********************/  
410 -// if (rawType == 0)  
411 -// {  
412 -// //rgb888转yuv  
413 -// U8_t *yuv_frame = (U8_t *)malloc(dealInfo->Width*dealInfo->Height*3/2 );  
414 -// if (yuv_frame == NULL)  
415 -// {  
416 -// printf("内存注册失败\n");  
417 -// if (GrayImage != NULL)  
418 -// {  
419 -// free(GrayImage);  
420 -// GrayImage = NULL;  
421 -// }  
422 -// if (RgbImage != NULL)  
423 -// {  
424 -// free(RgbImage);  
425 -// RgbImage = NULL;  
426 -// }  
427 -// return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;  
428 -// }  
429 -  
430 -// // 调用转换函数  
431 -// Stream_rgb888_to_yuv420p(RgbImage,dealInfo->Width,dealInfo->Height,yuv_frame);  
432 -  
433 -// // 释放临时缓冲区,保留yuv_frame  
434 -// if (GrayImage != NULL)  
435 -// {  
436 -// free(GrayImage);  
437 -// GrayImage = NULL;  
438 -// }  
439 -// if (RgbImage != NULL)  
440 -// {  
441 -// free(RgbImage);  
442 -// RgbImage = NULL;  
443 -// }  
444 -  
445 -// *raw_data = yuv_frame;  
446 -// *raw_data_len = dealInfo->Width*dealInfo->Height*3/2;  
447 -// }  
448 -  
449 -// /*****************  
450 -// *  
451 -// *  
452 -// * 如果码流类型要求为rgb888  
453 -// *  
454 -// * **********************/  
455 -// if (rawType == 1)  
456 -// {  
457 -// // 释放临时缓冲区  
458 -// if (GrayImage != NULL)  
459 -// {  
460 -// free(GrayImage);  
461 -// GrayImage = NULL;  
462 -// }  
463 -  
464 -// *raw_data = RgbImage;  
465 -// *raw_data_len = dealInfo->Width*dealInfo->Height*3;  
466 -// }  
467 -  
468 -// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
469 -// }  
470 -  
471 -  
472 -  
473 /****** 205 /******
474 * 206 *
475 * 单点矫正 207 * 单点矫正
@@ -556,7 +288,7 @@ T_JZsdkReturnCode JZIrcLib_TPC(U16_t *ImageData,struct IRC_param *dealInfo) @@ -556,7 +288,7 @@ T_JZsdkReturnCode JZIrcLib_TPC(U16_t *ImageData,struct IRC_param *dealInfo)
556 // 应用两点校正公式 288 // 应用两点校正公式
557 for (int i = 0; i < dealInfo->PixelNum; i++) 289 for (int i = 0; i < dealInfo->PixelNum; i++)
558 { 290 {
559 - ImageData[i] = (int)(dealInfo->TPC_Slope[i] * ImageData[i] + dealInfo->TPC_Diff[i]); 291 + ImageData[i] = (int)(dealInfo->TPC_Gain[i] * ImageData[i] + dealInfo->TPC_Offset[i]);
560 if (ImageData[i] < 0) 292 if (ImageData[i] < 0)
561 { 293 {
562 ImageData[i] = 0; 294 ImageData[i] = 0;
@@ -590,12 +322,12 @@ static T_JZsdkReturnCode JZIrcLib_TPC_Slope_Calculation(struct IRC_param *dealIn @@ -590,12 +322,12 @@ static T_JZsdkReturnCode JZIrcLib_TPC_Slope_Calculation(struct IRC_param *dealIn
590 int allZeroSlope_flag = 1, allZeroDiff_flag = 1; 322 int allZeroSlope_flag = 1, allZeroDiff_flag = 1;
591 for (int i = 0; i < dealInfo->PixelNum; i++) 323 for (int i = 0; i < dealInfo->PixelNum; i++)
592 { 324 {
593 - if (dealInfo->TPC_Slope[i] != 0) 325 + if (dealInfo->TPC_Gain[i] != 0)
594 { 326 {
595 allZeroSlope_flag = 0; 327 allZeroSlope_flag = 0;
596 } 328 }
597 329
598 - if (dealInfo->TPC_Diff[i] != 0) 330 + if (dealInfo->TPC_Offset[i] != 0)
599 { 331 {
600 allZeroDiff_flag = 0; 332 allZeroDiff_flag = 0;
601 } 333 }
@@ -619,17 +351,61 @@ static T_JZsdkReturnCode JZIrcLib_TPC_Slope_Calculation(struct IRC_param *dealIn @@ -619,17 +351,61 @@ static T_JZsdkReturnCode JZIrcLib_TPC_Slope_Calculation(struct IRC_param *dealIn
619 { 351 {
620 if (dealInfo->HighT_NineFrame_Avg[i] > dealInfo->LowT_NineFrame_Avg[i]) 352 if (dealInfo->HighT_NineFrame_Avg[i] > dealInfo->LowT_NineFrame_Avg[i])
621 { 353 {
622 - dealInfo->TPC_Slope[i] = (AvgSingleFrame_HighT - AvgSingleFrame_LowT) / (dealInfo->HighT_NineFrame_Avg[i] - dealInfo->LowT_NineFrame_Avg[i]); 354 + dealInfo->TPC_Gain[i] = (AvgSingleFrame_HighT - AvgSingleFrame_LowT) / (dealInfo->HighT_NineFrame_Avg[i] - dealInfo->LowT_NineFrame_Avg[i]);
623 } 355 }
624 else 356 else
625 { 357 {
626 - dealInfo->TPC_Slope[i] = 0; 358 + dealInfo->TPC_Gain[i] = 0;
627 } 359 }
628 - dealInfo->TPC_Diff[i] = AvgSingleFrame_LowT - dealInfo->TPC_Slope[i] * dealInfo->LowT_NineFrame_Avg[i]; 360 + dealInfo->TPC_Offset[i] = AvgSingleFrame_LowT - dealInfo->TPC_Gain[i] * dealInfo->LowT_NineFrame_Avg[i];
629 } 361 }
630 } 362 }
631 } 363 }
632 364
  365 +/*******************
  366 + *
  367 + * 两点校正斜率计算
  368 + *
  369 + *
  370 + * *******************/
  371 +static T_JZsdkReturnCode JZIrcLib_TPC_Slope_Calculation2(struct IRC_param *dealInfo)
  372 +{
  373 + //判断是否存在结构体
  374 + if (dealInfo == NULL)
  375 + {
  376 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  377 + }
  378 +
  379 + //计算像元平均响应
  380 + double AvgSingleFrame_LowT = 0, AvgSingleFrame_HighT = 0;
  381 +
  382 + for (int i = 0; i < dealInfo->PixelNum; i++)
  383 + {
  384 + AvgSingleFrame_LowT += dealInfo->LowT_NineFrame_Avg[i];
  385 + AvgSingleFrame_HighT += dealInfo->HighT_NineFrame_Avg[i];
  386 + }
  387 +
  388 + AvgSingleFrame_HighT = AvgSingleFrame_HighT / dealInfo->PixelNum;
  389 + AvgSingleFrame_LowT = AvgSingleFrame_LowT / dealInfo->PixelNum;
  390 +
  391 + for (int i = 0; i < dealInfo->PixelNum; i++)
  392 + {
  393 + if (dealInfo->HighT_NineFrame_Avg[i] != dealInfo->LowT_NineFrame_Avg[i])
  394 + {
  395 + dealInfo->TPC_Gain[i] = (AvgSingleFrame_HighT - AvgSingleFrame_LowT) / (dealInfo->HighT_NineFrame_Avg[i] - dealInfo->LowT_NineFrame_Avg[i]);
  396 + dealInfo->TPC_Offset[i] = AvgSingleFrame_LowT - dealInfo->TPC_Gain[i] * dealInfo->LowT_NineFrame_Avg[i];
  397 + }
  398 + else
  399 + {
  400 + dealInfo->TPC_Gain[i] = 1;
  401 + dealInfo->TPC_Offset[i] = 0;
  402 + }
  403 + }
  404 +
  405 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  406 +}
  407 +
  408 +
633 /*计算直方图均衡化并转换为8位灰度值 409 /*计算直方图均衡化并转换为8位灰度值
634 U16_t in_str 输入的数据 410 U16_t in_str 输入的数据
635 int in_str_len 输入的数据长度 411 int in_str_len 输入的数据长度
@@ -845,8 +621,11 @@ T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize, @@ -845,8 +621,11 @@ T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
845 // 如果打开了两点校正 621 // 如果打开了两点校正
846 if (dealInfo->FrameCorrectMode == IRC_CORRCTION_TPC) 622 if (dealInfo->FrameCorrectMode == IRC_CORRCTION_TPC)
847 { 623 {
848 - //计算两点校正的斜率  
849 - JZIrcLib_TPC_Slope_Calculation(dealInfo); 624 + if (dealInfo->TPC_ResetFlag == JZ_FLAGCODE_ON)
  625 + {
  626 + //计算两点校正的斜率
  627 + JZIrcLib_TPC_Slope_Calculation2(dealInfo);
  628 + }
850 629
851 //对数据进行两点校正 630 //对数据进行两点校正
852 ret = JZIrcLib_TPC(u16_CorrentData, dealInfo); 631 ret = JZIrcLib_TPC(u16_CorrentData, dealInfo);
@@ -32,7 +32,7 @@ typedef enum CameraParam @@ -32,7 +32,7 @@ typedef enum CameraParam
32 CAMERA_CORRCTION_MODE = 0x000004, //纠正模式 32 CAMERA_CORRCTION_MODE = 0x000004, //纠正模式
33 CAMERA_GAS_ENHANCEMENT_COLOR = 0x000005, //气体增强颜色 33 CAMERA_GAS_ENHANCEMENT_COLOR = 0x000005, //气体增强颜色
34 CAMERA_GAS_ENHANCEMENT_CORRCTION = 0x000006, //气体增强纠正 34 CAMERA_GAS_ENHANCEMENT_CORRCTION = 0x000006, //气体增强纠正
35 - 35 + CAMERA_RESIZE= 0x000007, //相机缩放图像
36 }CameraParam; 36 }CameraParam;
37 37
38 typedef enum IRC_CorrectionMode 38 typedef enum IRC_CorrectionMode
@@ -10,7 +10,7 @@ @@ -10,7 +10,7 @@
10 10
11 #include "JZsdkLib.h" 11 #include "JZsdkLib.h"
12 12
13 -// 将RGB888格式转换为YUV420P格 13 +// 将RGB888格式转换为YUV420P格(I420)
14 T_JZsdkReturnCode Stream_rgb888_to_yuv420p(U8_t *rgb_data, int width, int height, U8_t *yuv_data) 14 T_JZsdkReturnCode Stream_rgb888_to_yuv420p(U8_t *rgb_data, int width, int height, U8_t *yuv_data)
15 { 15 {
16 // YUV420P格式的大小:Y平面后面跟着U和V平面,它们的高度和宽度都是原图像的一半 16 // YUV420P格式的大小:Y平面后面跟着U和V平面,它们的高度和宽度都是原图像的一半
@@ -55,6 +55,80 @@ T_JZsdkReturnCode Stream_rgb888_to_yuv420p(U8_t *rgb_data, int width, int height @@ -55,6 +55,80 @@ T_JZsdkReturnCode Stream_rgb888_to_yuv420p(U8_t *rgb_data, int width, int height
55 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 55 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
56 } 56 }
57 57
  58 +//rgb888 转yuv420sp(NV12)
  59 +T_JZsdkReturnCode Stream_rgb888_to_yuv420sp(U8_t *rgb_data, int width, int height, U8_t *yuv_data)
  60 +{
  61 + // YUV420SP(NV12)格式的大小:Y平面后面跟着一个交织的UV平面
  62 + int y_size = width * height;
  63 + int uv_size = (width / 2) * (height / 2) * 2; // UV平面交织存储,所以大小是U或V平面的两倍
  64 +
  65 + // YUV420SP的各个平面
  66 + U8_t *y_plane = yuv_data;
  67 + U8_t *uv_plane = yuv_data + y_size;
  68 +
  69 + // 用于存储每个2x2块的U和V值的临时变量
  70 + int u_temp = 0, v_temp = 0;
  71 + int u_count = 0, v_count = 0;
  72 +
  73 + // RGB888到YUV420SP的转换
  74 + for (int j = 0; j < height; j++) {
  75 + for (int i = 0; i < width; i++) {
  76 + // 计算Y分量的索引
  77 + int y_idx = j * width + i;
  78 +
  79 + // 提取RGB分量
  80 + U8_t r = rgb_data[y_idx * 3];
  81 + U8_t g = rgb_data[y_idx * 3 + 1];
  82 + U8_t b = rgb_data[y_idx * 3 + 2];
  83 +
  84 + // 将RGB转换为YUV
  85 + int y = ((66 * r + 129 * g + 25 * b + 128) >> 8);
  86 + int u = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
  87 + int v = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
  88 +
  89 + // 存储Y分量
  90 + y_plane[y_idx] = (U8_t)y;
  91 +
  92 + // 对于U和V分量,我们每4个RGB像素(2x2块)存储一次
  93 + if ((i & 1) == 0 && (j & 1) == 0) {
  94 + // 初始化临时变量(对于每个2x2块的第一个像素)
  95 + u_temp = u;
  96 + v_temp = v;
  97 + u_count = 0;
  98 + v_count = 0;
  99 + }
  100 +
  101 + // 更新UV计数器和临时变量(对于2x2块中的每个像素)
  102 + u_count++;
  103 + v_count++;
  104 +
  105 + // 在2x2块的右下角像素处存储U和V分量
  106 + if (u_count == 2 && v_count == 2) {
  107 + // 计算UV分量的索引(交织存储)
  108 + int uv_idx = ((j / 2) * (width / 2) + (i / 2)) * 2;
  109 +
  110 + // 存储U分量
  111 + uv_plane[uv_idx] = (U8_t)u_temp;
  112 +
  113 + // 存储V分量
  114 + uv_plane[uv_idx + 1] = (U8_t)v_temp;
  115 +
  116 + // 重置临时变量和计数器(为下一个2x2块做准备)
  117 + u_temp = 0;
  118 + v_temp = 0;
  119 + u_count = 0;
  120 + v_count = 0;
  121 + }
  122 + }
  123 + }
  124 +
  125 + // 注意:如果图像的宽度或高度不是偶数,上面的代码可能无法正确处理最后一行或一列。
  126 + // 在实际应用中,通常需要确保图像的尺寸是2的倍数,或者添加适当的边界处理代码。
  127 +
  128 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  129 +}
  130 +
  131 +
58 /************************* 132 /*************************
59 * 133 *
60 * /rgb888图片画框 134 * /rgb888图片画框
@@ -26,6 +26,7 @@ extern "C" { @@ -26,6 +26,7 @@ extern "C" {
26 26
27 /* Exported functions --------------------------------------------------------*/ 27 /* Exported functions --------------------------------------------------------*/
28 T_JZsdkReturnCode Stream_rgb888_to_yuv420p(U8_t *rgb_data, int width, int height, U8_t *yuv_data); 28 T_JZsdkReturnCode Stream_rgb888_to_yuv420p(U8_t *rgb_data, int width, int height, U8_t *yuv_data);
  29 +T_JZsdkReturnCode Stream_rgb888_to_yuv420sp(U8_t *rgb_data, int width, int height, U8_t *yuv_data);
29 T_JZsdkReturnCode Stream_rgb888_WriteRectangle(U8_t *rgb_data, int width, int height, int Point1_X, int Point1_Y, int Point2_X, int Point2_Y, int R_Color,int G_Color, int B_Color, int DrawWidth); 30 T_JZsdkReturnCode Stream_rgb888_WriteRectangle(U8_t *rgb_data, int width, int height, int Point1_X, int Point1_Y, int Point2_X, int Point2_Y, int R_Color,int G_Color, int B_Color, int DrawWidth);
30 T_JZsdkReturnCode Stream_rgb888_WriteCross(U8_t *rgb_data, int width, int height, int PointX, int PointY, int R_Color,int G_Color, int B_Color, int DrawWidth, int DrawHeight); 31 T_JZsdkReturnCode Stream_rgb888_WriteCross(U8_t *rgb_data, int width, int height, int PointX, int PointY, int R_Color,int G_Color, int B_Color, int DrawWidth, int DrawHeight);
31 32
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 #include "JZsdkLib.h" 7 #include "JZsdkLib.h"
8 #include "./RTK_mmp_dec.h" 8 #include "./RTK_mmp_dec.h"
9 9
10 -#if RTK_MPP_STATUS == VERSION_SWITCH_ON 10 +#ifdef RTK_MPP_STATUS_ON
11 #include "rockchip/mpp_common.h" //这个.h能在mpp的源码中找到 11 #include "rockchip/mpp_common.h" //这个.h能在mpp的源码中找到
12 #include "rockchip/mpp_packet.h" 12 #include "rockchip/mpp_packet.h"
13 #include "rockchip/rk_mpi.h" 13 #include "rockchip/rk_mpi.h"
@@ -93,39 +93,39 @@ void dump_frame(MppFrame frame, FILE *out_fp) @@ -93,39 +93,39 @@ void dump_frame(MppFrame frame, FILE *out_fp)
93 93
94 } 94 }
95 95
96 -void dump_frame_to_file(MppCtx ctx, MppApi *mpi, MppFrame frame, FILE *out_fp)  
97 -{  
98 - printf("decode_and_dump_to_file\n");  
99 -  
100 - MPP_RET ret;  
101 -  
102 - if (mpp_frame_get_info_change(frame)) {  
103 - printf("mpp_frame_get_info_change\n");  
104 - /**  
105 - * 第一次解码会到这个分支,需要为解码器设置缓冲区.  
106 - * 解码器缓冲区支持3种模式。参考【图像内存分配以及交互模式】Rockchip_Developer_Guide_MPP_CN.pdf  
107 - * 这里使用纯内部模式。  
108 - */  
109 - ret = mpi->control(ctx, MPP_DEC_SET_INFO_CHANGE_READY, NULL);  
110 - if (ret) {  
111 - printf("mpp_frame_get_info_change mpi->control error"  
112 - "MPP_DEC_SET_INFO_CHANGE_READY %d\n", ret);  
113 - }  
114 - return;  
115 - }  
116 -  
117 - RK_U32 err_info = mpp_frame_get_errinfo(frame);  
118 - RK_U32 discard = mpp_frame_get_discard(frame);  
119 - printf("err_info: %u discard: %u\n", err_info, discard);  
120 -  
121 - if (err_info) {  
122 - return;  
123 - } 96 +// void dump_frame_to_file(MppCtx ctx, MppApi *mpi, MppFrame frame, FILE *out_fp)
  97 +// {
  98 +// printf("decode_and_dump_to_file\n");
  99 +
  100 +// MPP_RET ret;
  101 +
  102 +// if (mpp_frame_get_info_change(frame)) {
  103 +// printf("mpp_frame_get_info_change\n");
  104 +// /**
  105 +// * 第一次解码会到这个分支,需要为解码器设置缓冲区.
  106 +// * 解码器缓冲区支持3种模式。参考【图像内存分配以及交互模式】Rockchip_Developer_Guide_MPP_CN.pdf
  107 +// * 这里使用纯内部模式。
  108 +// */
  109 +// ret = mpi->control(ctx, MPP_DEC_SET_INFO_CHANGE_READY, NULL);
  110 +// if (ret) {
  111 +// printf("mpp_frame_get_info_change mpi->control error"
  112 +// "MPP_DEC_SET_INFO_CHANGE_READY %d\n", ret);
  113 +// }
  114 +// return;
  115 +// }
  116 +
  117 +// RK_U32 err_info = mpp_frame_get_errinfo(frame);
  118 +// RK_U32 discard = mpp_frame_get_discard(frame);
  119 +// printf("err_info: %u discard: %u\n", err_info, discard);
  120 +
  121 +// if (err_info) {
  122 +// return;
  123 +// }
124 124
125 - // save  
126 - dump_frame(frame, out_fp);  
127 - return;  
128 -} 125 +// // save
  126 +// dump_frame(frame, out_fp);
  127 +// return;
  128 +// }
129 129
130 130
131 //rtk解码器初始化 131 //rtk解码器初始化
@@ -298,8 +298,10 @@ T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFram @@ -298,8 +298,10 @@ T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFram
298 } 298 }
299 299
300 //输出的码流格式 300 //输出的码流格式
301 - param = &out_format;  
302 - ret = DecConfigInput->mpi->control(DecConfigInput->ctx, MPP_DEC_SET_OUTPUT_FORMAT, param); 301 + //param = &out_format;
  302 + //也不知道为什么只能设420sp没法设420p
  303 + MppFrameFormat format = out_format;
  304 + ret = DecConfigInput->mpi->control(DecConfigInput->ctx, MPP_DEC_SET_OUTPUT_FORMAT, &format);
303 if (ret == MPP_OK) 305 if (ret == MPP_OK)
304 { 306 {
305 printf("输出格式正确\n"); 307 printf("输出格式正确\n");
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 3
4 #include "version_choose.h" 4 #include "version_choose.h"
5 5
6 -#if RTK_MPP_STATUS == VERSION_SWITCH_ON 6 +#ifdef RTK_MPP_STATUS_ON
7 7
8 #include "rockchip/rk_type.h" 8 #include "rockchip/rk_type.h"
9 #include "rockchip/mpp_frame.h" 9 #include "rockchip/mpp_frame.h"
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 #include "JZsdkLib.h" 5 #include "JZsdkLib.h"
6 #include "./RTK_mmp_enc.h" 6 #include "./RTK_mmp_enc.h"
7 7
8 -#if RTK_MPP_STATUS == VERSION_SWITCH_ON 8 +#ifdef RTK_MPP_STATUS_ON
9 #include "rockchip/mpp_packet.h" 9 #include "rockchip/mpp_packet.h"
10 #include "rockchip/rk_mpi.h" 10 #include "rockchip/rk_mpi.h"
11 #include "rockchip/mpp_env.h" //这个.h能在mpp的源码中找到 11 #include "rockchip/mpp_env.h" //这个.h能在mpp的源码中找到
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 3
4 #include "version_choose.h" 4 #include "version_choose.h"
5 5
6 -#if RTK_MPP_STATUS == VERSION_SWITCH_ON 6 +#ifdef RTK_MPP_STATUS_ON
7 7
8 #include "rockchip/rk_type.h" 8 #include "rockchip/rk_type.h"
9 #include "rockchip/mpp_frame.h" 9 #include "rockchip/mpp_frame.h"
@@ -58,7 +58,7 @@ void **JZsdk_RtkMmpGetEncHandleAddr(int CameraIndex) @@ -58,7 +58,7 @@ void **JZsdk_RtkMmpGetEncHandleAddr(int CameraIndex)
58 //昆腾相机设置下一帧为I帧 58 //昆腾相机设置下一帧为I帧
59 T_JZsdkReturnCode JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(int CameraIndex) 59 T_JZsdkReturnCode JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(int CameraIndex)
60 { 60 {
61 -#if RTK_MPP_STATUS == VERSION_SWITCH_ON 61 +#ifdef RTK_MPP_STATUS_ON
62 if (CameraIndex == 0) 62 if (CameraIndex == 0)
63 { 63 {
64 RTK_mmp_enc_SetNextFrame_IDR(JZsdk_RtkMmpGetEncHandleAddr(0)); 64 RTK_mmp_enc_SetNextFrame_IDR(JZsdk_RtkMmpGetEncHandleAddr(0));
  1 +
  2 +#include <stdint.h>
  3 +#include <stdlib.h>
  4 +#include <stdio.h>
  5 +#include <string.h>
  6 +
  7 +#include "BaseConfig.h"
  8 +#include "JZsdkLib.h"
  9 +
  10 +#include "./RK_Rga.h"
  11 +#include "MediaProc/RgaProc/RgaParam.h"
  12 +
  13 +#ifdef RTK_RGA_STATUS_ON
  14 +
  15 +float get_bpp_from_format(int format)
  16 +{
  17 + float bpp = 0;
  18 +
  19 + switch (format)
  20 + {
  21 + case RK_FORMAT_RGBA2BPP:
  22 + return 0.25;
  23 + case RK_FORMAT_Y4:
  24 + bpp = 0.5;
  25 + break;
  26 + case RK_FORMAT_BPP1:
  27 + case RK_FORMAT_BPP2:
  28 + case RK_FORMAT_BPP4:
  29 + case RK_FORMAT_BPP8:
  30 + case RK_FORMAT_YCbCr_400:
  31 + bpp = 1;
  32 + break;
  33 + case RK_FORMAT_YCbCr_420_SP:
  34 + case RK_FORMAT_YCbCr_420_P:
  35 + case RK_FORMAT_YCrCb_420_P:
  36 + case RK_FORMAT_YCrCb_420_SP:
  37 + bpp = 1.5;
  38 + break;
  39 + case RK_FORMAT_RGB_565:
  40 + case RK_FORMAT_RGBA_5551:
  41 + case RK_FORMAT_RGBA_4444:
  42 + case RK_FORMAT_BGR_565:
  43 + case RK_FORMAT_BGRA_5551:
  44 + case RK_FORMAT_BGRA_4444:
  45 + case RK_FORMAT_ARGB_5551:
  46 + case RK_FORMAT_ARGB_4444:
  47 + case RK_FORMAT_ABGR_5551:
  48 + case RK_FORMAT_ABGR_4444:
  49 + case RK_FORMAT_YCbCr_422_SP:
  50 + case RK_FORMAT_YCbCr_422_P:
  51 + case RK_FORMAT_YCrCb_422_SP:
  52 + case RK_FORMAT_YCrCb_422_P:
  53 + /* yuyv */
  54 + case RK_FORMAT_YVYU_422:
  55 + case RK_FORMAT_VYUY_422:
  56 + case RK_FORMAT_YUYV_422:
  57 + case RK_FORMAT_UYVY_422:
  58 + case RK_FORMAT_YVYU_420:
  59 + case RK_FORMAT_VYUY_420:
  60 + case RK_FORMAT_YUYV_420:
  61 + case RK_FORMAT_UYVY_420:
  62 + bpp = 2;
  63 + break;
  64 + /*RK encoder requires alignment of odd multiples of 256.*/
  65 + /*Here bpp=2 guarantee to read complete data.*/
  66 + case RK_FORMAT_YCbCr_420_SP_10B:
  67 + case RK_FORMAT_YCrCb_420_SP_10B:
  68 + bpp = 2;
  69 + break;
  70 + case RK_FORMAT_YCbCr_422_10b_SP:
  71 + case RK_FORMAT_YCrCb_422_10b_SP:
  72 + bpp = 2.5;
  73 + break;
  74 + case RK_FORMAT_BGR_888:
  75 + case RK_FORMAT_RGB_888:
  76 + bpp = 3;
  77 + break;
  78 + case RK_FORMAT_RGBA_8888:
  79 + case RK_FORMAT_RGBX_8888:
  80 + case RK_FORMAT_BGRA_8888:
  81 + case RK_FORMAT_BGRX_8888:
  82 + case RK_FORMAT_ARGB_8888:
  83 + case RK_FORMAT_XRGB_8888:
  84 + case RK_FORMAT_ABGR_8888:
  85 + case RK_FORMAT_XBGR_8888:
  86 + bpp = 4;
  87 + break;
  88 + default:
  89 + printf("Is unsupport format now, please fix \n");
  90 + return 0;
  91 + }
  92 +
  93 + return bpp;
  94 +}
  95 +
  96 +T_JZsdkReturnCode RK_Rga_ImageInit(struct RK_RgaImage **RgaImage, int width, int height, int format,
  97 + int Rect_x, int Rect_y, int Rect_w, int Rect_h)
  98 +{
  99 + if ((*RgaImage) != NULL)
  100 + {
  101 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  102 + }
  103 +
  104 + (*RgaImage) = (struct RK_RgaImage *)malloc(sizeof(struct RK_RgaImage));
  105 + if ((*RgaImage) == NULL)
  106 + {
  107 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  108 + }
  109 +
  110 + (*RgaImage)->width = width;
  111 + (*RgaImage)->height = height;
  112 + (*RgaImage)->format = format;
  113 +
  114 +
  115 + (*RgaImage)->buf_size = width * height * get_bpp_from_format(format);
  116 + (*RgaImage)->buf = (unsigned char *)malloc((*RgaImage)->buf_size * sizeof(unsigned char));
  117 + if ((*RgaImage)->buf == NULL)
  118 + {
  119 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  120 + }
  121 +
  122 + (*RgaImage)->handle_param.width = width;
  123 + (*RgaImage)->handle_param.height = height;
  124 + (*RgaImage)->handle_param.format = format;
  125 +
  126 + (*RgaImage)->handle = importbuffer_virtualaddr((*RgaImage)->buf, &(*RgaImage)->handle_param);
  127 + if ((*RgaImage)->handle == 0)
  128 + {
  129 + printf("importbuffer_virtualaddr failed\n");
  130 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  131 + }
  132 +
  133 + memset(&(*RgaImage)->img, 0, sizeof((*RgaImage)->img));
  134 + (*RgaImage)->img = wrapbuffer_handle((*RgaImage)->handle, (*RgaImage)->width, (*RgaImage)->height, (*RgaImage)->format);
  135 +
  136 + (*RgaImage)->rect.x = Rect_x;
  137 + (*RgaImage)->rect.y = Rect_y;
  138 + (*RgaImage)->rect.width = Rect_w;
  139 + (*RgaImage)->rect.height = Rect_h;
  140 +
  141 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  142 +}
  143 +
  144 +T_JZsdkReturnCode RK_Rga_ImageDeInit(struct RK_RgaImage **RgaImage)
  145 +{
  146 + if ((*RgaImage)->handle != 0)
  147 + {
  148 + releasebuffer_handle((*RgaImage)->handle);
  149 + (*RgaImage)->handle = 0;
  150 + }
  151 +
  152 + if ((*RgaImage)->buf != NULL)
  153 + {
  154 + free((*RgaImage)->buf);
  155 + (*RgaImage)->buf = NULL;
  156 + }
  157 +
  158 + if((*RgaImage) != NULL)
  159 + {
  160 + free((*RgaImage));
  161 + (*RgaImage) = NULL;
  162 + }
  163 +
  164 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  165 +}
  166 +
  167 +#endif
  1 +#ifndef RK_RGA_H
  2 +#define RK_RGA_H
  3 +
  4 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  5 +#include "BaseConfig.h"
  6 +
  7 +#ifdef RTK_RGA_STATUS_ON
  8 +
  9 +#include "rga.h"
  10 +#include "RgaUtils.h"
  11 +#include "im2d.hpp"
  12 +#include "im2d_type.h"
  13 +
  14 +typedef struct RK_RgaImage
  15 +{
  16 + int width; //图像的宽度
  17 + int height; //图像的高度
  18 + int format; //图像的格式
  19 + unsigned char *buf; //图像的缓冲区
  20 + int buf_size; //图像缓冲区的大小
  21 +
  22 + rga_buffer_t img; //图像处理区
  23 + rga_buffer_handle_t handle; //图像处理区句柄
  24 + im_handle_param_t handle_param; //图像处理区参数
  25 +
  26 + im_rect rect; //处理的区域
  27 +}RK_RgaImage;
  28 +
  29 +
  30 +T_JZsdkReturnCode RK_Rga_ImageInit(struct RK_RgaImage **RgaImage, int width, int height, int format,
  31 + int Rect_x, int Rect_y, int Rect_w, int Rect_h);
  32 +
  33 +T_JZsdkReturnCode RK_Rga_ImageDeInit(struct RK_RgaImage **RgaImage);
  34 +
  35 +#endif
  36 +
  37 +#endif
  1 +#ifndef RGA_PARAM_H
  2 +#define RGA_PARAM_H
  3 +
  4 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  5 +#include "BaseConfig.h"
  6 +
  7 +typedef enum RGA_PARAM_PROCESSING_TYPE
  8 +{
  9 + RGA_NO_PROCESSING = 0x0000, //无处理类型
  10 + RGA_CROP = 0x0001, //裁剪类型
  11 + RGA_RESIZE = 0x0002, //缩放类型
  12 +
  13 +}RGA_PARAM_PROCESSING_TYPE;
  14 +
  15 +#endif
@@ -764,7 +764,7 @@ T_JZsdkReturnCode Megaphone_RealTimeMP2_trans(unsigned char *getdata, int len) @@ -764,7 +764,7 @@ T_JZsdkReturnCode Megaphone_RealTimeMP2_trans(unsigned char *getdata, int len)
764 * 764 *
765 **********/ 765 **********/
766 T_JZsdkReturnCode Megaphone_RealTimeMP2_stop() 766 T_JZsdkReturnCode Megaphone_RealTimeMP2_stop()
767 -{ 767 +{
768 //关闭MP2实时喊话 768 //关闭MP2实时喊话
769 T_JZsdkReturnCode ret = RealTimeMP2_Close(); 769 T_JZsdkReturnCode ret = RealTimeMP2_Close();
770 if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 770 if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
@@ -96,6 +96,8 @@ T_JZsdkReturnCode RealTimeMP2_start() @@ -96,6 +96,8 @@ T_JZsdkReturnCode RealTimeMP2_start()
96 return ret; 96 return ret;
97 } 97 }
98 98
  99 + JZSDK_LOG_INFO("MP2实时喊话初始化成功");
  100 +
99 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 101 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
100 } 102 }
101 103
@@ -130,6 +132,9 @@ T_JZsdkReturnCode RealTimeMP2_Close() @@ -130,6 +132,9 @@ T_JZsdkReturnCode RealTimeMP2_Close()
130 int amplifier = JZ_FLAGCODE_OFF; 132 int amplifier = JZ_FLAGCODE_OFF;
131 Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier); 133 Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);
132 134
  135 + //关闭音频库
  136 + AudioDeal_StopDeal();
  137 +
133 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 138 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
134 } 139 }
135 140
@@ -164,9 +169,14 @@ static T_JZsdkReturnCode RealTimeMP2_Play_init() @@ -164,9 +169,14 @@ static T_JZsdkReturnCode RealTimeMP2_Play_init()
164 //解码并播放 169 //解码并播放
165 static T_JZsdkReturnCode RealTimeMP2_PlayData(unsigned char *data,int len) 170 static T_JZsdkReturnCode RealTimeMP2_PlayData(unsigned char *data,int len)
166 { 171 {
167 - AudioDeal_Mp3DataInput(8000, data, len); 172 + unsigned char playFile[len];
  173 +
  174 + //清空
  175 + memset(playFile, 0, len);
  176 +
  177 + memcpy(playFile, data, len);
168 178
169 - printf("播放结束\n"); 179 + AudioDeal_Mp3DataInput(8000, playFile, len);
170 180
171 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 181 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
172 } 182 }
@@ -196,7 +206,7 @@ static void *RealTimeMP2_LoopPlay(void *arg) @@ -196,7 +206,7 @@ static void *RealTimeMP2_LoopPlay(void *arg)
196 { 206 {
197 if(RealTimeMP2_PlayData_LoopHead!=RealTimeMP2_PlayData_LoopEnd) 207 if(RealTimeMP2_PlayData_LoopHead!=RealTimeMP2_PlayData_LoopEnd)
198 { 208 {
199 - printf("播放线程执行中\n"); 209 + //printf("播放线程执行中\n");
200 210
201 ret = RealTimeMP2_PlayData(RealTimeMP2_PlayData_Loop[RealTimeMP2_PlayData_LoopHead],128); 211 ret = RealTimeMP2_PlayData(RealTimeMP2_PlayData_Loop[RealTimeMP2_PlayData_LoopHead],128);
202 RealTimeMP2_PlayData_LoopHead++; 212 RealTimeMP2_PlayData_LoopHead++;
@@ -274,7 +284,7 @@ static void *RealTimeMP2_WriteData_Task(void *arg) @@ -274,7 +284,7 @@ static void *RealTimeMP2_WriteData_Task(void *arg)
274 { 284 {
275 285
276 int ret; 286 int ret;
277 - printf("MP2实施喊话,输入数据缓冲线程建立\n"); 287 + JZSDK_LOG_DEBUG("MP2实施喊话,输入数据缓冲线程建立");
278 RealTimeMP2_WriteFlag = JZ_FLAGCODE_ON; 288 RealTimeMP2_WriteFlag = JZ_FLAGCODE_ON;
279 289
280 while(RealTimeMP2_WriteFlag == JZ_FLAGCODE_ON) 290 while(RealTimeMP2_WriteFlag == JZ_FLAGCODE_ON)
@@ -284,7 +294,7 @@ static void *RealTimeMP2_WriteData_Task(void *arg) @@ -284,7 +294,7 @@ static void *RealTimeMP2_WriteData_Task(void *arg)
284 294
285 if(RealTimeMP2_WriteData_LoopHead!=RealTimeMP2_WriteData_LoopEnd) 295 if(RealTimeMP2_WriteData_LoopHead!=RealTimeMP2_WriteData_LoopEnd)
286 { 296 {
287 - printf("缓冲线程写入中\n"); 297 + //printf("缓冲线程写入中\n");
288 298
289 //将输入缓冲池的数据放入播放缓冲池 299 //将输入缓冲池的数据放入播放缓冲池
290 RealTimeMP2_Put_WriteData_In_PlayLoop(); 300 RealTimeMP2_Put_WriteData_In_PlayLoop();
@@ -173,11 +173,15 @@ static T_JZsdkReturnCode Opus_RealTimeVoice_PlayData(unsigned char *data,int len @@ -173,11 +173,15 @@ static T_JZsdkReturnCode Opus_RealTimeVoice_PlayData(unsigned char *data,int len
173 //转换 173 //转换
174 opus_int16 TempPcm[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS]; 174 opus_int16 TempPcm[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS];
175 175
  176 +
  177 +
176 for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++) 178 for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++)
177 { 179 {
178 TempPcm[i] = out[i] & 0xFF | (out[i] >> 8) << 8; 180 TempPcm[i] = out[i] & 0xFF | (out[i] >> 8) << 8;
179 - TempPcm[i] = PcmNoiseReduction(TempPcm[i]);  
180 181
  182 +#if SPECIAL_VERSION == SPECIAL_DAOTONG
  183 + TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
  184 +#endif
181 pcm_bytes[2 * i] = TempPcm[i] & 0xFF; 185 pcm_bytes[2 * i] = TempPcm[i] & 0xFF;
182 pcm_bytes[2 * i + 1] = (TempPcm[i] >> 8) & 0xFF; 186 pcm_bytes[2 * i + 1] = (TempPcm[i] >> 8) & 0xFF;
183 } 187 }
@@ -543,11 +547,15 @@ T_JZsdkReturnCode Opus_RealTimeVoice_Close() @@ -543,11 +547,15 @@ T_JZsdkReturnCode Opus_RealTimeVoice_Close()
543 547
544 JZSDK_LOG_DEBUG("解码器释放完毕"); 548 JZSDK_LOG_DEBUG("解码器释放完毕");
545 549
  550 + //产生标志位
546 Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF); 551 Megaphone_MegDataGenFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
547 Megaphone_MegDataGenFinshFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF); 552 Megaphone_MegDataGenFinshFlag(JZ_FLAGCODE_SET, JZ_FLAGCODE_OFF);
548 553
549 int amplifier = JZ_FLAGCODE_OFF; 554 int amplifier = JZ_FLAGCODE_OFF;
550 Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier); 555 Megaphone_Amplifier_param(JZ_FLAGCODE_SET, &amplifier);
551 556
  557 + //关闭音频库
  558 + AudioDeal_StopDeal();
  559 +
552 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 560 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
553 } 561 }
@@ -230,6 +230,7 @@ static T_JZsdkReturnCode UI_control_WidgetSet(int type, int value) @@ -230,6 +230,7 @@ static T_JZsdkReturnCode UI_control_WidgetSet(int type, int value)
230 case JZSDK_WIDGET_SPC_AUTO_TIME: 230 case JZSDK_WIDGET_SPC_AUTO_TIME:
231 case JZSDK_WIDGET_TPC_MODE: 231 case JZSDK_WIDGET_TPC_MODE:
232 case JZSDK_WIDGET_BAD_PIXEL_CORRECT_MODE: 232 case JZSDK_WIDGET_BAD_PIXEL_CORRECT_MODE:
  233 + case JZSDK_WIDGET_ZOOM_SIZE:
233 UI_control_WidgetArraySet(index, value); 234 UI_control_WidgetArraySet(index, value);
234 break; 235 break;
235 236
@@ -1329,6 +1330,24 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_PixelColorMode(int wheather_ChangeWidget, @@ -1329,6 +1330,24 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_PixelColorMode(int wheather_ChangeWidget,
1329 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 1330 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
1330 } 1331 }
1331 1332
  1333 +// psdk 变焦
  1334 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_ZoomSize(int wheather_ChangeWidget, int wheather_control, int value)
  1335 +{
  1336 + //如果修改控件
  1337 + if (wheather_ChangeWidget == JZ_FLAGCODE_ON)
  1338 + {
  1339 + UI_control_WidgetSet(JZSDK_WIDGET_ZOOM_SIZE, value);
  1340 + }
  1341 +
  1342 + //如果进行控制
  1343 + if (wheather_control == JZ_FLAGCODE_ON)
  1344 + {
  1345 + UIcontrol_Set_ZoomSize(DEVICE_PSDK, value);
  1346 + }
  1347 +
  1348 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  1349 +}
  1350 +
1332 // psdk 气体增强颜色 1351 // psdk 气体增强颜色
1333 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_GasEnhancementColor(int wheather_ChangeWidget, int wheather_control, int value) 1352 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_GasEnhancementColor(int wheather_ChangeWidget, int wheather_control, int value)
1334 { 1353 {
@@ -147,6 +147,8 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_ShutterSwitch(int wheather_ChangeWidget, @@ -147,6 +147,8 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_ShutterSwitch(int wheather_ChangeWidget,
147 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_PseudoColor(int wheather_ChangeWidget, int wheather_control, int value); 147 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_PseudoColor(int wheather_ChangeWidget, int wheather_control, int value);
148 // psdk 像素色彩模式 148 // psdk 像素色彩模式
149 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_PixelColorMode(int wheather_ChangeWidget, int wheather_control, int value); 149 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_PixelColorMode(int wheather_ChangeWidget, int wheather_control, int value);
  150 +T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_ZoomSize(int wheather_ChangeWidget, int wheather_control, int value);
  151 +
150 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Camera_BadPixelSwitch(int wheather_ChangeWidget, int wheather_control, int value); 152 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Camera_BadPixelSwitch(int wheather_ChangeWidget, int wheather_control, int value);
151 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Camera_SPC_ResetSwitch(int wheather_ChangeWidget, int wheather_control, int value); 153 T_JZsdkReturnCode JZsdk_Psdk_UI_io_Camera_SPC_ResetSwitch(int wheather_ChangeWidget, int wheather_control, int value);
152 154
@@ -1957,6 +1957,30 @@ T_JZsdkReturnCode UIcontrol_Set_PixelColorMode(int DeviceName, int value) @@ -1957,6 +1957,30 @@ T_JZsdkReturnCode UIcontrol_Set_PixelColorMode(int DeviceName, int value)
1957 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 1957 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
1958 } 1958 }
1959 1959
  1960 +/*********************
  1961 + *
  1962 + * 设置变焦尺寸
  1963 + *
  1964 + *
  1965 + * **************************/
  1966 +T_JZsdkReturnCode UIcontrol_Set_ZoomSize(int DeviceName, int value)
  1967 +{
  1968 + T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  1969 +#if MEDIA_PROC_CONFIG_STATUS == VERSION_SWITCH_ON
  1970 +
  1971 + //1、设置变焦值
  1972 + ret = Camera_param(JZ_FLAGCODE_SET, CAMERA_RESIZE, &value);
  1973 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  1974 + {
  1975 + return ret;
  1976 + }
  1977 +
  1978 + //无须另外通知其他设备变化
  1979 +
  1980 +#endif
  1981 + return ret;
  1982 +}
  1983 +
1960 /********* 1984 /*********
1961 * 1985 *
1962 * 气体增强的颜色 1986 * 气体增强的颜色
@@ -109,6 +109,8 @@ T_JZsdkReturnCode UIcontrol_Camera_BadPixelSwitch(int DeviceName, int value); @@ -109,6 +109,8 @@ T_JZsdkReturnCode UIcontrol_Camera_BadPixelSwitch(int DeviceName, int value);
109 T_JZsdkReturnCode UIcontrol_Camera_SPC_ResetSwitch(int DeviceName, int value); 109 T_JZsdkReturnCode UIcontrol_Camera_SPC_ResetSwitch(int DeviceName, int value);
110 T_JZsdkReturnCode UIcontrol_FreezeVideo(int DeviceName, int value); 110 T_JZsdkReturnCode UIcontrol_FreezeVideo(int DeviceName, int value);
111 T_JZsdkReturnCode UIcontrol_Set_PseudoColor(int DeviceName, int value); 111 T_JZsdkReturnCode UIcontrol_Set_PseudoColor(int DeviceName, int value);
  112 +T_JZsdkReturnCode UIcontrol_Set_ZoomSize(int DeviceName, int value);
  113 +
112 T_JZsdkReturnCode UIcontrol_Set_PixelColorMode(int DeviceName, int value); 114 T_JZsdkReturnCode UIcontrol_Set_PixelColorMode(int DeviceName, int value);
113 T_JZsdkReturnCode UIcontrol_CameraRegionbox(int DeviceName, int value1, int value2); 115 T_JZsdkReturnCode UIcontrol_CameraRegionbox(int DeviceName, int value1, int value2);
114 T_JZsdkReturnCode UIcontrol_CameraCorrectionMode(int DeviceName, int value); 116 T_JZsdkReturnCode UIcontrol_CameraCorrectionMode(int DeviceName, int value);
@@ -69,8 +69,8 @@ static int WidgetMgMT_Control_WorkFuntion(int Inscode, int value) @@ -69,8 +69,8 @@ static int WidgetMgMT_Control_WorkFuntion(int Inscode, int value)
69 JZsdk_Psdk_UI_io_Set_PixelColorMode(JZ_FLAGCODE_ON, JZ_FLAGCODE_ON, value); 69 JZsdk_Psdk_UI_io_Set_PixelColorMode(JZ_FLAGCODE_ON, JZ_FLAGCODE_ON, value);
70 break; 70 break;
71 71
72 - case JZSDK_WIDGET_FOCAL_LENGTH:  
73 - printf("未设置"); 72 + case JZSDK_WIDGET_ZOOM_SIZE:
  73 + JZsdk_Psdk_UI_io_Set_ZoomSize(JZ_FLAGCODE_ON, JZ_FLAGCODE_ON, value);
74 break; 74 break;
75 75
76 case JZSDK_WIDGET_SPC_RESET: 76 case JZSDK_WIDGET_SPC_RESET:
@@ -66,7 +66,7 @@ static T_JZsdkReturnCode JZSDK_WidgetMgMT_DJI_GetWidgetIndex(int tpye, int *inde @@ -66,7 +66,7 @@ static T_JZsdkReturnCode JZSDK_WidgetMgMT_DJI_GetWidgetIndex(int tpye, int *inde
66 } 66 }
67 break; 67 break;
68 68
69 - case JZSDK_WIDGET_FOCAL_LENGTH: 69 + case JZSDK_WIDGET_ZOOM_SIZE:
70 { 70 {
71 ReturnIndex1 = 5; 71 ReturnIndex1 = 5;
72 } 72 }
@@ -35,7 +35,7 @@ @@ -35,7 +35,7 @@
35 #include "gimbal_emu/test_payload_gimbal_emu.h" 35 #include "gimbal_emu/test_payload_gimbal_emu.h"
36 36
37 #include "Psdk_UI_io.h" 37 #include "Psdk_UI_io.h"
38 - 38 +#include "BaseConfig.h"
39 39
40 /* Private constants ---------------------------------------------------------*/ 40 /* Private constants ---------------------------------------------------------*/
41 #define PAYLOAD_CAMERA_EMU_TASK_FREQ (100) 41 #define PAYLOAD_CAMERA_EMU_TASK_FREQ (100)
@@ -50,8 +50,8 @@ @@ -50,8 +50,8 @@
50 #define ZOOM_DIGITAL_BASE_FACTOR (1.0) 50 #define ZOOM_DIGITAL_BASE_FACTOR (1.0)
51 #define ZOOM_DIGITAL_STEP_FACTOR (0.1) 51 #define ZOOM_DIGITAL_STEP_FACTOR (0.1)
52 #define ZOOM_DIGITAL_MAX_FACTOR (6.0) 52 #define ZOOM_DIGITAL_MAX_FACTOR (6.0)
53 -#define FOCUS_MAX_RINGVALUE (1000)  
54 -#define FOCUS_MID_RINGVALUE (500) 53 +#define FOCUS_MAX_RINGVALUE (3) //0~3
  54 +#define FOCUS_MID_RINGVALUE (0)
55 #define IMAGE_SENSOR_X_SIZE (88.0f) // unit: 0.1mm 55 #define IMAGE_SENSOR_X_SIZE (88.0f) // unit: 0.1mm
56 #define IMAGE_SENSOR_Y_SIZE (66.0f) // unit: 0.1mm 56 #define IMAGE_SENSOR_Y_SIZE (66.0f) // unit: 0.1mm
57 #define CENTER_POINT_IN_SCREEN_X_VALUE (0.5f) 57 #define CENTER_POINT_IN_SCREEN_X_VALUE (0.5f)
@@ -653,9 +653,13 @@ static T_DjiReturnCode GetFocusAssistantSettings(T_DjiCameraFocusAssistantSettin @@ -653,9 +653,13 @@ static T_DjiReturnCode GetFocusAssistantSettings(T_DjiCameraFocusAssistantSettin
653 return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 653 return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
654 } 654 }
655 655
  656 +//设置对焦值
656 static T_DjiReturnCode SetFocusRingValue(uint32_t value) 657 static T_DjiReturnCode SetFocusRingValue(uint32_t value)
657 { 658 {
658 USER_LOG_INFO("set focus ring value:%d", value); 659 USER_LOG_INFO("set focus ring value:%d", value);
  660 +
  661 + //有x1~x16
  662 + UIcontrol_Set_ZoomSize(DEVICE_PSDK, value);
659 s_cameraFocusRingValue = value; 663 s_cameraFocusRingValue = value;
660 664
661 return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 665 return DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
@@ -69,6 +69,8 @@ extern int height_Volume_lock; @@ -69,6 +69,8 @@ extern int height_Volume_lock;
69 extern int SpeakerWidgetUseLock; 69 extern int SpeakerWidgetUseLock;
70 extern char Jz_SerialNumber[128]; //设备序列号 70 extern char Jz_SerialNumber[128]; //设备序列号
71 extern float g_height_value; 71 extern float g_height_value;
  72 +extern int Widget_RealTimeOpusFlag; //用于标志ui里的实时语音开关
  73 +
72 74
73 /* Private types -------------------------------------------------------------*/ 75 /* Private types -------------------------------------------------------------*/
74 76
@@ -253,7 +255,10 @@ T_DjiReturnCode DjiTest_WidgetStartService(void) @@ -253,7 +255,10 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
253 if (JZsdk_check_file_exists("/root/ShakedownTest") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 255 if (JZsdk_check_file_exists("/root/ShakedownTest") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
254 { 256 {
255 JZSDK_LOG_INFO("开启调试模式"); 257 JZSDK_LOG_INFO("开启调试模式");
256 - JZsdk_delete_file("/root/ShakedownTest"); 258 + if(JZsdk_delete_file("/root/ShakedownTest") != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  259 + {
  260 + JZSDK_LOG_ERROR("关闭调试模式失败");
  261 + }
257 memset(curFileDirPath, 0, WIDGET_DIR_PATH_LEN_MAX); 262 memset(curFileDirPath, 0, WIDGET_DIR_PATH_LEN_MAX);
258 snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/debug",WIDGET_FILE_DIR); 263 snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/debug",WIDGET_FILE_DIR);
259 } 264 }
@@ -556,12 +561,15 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value) @@ -556,12 +561,15 @@ static T_JZsdkReturnCode Megphone_Widget(unsigned int index, unsigned int value)
556 561
557 switch(value){ 562 switch(value){
558 case 0: 563 case 0:
  564 + Widget_RealTimeOpusFlag = JZ_FLAGCODE_OFF;
559 Opus_PlayMode = 0; 565 Opus_PlayMode = 0;
560 break; 566 break;
561 case 1: 567 case 1:
  568 + Widget_RealTimeOpusFlag = JZ_FLAGCODE_ON;
562 Opus_PlayMode = 1; 569 Opus_PlayMode = 1;
563 break; 570 break;
564 default: 571 default:
  572 + Widget_RealTimeOpusFlag = JZ_FLAGCODE_OFF;
565 Opus_PlayMode = 0; 573 Opus_PlayMode = 0;
566 break; 574 break;
567 } 575 }
@@ -806,20 +814,21 @@ static T_JZsdkReturnCode Irc_Widget(unsigned int index, unsigned int value) @@ -806,20 +814,21 @@ static T_JZsdkReturnCode Irc_Widget(unsigned int index, unsigned int value)
806 break; 814 break;
807 } 815 }
808 816
  817 + //该功能移动到media管理中
809 case 5://画面放大 818 case 5://画面放大
810 { 819 {
811 - if (value == 1)  
812 - {  
813 - EnlargeScreen+=1;  
814 - if (EnlargeScreen >= 5)  
815 - {  
816 - EnlargeScreen = JZ_FLAGCODE_OFF;  
817 - } 820 + // if (value == 1)
  821 + // {
  822 + // EnlargeScreen+=1;
  823 + // if (EnlargeScreen >= 4)
  824 + // {
  825 + // EnlargeScreen = JZ_FLAGCODE_OFF;
  826 + // }
818 827
819 - JZSDK_LOG_DEBUG("画面放大%d",EnlargeScreen); 828 + // JZSDK_LOG_DEBUG("画面变焦%d",EnlargeScreen);
820 829
821 - //JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_FOCAL_LENGTH, value);  
822 - } 830 + // JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_ZOOM_SIZE, value);
  831 + // }
823 832
824 break; 833 break;
825 } 834 }