作者 潘浩彬

合并分支 'dev' 到 'master'

Dev



查看合并请求 !11
正在显示 48 个修改的文件 包含 2429 行增加1227 行删除

要显示太多修改。

为保证性能只显示 48 of 48+ 个文件。

@@ -56,7 +56,23 @@ @@ -56,7 +56,23 @@
56 "mediaparm.h": "c", 56 "mediaparm.h": "c",
57 "videostream_push.h": "c", 57 "videostream_push.h": "c",
58 "v4l2_record.h": "c", 58 "v4l2_record.h": "c",
59 - "deviceinfo.h": "c" 59 + "deviceinfo.h": "c",
  60 + "mediaproc.h": "c",
  61 + "jzsdk_network.h": "c",
  62 + "kt_irc.h": "c",
  63 + "rtk_mmp_dec.h": "c",
  64 + "rtk_mmp_enc.h": "c",
  65 + "videostreamtranscode.h": "c",
  66 + "time.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"
60 }, 76 },
61 "Codegeex.GenerationPreference": "automatic", 77 "Codegeex.GenerationPreference": "automatic",
62 "C_Cpp.dimInactiveRegions": false 78 "C_Cpp.dimInactiveRegions": false
1 # 编译链的配置 1 # 编译链的配置
2 2
3 #1、编译链与设备类型的选择 3 #1、编译链与设备类型的选择
4 -set(DEVICE_NAME JZ_H150S) 4 +set(DEVICE_NAME JZ_U3S)
5 #上一行为禁止修改行 5 #上一行为禁止修改行
6 6
7 message("**************************JZSDK构建编译开始***************************\n") 7 message("**************************JZSDK构建编译开始***************************\n")
@@ -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
@@ -40,6 +41,13 @@ if(${DEVICE_INFO_MODULE} STREQUAL "VERSION_SWITCH_ON") @@ -40,6 +41,13 @@ if(${DEVICE_INFO_MODULE} STREQUAL "VERSION_SWITCH_ON")
40 41
41 endif() 42 endif()
42 43
  44 +#如果要加载设备配置
  45 +if(${DEVICE_CONFIG_MODULE} STREQUAL "VERSION_SWITCH_ON")
  46 + message("\n设备配置源码加载中")
  47 + file(GLOB_RECURSE DEVICE_CONFOG_SRC ${ROOT_DIRS}Module/DeviceConfig/*.c)
  48 + list(APPEND ALL_SRC_FILES ${DEVICE_CONFOG_SRC})
  49 +endif()
  50 +
43 #如果要加载云台模块,需要加载以下附属内容 51 #如果要加载云台模块,需要加载以下附属内容
44 if(${GIMBAL_MODULE} STREQUAL "VERSION_SWITCH_ON") 52 if(${GIMBAL_MODULE} STREQUAL "VERSION_SWITCH_ON")
45 message("\n云台模块源码加载中") 53 message("\n云台模块源码加载中")
@@ -86,8 +94,11 @@ if(${MEDIA_PROC_MODULE} STREQUAL "VERSION_SWITCH_ON") @@ -86,8 +94,11 @@ if(${MEDIA_PROC_MODULE} STREQUAL "VERSION_SWITCH_ON")
86 message("加载红外相机模块") 94 message("加载红外相机模块")
87 add_definitions(-DMACRO_IRC_MODULE) 95 add_definitions(-DMACRO_IRC_MODULE)
88 96
89 - message("加载RTK模块")  
90 - 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)
91 102
92 message("加载USB模块") 103 message("加载USB模块")
93 set(LIB_USB VERSION_SWITCH_ON) 104 set(LIB_USB VERSION_SWITCH_ON)
@@ -9,6 +9,9 @@ set(AUDIODEAL_MODULE VERSION_SWITCH_OFF) @@ -9,6 +9,9 @@ set(AUDIODEAL_MODULE VERSION_SWITCH_OFF)
9 # 信息模块 9 # 信息模块
10 set(DEVICE_INFO_MODULE VERSION_SWITCH_OFF) 10 set(DEVICE_INFO_MODULE VERSION_SWITCH_OFF)
11 11
  12 +# 设备配置模块
  13 +set(DEVICE_CONFIG_MODULE VERSION_SWITCH_OFF)
  14 +
12 # Gimbal 云台处理模块 15 # Gimbal 云台处理模块
13 set(GIMBAL_MODULE VERSION_SWITCH_OFF) 16 set(GIMBAL_MODULE VERSION_SWITCH_OFF)
14 17
@@ -57,12 +60,16 @@ set(IMAGEPROCESSING_MODULE VERSION_SWITCH_OFF) @@ -57,12 +60,16 @@ set(IMAGEPROCESSING_MODULE VERSION_SWITCH_OFF)
57 # 添加信息模块 60 # 添加信息模块
58 set(DEVICE_INFO_MODULE VERSION_SWITCH_ON) 61 set(DEVICE_INFO_MODULE VERSION_SWITCH_ON)
59 62
  63 +# 添加设备配置模块
  64 +set(DEVICE_CONFIG_MODULE VERSION_SWITCH_ON)
  65 +
60 # 添加UI管理模块 66 # 添加UI管理模块
61 set(UI_CONTROL_MODULE VERSION_SWITCH_ON) 67 set(UI_CONTROL_MODULE VERSION_SWITCH_ON)
62 68
63 # 添加电源管理模块 69 # 添加电源管理模块
64 set(POWER_MANAGER_MODULE VERSION_SWITCH_ON) 70 set(POWER_MANAGER_MODULE VERSION_SWITCH_ON)
65 71
  72 +
66 message("通用库加载完成") 73 message("通用库加载完成")
67 74
68 ########################### 独立库加载 ########################################## 75 ########################### 独立库加载 ##########################################
@@ -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
@@ -15,14 +15,9 @@ @@ -15,14 +15,9 @@
15 #define THREAD_POOL_SIZE 5 // 线程池大小 15 #define THREAD_POOL_SIZE 5 // 线程池大小
16 16
17 typedef struct { 17 typedef struct {
18 - void (*task_function)(void*); //任务函数指针,用于指定 执行的任务  
19 - void* data; // 任务参数 //任务参数的地址 用于输入任务内容  
20 -} t_JZsdk_TaskMgmt_TaskInput;  
21 -  
22 -typedef struct {  
23 pthread_t thread; // 线程 //调用的线程 18 pthread_t thread; // 线程 //调用的线程
24 int is_busy; // 标识线程是否忙碌 19 int is_busy; // 标识线程是否忙碌
25 - t_JZsdk_TaskMgmt_TaskInput* task; // 线程执行的任务 20 + t_JZsdk_TaskFuntionInput* task; // 线程执行的任务
26 pthread_mutex_t lock; // 互斥锁 21 pthread_mutex_t lock; // 互斥锁
27 pthread_cond_t condition; // 条件变量 22 pthread_cond_t condition; // 条件变量
28 } t_ThreadPool; 23 } t_ThreadPool;
@@ -73,7 +68,7 @@ T_JZsdkReturnCode TaskManagement_SubmitTask(void (*task_function)(void*), void* @@ -73,7 +68,7 @@ T_JZsdkReturnCode TaskManagement_SubmitTask(void (*task_function)(void*), void*
73 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 68 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
74 } 69 }
75 70
76 - t_JZsdk_TaskMgmt_TaskInput *task = (t_JZsdk_TaskMgmt_TaskInput*)malloc(sizeof(t_JZsdk_TaskMgmt_TaskInput)); 71 + t_JZsdk_TaskFuntionInput *task = (t_JZsdk_TaskFuntionInput*)malloc(sizeof(t_JZsdk_TaskFuntionInput));
77 if (task == NULL) 72 if (task == NULL)
78 { 73 {
79 // 处理内存分配失败的情况 74 // 处理内存分配失败的情况
@@ -81,7 +76,7 @@ T_JZsdkReturnCode TaskManagement_SubmitTask(void (*task_function)(void*), void* @@ -81,7 +76,7 @@ T_JZsdkReturnCode TaskManagement_SubmitTask(void (*task_function)(void*), void*
81 } 76 }
82 77
83 task->task_function = task_function; 78 task->task_function = task_function;
84 - task->data = data; 79 + task->args = data;
85 80
86 //将发送内容放入任务 81 //将发送内容放入任务
87 TaskPool[i].task = task; 82 TaskPool[i].task = task;
@@ -109,7 +104,7 @@ static void* TaskManagement_ThreadFunction(void* arg) @@ -109,7 +104,7 @@ static void* TaskManagement_ThreadFunction(void* arg)
109 104
110 if (pool->task->task_function != NULL) 105 if (pool->task->task_function != NULL)
111 { 106 {
112 - pool->task->task_function(pool->task->data); 107 + pool->task->task_function(pool->task->args);
113 } 108 }
114 109
115 // 执行完成,将状态置为未忙碌 110 // 执行完成,将状态置为未忙碌
@@ -23,6 +23,12 @@ extern "C" { @@ -23,6 +23,12 @@ extern "C" {
23 23
24 /* Exported types ------------------------------------------------------------*/ 24 /* Exported types ------------------------------------------------------------*/
25 25
  26 +//用于传递指针函数的类型
  27 +typedef struct t_JZsdk_TaskFuntionInput{
  28 + void (*task_function)(void*); //任务函数指针,用于指定 执行的任务
  29 + void *args; // 任务参数 //任务参数的地址 用于输入任务内容
  30 +} t_JZsdk_TaskFuntionInput;
  31 +
26 /* Exported functions --------------------------------------------------------*/ 32 /* Exported functions --------------------------------------------------------*/
27 T_JZsdkReturnCode TaskManagement_Init(); 33 T_JZsdkReturnCode TaskManagement_Init();
28 T_JZsdkReturnCode TaskManagement_SubmitTask(void (*task_function)(void*), void* data); 34 T_JZsdkReturnCode TaskManagement_SubmitTask(void (*task_function)(void*), void* data);
@@ -22,6 +22,7 @@ @@ -22,6 +22,7 @@
22 #include "JZsdk_haldata_deal/JZsdk_data_transmisson.h" 22 #include "JZsdk_haldata_deal/JZsdk_data_transmisson.h"
23 #include "MediaProc/MediaProc.h" 23 #include "MediaProc/MediaProc.h"
24 #include "UI_control/WidegMgmt/JZsdk_Widget.h" 24 #include "UI_control/WidegMgmt/JZsdk_Widget.h"
  25 +#include "DeviceConfig/DeviceConfig.h"
25 26
26 #if APP_VERSION == APP_PSDK 27 #if APP_VERSION == APP_PSDK
27 #include "fc_subscription/test_fc_subscription.h" 28 #include "fc_subscription/test_fc_subscription.h"
@@ -347,11 +348,8 @@ T_JZsdkReturnCode Main_APP_Psdk() @@ -347,11 +348,8 @@ T_JZsdkReturnCode Main_APP_Psdk()
347 348
348 else if (DEVICE_VERSION == JZ_C1) 349 else if (DEVICE_VERSION == JZ_C1)
349 { 350 {
350 - //引脚初始化  
351 - Ircut_Init();  
352 -  
353 - //视频流模块初始化  
354 - MediaProc_Init(); 351 + //初始化C1
  352 + JZC1_Init();
355 } 353 }
356 354
357 355
@@ -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_C1 10 +#define DEVICE_VERSION JZ_U3S
11 11
12 //禁止修改行 选择是串口程序 还是 psdk程序 12 //禁止修改行 选择是串口程序 还是 psdk程序
13 #define APP_VERSION APP_PSDK 13 #define APP_VERSION APP_PSDK
14 14
15 //禁止修改行 板子型号 15 //禁止修改行 板子型号
16 -#define PLATFORM_VERSION PLATFORM_H3 16 +#define PLATFORM_VERSION PLATFORM_V3S
17 17
18 //禁止修改行 串口连接程序的软件版本号 18 //禁止修改行 串口连接程序的软件版本号
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 0x03
23 23
24 //禁止修改行 滤波方式 24 //禁止修改行 滤波方式
25 #define FILTERING_TYPE HIGH_PASS_FILTERING 25 #define FILTERING_TYPE HIGH_PASS_FILTERING
@@ -48,6 +48,7 @@ @@ -48,6 +48,7 @@
48 //是否开启媒体功能 48 //是否开启媒体功能
49 #ifdef MACRO_MEDIA_PROC_MODULE 49 #ifdef MACRO_MEDIA_PROC_MODULE
50 #define MEDIA_PROC_CONFIG_STATUS VERSION_SWITCH_ON 50 #define MEDIA_PROC_CONFIG_STATUS VERSION_SWITCH_ON
  51 + #define MEDIA_PROC_CONFIG_STATUS_ON
51 #else 52 #else
52 #define MEDIA_PROC_CONFIG_STATUS VERSION_SWITCH_OFF 53 #define MEDIA_PROC_CONFIG_STATUS VERSION_SWITCH_OFF
53 #endif 54 #endif
@@ -73,10 +74,13 @@ @@ -73,10 +74,13 @@
73 #endif 74 #endif
74 75
75 //是否加载RTK_MPP模块 76 //是否加载RTK_MPP模块
76 - #ifdef MACRO_RTK_MPP_MODULE  
77 - #define RTK_MPP_STATUS VERSION_SWITCH_ON  
78 - #else  
79 - #define RTK_MPP_STATUS VERSION_SWITCH_OFF 77 + #ifdef MACRO_RK_MPP_MODULE
  78 + #define RTK_MPP_STATUS_ON
  79 + #endif
  80 +
  81 + //是否加载RTK_RGA模块
  82 + #ifdef MACRO_RK_RGA_MODULE
  83 + #define RTK_RGA_STATUS_ON
80 #endif 84 #endif
81 85
82 //是否加载WIRINGPI模块 86 //是否加载WIRINGPI模块
@@ -100,6 +104,7 @@ @@ -100,6 +104,7 @@
100 104
101 //是否开启媒体管理功能 105 //是否开启媒体管理功能
102 #define MEDIA_PROC_CONFIG_STATUS VERSION_SWITCH_ON 106 #define MEDIA_PROC_CONFIG_STATUS VERSION_SWITCH_ON
  107 + #define MEDIA_PROC_CONFIG_STATUS_ON
103 108
104 //是否开启红外相机功能 109 //是否开启红外相机功能
105 #define IRC_CONFIG_STATUS VERSION_SWITCH_ON 110 #define IRC_CONFIG_STATUS VERSION_SWITCH_ON
@@ -108,7 +113,10 @@ @@ -108,7 +113,10 @@
108 #define USB_CONFIG_STATUS VERSION_SWITCH_ON 113 #define USB_CONFIG_STATUS VERSION_SWITCH_ON
109 114
110 //是否加载RTK_MPP模块 115 //是否加载RTK_MPP模块
111 - #define RTK_MPP_STATUS VERSION_SWITCH_ON 116 + #define RTK_MPP_STATUS_ON
  117 +
  118 + //是否加载RGA模块
  119 + #define RTK_RGA_STATUS_ON
112 120
113 //是否加载WIRINGPI模块 121 //是否加载WIRINGPI模块
114 #define WIRINGPI_STATUS_ON 122 #define WIRINGPI_STATUS_ON
@@ -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,35 +21,62 @@ static const AVCodec *codec; @@ -21,35 +21,62 @@ 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
  57 + JZSDK_LOG_INFO("file stream init complete");
  58 +
  59 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  60 +}
  61 +
  62 +//输入mp3的实时数据,以及本次数据的长度
  63 +T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize)
  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 +
  77 + //将数据输入到
  78 + while(databufSize > 0)
  79 + {
53 //如果解码器不存在,初始化解码器 80 //如果解码器不存在,初始化解码器
54 if (!decoded_frame) 81 if (!decoded_frame)
55 { 82 {
@@ -59,14 +86,6 @@ int File_Stream_deal_Init(enum AVCodecID id) @@ -59,14 +86,6 @@ int File_Stream_deal_Init(enum AVCodecID id)
59 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 86 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
60 } 87 }
61 } 88 }
62 -}  
63 -  
64 -//输入mp3的实时数据,以及本次数据的长度  
65 -T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize)  
66 -{  
67 - //将数据输入到  
68 - while(dataSize > 0)  
69 - {  
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 101
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 -  
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);
@@ -135,6 +156,8 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon @@ -135,6 +156,8 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon
135 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 156 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
136 } 157 }
137 158
  159 + //printf("输出了:%d的数据\n",frame->nb_samples);
  160 +
138 int out_nb_samples = 0; 161 int out_nb_samples = 0;
139 162
140 //重采样解码后的数据 163 //重采样解码后的数据
@@ -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 +
  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;
