作者 潘浩彬

合并分支 'dev' 到 'master'

Dev



查看合并请求 !9
正在显示 49 个修改的文件 包含 870 行增加392 行删除
@@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
3 ThirdParty 3 ThirdParty
4 ModuleLib 4 ModuleLib
5 备份 5 备份
6 - 6 +linux_kernel
7 7
8 project_build/AUTEL_道通PSDK 8 project_build/AUTEL_道通PSDK
9 project_build/GDU_普宙PSDK 9 project_build/GDU_普宙PSDK
@@ -40,7 +40,9 @@ @@ -40,7 +40,9 @@
40 "paramterparsing.h": "c", 40 "paramterparsing.h": "c",
41 "megtempcontrol.h": "c", 41 "megtempcontrol.h": "c",
42 "jzsdk_uart_send.h": "c", 42 "jzsdk_uart_send.h": "c",
43 - "espeak_tts.h": "c" 43 + "espeak_tts.h": "c",
  44 + "buffersrc.h": "c",
  45 + "audiodeal.h": "c"
44 }, 46 },
45 "Codegeex.GenerationPreference": "automatic" 47 "Codegeex.GenerationPreference": "automatic"
46 } 48 }
1 # 编译链的配置 1 # 编译链的配置
2 2
3 #1、编译链与设备类型的选择 3 #1、编译链与设备类型的选择
4 -set(DEVICE_NAME JZ_U3S) 4 +set(DEVICE_NAME JZ_C1)
5 #上一行为禁止修改行 5 #上一行为禁止修改行
6 6
7 if("${DEVICE_NAME}" STREQUAL "JZ_H1E") 7 if("${DEVICE_NAME}" STREQUAL "JZ_H1E")
@@ -31,6 +31,9 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3S") @@ -31,6 +31,9 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3S")
31 elseif("${DEVICE_NAME}" STREQUAL "JZ_U3D") 31 elseif("${DEVICE_NAME}" STREQUAL "JZ_U3D")
32 set(MAKE_COMPILER ARM_CORTEXA9_LINUX) 32 set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
33 set(DEVICE_TYPE MEGAPHONE) 33 set(DEVICE_TYPE MEGAPHONE)
  34 +elseif("${DEVICE_NAME}" STREQUAL "JZ_U30")
  35 + set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
  36 + set(DEVICE_TYPE MEGAPHONE)
34 elseif("${DEVICE_NAME}" STREQUAL "TF_A1") 37 elseif("${DEVICE_NAME}" STREQUAL "TF_A1")
35 set(MAKE_COMPILER ARM_CORTEXA9_LINUX) 38 set(MAKE_COMPILER ARM_CORTEXA9_LINUX)
36 set(DEVICE_TYPE MEGAPHONE) 39 set(DEVICE_TYPE MEGAPHONE)
@@ -146,6 +146,29 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3D") @@ -146,6 +146,29 @@ elseif("${DEVICE_NAME}" STREQUAL "JZ_U3D")
146 # 添加FFMPEG及其附属模块 146 # 添加FFMPEG及其附属模块
147 set(FFMPEG_MODULE VERSION_SWITCH_ON) 147 set(FFMPEG_MODULE VERSION_SWITCH_ON)
148 148
  149 +elseif("${DEVICE_NAME}" STREQUAL "JZ_U30")
  150 +
  151 + # 添加AudioDeal 音频处理模块
  152 + set(AUDIODEAL_MODULE VERSION_SWITCH_ON)
  153 +
  154 + # 添加Gimbal 云台处理模块
  155 + set(GIMBAL_MODULE VERSION_SWITCH_ON)
  156 +
  157 + # 添加IRCUT 引脚处理模块
  158 + set(IRCUT_MODULE VERSION_SWITCH_ON)
  159 +
  160 + # 添加LIGHTING 光源处理模块
  161 + set(LIGHTING_MODULE VERSION_SWITCH_ON)
  162 +
  163 + # 添加喊话器模块
  164 + set(MEGAPHONE_MODULE VERSION_SWITCH_ON)
  165 +
  166 + # 添加电源管理模块
  167 + set(POWER_MANAGER_MODULE VERSION_SWITCH_ON)
  168 +
  169 + # 添加FFMPEG及其附属模块
  170 + set(FFMPEG_MODULE VERSION_SWITCH_ON)
  171 +
149 elseif("${DEVICE_NAME}" STREQUAL "JZ_C1") 172 elseif("${DEVICE_NAME}" STREQUAL "JZ_C1")
150 173
151 # 添加Gimbal 云台处理模块 174 # 添加Gimbal 云台处理模块
@@ -290,6 +290,7 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len) @@ -290,6 +290,7 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len)
290 memcpy(str, sendbuf, 12); 290 memcpy(str, sendbuf, 12);
291 *str_len = 12; 291 *str_len = 12;
292 } 292 }
  293 + break;
293 294
294 case JZ_INSCODE_5BFRAME_FILE_DECODE_DEFEAT: 295 case JZ_INSCODE_5BFRAME_FILE_DECODE_DEFEAT:
295 { 296 {
@@ -297,6 +298,7 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len) @@ -297,6 +298,7 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len)
297 memcpy(str, sendbuf, 12); 298 memcpy(str, sendbuf, 12);
298 *str_len = 12; 299 *str_len = 12;
299 } 300 }
  301 + break;
300 302
301 case JZ_INSCODE_5BFRAME_DEFEAT: 303 case JZ_INSCODE_5BFRAME_DEFEAT:
302 { 304 {
@@ -389,15 +391,15 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len) @@ -389,15 +391,15 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len)
389 } 391 }
390 break; 392 break;
391 393
392 - case JZ_INSCODE_5BFRAME_MUSICLIST_STOP: 394 + case JZ_INSCODE_5BFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE:
393 { 395 {
394 - char sendbuf[12] = { 0x5b, 0x5b, 0x77, 0x00, 0x0c, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x23};  
395 - memcpy(str, sendbuf, 12);  
396 - *str_len = 12; 396 + char sendbuf[14] = { 0x5b, 0x5b, 0x77, 0x00, 0x0c, 0x01, 0x00, 0x58, 0x03, 0x00, 0x00, 0x00, 0x00, 0x23};
  397 + memcpy(str, sendbuf, 14);
  398 + *str_len = 14;
397 } 399 }
398 break; 400 break;
399 401
400 - case JZ_INSCODE_5BFRAME_CHECKSTATUS_AUDIO_DETAIL_MESSAGE: 402 + case JZ_INSCODE_5BFRAME_MUSICLIST_STOP:
401 { 403 {
402 char sendbuf[12] = { 0x5b, 0x5b, 0x77, 0x00, 0x0c, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x23}; 404 char sendbuf[12] = { 0x5b, 0x5b, 0x77, 0x00, 0x0c, 0x00, 0x00, 0x58, 0xff, 0x00, 0x00, 0x23};
403 memcpy(str, sendbuf, 12); 405 memcpy(str, sendbuf, 12);
@@ -405,6 +407,8 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len) @@ -405,6 +407,8 @@ int JZsdk_GetFrameTemplate(int InsCode ,char *str, int *str_len)
405 } 407 }
406 break; 408 break;
407 409
  410 + break;
  411 +
