合并分支 'dev' 到 'master'
Dev 查看合并请求 !11
正在显示
48 个修改的文件
包含
2429 行增加
和
1227 行删除
@@ -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 | } |
Module/DeviceConfig/JZC1/JZC1.c
0 → 100644
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 | + |
Module/DeviceConfig/JZC1/JZC1.h
0 → 100644
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 |
Module/MediaProc/Camera/Cam_Zoom/Cam_Zoom.c
0 → 100644
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 | +} |
Module/MediaProc/Camera/Cam_Zoom/Cam_Zoom.h
0 → 100644
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 |
Module/MediaProc/Camera/Kt_Irc/Kt_Irc.c
已删除
100644 → 0
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 |
-
请 注册 或 登录 后发表评论