182 } 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_TTS;
  308 + }
  309 + else if (AudioType == 0x01) //音频类型
  310 + {
  311 + NewType = FILTER_NORMAL_AUDIO;
  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 --------------------------------------------------------*/
1 /** 1 /**
2 ******************************************************************** 2 ********************************************************************
3 - * @file Kt_Irc.h  
4 - * Kt_Irc的头文件 3 + * @file DeviceConfig.h
  4 + * DeviceConfig.h的头文件
5 * 5 *
6 ********************************************************************* 6 *********************************************************************
7 */ 7 */
8 8
9 /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/ 9 /* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
10 -#ifndef KT_IRC_H  
11 -#define KT_IRC_H 10 +#ifndef DEVICE_CONFIG_H
  11 +#define DEVICE_CONFIG_H
12 12
13 -/* Includes ------------------------------------------------------------------*/  
14 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h" 13 #include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
15 14
  15 +#include "DeviceConfig/JZC1/JZC1.h"
  16 +
  17 +
  18 +/* Includes ------------------------------------------------------------------*/
16 #ifdef __cplusplus 19 #ifdef __cplusplus
17 extern "C" { 20 extern "C" {
18 #endif 21 #endif
19 22
  23 +
  24 +
20 /* Exported constants --------------------------------------------------------*/ 25 /* Exported constants --------------------------------------------------------*/
21 /* 常亮定义*/ 26 /* 常亮定义*/
22 27
23 -  
24 /* Exported types ------------------------------------------------------------*/ 28 /* Exported types ------------------------------------------------------------*/
25 29
26 -/* Exported functions --------------------------------------------------------*/  
27 -T_JZsdkReturnCode JZsdk_Kt_Irc_Camera_Init();  
28 -T_JZsdkReturnCode JZsdk_Kt_Irc_ShutterSwitch(int value);  
29 -  
30 30
31 #ifdef __cplusplus 31 #ifdef __cplusplus
32 } 32 }
  1 +
  2 +#include <stdio.h>
  3 +#include <stdlib.h>
  4 +#include <string.h>
  5 +#include <pthread.h>
  6 +#include <time.h>
  7 +#include <unistd.h>
  8 +
  9 +#include "JZsdkLib.h"
  10 +#include "BaseConfig.h"
  11 +#include "JZsdk_usb_bulk/JZsdk_usb_bulk.h"
  12 +
  13 +#include "IRCUT/ircut.h"
  14 +
  15 +
  16 +#ifdef RTK_MPP_STATUS_ON
  17 +#include "MediaProc/MultProc/RTK_mmp/RTK_mmp.h"
  18 +#include "MediaProc/MultProc/RTK_mmp/Dec/RTK_mmp_dec.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;
  47 +
  48 +static unsigned char *g_MixedIrc_Buffer = NULL;
  49 +
  50 +static unsigned char *g_MixedOpt_Buffer = NULL;
  51 +static unsigned int g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_OFF;
  52 +
  53 +#endif
  54 +
  55 +#ifdef MEDIA_PROC_CONFIG_STATUS_ON
  56 +
  57 +#include "MediaProc/Camera/Cam_FrameCatch/Cam_FrameCatch.h"
  58 +#include "MediaProc/MediaParm.h"
  59 +#include "MediaProc/VideoMgmt/VideoStreamPush/VideoStream_Push.h"
  60 +#include "MediaProc/VideoMgmt/VideoMgmt.h"
  61 +#include "MediaProc/IRC_funtion/IRC_Param.h"
  62 +#include "MediaProc/IRC_funtion/IRC_funtion.h"
  63 +#include "MediaProc/MediaProc_Param.h"
  64 +
  65 +
  66 +
  67 +static void *g_usb_index = NULL;
  68 +
  69 +// 定义 昆腾的 帧头长度和帧头内容
  70 +#define FRAME_HEADER_SIZE 4
  71 +static const unsigned char FRAME_HEADER[FRAME_HEADER_SIZE] = {0xaa, 0xbb, 0xcc, 0xdd};
  72 +#define NSEC_PER_SEC 1000000000L //1秒的纳秒数
  73 +#define TARGET_FPS 30
  74 +
  75 +static unsigned char FrameBuffer[FIRST_HEIGHT * FIRST_WIDTH *2]; //用于存储帧数据的缓冲区
  76 +static unsigned int FrameBufferLen = 0; //用于存储帧数据的长度
  77 +static FrameBuffer_UseFlag = JZ_FLAGCODE_OFF;
  78 +
  79 +#ifdef RTK_RGA_STATUS_ON
  80 +static T_JZsdkReturnCode JZC1_RgaDeal(C1_RgaInfo *rga_info, int resize, unsigned char *image, unsigned int *imgage_size);
  81 +static T_JZsdkReturnCode JZC1_RgaInit(C1_RgaInfo **rgaInfo, int dst_width, int dst_height, int dst_format);
  82 +#endif
  83 +
  84 +//数据推送函数
  85 +static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, unsigned int data_len)
  86 +{
  87 + int currentIndex = VideoMgmt_GetVideoStreamFlowIndexNum(); //获取当前视频流索引
  88 + //无视频流
  89 + if (currentIndex == 0)
  90 + {
  91 + //不推送视频
  92 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  93 + }
  94 +
  95 + //红外相机
  96 + if (currentIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST && CameraIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST)
  97 + {
  98 +
  99 + //推送数据到流转模块
  100 + VideoMgmt_Single_FrameIn(data, data_len);
  101 + }
  102 +
  103 + //光学相机
  104 + if(CameraIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND && currentIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND)
  105 + {
  106 + //推送数据到流转模块
  107 + VideoMgmt_Single_FrameIn(data, data_len);
  108 + }
  109 +
  110 + //组合视频流
  111 + if (currentIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD && CameraIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD)
  112 + {
  113 + //推送数据到流转模块
  114 + VideoMgmt_Single_FrameIn(data, data_len);
  115 + }
  116 +
  117 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  118 +}
  119 +
  120 +static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len)
  121 +{
  122 +
  123 +
  124 +#ifdef RTK_MPP_STATUS_ON
  125 +
  126 + //JZSDK_LOG_INFO("JZC1_OptDeal");
  127 +
  128 + MppFrame yuv_data = NULL; //用于传递yuv数据的地址
  129 + MppPacket Packet = NULL;
  130 +
  131 + //输入数据进入解码器
  132 + RTK_mmp_dec_input(JZsdk_RtkMmpGetDecHandleAddr(1), data, data_len, &yuv_data);
  133 +
  134 + // int width = mpp_frame_get_width(yuv_data);
  135 + // int height = mpp_frame_get_height(yuv_data);
  136 + // int h_stride = mpp_frame_get_hor_stride(yuv_data);
  137 + // int v_stride = mpp_frame_get_ver_stride(yuv_data);
  138 +
  139 + // JZSDK_LOG_INFO("w:%d h:%d hor:%d ver:%d",width,height,h_stride,v_stride);
  140 +
  141 + //光学数据缩放
  142 + int resize = JZ_FLAGCODE_OFF;
  143 + Camera_param(JZ_FLAGCODE_GET, CAMERA_RESIZE, &resize);
  144 +
  145 + //将size转化为倍数
  146 + int ZoomRatio = 0;
  147 + switch (resize)
  148 + {
  149 + case 0:
  150 + ZoomRatio = JZ_FLAGCODE_OFF;
  151 + break;
  152 +
  153 + case 1:
  154 + ZoomRatio = 2;
  155 + break;
  156 +
  157 + case 2:
  158 + ZoomRatio = 4;
  159 + break;
  160 +
  161 + case 3:
  162 + ZoomRatio = 8;
  163 + break;
  164 +
  165 + default:
  166 + ZoomRatio = JZ_FLAGCODE_OFF;
  167 + break;
  168 + }
  169 +
  170 +
  171 + if (ZoomRatio != JZ_FLAGCODE_OFF)
  172 + {
  173 +
  174 + MppBuffer temp = mpp_frame_get_buffer(yuv_data);
  175 + RK_U32 h = mpp_frame_get_hor_stride(yuv_data);
  176 + RK_U32 w = mpp_frame_get_ver_stride(yuv_data);
  177 +
  178 + int size = (h * w * 1.5);
  179 +
  180 + unsigned char *temp_data = (unsigned char *)malloc(size);
  181 + memcpy(temp_data, mpp_buffer_get_ptr(temp), size);
  182 +
  183 + JZC1_RgaDeal(g_C1_RgaOptInfo, ZoomRatio, temp_data, &size);
  184 +
  185 + //重新将数据放回
  186 + memcpy(mpp_buffer_get_ptr(temp), temp_data, size);
  187 +
  188 + free(temp_data);
  189 + }
  190 +
  191 +
  192 + //将数据放入混合缓冲区
  193 + MppBuffer temp = mpp_frame_get_buffer(yuv_data);
  194 + if (g_MixedOpt_Buffer != NULL && g_MixedOptBuffer_UseFlag == JZ_FLAGCODE_OFF)
  195 + {
  196 + g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_ON;
  197 + memcpy(g_MixedOpt_Buffer, mpp_buffer_get_ptr(temp), (mpp_frame_get_hor_stride(yuv_data) * mpp_frame_get_ver_stride(yuv_data) * 1.5));
  198 + g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_OFF;
  199 + }
  200 +
  201 +
  202 + //将返回的数据输入进编码器
  203 + RTK_mmp_enc_yuv_to_h264_byFrame(JZsdk_RtkMmpGetEncHandleAddr(1), yuv_data, &Packet);
  204 +
  205 + //获取数据指针与长度
  206 + int packet_len = mpp_packet_get_length(Packet);
  207 + void *ptr = mpp_packet_get_pos(Packet);
  208 +
  209 + //推送视频流
  210 + JZC1_PushFrame(2, (unsigned char *)ptr, packet_len);
  211 +
  212 + //释放掉编码图像
  213 + mpp_packet_deinit(&Packet);
  214 +#endif
  215 +
  216 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  217 +}
  218 +
  219 +//红外数据纠正函数, 暂定全部替换
  220 +static T_JZsdkReturnCode JZC1_Irc_DataCorrect(unsigned char *data)
  221 +{
  222 + //像素修正
  223 + data[0] = data[5];
  224 + data[1] = data[6];
  225 + data[2] = data[5];
  226 + data[3] = data[6];
  227 +}
  228 +
  229 +
  230 +//在这里将灰度图数据转换成目标数据
  231 +static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len)
  232 +{
  233 + //JZSDK_LOG_DEBUG("irc数据处理");
  234 + if (data_len == 0)
  235 + {
  236 + JZSDK_LOG_ERROR("无数据错误");
  237 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  238 + }
  239 +
  240 + //红外数据纠正处理
  241 + JZC1_Irc_DataCorrect(data);
  242 +
  243 + //将 8位的raw数据 合并为16位数据
  244 + U16_t * u16Data = (U16_t *)malloc(sizeof(U16_t) * (data_len / 2));
  245 + int u16DataSize = data_len / 2;
  246 +
  247 + //JZSDK_LOG_DEBUG("data_len:%d u16DataSize:%d", data_len / 2, FIRST_HEIGHT * FIRST_WIDTH);
  248 +
  249 + //合成像素,u8转换合并成u16
  250 + JZsdk_Merge_U8_to_U16_byReverse(data, data_len, u16Data, &u16DataSize);
  251 +
  252 + //将灰度图数据转换为原始码流数据
  253 + unsigned char *raw_data = NULL;
  254 + int raw_data_len = 0;
  255 +
  256 + //将原始码流数据转换为rgb数据
  257 + IRC_FrameDeal(u16Data, u16DataSize, &raw_data, &raw_data_len);
  258 +
  259 + //获取放大的倍数
  260 + //光学数据缩放
  261 + int resize = JZ_FLAGCODE_OFF;
  262 + Camera_param(JZ_FLAGCODE_GET, CAMERA_RESIZE, &resize);
  263 +
  264 + //将size转化为倍数
  265 + int ZoomRatio = 0;
  266 + switch (resize)
  267 + {
  268 + case 0:
  269 + ZoomRatio = JZ_FLAGCODE_OFF;
  270 + break;
  271 +
  272 + case 1:
  273 + ZoomRatio = 2;
  274 + break;
  275 +
  276 + case 2:
  277 + ZoomRatio = 4;
  278 + break;
  279 +
  280 + case 3:
  281 + //红外做不了8倍放大咧
  282 + ZoomRatio = 4;
  283 + //ZoomRatio = 8;
  284 + break;
  285 +
  286 + default:
  287 + ZoomRatio = 0;
  288 + break;
  289 + }
  290 +
  291 + if (ZoomRatio != JZ_FLAGCODE_OFF)
  292 + {
  293 + JZC1_RgaDeal(g_C1_RgaIrcInfo, ZoomRatio, raw_data, &raw_data_len);
  294 + }
  295 +
  296 + //将数据放入混合缓冲区
  297 + if (g_MixedIrc_Buffer != NULL)
  298 + {
  299 + memcpy(g_MixedIrc_Buffer, raw_data, raw_data_len);
  300 + }
  301 +
  302 + //将原始码流数据写入到编码器 并转换为h264
  303 + unsigned char *h264Data = NULL;
  304 + unsigned int h264DataLen = 0;
  305 +
  306 +#ifdef RTK_MPP_STATUS_ON
  307 + MppPacket Packet = NULL;
  308 +
  309 + RTK_mmp_enc_data_to_h264(JZsdk_RtkMmpGetEncHandleAddr(0), raw_data, raw_data_len, &Packet);
  310 +
  311 + h264DataLen = mpp_packet_get_length(Packet);
  312 + h264Data = (unsigned char *)mpp_packet_get_pos(Packet);
  313 + //EncCfg->Packet_eos = mpp_packet_get_eos(packet);
  314 + // printf("获取到编码内容 len:%d\n",packet_len);
  315 +
  316 + //释放掉packet
  317 + mpp_packet_deinit(&Packet);
  318 +#endif
  319 +
  320 + //将h264数据推送
  321 + JZC1_PushFrame(1, h264Data, h264DataLen);
  322 +
  323 + //释放内存
  324 + if (raw_data != NULL)
  325 + {
  326 + free(raw_data);
  327 + raw_data = NULL;
  328 + }
  329 +
  330 + if (u16Data != NULL)
  331 + {
  332 + free(u16Data);
  333 + u16Data = NULL;
  334 + }
  335 +
  336 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  337 +}
  338 +
  339 +static void *JZC1_IrcDataBuffer_Thread(void *args)
  340 +{
  341 +
  342 + struct timespec now;
  343 +
  344 + //获取起始时间
  345 + struct timespec start_time;
  346 + clock_gettime(CLOCK_MONOTONIC, &start_time);
  347 + long long prev_time = start_time.tv_sec * NSEC_PER_SEC + start_time.tv_nsec;
  348 +
  349 + //设置间隔时间
  350 + long long period = NSEC_PER_SEC / TARGET_FPS;
  351 +
  352 + unsigned char *TempBuffer = (unsigned char *)malloc(163840);
  353 + unsigned int TempBufferLen = 0;
  354 +
  355 +
  356 +
  357 + while (1)
  358 + {
  359 + //获取当前时间
  360 + clock_gettime(CLOCK_MONOTONIC, &now);
  361 + long long current_time = now.tv_sec * NSEC_PER_SEC + now.tv_nsec;
  362 +
  363 + //计算时间差
  364 + long long elapsed_time = current_time - prev_time;
  365 +
  366 + //超过33ms
  367 + if (elapsed_time >= period)
  368 + {
  369 + while (FrameBuffer_UseFlag == JZ_FLAGCODE_ON)
  370 + {
  371 + delayUs(100);
  372 + }
  373 +
  374 + FrameBuffer_UseFlag = JZ_FLAGCODE_ON;
  375 +
  376 + memset(TempBuffer, 0, sizeof(TempBuffer));
  377 + memcpy(TempBuffer, FrameBuffer, FrameBufferLen);
  378 + TempBufferLen = FrameBufferLen;
  379 +
  380 + FrameBuffer_UseFlag = JZ_FLAGCODE_OFF;
  381 +
  382 + //红外数据缓冲线程
  383 + JZC1_IrcDeal(TempBuffer, TempBufferLen);
  384 +
  385 + prev_time = current_time;
  386 + }
  387 +
  388 + // 为了防止过于频繁地调用 clock_gettime,可以添加一个小的睡眠时间
  389 + // 例如,休眠1毫秒(100000000纳秒),以减少CPU占用
  390 + struct timespec req = { .tv_sec = 0, .tv_nsec = 1000000 };
  391 + nanosleep(&req, NULL);
  392 + }
  393 +
  394 +
  395 +}
  396 +
  397 +static T_JZsdkReturnCode JZC1_IrcDataSave(unsigned char *data, unsigned int data_len)
  398 +{
  399 + //避免缓冲区被同时操作
  400 + while (FrameBuffer_UseFlag == JZ_FLAGCODE_ON)
  401 + {
  402 + delayUs(100);
  403 + }
  404 +
  405 + FrameBuffer_UseFlag = JZ_FLAGCODE_ON;
  406 +
  407 + memset(FrameBuffer, 0, sizeof(FrameBuffer));
  408 + memcpy(FrameBuffer, data, data_len);
  409 + FrameBufferLen = data_len;
  410 +
  411 + FrameBuffer_UseFlag = JZ_FLAGCODE_OFF;
  412 +
  413 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  414 +}
  415 +
  416 +//红外数据接收线程
  417 +static void *JZC1_IrcDataRecv_Thread(void *args)
  418 +{
  419 + int frame_len = FIRST_WIDTH *2* FIRST_HEIGHT; //163840
  420 + unsigned char buf[frame_len]; //usb数据缓冲区需要为512的倍数
  421 + unsigned char frameData[frame_len]; // 存储整帧数据的画面缓冲区
  422 + unsigned int lineNum = 0;
  423 + int frame = 0;
  424 + int frameDataLen = 0;//缓冲区的数据长度
  425 +
  426 + /*****
  427 + *
  428 + * 数据格式说明
  429 + *
  430 + * 帧头 0xaa 0xbb 0x02 0x80 0x01 0x00 + 行数 如第一行0x00 0x01
  431 + * 数据包长度为 0x0280
  432 + * 数据包 一包的行数为256 0x0100
  433 + * 当前数据为第x行 x= 0x0001
  434 + * 两位数据为一个点
  435 + * 接着把前4个点的数据 用第五个点替换掉
  436 + * *****/
  437 +
  438 + while (1)
  439 + {
  440 + int realLen;
  441 + memset(buf,0,sizeof(buf));
  442 + T_JZsdkReturnCode ret = JZsdk_HalUsbBulk_ReadData(&g_usb_index, buf, sizeof(buf), &realLen);
  443 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  444 + {
  445 + // 处理读取错误
  446 + JZSDK_LOG_ERROR("读取错误");
  447 + continue;
  448 + //return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  449 + }
  450 + if (realLen != 0)
  451 + {
  452 + //JZSDK_LOG_INFO("读取到%d 字节",realLen);
  453 + }
  454 +
  455 + //寻找数据是否存在帧头
  456 + for (int i = 0; i < realLen; i++)
  457 + {
  458 + // 验证帧头
  459 + if (memcmp(buf+i, FRAME_HEADER, FRAME_HEADER_SIZE) != 0)
  460 + {
  461 + // 帧头不匹配,可能是噪声或错误的数据包
  462 + continue;
  463 + }
  464 +
  465 +/**********************
  466 + *
  467 + * 方法一,将usb缓冲区调整大小 到超过640*256, 然后直接输出整段画面,避免重复复制,节省处理时间
  468 + *
  469 + * ******************************/
  470 + //如果查找到帧头
  471 +
  472 + //查看是否是第0帧
  473 + if (frame == 0)
  474 + {
  475 + //重置掉画面缓冲区
  476 + memset(frameData,0,sizeof(frameData));
  477 +
  478 + //将数据置于缓冲区
  479 + frameDataLen = (realLen-i);
  480 + memcpy( &frameData[0], buf + i, frameDataLen);
  481 +
  482 + //让画面帧强跳到第一帧
  483 + frame = 1;
  484 +
  485 + continue;
  486 + }
  487 +
  488 + //如果是第一帧
  489 + if (frame == 1)
  490 + {
  491 + memcpy( &frameData[frameDataLen], buf, frame_len-frameDataLen );
  492 +
  493 + JZC1_IrcDataSave(frameData, frame_len);
  494 +
  495 + frame = 2;
  496 + frameDataLen = 0;
  497 + //memset(frameData,0,sizeof(frameData));
  498 + }
  499 +
  500 +
  501 + //如果不是第1帧,且上段数据小于一画面段,说明为数据被切割
  502 + if ( i<frame_len)
  503 + {
  504 + //则于前端残余数据拼接,并输出
  505 + if (frame%2==0 && (frame != 1) )
  506 + {
  507 +
  508 + memcpy( &frameData[frame_len-i], buf, i);
  509 + //将未处理raw数据放入缓冲区
  510 +
  511 + //JZSDK_LOG_INFO("写入1 %d %x", i, frameData[20]);
  512 +
  513 + JZC1_IrcDataSave(frameData, frame_len);
  514 + //JZSDK_LOG_INFO("放入数据到缓冲区");
  515 + //memset(frameData,0,sizeof(frameData));
  516 + }
  517 + frame++;
  518 + }
  519 +
  520 + //如果剩余长度超出一画数据,将画面数据整段输出
  521 + if ( (i + frame_len) < realLen)
  522 + {
  523 + if (frame%2==0)
  524 + {
  525 + //JZSDK_LOG_INFO("写入2");
  526 +
  527 + memcpy( &frameData[0], buf, frame_len);
  528 +
  529 + //将未处理raw数据放入缓冲区
  530 + JZC1_IrcDataSave(frameData, frame_len);
  531 + //JZSDK_LOG_INFO("放入数据到缓冲区");
  532 + }
  533 + frame++;
  534 + continue;
  535 + }
  536 +
  537 + //JZSDK_LOG_INFO("i:%d, frame_len:%d realLen:%d frame:%d",i,frame_len,realLen,frame);
  538 +
  539 + //如果剩余数据小于一画,存进画面缓冲区
  540 + //memset(frameData,0,sizeof(frameData));
  541 + memcpy(frameData, buf+i, (realLen-i));
  542 + break;
  543 + }
  544 + }
  545 +}
  546 +
  547 +
  548 +//C1 红外相机数据的初始化
  549 +static T_JZsdkReturnCode JZsdk_JZC1_Irc_Data_Init()
  550 +{
  551 + T_JZsdkReturnCode ret;
  552 +
  553 + //初始化接收的usb口
  554 + ret = JZsdk_HalUsbBulk_Init(&g_usb_index, 0, 0, LINUX_USB_PID, LINUX_USB_VID, USB_IN_POINT, USB_OUT_POINT);
  555 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  556 + {
  557 + return ret;
  558 + }
  559 +
  560 + //初始化usb接收线程
  561 + pthread_t ReadDataTask;
  562 + pthread_attr_t task_attribute; //线程属性
  563 + pthread_attr_init(&task_attribute); //初始化线程属性
  564 + pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
  565 + int Urcdata_Protection = pthread_create(&ReadDataTask,&task_attribute,JZC1_IrcDataRecv_Thread,NULL); //线程
  566 + if(Urcdata_Protection != 0)
  567 + {
  568 + JZSDK_LOG_ERROR("创建视频usb线程失败!");
  569 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  570 + }
  571 +
  572 + //初始化送usb数据去处理的线程
  573 + pthread_t BufferDataTask;
  574 + pthread_attr_t BufferDataTask_attribute; //线程属性
  575 + pthread_attr_init(&BufferDataTask_attribute); //初始化线程属性
  576 + pthread_attr_setdetachstate(&BufferDataTask_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
  577 + int bufferdata_Protection = pthread_create(&BufferDataTask,&BufferDataTask_attribute,JZC1_IrcDataBuffer_Thread,NULL); //线程
  578 + if(bufferdata_Protection != 0)
  579 + {
  580 + JZSDK_LOG_ERROR("创建usb缓冲失败!");
  581 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  582 + }
  583 +
  584 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  585 +}
  586 +
  587 +
  588 +
  589 +/********************
  590 + *
  591 + * 混合视频说明
  592 + *
  593 + * 1920*1088 做处理 并输出为 1920*1080
  594 + * __________________________________________________________________
  595 + * |_________________________________ |
  596 + * | |________________________________|
  597 + * | | |
  598 + * | | 1920*1088 /2 960* 544 |
  599 + * | | |
  600 + * | 320*256 拉伸4到 1280*1024 | |
  601 + * | 裁剪出 3/4 到 960 * 768 | |
  602 + * | | |
  603 + * | |________________________________|
  604 + * |_________________________________| |
  605 + * |__________________________________________________________________|
  606 + *
  607 + * ******************/
  608 +
  609 +
  610 +/******************
  611 + *
  612 + * 混合视频处理
  613 + *
  614 + *
  615 + * ********************/
  616 +static void JZC1_MixedVideo_Deal()
  617 +{
  618 +
  619 +}
  620 +
  621 +
  622 +static void *MixedVideo_Thread(void *args)
  623 +{
  624 +#ifdef RTK_RGA_STATUS_ON
  625 + struct timespec now;
  626 + int d_ret = 0;
  627 +
  628 + //获取起始时间
  629 + struct timespec start_time;
  630 + clock_gettime(CLOCK_MONOTONIC, &start_time);
  631 + long long prev_time = start_time.tv_sec * NSEC_PER_SEC + start_time.tv_nsec;
  632 +
  633 + //设置间隔时间
  634 + long long period = NSEC_PER_SEC / TARGET_FPS;
  635 +
  636 +/***** 红外图像参数 **********************************************************************************************************/
  637 +
  638 + //红外源图像
  639 + im_rect Irc_Rect;
  640 + Irc_Rect.x = 0;
  641 + Irc_Rect.y = 0;
  642 + Irc_Rect.width = JZ_ALIGN(FIRST_WIDTH, 16);
  643 + Irc_Rect.height = JZ_ALIGN(FIRST_HEIGHT, 16);
  644 + int IRc_Format = RK_FORMAT_YCbCr_420_SP;
  645 +
  646 + //红外放大图像
  647 + im_rect Irc_ResizeRect;
  648 + Irc_ResizeRect.x = 0;
  649 + Irc_ResizeRect.y = 0;
  650 + Irc_ResizeRect.width = JZ_ALIGN(FIRST_WIDTH, 16) * 4;
  651 + Irc_ResizeRect.height = JZ_ALIGN(FIRST_HEIGHT, 16) * 4;
  652 +
  653 + //红外裁剪区域
  654 + im_rect Irc_CropRect;
  655 + Irc_CropRect.width = Irc_ResizeRect.width / 4 * 3;
  656 + Irc_CropRect.height = Irc_ResizeRect.height / 4 * 3;
  657 + Irc_CropRect.x = (Irc_ResizeRect.width - Irc_CropRect.width)/2;
  658 + Irc_CropRect.y = (Irc_ResizeRect.height - Irc_CropRect.height)/2;
  659 +
  660 + //红外源图像
  661 + RK_RgaImage *Irc_SrcImg = NULL;
  662 + RK_Rga_ImageInit(&Irc_SrcImg, Irc_Rect.width, Irc_Rect.height, IRc_Format, Irc_Rect.x, Irc_Rect.y, Irc_Rect.width, Irc_Rect.height);
  663 +
  664 + //红外放大图像
  665 + RK_RgaImage *Irc_ResizeImg = NULL;
  666 + RK_Rga_ImageInit(&Irc_ResizeImg, Irc_ResizeRect.width, Irc_ResizeRect.height, IRc_Format, Irc_ResizeRect.x, Irc_ResizeRect.y, Irc_ResizeRect.width, Irc_ResizeRect.height);
  667 +
  668 + //红外裁剪图像
  669 + RK_RgaImage *Irc_CropImg = NULL;
  670 + RK_Rga_ImageInit(&Irc_CropImg, Irc_CropRect.width, Irc_CropRect.height, IRc_Format, 0, 0, Irc_CropRect.width, Irc_CropRect.height);
  671 +
  672 +/***** 光学图像参数 **********************************************************************************************************/
  673 +
  674 + //光学源图像
  675 + im_rect Opt_Rect;
  676 + Opt_Rect.x = 0;
  677 + Opt_Rect.y = 0;
  678 + Opt_Rect.width = JZ_ALIGN(SECOND_WIDTH, 16);
  679 + Opt_Rect.height = JZ_ALIGN(SECOND_HEIGHT, 16);
  680 + int Opt_Format = RK_FORMAT_YCbCr_420_SP;
  681 +
  682 + //光学源缩小图像
  683 + im_rect Opt_ResizeRect;
  684 + Opt_ResizeRect.x = 0;
  685 + Opt_ResizeRect.y = 0;
  686 + Opt_ResizeRect.width = JZ_ALIGN(SECOND_WIDTH, 16) / 2;
  687 + Opt_ResizeRect.height = JZ_ALIGN(SECOND_HEIGHT, 16) / 2;
  688 +
  689 + //光学源图像
  690 + RK_RgaImage *Opt_SrcImg = NULL;
  691 + RK_Rga_ImageInit(&Opt_SrcImg, Opt_Rect.width, Opt_Rect.height, Opt_Format, Opt_Rect.x, Opt_Rect.y, Opt_Rect.width, Opt_Rect.height);
  692 +
  693 + //光学的缩小图像
  694 + RK_RgaImage *Opt_ResizeImg = NULL;
  695 + RK_Rga_ImageInit(&Opt_ResizeImg, Opt_ResizeRect.width, Opt_ResizeRect.height, Opt_Format, Opt_ResizeRect.x, Opt_ResizeRect.y, Opt_ResizeRect.width, Opt_ResizeRect.height);
  696 +
  697 +
  698 +/***** 目标图像参数 ***************************************************************************************************/
  699 +
  700 + //目标图像的矩形
  701 + im_rect Dst_Rect;
  702 + Dst_Rect.x = 0;
  703 + Dst_Rect.y = 0;
  704 + Dst_Rect.width = JZ_ALIGN(SECOND_WIDTH, 16);
  705 + Dst_Rect.height = JZ_ALIGN(SECOND_HEIGHT, 16);
  706 + int Dst_Format = RK_FORMAT_YCbCr_420_SP;
  707 +
  708 + //目标图像中光学图像的矩形
  709 + im_rect Dst_OptRect;
  710 + Dst_OptRect.x = Dst_Rect.width / 2;
  711 + Dst_OptRect.y = Dst_Rect.height / 4;
  712 + Dst_OptRect.width = Opt_ResizeRect.width;
  713 + Dst_OptRect.height = Opt_ResizeRect.height;
  714 +
  715 + //目标图像中红外图像的矩形
  716 + im_rect Dst_IrcRect;
  717 + Dst_IrcRect.x = 0;
  718 + Dst_IrcRect.y = (Dst_Rect.height - Irc_CropRect.height) / 2;
  719 + Dst_IrcRect.width = Irc_CropRect.width;
  720 + Dst_IrcRect.height = Irc_CropRect.height;
  721 +
  722 + //目标图像
  723 + RK_RgaImage *DstImg = NULL;
  724 + RK_Rga_ImageInit(&DstImg, Dst_Rect.width, Dst_Rect.height, Dst_Format, Dst_Rect.x, Dst_Rect.y, Dst_Rect.width, Dst_Rect.height);
  725 + JZSDK_LOG_DEBUG("Dstimg witdh :%d height:%d DstImg->buf_size:%d", DstImg->width, DstImg->height, DstImg->buf_size);
  726 +
  727 + //空缓冲区
  728 + rga_buffer_t EmptyImg = {0};
  729 + im_rect EmptyRect = {0};
  730 +
  731 +//开始绘制画面,待优化,如多步骤合成为一个步骤
  732 + while (1)
  733 + {
  734 + //获取当前时间
  735 + clock_gettime(CLOCK_MONOTONIC, &now);
  736 + long long current_time = now.tv_sec * NSEC_PER_SEC + now.tv_nsec;
  737 +
  738 + //计算时间差
  739 + long long elapsed_time = current_time - prev_time;
  740 +
  741 + //超过33ms
  742 + if (elapsed_time >= period)
  743 + {
  744 + if (g_MixedIrc_Buffer == NULL || g_MixedOpt_Buffer == NULL)
  745 + {
  746 + delayMs(100);
  747 + continue;
  748 + }
  749 +
  750 + while (g_MixedOptBuffer_UseFlag == JZ_FLAGCODE_ON)
  751 + {
  752 + delayUs(100);
  753 + }
  754 +
  755 + g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_ON;
  756 +
  757 + //填充输出图像
  758 + memset(DstImg->buf, 0x80, DstImg->buf_size);
  759 +
  760 + //混合视频处理
  761 + memset(Irc_SrcImg->buf, 0, Irc_SrcImg->buf_size);
  762 + memset(Opt_SrcImg->buf, 0, Opt_SrcImg->buf_size);
  763 +
  764 + //将数据放入缓冲区
  765 + memcpy(Irc_SrcImg->buf, g_MixedIrc_Buffer, (JZ_ALIGN(FIRST_WIDTH, 16)) * (JZ_ALIGN(FIRST_HEIGHT, 16)) * 3 / 2);
  766 + memcpy(Opt_SrcImg->buf, g_MixedOpt_Buffer, JZ_ALIGN(SECOND_WIDTH, 16) * JZ_ALIGN(SECOND_HEIGHT, 16) * 3 / 2);
  767 +
  768 + g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_OFF;
  769 +
  770 + //光学数据处理
  771 + //缩小图像到1/2
  772 + d_ret = imresize(Opt_SrcImg->img, Opt_ResizeImg->img);
  773 + if (d_ret != IM_STATUS_SUCCESS)
  774 + {
  775 + printf("irc resize failed\n");
  776 + continue;
  777 + }
  778 +
  779 + //红外数据处理
  780 + //放大图像到4倍
  781 + d_ret = imresize(Irc_SrcImg->img, Irc_ResizeImg->img);
  782 + if (d_ret != IM_STATUS_SUCCESS)
  783 + {
  784 + printf("opt resize failed\n");
  785 + continue;
  786 + }
  787 +
  788 + //裁切红外图像
  789 + d_ret = imcrop(Irc_ResizeImg->img, Irc_CropImg->img, Irc_CropRect);
  790 + if (d_ret != IM_STATUS_SUCCESS)
  791 + {
  792 + printf("opt crop failed\n");
  793 + continue;
  794 + }
  795 +
  796 + //将缩放好的光学画面放入目标画面
  797 + d_ret = improcess(Opt_ResizeImg->img, DstImg->img, EmptyImg, Opt_ResizeRect, Dst_OptRect, EmptyRect, IM_SYNC);
  798 + if (d_ret != IM_STATUS_SUCCESS)
  799 + {
  800 + printf("opt improcess failed\n");
  801 + continue;
  802 + }
  803 +
  804 + //将裁切好的红外画面放入目标画面
  805 + d_ret = improcess(Irc_CropImg->img, DstImg->img, EmptyImg, Irc_CropImg->rect, Dst_IrcRect, EmptyRect, IM_SYNC);
  806 + if (d_ret != IM_STATUS_SUCCESS)
  807 + {
  808 + printf("irc improcess failed\n");
  809 + }
  810 +
  811 + //将原始码流数据写入到编码器 并转换为h264
  812 + unsigned char *h264Data = NULL;
  813 + unsigned int h264DataLen = 0;
  814 +
  815 + //JZSDK_LOG_DEBUG("DstImg->buf_size:%d", DstImg->buf_size);
  816 +
  817 +#ifdef RTK_MPP_STATUS_ON
  818 + MppPacket Packet = NULL;
  819 +
  820 + RTK_mmp_enc_data_to_h264(JZsdk_RtkMmpGetEncHandleAddr(2), DstImg->buf, DstImg->buf_size, &Packet);
  821 +
  822 + h264DataLen = mpp_packet_get_length(Packet);
  823 + h264Data = (unsigned char *)mpp_packet_get_pos(Packet);
  824 + //EncCfg->Packet_eos = mpp_packet_get_eos(packet);
  825 + // printf("获取到编码内容 len:%d\n",packet_len);
  826 +
  827 + //释放掉packet
  828 + mpp_packet_deinit(&Packet);
  829 +#endif
  830 +
  831 + //推送视频流
  832 + JZC1_PushFrame(VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD, h264Data, h264DataLen);
  833 +
  834 + //JZSDK_LOG_DEBUG("混合一帧 :%d", h264DataLen);
  835 +
  836 + //更新时间
  837 + prev_time = current_time;
  838 + }
  839 +
  840 + // 为了防止过于频繁地调用 clock_gettime,可以添加一个小的睡眠时间
  841 + // 例如,休眠1毫秒(100000000纳秒),以减少CPU占用
  842 + struct timespec req = { .tv_sec = 0, .tv_nsec = 1000000 };
  843 + nanosleep(&req, NULL);
  844 + }
  845 +#endif
  846 +}
  847 +
  848 +
  849 +/******************
  850 + *
  851 + * 混合视频初始化
  852 + *
  853 + *
  854 + * ********************/
  855 +static JZC1_MixedVideo_Init()
  856 +{
  857 + g_MixedIrc_Buffer = (unsigned char *)malloc(JZ_ALIGN(FIRST_WIDTH, 16)*JZ_ALIGN(FIRST_HEIGHT, 16)*3/2);
  858 + g_MixedOpt_Buffer = (unsigned char *)malloc(JZ_ALIGN(SECOND_WIDTH, 16)*JZ_ALIGN(SECOND_HEIGHT, 16)*3/2);
  859 +
  860 + //混合视频初始化
  861 + pthread_t Task;
  862 + pthread_attr_t attribute; //线程属性
  863 + pthread_attr_init(&attribute); //初始化线程属性
  864 + pthread_attr_setdetachstate(&attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
  865 + int bufferdata_Protection = pthread_create(&Task,&attribute,MixedVideo_Thread,NULL); //线程
  866 + if(bufferdata_Protection != 0)
  867 + {
  868 + JZSDK_LOG_ERROR("创建混合视频初始化失败!");
  869 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  870 + }
  871 +
  872 + JZSDK_LOG_INFO("MixedVidoe_Init Success");
  873 +
  874 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  875 +}
  876 +
  877 +
  878 +#endif
  879 +
  880 +//JZ_C1 的媒体初始化
  881 +static T_JZsdkReturnCode JZC1_MediaInit()
  882 +{
  883 + T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  884 +
  885 +
  886 +//初始化媒体模块
  887 +#ifdef MEDIA_PROC_CONFIG_STATUS_ON
  888 +
  889 + //初始化videoMgmt模块
  890 + VideoMgmt_Init();
  891 +
  892 + //初始化Mulit模块
  893 + #ifdef RTK_MPP_STATUS_ON
  894 + //初始化红外的编解码器
  895 + RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(0), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, FIRST_WIDTH, FIRST_HEIGHT, 30, 5);
  896 +
  897 + //初始化光学的编解码器
  898 + RTK_mmp_dec_Init(JZsdk_RtkMmpGetDecHandleAddr(1), MPP_VIDEO_CodingMJPEG, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT);
  899 + RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(1), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT, 30, 15);
  900 +
  901 + // RTK_mmp_dec_Init(JZsdk_RtkMmpGetDecHandleAddr(1), MPP_VIDEO_CodingMJPEG, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT);
  902 + // RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(1), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT, 30, 15);
  903 +
  904 + //初始化混合视频流的编码器
  905 + RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(2), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT, 30, 15);
  906 +
  907 + #endif
  908 +
  909 + //初始化Camera模块
  910 + int CameraFd = -1;
  911 + ret = V4l2_Camarainit2(&CameraFd, SECOND_WIDTH, SECOND_HEIGHT, 30);
  912 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  913 + {
  914 + JZSDK_LOG_ERROR("光学相机启动失败");
  915 + }
  916 + else
  917 + {
  918 +
  919 + //光学相机的抓取
  920 + ret = JZsdk_FrameCatch_Single(JZC1_OptDeal);
  921 + }
  922 +
  923 + //初始化IRC_funtion模块
  924 + ret = IRC_ParamInit(FIRST_HEIGHT, FIRST_WIDTH, 25);
  925 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  926 + {
  927 + JZSDK_LOG_ERROR("初始化红外的数据处理失败");
  928 + }
  929 + else
  930 + {
  931 + //初始化红外的数据输入
  932 + ret = JZsdk_JZC1_Irc_Data_Init();
  933 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  934 + {
  935 + JZSDK_LOG_ERROR("红外相机初始化失败");
  936 + }
  937 + }
  938 +
  939 + //设置默认参数
  940 +
  941 + //默认推送红外摄像头 后续改成 红外+光学 的组合画面
  942 + VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD);
  943 +
  944 + //设置快门为开
  945 + JZsdk_Camera_ShutterSwitch(JZ_FLAGCODE_ON);
  946 +
  947 + //设置伪彩颜色为hot
  948 + int value = 8;
  949 + Camera_param(JZ_FLAGCODE_SET, CAMERA_PSEUDO_COLOR, &value);
  950 +
  951 + //设置为默认输出模式
  952 + value = 0;
  953 + Camera_param(JZ_FLAGCODE_SET, CAMERA_PIXEL_PSEUDO_COLOR_MODE, &value);
  954 +
  955 + //设置默认打开自动校正
  956 + value = JZ_FLAGCODE_ON;
  957 + Proc_IRC_param(JZ_FLAGCODE_SET, JZSDK_WIDGET_BAD_PIXEL_CORRECT_MODE, &value);
  958 +
  959 + //初始化变焦模块
  960 + Cam_Zoom_Init();
  961 +
  962 + //初始化RGA模块
  963 +#ifdef RTK_RGA_STATUS_ON
  964 + ret = JZC1_RgaInit(&g_C1_RgaIrcInfo, JZ_ALIGN(FIRST_WIDTH, 16), JZ_ALIGN(FIRST_HEIGHT, 16), RK_FORMAT_YCbCr_420_SP);
  965 + ret = JZC1_RgaInit(&g_C1_RgaOptInfo, JZ_ALIGN(SECOND_WIDTH, 16), JZ_ALIGN(SECOND_HEIGHT, 16), RK_FORMAT_YCbCr_420_SP);
  966 +
  967 + //混合视频初始化
  968 + JZC1_MixedVideo_Init();
  969 +#endif
  970 +
  971 +#endif
  972 +
  973 +
  974 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  975 +}
  976 +
  977 +#ifdef RTK_RGA_STATUS_ON
  978 +
  979 +static T_JZsdkReturnCode JZC1_RgaInit(C1_RgaInfo **rgaInfo, int dst_width, int dst_height, int dst_format)
  980 +{
  981 +
  982 +
  983 + //初始化rga结构体
  984 + (*rgaInfo) = (C1_RgaInfo *)malloc(sizeof(C1_RgaInfo));
  985 + if ((*rgaInfo) == NULL)
  986 + {
  987 + JZSDK_LOG_ERROR("RGA初始化失败");
  988 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  989 + }
  990 +
  991 + int width = dst_width;
  992 + int height = dst_height;
  993 + int rect_x = 0;
  994 + int rect_y = 0;
  995 + int rect_w = dst_width;
  996 + int rect_h = dst_height;
  997 +
  998 +
  999 + (*rgaInfo)->src_img = NULL;
  1000 + RK_Rga_ImageInit(&(*rgaInfo)->src_img, width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化输入模块
  1001 +
  1002 + (*rgaInfo)->corp_img = NULL;
  1003 + RK_Rga_ImageInit(&(*rgaInfo)->corp_img, width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化裁剪模块
  1004 +
  1005 + (*rgaInfo)->dst_img = NULL;
  1006 + RK_Rga_ImageInit(&(*rgaInfo)->dst_img, width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化输出模块
  1007 +
  1008 +
  1009 +
  1010 +}
  1011 +
  1012 +#endif
  1013 +
  1014 +//rga处理
  1015 +#ifdef RTK_RGA_STATUS_ON
  1016 +static T_JZsdkReturnCode JZC1_RgaDeal(C1_RgaInfo *rga_info, int resize, unsigned char *image, unsigned int *imgage_size)
  1017 +{
  1018 + int d_ret;
  1019 +
  1020 +
  1021 + if (g_C1_RgaIrcInfo == NULL || *imgage_size != rga_info->src_img->buf_size)
  1022 + {
  1023 + printf("C1_Rga_Deal failed imagesize:%d bufsize:%d\n", *imgage_size, rga_info->src_img->buf_size);
  1024 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  1025 + }
  1026 +
  1027 + //检查裁剪倍数是否改变
  1028 + if (resize != rga_info->scale)
  1029 + {
  1030 + rga_info->scale = resize;
  1031 +
  1032 + //释放裁剪区域, 并重新注册
  1033 + if (rga_info->corp_img != NULL)
  1034 + {
  1035 + RK_Rga_ImageDeInit(&(rga_info->corp_img));
  1036 +
  1037 + int width = rga_info->src_img->width / resize;
  1038 + int height = rga_info->src_img->height / resize;
  1039 + int rect_x = (rga_info->src_img->width) / 2 - width / 2;
  1040 + int rect_y = (rga_info->src_img->height) / 2 - height / 2;
  1041 + int rect_w = width;
  1042 + int rect_h = height;
  1043 + int dst_format = rga_info->src_img->format;
  1044 +
  1045 + RK_Rga_ImageInit(&(rga_info->corp_img), width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化裁剪模块
  1046 + }
  1047 + }
  1048 +
  1049 + //将图像放入处理器
  1050 + memcpy(rga_info->src_img->buf, image, *imgage_size);
  1051 +
  1052 + //JZSDK_LOG_DEBUG("裁剪倍率%d",resize);
  1053 +
  1054 + if (resize == 0)
  1055 + {
  1056 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  1057 + }
  1058 +
  1059 + //裁剪图像
  1060 + d_ret = imcrop(rga_info->src_img->img, rga_info->corp_img->img, rga_info->corp_img->rect);
  1061 + if (d_ret != IM_STATUS_SUCCESS)
  1062 + {
  1063 + printf("crop failed resize:%d\n",resize);
  1064 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  1065 + }
  1066 +
  1067 + //缩放图像
  1068 + d_ret = imresize(rga_info->corp_img->img, rga_info->dst_img->img);
  1069 + if (d_ret != IM_STATUS_SUCCESS)
  1070 + {
  1071 + printf("resize failed\n");
  1072 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  1073 + }
  1074 +
  1075 + //返回图像
  1076 + memcpy(image, rga_info->dst_img->buf, rga_info->dst_img->buf_size);
  1077 + //printf("image[0]:%d image[1]:%d\n", image[0], image[1]);
  1078 + *imgage_size = rga_info->dst_img->buf_size;
  1079 +
  1080 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  1081 +
  1082 +
  1083 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  1084 +
  1085 +}
  1086 +
  1087 +#endif
  1088 +
  1089 +T_JZsdkReturnCode JZC1_Init()
  1090 +{
  1091 + T_JZsdkReturnCode ret;
  1092 +
  1093 + //初始化引脚
  1094 + Ircut_Init();
  1095 +
  1096 + //初始化媒体模块
  1097 + ret = JZC1_MediaInit();
  1098 +
  1099 + JZSDK_LOG_INFO("JZ_C1 INIT COMPLETED\n");
  1100 +
  1101 + return ret;
  1102 +}
  1103 +
  1104 +
  1105 +
  1106 +
  1107 +
  1108 +
  1109 +
  1110 +
  1111 +
  1112 +
  1113 +
  1114 +
  1115 +
  1116 +
  1 +/**
  2 + ********************************************************************
  3 + * @file JZC1.h
  4 + * JZC1.h的头文件
  5 + *
  6 + *********************************************************************
  7 + */
  8 +
  9 +/* Define to prevent recursive inclusion 避免重定义 -------------------------------------*/
  10 +#ifndef JZC1_H
  11 +#define JZC1_H
  12 +
  13 +#include "JZsdk_Base/JZsdk_Code/JZsdk_Code.h"
  14 +
  15 +
  16 +/* Includes ------------------------------------------------------------------*/
  17 +#ifdef __cplusplus
  18 +extern "C" {
  19 +#endif
  20 +
  21 +
  22 +
  23 +/* Exported constants --------------------------------------------------------*/
  24 +/* 常亮定义*/
  25 +
  26 +/* Exported types ------------------------------------------------------------*/
  27 +
  28 +T_JZsdkReturnCode JZC1_Init();
  29 +
  30 +
  31 +#ifdef __cplusplus
  32 +}
  33 +#endif
  34 +
  35 +#endif
@@ -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
@@ -17,6 +17,14 @@ @@ -17,6 +17,14 @@
17 17
18 static int CameraFd = 0; 18 static int CameraFd = 0;
19 19
  20 +//临时方案 后续会改写法合并到t_JZsdk_TaskFuntionInput(搞起来有点麻烦)
  21 +typedef struct t_FrameCatch_TaskFuntionInput
  22 +{
  23 + void (*task_function)(unsigned char*, unsigned int); //任务函数指针,用于指定 执行的任务
  24 + unsigned* data; //数据指针
  25 + unsigned int data_size; //数据大小
  26 +} t_FrameCatch_TaskFuntionInput;
  27 +
20 //多线程抓取数据线程 28 //多线程抓取数据线程
21 static void *JZsdk_Catch_MultiThread(void *args) 29 static void *JZsdk_Catch_MultiThread(void *args)
22 { 30 {
@@ -45,8 +53,49 @@ static void *JZsdk_Catch_MultiThread(void *args) @@ -45,8 +53,49 @@ static void *JZsdk_Catch_MultiThread(void *args)
45 } 53 }
46 54
47 55
48 -//单线程抓取数据线程  
49 -static void *JZsdk_Catch_SingleThread(void *args) 56 +/******************************
  57 + *
  58 + * 相机抓取初始化
  59 + * ThreadMode: 0为单线程 1为多线程
  60 + *
  61 + * ******************************/
  62 +T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode)
  63 +{
  64 + T_JZsdkReturnCode ret;
  65 +
  66 + //初始化数据接收线程
  67 + pthread_t ReadDataTask;
  68 + pthread_attr_t task_attribute; //线程属性
  69 + pthread_attr_init(&task_attribute); //初始化线程属性
  70 + pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
  71 +
  72 + if (ThreadMode == 0)
  73 + {
  74 + // int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_SingleThread,NULL); //线程
  75 + // if(opus_Protection != 0)
  76 + // {
  77 + // JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
  78 + // return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  79 + // }
  80 + }
  81 + else if (ThreadMode == 1)
  82 + {
  83 + int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_MultiThread,NULL); //线程
  84 + if(opus_Protection != 0)
  85 + {
  86 + JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
  87 + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  88 + }
  89 + }
  90 +
  91 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  92 +}
  93 +
  94 +
  95 +/*******************************************************************************************************************************************/
  96 +
  97 +//多线程抓取数据线程
  98 +static void *JZsdk_Catch_MultiThread2(void *args)
50 { 99 {
51 while (1) 100 while (1)
52 { 101 {
@@ -64,21 +113,55 @@ static void *JZsdk_Catch_SingleThread(void *args) @@ -64,21 +113,55 @@ static void *JZsdk_Catch_SingleThread(void *args)
64 continue; 113 continue;
65 } 114 }
66 115
  116 + //放入缓冲池 //将数据放入缓冲池,从而被其他线程使用
  117 + VideoMgmt_write_data(&args, buf, buf_size);
  118 +
  119 + //归还图片
  120 + V4L2_CameraFrameRecord_OnlyReturnFrame();
  121 + }
  122 +}
  123 +
  124 +
  125 +//单线程抓取数据线程
  126 +static void *JZsdk_Catch_SingleThread2(void *args)
  127 +{
  128 + t_FrameCatch_TaskFuntionInput *task = (t_FrameCatch_TaskFuntionInput *)args;
  129 +
  130 + while (1)
  131 + {
  132 +
  133 + unsigned int buf_size = 0;
  134 + unsigned char *buf = NULL;
  135 +
  136 + //从相机中读取一张照片
  137 + V4L2_CameraFrameRecord_OnlyGetFrame(&buf, &buf_size);
  138 +
  139 + //JZSDK_LOG_INFO("read: len:%d data[3]:%x data[4]:%x\n", buf_size, buf[3], buf[4]);
  140 +
  141 + if (buf == NULL)
  142 + {
  143 + JZSDK_LOG_ERROR("相机数据读取失败");
  144 + continue;
  145 + }
  146 +
67 //进行数据处理 147 //进行数据处理
68 - VideoMgmt_Single_FrameIn(buf, buf_size); 148 + task->task_function(buf, buf_size);
69 149
70 //归还图片 150 //归还图片
71 V4L2_CameraFrameRecord_OnlyReturnFrame(); 151 V4L2_CameraFrameRecord_OnlyReturnFrame();
72 } 152 }
73 } 153 }
74 154
75 -/****************************** 155 +
  156 +/********************************************
76 * 157 *
77 - * 相机抓取初始化  
78 - * ThreadMode: 0为单线程 1为多线程  
79 * 158 *
80 - * ******************************/  
81 -T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode) 159 + * 相机抓取多线程单线程
  160 + *
  161 + * 传入线程的处理函数 task_function
  162 + *
  163 + * *****************************************/
  164 +T_JZsdkReturnCode JZsdk_FrameCatch_Single(T_JZsdkReturnCode (*task_function)(unsigned char*, unsigned int))