408 case JZ_INSCODE_5BFRAME_OPUS_DECODE_STATUS: 412 case JZ_INSCODE_5BFRAME_OPUS_DECODE_STATUS:
409 { 413 {
410 char sendbuf[13] = { 0x5b, 0x5b, 0x77, 0x00, 0x0D, 0x00, 0x00, 0x59, 0xf2, 0x00, 0x00, 0x00, 0x23}; 414 char sendbuf[13] = { 0x5b, 0x5b, 0x77, 0x00, 0x0D, 0x00, 0x00, 0x59, 0xf2, 0x00, 0x00, 0x00, 0x23};
@@ -50,16 +50,16 @@ static T_JZsdkReturnCode JZsdk_Check_Src32(unsigned char *DIR, unsigned char *ch @@ -50,16 +50,16 @@ static T_JZsdkReturnCode JZsdk_Check_Src32(unsigned char *DIR, unsigned char *ch
50 50
51 //3、校验 51 //3、校验
52 //将unsigned char的码值转换成U32_t 52 //将unsigned char的码值转换成U32_t
53 - U32_t CheckSum = 0;  
54 - memcpy(&CheckSum, checksum, checksum_len);  
55 - if (CheckSum != LocalCheckSum) 53 + U32_t SRC_CheckSum = checksum[0] << 24 | checksum[1] << 16 | checksum[2] << 8 | checksum[3];
  54 +
  55 + if (SRC_CheckSum != LocalCheckSum)
56 { 56 {
57 - JZSDK_LOG_ERROR("checksum error\n"); 57 + JZSDK_LOG_ERROR("checksum error local:%x src:%x", LocalCheckSum, SRC_CheckSum);
58 ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 58 ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
59 } 59 }
60 else 60 else
61 { 61 {
62 - JZSDK_LOG_INFO("checksum success\n"); 62 + JZSDK_LOG_INFO("checksum success local:%x src:%x", LocalCheckSum, SRC_CheckSum);
63 ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 63 ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
64 } 64 }
65 65
@@ -75,7 +75,7 @@ T_JZsdkReturnCode Main_M30_all_filter_mode(int *mode) @@ -75,7 +75,7 @@ T_JZsdkReturnCode Main_M30_all_filter_mode(int *mode)
75 if (*mode == JZ_FLAGCODE_ON) 75 if (*mode == JZ_FLAGCODE_ON)
76 { 76 {
77 //先关闭播放 77 //先关闭播放
78 - Megaphone_StopPlay(JZ_FLAGCODE_OFF); 78 + //Megaphone_StopPlay(JZ_FLAGCODE_OFF);
79 79
80 //修改滤波 80 //修改滤波
81 AudioDeal_SetFilterMode(0x01); 81 AudioDeal_SetFilterMode(0x01);
@@ -83,7 +83,7 @@ T_JZsdkReturnCode Main_M30_all_filter_mode(int *mode) @@ -83,7 +83,7 @@ T_JZsdkReturnCode Main_M30_all_filter_mode(int *mode)
83 else 83 else
84 { 84 {
85 //先关闭播放 85 //先关闭播放
86 - Megaphone_StopPlay(JZ_FLAGCODE_OFF); 86 + //Megaphone_StopPlay(JZ_FLAGCODE_OFF);
87 87
88 //修改滤波 88 //修改滤波
89 AudioDeal_SetFilterMode(0x00); 89 AudioDeal_SetFilterMode(0x00);
@@ -322,6 +322,29 @@ T_JZsdkReturnCode Main_APP_Psdk() @@ -322,6 +322,29 @@ T_JZsdkReturnCode Main_APP_Psdk()
322 JZsdk_Uart_Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON); 322 JZsdk_Uart_Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
323 } 323 }
324 324
  325 + else if (DEVICE_VERSION == JZ_U30)
  326 + {
  327 + //串口设备1初始化
  328 + //JZsdk_Uart_Init(UART_DEV_1);
  329 +
  330 + //串口设备2初始化
  331 + JZsdk_Uart_Init(UART_DEV_2);
  332 +
  333 + //喊话器初始化
  334 + Megaphone_Init();
  335 +
  336 + //云台初始化
  337 + Gimbal_Init();
  338 +
  339 + //灯类初始化
  340 + Lighting_Init();
  341 +
  342 + delayMs(1000);
  343 +
  344 + //消息订阅初始化
  345 + JZsdk_Uart_Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
  346 + }
  347 +
325 else if (DEVICE_VERSION == JZ_C1) 348 else if (DEVICE_VERSION == JZ_C1)
326 { 349 {
327 //引脚初始化 350 //引脚初始化
@@ -349,7 +372,7 @@ int Main_APP_Uart() @@ -349,7 +372,7 @@ int Main_APP_Uart()
349 //lib库初始化 372 //lib库初始化
350 JZsdk_LibInit(); 373 JZsdk_LibInit();
351 374
352 - JZSDK_LOG_INFO("%x,UartVersion%x.%x.%x.%x\n",DEVICE_VERSION,MAJOR_VERSION, MINOR_VERSION, MODIFY_VERSION, DEBUG_VERSION); 375 + JZSDK_LOG_INFO("0x%x,UartVersion%x.%x.%x.%x\n",DEVICE_VERSION,MAJOR_VERSION, MINOR_VERSION, MODIFY_VERSION, DEBUG_VERSION);
353 376
354 //引脚初始化 377 //引脚初始化
355 Ircut_Init(); 378 Ircut_Init();
@@ -543,6 +566,28 @@ int Main_APP_Uart() @@ -543,6 +566,28 @@ int Main_APP_Uart()
543 566
544 } 567 }
545 568
  569 + else if (DEVICE_VERSION == JZ_U30)
  570 + {
  571 + //串口设备1初始化
  572 + JZsdk_Uart_Init(UART_DEV_1);
  573 +
  574 + //串口设备2初始化
  575 + JZsdk_Uart_Init(UART_DEV_2);
  576 +
  577 + //喊话器初始化
  578 + Megaphone_Init();
  579 +
  580 + //云台初始化
  581 + Gimbal_Init();
  582 +
  583 + //灯类初始化
  584 + Lighting_Init();
  585 +
  586 + delayMs(1000);
  587 +
  588 + //消息订阅初始化
  589 + JZsdk_Uart_Send_MessageSubcription_Control(UART_DEV_2, JZ_FLAGCODE_ON);
  590 + }
546 591
547 if (DEVICE_VERSION == TF_A1) 592 if (DEVICE_VERSION == TF_A1)
548 { 593 {
@@ -707,7 +752,7 @@ static void *Main_WorkModeTask(void *arg) @@ -707,7 +752,7 @@ static void *Main_WorkModeTask(void *arg)
707 exit(0); 752 exit(0);
708 } 753 }
709 #elif APP_VERSION == APP_PSDK 754 #elif APP_VERSION == APP_PSDK
710 - 755 + JZSDK_LOG_INFO("选择开始psdk播报");
711 #endif 756 #endif
712 757
713 #if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON 758 #if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
@@ -178,6 +178,23 @@ extern "C" { @@ -178,6 +178,23 @@ extern "C" {
178 #define NET_WORK_TARGET_IPADDR NULL 178 #define NET_WORK_TARGET_IPADDR NULL
179 #define NET_WORK_NETMASK NULL 179 #define NET_WORK_NETMASK NULL
180 180
  181 +#elif DEVICE_VERSION == JZ_U30
  182 + #define UART_DEV1_NUM "/dev/ttyS1"
  183 + #define UART_DEV1_BITRATE (115200)
  184 +
  185 + #define UART_DEV2_NUM "/dev/ttyS2"
  186 + #define UART_DEV2_BITRATE (115200)
  187 +
  188 + #define COMM_4G_UART_NUM NULL
  189 + #define COMM_4G_UART_BITRATE (0)
  190 +
  191 + #define GIMBAL_UART_NUM NULL
  192 + #define GIMBAL_UART_BITRATE (0)
  193 +
  194 + #define NET_WORK_IPADDR NULL
  195 + #define NET_WORK_TARGET_IPADDR NULL
  196 + #define NET_WORK_NETMASK NULL
  197 +
181 #elif DEVICE_VERSION == TF_A1 198 #elif DEVICE_VERSION == TF_A1
182 #define UART_DEV1_NUM "/dev/ttyS2" 199 #define UART_DEV1_NUM "/dev/ttyS2"
183 #define UART_DEV1_BITRATE (115200) 200 #define UART_DEV1_BITRATE (115200)
@@ -41,6 +41,7 @@ @@ -41,6 +41,7 @@
41 #define JZ_U3 0x0017 41 #define JZ_U3 0x0017
42 #define JZ_U3S 0x0018 42 #define JZ_U3S 0x0018
43 #define JZ_U3D 0x0019 43 #define JZ_U3D 0x0019
  44 +#define JZ_U30 0x001A
44 45
45 #define JZ_H150S 0x0013 46 #define JZ_H150S 0x0013
46 #define JZ_H150T 0x0015 47 #define JZ_H150T 0x0015
@@ -7,19 +7,19 @@ @@ -7,19 +7,19 @@
7 #define VERSION_CHOOSE_H 7 #define VERSION_CHOOSE_H
8 #include "./ConfigParams.h" 8 #include "./ConfigParams.h"
9 //1~10行 除了D可以修改版本选择 禁止动任何东西 9 //1~10行 除了D可以修改版本选择 禁止动任何东西
10 -#define DEVICE_VERSION JZ_U3S 10 +#define DEVICE_VERSION JZ_C1
11 11
12 //禁止修改行 选择是串口程序 还是 psdk程序 12 //禁止修改行 选择是串口程序 还是 psdk程序
13 -#define APP_VERSION APP_UART 13 +#define APP_VERSION APP_PSDK
14 14
15 //禁止修改行 板子型号 15 //禁止修改行 板子型号
16 #define PLATFORM_VERSION PLATFORM_V3S 16 #define PLATFORM_VERSION PLATFORM_V3S
17 17
18 //禁止修改行 串口连接程序的软件版本号 18 //禁止修改行 串口连接程序的软件版本号
19 -#define MAJOR_VERSION 0x00  
20 -#define MINOR_VERSION 0x00  
21 -#define MODIFY_VERSION 0x02  
22 -#define DEBUG_VERSION 0x07 19 +#define MAJOR_VERSION 0x01
  20 +#define MINOR_VERSION 0x03
  21 +#define MODIFY_VERSION 0x09
  22 +#define DEBUG_VERSION 0x05
23 23
24 //禁止修改行 滤波方式 24 //禁止修改行 滤波方式
25 #define FILTERING_TYPE HIGH_PASS_FILTERING 25 #define FILTERING_TYPE HIGH_PASS_FILTERING
@@ -611,7 +611,6 @@ static T_JZsdkReturnCode RecvDeal_SaveAudioFileTrans_stop_and_check(int Port, ch @@ -611,7 +611,6 @@ static T_JZsdkReturnCode RecvDeal_SaveAudioFileTrans_stop_and_check(int Port, ch
611 if (CodeLenth != 0) 611 if (CodeLenth != 0)
612 { 612 {
613 memcpy(checkCode, &getbuf[10], CodeLenth); 613 memcpy(checkCode, &getbuf[10], CodeLenth);
614 - JZSDK_LOG_INFO("checkCode :%s", checkCode);  
615 } 614 }
616 else 615 else
617 { 616 {
@@ -625,10 +624,12 @@ static T_JZsdkReturnCode RecvDeal_SaveAudioFileTrans_stop_and_check(int Port, ch @@ -625,10 +624,12 @@ static T_JZsdkReturnCode RecvDeal_SaveAudioFileTrans_stop_and_check(int Port, ch
625 if (getbuf[9] == 0) 624 if (getbuf[9] == 0)
626 { 625 {
627 checkType = JZSDK_CHECK_SUM_TYPE_MD5; 626 checkType = JZSDK_CHECK_SUM_TYPE_MD5;
  627 + JZSDK_LOG_INFO("checkCode :%s", checkCode);
628 } 628 }
629 else if (getbuf[9] == 1) 629 else if (getbuf[9] == 1)
630 { 630 {
631 checkType = JZSDK_CHECK_SUM_TYPE_SRC32; 631 checkType = JZSDK_CHECK_SUM_TYPE_SRC32;
  632 + JZSDK_LOG_INFO("checkCode :%x", checkCode);
632 } 633 }
633 else 634 else
634 { 635 {
@@ -909,8 +910,10 @@ static T_JZsdkReturnCode RecvDeal_CheckStatus_AudioDetailMessage(int Port, char @@ -909,8 +910,10 @@ static T_JZsdkReturnCode RecvDeal_CheckStatus_AudioDetailMessage(int Port, char
909 //4、解析音频名字 910 //4、解析音频名字
910 char AudioName[128]; 911 char AudioName[128];
911 int AudioNameLength = 0; 912 int AudioNameLength = 0;
912 - AudioNameLength = frameLenth - 9 - 2;  
913 - memcpy(AudioName, getbuf + 9, AudioNameLength); 913 + AudioNameLength = frameLenth - 11 - 2;
  914 + memcpy(AudioName, getbuf + 11, AudioNameLength);
  915 +
  916 + JZSDK_LOG_INFO("解析%s",AudioName);
914 917
915 #if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON 918 #if MEGAPHONE_CONFIG_STATUS == VERSION_SWITCH_ON
916 919
@@ -425,7 +425,7 @@ T_JZsdkReturnCode JZsdk_Uart_SentDeal_Reply_Musiclist(int UartPort ,int FrameSeq @@ -425,7 +425,7 @@ T_JZsdkReturnCode JZsdk_Uart_SentDeal_Reply_Musiclist(int UartPort ,int FrameSeq
425 //发送音频详细信息帧 425 //发送音频详细信息帧
426 T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioDetailMessage(int Uartport, int FrameSequence, unsigned char type ,unsigned char *data, unsigned int datalen) 426 T_JZsdkReturnCode JZsdk_Uart_SendDeal_Send_AudioDetailMessage(int Uartport, int FrameSequence, unsigned char type ,unsigned char *data, unsigned int datalen)
427 { 427 {
428 - printf("发送播放状态结束\n"); 428 + printf("发送音频详细信息\n");
429 unsigned char sendbuf[256]; 429 unsigned char sendbuf[256];
430 int send_buf_len; 430 int send_buf_len;
431 431
@@ -284,6 +284,27 @@ T_JZsdkReturnCode Pcm_AlsaPlay(struct AudioDealInfo *IndexInfo, unsigned char *b @@ -284,6 +284,27 @@ T_JZsdkReturnCode Pcm_AlsaPlay(struct AudioDealInfo *IndexInfo, unsigned char *b
284 //当输入的数据长度 》 每次写入音频设备时处理的帧数量384 284 //当输入的数据长度 》 每次写入音频设备时处理的帧数量384
285 int UnDeal_samples = num_samples; 285 int UnDeal_samples = num_samples;
286 286
  287 + // 无论哪种都是暂时不行
  288 + // //加入一个降噪
  289 + // if (1)
  290 + // {
  291 + // //降噪处理
  292 + // //把数据组成一个数组
  293 + // short TempPcm;
  294 + // for (int i = 0; i < num_samples; i+=2)
  295 + // {
  296 + // // TempPcm = (buf[i] & 0xFF) | ((short)buf[i+1] << 8);
  297 + // // TempPcm = PcmNoiseReduction(TempPcm);
  298 + // // buf[i] = TempPcm & 0xFF;
  299 + // // buf[i+1] = (TempPcm >> 8) & 0xFF;
  300 +
  301 + // TempPcm = (buf[i+1] & 0xFF) | ((short)buf[i] << 8);
  302 + // TempPcm = PcmNoiseReduction(TempPcm);
  303 + // buf[i+1] = TempPcm & 0xFF;
  304 + // buf[i] = (TempPcm >> 8) & 0xFF;
  305 + // }
  306 + // }
  307 +
287 while(UnDeal_samples > 0 && IndexInfo->AudioDeal_Alsa_Execute_Flag != JZ_FLAGCODE_OFF) 308 while(UnDeal_samples > 0 && IndexInfo->AudioDeal_Alsa_Execute_Flag != JZ_FLAGCODE_OFF)
288 { 309 {
289 310
@@ -59,6 +59,9 @@ int PCM_PooL_Interface_PcmData(struct AudioDealInfo *AD_Info,unsigned int in_sam @@ -59,6 +59,9 @@ int PCM_PooL_Interface_PcmData(struct AudioDealInfo *AD_Info,unsigned int in_sam
59 59
60 //重采样 //仅处理一半样本量 60 //重采样 //仅处理一半样本量
61 void *resampledData = FF_Resample_Send_And_Get_ResampleData(AD_Info, &data, dealLen/2, &out_nb_samples); 61 void *resampledData = FF_Resample_Send_And_Get_ResampleData(AD_Info, &data, dealLen/2, &out_nb_samples);
  62 + //void *resampledData = FF_Resample_Send_And_Get_ResampleData(AD_Info, &data, dealLen, &out_nb_samples);
  63 +
  64 + //JZSDK_LOG_INFO("播放 %d 数据",out_nb_samples
62 65
63 //如果滤波打开 66 //如果滤波打开
64 //滤波处理 67 //滤波处理
  1 +#include <stdio.h>
  2 +#include <stdlib.h>
  3 +#include <stdint.h>
  4 +#include <string.h>
  5 +
  6 +#include "JZsdkLib.h"
  7 +
  8 +// T_JZsdkReturnCode PcmNoiseReduction(unsigned char *data, int len, int threshold)
  9 +// {
  10 +// for (int i = 0; i < len; i++)
  11 +// {
  12 +// if (abs(data) >= 0xFF)
  13 +// {
  14 +// data[i] = 0;
  15 +// }
  16 +// }
  17 +
  18 +
  19 +// return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  20 +// }
  21 +
  22 +
  23 +#define NOISE_THRESHOLD 0.05 // 降噪阈值
  24 +
  25 +short PcmNoiseReduction(short data)
  26 +{
  27 + // 转换为浮点数并进行降噪
  28 + short re_data;
  29 + float float_buffer = data / 32768.0f;
  30 + if (fabs(float_buffer) < NOISE_THRESHOLD)
  31 + {
  32 + float_buffer = 0.0f; // 如果样本小于阈值,则将其置为零
  33 + }
  34 + re_data = (short)(float_buffer * 32767.0f); // 溢出处理
  35 + return re_data;
  36 +}
  1 +/**
  2 + ********************************************************************
  3 + * @file FF_FilterParam.h
  4 + * FF_FilterParam.h
  5 + *
  6 + *********************************************************************
  7 + */
  8 +
  9 +/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
  10 +#ifndef NOISE_REDUCTION_H
  11 +#define NOISE_REDUCTION_H
  12 +
  13 +/* Includes ------------------------------------------------------------------*/
  14 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  15 +
  16 +
  17 +#ifdef __cplusplus
  18 +extern "C" {
  19 +#endif
  20 +
  21 +/* Exported constants --------------------------------------------------------*/
  22 +/* 常亮定义*/
  23 +
  24 +
  25 +/* Exported types ------------------------------------------------------------*/
  26 +
  27 +/* Exported functions --------------------------------------------------------*/
  28 +short PcmNoiseReduction(short data);
  29 +
  30 +#ifdef __cplusplus
  31 +}
  32 +#endif
  33 +
  34 +#endif
@@ -141,14 +141,18 @@ void *FF_Resample_Send_And_Get_ResampleData(struct AudioDealInfo *AD_Info, unsig @@ -141,14 +141,18 @@ void *FF_Resample_Send_And_Get_ResampleData(struct AudioDealInfo *AD_Info, unsig
141 141
142 struct pcm_Resample *ResampleInfo = (struct pcm_Resample *)AD_Info->ResampleInfo; 142 struct pcm_Resample *ResampleInfo = (struct pcm_Resample *)AD_Info->ResampleInfo;
143 143
  144 + //按采样率缩放样本数量
144 *out_nb_samples = av_rescale_rnd(nb_samples, ResampleInfo->Out_SampleRate, ResampleInfo->In_SampleRate, AV_ROUND_UP); 145 *out_nb_samples = av_rescale_rnd(nb_samples, ResampleInfo->Out_SampleRate, ResampleInfo->In_SampleRate, AV_ROUND_UP);
145 //printf("重采样得到的预计输出样本数量为%d\n",*out_nb_samples); 146 //printf("重采样得到的预计输出样本数量为%d\n",*out_nb_samples);
  147 +
  148 + //放置输出数据的数组
146 ret = av_samples_alloc(&dst, NULL, 2, *out_nb_samples, AV_SAMPLE_FMT_S16, 0); 149 ret = av_samples_alloc(&dst, NULL, 2, *out_nb_samples, AV_SAMPLE_FMT_S16, 0);
147 if (ret < 0) { 150 if (ret < 0) {
148 printf("[ERROR][Resample]av_samples_alloc failed\n"); 151 printf("[ERROR][Resample]av_samples_alloc failed\n");
149 return NULL; 152 return NULL;
150 } 153 }
151 154
  155 + //重采样
152 ret = swr_convert(ResampleInfo->m_swr, &dst, *out_nb_samples, (const uint8_t**)src, nb_samples); 156 ret = swr_convert(ResampleInfo->m_swr, &dst, *out_nb_samples, (const uint8_t**)src, nb_samples);
153 if (ret < 0) { 157 if (ret < 0) {
154 printf("[ERROR][Resample]swr_convert failed\n"); 158 printf("[ERROR][Resample]swr_convert failed\n");
@@ -190,7 +190,7 @@ static T_JZsdkReturnCode DeviceMessage_Enter_Default(unsigned char *message) @@ -190,7 +190,7 @@ static T_JZsdkReturnCode DeviceMessage_Enter_Default(unsigned char *message)
190 #endif 190 #endif
191 191
192 //如果为组合版 192 //如果为组合版
193 -#if (DEVICE_VERSION == TF_A1 || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S ||DEVICE_VERSION == JZ_U3D) 193 +#if (DEVICE_VERSION == TF_A1 || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S ||DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
194 194
195 // //组合板写入 195 // //组合板写入
196 // snprintf(new_message,128,"光斑y值%d\n",Widget_GetCenter_ValueY()); 196 // snprintf(new_message,128,"光斑y值%d\n",Widget_GetCenter_ValueY());
@@ -392,7 +392,7 @@ T_JZsdkReturnCode Gimbal_CheckStatus_Angle(int *PitchAngle, int *YawAngle, int * @@ -392,7 +392,7 @@ T_JZsdkReturnCode Gimbal_CheckStatus_Angle(int *PitchAngle, int *YawAngle, int *
392 T_JZsdkReturnCode Gimbal_Obtain_Gimbal_Pitch(int Pitch) 392 T_JZsdkReturnCode Gimbal_Obtain_Gimbal_Pitch(int Pitch)
393 { 393 {
394 //目前 U3和 H1T会接受到云台返回值 394 //目前 U3和 H1T会接受到云台返回值
395 - if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D) 395 + if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
396 { 396 {
397 //不做处理,避免出现什么问题 397 //不做处理,避免出现什么问题
398 } 398 }
@@ -38,7 +38,7 @@ T_JZsdkReturnCode Gimbal_DataDeal_init() @@ -38,7 +38,7 @@ T_JZsdkReturnCode Gimbal_DataDeal_init()
38 #elif DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_C1 38 #elif DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_C1
39 // 不用去特地初始化t60的云台 39 // 不用去特地初始化t60的云台
40 #elif DEVICE_VERSION == JZ_H10 || DEVICE_VERSION == JZ_H10T || DEVICE_VERSION == JZ_U3 \ 40 #elif DEVICE_VERSION == JZ_H10 || DEVICE_VERSION == JZ_H10T || DEVICE_VERSION == JZ_U3 \
41 - || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == TF_A1 41 + || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 || DEVICE_VERSION == TF_A1
42 //设置0度 42 //设置0度
43 43
44 #else 44 #else
@@ -94,7 +94,7 @@ T_JZsdkReturnCode Gimbal_DataDeal_SetRealAngle(int angle) @@ -94,7 +94,7 @@ T_JZsdkReturnCode Gimbal_DataDeal_SetRealAngle(int angle)
94 94
95 Ircut_PWM_control(PWM_num); 95 Ircut_PWM_control(PWM_num);
96 96
97 -#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D \ 97 +#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 \
98 || DEVICE_VERSION == TF_A1 98 || DEVICE_VERSION == TF_A1
99 99
100 //发送角度给串口2 100 //发送角度给串口2
@@ -139,7 +139,7 @@ T_JZsdkReturnCode Gimbal_DataDeal_SetPitchRange(int Range) @@ -139,7 +139,7 @@ T_JZsdkReturnCode Gimbal_DataDeal_SetPitchRange(int Range)
139 139
140 //还没想好怎么弄 140 //还没想好怎么弄
141 141
142 -#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D \ 142 +#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 \
143 || DEVICE_VERSION == TF_A1 143 || DEVICE_VERSION == TF_A1
144 144
145 if (Range == 0xFF) 145 if (Range == 0xFF)
@@ -52,7 +52,7 @@ extern "C" { @@ -52,7 +52,7 @@ extern "C" {
52 #define MAX_PITCH 0 52 #define MAX_PITCH 0
53 #define MIN_PITCH -600 53 #define MIN_PITCH -600
54 54
55 -#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D \ 55 +#elif DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 \
56 || DEVICE_VERSION == TF_A1 56 || DEVICE_VERSION == TF_A1
57 57
58 #define PITCH_PWM_MAX 0 58 #define PITCH_PWM_MAX 0
@@ -12,7 +12,7 @@ static int OutPutPower = JZ_FLAGCODE_OFF; @@ -12,7 +12,7 @@ static int OutPutPower = JZ_FLAGCODE_OFF;
12 void Ircut_Init()//引脚初始化 12 void Ircut_Init()//引脚初始化
13 { 13 {
14 if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T || 14 if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T ||
15 - DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || 15 + DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30||
16 DEVICE_VERSION == TF_A1) 16 DEVICE_VERSION == TF_A1)
17 { 17 {
18 V3s_Ircut_Init(); 18 V3s_Ircut_Init();
@@ -53,7 +53,7 @@ int Ircut_uInit() @@ -53,7 +53,7 @@ int Ircut_uInit()
53 void set_amplifier(int amplifier_mode) 53 void set_amplifier(int amplifier_mode)
54 { 54 {
55 if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T || 55 if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T ||
56 - DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || 56 + DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 ||
57 DEVICE_VERSION == TF_A1) 57 DEVICE_VERSION == TF_A1)
58 { 58 {
59 V3s_set_amplifier(amplifier_mode); 59 V3s_set_amplifier(amplifier_mode);
@@ -119,7 +119,7 @@ T_JZsdkReturnCode Ircut_CheckStatus_OutPutPower(int *value) @@ -119,7 +119,7 @@ T_JZsdkReturnCode Ircut_CheckStatus_OutPutPower(int *value)
119 T_JZsdkReturnCode Ircut_PinControl(int port, int num, int status) 119 T_JZsdkReturnCode Ircut_PinControl(int port, int num, int status)
120 { 120 {
121 if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T || 121 if (DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H10T ||
122 - DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || 122 + DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30 ||
123 DEVICE_VERSION == TF_A1) 123 DEVICE_VERSION == TF_A1)
124 { 124 {
125 V3s_PinControl(port, num, status); 125 V3s_PinControl(port, num, status);
@@ -69,7 +69,7 @@ T_JZsdkReturnCode Lighting_SearchLightControl(int mode) @@ -69,7 +69,7 @@ T_JZsdkReturnCode Lighting_SearchLightControl(int mode)
69 69
70 SearchLight_Mode = mode; 70 SearchLight_Mode = mode;
71 71
72 - if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D) 72 + if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
73 { 73 {
74 return SearchLight_V3S_U3_SearchLightControl(mode); 74 return SearchLight_V3S_U3_SearchLightControl(mode);
75 } 75 }
@@ -122,7 +122,7 @@ T_JZsdkReturnCode Lighting_Set_SearchLightLumen(int LeftLumen, int RightLumen) @@ -122,7 +122,7 @@ T_JZsdkReturnCode Lighting_Set_SearchLightLumen(int LeftLumen, int RightLumen)
122 { 122 {
123 printf("设置%x探照灯灯光亮度\n",DEVICE_VERSION); 123 printf("设置%x探照灯灯光亮度\n",DEVICE_VERSION);
124 124
125 - if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D) 125 + if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
126 { 126 {
127 SearchLight_RightLumen = RightLumen; 127 SearchLight_RightLumen = RightLumen;
128 SearchLight_LeftLumen = LeftLumen; 128 SearchLight_LeftLumen = LeftLumen;
@@ -148,7 +148,7 @@ T_JZsdkReturnCode Lighting_Obtain_SearchLightLumen(int LeftLumen, int RightLumen @@ -148,7 +148,7 @@ T_JZsdkReturnCode Lighting_Obtain_SearchLightLumen(int LeftLumen, int RightLumen
148 printf("接收到%x探照灯灯光亮度 左灯%d 右灯%d\n",DEVICE_VERSION, LeftLumen, RightLumen); 148 printf("接收到%x探照灯灯光亮度 左灯%d 右灯%d\n",DEVICE_VERSION, LeftLumen, RightLumen);
149 149
150 //如果是主喊话器副灯的单一设备 150 //如果是主喊话器副灯的单一设备
151 - if (DEVICE_VERSION == TF_A1 || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D) 151 + if (DEVICE_VERSION == TF_A1 || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
152 { 152 {
153 153
154 } 154 }
@@ -190,7 +190,7 @@ T_JZsdkReturnCode Lighting_Set_SearchLightFrequency(int value) @@ -190,7 +190,7 @@ T_JZsdkReturnCode Lighting_Set_SearchLightFrequency(int value)
190 { 190 {
191 printf("设置0x%x:探照灯爆闪频率\n",DEVICE_VERSION); 191 printf("设置0x%x:探照灯爆闪频率\n",DEVICE_VERSION);
192 192
193 - if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D) 193 + if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
194 { 194 {
195 return SearchLight_V3S_U3_Set_SearchLightFrequency(value); 195 return SearchLight_V3S_U3_Set_SearchLightFrequency(value);
196 } 196 }
@@ -248,7 +248,7 @@ T_JZsdkReturnCode Lighting_Obtain_SearchLightTemperature(int LeftTemperature, in @@ -248,7 +248,7 @@ T_JZsdkReturnCode Lighting_Obtain_SearchLightTemperature(int LeftTemperature, in
248 } 248 }
249 249
250 //如果是JZ u3 250 //如果是JZ u3
251 - if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D) 251 + if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
252 { 252 {
253 //输入温度进温度控制线程 253 //输入温度进温度控制线程
254 SearchLightTemControl_Set_g_InputTemp(Max_tmeperature); 254 SearchLightTemControl_Set_g_InputTemp(Max_tmeperature);
@@ -302,7 +302,7 @@ T_JZsdkReturnCode Lighting_Set_WarningLight_Status(int status, int mode) @@ -302,7 +302,7 @@ T_JZsdkReturnCode Lighting_Set_WarningLight_Status(int status, int mode)
302 302
303 #elif DEVICE_VERSION == TF_A1 303 #elif DEVICE_VERSION == TF_A1
304 return WarningLight_V3S_TFA1_Set_WarningLight_Status(status, mode); 304 return WarningLight_V3S_TFA1_Set_WarningLight_Status(status, mode);
305 -#elif DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D 305 +#elif DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30
306 return JZsdk_Uart_Send_Set_WarningLight_Status(UART_DEV_2, status, mode); 306 return JZsdk_Uart_Send_Set_WarningLight_Status(UART_DEV_2, status, mode);
307 #else 307 #else
308 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 308 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
@@ -363,7 +363,7 @@ T_JZsdkReturnCode Lighting_Set_WarningLight_Color(int color1, int color2) @@ -363,7 +363,7 @@ T_JZsdkReturnCode Lighting_Set_WarningLight_Color(int color1, int color2)
363 363
364 #elif DEVICE_VERSION == TF_A1 364 #elif DEVICE_VERSION == TF_A1
365 return WarningLight_V3S_TFA1_Set_WarningLight_Color(color1, color2); 365 return WarningLight_V3S_TFA1_Set_WarningLight_Color(color1, color2);
366 -#elif DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D 366 +#elif DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30
367 JZsdk_Uart_Send_Set_WarningLight_Color(UART_DEV_2, color1, color2); 367 JZsdk_Uart_Send_Set_WarningLight_Color(UART_DEV_2, color1, color2);
368 #else 368 #else
369 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 369 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
@@ -85,6 +85,10 @@ static int JZsdk_SearchLightGetLimitTemp(int DeviceMode) @@ -85,6 +85,10 @@ static int JZsdk_SearchLightGetLimitTemp(int DeviceMode)
85 return 70; 85 return 70;
86 break; 86 break;
87 87
  88 + case JZ_U30:
  89 + return 70;
  90 + break;
  91 +
88 case TF_A1: 92 case TF_A1:
89 return 70; 93 return 70;
90 break; 94 break;
@@ -238,10 +238,17 @@ static void *JZsdk_Kt_Irc_DataDeal_Thread(void *args) @@ -238,10 +238,17 @@ static void *JZsdk_Kt_Irc_DataDeal_Thread(void *args)
238 //4、将原始码流数据转换成h264流,为避免多次复制,这里的h264会直接放入视频流管理的缓冲区 238 //4、将原始码流数据转换成h264流,为避免多次复制,这里的h264会直接放入视频流管理的缓冲区
239 JZsdk_RTKMMP_RawData_to_h264(raw_data, raw_data_len); 239 JZsdk_RTKMMP_RawData_to_h264(raw_data, raw_data_len);
240 240
  241 + if (raw_data != NULL)
  242 + {
241 free(raw_data); 243 free(raw_data);
242 raw_data = NULL; 244 raw_data = NULL;
  245 + }
  246 +
  247 + if (gary_data != NULL)
  248 + {
243 free(gary_data); 249 free(gary_data);
244 gary_data = NULL; 250 gary_data = NULL;
  251 + }
245 252
246 //JZSDK_LOG_DEBUG("得到了一帧红外h264"); 253 //JZSDK_LOG_DEBUG("得到了一帧红外h264");
247 } 254 }
@@ -105,6 +105,8 @@ typedef struct IRC_param @@ -105,6 +105,8 @@ typedef struct IRC_param
105 105
106 unsigned int IRC_outPixelMode; //IRC输出像素模式 RGB888 YUV420 106 unsigned int IRC_outPixelMode; //IRC输出像素模式 RGB888 YUV420
107 107
  108 + unsigned int RingRepair; //环状修复
  109 +
108 //IRC画框坐标 110 //IRC画框坐标
109 unsigned int RegionBox[4]; // 0 一号点x 1 一号点y 2 二号点x 3 二号点y 111 unsigned int RegionBox[4]; // 0 一号点x 1 一号点y 2 二号点x 3 二号点y
110 112
@@ -159,7 +159,7 @@ T_JZsdkReturnCode IRC_SPC_ParamCorrect(struct IRC_param *dealInfo, U16_t *MarkDa @@ -159,7 +159,7 @@ T_JZsdkReturnCode IRC_SPC_ParamCorrect(struct IRC_param *dealInfo, U16_t *MarkDa
159 } 159 }
160 } 160 }
161 161
162 - JZSDK_LOG_INFO("重新计算IPC参数 Avg%f",Avg); 162 + //JZSDK_LOG_INFO("重新计算IPC参数 Avg%f",Avg);
163 } 163 }
164 164
165 165
@@ -200,6 +200,14 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize, @@ -200,6 +200,14 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize,
200 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 200 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
201 } 201 }
202 202
  203 +
  204 +unsigned int Get_2DImage_PointToArray(int x, int y, int width, int height)
  205 +{
  206 + return (x + y*width);
  207 +}
  208 +
  209 +
  210 +
203 /* 211 /*
204 功能:IRC后处理 212 功能:IRC后处理
205 213
@@ -212,6 +220,8 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param @@ -212,6 +220,8 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
212 220
213 if (MirrorImageFlag == JZ_FLAGCODE_ON) 221 if (MirrorImageFlag == JZ_FLAGCODE_ON)
214 { 222 {
  223 + int x, y = 0;
  224 +
215 int bytes_per_row = dealInfo->Width * 3; // 每行的字节数 225 int bytes_per_row = dealInfo->Width * 3; // 每行的字节数
216 unsigned char *temp_row = (unsigned char *)malloc(bytes_per_row); // 临时缓冲区,用于存储一行的像素数据 226 unsigned char *temp_row = (unsigned char *)malloc(bytes_per_row); // 临时缓冲区,用于存储一行的像素数据
217 227
@@ -221,13 +231,13 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param @@ -221,13 +231,13 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
221 } 231 }
222 232
223 // 遍历图像的每一行 233 // 遍历图像的每一行
224 - for (int y = 0; y < dealInfo->Height; y++) 234 + for (y = 0; y < dealInfo->Height; y++)
225 { 235 {
226 // 复制当前行到临时缓冲区 236 // 复制当前行到临时缓冲区
227 memcpy(temp_row, rgb_data + y * bytes_per_row, bytes_per_row); 237 memcpy(temp_row, rgb_data + y * bytes_per_row, bytes_per_row);
228 238
229 // 从右向左(即反向)复制临时缓冲区的数据回原位置 239 // 从右向左(即反向)复制临时缓冲区的数据回原位置
230 - for (int x = 0; x < dealInfo->Width; x++) { 240 + for (x = 0; x < dealInfo->Width; x++) {
231 int source_index = (dealInfo->Width - 1 - x) * 3; // 计算源像素的索引 241 int source_index = (dealInfo->Width - 1 - x) * 3; // 计算源像素的索引
232 int dest_index = x * 3; // 计算目标像素的索引 242 int dest_index = x * 3; // 计算目标像素的索引
233 243
@@ -242,40 +252,147 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param @@ -242,40 +252,147 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
242 } 252 }
243 253
244 254
245 - // 在rgb图上画图形 255 + //修复外圈图像
  256 + if (dealInfo->RingRepair == JZ_FLAGCODE_ON)
  257 + {
  258 + int x, y = 0;
246 259
247 - //不画  
248 - if (dealInfo->RegionMode == 0) 260 + //修复上边
  261 + for (x = 2; x <= dealInfo->Width - 2; x++)
249 { 262 {
250 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 263 + int SourceIndex = Get_2DImage_PointToArray(x, 3, dealInfo->Width, dealInfo->Height) * 3;
  264 +
  265 + int FirstIndex = Get_2DImage_PointToArray(x, 0, dealInfo->Width, dealInfo->Height) * 3;
  266 + int SecondIndex = Get_2DImage_PointToArray(x, 1, dealInfo->Width, dealInfo->Height) * 3;
  267 +
  268 + rgb_data[FirstIndex] = rgb_data[SourceIndex];
  269 + rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1];
  270 + rgb_data[FirstIndex + 2] = rgb_data[SourceIndex + 2];
  271 +
  272 + rgb_data[SecondIndex] = rgb_data[SourceIndex];
  273 + rgb_data[SecondIndex + 1] = rgb_data[SourceIndex + 1];
  274 + rgb_data[SecondIndex + 2] = rgb_data[SourceIndex + 2];
251 } 275 }
252 276
253 - //画十字  
254 - if (dealInfo->RegionMode == 1) 277 + //修复下边
  278 + for (x = 2; x <= dealInfo->Width - 2; x++)
255 { 279 {
256 - Stream_rgb888_WriteCross(rgb_data,  
257 - dealInfo->Width, dealInfo->Height,  
258 - dealInfo->RegionBox[0],  
259 - dealInfo->RegionBox[1],  
260 - 255, 215, 0, 20, 20); 280 + int SourceIndex = Get_2DImage_PointToArray(x, dealInfo->Height - 3, dealInfo->Width, dealInfo->Height) * 3;
261 281
262 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 282 + int FirstIndex = Get_2DImage_PointToArray(x, dealInfo->Height - 1, dealInfo->Width, dealInfo->Height) * 3;
  283 + int SecondIndex = Get_2DImage_PointToArray(x, dealInfo->Height - 2, dealInfo->Width, dealInfo->Height) * 3;
  284 +
  285 + rgb_data[FirstIndex] = rgb_data[SourceIndex];
  286 + rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1];
  287 + rgb_data[FirstIndex + 2] = rgb_data[SourceIndex + 2];
  288 +
  289 + rgb_data[SecondIndex] = rgb_data[SourceIndex];
  290 + rgb_data[SecondIndex + 1] = rgb_data[SourceIndex + 1];
  291 + rgb_data[SecondIndex + 2] = rgb_data[SourceIndex + 2];
263 } 292 }
264 293
265 - //画十字  
266 - if (dealInfo->RegionMode == 2) 294 + //修复左边
  295 + for (int y = 0; y < dealInfo->Height; y++)
267 { 296 {
268 - Stream_rgb888_WriteRectangle(rgb_data,  
269 - dealInfo->Width, dealInfo->Height,  
270 - dealInfo->RegionBox[0],  
271 - dealInfo->RegionBox[1],  
272 - dealInfo->RegionBox[2],  
273 - dealInfo->RegionBox[3],  
274 - 255, 215, 0, 1); 297 + int SourceIndex = Get_2DImage_PointToArray(3, y, dealInfo->Width, dealInfo->Height) * 3;
275 298
276 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 299 + int FirstIndex = Get_2DImage_PointToArray(0, y, dealInfo->Width, dealInfo->Height) * 3;
  300 + int SecondIndex = Get_2DImage_PointToArray(1, y, dealInfo->Width, dealInfo->Height) * 3;
  301 + int ThirdIndex = Get_2DImage_PointToArray(2, y, dealInfo->Width, dealInfo->Height) * 3;
  302 +
  303 + rgb_data[FirstIndex] = rgb_data[SourceIndex];
  304 + rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1];
  305 + rgb_data[FirstIndex + 2] = rgb_data[SourceIndex + 2];
  306 +
  307 + rgb_data[SecondIndex] = rgb_data[SourceIndex];
  308 + rgb_data[SecondIndex + 1] = rgb_data[SourceIndex + 1];
  309 + rgb_data[SecondIndex + 2] = rgb_data[SourceIndex + 2];
  310 +
  311 + rgb_data[ThirdIndex] = rgb_data[SourceIndex];
  312 + rgb_data[ThirdIndex + 1] = rgb_data[SourceIndex + 1];
  313 + rgb_data[ThirdIndex + 2] = rgb_data[SourceIndex + 2];
277 } 314 }
278 315
  316 + // 修复右边
  317 + for (int y = 0; y < dealInfo->Height; y++)
  318 + {
  319 + int SourceIndex = Get_2DImage_PointToArray(dealInfo->Width - 7, y, dealInfo->Width, dealInfo->Height) * 3;
  320 +
  321 + int FirstIndex = Get_2DImage_PointToArray(dealInfo->Width - 1, y, dealInfo->Width, dealInfo->Height) * 3;
  322 + int SecondIndex = Get_2DImage_PointToArray(dealInfo->Width - 2, y, dealInfo->Width, dealInfo->Height) * 3;
  323 + int ThirdIndex = Get_2DImage_PointToArray(dealInfo->Width - 3, y, dealInfo->Width, dealInfo->Height) * 3;
  324 + int FourthIndex = Get_2DImage_PointToArray(dealInfo->Width - 4, y, dealInfo->Width, dealInfo->Height) * 3;
  325 + int FifthIndex = Get_2DImage_PointToArray(dealInfo->Width - 5, y, dealInfo->Width, dealInfo->Height) * 3;
  326 + int SixthIndex = Get_2DImage_PointToArray(dealInfo->Width - 6, y, dealInfo->Width, dealInfo->Height) * 3;
  327 + int SeventhIndex = Get_2DImage_PointToArray(dealInfo->Width - 7, y, dealInfo->Width, dealInfo->Height) * 3;
  328 +
  329 + rgb_data[FirstIndex] = rgb_data[SourceIndex];
  330 + rgb_data[FirstIndex + 1] = rgb_data[SourceIndex + 1];
  331 + rgb_data[FirstIndex + 2] = rgb_data[SourceIndex + 2];
  332 +
  333 + rgb_data[SecondIndex] = rgb_data[SourceIndex];
  334 + rgb_data[SecondIndex + 1] = rgb_data[SourceIndex + 1];
  335 + rgb_data[SecondIndex + 2] = rgb_data[SourceIndex + 2];
  336 +
  337 + rgb_data[ThirdIndex] = rgb_data[SourceIndex];
  338 + rgb_data[ThirdIndex + 1] = rgb_data[SourceIndex + 1];
  339 + rgb_data[ThirdIndex + 2] = rgb_data[SourceIndex + 2];
  340 +
  341 + rgb_data[FourthIndex] = rgb_data[SourceIndex];
  342 + rgb_data[FourthIndex + 1] = rgb_data[SourceIndex + 1];
  343 + rgb_data[FourthIndex + 2] = rgb_data[SourceIndex + 2];
  344 +
  345 + rgb_data[FifthIndex] = rgb_data[SourceIndex];
  346 + rgb_data[FifthIndex + 1] = rgb_data[SourceIndex + 1];
  347 + rgb_data[FifthIndex + 2] = rgb_data[SourceIndex + 2];
  348 +
  349 + rgb_data[SixthIndex] = rgb_data[SourceIndex];
  350 + rgb_data[SixthIndex + 1] = rgb_data[SourceIndex + 1];
  351 + rgb_data[SixthIndex + 2] = rgb_data[SourceIndex + 2];
  352 +
  353 + rgb_data[SeventhIndex] = rgb_data[SourceIndex];
  354 + rgb_data[SeventhIndex + 1] = rgb_data[SourceIndex + 1];
  355 + rgb_data[SeventhIndex + 2] = rgb_data[SourceIndex + 2];
  356 + }
  357 +
  358 + }
  359 +
  360 +
  361 +
  362 + // 在rgb图上画图形
  363 +
  364 + // //不画
  365 + // if (dealInfo->RegionMode == 0)
  366 + // {
  367 + // return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  368 + // }
  369 +
  370 + // //画十字
  371 + // if (dealInfo->RegionMode == 1)
  372 + // {
  373 + // Stream_rgb888_WriteCross(rgb_data,
  374 + // dealInfo->Width, dealInfo->Height,
  375 + // dealInfo->RegionBox[0],
  376 + // dealInfo->RegionBox[1],
  377 + // 255, 215, 0, 20, 20);
  378 +
  379 + // return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  380 + // }
  381 +
  382 + // //画十字
  383 + // if (dealInfo->RegionMode == 2)
  384 + // {
  385 + // Stream_rgb888_WriteRectangle(rgb_data,
  386 + // dealInfo->Width, dealInfo->Height,
  387 + // dealInfo->RegionBox[0],
  388 + // dealInfo->RegionBox[1],
  389 + // dealInfo->RegionBox[2],
  390 + // dealInfo->RegionBox[3],
  391 + // 255, 215, 0, 1);
  392 +
  393 + // return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  394 + // }
  395 +
279 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 396 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
280 } 397 }
281 398
@@ -307,6 +424,10 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u @@ -307,6 +424,10 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u
307 KtLib_DataDeal(U16_data, U16_dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param); 424 KtLib_DataDeal(U16_data, U16_dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param);
308 break; 425 break;
309 426
  427 + case IRC_DEALMODE_JZSDK:
  428 + JZIrcLib_DataDeal(U16_data, U16_dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param);
  429 + break;
  430 +
310 default: 431 default:
311 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 432 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
312 break; 433 break;
@@ -934,7 +1055,7 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in @@ -934,7 +1055,7 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
934 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; 1055 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
935 } 1056 }
936 1057
937 - IrcDealCfg->DealWay = IRC_DEALMODE_KTLIB; 1058 + IrcDealCfg->DealWay = IRC_DEALMODE_JZSDK;
938 IrcDealCfg->ImgDataBits = 14; //图像为14位图像 1059 IrcDealCfg->ImgDataBits = 14; //图像为14位图像
939 IrcDealCfg->Height = height; 1060 IrcDealCfg->Height = height;
940 IrcDealCfg->Width = width; 1061 IrcDealCfg->Width = width;
@@ -955,6 +1076,8 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in @@ -955,6 +1076,8 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
955 1076
956 IrcDealCfg->OutputPixelColorMode = 0; 1077 IrcDealCfg->OutputPixelColorMode = 0;
957 1078
  1079 + IrcDealCfg->RingRepair = JZ_FLAGCODE_ON;
  1080 +
958 //单点部分 1081 //单点部分
959 IrcDealCfg->FirstSPC_flag = JZ_FLAGCODE_OFF; 1082 IrcDealCfg->FirstSPC_flag = JZ_FLAGCODE_OFF;
960 IrcDealCfg->SPC_ResetFlag = JZ_FLAGCODE_OFF; 1083 IrcDealCfg->SPC_ResetFlag = JZ_FLAGCODE_OFF;
@@ -505,6 +505,260 @@ static T_JZsdkReturnCode JZIrcLib_SPC(U16_t *ImageData,struct IRC_param *dealInf @@ -505,6 +505,260 @@ static T_JZsdkReturnCode JZIrcLib_SPC(U16_t *ImageData,struct IRC_param *dealInf
505 } 505 }
506 506
507 507
  508 +/******
  509 + *
  510 + * 两点矫正
  511 + *
  512 + *
  513 + * *****/
  514 +T_JZsdkReturnCode JZIrcLib_TPC(U16_t *ImageData,struct IRC_param *dealInfo)
  515 +{
  516 + //无图像
  517 + if (ImageData == NULL || dealInfo == NULL)
  518 + {
  519 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  520 + }
  521 +
  522 + // 如果tpc的斜率和tpc的截距都为0,重新计算斜率与斜距
  523 + int allZeroSlope_flag = 1, allZeroDiff_flag = 1;
  524 + for (int i = 0; i < dealInfo->PixelNum; i++)
  525 + {
  526 + if (dealInfo->TPC_Slope[i] != 0)
  527 + {
  528 + allZeroSlope_flag = 0;
  529 + }
  530 + if (dealInfo->TPC_Diff[i] != 0) {
  531 + allZeroDiff_flag = 0;
  532 + }
  533 + }
  534 +
  535 + //如果出现tpc的斜率和tpc的截距都为0,重新计算斜率与斜距
  536 + if (allZeroSlope_flag && allZeroDiff_flag)
  537 + {
  538 + double AvgSingleFrame_LowT = 0, AvgSingleFrame_HighT = 0;
  539 +
  540 + for (int i = 0; i < dealInfo->PixelNum; i++)
  541 + {
  542 + AvgSingleFrame_LowT += dealInfo->LowT_NineFrame_Avg[i];
  543 + AvgSingleFrame_HighT += dealInfo->HighT_NineFrame_Avg[i];
  544 + }
  545 +
  546 + AvgSingleFrame_LowT = AvgSingleFrame_LowT / dealInfo->PixelNum;
  547 + AvgSingleFrame_HighT = AvgSingleFrame_HighT / dealInfo->PixelNum;
  548 +
  549 + for (int i = 0; i < dealInfo->PixelNum; i++)
  550 + {
  551 + if (dealInfo->HighT_NineFrame_Avg[i] > dealInfo->LowT_NineFrame_Avg[i])
  552 + {
  553 + dealInfo->TPC_Slope[i] = (AvgSingleFrame_HighT - AvgSingleFrame_LowT) / (dealInfo->HighT_NineFrame_Avg[i] - dealInfo->LowT_NineFrame_Avg[i]);
  554 + }
  555 + else
  556 + {
  557 + dealInfo->TPC_Slope[i] = 0;
  558 + }
  559 + dealInfo->TPC_Diff[i] = AvgSingleFrame_LowT - dealInfo->TPC_Slope[i] * dealInfo->LowT_NineFrame_Avg[i];
  560 + }
  561 + }
  562 +
  563 + // 应用两点校正公式
  564 + for (int i = 0; i < dealInfo->PixelNum; i++)
  565 + {
  566 + ImageData[i] = (int)(dealInfo->TPC_Slope[i] * ImageData[i] + dealInfo->TPC_Diff[i]);
  567 + if (ImageData[i] < 0)
  568 + {
  569 + ImageData[i] = 0;
  570 + }
  571 + else if (ImageData[i] > dealInfo->ExpectedMax)
  572 + {
  573 + ImageData[i] = dealInfo->ExpectedMax;
  574 + }
  575 + }
  576 +
  577 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; // 返回校正后的灰度数组
  578 +}
  579 +
  580 +
  581 +
  582 +/*计算直方图均衡化并转换为8位灰度值
  583 + U16_t in_str 输入的数据
  584 + int in_str_len 输入的数据长度
  585 + 灰度0为黑色,灰度255为白色
  586 +*/
  587 +static T_JZsdkReturnCode JZIrcLib_vKT(U16_t *in_str, U8_t **out_str, int *out_str_len, struct IRC_param *dealInfo)
  588 +{
  589 + //无图像
  590 + if (in_str == NULL || dealInfo == NULL)
  591 + {
  592 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  593 + }
  594 +
  595 + // 分配输出结果的内存空间
  596 + *out_str = (unsigned char*)malloc(sizeof(unsigned char) * dealInfo->PixelNum);
  597 + if (*out_str == NULL) {
  598 + // 如果内存分配失败,打印错误信息并返回空指针
  599 + JZSDK_LOG_ERROR("Error: Memory allocation failed\n");
  600 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  601 + }
  602 +
  603 +/**********************************************
  604 + *
  605 + * 获取图像的直方图
  606 + *
  607 + *
  608 + * *****************************************************/
  609 +
  610 + // 初始化变量
  611 + unsigned int ThisPixelGray = 0; //当前处理像素点的灰度值
  612 + long SumAllLegalGray = 0; //存储的总灰度值
  613 +
  614 + // 分配当前灰度值出现次数的内存空间,并初始化为0
  615 + //用于记录每个灰度值在输入向量中出现的次数。具体来说,它是一个无符号整型数组,
  616 + //其索引表示灰度值,数组中的值表示该灰度值在输入向量中出现的次数。
  617 + //在遍历输入向量时,将每个像素的灰度值记录在相应的 ThisGrayAppendTime 数组中。
  618 + //这是直方图均衡化算法中需要用到的一个重要步骤,用于统计每个灰度值的出现次数
  619 + //为保证每一个灰度值都被包括,所以用 dealInfo->ExpectedMax 写长度
  620 + unsigned int* ThisGrayAppendTime = (unsigned int*)calloc(dealInfo->ExpectedMax + 1, sizeof(unsigned int));
  621 + if (ThisGrayAppendTime == NULL) {
  622 + JZSDK_LOG_ERROR("Error: Memory allocation failed\n");
  623 + free(*out_str);
  624 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  625 + }
  626 +
  627 + // 遍历输入向量,统计各灰度值出现次数和总灰度和
  628 + for (int i = 0; i < dealInfo->PixelNum; ++i)
  629 + {
  630 + //获取本像素点的灰度值,且避免超过最大灰度值
  631 + ThisPixelGray = in_str[i];
  632 + if (ThisPixelGray > dealInfo->ExpectedMax)
  633 + {
  634 + ThisPixelGray = dealInfo->ExpectedMax;
  635 + }
  636 +
  637 + //直方图的 x坐标ThisPixelGray 的y值 即次数+1
  638 + ThisGrayAppendTime[ThisPixelGray]++;
  639 +
  640 + //计算总灰度值
  641 + SumAllLegalGray += ThisPixelGray;
  642 + }
  643 +
  644 +/*
  645 + 注:图像对比度:直方图分布越均匀,图像的对比度越高
  646 + 图像亮度: 直方图分布越靠右(最大值),则亮度越高
  647 +*/
  648 +
  649 +/**********************************************************************************************************/
  650 +
  651 + // 初始化边界值和阈值增益
  652 + unsigned int LowLimit = 0; //用于指定直方图均衡化的最低灰度值范围,通常为0。
  653 + unsigned int HighLimit = 0; //用于指定直方图均衡化的最高灰度值范围,通常为最大灰度值。
  654 + unsigned int VMax = dealInfo->ExpectedMax; //表示输入图像中可能的最大灰度值。
  655 + unsigned int VMin = 0; //通常为0,表示输入图像中可能的最小灰度值。
  656 + unsigned int ThresholdLimits = dealInfo->Gain * dealInfo->ImgDataBits; //阈值参数,是一个根据增益和位深度计算得出的阈值,用于在直方图均衡化时进行限制,确保输出图像的对比度合适。
  657 + double AvgGray = SumAllLegalGray / (dealInfo->PixelNum * 1.0); //平均灰度值,表示输入图像中所有合法灰度值的平均值,用于直方图均衡化算法中计算每个像素点的增益值。
  658 +
  659 + // 计算灰度直方图的边界值,找到合适的灰度范围用于直方图均衡化
  660 + for (int i = 0; i < dealInfo->ExpectedMax; ++i)
  661 + {
  662 + if (LowLimit < dealInfo->LeftDrop) {
  663 + LowLimit += ThisGrayAppendTime[i];
  664 + VMin = i;
  665 + }
  666 + if (HighLimit < (dealInfo->PixelNum - dealInfo->RightDrop))
  667 + {
  668 + HighLimit += ThisGrayAppendTime[i];
  669 + VMax = i;
  670 + }
  671 + }
  672 +
  673 + //(ThresholdLimits / 12) 是一个阈值的限制
  674 + //根据增益和位深度计算得出的阈值,用于在直方图均衡化时进行限制,确保输出图像的对比度合适
  675 +
  676 + //将 VMax 增加 (ThresholdLimits / 12) 的目的是为了保证直方图均衡化后的最高灰度值范围与阈值限制的要求相符,
  677 + //从而确保输出图像的对比度得到合适的控制,并且不会超出预期的范围。
  678 + if (VMax < dealInfo->ExpectedMax - (ThresholdLimits / 12))
  679 + {
  680 + VMax += (ThresholdLimits / 12); //最大范围右移 1/12个阈值
  681 + }
  682 +
  683 + //ThresholdDiff 阈值差异,计算阈值和灰度均值之间的差值
  684 + //ThresholdDiff 被计算为 VMax - VMin + (ThresholdLimits / 6.0)
  685 + //代表最高和最低灰度值范围之间的差距,再加上阈值的六分之一
  686 + //ThresholdDiff 用于衡量最大最小灰度范围的宽度,以确定是否需要对像素进行进一步处理。
  687 + double ThresholdDiff = VMax - VMin + (ThresholdLimits / 6.0);
  688 +
  689 + int LowThreshold = 0;
  690 + if (AvgGray > (ThresholdDiff / 2.0))
  691 + {
  692 + //a. 如果 AvgGray 大于 ThresholdDiff / 2.0,则将 LowThreshold 的值设为 AvgGray - (ThresholdDiff / 2.0)
  693 + //的无符号整数部分。让 LowThreshold 在保证图像对比度的同时,尽可能地靠近平均灰度值 AvgGray。
  694 + LowThreshold = (unsigned int)(AvgGray - (ThresholdDiff / 2.0));
  695 + }
  696 + else
  697 + {
  698 + //如果 AvgGray 小于等于 ThresholdDiff / 2.0,则将 LowThreshold 的值设为零。
  699 + //避免 LowThreshold 取负值,确保不会对图像的过滤效果产生不良影响。
  700 + LowThreshold = 0;
  701 + }
  702 +
  703 + //重新计算阈值差值
  704 + ThresholdDiff = VMax - LowThreshold;
  705 +
  706 + //避免阈值差值低于阈值限制,
  707 + if (ThresholdDiff < ThresholdLimits)
  708 + {
  709 + ThresholdDiff = ThresholdLimits;
  710 +
  711 + //根据新的阈值差值,重新计算 低阈值
  712 + LowThreshold = (unsigned int)(AvgGray - ThresholdDiff / 2.0);
  713 +
  714 + //最大灰度值与低阈值加上阈值限制之间的差异,如果仍然满足条件
  715 + if (VMax > LowThreshold + ThresholdLimits)
  716 + {
  717 + //重新计算阈值差值
  718 + ThresholdDiff = VMax - LowThreshold;
  719 + }
  720 + }
  721 +
  722 + // 对输入向量进行直方图均衡化处理,并转换为8位灰度值
  723 + for (int i = 0; i < dealInfo->PixelNum; ++i)
  724 + {
  725 + //如果该像素点的灰度值小于最小阈值,使其等于最小阈值
  726 + //确保直方图均衡化的值不会低于设定的阈值,从而保证图像的对比度和亮度的均衡。
  727 + if (in_str[i] < LowThreshold)
  728 + {
  729 + in_str[i] = LowThreshold;
  730 + }
  731 +
  732 + //原始直方图值in_str[i]减去低阈值LowThreshold
  733 + //然后乘以一个缩放系数(dealInfo->ExpectedMax / (ThresholdDiff * 1.0)),将结果赋值回in_str[i]。
  734 + //目的将直方图的灰度值映射到更广的范围,以增强图像的对比度和细节。
  735 + in_str[i] = (unsigned int)((in_str[i] - LowThreshold) * (dealInfo->ExpectedMax / (ThresholdDiff * 1.0)));
  736 +
  737 + //避免超出灰度最大值
  738 + if (in_str[i] > dealInfo->ExpectedMax)
  739 + {
  740 + in_str[i] = dealInfo->ExpectedMax;
  741 + }
  742 + }
  743 +
  744 + // 将均衡化后的灰度值转换为8位,并存储在输出向量中
  745 + //直方图均衡化后的结果进行操作,将每个值转换为8位灰度值。具体操作是将in_str[i]中的值右移(InBits - 8)位
  746 + //然后将结果转换为unsigned char类型,存储到输出向量对应的位置上。这样操作的目的是将原本可能不是8位的灰度值转换为8位灰度值,以便后续的处理和存储。
  747 + for (int i = 0; i < dealInfo->PixelNum; i += 4) {
  748 + (*out_str)[i] = (unsigned char)(in_str[i] >> (dealInfo->ImgDataBits - 8));
  749 + (*out_str)[i + 1] = (unsigned char)(in_str[i + 1] >> (dealInfo->ImgDataBits - 8));
  750 + (*out_str)[i + 2] = (unsigned char)(in_str[i + 2] >> (dealInfo->ImgDataBits - 8));
  751 + (*out_str)[i + 3] = (unsigned char)(in_str[i + 3] >> (dealInfo->ImgDataBits - 8));
  752 + }
  753 +
  754 + *out_str_len = dealInfo->PixelNum;
  755 +
  756 + // 释放动态分配的内存空间
  757 + free(ThisGrayAppendTime);
  758 +
  759 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  760 +}
  761 +
508 762
509 763
510 T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize, 764 T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
@@ -532,8 +786,76 @@ T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize, @@ -532,8 +786,76 @@ T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
532 // 如果打开了两点校正 786 // 如果打开了两点校正
533 if (dealInfo->FrameCorrectMode == IRC_CORRCTION_TPC) 787 if (dealInfo->FrameCorrectMode == IRC_CORRCTION_TPC)
534 { 788 {
  789 + JZIrcLib_TPC(u16_CorrentData, dealInfo);
  790 + }
  791 +
  792 + U8_t *GrayImage = NULL;
  793 + int GrayImageLen = 0;
  794 +
  795 + //直方图
  796 + JZIrcLib_vKT(u16_CorrentData, &GrayImage, &GrayImageLen, dealInfo);
535 797
  798 + //图像输出模式
  799 + // 图像输出模式
  800 + switch (dealInfo->OutputPixelColorMode)
  801 + {
  802 + case 0: // 默认输出模式
  803 + {
  804 + // 灰度图转rgb888
  805 + IRC_GrayTo_RGB(GrayImage, RGB_data, RGB_dataSize, dealInfo);
536 } 806 }
  807 + break;
  808 +
  809 + case 1: // 伪彩输出模式
  810 + {
  811 + // 灰度图转伪彩rgb888
  812 + ret = PseudoColor_Gray2Rgb(GrayImage, RGB_data, RGB_dataSize, dealInfo->PixelNum);
  813 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  814 + {
  815 + IRC_GrayTo_RGB(GrayImage, RGB_data, RGB_dataSize, dealInfo);
  816 + }
  817 + }
  818 + break;
  819 +
  820 + case 2: // 气体色彩增强输出模式
  821 + {
  822 + // 转为rgb
  823 + IRC_GrayTo_RGB(GrayImage, RGB_data, RGB_dataSize, dealInfo);
  824 +
  825 + // 灰度图转气体增强rgb888
  826 + IRC_DynamicGasesColorEnhance(*RGB_data, U16_data, dealInfo);
  827 + }
  828 + break;
  829 +
  830 + default:
  831 + if (u16_CorrentData != NULL)
  832 + {
  833 + free(u16_CorrentData);
  834 + u16_CorrentData = NULL;
  835 + }
  836 +
  837 + if (GrayImage != NULL)
  838 + {
  839 + free(GrayImage);
  840 + GrayImage = NULL;
  841 + }
  842 +
  843 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  844 + break;
  845 + }
  846 +
  847 + if (u16_CorrentData != NULL)
  848 + {
  849 + free(u16_CorrentData);
  850 + u16_CorrentData = NULL;
  851 + }
  852 +
  853 + if (GrayImage != NULL)
  854 + {
  855 + free(GrayImage);
  856 + GrayImage = NULL;
  857 + }
  858 +
537 859
538 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 860 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
539 } 861 }
  1 +/* ********************************************************************
  2 +*
  3 +*
  4 +*
  5 +***********************************************/
  6 +#ifndef JZIRC_LIB_H
  7 +#define JZIRC_LIB_H
  8 +
  9 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  10 +#include "MediaProc/IRC_funtion/IRC_Param.h"
  11 +
  12 +#ifdef __cplusplus
  13 +extern "C" {
  14 +#endif
  15 +
  16 +T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
  17 + U8_t **RGB_data, unsigned int *RGB_dataSize,
  18 + struct IRC_param *dealInfo);
  19 +
  20 +
  21 +#ifdef __cplusplus
  22 +}
  23 +#endif
  24 +
  25 +#endif
1 -#include <stdio.h>  
2 -#include <stdlib.h>  
3 -#include <string.h>  
4 -#include "JZsdkLib.h"  
5 -  
6 -  
7 -#include "../IRC_data_deal/IRC_data_deal.h"  
8 -  
9 -#include "MediaProc/IRC_funtion/IRC_param.h"  
10 -#include "MediaProc/ImageProc/PseudoColor/PseudoColor.h"  
11 -  
12 -  
13 -  
14 -/*计算直方图均衡化并转换为8位灰度值  
15 - U16_t in_str 输入的数据  
16 - int in_str_len 输入的数据长度  
17 - 灰度0为黑色,灰度255为白色  
18 -*/  
19 -static T_JZsdkReturnCode Kt_Irc_Histogram_vKT(U16_t *in_str, U8_t **out_str, int *out_str_len, struct IRC_param *dealInfo)  
20 -{  
21 - //无图像  
22 - if (in_str == NULL || dealInfo == NULL)  
23 - {  
24 - return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;  
25 - }  
26 -  
27 - // 分配输出结果的内存空间  
28 - *out_str = (unsigned char*)malloc(sizeof(unsigned char) * dealInfo->PixelNum);  
29 - if (*out_str == NULL) {  
30 - // 如果内存分配失败,打印错误信息并返回空指针  
31 - JZSDK_LOG_ERROR("Error: Memory allocation failed\n");  
32 - return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;  
33 - }  
34 -  
35 -/**********************************************  
36 - *  
37 - * 获取图像的直方图  
38 - *  
39 - *  
40 - * *****************************************************/  
41 -  
42 - // 初始化变量  
43 - unsigned int ThisPixelGray = 0; //当前处理像素点的灰度值  
44 - long SumAllLegalGray = 0; //存储的总灰度值  
45 -  
46 - // 分配当前灰度值出现次数的内存空间,并初始化为0  
47 - //用于记录每个灰度值在输入向量中出现的次数。具体来说,它是一个无符号整型数组,  
48 - //其索引表示灰度值,数组中的值表示该灰度值在输入向量中出现的次数。  
49 - //在遍历输入向量时,将每个像素的灰度值记录在相应的 ThisGrayAppendTime 数组中。  
50 - //这是直方图均衡化算法中需要用到的一个重要步骤,用于统计每个灰度值的出现次数  
51 - //为保证每一个灰度值都被包括,所以用 dealInfo->ExpectedMax 写长度  
52 - unsigned int* ThisGrayAppendTime = (unsigned int*)calloc(dealInfo->ExpectedMax + 1, sizeof(unsigned int));  
53 - if (ThisGrayAppendTime == NULL) {  
54 - JZSDK_LOG_ERROR("Error: Memory allocation failed\n");  
55 - free(*out_str);  
56 - return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;  
57 - }  
58 -  
59 - // 遍历输入向量,统计各灰度值出现次数和总灰度和  
60 - for (int i = 0; i < dealInfo->PixelNum; ++i)  
61 - {  
62 - //获取本像素点的灰度值,且避免超过最大灰度值  
63 - ThisPixelGray = in_str[i];  
64 - if (ThisPixelGray > dealInfo->ExpectedMax)  
65 - {  
66 - ThisPixelGray = dealInfo->ExpectedMax;  
67 - }  
68 -  
69 - //直方图的 x坐标ThisPixelGray 的y值 即次数+1  
70 - ThisGrayAppendTime[ThisPixelGray]++;  
71 -  
72 - //计算总灰度值  
73 - SumAllLegalGray += ThisPixelGray;  
74 - }  
75 -  
76 -/*  
77 - 注:图像对比度:直方图分布越均匀,图像的对比度越高  
78 - 图像亮度: 直方图分布越靠右(最大值),则亮度越高  
79 -*/  
80 -  
81 -/**********************************************************************************************************/  
82 -  
83 - // 初始化边界值和阈值增益  
84 - unsigned int LowLimit = 0; //用于指定直方图均衡化的最低灰度值范围,通常为0。  
85 - unsigned int HighLimit = 0; //用于指定直方图均衡化的最高灰度值范围,通常为最大灰度值。  
86 - unsigned int VMax = dealInfo->ExpectedMax; //表示输入图像中可能的最大灰度值。  
87 - unsigned int VMin = 0; //通常为0,表示输入图像中可能的最小灰度值。  
88 - unsigned int ThresholdLimits = dealInfo->Gain * dealInfo->ImgDataBits; //阈值参数,是一个根据增益和位深度计算得出的阈值,用于在直方图均衡化时进行限制,确保输出图像的对比度合适。  
89 - double AvgGray = SumAllLegalGray / (dealInfo->PixelNum * 1.0); //平均灰度值,表示输入图像中所有合法灰度值的平均值,用于直方图均衡化算法中计算每个像素点的增益值。  
90 -  
91 - // 计算灰度直方图的边界值,找到合适的灰度范围用于直方图均衡化  
92 - for (int i = 0; i < dealInfo->ExpectedMax; ++i)  
93 - {  
94 - if (LowLimit < dealInfo->LeftDrop) {  
95 - LowLimit += ThisGrayAppendTime[i];  
96 - VMin = i;  
97 - }  
98 - if (HighLimit < (dealInfo->PixelNum - dealInfo->RightDrop))  
99 - {  
100 - HighLimit += ThisGrayAppendTime[i];  
101 - VMax = i;  
102 - }  
103 - }  
104 -  
105 - //(ThresholdLimits / 12) 是一个阈值的限制  
106 - //根据增益和位深度计算得出的阈值,用于在直方图均衡化时进行限制,确保输出图像的对比度合适  
107 -  
108 - //将 VMax 增加 (ThresholdLimits / 12) 的目的是为了保证直方图均衡化后的最高灰度值范围与阈值限制的要求相符,  
109 - //从而确保输出图像的对比度得到合适的控制,并且不会超出预期的范围。  
110 - if (VMax < dealInfo->ExpectedMax - (ThresholdLimits / 12))  
111 - {  
112 - VMax += (ThresholdLimits / 12); //最大范围右移 1/12个阈值  
113 - }  
114 -  
115 - //ThresholdDiff 阈值差异,计算阈值和灰度均值之间的差值  
116 - //ThresholdDiff 被计算为 VMax - VMin + (ThresholdLimits / 6.0)  
117 - //代表最高和最低灰度值范围之间的差距,再加上阈值的六分之一  
118 - //ThresholdDiff 用于衡量最大最小灰度范围的宽度,以确定是否需要对像素进行进一步处理。  
119 - double ThresholdDiff = VMax - VMin + (ThresholdLimits / 6.0);  
120 -  
121 - int LowThreshold = 0;  
122 - if (AvgGray > (ThresholdDiff / 2.0))  
123 - {  
124 - //a. 如果 AvgGray 大于 ThresholdDiff / 2.0,则将 LowThreshold 的值设为 AvgGray - (ThresholdDiff / 2.0)  
125 - //的无符号整数部分。让 LowThreshold 在保证图像对比度的同时,尽可能地靠近平均灰度值 AvgGray。  
126 - LowThreshold = (unsigned int)(AvgGray - (ThresholdDiff / 2.0));  
127 - }  
128 - else  
129 - {  
130 - //如果 AvgGray 小于等于 ThresholdDiff / 2.0,则将 LowThreshold 的值设为零。  
131 - //避免 LowThreshold 取负值,确保不会对图像的过滤效果产生不良影响。  
132 - LowThreshold = 0;  
133 - }  
134 -  
135 - //重新计算阈值差值  
136 - ThresholdDiff = VMax - LowThreshold;  
137 -  
138 - //避免阈值差值低于阈值限制,  
139 - if (ThresholdDiff < ThresholdLimits)  
140 - {  
141 - ThresholdDiff = ThresholdLimits;  
142 -  
143 - //根据新的阈值差值,重新计算 低阈值  
144 - LowThreshold = (unsigned int)(AvgGray - ThresholdDiff / 2.0);  
145 -  
146 - //最大灰度值与低阈值加上阈值限制之间的差异,如果仍然满足条件  
147 - if (VMax > LowThreshold + ThresholdLimits)  
148 - {  
149 - //重新计算阈值差值  
150 - ThresholdDiff = VMax - LowThreshold;  
151 - }  
152 - }  
153 -  
154 - // 对输入向量进行直方图均衡化处理,并转换为8位灰度值  
155 - for (int i = 0; i < dealInfo->PixelNum; ++i)  
156 - {  
157 - //如果该像素点的灰度值小于最小阈值,使其等于最小阈值  
158 - //确保直方图均衡化的值不会低于设定的阈值,从而保证图像的对比度和亮度的均衡。  
159 - if (in_str[i] < LowThreshold)  
160 - {  
161 - in_str[i] = LowThreshold;  
162 - }  
163 -  
164 - //原始直方图值in_str[i]减去低阈值LowThreshold  
165 - //然后乘以一个缩放系数(dealInfo->ExpectedMax / (ThresholdDiff * 1.0)),将结果赋值回in_str[i]。  
166 - //目的将直方图的灰度值映射到更广的范围,以增强图像的对比度和细节。  
167 - in_str[i] = (unsigned int)((in_str[i] - LowThreshold) * (dealInfo->ExpectedMax / (ThresholdDiff * 1.0)));  
168 -  
169 - //避免超出灰度最大值  
170 - if (in_str[i] > dealInfo->ExpectedMax)  
171 - {  
172 - in_str[i] = dealInfo->ExpectedMax;  
173 - }  
174 - }  
175 -  
176 - // 将均衡化后的灰度值转换为8位,并存储在输出向量中  
177 - //直方图均衡化后的结果进行操作,将每个值转换为8位灰度值。具体操作是将in_str[i]中的值右移(InBits - 8)位  
178 - //然后将结果转换为unsigned char类型,存储到输出向量对应的位置上。这样操作的目的是将原本可能不是8位的灰度值转换为8位灰度值,以便后续的处理和存储。  
179 - for (int i = 0; i < dealInfo->PixelNum; i += 4) {  
180 - (*out_str)[i] = (unsigned char)(in_str[i] >> (dealInfo->ImgDataBits - 8));  
181 - (*out_str)[i + 1] = (unsigned char)(in_str[i + 1] >> (dealInfo->ImgDataBits - 8));  
182 - (*out_str)[i + 2] = (unsigned char)(in_str[i + 2] >> (dealInfo->ImgDataBits - 8));  
183 - (*out_str)[i + 3] = (unsigned char)(in_str[i + 3] >> (dealInfo->ImgDataBits - 8));  
184 - }  
185 -  
186 - *out_str_len = dealInfo->PixelNum;  
187 -  
188 - // 释放动态分配的内存空间  
189 - free(ThisGrayAppendTime);  
190 -  
191 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
192 -}  
193 -  
194 -/******  
195 - *  
196 - * 两点矫正  
197 - *  
198 - *  
199 - * *****/  
200 -T_JZsdkReturnCode Kt_Irc_TPC(U16_t *ImageData,struct IRC_param *dealInfo)  
201 -{  
202 - //无图像  
203 - if (ImageData == NULL || dealInfo == NULL)  
204 - {  
205 - return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;  
206 - }  
207 -  
208 - // 如果tpc的斜率和tpc的截距都为0,重新计算斜率与斜距  
209 - int allZeroSlope_flag = 1, allZeroDiff_flag = 1;  
210 - for (int i = 0; i < dealInfo->PixelNum; i++)  
211 - {  
212 - if (dealInfo->TPC_Slope[i] != 0)  
213 - {  
214 - allZeroSlope_flag = 0;  
215 - }  
216 - if (dealInfo->TPC_Diff[i] != 0) {  
217 - allZeroDiff_flag = 0;  
218 - }  
219 - }  
220 -  
221 - //如果出现tpc的斜率和tpc的截距都为0,重新计算斜率与斜距  
222 - if (allZeroSlope_flag && allZeroDiff_flag)  
223 - {  
224 - double AvgSingleFrame_LowT = 0, AvgSingleFrame_HighT = 0;  
225 -  
226 - for (int i = 0; i < dealInfo->PixelNum; i++)  
227 - {  
228 - AvgSingleFrame_LowT += dealInfo->LowT_NineFrame_Avg[i];  
229 - AvgSingleFrame_HighT += dealInfo->HighT_NineFrame_Avg[i];  
230 - }  
231 -  
232 - AvgSingleFrame_LowT = AvgSingleFrame_LowT / dealInfo->PixelNum;  
233 - AvgSingleFrame_HighT = AvgSingleFrame_HighT / dealInfo->PixelNum;  
234 -  
235 - for (int i = 0; i < dealInfo->PixelNum; i++)  
236 - {  
237 - if (dealInfo->HighT_NineFrame_Avg[i] > dealInfo->LowT_NineFrame_Avg[i])  
238 - {  
239 - dealInfo->TPC_Slope[i] = (AvgSingleFrame_HighT - AvgSingleFrame_LowT) / (dealInfo->HighT_NineFrame_Avg[i] - dealInfo->LowT_NineFrame_Avg[i]);  
240 - }  
241 - else  
242 - {  
243 - dealInfo->TPC_Slope[i] = 0;  
244 - }  
245 - dealInfo->TPC_Diff[i] = AvgSingleFrame_LowT - dealInfo->TPC_Slope[i] * dealInfo->LowT_NineFrame_Avg[i];  
246 - }  
247 - }  
248 -  
249 - // 应用两点校正公式  
250 - for (int i = 0; i < dealInfo->PixelNum; i++)  
251 - {  
252 - ImageData[i] = (int)(dealInfo->TPC_Slope[i] * ImageData[i] + dealInfo->TPC_Diff[i]);  
253 - if (ImageData[i] < 0)  
254 - {  
255 - ImageData[i] = 0;  
256 - }  
257 - else if (ImageData[i] > dealInfo->ExpectedMax)  
258 - {  
259 - ImageData[i] = dealInfo->ExpectedMax;  
260 - }  
261 - }  
262 -  
263 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; // 返回校正后的灰度数组  
264 -}  
@@ -43,7 +43,7 @@ T_JZsdkReturnCode MediaProc_Init() @@ -43,7 +43,7 @@ T_JZsdkReturnCode MediaProc_Init()
43 VideoStreamTransCode_Init(); 43 VideoStreamTransCode_Init();
44 44
45 //5、打开默认选项 45 //5、打开默认选项
46 - VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND); //默认推送光学摄像头 46 + VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送光学摄像头
47 JZsdk_Kt_Irc_ShutterSwitch(JZ_FLAGCODE_ON); 47 JZsdk_Kt_Irc_ShutterSwitch(JZ_FLAGCODE_ON);
48 48
49 //6、修改部分参数 49 //6、修改部分参数
@@ -35,6 +35,7 @@ T_JZsdkReturnCode AudioFile_StartPlay_Interface(unsigned char* FilePath) @@ -35,6 +35,7 @@ T_JZsdkReturnCode AudioFile_StartPlay_Interface(unsigned char* FilePath)
35 AVCodecContext *codec_ctx = NULL; 35 AVCodecContext *codec_ctx = NULL;
36 36
37 double total_duration = 0; // 累计播放时间(秒) 37 double total_duration = 0; // 累计播放时间(秒)
  38 + int last_printed_second = -1; // 上次打印的秒数,初始化为-1表示还没有打印过
38 39
39 //3、创建一个音频上下文 40 //3、创建一个音频上下文
40 AVFormatContext *fmt_ctx = avformat_alloc_context(); 41 AVFormatContext *fmt_ctx = avformat_alloc_context();
@@ -157,9 +158,14 @@ T_JZsdkReturnCode AudioFile_StartPlay_Interface(unsigned char* FilePath) @@ -157,9 +158,14 @@ T_JZsdkReturnCode AudioFile_StartPlay_Interface(unsigned char* FilePath)
157 // 累计总持续时间 158 // 累计总持续时间
158 total_duration += frame_duration; 159 total_duration += frame_duration;
159 //JZSDK_LOG_INFO("当前播放时间%f",total_duration); 160 //JZSDK_LOG_INFO("当前播放时间%f",total_duration);
160 - if (Last_duration != (int)total_duration) 161 +
  162 +
  163 + // 检查是否需要打印
  164 + int current_second = (int)floor(total_duration); // 获取当前总时间的整数秒部分
  165 + if (current_second > last_printed_second)
161 { 166 {
162 - printf("nb:%d rate:%d duration:%f total_duration:%f\n", frame->nb_samples, codec_ctx->sample_rate, frame_duration, total_duration); 167 + printf("nb:%d rate:%d duration:%f total_duration:%f\n", frame->nb_samples, codec_ctx->sample_rate, frame_duration, current_second);
  168 + last_printed_second = current_second; // 更新上次打印的秒数
163 } 169 }
164 170
165 AudioFile_Stream_DataInput(frame); 171 AudioFile_Stream_DataInput(frame);
@@ -872,7 +872,7 @@ T_JZsdkReturnCode Megaphone_Init() @@ -872,7 +872,7 @@ T_JZsdkReturnCode Megaphone_Init()
872 int language = 0x01; 872 int language = 0x01;
873 Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language); 873 Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
874 } 874 }
875 - else if (OriginValue == ORIGIN_EN) 875 + else
876 { 876 {
877 int language = 0x11; 877 int language = 0x11;
878 Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language); 878 Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
@@ -1317,7 +1317,7 @@ T_JZsdkReturnCode Meg_SetVolumeFun(int volume) @@ -1317,7 +1317,7 @@ T_JZsdkReturnCode Meg_SetVolumeFun(int volume)
1317 { 1317 {
1318 snprintf(cmdBuffer,128, "amixer set -c 0 Master %d",volume); 1318 snprintf(cmdBuffer,128, "amixer set -c 0 Master %d",volume);
1319 } 1319 }
1320 - else if (DEVICE_VERSION == JZ_H10T || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D) 1320 + else if (DEVICE_VERSION == JZ_H10T || DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
1321 { 1321 {
1322 snprintf(cmdBuffer,128, "amixer sset -c 0 'Headphone' %d unmute",volume); 1322 snprintf(cmdBuffer,128, "amixer sset -c 0 'Headphone' %d unmute",volume);
1323 } 1323 }
@@ -26,7 +26,7 @@ T_JZsdkReturnCode Start_voice() @@ -26,7 +26,7 @@ T_JZsdkReturnCode Start_voice()
26 //播放喊话器启动中 26 //播放喊话器启动中
27 Megaphone_TTS_Play("喊话器直连模式启动中", strlen("喊话器直连模式启动中"), JZ_FLAGCODE_OFF); 27 Megaphone_TTS_Play("喊话器直连模式启动中", strlen("喊话器直连模式启动中"), JZ_FLAGCODE_OFF);
28 } 28 }
29 - else if (OriginValue == ORIGIN_EN) 29 + else
30 { 30 {
31 int language = 0x11; 31 int language = 0x11;
32 Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language); 32 Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
@@ -34,6 +34,7 @@ T_JZsdkReturnCode Start_voice() @@ -34,6 +34,7 @@ T_JZsdkReturnCode Start_voice()
34 //播放喊话器启动中 34 //播放喊话器启动中
35 Megaphone_TTS_Play("The direct connection mode of the speaker is being activated", strlen("The direct connection mode of the speaker is being activated"), JZ_FLAGCODE_OFF); 35 Megaphone_TTS_Play("The direct connection mode of the speaker is being activated", strlen("The direct connection mode of the speaker is being activated"), JZ_FLAGCODE_OFF);
36 36
  37 + delayS(2);
37 } 38 }
38 39
39 delayS(4); 40 delayS(4);
@@ -55,7 +56,7 @@ T_JZsdkReturnCode Start_up_and_broadcast_voice() @@ -55,7 +56,7 @@ T_JZsdkReturnCode Start_up_and_broadcast_voice()
55 //播放喊话器启动中 56 //播放喊话器启动中
56 Megaphone_TTS_Play("喊话器准备就绪", strlen("喊话器准备就绪"), JZ_FLAGCODE_OFF); 57 Megaphone_TTS_Play("喊话器准备就绪", strlen("喊话器准备就绪"), JZ_FLAGCODE_OFF);
57 } 58 }
58 - else if (OriginValue == ORIGIN_EN) 59 + else
59 { 60 {
60 int language = 0x11; 61 int language = 0x11;
61 Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language); 62 Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
@@ -95,7 +96,7 @@ T_JZsdkReturnCode Start_up_and_broadcast_voice() @@ -95,7 +96,7 @@ T_JZsdkReturnCode Start_up_and_broadcast_voice()
95 //播放喊话器启动中 96 //播放喊话器启动中
96 Megaphone_TTS_Play("喊话器直连模式准备就绪", strlen("喊话器直连模式准备就绪"), JZ_FLAGCODE_OFF); 97 Megaphone_TTS_Play("喊话器直连模式准备就绪", strlen("喊话器直连模式准备就绪"), JZ_FLAGCODE_OFF);
97 } 98 }
98 - else if (OriginValue == ORIGIN_EN) 99 + else
99 { 100 {
100 int language = 0x11; 101 int language = 0x11;
101 Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language); 102 Megaphone_TTS_param(JZ_FLAGCODE_SET, MEGAPHONE_TTS_TONE, &language);
@@ -56,7 +56,8 @@ static T_JZsdkReturnCode TTS_Synthesis(const char* src_text, const char* params) @@ -56,7 +56,8 @@ static T_JZsdkReturnCode TTS_Synthesis(const char* src_text, const char* params)
56 while (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON) 56 while (Megaphone_MegDataGenFlag(JZ_FLAGCODE_GET, 0) == JZ_FLAGCODE_ON)
57 { 57 {
58 /* 获取合成音频 */ 58 /* 获取合成音频 */
59 - const void* data = QTTSAudioGet(sessionID, &audio_len, &synth_status, &ret); 59 + //const void* data = QTTSAudioGet(sessionID, &audio_len, &synth_status, &ret);
  60 + unsigned char *data = QTTSAudioGet(sessionID, &audio_len, &synth_status, &ret);
60 if (ret != MSP_SUCCESS) 61 if (ret != MSP_SUCCESS)
61 { 62 {
62 break; 63 break;
@@ -68,6 +69,26 @@ static T_JZsdkReturnCode TTS_Synthesis(const char* src_text, const char* params) @@ -68,6 +69,26 @@ static T_JZsdkReturnCode TTS_Synthesis(const char* src_text, const char* params)
68 #if TTS_SAVE 69 #if TTS_SAVE
69 fwrite((unsigned char *)data, sizeof(unsigned char), audio_len, fp); // 写入数据 70 fwrite((unsigned char *)data, sizeof(unsigned char), audio_len, fp); // 写入数据
70 #endif 71 #endif
  72 + // //降噪
  73 + // if (1)
  74 + // {
  75 + // //降噪处理
  76 + // //把数据组成一个数组
  77 + // short TempPcm;
  78 + // for (int i = 0; i < audio_len; i+=2)
  79 + // {
  80 + // TempPcm = ( data[i] & 0xFF) | ((short)data[i+1] << 8);
  81 + // TempPcm = PcmNoiseReduction(TempPcm);
  82 + // data[i] = TempPcm & 0xFF;
  83 + // data[i+1] = (TempPcm >> 8) & 0xFF;
  84 +
  85 + // // TempPcm = (data[i+1] & 0xFF) | ((short)data[i] << 8);
  86 + // // TempPcm = PcmNoiseReduction(TempPcm);
  87 + // // data[i+1] = TempPcm & 0xFF;
  88 + // // data[i] = (TempPcm >> 8) & 0xFF;
  89 + // }
  90 + // }
  91 +
71 //没将数据放入PCM通道 92 //没将数据放入PCM通道
72 //printf("产生了%d 的数据\n",audio_len); 93 //printf("产生了%d 的数据\n",audio_len);
73 AudioDeal_PcmDataInput(16000, (unsigned char *)data, audio_len); 94 AudioDeal_PcmDataInput(16000, (unsigned char *)data, audio_len);
@@ -58,6 +58,9 @@ extern "C" { @@ -58,6 +58,9 @@ extern "C" {
58 #elif DEVICE_VERSION == JZ_U3D 58 #elif DEVICE_VERSION == JZ_U3D
59 #define MAX_VOLUME (80) 59 #define MAX_VOLUME (80)
60 #define MAX_TTS_VOLUME (90) 60 #define MAX_TTS_VOLUME (90)
  61 +#elif DEVICE_VERSION == JZ_U30
  62 + #define MAX_VOLUME (80)
  63 + #define MAX_TTS_VOLUME (90)
61 #elif DEVICE_VERSION == JZ_U3S 64 #elif DEVICE_VERSION == JZ_U3S
62 #define MAX_VOLUME (74) 65 #define MAX_VOLUME (74)
63 #define MAX_TTS_VOLUME (82) 66 #define MAX_TTS_VOLUME (82)
@@ -170,9 +170,15 @@ static T_JZsdkReturnCode Opus_RealTimeVoice_PlayData(unsigned char *data,int len @@ -170,9 +170,15 @@ static T_JZsdkReturnCode Opus_RealTimeVoice_PlayData(unsigned char *data,int len
170 } 170 }
171 171
172 //转换 172 //转换
173 - for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++) {  
174 - pcm_bytes[2 * i] = out[i] & 0xFF;  
175 - pcm_bytes[2 * i + 1] = (out[i] >> 8) & 0xFF; 173 + opus_int16 TempPcm[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS];
  174 +
  175 + for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++)
  176 + {
  177 + TempPcm [i] = out[i] & 0xFF | (out[i] >> 8) << 8;
  178 + TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
  179 +
  180 + pcm_bytes[2 * i] = TempPcm[i] & 0xFF;
  181 + pcm_bytes[2 * i + 1] = (TempPcm[i] >> 8) & 0xFF;
176 } 182 }
177 183
178 AudioDeal_PcmDataInput(RealTimeDecodeRate, pcm_bytes, frame_size*2); 184 AudioDeal_PcmDataInput(RealTimeDecodeRate, pcm_bytes, frame_size*2);
@@ -391,7 +391,8 @@ static T_JZsdkReturnCode Opus_Decode() @@ -391,7 +391,8 @@ static T_JZsdkReturnCode Opus_Decode()
391 while (1) 391 while (1)
392 { 392 {
393 int i; 393 int i;
394 - unsigned char pcm_bytes[OPUS_MAX_FRAME_SIZE * OPUS_CHANNELS * 2]; 394 + opus_int16 TempPcm[OPUS_MAX_FRAME_SIZE * OPUS_CHANNELS];
  395 +
395 frame_size = 0; 396 frame_size = 0;
396 397
397 //读取opus内容 398 //读取opus内容
@@ -419,13 +420,14 @@ static T_JZsdkReturnCode Opus_Decode() @@ -419,13 +420,14 @@ static T_JZsdkReturnCode Opus_Decode()
419 //解码完成 420 //解码完成
420 printf("decode data to file: %d\r\n", frame_size * OPUS_CHANNELS); 421 printf("decode data to file: %d\r\n", frame_size * OPUS_CHANNELS);
421 /* Convert to little-endian ordering. */ 422 /* Convert to little-endian ordering. */
  423 +
422 for (i = 0; i < OPUS_CHANNELS * frame_size; i++) { 424 for (i = 0; i < OPUS_CHANNELS * frame_size; i++) {
423 - pcm_bytes[2 * i] = out[i] & 0xFF;  
424 - pcm_bytes[2 * i + 1] = (out[i] >> 8) & 0xFF; 425 + TempPcm [i] = out[i] & 0xFF | (out[i] >> 8) << 8;
  426 + TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
425 } 427 }
426 428
427 - //保存解码内容  
428 - fwrite(pcm_bytes, sizeof(short), frame_size * OPUS_CHANNELS, fout); 429 + fwrite(TempPcm, sizeof(short), frame_size * OPUS_CHANNELS, fout);
  430 +
429 } 431 }
430 432
431 DecodeFinsh: 433 DecodeFinsh:
@@ -469,7 +469,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(int flag, int @@ -469,7 +469,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(int flag, int
469 //输入亮度 469 //输入亮度
470 if (flag == 0) 470 if (flag == 0)
471 { 471 {
472 - if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D) 472 + if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
473 { 473 {
474 if (value + widget_volume > 150) 474 if (value + widget_volume > 150)
475 { 475 {
@@ -480,7 +480,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(int flag, int @@ -480,7 +480,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_LumenAndVolume_PowerLimitation(int flag, int
480 //输入音量 480 //输入音量
481 else if (flag == 1) 481 else if (flag == 1)
482 { 482 {
483 - if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D) 483 + if (DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
484 { 484 {
485 if (value + widget_lumen > 150 ) 485 if (value + widget_lumen > 150 )
486 { 486 {
@@ -617,7 +617,7 @@ int JZsdk_Psdk_UI_io_GetTTSTone_ByValue(int value) @@ -617,7 +617,7 @@ int JZsdk_Psdk_UI_io_GetTTSTone_ByValue(int value)
617 617
618 } 618 }
619 619
620 - if (OriginValue == ORIGIN_EN) 620 + else
621 { 621 {
622 switch (value) 622 switch (value)
623 { 623 {
@@ -1007,7 +1007,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_SearchLightLumen(int wheather_control,int @@ -1007,7 +1007,7 @@ T_JZsdkReturnCode JZsdk_Psdk_UI_io_Set_SearchLightLumen(int wheather_control,int
1007 if (wheather_control == AUTO_CONTROL) 1007 if (wheather_control == AUTO_CONTROL)
1008 { 1008 {
1009 //u3比较特殊,单片机拉亮度,u3会亮,所以关闭灯的情况下,不准发给处理模块 1009 //u3比较特殊,单片机拉亮度,u3会亮,所以关闭灯的情况下,不准发给处理模块
1010 - if ((DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D)&& SearchLightMode == JZ_FLAGCODE_OFF) 1010 + if ((DEVICE_VERSION == JZ_U3 || DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)&& SearchLightMode == JZ_FLAGCODE_OFF)
1011 { 1011 {
1012 Lumen_sync_flag = JZ_FLAGCODE_ON; //打开u3的同步flag 1012 Lumen_sync_flag = JZ_FLAGCODE_ON; //打开u3的同步flag
1013 ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 1013 ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
1 -#更新日志 1 +功能表
  2 +
  3 +U3: 云台+喊话器+探照灯
  4 +U3S: 云台+喊话器+探照灯+激光+爆闪灯
  5 +U3D:云台+喊话器+探照灯+爆闪灯
  6 +U30:云台+喊话器+探照灯+爆闪灯
  7 +
  8 +H10:云台+喊话器
  9 +H10T:云台+喊话器+4G+对外供电
  10 +
  11 +H150S:云台+喊话器+摄像头
  12 +H150T:云台+喊话器+4G+摄像头
  13 +
  14 +H1E:喊话器
  15 +H1T:喊话器+4G
  16 +
  17 +A1:喊话器+探照灯
  18 +
  19 +C1:红外相机+摄像头
1 -# 2024年8月21日  
2 - 潘浩彬:创建了git目录,及工程的更新功能  
  1 +# 2024年8月21日
  2 + 潘浩彬:创建了git目录,及工程的更新功能
  3 +
  4 +# 版本0.0.2.6
  5 +# 2024年9月2日
  6 + 潘浩彬:0.0.2.6 更新云台内容,并且更新了滤波
  7 +
  8 +# 版本0.0.2.7
  9 +# 2024年9月25日
  10 + 潘浩彬:
  11 +1、更新了红外相机kt库
  12 +2、更新了m30滤波
  13 +3、增加文件信息帧
  14 +4、修改了部分型号的音量
  15 +5、增加了外置的超时输入
  16 +6、增加了文件校验功能
  17 +7、优化了喊话器温控后音量跳转的问题
  18 +
@@ -187,7 +187,7 @@ static const T_DjiWidgetHandlerListItem s_widgetHandlerList[] = { @@ -187,7 +187,7 @@ static const T_DjiWidgetHandlerListItem s_widgetHandlerList[] = {
187 }; 187 };
188 188
189 static const uint32_t s_widgetHandlerListCount = sizeof(s_widgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem); 189 static const uint32_t s_widgetHandlerListCount = sizeof(s_widgetHandlerList) / sizeof(T_DjiWidgetHandlerListItem);
190 -int32_t s_widgetValueList[] = {VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND, //视频流 190 +int32_t s_widgetValueList[] = {VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST, //视频流
191 OFF, //测温模式 191 OFF, //测温模式
192 ON, //光圈开关 192 ON, //光圈开关
193 OFF, //冻结开关 193 OFF, //冻结开关
@@ -239,15 +239,15 @@ T_DjiReturnCode DjiTest_WidgetStartService(void) @@ -239,15 +239,15 @@ T_DjiReturnCode DjiTest_WidgetStartService(void)
239 { 239 {
240 snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/cn",WIDGET_FILE_DIR); 240 snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/cn",WIDGET_FILE_DIR);
241 } 241 }
242 - else if (originValue == ORIGIN_EN)  
243 - {  
244 - snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/en",WIDGET_FILE_DIR);  
245 - }  
246 else 242 else
247 { 243 {
248 - JZSDK_LOG_ERROR("控件加载错误");  
249 - snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/cn",WIDGET_FILE_DIR); 244 + snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/en",WIDGET_FILE_DIR);
250 } 245 }
  246 + // else
  247 + // {
  248 + // JZSDK_LOG_ERROR("控件加载错误");
  249 + // snprintf(curFileDirPath, WIDGET_DIR_PATH_LEN_MAX, "%s/cn",WIDGET_FILE_DIR);
  250 + // }
251 251
252 //检查是否存在开启测试的文件 252 //检查是否存在开启测试的文件
253 if (JZsdk_check_file_exists("/root/ShakedownTest") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 253 if (JZsdk_check_file_exists("/root/ShakedownTest") == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
@@ -257,7 +257,8 @@ static void *DecodeAudioData_task(void *arg) @@ -257,7 +257,8 @@ static void *DecodeAudioData_task(void *arg)
257 257
258 while (1) { 258 while (1) {
259 int i; 259 int i;
260 - unsigned char pcm_bytes[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * 2]; 260 + //unsigned char pcm_bytes[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * 2];
  261 + opus_int16 TempPcm[WIDGET_SPEAKER_AUDIO_OPUS_MAX_FRAME_SIZE * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS];
261 int frame_size; 262 int frame_size;
262 263
263 /* Read a 16 bits/sample audio frame. 16000/8000*2 */ 264 /* Read a 16 bits/sample audio frame. 16000/8000*2 */
@@ -283,12 +284,16 @@ static void *DecodeAudioData_task(void *arg) @@ -283,12 +284,16 @@ static void *DecodeAudioData_task(void *arg)
283 284
284 USER_LOG_INFO("decode data to file: %d\r\n", frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS); 285 USER_LOG_INFO("decode data to file: %d\r\n", frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS);
285 /* Convert to little-endian ordering. */ 286 /* Convert to little-endian ordering. */
  287 +
286 for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++) { 288 for (i = 0; i < WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS * frame_size; i++) {
287 - pcm_bytes[2 * i] = out[i] & 0xFF;  
288 - pcm_bytes[2 * i + 1] = (out[i] >> 8) & 0xFF; 289 + TempPcm [i] = out[i] & 0xFF | (out[i] >> 8) << 8;
  290 + TempPcm[i] = PcmNoiseReduction(TempPcm[i]);
289 } 291 }
  292 +
  293 + fwrite(TempPcm, sizeof(short), frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS, fout);
  294 +
290 /* Write the decoded audio to file. */ 295 /* Write the decoded audio to file. */
291 - fwrite(pcm_bytes, sizeof(short), frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS, fout); 296 + //fwrite(pcm_bytes, sizeof(short), frame_size * WIDGET_SPEAKER_AUDIO_OPUS_CHANNELS, fout);
292 } 297 }
293 298
294 299
@@ -87,7 +87,8 @@ T_DjiReturnCode DjiTest_XPortStartService(void) @@ -87,7 +87,8 @@ T_DjiReturnCode DjiTest_XPortStartService(void)
87 } 87 }
88 88
89 limitAngle.upperLimit = 300; 89 limitAngle.upperLimit = 300;
90 - limitAngle.lowerLimit = -1000; 90 + //limitAngle.lowerLimit = -1000;
  91 + limitAngle.lowerLimit = -350;
91 djiStat = DjiXPort_SetLimitAngleSync(DJI_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_JOINT_ANGLE, limitAngle); 92 djiStat = DjiXPort_SetLimitAngleSync(DJI_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_JOINT_ANGLE, limitAngle);
92 if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { 93 if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
93 USER_LOG_ERROR("set pitch joint angle limit angle for XPort error: 0x%08llX.", djiStat); 94 USER_LOG_ERROR("set pitch joint angle limit angle for XPort error: 0x%08llX.", djiStat);
@@ -96,6 +97,7 @@ T_DjiReturnCode DjiTest_XPortStartService(void) @@ -96,6 +97,7 @@ T_DjiReturnCode DjiTest_XPortStartService(void)
96 97
97 limitAngle.upperLimit = 300; 98 limitAngle.upperLimit = 300;
98 limitAngle.lowerLimit = -800; 99 limitAngle.lowerLimit = -800;
  100 + //limitAngle.lowerLimit = -300;
99 djiStat = DjiXPort_SetLimitAngleSync(DJI_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_EULER_ANGLE, limitAngle); 101 djiStat = DjiXPort_SetLimitAngleSync(DJI_XPORT_LIMIT_ANGLE_CATEGORY_PITCH_EULER_ANGLE, limitAngle);
100 if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) { 102 if (djiStat != DJI_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
101 USER_LOG_ERROR("set pitch euler angle limit angle for XPort error: 0x%08llX.", djiStat); 103 USER_LOG_ERROR("set pitch euler angle limit angle for XPort error: 0x%08llX.", djiStat);
1 # cmake 最低版本要求 第三行名字不能动 1 # cmake 最低版本要求 第三行名字不能动
2 cmake_minimum_required(VERSION 2.8) 2 cmake_minimum_required(VERSION 2.8)
3 -project(JZ_U3S) 3 +project(JZ_C1)
4 4
5 set(CMAKE_C_FLAGS "-pthread -std=gnu99 -lm -ldl -lstdc++") 5 set(CMAKE_C_FLAGS "-pthread -std=gnu99 -lm -ldl -lstdc++")
6 #"-pthread":指定在编译时链接POSIX线程库,以支持多线程程序。 6 #"-pthread":指定在编译时链接POSIX线程库,以支持多线程程序。
@@ -52,7 +52,7 @@ extern "C" { @@ -52,7 +52,7 @@ extern "C" {
52 #define USER_APP_LICENSE "qHRtELC2A04PRBt1xOJ1pqkowJ2OZqwdAUPqOVc7WcWwVIR3Fnadjakhl0i7F1wnFNUKELlDLaDsCYLIhkzOd0kDPQcCksVk3Dla498xLD3Z1b5BcI+hlZXETwTmi+7Td0k1E3Rnt9OPGdqrA8W9mBg333EGGjARFGDfaK2BHhDexUE8yLoVhwkqk3t/0wV8kbyrlZzKsvo0kMUifbALCoLPoCO622Rdu056z+opYUX1OlXCGhDxVSDD43Oaab5bupcC4CGrmkpfiCvS78H7Uinc9b9Xf5Ocy373Cpoet7blux66DOiH5muSQVcrY3gnVKQVk7GRnO6piQh9mKHDdQ==" 52 #define USER_APP_LICENSE "qHRtELC2A04PRBt1xOJ1pqkowJ2OZqwdAUPqOVc7WcWwVIR3Fnadjakhl0i7F1wnFNUKELlDLaDsCYLIhkzOd0kDPQcCksVk3Dla498xLD3Z1b5BcI+hlZXETwTmi+7Td0k1E3Rnt9OPGdqrA8W9mBg333EGGjARFGDfaK2BHhDexUE8yLoVhwkqk3t/0wV8kbyrlZzKsvo0kMUifbALCoLPoCO622Rdu056z+opYUX1OlXCGhDxVSDD43Oaab5bupcC4CGrmkpfiCvS78H7Uinc9b9Xf5Ocy373Cpoet7blux66DOiH5muSQVcrY3gnVKQVk7GRnO6piQh9mKHDdQ=="
53 #define USER_DEVELOPER_ACCOUNT "jizhisdk@163.com" 53 #define USER_DEVELOPER_ACCOUNT "jizhisdk@163.com"
54 54
55 - #if (DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_U3|| DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D) 55 + #if (DEVICE_VERSION == JZ_H1T || DEVICE_VERSION == JZ_H1E || DEVICE_VERSION == JZ_U3|| DEVICE_VERSION == JZ_U3S || DEVICE_VERSION == JZ_U3D || DEVICE_VERSION == JZ_U30)
56 #define USER_BAUD_RATE "921600" 56 #define USER_BAUD_RATE "921600"
57 #elif (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T || DEVICE_VERSION == JZ_H10 || DEVICE_VERSION == JZ_C1) 57 #elif (DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T || DEVICE_VERSION == JZ_H10 || DEVICE_VERSION == JZ_C1)
58 #define USER_BAUD_RATE "230400" 58 #define USER_BAUD_RATE "230400"
@@ -222,10 +222,6 @@ int main(int argc, char *argv[]) @@ -222,10 +222,6 @@ int main(int argc, char *argv[])
222 { 222 {
223 memcpy(psdk_name, "JZ_H1T", sizeof("JZ_H1T")); 223 memcpy(psdk_name, "JZ_H1T", sizeof("JZ_H1T"));
224 } 224 }
225 - else if (originValue == ORIGIN_EN)  
226 - {  
227 - memcpy(psdk_name, "JZ-H1T", sizeof("JZ-H1T"));  
228 - }  
229 else 225 else
230 { 226 {
231 memcpy(psdk_name, "JZ_H1T", sizeof("JZ_H1T")); 227 memcpy(psdk_name, "JZ_H1T", sizeof("JZ_H1T"));
@@ -244,29 +240,16 @@ int main(int argc, char *argv[]) @@ -244,29 +240,16 @@ int main(int argc, char *argv[])
244 } 240 }
245 else if (DEVICE_VERSION == JZ_U3S) 241 else if (DEVICE_VERSION == JZ_U3S)
246 { 242 {
247 - if (originValue == ORIGIN_DEFAULT || originValue == ORIGIN_CN)  
248 - {  
249 - memcpy(psdk_name, "JZ_U3S", sizeof("JZ_U3S"));  
250 - }  
251 - else if (originValue == ORIGIN_EN)  
252 - {  
253 - memcpy(psdk_name, "JZ-U3S", sizeof("JZ-U3S"));  
254 - }  
255 - else  
256 - {  
257 memcpy(psdk_name, "JZ_U3S", sizeof("JZ_U3S")); 243 memcpy(psdk_name, "JZ_U3S", sizeof("JZ_U3S"));
258 - } 244 +
259 } 245 }
260 else if (DEVICE_VERSION == JZ_U3D) 246 else if (DEVICE_VERSION == JZ_U3D)
261 { 247 {
262 - if (FIRMWARE_ORIGIN == OVERSEAS_VERSION)  
263 - {  
264 - memcpy(psdk_name, "JZ-U3D", sizeof("JZ-U3D"));  
265 - }  
266 - else if (FIRMWARE_ORIGIN == DOMESTIC_VERSION)  
267 - {  
268 memcpy(psdk_name, "JZ_U3D", sizeof("JZ_U3D")); 248 memcpy(psdk_name, "JZ_U3D", sizeof("JZ_U3D"));
269 } 249 }
  250 + else if (DEVICE_VERSION == JZ_U30)
  251 + {
  252 + memcpy(psdk_name, "JZ_U30", sizeof("JZ_U30"));
270 } 253 }
271 254
272 255