82 { 165 {
83 T_JZsdkReturnCode ret; 166 T_JZsdkReturnCode ret;
84 167
@@ -88,24 +171,61 @@ T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode) @@ -88,24 +171,61 @@ T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode)
88 pthread_attr_init(&task_attribute); //初始化线程属性 171 pthread_attr_init(&task_attribute); //初始化线程属性
89 pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性 172 pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
90 173
91 - if (ThreadMode == 0) 174 +
  175 + //单线程模式
  176 + if (task_function == NULL)
  177 + {
  178 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  179 + }
  180 +
  181 + t_FrameCatch_TaskFuntionInput *task = (t_FrameCatch_TaskFuntionInput*)malloc(sizeof(t_FrameCatch_TaskFuntionInput));
  182 + if (task == NULL)
92 { 183 {
93 - int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_SingleThread,NULL); //线程 184 + // 处理内存分配失败的情况
  185 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  186 + }
  187 +
  188 + task->task_function = task_function;
  189 +
  190 + int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_SingleThread2,(void *)task); //线程
94 if(opus_Protection != 0) 191 if(opus_Protection != 0)
95 { 192 {
96 JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!"); 193 JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
97 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 194 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
98 } 195 }
99 - }  
100 - else if (ThreadMode == 1) 196 +
  197 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  198 +}
  199 +
  200 +/*************************
  201 + *
  202 + *
  203 + * 相机抓取多线程
  204 + *
  205 + *
  206 + * ******************/
  207 +T_JZsdkReturnCode JZsdk_FrameCatch_Multi(void *FrameIndex)
  208 +{
  209 + T_JZsdkReturnCode ret;
  210 +
  211 + //初始化数据接收线程
  212 + pthread_t ReadDataTask;
  213 + pthread_attr_t task_attribute; //线程属性
  214 + pthread_attr_init(&task_attribute); //初始化线程属性
  215 + pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
  216 +
  217 + if (FrameIndex == NULL)
101 { 218 {
102 - int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_MultiThread,NULL); //线程 219 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  220 + }
  221 +
  222 +
  223 + int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_MultiThread2, FrameIndex); //线程
103 if(opus_Protection != 0) 224 if(opus_Protection != 0)
104 { 225 {
105 JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!"); 226 JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!");
106 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 227 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
107 } 228 }
108 - }  
109 229
110 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 230 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
111 } 231 }
@@ -25,7 +25,8 @@ extern "C" { @@ -25,7 +25,8 @@ extern "C" {
25 25
26 /* Exported functions --------------------------------------------------------*/ 26 /* Exported functions --------------------------------------------------------*/
27 T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode); 27 T_JZsdkReturnCode JZsdk_FrameCatch_Init(int ThreadMode);
28 - 28 +T_JZsdkReturnCode JZsdk_FrameCatch_Single(T_JZsdkReturnCode (*task_function)(unsigned char*, unsigned int));
  29 +T_JZsdkReturnCode JZsdk_FrameCatch_Multi(void *FrameIndex);
29 30
30 31
31 #ifdef __cplusplus 32 #ifdef __cplusplus
  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
@@ -8,9 +8,9 @@ @@ -8,9 +8,9 @@
8 #include "./Camera.h" 8 #include "./Camera.h"
9 #include "version_choose.h" 9 #include "version_choose.h"
10 #include "BaseConfig.h" 10 #include "BaseConfig.h"
11 -#include "./Kt_Irc/Kt_Irc.h"  
12 #include "../ImageProc/PseudoColor/PseudoColor.h" 11 #include "../ImageProc/PseudoColor/PseudoColor.h"
13 #include "MediaProc/MediaProc_Param.h" 12 #include "MediaProc/MediaProc_Param.h"
  13 +#include "Ircut/ircut.h"
14 14
15 #include "MediaProc/IRC_funtion/IRC_funtion.h" 15 #include "MediaProc/IRC_funtion/IRC_funtion.h"
16 16
@@ -68,6 +68,8 @@ T_JZsdkReturnCode Camera_Init(int ThreadMode, int width, int height, int frame_n @@ -68,6 +68,8 @@ T_JZsdkReturnCode Camera_Init(int ThreadMode, int width, int height, int frame_n
68 68
69 } 69 }
70 70
  71 +
  72 +
71 //快门开关 73 //快门开关
72 /*********************************** 74 /***********************************
73 * 75 *
@@ -79,7 +81,20 @@ T_JZsdkReturnCode JZsdk_Camera_ShutterSwitch(int value) @@ -79,7 +81,20 @@ T_JZsdkReturnCode JZsdk_Camera_ShutterSwitch(int value)
79 { 81 {
80 T_JZsdkReturnCode ret; 82 T_JZsdkReturnCode ret;
81 #if DEVICE_VERSION == JZ_C1 83 #if DEVICE_VERSION == JZ_C1
82 - ret = JZsdk_Kt_Irc_ShutterSwitch(value); 84 +
  85 + if (value == JZ_FLAGCODE_ON)
  86 + {
  87 + ret = SysfsGPIO_Set_ircut(KT_IRC_SHUTTER_GPIO_NUM, 1);
  88 + }
  89 + else if (value == JZ_FLAGCODE_OFF)
  90 + {
  91 + ret = SysfsGPIO_Set_ircut(KT_IRC_SHUTTER_GPIO_NUM, 0);
  92 + }
  93 + else
  94 + {
  95 + ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
  96 + }
  97 +
83 #else 98 #else
84 ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 99 ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
85 #endif 100 #endif
@@ -298,6 +313,13 @@ T_JZsdkReturnCode Camera_param(int flagcode, enum CameraParam paramflag, int *va @@ -298,6 +313,13 @@ T_JZsdkReturnCode Camera_param(int flagcode, enum CameraParam paramflag, int *va
298 { 313 {
299 *value = g_CameraGasEnhancementColor; 314 *value = g_CameraGasEnhancementColor;
300 } 315 }
  316 + break;
  317 +
  318 + case CAMERA_RESIZE:
  319 + {
  320 + Cam_Zoom_GetValue(value);
  321 + }
  322 + break;
301 323
302 default: 324 default:
303 { 325 {
@@ -374,6 +396,15 @@ T_JZsdkReturnCode Camera_param(int flagcode, enum CameraParam paramflag, int *va @@ -374,6 +396,15 @@ T_JZsdkReturnCode Camera_param(int flagcode, enum CameraParam paramflag, int *va
374 } 396 }
375 break; 397 break;
376 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 +
377 default: 408 default:
378 { 409 {
379 *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
1 -#include <stdio.h>  
2 -#include <string.h>  
3 -#include <stdlib.h>  
4 -#include <pthread.h>  
5 -#include <unistd.h>  
6 -  
7 -#include "JZsdkLib.h"  
8 -#include "version_choose.h"  
9 -#include "BaseConfig.h"  
10 -  
11 -  
12 -#include "JZsdk_usb_bulk/JZsdk_usb_bulk.h"  
13 -#include "../V4L2_camera/V4L2_Record.h"  
14 -#include "../../MultProc/MultProc.h"  
15 -#include "../../MediaParm.h"  
16 -#include "../../VideoMgmt/VideoMgmt.h"  
17 -#include "Ircut/ircut.h"  
18 -#include "../Camera.h"  
19 -  
20 -#include "UI_control/UI_control.h"  
21 -#include "../../IRC_funtion/IRC_Param.h"  
22 -#include "../../IRC_funtion/IRC_funtion.h"  
23 -  
24 -#define IRC_WIDTH FIRST_WIDTH  
25 -#define IRC_HEIGHT FIRST_HEIGHT  
26 -  
27 -#define CAMERA_WIDTH SECOND_WIDTH  
28 -#define CAMERA_HEIGHT SECOND_HEIGHT  
29 -  
30 -static int Kt_Camera_fd;  
31 -  
32 -extern IRC_param *g_IRC_Param;  
33 -  
34 -  
35 -#define IRC_WIDTH FIRST_WIDTH  
36 -#define IRC_HEIGHT FIRST_HEIGHT  
37 -  
38 -// 定义帧头长度和帧头内容  
39 -#define FRAME_HEADER_SIZE 4  
40 -  
41 -static const unsigned char FRAME_HEADER[FRAME_HEADER_SIZE] = {0xaa, 0xbb, 0xcc, 0xdd};  
42 -  
43 -  
44 -static void *Irc_usb_index = NULL;  
45 -  
46 -//红外数据纠正函数, 暂定全部替换  
47 -T_JZsdkReturnCode Kt_Irc_DataCorrect(unsigned char *data)  
48 -{  
49 - //像素修正  
50 - data[0] = data[5];  
51 - data[1] = data[6];  
52 - data[2] = data[5];  
53 - data[3] = data[6];  
54 -}  
55 -  
56 -  
57 -//红外数据接收线程  
58 -static void *JZsdk_Kt_Irc_DataRecv_Thread(void *args)  
59 -{  
60 - int frame_len = IRC_WIDTH*2*IRC_HEIGHT; //163840  
61 - unsigned char buf[163840]; //usb数据缓冲区需要为512的倍数 4194304 后续考虑为 262144  
62 - unsigned char frameData[frame_len]; // 存储整帧数据的画面缓冲区  
63 - unsigned int lineNum = 0;  
64 - int frame = 0;  
65 - int frameDataLen = 0;//缓冲区的数据长度  
66 -  
67 - /*****  
68 - *  
69 - * 数据格式说明  
70 - *  
71 - * 帧头 0xaa 0xbb 0x02 0x80 0x01 0x00 + 行数 如第一行0x00 0x01  
72 - * 数据包长度为 0x0280  
73 - * 数据包 一包的行数为256 0x0100  
74 - * 当前数据为第x行 x= 0x0001  
75 - * 两位数据为一个点  
76 - * 接着把前4个点的数据 用第五个点替换掉  
77 - * *****/  
78 -  
79 - while (1)  
80 - {  
81 - int realLen;  
82 - memset(buf,0,sizeof(buf));  
83 - T_JZsdkReturnCode ret = JZsdk_HalUsbBulk_ReadData(&Irc_usb_index, buf, sizeof(buf), &realLen);  
84 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
85 - {  
86 - // 处理读取错误  
87 - JZSDK_LOG_ERROR("读取错误");  
88 - continue;  
89 - //return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
90 - }  
91 - if (realLen != 0)  
92 - {  
93 - //JZSDK_LOG_INFO("读取到%d 字节",realLen);  
94 - }  
95 -  
96 - //寻找数据是否存在帧头  
97 - for (int i = 0; i < realLen; i++)  
98 - {  
99 - // 验证帧头  
100 - if (memcmp(buf+i, FRAME_HEADER, FRAME_HEADER_SIZE) != 0)  
101 - {  
102 - // 帧头不匹配,可能是噪声或错误的数据包  
103 - continue;  
104 - }  
105 -  
106 -/**********************  
107 - *  
108 - * 方法一,将usb缓冲区调整大小 到超过640*256, 然后直接输出整段画面,避免重复复制,节省处理时间  
109 - *  
110 - * ******************************/  
111 - //如果查找到帧头  
112 -  
113 - //查看是否是第0帧  
114 - if (frame == 0)  
115 - {  
116 - //重置掉画面缓冲区  
117 - memset(frameData,0,sizeof(frameData));  
118 -  
119 - //将数据置于缓冲区  
120 - frameDataLen = (realLen-i);  
121 - memcpy( &frameData[0], buf + i, frameDataLen);  
122 -  
123 - //让画面帧强跳到第一帧  
124 - frame = 1;  
125 -  
126 - continue;  
127 - }  
128 -  
129 - //如果是第一帧  
130 - if (frame == 1)  
131 - {  
132 - memcpy( &frameData[frameDataLen], buf, frame_len-frameDataLen );  
133 -  
134 - VideoMgmt_write_data(&VideoMgmt_FirstRaw_index, frameData, frame_len);  
135 -  
136 - frame = 2;  
137 - frameDataLen = 0;  
138 - //memset(frameData,0,sizeof(frameData));  
139 - }  
140 -  
141 -  
142 - //如果不是第1帧,且上段数据小于一画面段,说明为数据被切割  
143 - if ( i<frame_len)  
144 - {  
145 - //则于前端残余数据拼接,并输出  
146 - if (frame%2==0 && (frame != 1) )  
147 - {  
148 -  
149 - memcpy( &frameData[frame_len-i], buf, i);  
150 - //将未处理raw数据放入缓冲区  
151 -  
152 - //JZSDK_LOG_INFO("写入1 %d %x", i, frameData[20]);  
153 -  
154 - VideoMgmt_write_data(&VideoMgmt_FirstRaw_index, frameData, frame_len);  
155 - //JZSDK_LOG_INFO("放入数据到缓冲区");  
156 - //memset(frameData,0,sizeof(frameData));  
157 - }  
158 - frame++;  
159 - }  
160 -  
161 - //如果剩余长度超出一画数据,将画面数据整段输出  
162 - if ( (i + frame_len) < realLen)  
163 - {  
164 - if (frame%2==0)  
165 - {  
166 - //JZSDK_LOG_INFO("写入2");  
167 -  
168 - memcpy( &frameData[0], buf, frame_len);  
169 -  
170 - //将未处理raw数据放入缓冲区  
171 - VideoMgmt_write_data(&VideoMgmt_FirstRaw_index, frameData, frame_len);  
172 - //JZSDK_LOG_INFO("放入数据到缓冲区");  
173 - }  
174 - frame++;  
175 - continue;  
176 - }  
177 -  
178 - //JZSDK_LOG_INFO("i:%d, frame_len:%d realLen:%d frame:%d",i,frame_len,realLen,frame);  
179 -  
180 - //如果剩余数据小于一画,存进画面缓冲区  
181 - //memset(frameData,0,sizeof(frameData));  
182 - memcpy(frameData, buf+i, (realLen-i));  
183 - break;  
184 - }  
185 - }  
186 -}  
187 -  
188 -//红外相机数据的初始化  
189 -T_JZsdkReturnCode JZsdk_Kt_Irc_Data_Init()  
190 -{  
191 - T_JZsdkReturnCode ret;  
192 -  
193 - //初始化接收的usb口  
194 - ret = JZsdk_HalUsbBulk_Init(&Irc_usb_index, 0, 0, LINUX_USB_PID, LINUX_USB_VID, USB_IN_POINT, USB_OUT_POINT);  
195 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
196 - {  
197 - return ret;  
198 - }  
199 -  
200 - //初始化usb接收线程  
201 - pthread_t ReadDataTask;  
202 - pthread_attr_t task_attribute; //线程属性  
203 - pthread_attr_init(&task_attribute); //初始化线程属性  
204 - pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性  
205 - int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Kt_Irc_DataRecv_Thread,NULL); //线程  
206 - if(opus_Protection != 0)  
207 - {  
208 - JZSDK_LOG_ERROR("创建视频usb线程失败!");  
209 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
210 - }  
211 -  
212 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
213 -}  
214 -  
215 -  
216 -//红外数据的处理  
217 -static void *JZsdk_Kt_Irc_DataDeal_Thread(void *args)  
218 -{  
219 - int DealFrameNum = 0;  
220 - unsigned char BaseBuffer[IRC_WIDTH*2*IRC_HEIGHT];  
221 -  
222 - while (1)  
223 - {  
224 - unsigned char *gary_data = NULL;  
225 - unsigned int gary_data_len;  
226 - //1、从原始流缓冲区中取出raw数据  
227 - VideoMgmt_read_data(&VideoMgmt_FirstRaw_index, &gary_data, &gary_data_len,JZ_FLAGCODE_OFF ,JZ_FLAGCODE_OFF);  
228 -  
229 - //2、红外数据纠正处理  
230 - Kt_Irc_DataCorrect(gary_data);  
231 -  
232 - //3、将灰度图数据转换为原始码流数据  
233 - unsigned char *raw_data = NULL;  
234 - int raw_data_len = 0;  
235 - IRC_FrameDeal(gary_data, gary_data_len, &raw_data, &raw_data_len);  
236 -  
237 - //4、将原始码流数据转换成h264流,为避免多次复制,这里的h264会直接放入视频流管理的缓冲区  
238 - JZsdk_RTKMMP_RawData_to_h264(raw_data, raw_data_len);  
239 -  
240 - //5、释放内存  
241 - if (raw_data != NULL)  
242 - {  
243 - if (raw_data != NULL)  
244 - {  
245 - free(raw_data);  
246 - raw_data = NULL;  
247 - }  
248 -  
249 - if (gary_data != NULL)  
250 - {  
251 - }  
252 -  
253 - if (gary_data != NULL)  
254 - {  
255 - free(gary_data);  
256 - gary_data = NULL;  
257 - }  
258 - }  
259 -  
260 - //JZSDK_LOG_DEBUG("得到了一帧红外h264");  
261 - }  
262 -}  
263 -  
264 -//红外相机数据的处理线程  
265 -static T_JZsdkReturnCode JZsdk_Kt_Irc_DataDeal_Init()  
266 -{  
267 - pthread_t ReadDataTask;  
268 - pthread_attr_t task_attribute; //线程属性  
269 - pthread_attr_init(&task_attribute); //初始化线程属性  
270 - pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性  
271 - int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Kt_Irc_DataDeal_Thread,NULL); //线程  
272 - if(opus_Protection != 0)  
273 - {  
274 - JZSDK_LOG_ERROR("创建红外相机数据的处理线程失败!");  
275 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
276 - }  
277 -  
278 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
279 -}  
280 -  
281 -//光学相机数据的处理线程  
282 -static void *JZsdk_Kt_Cam_DataDeal_Thread(void *args)  
283 -{  
284 - int DealFrameNum = 0;  
285 - while (1)  
286 - {  
287 - unsigned char *raw_data = NULL;  
288 - unsigned int raw_data_len;  
289 - //1、从原始流缓冲区中取出raw数据  
290 - VideoMgmt_read_data(&VideoMgmt_SecondRaw_index, &raw_data, &raw_data_len,JZ_FLAGCODE_OFF ,JZ_FLAGCODE_OFF);  
291 -  
292 - //2、将raw数据流转换成h264流,并放置到视频流缓冲区  
293 - JZsdk_Kt_CamMMP_Mjpeg_to_h264(raw_data, raw_data_len);  
294 -  
295 - free(raw_data);  
296 - raw_data = NULL;  
297 -  
298 - //DealFrameNum++;  
299 - //printf("get Cam Frame%d\n",DealFrameNum);  
300 -  
301 - }  
302 -}  
303 -  
304 -//光学相机数据的处理线程  
305 -static T_JZsdkReturnCode JZsdk_Kt_Cam_DataDeal_Init()  
306 -{  
307 - pthread_t ReadDataTask;  
308 - pthread_attr_t task_attribute; //线程属性  
309 - pthread_attr_init(&task_attribute); //初始化线程属性  
310 - pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性  
311 - int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Kt_Cam_DataDeal_Thread,NULL); //线程  
312 - if(opus_Protection != 0)  
313 - {  
314 - JZSDK_LOG_ERROR("创建红外相机数据的处理线程失败!");  
315 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
316 - }  
317 -  
318 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
319 -}  
320 -  
321 -//光学相机数据读取线程  
322 -static void *JZsdk_Kt_Cam_Data_Thread(void *args)  
323 -{  
324 - while (1)  
325 - {  
326 - unsigned int buf_size = 0;  
327 - unsigned char *buf = NULL;  
328 -  
329 - //从相机中读取一张照片  
330 - V4L2_CameraFrameRecord_OnlyGetFrame(&buf, &buf_size);  
331 -  
332 - if (buf == NULL)  
333 - {  
334 - JZSDK_LOG_ERROR("相机数据读取失败");  
335 - continue;  
336 - }  
337 -  
338 -  
339 - //放入缓冲池  
340 - VideoMgmt_write_data(&VideoMgmt_SecondRaw_index, buf, buf_size);  
341 -  
342 - //归还图片  
343 - V4L2_CameraFrameRecord_OnlyReturnFrame();  
344 - }  
345 -}  
346 -  
347 -//光学相机初始化  
348 -static T_JZsdkReturnCode JZsdk_Kt_Camera_Init()  
349 -{  
350 - T_JZsdkReturnCode ret;  
351 -  
352 - //初始化摄像头  
353 - ret = V4l2_Camarainit2(&Kt_Camera_fd,CAMERA_WIDTH,CAMERA_HEIGHT,30);  
354 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
355 - {  
356 - return ret;  
357 - }  
358 -  
359 -  
360 - //初始化数据接收线程  
361 - pthread_t ReadDataTask;  
362 - pthread_attr_t task_attribute; //线程属性  
363 - pthread_attr_init(&task_attribute); //初始化线程属性  
364 - pthread_attr_setdetachstate(&task_attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性  
365 - int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Kt_Cam_Data_Thread,NULL); //线程  
366 - if(opus_Protection != 0)  
367 - {  
368 - JZSDK_LOG_ERROR("创建v4l2线程失败!");  
369 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
370 - }  
371 -  
372 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
373 -}  
374 -  
375 -//昆腾相机初始化  
376 -T_JZsdkReturnCode JZsdk_Kt_Irc_Camera_Init()  
377 -{  
378 - T_JZsdkReturnCode ret;  
379 -  
380 - //1、初始化光学相机  
381 - ret = JZsdk_Kt_Camera_Init();  
382 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
383 - {  
384 - JZSDK_LOG_ERROR("光学相机初始化失败");  
385 - }  
386 - else  
387 - {  
388 - //初始化数据转换模块  
389 - JZsdk_Kt_Cam_DataDeal_Init();  
390 - }  
391 -  
392 - //2、初始化红外的数据处理  
393 - ret = IRC_ParamInit(&g_IRC_Param, IRC_HEIGHT, IRC_WIDTH, 25);  
394 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
395 - {  
396 - JZSDK_LOG_ERROR("初始化红外的数据处理失败");  
397 - }  
398 -  
399 - //3、初始化红外的数据输入  
400 - ret = JZsdk_Kt_Irc_Data_Init();  
401 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
402 - {  
403 - JZSDK_LOG_ERROR("红外相机初始化失败");  
404 - }  
405 - else  
406 - {  
407 - //初始化数据转换模块  
408 - JZsdk_Kt_Irc_DataDeal_Init();  
409 - }  
410 -  
411 - JZSDK_LOG_INFO("KT_Irc init complete");  
412 -  
413 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
414 -}  
415 -  
416 -//昆腾的红外相机的快门开关  
417 -/***********************************  
418 - *  
419 - * value on为开 off为关  
420 - *  
421 - *  
422 - * ***************************************/  
423 -T_JZsdkReturnCode JZsdk_Kt_Irc_ShutterSwitch(int value)  
424 -{  
425 - T_JZsdkReturnCode ret;  
426 - if (value == JZ_FLAGCODE_ON)  
427 - {  
428 - ret = SysfsGPIO_Set_ircut(KT_IRC_SHUTTER_GPIO_NUM, 1);  
429 - }  
430 - else if (value == JZ_FLAGCODE_OFF)  
431 - {  
432 - ret = SysfsGPIO_Set_ircut(KT_IRC_SHUTTER_GPIO_NUM, 0);  
433 - }  
434 - else  
435 - {  
436 - ret = JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
437 - }  
438 -  
439 - return ret;  
440 -}  
441 -  
@@ -57,10 +57,12 @@ typedef struct IRC_param @@ -57,10 +57,12 @@ typedef struct IRC_param
57 //单点校正(Single-Point Correction -> SPC) 57 //单点校正(Single-Point Correction -> SPC)
58 double *SPC_Diff; // spc截距数组 即计算得到的增益 58 double *SPC_Diff; // spc截距数组 即计算得到的增益
59 double *SPC_Slope; // spc斜率数组 即计算得到的补正 59 double *SPC_Slope; // spc斜率数组 即计算得到的补正
60 - U16_t *SPC_Mark_Data; 60 +
61 unsigned int FirstSPC_flag; //第一次使用spc的标志位 61 unsigned int FirstSPC_flag; //第一次使用spc的标志位
62 unsigned int SPC_ResetFlag; //spc校准标志位 开启时进行spc校准 62 unsigned int SPC_ResetFlag; //spc校准标志位 开启时进行spc校准
63 63
  64 + U16_t *SPC_Mark_Data; //spc标定帧灰度
  65 +
64 unsigned int SPC_mode; //spc模式 0低温画面打档 1手动打档 2定时打档 66 unsigned int SPC_mode; //spc模式 0低温画面打档 1手动打档 2定时打档
65 unsigned int SPC_LastMode; //上一次spc模式 67 unsigned int SPC_LastMode; //上一次spc模式
66 68
@@ -69,15 +71,24 @@ typedef struct IRC_param @@ -69,15 +71,24 @@ typedef struct IRC_param
69 unsigned int SPC_auto_time_flag; //spc定时自动打档标志位,用于计算打档时间 71 unsigned int SPC_auto_time_flag; //spc定时自动打档标志位,用于计算打档时间
70 72
71 //两点矫正(Two-Point Correction -> TPC) 73 //两点矫正(Two-Point Correction -> TPC)
72 - double *TPC_Diff; // tpc截距数组 即计算得到的增益  
73 - double *TPC_Slope; // tpc斜率数组 即计算得到的补正 74 + double *TPC_Gain; // tpc斜率数组 即计算得到的校准增益
  75 + double *TPC_Offset; // tpc截距数组 即计算得到的校正偏移值
74 76
75 - unsigned int TPC_mode; //tpc模式 0出厂打档 1手动打档 77 + unsigned int TPC_ResetFlag; //tpc校准标志位 开启时进行tpc校准
  78 +
  79 + unsigned int TPC_mode; //tpc数据模式 0出厂数据 1手动数据A 2手动数据B 3手动数据C 4手动数据D
  80 + unsigned int TPC_LastTPCMode; //上一次tpc数据模式
76 81
77 //画面纠正模式 82 //画面纠正模式
78 unsigned int FrameCorrectMode; //画面纠正模式 0 无纠正 1 单点纠正 2 两点纠正 83 unsigned int FrameCorrectMode; //画面纠正模式 0 无纠正 1 单点纠正 2 两点纠正
79 84
80 // 高低温标定 85 // 高低温标定
  86 + U16_t *Factory_HighT_Mark_Data; //出厂的高温标定帧灰度
  87 + unsigned int Factory_HighT_Mark_Data_flag; //出厂的高温标定帧灰度标志位
  88 +
  89 + U16_t *Factory_LowT_Mark_Data; //出厂的低温标定帧灰度
  90 + unsigned int Factory_LowT_Mark_Data_flag; //出厂的高温标定帧灰度标志位
  91 +
81 U16_t *HighT_NineFrameAdd; //高温温度判定时的9帧综合数组 92 U16_t *HighT_NineFrameAdd; //高温温度判定时的9帧综合数组
82 U16_t *HighT_NineFrame_Avg; //高温温度判定时的9帧综合数组平均值 93 U16_t *HighT_NineFrame_Avg; //高温温度判定时的9帧综合数组平均值
83 unsigned int HighT_flag; //高温判定标志 0~9 0关闭,1~9 为计数 94 unsigned int HighT_flag; //高温判定标志 0~9 0关闭,1~9 为计数
@@ -117,13 +128,27 @@ typedef struct IRC_param @@ -117,13 +128,27 @@ typedef struct IRC_param
117 128
118 typedef enum TEMP_CHOOSE 129 typedef enum TEMP_CHOOSE
119 { 130 {
120 - HIGH_SD_TEMP = 0,  
121 - LOW_SD_TEMP = 1,  
122 - HIGH_LOCAL_TEMP = 2,  
123 - LOW_LOCAL_TEMP = 3, 131 +
124 SPC_MARK_DATA = 4, 132 SPC_MARK_DATA = 4,
125 HIGH_DGCE_THRESHOLD = 5, 133 HIGH_DGCE_THRESHOLD = 5,
126 LOW_DGCE_THRESHOLD = 6, 134 LOW_DGCE_THRESHOLD = 6,
  135 +
  136 +
  137 + FACTORY_HIGH_TEMP = 10, //出厂高温数据
  138 + FACTORY_LOW_TEMP = 11, //出厂低温数据
  139 +
  140 + LOCAL_HIGH_TEMP_1 = 12, //手动高温数据1型
  141 + LOCAL_LOW_TEMP_1 = 13, //手动低温数据1型
  142 +
  143 + LOCAL_HIGH_TEMP_2 = 14, //手动高温数据2型
  144 + LOCAL_LOW_TEMP_2 = 15, //手动低温数据2型
  145 +
  146 + LOCAL_HIGH_TEMP_3 = 16, //手动高温数据3型
  147 + LOCAL_LOW_TEMP_3 = 17, //手动低温数据3型
  148 +
  149 + LOCAL_HIGH_TEMP_4 = 18, //手动高温数据4型
  150 + LOCAL_LOW_TEMP_4 = 19, //手动低温数据4型
  151 +
127 }TEMP_CHOOSE; 152 }TEMP_CHOOSE;
128 153
129 /* Exported types ------------------------------------------------------------*/ 154 /* Exported types ------------------------------------------------------------*/
@@ -9,10 +9,21 @@ @@ -9,10 +9,21 @@
9 #include "./IRC_data_deal.h" 9 #include "./IRC_data_deal.h"
10 10
11 #define IRC_FILE_DIR "/root/IRC_File" 11 #define IRC_FILE_DIR "/root/IRC_File"
12 -#define HIGH_SD_DIR "AvgMarkedHighT.txt"  
13 -#define LOW_SD_DIR "AvgMarkedLowT.txt"  
14 -#define HIGH_LOCAL_DIR "AvgMarkedHighTLocal.txt"  
15 -#define LOW_LOCAL_DIR "AvgMarkedLowTLocal.txt" 12 +#define FACTORY_HIGH_DATA_DIR "AvgMarkedHighT.txt"
  13 +#define FACTORY_LOW_DATA_DIR "AvgMarkedLowT.txt"
  14 +
  15 +#define LOCAL_HIGH_SPC_DATA_DIR "AvgMarkedHighTLocal.txt" //沿用之前的
  16 +#define LOCAL_LOW_SPC_DATA_DIR "AvgMarkedLowTLocal.txt" //沿用之前的
  17 +
  18 +#define LOCAL_HIGH_SPC_DATA_DIR_2 "AvgMarkedHighTLocal_2.txt"
  19 +#define LOCAL_LOW_SPC_DATA_DIR_2 "AvgMarkedLowTLocal_2.txt"
  20 +
  21 +#define LOCAL_HIGH_SPC_DATA_DIR_3 "AvgMarkedHighTLocal_3.txt"
  22 +#define LOCAL_LOW_SPC_DATA_DIR_3 "AvgMarkedLowTLocal_3.txt"
  23 +
  24 +#define LOCAL_HIGH_SPC_DATA_DIR_4 "AvgMarkedHighTLocal_4.txt"
  25 +#define LOCAL_LOW_SPC_DATA_DIR_4 "AvgMarkedLowTLocal_4.txt"
  26 +
16 #define SPC_MARK_DATA_DIR "SPCMarkData.txt" 27 #define SPC_MARK_DATA_DIR "SPCMarkData.txt"
17 28
18 #define HIGH_THRESHOLD_DIR "/root/highThreshold.txt" 29 #define HIGH_THRESHOLD_DIR "/root/highThreshold.txt"
@@ -55,8 +66,11 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d @@ -55,8 +66,11 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d
55 dealInfo->LowT_NineFrameAdd[i] += ImageData[i]; 66 dealInfo->LowT_NineFrameAdd[i] += ImageData[i];
56 } 67 }
57 dealInfo->LowT_flag++; 68 dealInfo->LowT_flag++;
  69 +
58 } 70 }
59 71
  72 + JZSDK_LOG_DEBUG("低温标定基准值已存入%d组",dealInfo->LowT_flag - 1);
  73 +
60 if (dealInfo->LowT_flag > 9) //已经存储了9组数据 74 if (dealInfo->LowT_flag > 9) //已经存储了9组数据
61 { 75 {
62 for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++) 76 for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++)
@@ -64,9 +78,6 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d @@ -64,9 +78,6 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d
64 dealInfo->LowT_NineFrame_Avg[i] = dealInfo->LowT_NineFrameAdd[i] / 9; 78 dealInfo->LowT_NineFrame_Avg[i] = dealInfo->LowT_NineFrameAdd[i] / 9;
65 } 79 }
66 80
67 - //存放到本地  
68 - IRC_LocalFrame_DataWrite(LOW_LOCAL_TEMP,dealInfo, (U16_t *)dealInfo->LowT_NineFrame_Avg, dealInfo->PixelNum);  
69 -  
70 dealInfo->LowT_flag = JZ_FLAGCODE_OFF; //将标志位归位 81 dealInfo->LowT_flag = JZ_FLAGCODE_OFF; //将标志位归位
71 82
72 JZSDK_LOG_DEBUG("低温数据记录完成"); 83 JZSDK_LOG_DEBUG("低温数据记录完成");
@@ -111,6 +122,8 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param @@ -111,6 +122,8 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param
111 dealInfo->HighT_flag++; 122 dealInfo->HighT_flag++;
112 } 123 }
113 124
  125 + JZSDK_LOG_DEBUG("高温标定基准值已存入%d组",dealInfo->HighT_flag - 1);
  126 +
114 if (dealInfo->HighT_flag > 9) //已经存储了9组数据 127 if (dealInfo->HighT_flag > 9) //已经存储了9组数据
115 { 128 {
116 for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++) 129 for (int i = 0; i < (dealInfo->Width * dealInfo->Height); i++)
@@ -118,9 +131,6 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param @@ -118,9 +131,6 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param
118 dealInfo->HighT_NineFrame_Avg[i] = dealInfo->HighT_NineFrameAdd[i] / 9; 131 dealInfo->HighT_NineFrame_Avg[i] = dealInfo->HighT_NineFrameAdd[i] / 9;
119 } 132 }
120 133
121 - //存放到本地  
122 - IRC_LocalFrame_DataWrite(HIGH_LOCAL_TEMP,dealInfo, (U16_t *)dealInfo->HighT_NineFrame_Avg, dealInfo->PixelNum);  
123 -  
124 dealInfo->HighT_flag = JZ_FLAGCODE_OFF; //将标志位归位 134 dealInfo->HighT_flag = JZ_FLAGCODE_OFF; //将标志位归位
125 135
126 JZSDK_LOG_DEBUG("高温数据记录完成"); 136 JZSDK_LOG_DEBUG("高温数据记录完成");
@@ -661,19 +671,44 @@ T_JZsdkReturnCode IRC_LocalFrame_DataRead(int flag,struct IRC_param *dealInfo) @@ -661,19 +671,44 @@ T_JZsdkReturnCode IRC_LocalFrame_DataRead(int flag,struct IRC_param *dealInfo)
661 671
662 switch (flag) 672 switch (flag)
663 { 673 {
664 - case HIGH_SD_TEMP:  
665 - snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, HIGH_SD_DIR); 674 + case FACTORY_HIGH_TEMP:
  675 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, FACTORY_HIGH_DATA_DIR);
  676 + break;
  677 +
  678 + case LOCAL_HIGH_TEMP_1:
  679 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR);
  680 + break;
  681 +
  682 + case LOCAL_HIGH_TEMP_2:
  683 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR_2);
  684 + break;
  685 +
  686 + case LOCAL_HIGH_TEMP_3:
  687 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR_3);
  688 + break;
  689 +
  690 + case LOCAL_HIGH_TEMP_4:
  691 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR_4);
  692 + break;
  693 +
  694 + case FACTORY_LOW_TEMP:
  695 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, FACTORY_LOW_DATA_DIR);
  696 + break;
  697 +
  698 + case LOCAL_LOW_TEMP_1:
  699 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR);
666 break; 700 break;
667 701
668 - case LOW_SD_TEMP:  
669 - snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOW_SD_DIR); 702 + case LOCAL_LOW_TEMP_2:
  703 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR_2);
  704 + break;
670 705
671 - case HIGH_LOCAL_TEMP:  
672 - snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, HIGH_LOCAL_DIR); 706 + case LOCAL_LOW_TEMP_3:
  707 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR_3);
673 break; 708 break;
674 709
675 - case LOW_LOCAL_TEMP:  
676 - snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOW_LOCAL_DIR); 710 + case LOCAL_LOW_TEMP_4:
  711 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR_4);
677 break; 712 break;
678 713
679 case SPC_MARK_DATA: 714 case SPC_MARK_DATA:
@@ -697,7 +732,6 @@ T_JZsdkReturnCode IRC_LocalFrame_DataRead(int flag,struct IRC_param *dealInfo) @@ -697,7 +732,6 @@ T_JZsdkReturnCode IRC_LocalFrame_DataRead(int flag,struct IRC_param *dealInfo)
697 int capacity = 0; // 用于记录当前分配的内存容量 732 int capacity = 0; // 用于记录当前分配的内存容量
698 U16_t *numbers = NULL; // 用于存储已读取的整数 733 U16_t *numbers = NULL; // 用于存储已读取的整数
699 734
700 - // 读取数据  
701 while (fscanf(fp, "%d", &num) == 1) { 735 while (fscanf(fp, "%d", &num) == 1) {
702 // 如果当前容量不足以存储新元素,则增加容量 736 // 如果当前容量不足以存储新元素,则增加容量
703 if (count >= capacity) { 737 if (count >= capacity) {
@@ -726,24 +760,22 @@ T_JZsdkReturnCode IRC_LocalFrame_DataRead(int flag,struct IRC_param *dealInfo) @@ -726,24 +760,22 @@ T_JZsdkReturnCode IRC_LocalFrame_DataRead(int flag,struct IRC_param *dealInfo)
726 760
727 switch (flag) 761 switch (flag)
728 { 762 {
729 - case HIGH_SD_TEMP: 763 + case FACTORY_HIGH_TEMP:
  764 + case LOCAL_HIGH_TEMP_1:
  765 + case LOCAL_HIGH_TEMP_2:
  766 + case LOCAL_HIGH_TEMP_3:
  767 + case LOCAL_HIGH_TEMP_4:
730 memcpy(dealInfo->HighT_NineFrame_Avg, numbers, count * sizeof(U16_t)); 768 memcpy(dealInfo->HighT_NineFrame_Avg, numbers, count * sizeof(U16_t));
731 - JZSDK_LOG_DEBUG("读取高SD温度数据"); 769 + JZSDK_LOG_DEBUG("读取高数据");
732 break; 770 break;
733 771
734 - case LOW_SD_TEMP: 772 + case FACTORY_LOW_TEMP:
  773 + case LOCAL_LOW_TEMP_1:
  774 + case LOCAL_LOW_TEMP_2:
  775 + case LOCAL_LOW_TEMP_3:
  776 + case LOCAL_LOW_TEMP_4:
735 memcpy(dealInfo->LowT_NineFrame_Avg, numbers, count * sizeof(U16_t)); 777 memcpy(dealInfo->LowT_NineFrame_Avg, numbers, count * sizeof(U16_t));
736 - JZSDK_LOG_DEBUG("读取低SD温度数据");  
737 - break;  
738 -  
739 - case HIGH_LOCAL_TEMP:  
740 - memcpy(dealInfo->HighT_NineFrame_Avg, numbers, count * sizeof(U16_t));  
741 - JZSDK_LOG_DEBUG("读取高本地温度数据");  
742 - break;  
743 -  
744 - case LOW_LOCAL_TEMP:  
745 - memcpy(dealInfo->LowT_NineFrame_Avg, numbers, count * sizeof(U16_t));  
746 - JZSDK_LOG_DEBUG("读取低本地温度数据"); 778 + JZSDK_LOG_DEBUG("读取低温数据");
747 break; 779 break;
748 780
749 case SPC_MARK_DATA: 781 case SPC_MARK_DATA:
@@ -796,19 +828,44 @@ T_JZsdkReturnCode IRC_LocalFrame_DataWrite(int flag,struct IRC_param *dealInfo, @@ -796,19 +828,44 @@ T_JZsdkReturnCode IRC_LocalFrame_DataWrite(int flag,struct IRC_param *dealInfo,
796 828
797 switch (flag) 829 switch (flag)
798 { 830 {
799 - case HIGH_SD_TEMP:  
800 - snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, HIGH_SD_DIR); 831 + case FACTORY_HIGH_TEMP:
  832 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, FACTORY_HIGH_DATA_DIR);
801 break; 833 break;
802 834
803 - case LOW_SD_TEMP:  
804 - snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOW_SD_DIR); 835 + case LOCAL_HIGH_TEMP_1:
  836 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR);
  837 + break;
  838 +
  839 + case LOCAL_HIGH_TEMP_2:
  840 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR_2);
  841 + break;
  842 +
  843 + case LOCAL_HIGH_TEMP_3:
  844 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR_3);
  845 + break;
  846 +
  847 + case LOCAL_HIGH_TEMP_4:
  848 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR_4);
  849 + break;
  850 +
  851 + case FACTORY_LOW_TEMP:
  852 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, FACTORY_LOW_DATA_DIR);
  853 + break;
  854 +
  855 + case LOCAL_LOW_TEMP_1:
  856 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR);
  857 + break;
  858 +
  859 + case LOCAL_LOW_TEMP_2:
  860 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR_2);
  861 + break;
805 862
806 - case HIGH_LOCAL_TEMP:  
807 - snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, HIGH_LOCAL_DIR); 863 + case LOCAL_LOW_TEMP_3:
  864 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR_3);
808 break; 865 break;
809 866
810 - case LOW_LOCAL_TEMP:  
811 - snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOW_LOCAL_DIR); 867 + case LOCAL_LOW_TEMP_4:
  868 + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR_4);
812 break; 869 break;
813 870
814 case SPC_MARK_DATA: 871 case SPC_MARK_DATA:
@@ -30,11 +30,11 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in @@ -30,11 +30,11 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
30 备注: 30 备注:
31 31
32 */ 32 */
33 -T_JZsdkReturnCode IRC_ParamInit(struct IRC_param **index, int height, int width, int frameRate) 33 +T_JZsdkReturnCode IRC_ParamInit(int height, int width, int frameRate)
34 { 34 {
35 T_JZsdkReturnCode ret; 35 T_JZsdkReturnCode ret;
36 36
37 - IRC_param_Init(index, height, width, frameRate); 37 + ret = IRC_param_Init(&g_IRC_Param, height, width, frameRate);
38 38
39 if (g_IRC_Param->DealWay ==IRC_DEALMODE_KTLIB) 39 if (g_IRC_Param->DealWay ==IRC_DEALMODE_KTLIB)
40 { 40 {
@@ -44,86 +44,256 @@ T_JZsdkReturnCode IRC_ParamInit(struct IRC_param **index, int height, int width, @@ -44,86 +44,256 @@ T_JZsdkReturnCode IRC_ParamInit(struct IRC_param **index, int height, int width,
44 return ret; 44 return ret;
45 } 45 }
46 46
47 -/*  
48 47
49 -功能:IRC数据预处理  
50 -参数:U8_t *rawData, int dataSize, U16_t **returnData, unsigned int *returnDataSize, struct IRC_param *dealInfo  
51 -返回值:T_JZsdkReturnCode  
52 -备注:  
53 48
54 -*/  
55 -static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize, U16_t *returnData, unsigned int *returnDataSize, struct IRC_param *dealInfo) 49 +static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int *rawSize, struct IRC_param *dealInfo)
56 { 50 {
57 T_JZsdkReturnCode ret; 51 T_JZsdkReturnCode ret;
58 52
59 //无图像 53 //无图像
60 if (rawData == NULL || dealInfo == NULL) 54 if (rawData == NULL || dealInfo == NULL)
61 { 55 {
  56 + JZSDK_LOG_ERROR("irc数据预处理失败,参数错误");
62 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 57 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
63 } 58 }
64 59
65 - //合成像素,u8转换合并成u16  
66 - ret = JZsdk_Merge_U8_to_U16_byReverse(rawData, dataSize, returnData, returnDataSize);  
67 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS || *returnDataSize != dealInfo->PixelNum)  
68 - {  
69 - JZSDK_LOG_ERROR("像素合成失败");  
70 - return ret;  
71 - }  
72 -  
73 //数据检查 60 //数据检查
74 - for (int i = 0; i < *returnDataSize; i++) 61 + for (int i = 0; i < *rawSize; i++)
75 { 62 {
76 - if (returnData[i] > dealInfo->ExpectedMax) 63 + if (rawData[i] > dealInfo->ExpectedMax)
77 { 64 {
78 - returnData[i] = dealInfo->ExpectedMax; 65 + rawData[i] = dealInfo->ExpectedMax;
79 } 66 }
80 } 67 }
81 68
82 -/*  
83 - 手动盲点纠正部分  
84 - 手动盲点纠正默认打开  
85 -*/ 69 +/*************************************手动盲点部分******************************************************************/
  70 +
  71 + //手动盲点处理
86 if (dealInfo->BlindNum > 0) 72 if (dealInfo->BlindNum > 0)
87 { 73 {
88 - JZsdk_CutBadPixel_U16(returnData, dealInfo->Width, dealInfo->Height, dealInfo->Blind, dealInfo->BlindNum,dealInfo->BadPixelExtern, 1); 74 + JZsdk_CutBadPixel_U16(rawData, dealInfo->Width, dealInfo->Height, dealInfo->Blind, dealInfo->BlindNum,dealInfo->BadPixelExtern, 1);
89 } 75 }
90 76
91 -/*  
92 - 自动盲点纠正部分  
93 -*/ 77 +/*************************************自动盲点部分******************************************************************/
94 //如果自动盲点纠正已打开 78 //如果自动盲点纠正已打开
95 if (dealInfo->AutoBadPixelReset == JZ_FLAGCODE_ON) 79 if (dealInfo->AutoBadPixelReset == JZ_FLAGCODE_ON)
96 { 80 {
97 - JZsdk_RawCheckisBadPixel_U16(returnData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, &dealInfo->BadPixelNum); 81 + //检查自动盲点的位置
  82 + JZsdk_RawCheckisBadPixel_U16(rawData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, &dealInfo->BadPixelNum);
  83 +
  84 + //关闭自动盲点校正
98 dealInfo->AutoBadPixelReset = JZ_FLAGCODE_OFF; 85 dealInfo->AutoBadPixelReset = JZ_FLAGCODE_OFF;
99 } 86 }
100 87
101 - //盲元纠正 88 + //如果自动盲点校正已打开
102 if (dealInfo->AutoBadPixel_flag == JZ_FLAGCODE_ON) 89 if (dealInfo->AutoBadPixel_flag == JZ_FLAGCODE_ON)
103 { 90 {
104 - JZsdk_CutBadPixel_U16(returnData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, dealInfo->BadPixelNum,dealInfo->BadPixelExtern, 1); 91 + //对数据进行自动盲点校正
  92 + JZsdk_CutBadPixel_U16(rawData, dealInfo->Width, dealInfo->Height, dealInfo->BadPixel, dealInfo->BadPixelNum,dealInfo->BadPixelExtern, 1);
  93 + }
  94 +
  95 +/*************************************两点纠正部分******************************************************************/
  96 +
  97 + //判断两点的数据模式是否有改变
  98 + //注:该判断默认拥有出厂的数据
  99 + if (dealInfo->TPC_mode != dealInfo->TPC_LastTPCMode)
  100 + {
  101 +
  102 + /********读取高温数据**********************************************************/
  103 + switch (dealInfo->TPC_mode)
  104 + {
  105 + //读取出厂的高温数据
  106 + case 0:
  107 + ret = IRC_LocalFrame_DataRead(FACTORY_HIGH_TEMP, dealInfo);
  108 + break;
  109 +
  110 + //读取手动数据1
  111 + case 1:
  112 + ret = IRC_LocalFrame_DataRead(LOCAL_HIGH_TEMP_1, dealInfo);
  113 + break;
  114 +
  115 + //读取手动数据2
  116 + case 2:
  117 + ret = IRC_LocalFrame_DataRead(LOCAL_HIGH_TEMP_2, dealInfo);
  118 + break;
  119 +
  120 + //读取手动数据3
  121 + case 3:
  122 + ret = IRC_LocalFrame_DataRead(LOCAL_HIGH_TEMP_3, dealInfo);
  123 + break;
  124 +
  125 + //读取手动数据4
  126 + case 4:
  127 + ret = IRC_LocalFrame_DataRead(LOCAL_HIGH_TEMP_4, dealInfo);
  128 + break;
  129 +
  130 + //其余读取出厂数据
  131 + default:
  132 + ret = IRC_LocalFrame_DataRead(FACTORY_HIGH_TEMP, dealInfo);
  133 + break;
  134 + }
  135 +
  136 + //如果读取数据失败,则当场开启录入标志位
  137 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  138 + {
  139 + JZSDK_LOG_ERROR("数据读取失败");
  140 +
  141 + //先填入出厂数据
  142 + IRC_LocalFrame_DataRead(FACTORY_HIGH_TEMP, dealInfo);
  143 +
  144 + //且开启数据录入标志位
  145 + dealInfo->HighT_flag = JZ_FLAGCODE_ON;
  146 + }
  147 +
  148 +
  149 + /********读取低温数据**********************************************************/
  150 + switch (dealInfo->TPC_mode)
  151 + {
  152 + //读取出厂的低温数据
  153 + case 0:
  154 + ret = IRC_LocalFrame_DataRead(FACTORY_LOW_TEMP, dealInfo);
  155 + break;
  156 +
  157 + //读取手动数据1
  158 + case 1:
  159 + ret = IRC_LocalFrame_DataRead(LOCAL_LOW_TEMP_1, dealInfo);
  160 + break;
  161 +
  162 + //读取手动数据2
  163 + case 2:
  164 + ret = IRC_LocalFrame_DataRead(LOCAL_LOW_TEMP_2, dealInfo);
  165 + break;
  166 +
  167 + //读取手动数据3
  168 + case 3:
  169 + ret = IRC_LocalFrame_DataRead(LOCAL_LOW_TEMP_3, dealInfo);
  170 + break;
  171 +
  172 + //读取手动数据4
  173 + case 4:
  174 + ret = IRC_LocalFrame_DataRead(LOCAL_LOW_TEMP_4, dealInfo);
  175 + break;
  176 +
  177 + //其余读取出厂数据
  178 + default:
  179 + ret = IRC_LocalFrame_DataRead(FACTORY_LOW_TEMP, dealInfo);
  180 + break;
  181 + }
  182 +
  183 + //如果读取数据失败,则当场开启录入标志位
  184 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  185 + {
  186 + JZSDK_LOG_ERROR("数据读取失败");
  187 +
  188 + //先填入出厂数据
  189 + IRC_LocalFrame_DataRead(FACTORY_LOW_TEMP, dealInfo);
  190 +
  191 + //且开启数据录入标志位
  192 + dealInfo->LowT_flag = JZ_FLAGCODE_ON;
  193 + }
  194 +
  195 + //***********重新计算两点校正的斜率**************************************/
  196 + JZIrcLib_TPC_Slope_Calculation2(dealInfo);
105 } 197 }
106 198
107 199
108 - /*  
109 - 两点纠正部分  
110 - */  
111 - //如果开启了低温循环标定 200 + //如果开启了低温循环标定,计算低温循环数据
112 if (dealInfo->LowT_flag != JZ_FLAGCODE_OFF) 201 if (dealInfo->LowT_flag != JZ_FLAGCODE_OFF)
113 { 202 {
114 - IRC_LowT_CycleCalibration(returnData, dealInfo); 203 + //将数据写入缓冲区
  204 + IRC_LowT_CycleCalibration(rawData, dealInfo);
  205 +
  206 + //数据重新缓存完毕,将缓存保存到本地
  207 + if (dealInfo->LowT_flag == JZ_FLAGCODE_OFF)
  208 + {
  209 +
  210 + switch (dealInfo->TPC_mode)
  211 + {
  212 + //写入出厂的低温数据
  213 + case 0:
  214 + JZSDK_LOG_DEBUG("无法覆盖出厂的低温数据");
  215 + break;
  216 +
  217 + //写入手动数据1
  218 + case 1:
  219 + IRC_LocalFrame_DataWrite(LOCAL_LOW_TEMP_1,dealInfo, dealInfo->LowT_NineFrame_Avg, dealInfo->PixelNum);
  220 + break;
  221 +
  222 + //写入手动数据2
  223 + case 2:
  224 + IRC_LocalFrame_DataWrite(LOCAL_LOW_TEMP_2,dealInfo, dealInfo->LowT_NineFrame_Avg, dealInfo->PixelNum);
  225 + break;
  226 +
  227 + //写入手动数据3
  228 + case 3:
  229 + IRC_LocalFrame_DataWrite(LOCAL_LOW_TEMP_3,dealInfo, dealInfo->LowT_NineFrame_Avg, dealInfo->PixelNum);
  230 + break;
  231 +
  232 + //写入手动数据4
  233 + case 4:
  234 + IRC_LocalFrame_DataWrite(LOCAL_LOW_TEMP_4,dealInfo, dealInfo->LowT_NineFrame_Avg, dealInfo->PixelNum);
  235 + break;
  236 +
  237 + default:
  238 + JZSDK_LOG_DEBUG("无法覆盖出厂的低温数据");
  239 + break;
  240 + }
115 } 241 }
116 242
117 - //如果开启了高温循环标定 243 + //***********重新计算两点校正的斜率**************************************/
  244 + JZIrcLib_TPC_Slope_Calculation2(dealInfo);
  245 + }
  246 +
  247 + //如果开启了高温循环标定,计算高温循环数据
118 if (dealInfo->HighT_flag != JZ_FLAGCODE_OFF) 248 if (dealInfo->HighT_flag != JZ_FLAGCODE_OFF)
119 { 249 {
120 - IRC_HighT_CycleCalibration(returnData, dealInfo); 250 + //将数据写入缓冲区
  251 + IRC_HighT_CycleCalibration(rawData, dealInfo);
  252 +
  253 + //数据重新缓存完毕,将缓存保存到本地
  254 + if (dealInfo->HighT_flag == JZ_FLAGCODE_OFF)
  255 + {
  256 + switch (dealInfo->TPC_mode)
  257 + {
  258 + //写入出厂的高温数据
  259 + case 0:
  260 + JZSDK_LOG_DEBUG("无法覆盖出厂的高温数据");
  261 + break;
  262 +
  263 + //写入手动数据1
  264 + case 1:
  265 + IRC_LocalFrame_DataWrite(LOCAL_HIGH_TEMP_1,dealInfo, dealInfo->HighT_NineFrame_Avg, dealInfo->PixelNum);
  266 + break;
  267 +
  268 + //写入手动数据2
  269 + case 2:
  270 + IRC_LocalFrame_DataWrite(LOCAL_HIGH_TEMP_2,dealInfo, dealInfo->HighT_NineFrame_Avg, dealInfo->PixelNum);
  271 + break;
  272 +
  273 + //写入手动数据3
  274 + case 3:
  275 + IRC_LocalFrame_DataWrite(LOCAL_HIGH_TEMP_3,dealInfo, dealInfo->HighT_NineFrame_Avg, dealInfo->PixelNum);
  276 + break;
  277 +
  278 + //写入手动数据4
  279 + case 4:
  280 + IRC_LocalFrame_DataWrite(LOCAL_HIGH_TEMP_4,dealInfo, dealInfo->HighT_NineFrame_Avg, dealInfo->PixelNum);
  281 + break;
  282 +
  283 + default:
  284 + JZSDK_LOG_DEBUG("无法覆盖出厂的高温数据");
  285 + break;
  286 + }
  287 + }
  288 +
  289 + //***********重新计算两点校正的斜率**************************************/
  290 + JZIrcLib_TPC_Slope_Calculation2(dealInfo);
121 } 291 }
122 292
123 - /*  
124 - 单点纠正部分  
125 - */ 293 + //两点校正模式
  294 + dealInfo->TPC_LastTPCMode = dealInfo->TPC_mode;
126 295
  296 +/*************************************单点纠正部分******************************************************************/
127 //单点校正spc如果未进行过数据的标定,则进行一次 297 //单点校正spc如果未进行过数据的标定,则进行一次
128 if (dealInfo->FirstSPC_flag == JZ_FLAGCODE_OFF) 298 if (dealInfo->FirstSPC_flag == JZ_FLAGCODE_OFF)
129 { 299 {
@@ -155,7 +325,7 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize, @@ -155,7 +325,7 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize,
155 { 325 {
156 JZSDK_LOG_INFO("SPC重置标定"); 326 JZSDK_LOG_INFO("SPC重置标定");
157 327
158 - memcpy(dealInfo->SPC_Mark_Data, returnData, dealInfo->PixelNum * sizeof(U16_t)); 328 + memcpy(dealInfo->SPC_Mark_Data, rawData, dealInfo->PixelNum * sizeof(U16_t));
159 329
160 //保存spc标定点 330 //保存spc标定点
161 IRC_LocalFrame_DataWrite(SPC_MARK_DATA, dealInfo, (U16_t *)dealInfo->SPC_Mark_Data, dealInfo->PixelNum); 331 IRC_LocalFrame_DataWrite(SPC_MARK_DATA, dealInfo, (U16_t *)dealInfo->SPC_Mark_Data, dealInfo->PixelNum);
@@ -163,25 +333,8 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize, @@ -163,25 +333,8 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize,
163 dealInfo->SPC_ResetFlag = JZ_FLAGCODE_OFF; 333 dealInfo->SPC_ResetFlag = JZ_FLAGCODE_OFF;
164 } 334 }
165 335
166 - //备注:这部分使用我们自己的库才要这样做  
167 - //如果开启了spc单点校正  
168 - if(dealInfo->FrameCorrectMode == IRC_CORRCTION_SPC && dealInfo->DealWay == IRC_DEALMODE_JZSDK)  
169 - {  
170 - //计算spc参数(后续要改成只计算一次,总不能每帧都计算吧)  
171 - if (dealInfo->SPC_mode == 0 && dealInfo->LowT_NineFrame_Avg != NULL)  
172 - {  
173 - IRC_SPC_ParamCorrect(dealInfo, dealInfo->LowT_NineFrame_Avg);  
174 - }  
175 - else  
176 - {  
177 - IRC_SPC_ParamCorrect(dealInfo, dealInfo->SPC_Mark_Data);  
178 - }  
179 - } 336 +/*************************************气体增强部分,标记气体增图像图像******************************************************************/
180 337
181 -/*  
182 - 气体增强部分  
183 - 标记气体增图像图像  
184 - */  
185 //如果开启气体增强时,未标记过气体画面,则标记 338 //如果开启气体增强时,未标记过气体画面,则标记
186 if (dealInfo->OutputPixelColorMode == 2 && dealInfo->First_DGCE_flag == JZ_FLAGCODE_OFF) 339 if (dealInfo->OutputPixelColorMode == 2 && dealInfo->First_DGCE_flag == JZ_FLAGCODE_OFF)
187 { 340 {
@@ -194,14 +347,13 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize, @@ -194,14 +347,13 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U8_t *rawData , int dataSize,
194 if (dealInfo->DGCE_ResetFlag == JZ_FLAGCODE_ON) 347 if (dealInfo->DGCE_ResetFlag == JZ_FLAGCODE_ON)
195 { 348 {
196 JZSDK_LOG_INFO("气体增强重置标定"); 349 JZSDK_LOG_INFO("气体增强重置标定");
197 - memcpy(dealInfo->DGCE_Mark_Data, returnData, dealInfo->PixelNum * sizeof(U16_t)); 350 + memcpy(dealInfo->DGCE_Mark_Data, rawData, dealInfo->PixelNum * sizeof(U16_t));
198 dealInfo->DGCE_ResetFlag = JZ_FLAGCODE_OFF; 351 dealInfo->DGCE_ResetFlag = JZ_FLAGCODE_OFF;
199 } 352 }
200 353
201 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 354 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
202 } 355 }
203 356
204 -  
205 unsigned int Get_2DImage_PointToArray(int x, int y, int width, int height) 357 unsigned int Get_2DImage_PointToArray(int x, int y, int width, int height)
206 { 358 {
207 return (x + y*width); 359 return (x + y*width);
@@ -215,7 +367,6 @@ unsigned int Get_2DImage_PointToArray(int x, int y, int width, int height) @@ -215,7 +367,6 @@ unsigned int Get_2DImage_PointToArray(int x, int y, int width, int height)
215 */ 367 */
216 static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param *dealInfo) 368 static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param *dealInfo)
217 { 369 {
218 -  
219 //将rgb图形镜像 370 //将rgb图形镜像
220 int MirrorImageFlag = JZ_FLAGCODE_ON; 371 int MirrorImageFlag = JZ_FLAGCODE_ON;
221 372
@@ -235,7 +386,7 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param @@ -235,7 +386,7 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
235 for (y = 0; y < dealInfo->Height; y++) 386 for (y = 0; y < dealInfo->Height; y++)
236 { 387 {
237 // 复制当前行到临时缓冲区 388 // 复制当前行到临时缓冲区
238 - memcpy(temp_row, rgb_data + y * bytes_per_row, bytes_per_row); 389 + memcpy(temp_row, rgb_data + (y * bytes_per_row), bytes_per_row);
239 390
240 // 从右向左(即反向)复制临时缓冲区的数据回原位置 391 // 从右向左(即反向)复制临时缓冲区的数据回原位置
241 for (x = 0; x < dealInfo->Width; x++) { 392 for (x = 0; x < dealInfo->Width; x++) {
@@ -252,7 +403,6 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param @@ -252,7 +403,6 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
252 free(temp_row); // 释放临时缓冲区 403 free(temp_row); // 释放临时缓冲区
253 } 404 }
254 405
255 -  
256 //修复外圈图像 406 //修复外圈图像
257 if (dealInfo->RingRepair == JZ_FLAGCODE_ON) 407 if (dealInfo->RingRepair == JZ_FLAGCODE_ON)
258 { 408 {
@@ -398,35 +548,35 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param @@ -398,35 +548,35 @@ static T_JZsdkReturnCode IRC_Postdeal(unsigned char *rgb_data, struct IRC_param
398 } 548 }
399 549
400 550
401 -/*  
402 551
403 -功能:IRC 帧处理  
404 -参数:  
405 -返回值:T_JZsdkReturnCode  
406 -备注: 552 +/****************************
407 553
408 -*/  
409 -T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, unsigned char **outData, unsigned int *outDataSize) 554 + 功能:IRC 帧处理
  555 + 参数:
  556 + 返回值:T_JZsdkReturnCode
  557 + 备注:
  558 +
  559 + * *************/
  560 +T_JZsdkReturnCode IRC_FrameDeal(U16_t *rawData ,unsigned int dataSize, unsigned char **outData, unsigned int *outDataSize)
410 { 561 {
411 - //1、数据预处理(将红外相机的8位数据,合成为16位数据,移除盲点,并记录标定点)  
412 - U16_t *U16_data = (U16_t *)malloc(dataSize/2 * sizeof(U16_t));  
413 - unsigned int U16_dataSize = 0;  
414 - IRC_data_PreliminaryDeal(rawData , dataSize, U16_data, &U16_dataSize, g_IRC_Param); 562 + //1、数据预处理(移除数据的盲点,并记录标定数据)
  563 + IRC_data_PreliminaryDeal(rawData , &dataSize, g_IRC_Param);
415 564
416 - //printf("预处理完成\n"); 565 + //JZSDK_LOG_DEBUG("数据预处理完成");
417 566
418 //2、数据前处理,将原始数据和16位数据 合成为rgb数据 567 //2、数据前处理,将原始数据和16位数据 合成为rgb数据
419 U8_t *RGB_data = NULL; 568 U8_t *RGB_data = NULL;
420 unsigned int RGB_dataSize = 0; 569 unsigned int RGB_dataSize = 0;
421 570
  571 + //选择前处理的方式
422 switch (g_IRC_Param->DealWay) 572 switch (g_IRC_Param->DealWay)
423 { 573 {
424 case IRC_DEALMODE_KTLIB: 574 case IRC_DEALMODE_KTLIB:
425 - KtLib_DataDeal(U16_data, U16_dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param); 575 + KtLib_DataDeal(rawData, dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param);
426 break; 576 break;
427 577
428 case IRC_DEALMODE_JZSDK: 578 case IRC_DEALMODE_JZSDK:
429 - JZIrcLib_DataDeal(U16_data, U16_dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param); 579 + JZIrcLib_DataDeal(rawData, dataSize, &RGB_data, &RGB_dataSize,g_IRC_Param);
430 break; 580 break;
431 581
432 default: 582 default:
@@ -434,12 +584,12 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u @@ -434,12 +584,12 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u
434 break; 584 break;
435 } 585 }
436 586
437 - //printf("前处理完成\n"); 587 + //JZSDK_LOG_DEBUG("数据前处理完成");
438 588
439 //3、数据后处理,在rgb数据上,进行图像处理 589 //3、数据后处理,在rgb数据上,进行图像处理
440 IRC_Postdeal(RGB_data, g_IRC_Param); 590 IRC_Postdeal(RGB_data, g_IRC_Param);
441 591
442 - //printf("后处理完成\n"); 592 + //JZSDK_LOG_DEBUG("数据后处理完成");
443 593
444 //4、数据转换,将rgb数据,转换为yuv数据 594 //4、数据转换,将rgb数据,转换为yuv数据
445 if (g_IRC_Param->IRC_outPixelMode == PIXEL_MODE_YUV420) 595 if (g_IRC_Param->IRC_outPixelMode == PIXEL_MODE_YUV420)
@@ -447,7 +597,8 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u @@ -447,7 +597,8 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u
447 U8_t *yuv_frame = (U8_t *)malloc(g_IRC_Param->Width*g_IRC_Param->Height*3/2 *sizeof(U8_t)); 597 U8_t *yuv_frame = (U8_t *)malloc(g_IRC_Param->Width*g_IRC_Param->Height*3/2 *sizeof(U8_t));
448 598
449 // 调用转换函数 599 // 调用转换函数
450 - Stream_rgb888_to_yuv420p(RGB_data,g_IRC_Param->Width,g_IRC_Param->Height, yuv_frame); 600 + //Stream_rgb888_to_yuv420p(RGB_data,g_IRC_Param->Width,g_IRC_Param->Height, yuv_frame);
  601 + Stream_rgb888_to_yuv420sp(RGB_data,g_IRC_Param->Width,g_IRC_Param->Height, yuv_frame);
451 602
452 *outData = yuv_frame; 603 *outData = yuv_frame;
453 *outDataSize = g_IRC_Param->Width*g_IRC_Param->Height*3/2; 604 *outDataSize = g_IRC_Param->Width*g_IRC_Param->Height*3/2;
@@ -458,7 +609,6 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u @@ -458,7 +609,6 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u
458 } 609 }
459 610
460 //printf("输出yuv\n"); 611 //printf("输出yuv\n");
461 -  
462 } 612 }
463 613
464 /***************** 614 /*****************
@@ -467,18 +617,12 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u @@ -467,18 +617,12 @@ T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, u
467 * 如果码流类型要求为rgb888 617 * 如果码流类型要求为rgb888
468 * 618 *
469 * **********************/ 619 * **********************/
470 - if (g_IRC_Param->IRC_outPixelMode == PIXEL_MODE_RGB888) 620 + else if (g_IRC_Param->IRC_outPixelMode == PIXEL_MODE_RGB888)
471 { 621 {
472 *outData = RGB_data; 622 *outData = RGB_data;
473 *outDataSize = g_IRC_Param->Width*g_IRC_Param->Height*3; 623 *outDataSize = g_IRC_Param->Width*g_IRC_Param->Height*3;
474 } 624 }
475 625
476 - //5、数据释放  
477 - if (U16_data != NULL)  
478 - {  
479 - JZsdk_Free((void *)U16_data);  
480 - }  
481 -  
482 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 626 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
483 } 627 }
484 628
@@ -790,7 +934,6 @@ static T_JZsdkReturnCode IRC_Set_SpcTime(int timebase) @@ -790,7 +934,6 @@ static T_JZsdkReturnCode IRC_Set_SpcTime(int timebase)
790 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 934 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
791 } 935 }
792 936
793 -int Last_TpcMode = 0;  
794 /******************************************** 937 /********************************************
795 * 938 *
796 * 设置两点纠正模式 939 * 设置两点纠正模式
@@ -804,28 +947,16 @@ static T_JZsdkReturnCode IRC_Set_TpcMode(int mode) @@ -804,28 +947,16 @@ static T_JZsdkReturnCode IRC_Set_TpcMode(int mode)
804 if (mode == 0) 947 if (mode == 0)
805 { 948 {
806 JZSDK_LOG_INFO("出厂高低温模式"); 949 JZSDK_LOG_INFO("出厂高低温模式");
807 - if (Last_TpcMode != mode)  
808 - {  
809 - //重新读取数据  
810 - IRC_LocalFrame_DataRead(HIGH_SD_TEMP, g_IRC_Param);  
811 - }  
812 -  
813 } 950 }
814 - else if (mode == 1)  
815 - {  
816 - JZSDK_LOG_INFO("手动高低温模式");  
817 - if (Last_TpcMode != mode) 951 + else if (mode == 1 || mode == 2 || mode == 3 || mode == 4)
818 { 952 {
819 - //重新读取数据  
820 - IRC_LocalFrame_DataRead(HIGH_LOCAL_TEMP, g_IRC_Param);  
821 - } 953 + JZSDK_LOG_INFO("手动高低温模式 %d", mode);
822 } 954 }
823 else 955 else
824 { 956 {
825 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 957 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
826 } 958 }
827 959
828 - Last_TpcMode = mode;  
829 g_IRC_Param->TPC_mode = mode; 960 g_IRC_Param->TPC_mode = mode;
830 961
831 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 962 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
@@ -968,71 +1099,6 @@ T_JZsdkReturnCode Proc_IRC_param(int flagcode, enum JZsdk_Widget_Control paramfl @@ -968,71 +1099,6 @@ T_JZsdkReturnCode Proc_IRC_param(int flagcode, enum JZsdk_Widget_Control paramfl
968 1099
969 1100
970 1101
971 -/*  
972 - 填入高温数据  
973 -*/  
974 -static T_JZsdkReturnCode IRC_Set_HighTempData(struct IRC_param *dealInfo)  
975 -{  
976 - T_JZsdkReturnCode ret;  
977 -  
978 - //先尝试 填入录入的数据  
979 - ret = IRC_LocalFrame_DataRead(HIGH_SD_TEMP, dealInfo);  
980 - if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
981 - {  
982 - JZSDK_LOG_INFO("外置高温数据录入成功");  
983 - return ret;  
984 - }  
985 -  
986 - //失败了录入 本地数据  
987 - ret = IRC_LocalFrame_DataRead(HIGH_LOCAL_TEMP, dealInfo);  
988 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
989 - {  
990 - JZSDK_LOG_ERROR("没有本地高温数据数据,打开录入标志");  
991 - dealInfo->HighT_flag = JZ_FLAGCODE_ON; //打开录入标志  
992 - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;  
993 - }  
994 -  
995 - JZSDK_LOG_INFO("本地高温数据录入成功");  
996 -  
997 -  
998 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
999 -}  
1000 -  
1001 -/*  
1002 - 填入低温数据  
1003 -*/  
1004 -static T_JZsdkReturnCode IRC_Set_LowTempData(struct IRC_param *dealInfo)  
1005 -{  
1006 - T_JZsdkReturnCode ret;  
1007 -  
1008 - //先尝试 填入录入的数据  
1009 - ret = IRC_LocalFrame_DataRead(LOW_SD_TEMP, dealInfo);  
1010 - if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
1011 - {  
1012 - JZSDK_LOG_INFO("外置低温数据录入成功");  
1013 - return ret;  
1014 - }  
1015 -  
1016 - //失败了录入 本地数据  
1017 - ret = IRC_LocalFrame_DataRead(LOW_LOCAL_TEMP, dealInfo);  
1018 - if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)  
1019 - {  
1020 - JZSDK_LOG_ERROR("没有本地低温数据数据,打开录入标志");  
1021 - dealInfo->LowT_flag = JZ_FLAGCODE_ON; //打开录入标志  
1022 - }  
1023 -  
1024 - JZSDK_LOG_INFO("本地低温数据录入成功");  
1025 -  
1026 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;  
1027 -}  
1028 -  
1029 -  
1030 -  
1031 -  
1032 -  
1033 -  
1034 -  
1035 -  
1036 1102
1037 1103
1038 1104
@@ -1089,86 +1155,104 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in @@ -1089,86 +1155,104 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
1089 IrcDealCfg->LowT_flag = JZ_FLAGCODE_OFF; 1155 IrcDealCfg->LowT_flag = JZ_FLAGCODE_OFF;
1090 IrcDealCfg->HighT_flag = JZ_FLAGCODE_OFF; 1156 IrcDealCfg->HighT_flag = JZ_FLAGCODE_OFF;
1091 1157
1092 - IrcDealCfg->TPC_Diff = (double *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(double));  
1093 - if (IrcDealCfg->TPC_Diff == NULL) 1158 + IrcDealCfg->TPC_Offset = (double *)malloc(IrcDealCfg->PixelNum * sizeof(double));
  1159 + if (IrcDealCfg->TPC_Offset == NULL)
1094 { 1160 {
1095 - JZSDK_LOG_ERROR("TPC_Diff注册失败"); 1161 + JZSDK_LOG_ERROR("TPC_Offset注册失败");
1096 } 1162 }
1097 1163
1098 - IrcDealCfg->TPC_Slope = (double *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(double));  
1099 - if (IrcDealCfg->TPC_Slope == NULL) 1164 + IrcDealCfg->TPC_Gain = (double *)malloc(IrcDealCfg->PixelNum * sizeof(double));
  1165 + if (IrcDealCfg->TPC_Gain == NULL)
1100 { 1166 {
1101 - JZSDK_LOG_ERROR("TPC_Slope注册失败"); 1167 + JZSDK_LOG_ERROR("TPC_Gain注册失败");
1102 } 1168 }
1103 1169
1104 - IrcDealCfg->HighT_NineFrameAdd = (U16_t *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(U16_t)); 1170 + IrcDealCfg->HighT_NineFrameAdd = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t));
1105 if (IrcDealCfg->HighT_NineFrameAdd == NULL) 1171 if (IrcDealCfg->HighT_NineFrameAdd == NULL)
1106 { 1172 {
1107 JZSDK_LOG_ERROR("HighT_NineFrameAdd注册失败"); 1173 JZSDK_LOG_ERROR("HighT_NineFrameAdd注册失败");
1108 } 1174 }
1109 1175
1110 - IrcDealCfg->LowT_NineFrameAdd = (U16_t *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(U16_t)); 1176 + IrcDealCfg->LowT_NineFrameAdd = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t));
1111 if (IrcDealCfg->LowT_NineFrameAdd == NULL) 1177 if (IrcDealCfg->LowT_NineFrameAdd == NULL)
1112 { 1178 {
1113 JZSDK_LOG_ERROR("LowT_NineFrameAdd注册失败"); 1179 JZSDK_LOG_ERROR("LowT_NineFrameAdd注册失败");
1114 } 1180 }
1115 1181
1116 - IrcDealCfg->HighT_NineFrame_Avg = (U16_t *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(U16_t)); 1182 + IrcDealCfg->HighT_NineFrame_Avg = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t));
1117 if (IrcDealCfg->HighT_NineFrame_Avg == NULL) 1183 if (IrcDealCfg->HighT_NineFrame_Avg == NULL)
1118 { 1184 {
1119 JZSDK_LOG_ERROR("HighT_NineFrame_Avg注册失败"); 1185 JZSDK_LOG_ERROR("HighT_NineFrame_Avg注册失败");
1120 } 1186 }
1121 1187
1122 - IrcDealCfg->LowT_NineFrame_Avg = (U16_t *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(U16_t)); 1188 + IrcDealCfg->LowT_NineFrame_Avg = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t));
1123 if (IrcDealCfg->LowT_NineFrame_Avg == NULL) 1189 if (IrcDealCfg->LowT_NineFrame_Avg == NULL)
1124 { 1190 {
1125 JZSDK_LOG_ERROR("LowT_NineFrame_Avg注册失败"); 1191 JZSDK_LOG_ERROR("LowT_NineFrame_Avg注册失败");
1126 } 1192 }
1127 1193
1128 - IrcDealCfg->SPC_Diff = (double *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(double)); 1194 + IrcDealCfg->SPC_Diff = (double *)malloc(IrcDealCfg->PixelNum * sizeof(double));
1129 if (IrcDealCfg->SPC_Diff == NULL) 1195 if (IrcDealCfg->SPC_Diff == NULL)
1130 { 1196 {
1131 JZSDK_LOG_ERROR("SPC_Diff注册失败"); 1197 JZSDK_LOG_ERROR("SPC_Diff注册失败");
1132 } 1198 }
1133 1199
1134 - IrcDealCfg->SPC_Slope = (double *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(double)); 1200 + IrcDealCfg->SPC_Slope = (double *)malloc(IrcDealCfg->PixelNum * sizeof(double));
1135 if (IrcDealCfg->SPC_Slope == NULL) 1201 if (IrcDealCfg->SPC_Slope == NULL)
1136 { 1202 {
1137 JZSDK_LOG_ERROR("SPC_Slope注册失败"); 1203 JZSDK_LOG_ERROR("SPC_Slope注册失败");
1138 } 1204 }
1139 1205
1140 - IrcDealCfg->DGCE_Area = (U16_t *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(U16_t)); 1206 + IrcDealCfg->DGCE_Area = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t));
1141 if (IrcDealCfg->DGCE_Area == NULL) 1207 if (IrcDealCfg->DGCE_Area == NULL)
1142 { 1208 {
1143 JZSDK_LOG_ERROR("DGCE_Area注册失败"); 1209 JZSDK_LOG_ERROR("DGCE_Area注册失败");
1144 } 1210 }
1145 1211
1146 - IrcDealCfg->DGCE_Mark_Data = (U16_t *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(U16_t)); 1212 + IrcDealCfg->DGCE_Mark_Data = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t));
1147 if (IrcDealCfg->DGCE_Mark_Data == NULL) 1213 if (IrcDealCfg->DGCE_Mark_Data == NULL)
1148 { 1214 {
1149 JZSDK_LOG_ERROR("DGCE_Mark_Data注册失败"); 1215 JZSDK_LOG_ERROR("DGCE_Mark_Data注册失败");
1150 } 1216 }
1151 1217
1152 - IrcDealCfg->SPC_Mark_Data = (U16_t *)malloc(IrcDealCfg->Height * IrcDealCfg->Width * sizeof(U16_t)); 1218 + IrcDealCfg->SPC_Mark_Data = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t));
1153 if (IrcDealCfg->SPC_Mark_Data == NULL) 1219 if (IrcDealCfg->SPC_Mark_Data == NULL)
1154 { 1220 {
1155 JZSDK_LOG_ERROR("SPC_Mark_Data注册失败"); 1221 JZSDK_LOG_ERROR("SPC_Mark_Data注册失败");
1156 } 1222 }
1157 1223
1158 - //填入本地高温数据  
1159 - ret = IRC_Set_HighTempData(IrcDealCfg);  
1160 - if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 1224 + IrcDealCfg->Factory_HighT_Mark_Data = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t));
  1225 + if (IrcDealCfg->Factory_HighT_Mark_Data == NULL)
1161 { 1226 {
1162 - JZSDK_LOG_INFO("本地高温数据 0:%d 1:%d 2:%d", IrcDealCfg->HighT_NineFrame_Avg[2550], IrcDealCfg->HighT_NineFrame_Avg[2551], IrcDealCfg->HighT_NineFrame_Avg[2552]); 1227 + JZSDK_LOG_ERROR("Factory_HighT_Mark_Data注册失败");
1163 } 1228 }
  1229 + IrcDealCfg->Factory_HighT_Mark_Data_flag = JZ_FLAGCODE_OFF;
1164 1230
1165 -  
1166 - //填入低温数据  
1167 - ret = IRC_Set_LowTempData(IrcDealCfg);  
1168 - if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS) 1231 + IrcDealCfg->Factory_LowT_Mark_Data = (U16_t *)malloc(IrcDealCfg->PixelNum * sizeof(U16_t));
  1232 + if (IrcDealCfg->Factory_LowT_Mark_Data == NULL)
1169 { 1233 {
1170 - JZSDK_LOG_INFO("本地低温数据 0:%d 1:%d 2:%d", IrcDealCfg->LowT_NineFrame_Avg[2550], IrcDealCfg->LowT_NineFrame_Avg[2551], IrcDealCfg->LowT_NineFrame_Avg[2552]); 1234 + JZSDK_LOG_ERROR("Factory_LowT_Mark_Data注册失败");
1171 } 1235 }
  1236 + IrcDealCfg->Factory_LowT_Mark_Data_flag = JZ_FLAGCODE_OFF;
  1237 +
  1238 +/*******************************************************************************************
  1239 + *
  1240 + * 加载文件数据
  1241 + *
  1242 + *
  1243 +**********************************************************************************************/
  1244 +
  1245 + //填入出厂的高温数据
  1246 + IRC_LocalFrame_DataRead(FACTORY_HIGH_TEMP, IrcDealCfg);
  1247 +
  1248 + //填入低温数据
  1249 + IRC_LocalFrame_DataRead(FACTORY_LOW_TEMP, IrcDealCfg);
  1250 +
  1251 + //计算两点系数***********重新计算两点校正的斜率**************************************/
  1252 + JZIrcLib_TPC_Slope_Calculation2(IrcDealCfg);
  1253 +
  1254 + //开启tpc校验标志
  1255 + IrcDealCfg->TPC_ResetFlag = JZ_FLAGCODE_ON;
1172 1256
1173 //获取markdata的本地数据 1257 //获取markdata的本地数据
1174 ret = IRC_LocalFrame_DataRead(SPC_MARK_DATA, IrcDealCfg); 1258 ret = IRC_LocalFrame_DataRead(SPC_MARK_DATA, IrcDealCfg);
@@ -26,8 +26,8 @@ extern "C" { @@ -26,8 +26,8 @@ extern "C" {
26 26
27 /* Exported functions --------------------------------------------------------*/ 27 /* Exported functions --------------------------------------------------------*/
28 28
29 -T_JZsdkReturnCode IRC_ParamInit(struct IRC_param **index, int height, int width, int frameRate);  
30 -T_JZsdkReturnCode IRC_FrameDeal(unsigned char *rawData ,unsigned int dataSize, unsigned char **outData, unsigned int *outDataSize); 29 +T_JZsdkReturnCode IRC_ParamInit(int height, int width, int frameRate);
  30 +T_JZsdkReturnCode IRC_FrameDeal(U16_t *rawData ,unsigned int dataSize, unsigned char **outData, unsigned int *outDataSize);
31 31
32 T_JZsdkReturnCode IRC_SetRawPixel_ResetFlag(); 32 T_JZsdkReturnCode IRC_SetRawPixel_ResetFlag();
33 T_JZsdkReturnCode IRC_SetGrayPixel_ResetFlag(); 33 T_JZsdkReturnCode IRC_SetGrayPixel_ResetFlag();
@@ -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 * 单点矫正
@@ -501,9 +233,38 @@ static T_JZsdkReturnCode JZIrcLib_SPC(U16_t *ImageData,struct IRC_param *dealInf @@ -501,9 +233,38 @@ static T_JZsdkReturnCode JZIrcLib_SPC(U16_t *ImageData,struct IRC_param *dealInf
501 } 233 }
502 } 234 }
503 235
  236 + //JZSDK_LOG_INFO("单点校正");
  237 +
504 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 238 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
505 } 239 }
506 240
  241 +/*******************
  242 + *
  243 + * 单点校正斜率计算
  244 + *
  245 + *
  246 + * *******************/
  247 +static T_JZsdkReturnCode JZIrcLib_SPC_Slope_Calculation(struct IRC_param *dealInfo)
  248 +{
  249 + if (dealInfo->SPC_mode == 0)
  250 + {
  251 + //采用出厂模式的斜率
  252 + if (dealInfo->TPC_mode == 0 && dealInfo->Factory_LowT_Mark_Data != NULL)
  253 + {
  254 + IRC_SPC_ParamCorrect(dealInfo, dealInfo->Factory_LowT_Mark_Data);
  255 + }
  256 + //采用手动模式的斜率
  257 + else
  258 + {
  259 + IRC_SPC_ParamCorrect(dealInfo, dealInfo->LowT_NineFrame_Avg);
  260 + }
  261 + }
  262 + //都不满足的情况下,采用默认的斜率
  263 + else
  264 + {
  265 + IRC_SPC_ParamCorrect(dealInfo, dealInfo->SPC_Mark_Data);
  266 + }
  267 +}
507 268
508 /****** 269 /******
509 * 270 *
@@ -519,15 +280,50 @@ T_JZsdkReturnCode JZIrcLib_TPC(U16_t *ImageData,struct IRC_param *dealInfo) @@ -519,15 +280,50 @@ T_JZsdkReturnCode JZIrcLib_TPC(U16_t *ImageData,struct IRC_param *dealInfo)
519 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; 280 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
520 } 281 }
521 282
  283 + // 应用两点校正公式
  284 + for (int i = 0; i < dealInfo->PixelNum; i++)
  285 + {
  286 + ImageData[i] = (int)(dealInfo->TPC_Gain[i] * ImageData[i] + dealInfo->TPC_Offset[i]);
  287 + if (ImageData[i] < 0)
  288 + {
  289 + ImageData[i] = 0;
  290 + }
  291 + else if (ImageData[i] > dealInfo->ExpectedMax)
  292 + {
  293 + ImageData[i] = dealInfo->ExpectedMax;
  294 + }
  295 + }
  296 +
  297 + //JZSDK_LOG_INFO("两点校正");
  298 +
  299 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; // 返回校正后的灰度数组
  300 +}
  301 +
  302 +/*******************
  303 + *
  304 + * 两点校正斜率计算
  305 + *
  306 + *
  307 + * *******************/
  308 +static T_JZsdkReturnCode JZIrcLib_TPC_Slope_Calculation(struct IRC_param *dealInfo)
  309 +{
  310 + //无图像
  311 + if (dealInfo == NULL)
  312 + {
  313 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  314 + }
  315 +
522 // 如果tpc的斜率和tpc的截距都为0,重新计算斜率与斜距 316 // 如果tpc的斜率和tpc的截距都为0,重新计算斜率与斜距
523 int allZeroSlope_flag = 1, allZeroDiff_flag = 1; 317 int allZeroSlope_flag = 1, allZeroDiff_flag = 1;
524 for (int i = 0; i < dealInfo->PixelNum; i++) 318 for (int i = 0; i < dealInfo->PixelNum; i++)
525 { 319 {
526 - if (dealInfo->TPC_Slope[i] != 0) 320 + if (dealInfo->TPC_Gain[i] != 0)
527 { 321 {
528 allZeroSlope_flag = 0; 322 allZeroSlope_flag = 0;
529 } 323 }
530 - if (dealInfo->TPC_Diff[i] != 0) { 324 +
  325 + if (dealInfo->TPC_Offset[i] != 0)
  326 + {
531 allZeroDiff_flag = 0; 327 allZeroDiff_flag = 0;
532 } 328 }
533 } 329 }
@@ -550,35 +346,61 @@ T_JZsdkReturnCode JZIrcLib_TPC(U16_t *ImageData,struct IRC_param *dealInfo) @@ -550,35 +346,61 @@ T_JZsdkReturnCode JZIrcLib_TPC(U16_t *ImageData,struct IRC_param *dealInfo)
550 { 346 {
551 if (dealInfo->HighT_NineFrame_Avg[i] > dealInfo->LowT_NineFrame_Avg[i]) 347 if (dealInfo->HighT_NineFrame_Avg[i] > dealInfo->LowT_NineFrame_Avg[i])
552 { 348 {
553 - dealInfo->TPC_Slope[i] = (AvgSingleFrame_HighT - AvgSingleFrame_LowT) / (dealInfo->HighT_NineFrame_Avg[i] - dealInfo->LowT_NineFrame_Avg[i]); 349 + dealInfo->TPC_Gain[i] = (AvgSingleFrame_HighT - AvgSingleFrame_LowT) / (dealInfo->HighT_NineFrame_Avg[i] - dealInfo->LowT_NineFrame_Avg[i]);
554 } 350 }
555 else 351 else
556 { 352 {
557 - dealInfo->TPC_Slope[i] = 0; 353 + dealInfo->TPC_Gain[i] = 0;
558 } 354 }
559 - dealInfo->TPC_Diff[i] = AvgSingleFrame_LowT - dealInfo->TPC_Slope[i] * dealInfo->LowT_NineFrame_Avg[i]; 355 + dealInfo->TPC_Offset[i] = AvgSingleFrame_LowT - dealInfo->TPC_Gain[i] * dealInfo->LowT_NineFrame_Avg[i];
560 } 356 }
561 } 357 }
  358 +}
  359 +
  360 +/*******************
  361 + *
  362 + * 两点校正斜率计算
  363 + *
  364 + *
  365 + * *******************/
  366 +T_JZsdkReturnCode JZIrcLib_TPC_Slope_Calculation2(struct IRC_param *dealInfo)
  367 +{
  368 + //判断是否存在结构体
  369 + if (dealInfo == NULL)
  370 + {
  371 + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
  372 + }
  373 +
  374 + //计算像元平均响应
  375 + double AvgSingleFrame_LowT = 0, AvgSingleFrame_HighT = 0;
562 376
563 - // 应用两点校正公式  
564 for (int i = 0; i < dealInfo->PixelNum; i++) 377 for (int i = 0; i < dealInfo->PixelNum; i++)
565 { 378 {
566 - ImageData[i] = (int)(dealInfo->TPC_Slope[i] * ImageData[i] + dealInfo->TPC_Diff[i]);  
567 - if (ImageData[i] < 0) 379 + AvgSingleFrame_LowT += dealInfo->LowT_NineFrame_Avg[i];
  380 + AvgSingleFrame_HighT += dealInfo->HighT_NineFrame_Avg[i];
  381 + }
  382 +
  383 + AvgSingleFrame_HighT = AvgSingleFrame_HighT / dealInfo->PixelNum;
  384 + AvgSingleFrame_LowT = AvgSingleFrame_LowT / dealInfo->PixelNum;
  385 +
  386 + for (int i = 0; i < dealInfo->PixelNum; i++)
568 { 387 {
569 - ImageData[i] = 0; 388 + if (dealInfo->HighT_NineFrame_Avg[i] != dealInfo->LowT_NineFrame_Avg[i])
  389 + {
  390 + dealInfo->TPC_Gain[i] = (AvgSingleFrame_HighT - AvgSingleFrame_LowT) / (dealInfo->HighT_NineFrame_Avg[i] - dealInfo->LowT_NineFrame_Avg[i]);
  391 + dealInfo->TPC_Offset[i] = AvgSingleFrame_LowT - dealInfo->TPC_Gain[i] * dealInfo->LowT_NineFrame_Avg[i];
570 } 392 }
571 - else if (ImageData[i] > dealInfo->ExpectedMax) 393 + else
572 { 394 {
573 - ImageData[i] = dealInfo->ExpectedMax; 395 + dealInfo->TPC_Gain[i] = 1;
  396 + dealInfo->TPC_Offset[i] = 0;
574 } 397 }
575 } 398 }
576 399
577 - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; // 返回校正后的灰度数组 400 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
578 } 401 }
579 402
580 403
581 -  
582 /*计算直方图均衡化并转换为8位灰度值 404 /*计算直方图均衡化并转换为8位灰度值
583 U16_t in_str 输入的数据 405 U16_t in_str 输入的数据
584 int in_str_len 输入的数据长度 406 int in_str_len 输入的数据长度
@@ -780,19 +602,32 @@ T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize, @@ -780,19 +602,32 @@ T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
780 //如果打开了单点纠正模式 602 //如果打开了单点纠正模式
781 if (dealInfo->FrameCorrectMode == IRC_CORRCTION_SPC) 603 if (dealInfo->FrameCorrectMode == IRC_CORRCTION_SPC)
782 { 604 {
783 - JZIrcLib_SPC(u16_CorrentData, dealInfo); 605 + //计算单点校正的斜率
  606 + JZIrcLib_SPC_Slope_Calculation(dealInfo);
  607 +
  608 + //通过斜率进行单点校正
  609 + ret = JZIrcLib_SPC(u16_CorrentData, dealInfo);
  610 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  611 + {
  612 + JZSDK_LOG_ERROR("两点校正失败");
  613 + }
784 } 614 }
785 615
786 // 如果打开了两点校正 616 // 如果打开了两点校正
787 if (dealInfo->FrameCorrectMode == IRC_CORRCTION_TPC) 617 if (dealInfo->FrameCorrectMode == IRC_CORRCTION_TPC)
788 { 618 {
789 - JZIrcLib_TPC(u16_CorrentData, dealInfo); 619 + //对数据进行两点校正
  620 + ret = JZIrcLib_TPC(u16_CorrentData, dealInfo);
  621 + if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
  622 + {
  623 + JZSDK_LOG_ERROR("两点校正失败");
  624 + }
790 } 625 }
791 626
792 U8_t *GrayImage = NULL; 627 U8_t *GrayImage = NULL;
793 int GrayImageLen = 0; 628 int GrayImageLen = 0;
794 629
795 - //直方图 630 + //直方图均衡化
796 JZIrcLib_vKT(u16_CorrentData, &GrayImage, &GrayImageLen, dealInfo); 631 JZIrcLib_vKT(u16_CorrentData, &GrayImage, &GrayImageLen, dealInfo);
797 632
798 //图像输出模式 633 //图像输出模式
@@ -16,6 +16,7 @@ extern "C" { @@ -16,6 +16,7 @@ extern "C" {
16 T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize, 16 T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
17 U8_t **RGB_data, unsigned int *RGB_dataSize, 17 U8_t **RGB_data, unsigned int *RGB_dataSize,
18 struct IRC_param *dealInfo); 18 struct IRC_param *dealInfo);
  19 +T_JZsdkReturnCode JZIrcLib_TPC_Slope_Calculation2(struct IRC_param *dealInfo);
19 20
20 21
21 #ifdef __cplusplus 22 #ifdef __cplusplus
@@ -116,6 +116,7 @@ T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned in @@ -116,6 +116,7 @@ T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned in
116 { 116 {
117 if (P_Color_FinishFlag != JZ_FLAGCODE_ON) 117 if (P_Color_FinishFlag != JZ_FLAGCODE_ON)
118 { 118 {
  119 + JZSDK_LOG_ERROR("伪彩配置文件未初始化");
119 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; 120 return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
120 } 121 }
121 122
@@ -123,6 +124,7 @@ T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned in @@ -123,6 +124,7 @@ T_JZsdkReturnCode PseudoColor_Gray2Rgb(U8_t *in_str, U8_t **out_str, unsigned in
123 *out_str = (unsigned char*)malloc(*out_str_len * sizeof(unsigned char)); 124 *out_str = (unsigned char*)malloc(*out_str_len * sizeof(unsigned char));
124 if (out_str == NULL) 125 if (out_str == NULL)
125 { 126 {
  127 + JZSDK_LOG_ERROR("内存分配失败");
126 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; 128 return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
127 } 129 }
128 130
@@ -36,7 +36,6 @@ extern "C" { @@ -36,7 +36,6 @@ extern "C" {
36 #define SATURATION (128) //饱和度 摄像头饱和度范围为 1-255 默认128 36 #define SATURATION (128) //饱和度 摄像头饱和度范围为 1-255 默认128
37 #define EXPSURE (100) //曝光值 摄像头曝光值范围: 5-2500 默认auto设置 37 #define EXPSURE (100) //曝光值 摄像头曝光值范围: 5-2500 默认auto设置
38 38
39 -  
40 #define SECOND_WIDTH 1920 39 #define SECOND_WIDTH 1920
41 #define SECOND_HEIGHT 1080 40 #define SECOND_HEIGHT 1080
42 #define SECOND_FRAME_NUM 30 41 #define SECOND_FRAME_NUM 30
@@ -12,7 +12,6 @@ @@ -12,7 +12,6 @@
12 #include "./MultProc/MultProc.h" 12 #include "./MultProc/MultProc.h"
13 #include "./MediaParm.h" 13 #include "./MediaParm.h"
14 #include "./Camera/Camera.h" 14 #include "./Camera/Camera.h"
15 -#include "./Camera/Kt_Irc/Kt_Irc.h"  
16 15
17 //单线程方案 16 //单线程方案
18 static T_JZsdkReturnCode MediaProc_SingleThreading() 17 static T_JZsdkReturnCode MediaProc_SingleThreading()
@@ -48,41 +47,6 @@ static T_JZsdkReturnCode MediaProc_MultiThreading() @@ -48,41 +47,6 @@ static T_JZsdkReturnCode MediaProc_MultiThreading()
48 47
49 VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送光学摄像头 48 VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送光学摄像头
50 } 49 }
51 -  
52 - //如果是昆腾相机 红外+光学 则红外为1号,光学为2号  
53 - if (DEVICE_VERSION == JZ_C1)  
54 - {  
55 - //1、启动视频流缓冲区模块  
56 - VideoMgmt_init_buffer(&VideoMgmt_FirstVideo_index);  
57 - VideoMgmt_init_buffer(&VideoMgmt_FirstRaw_index);  
58 -  
59 - VideoMgmt_init_buffer(&VideoMgmt_SecondVideo_index);  
60 - VideoMgmt_init_buffer(&VideoMgmt_SecondRaw_index);  
61 -  
62 - //2、初始化编解码处理模块  
63 - JZsdk_Kt_IrcMMP_Init(FIRST_WIDTH ,FIRST_HEIGHT, 25, 5 ,SECOND_WIDTH ,SECOND_HEIGHT, 30, 15);  
64 -  
65 - //3、相机初始化  
66 - JZsdk_Kt_Irc_Camera_Init();  
67 -  
68 - //4、启用推流模块  
69 - VideoMgmt_VideoStreamFlow_Init(25, &VideoMgmt_FirstVideo_index, VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST);  
70 - VideoMgmt_VideoStreamFlow_Init(30, &VideoMgmt_SecondVideo_index, VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND);  
71 -  
72 - //转码模块  
73 - VideoStreamTransCode_Init();  
74 -  
75 - //5、打开默认选项  
76 - VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST); //默认推送红外摄像头 后续改成 红外+光学 的组合画面  
77 - JZsdk_Kt_Irc_ShutterSwitch(JZ_FLAGCODE_ON);  
78 -  
79 - //6、修改部分参数  
80 - int value = 8;  
81 - Camera_param(JZ_FLAGCODE_SET, CAMERA_PSEUDO_COLOR, &value);  
82 - value = 1;  
83 - Camera_param(JZ_FLAGCODE_SET, CAMERA_PIXEL_PSEUDO_COLOR_MODE, &value);  
84 - }  
85 -  
86 } 50 }
87 51
88 //视频流模块初始化 52 //视频流模块初始化
@@ -91,8 +55,6 @@ T_JZsdkReturnCode MediaProc_Init() @@ -91,8 +55,6 @@ T_JZsdkReturnCode MediaProc_Init()
91 55
92 #if DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T 56 #if DEVICE_VERSION == JZ_H150S || DEVICE_VERSION == JZ_H150T
93 MediaProc_SingleThreading(); 57 MediaProc_SingleThreading();
94 -# elif DEVICE_VERSION == JZ_C1  
95 - MediaProc_MultiThreading();  
96 #endif 58 #endif
97 59
98 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; 60 return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
@@ -26,13 +26,13 @@ extern "C" { @@ -26,13 +26,13 @@ extern "C" {
26 26
27 typedef enum CameraParam 27 typedef enum CameraParam
28 { 28 {
29 - CAMERA_PSEUDO_COLOR = 0x000001,  
30 - CAMERA_PIXEL_PSEUDO_COLOR_MODE = 0x000002,  
31 - CAMERA_REGION_BOX = 0x000003,  
32 - CAMERA_CORRCTION_MODE = 0x000004,  
33 - CAMERA_GAS_ENHANCEMENT_COLOR = 0x000005,  
34 - CAMERA_GAS_ENHANCEMENT_CORRCTION = 0x000006,  
35 - 29 + CAMERA_PSEUDO_COLOR = 0x000001, //伪彩色
  30 + CAMERA_PIXEL_PSEUDO_COLOR_MODE = 0x000002, //像素输出模式
  31 + CAMERA_REGION_BOX = 0x000003, //区域框
  32 + CAMERA_CORRCTION_MODE = 0x000004, //纠正模式
  33 + CAMERA_GAS_ENHANCEMENT_COLOR = 0x000005, //气体增强颜色
  34 + CAMERA_GAS_ENHANCEMENT_CORRCTION = 0x000006, //气体增强纠正
  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,60 @@ T_JZsdkReturnCode Stream_rgb888_to_yuv420p(U8_t *rgb_data, int width, int height @@ -55,6 +55,60 @@ 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 MPP_FMT_YUV420SP = (MPP_FRAME_FMT_YUV + 0), /* YYYY... UV... (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 +
  70 +
  71 + // RGB888到YUV420SP的转换
  72 + for (int j = 0; j < height; j++) {
  73 + for (int i = 0; i < width; i++) {
  74 + // 计算Y分量的索引
  75 + int y_idx = j * width + i;
  76 +
  77 + // 计算UV分量的索引(每个第二个像素存储一次)
  78 + int uv_idx = (j / 2) * (width / 2) + (i / 2);
  79 +
  80 + // 提取RGB分量
  81 + U8_t r = rgb_data[y_idx * 3];
  82 + U8_t g = rgb_data[y_idx * 3 + 1];
  83 + U8_t b = rgb_data[y_idx * 3 + 2];
  84 +
  85 + // 将RGB转换为YUV
  86 + int y = ((66 * r + 129 * g + 25 * b + 128) >> 8);
  87 + int u = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
  88 + int v = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
  89 +
  90 + // 存储Y分量
  91 + y_plane[y_idx] = (U8_t)y;
  92 +
  93 + // 仅当为每第二个像素时存储U和V分量
  94 + if ((i & 1) == 0 && (j & 1) == 0)
  95 + {
  96 + // 存储U分量
  97 + uv_plane[uv_idx * 2] = (U8_t)u;
  98 + // 存储V分量
  99 + uv_plane[uv_idx * 2 + 1] = (U8_t)v;
  100 + }
  101 +
  102 + }
  103 + }
  104 +
  105 + // 注意:如果图像的宽度或高度不是偶数,上面的代码可能无法正确处理最后一行或一列。
  106 + // 在实际应用中,通常需要确保图像的尺寸是2的倍数,或者添加适当的边界处理代码。
  107 +
  108 + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
  109 +}
  110 +
  111 +
58 /************************* 112 /*************************
59 * 113 *
60 * /rgb888图片画框 114 * /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 - }  
124 -  
125 - // save  
126 - dump_frame(frame, out_fp);  
127 - return;  
128 -} 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 +
  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"
@@ -7,88 +7,69 @@ @@ -7,88 +7,69 @@
7 #include "version_choose.h" 7 #include "version_choose.h"
8 #include "MediaProc/VideoMgmt/VideoMgmt.h" 8 #include "MediaProc/VideoMgmt/VideoMgmt.h"
9 9
10 -void *Kt_Irc_enc_index = NULL; //昆腾红外编码器的索引值  
11 -void *Kt_Cam_enc_index = NULL; //昆腾光学编码器的索引值  
12 -void *Kt_Cam_dec_index = NULL; //昆腾光学解码器的索引值 10 +//c1 0是红外权柄 1是光学权柄 2为空权柄
  11 +static void *RtkMmpEncHandle[3] = { NULL }; // 所有元素都被初始化为NULL
  12 +static void *RtkMmpDecHandle[3] = { NULL }; // 所有元素都被初始化为NULL
13 13
14 -//昆腾红外相机的mmp初始化部分  
15 -T_JZsdkReturnCode JZsdk_Kt_IrcMMP_Init(int Irc_width, int Irc_height, int Irc_frame, int Irc_gop, int Cam_width, int Cam_height, int Cam_frame,int Cam_gop)  
16 -{  
17 -#if RTK_MPP_STATUS == VERSION_SWITCH_ON  
18 - //初始化红外数据的编码器  
19 - RTK_mmp_enc_Init(&Kt_Irc_enc_index, MPP_VIDEO_CodingAVC, MPP_FMT_YUV420P, Irc_width, Irc_height, Irc_frame, Irc_gop);  
20 - //RTK_mmp_enc_Init(&Kt_Irc_enc_index, MPP_VIDEO_CodingAVC, MPP_FMT_RGB888, Irc_width, Irc_height, Irc_frame); 14 +/*
  15 + rtk模块获取编码权柄
  16 + 属于参数即可权柄
21 17
22 - //初始化光学数据的编解码器  
23 - RTK_mmp_dec_Init(&Kt_Cam_dec_index, MPP_VIDEO_CodingMJPEG, MPP_FMT_YUV420SP, Cam_width, Cam_height);  
24 - RTK_mmp_enc_Init(&Kt_Cam_enc_index, MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, Cam_width, Cam_height, Cam_frame, Cam_gop);  
25 -#endif  
26 -}  
27 -  
28 -//原始视频流通过rtkmmp转为h264  
29 -T_JZsdkReturnCode JZsdk_RTKMMP_RawData_to_h264(unsigned char *RawData, int data_len) 18 +*/
  19 +void *JZsdk_RtkMmpGetEncHandle(int CameraIndex)
30 { 20 {
31 -#if RTK_MPP_STATUS == VERSION_SWITCH_ON  
32 - MppPacket Packet = NULL; 21 + return RtkMmpEncHandle[CameraIndex];
  22 +}
33 23
34 - RTK_mmp_enc_data_to_h264(&Kt_Irc_enc_index, RawData, data_len, &Packet);  
35 24
36 - int packet_len = mpp_packet_get_length(Packet);  
37 - void *ptr = mpp_packet_get_pos(Packet);  
38 - //EncCfg->Packet_eos = mpp_packet_get_eos(packet);  
39 - // printf("获取到编码内容 len:%d\n",packet_len);  
40 25
41 - //3、将h264流输出到视频流缓冲区  
42 - VideoMgmt_write_data(&VideoMgmt_FirstVideo_index, ptr, packet_len); 26 +/*
  27 + rtk模块获取解码权柄
  28 + 属于参数即可权柄
43 29
44 - //释放掉packet  
45 - mpp_packet_deinit(&Packet);  
46 -#endif 30 +*/
  31 +void *JZsdk_RtkMmpGetDecHandle(int CameraIndex)
  32 +{
  33 + return RtkMmpDecHandle[CameraIndex];
47 } 34 }
48 35
49 -//昆腾光学相机数据输入部分  
50 -T_JZsdkReturnCode JZsdk_Kt_CamMMP_Mjpeg_to_h264(unsigned char *data, int data_len) 36 +/*********
  37 + *
  38 + * 返回dec权柄地址
  39 + *
  40 + *
  41 + * ***/
  42 +void **JZsdk_RtkMmpGetDecHandleAddr(int CameraIndex)
51 { 43 {
52 -#if RTK_MPP_STATUS == VERSION_SWITCH_ON  
53 - MppFrame yuv_data = NULL; //用于传递yuv数据的地址  
54 - MppPacket Packet = NULL;  
55 -  
56 - //输入数据进入解码器  
57 - RTK_mmp_dec_input(&Kt_Cam_dec_index, data, data_len, &yuv_data);  
58 -  
59 - // int width = mpp_frame_get_width(yuv_data);  
60 - // int height = mpp_frame_get_height(yuv_data);  
61 - // int h_stride = mpp_frame_get_hor_stride(yuv_data);  
62 - // int v_stride = mpp_frame_get_ver_stride(yuv_data);  
63 -  
64 - // JZSDK_LOG_INFO("w:%d h:%d hor:%d ver:%d",width,height,h_stride,v_stride);  
65 -  
66 - //将返回的数据输入进编码器  
67 - RTK_mmp_enc_yuv_to_h264_byFrame(&Kt_Cam_enc_index, yuv_data, &Packet);  
68 -  
69 - //获取数据指针与长度  
70 - int packet_len = mpp_packet_get_length(Packet);  
71 - void *ptr = mpp_packet_get_pos(Packet);  
72 -  
73 - //置入视频缓冲区  
74 - VideoMgmt_write_data(&VideoMgmt_SecondVideo_index, (unsigned char *)ptr, (unsigned int)packet_len); 44 + return &(RtkMmpDecHandle[CameraIndex]);
  45 +}
75 46
76 - //释放掉编码图像  
77 - mpp_packet_deinit(&Packet);  
78 -#endif 47 +/*********
  48 + *
  49 + * 返回enc权柄地址
  50 + *
  51 + *
  52 + * ***/
  53 +void **JZsdk_RtkMmpGetEncHandleAddr(int CameraIndex)
  54 +{
  55 + return &(RtkMmpEncHandle[CameraIndex]);
79 } 56 }
80 57
81 //昆腾相机设置下一帧为I帧 58 //昆腾相机设置下一帧为I帧
82 T_JZsdkReturnCode JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(int CameraIndex) 59 T_JZsdkReturnCode JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(int CameraIndex)
83 { 60 {
84 -#if RTK_MPP_STATUS == VERSION_SWITCH_ON 61 +#ifdef RTK_MPP_STATUS_ON
85 if (CameraIndex == 0) 62 if (CameraIndex == 0)
86 { 63 {
87 - RTK_mmp_enc_SetNextFrame_IDR(&Kt_Irc_enc_index); 64 + RTK_mmp_enc_SetNextFrame_IDR(JZsdk_RtkMmpGetEncHandleAddr(0));
88 } 65 }
89 else if(CameraIndex == 1) 66 else if(CameraIndex == 1)
90 { 67 {
91 - RTK_mmp_enc_SetNextFrame_IDR(&Kt_Cam_enc_index); 68 + RTK_mmp_enc_SetNextFrame_IDR(JZsdk_RtkMmpGetEncHandleAddr(1));
  69 + }
  70 + else if(CameraIndex == 2)
  71 + {
  72 + RTK_mmp_enc_SetNextFrame_IDR(JZsdk_RtkMmpGetEncHandleAddr(2));
92 } 73 }
93 else 74 else
94 { 75 {
@@ -12,6 +12,15 @@ @@ -12,6 +12,15 @@
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 +#include "BaseConfig.h"
  16 +
  17 +#ifdef RTK_MPP_STATUS_ON
  18 +
  19 +
  20 +#include "MediaProc/MultProc/RTK_mmp/Dec/RTK_mmp_dec.h"
  21 +#include "MediaProc/MultProc/RTK_mmp/Enc/RTK_mmp_enc.h"
  22 +
  23 +#endif
15 24
16 #ifdef __cplusplus 25 #ifdef __cplusplus
17 extern "C" { 26 extern "C" {
@@ -26,9 +35,17 @@ extern "C" { @@ -26,9 +35,17 @@ extern "C" {
26 /* Exported functions --------------------------------------------------------*/ 35 /* Exported functions --------------------------------------------------------*/
27 T_JZsdkReturnCode JZsdk_Kt_CamMMP_Mjpeg_to_h264(unsigned char *data, int data_len); 36 T_JZsdkReturnCode JZsdk_Kt_CamMMP_Mjpeg_to_h264(unsigned char *data, int data_len);
28 T_JZsdkReturnCode JZsdk_RTKMMP_RawData_to_h264(unsigned char *RawData, int data_len); 37 T_JZsdkReturnCode JZsdk_RTKMMP_RawData_to_h264(unsigned char *RawData, int data_len);
  38 +T_JZsdkReturnCode JZsdk_RTKMMP_RawData_to_h264_Return(void **index, unsigned char *RawData, int *data_len);
  39 +
29 T_JZsdkReturnCode JZsdk_Kt_IrcMMP_Init(int Irc_width, int Irc_height, int Irc_frame, int Irc_gop, int Cam_width, int Cam_height, int Cam_frame,int Cam_gop); 40 T_JZsdkReturnCode JZsdk_Kt_IrcMMP_Init(int Irc_width, int Irc_height, int Irc_frame, int Irc_gop, int Cam_width, int Cam_height, int Cam_frame,int Cam_gop);
30 T_JZsdkReturnCode JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(int CameraIndex); 41 T_JZsdkReturnCode JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(int CameraIndex);
31 42
  43 +void *JZsdk_RtkMmpGetEncHandle(int CameraIndex);
  44 +void *JZsdk_RtkMmpGetDecHandle(int CameraIndex);
  45 +
  46 +void **JZsdk_RtkMmpGetDecHandleAddr(int CameraIndex);
  47 +void **JZsdk_RtkMmpGetEncHandleAddr(int CameraIndex);
  48 +
32 49
33 50
34 #ifdef __cplusplus 51 #ifdef __cplusplus