合并分支 'dev' 到 'master'
Dev 查看合并请求 !11
正在显示
48 个修改的文件
包含
2445 行增加
和
1243 行删除
| @@ -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,52 +21,71 @@ static const AVCodec *codec; | @@ -21,52 +21,71 @@ static const AVCodec *codec; | ||
| 21 | 21 | ||
| 22 | T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame); | 22 | T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame); |
| 23 | 23 | ||
| 24 | -int File_Stream_deal_Init(enum AVCodecID id) | 24 | +T_JZsdkReturnCode File_Stream_deal_Init(enum AVCodecID id) |
| 25 | { | 25 | { |
| 26 | + //注册包 | ||
| 26 | pkt = av_packet_alloc(); | 27 | pkt = av_packet_alloc(); |
| 27 | if(!pkt) | 28 | if(!pkt) |
| 28 | { | 29 | { |
| 29 | JZSDK_LOG_ERROR("av_packet_alloc failed."); | 30 | JZSDK_LOG_ERROR("av_packet_alloc failed."); |
| 30 | } | 31 | } |
| 31 | 32 | ||
| 33 | + //寻找解码器 | ||
| 32 | codec = avcodec_find_decoder(id); | 34 | codec = avcodec_find_decoder(id); |
| 33 | if (!codec) { | 35 | if (!codec) { |
| 34 | JZSDK_LOG_ERROR("Codec not found\n"); | 36 | JZSDK_LOG_ERROR("Codec not found\n"); |
| 35 | } | 37 | } |
| 36 | 38 | ||
| 39 | + //获得裸流的解析器 | ||
| 37 | parser = av_parser_init(codec->id); | 40 | parser = av_parser_init(codec->id); |
| 38 | if (!parser) { | 41 | if (!parser) { |
| 39 | JZSDK_LOG_ERROR("Parser not found\n"); | 42 | JZSDK_LOG_ERROR("Parser not found\n"); |
| 40 | } | 43 | } |
| 41 | 44 | ||
| 45 | + //分配解码上下文 | ||
| 42 | cdc_ctx = avcodec_alloc_context3(codec); | 46 | cdc_ctx = avcodec_alloc_context3(codec); |
| 43 | if (!cdc_ctx) { | 47 | if (!cdc_ctx) { |
| 44 | JZSDK_LOG_ERROR("Could not allocate audio codec context\n"); | 48 | JZSDK_LOG_ERROR("Could not allocate audio codec context\n"); |
| 45 | } | 49 | } |
| 46 | 50 | ||
| 47 | - /* open it */ | 51 | + //将解码器和解码上下文绑定 |
| 48 | if (avcodec_open2(cdc_ctx, codec, NULL) < 0) | 52 | if (avcodec_open2(cdc_ctx, codec, NULL) < 0) |
| 49 | { | 53 | { |
| 50 | JZSDK_LOG_ERROR("Could not open codec\n"); | 54 | JZSDK_LOG_ERROR("Could not open codec\n"); |
| 51 | } | 55 | } |
| 52 | 56 | ||
| 53 | - //如果解码器不存在,初始化解码器 | ||
| 54 | - if (!decoded_frame) | ||
| 55 | - { | ||
| 56 | - if (!(decoded_frame = av_frame_alloc())) | ||
| 57 | - { | ||
| 58 | - JZSDK_LOG_ERROR("Could not allocate audio frame\n"); | ||
| 59 | - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | ||
| 60 | - } | ||
| 61 | - } | 57 | + JZSDK_LOG_INFO("file stream init complete"); |
| 58 | + | ||
| 59 | + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 62 | } | 60 | } |
| 63 | 61 | ||
| 64 | //输入mp3的实时数据,以及本次数据的长度 | 62 | //输入mp3的实时数据,以及本次数据的长度 |
| 65 | T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize) | 63 | T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, unsigned int in_sampleRate, unsigned char *data, int dataSize) |
| 66 | { | 64 | { |
| 65 | + //JZSDK_LOG_DEBUG("mp3 stream输入 %d 字节数据", dataSize); | ||
| 66 | + | ||
| 67 | + //重置重采样器 | ||
| 68 | + FF_Resample_Reset(AD_Info, in_sampleRate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16); | ||
| 69 | + | ||
| 70 | + //检查滤波器 | ||
| 71 | + FF_Filter_Init(AD_Info, 0x01); | ||
| 72 | + | ||
| 73 | + int ret = 0; | ||
| 74 | + unsigned char *databufPtr = data; | ||
| 75 | + int databufSize = dataSize; | ||
| 76 | + | ||
| 67 | //将数据输入到 | 77 | //将数据输入到 |
| 68 | - while(dataSize > 0) | 78 | + while(databufSize > 0) |
| 69 | { | 79 | { |
| 80 | + //如果解码器不存在,初始化解码器 | ||
| 81 | + if (!decoded_frame) | ||
| 82 | + { | ||
| 83 | + if (!(decoded_frame = av_frame_alloc())) | ||
| 84 | + { | ||
| 85 | + JZSDK_LOG_ERROR("Could not allocate audio frame\n"); | ||
| 86 | + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | ||
| 87 | + } | ||
| 88 | + } | ||
| 70 | 89 | ||
| 71 | //检查参数,并将正确的数据输入到pkt中 | 90 | //检查参数,并将正确的数据输入到pkt中 |
| 72 | //parser 解析器 | 91 | //parser 解析器 |
| @@ -74,22 +93,16 @@ T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, un | @@ -74,22 +93,16 @@ T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, un | ||
| 74 | //pkt输出的数据指针 | 93 | //pkt输出的数据指针 |
| 75 | //data datasize 输入的数据指针 | 94 | //data datasize 输入的数据指针 |
| 76 | //pts、dts、pos:时间戳和位置信息,一般可以设置为AV_NOPTS_VALUE和0。 | 95 | //pts、dts、pos:时间戳和位置信息,一般可以设置为AV_NOPTS_VALUE和0。 |
| 77 | - int ret = av_parser_parse2(parser, cdc_ctx, &pkt->data, &pkt->size, data, dataSize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0); | 96 | + ret = av_parser_parse2(parser, cdc_ctx, &pkt->data, &pkt->size, databufPtr, databufSize, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0); |
| 78 | if (ret < 0) { | 97 | if (ret < 0) { |
| 79 | printf("Error while parsing\n"); | 98 | printf("Error while parsing\n"); |
| 80 | - return -1; | 99 | + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; |
| 81 | } | 100 | } |
| 82 | - | ||
| 83 | - //重置重采样器 | ||
| 84 | - FF_Resample_Reset(AD_Info, in_sampleRate, (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO, AV_SAMPLE_FMT_S16); | ||
| 85 | - | ||
| 86 | - //检查滤波器 | ||
| 87 | - FF_Filter_Init(AD_Info, 0x01); | ||
| 88 | 101 | ||
| 89 | //数据指针 往后一个解析长度 | 102 | //数据指针 往后一个解析长度 |
| 90 | //长度指针 减少一个被解析数据的长度 | 103 | //长度指针 减少一个被解析数据的长度 |
| 91 | - data += ret; | ||
| 92 | - dataSize -= ret; | 104 | + databufPtr += ret; |
| 105 | + databufSize -= ret; | ||
| 93 | 106 | ||
| 94 | //如果输出有长度 解码输出的数据 | 107 | //如果输出有长度 解码输出的数据 |
| 95 | if (pkt->size > 0) | 108 | if (pkt->size > 0) |
| @@ -97,6 +110,8 @@ T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, un | @@ -97,6 +110,8 @@ T_JZsdkReturnCode mp3_Stream_Interface_Mp3Data(struct AudioDealInfo *AD_Info, un | ||
| 97 | Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame); | 110 | Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame); |
| 98 | } | 111 | } |
| 99 | } | 112 | } |
| 113 | + | ||
| 114 | + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 100 | } | 115 | } |
| 101 | 116 | ||
| 102 | 117 | ||
| @@ -108,7 +123,13 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | @@ -108,7 +123,13 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | ||
| 108 | 123 | ||
| 109 | //发送数据包给解码器解码,已将数据解码为pcm原始数据 | 124 | //发送数据包给解码器解码,已将数据解码为pcm原始数据 |
| 110 | ret = avcodec_send_packet(dec_ctx, pkt); | 125 | ret = avcodec_send_packet(dec_ctx, pkt); |
| 111 | - if (ret < 0) | 126 | + if (ret == AVERROR(EAGAIN)) |
| 127 | + { | ||
| 128 | + char errbuf[128]; | ||
| 129 | + av_strerror(ret, errbuf, sizeof(errbuf)); | ||
| 130 | + JZSDK_LOG_ERROR("Error while sending a packet to the decoder %s",errbuf); | ||
| 131 | + } | ||
| 132 | + else if (ret < 0) | ||
| 112 | { | 133 | { |
| 113 | JZSDK_LOG_ERROR("Error submitting the packet to the decoder, ret=%d\n",ret); | 134 | JZSDK_LOG_ERROR("Error submitting the packet to the decoder, ret=%d\n",ret); |
| 114 | return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | 135 | return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; |
| @@ -120,7 +141,7 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | @@ -120,7 +141,7 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | ||
| 120 | 141 | ||
| 121 | /* read all the output frames (in general there may be any number of them */ | 142 | /* read all the output frames (in general there may be any number of them */ |
| 122 | //读取输出的帧 | 143 | //读取输出的帧 |
| 123 | - while ( (ret >= 0) && (AD_Info->Flag_AudioDataGenerationImplement == JZ_FLAGCODE_ON) ) | 144 | + while ( (ret >= 0) && AD_Info->AudioDeal_ResampleAndFilter_Execute_Flag == JZ_FLAGCODE_ON) |
| 124 | { | 145 | { |
| 125 | //从解码器中读取解码后的音频帧数据 | 146 | //从解码器中读取解码后的音频帧数据 |
| 126 | ret = avcodec_receive_frame(dec_ctx, frame); | 147 | ret = avcodec_receive_frame(dec_ctx, frame); |
| @@ -134,6 +155,8 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | @@ -134,6 +155,8 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | ||
| 134 | JZSDK_LOG_ERROR("Error during decoding\n"); | 155 | JZSDK_LOG_ERROR("Error during decoding\n"); |
| 135 | return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | 156 | return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; |
| 136 | } | 157 | } |
| 158 | + | ||
| 159 | + //printf("输出了:%d的数据\n",frame->nb_samples); | ||
| 137 | 160 | ||
| 138 | int out_nb_samples = 0; | 161 | int out_nb_samples = 0; |
| 139 | 162 | ||
| @@ -149,7 +172,7 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | @@ -149,7 +172,7 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | ||
| 149 | //将临时帧 放入 均衡滤波器 | 172 | //将临时帧 放入 均衡滤波器 |
| 150 | FF_Filter_push_frame_to_fliter(AD_Info, temp_frame); | 173 | FF_Filter_push_frame_to_fliter(AD_Info, temp_frame); |
| 151 | 174 | ||
| 152 | - while(AD_Info->Flag_AudioDataGenerationImplement == JZ_FLAGCODE_ON) | 175 | + while(AD_Info->AudioDeal_ResampleAndFilter_Execute_Flag == JZ_FLAGCODE_ON) |
| 153 | { | 176 | { |
| 154 | //得到滤波器输出的音频帧 eq_frame | 177 | //得到滤波器输出的音频帧 eq_frame |
| 155 | int fret = FF_Filter_get_frame_from_filter(AD_Info, eq_frame); | 178 | int fret = FF_Filter_get_frame_from_filter(AD_Info, eq_frame); |
| @@ -158,6 +181,8 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | @@ -158,6 +181,8 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | ||
| 158 | break; | 181 | break; |
| 159 | } | 182 | } |
| 160 | 183 | ||
| 184 | + //printf("pcm播放 %d 数据\n",eq_frame->nb_samples); | ||
| 185 | + | ||
| 161 | //播放改滤波后的帧 | 186 | //播放改滤波后的帧 |
| 162 | Pcm_AlsaPlay(AD_Info, (unsigned char*)eq_frame->data[0], eq_frame->nb_samples); | 187 | Pcm_AlsaPlay(AD_Info, (unsigned char*)eq_frame->data[0], eq_frame->nb_samples); |
| 163 | 188 | ||
| @@ -179,4 +204,14 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | @@ -179,4 +204,14 @@ T_JZsdkReturnCode Stream_Player_decode(struct AudioDealInfo *AD_Info, AVCodecCon | ||
| 179 | //释放掉输出的变量 | 204 | //释放掉输出的变量 |
| 180 | av_frame_unref(temp_frame); | 205 | av_frame_unref(temp_frame); |
| 181 | av_frame_unref(eq_frame); | 206 | av_frame_unref(eq_frame); |
| 207 | + | ||
| 182 | } | 208 | } |
| 209 | + | ||
| 210 | +T_JZsdkReturnCode Stream_Player_Stop(struct AudioDealInfo *AD_Info) | ||
| 211 | +{ | ||
| 212 | + pkt->data = NULL; | ||
| 213 | + pkt->size = 0; | ||
| 214 | + Stream_Player_decode(AD_Info, cdc_ctx, pkt, decoded_frame); | ||
| 215 | + | ||
| 216 | + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 217 | +} |
| @@ -296,13 +296,25 @@ T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int AudioType) | @@ -296,13 +296,25 @@ T_JZsdkReturnCode FF_Filter_Init(struct AudioDealInfo *AD_Info, int AudioType) | ||
| 296 | { | 296 | { |
| 297 | T_JZsdkReturnCode ret; | 297 | T_JZsdkReturnCode ret; |
| 298 | 298 | ||
| 299 | - int NewType = FILTER_NORMAL; | 299 | + int NewType = FILTER_NORMAL_AUDIO; |
| 300 | 300 | ||
| 301 | //通过g_FilterMode 与 音频内容 得出滤波类型 | 301 | //通过g_FilterMode 与 音频内容 得出滤波类型 |
| 302 | if (g_FilterMode == 0x00) //默认滤波 | 302 | if (g_FilterMode == 0x00) //默认滤波 |
| 303 | { | 303 | { |
| 304 | //无须管音频类型,直接同一个默认滤波器 | 304 | //无须管音频类型,直接同一个默认滤波器 |
| 305 | - NewType = FILTER_NORMAL; | 305 | + if (AudioType == 0x00) //文本类型 |
| 306 | + { | ||
| 307 | + NewType = FILTER_NORMAL_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) | ||
| 92 | { | 177 | { |
| 93 | - int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_SingleThread,NULL); //线程 | ||
| 94 | - if(opus_Protection != 0) | ||
| 95 | - { | ||
| 96 | - JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!"); | ||
| 97 | - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | ||
| 98 | - } | 178 | + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; |
| 99 | } | 179 | } |
| 100 | - else if (ThreadMode == 1) | 180 | + |
| 181 | + t_FrameCatch_TaskFuntionInput *task = (t_FrameCatch_TaskFuntionInput*)malloc(sizeof(t_FrameCatch_TaskFuntionInput)); | ||
| 182 | + if (task == NULL) | ||
| 101 | { | 183 | { |
| 102 | - int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_MultiThread,NULL); //线程 | ||
| 103 | - if(opus_Protection != 0) | ||
| 104 | - { | ||
| 105 | - JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!"); | ||
| 106 | - return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | ||
| 107 | - } | 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); //线程 | ||
| 191 | + if(opus_Protection != 0) | ||
| 192 | + { | ||
| 193 | + JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!"); | ||
| 194 | + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | ||
| 195 | + } | ||
| 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) | ||
| 218 | + { | ||
| 219 | + return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER; | ||
| 108 | } | 220 | } |
| 109 | 221 | ||
| 222 | + | ||
| 223 | + int opus_Protection = pthread_create(&ReadDataTask,&task_attribute,JZsdk_Catch_MultiThread2, FrameIndex); //线程 | ||
| 224 | + if(opus_Protection != 0) | ||
| 225 | + { | ||
| 226 | + JZSDK_LOG_ERROR("创建相机抓取并处理初始化线程失败!"); | ||
| 227 | + return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE; | ||
| 228 | + } | ||
| 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("低温数据记录完成"); |
| @@ -110,7 +121,9 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param | @@ -110,7 +121,9 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param | ||
| 110 | } | 121 | } |
| 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: | ||
| 730 | - memcpy(dealInfo->HighT_NineFrame_Avg, numbers, count * sizeof(U16_t)); | ||
| 731 | - JZSDK_LOG_DEBUG("读取高SD温度数据"); | ||
| 732 | - break; | ||
| 733 | - | ||
| 734 | - case LOW_SD_TEMP: | ||
| 735 | - memcpy(dealInfo->LowT_NineFrame_Avg, numbers, count * sizeof(U16_t)); | ||
| 736 | - JZSDK_LOG_DEBUG("读取低SD温度数据"); | ||
| 737 | - break; | ||
| 738 | - | ||
| 739 | - case HIGH_LOCAL_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: | ||
| 740 | memcpy(dealInfo->HighT_NineFrame_Avg, numbers, count * sizeof(U16_t)); | 768 | memcpy(dealInfo->HighT_NineFrame_Avg, numbers, count * sizeof(U16_t)); |
| 741 | - JZSDK_LOG_DEBUG("读取高本地温度数据"); | 769 | + JZSDK_LOG_DEBUG("读取高温数据"); |
| 742 | break; | 770 | break; |
| 743 | 771 | ||
| 744 | - case LOW_LOCAL_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: | ||
| 745 | memcpy(dealInfo->LowT_NineFrame_Avg, numbers, count * sizeof(U16_t)); | 777 | 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); | ||
| 833 | + break; | ||
| 834 | + | ||
| 835 | + case LOCAL_HIGH_TEMP_1: | ||
| 836 | + snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR); | ||
| 801 | break; | 837 | break; |
| 802 | 838 | ||
| 803 | - case LOW_SD_TEMP: | ||
| 804 | - snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOW_SD_DIR); | 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); | ||
| 105 | } | 93 | } |
| 106 | 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); | ||
| 197 | + } | ||
| 107 | 198 | ||
| 108 | - /* | ||
| 109 | - 两点纠正部分 | ||
| 110 | - */ | ||
| 111 | - //如果开启了低温循环标定 | 199 | + |
| 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 | + } | ||
| 241 | + } | ||
| 242 | + | ||
| 243 | + //***********重新计算两点校正的斜率**************************************/ | ||
| 244 | + JZIrcLib_TPC_Slope_Calculation2(dealInfo); | ||
| 115 | } | 245 | } |
| 116 | - | ||
| 117 | - //如果开启了高温循环标定 | 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 | - | ||
| 123 | - /* | ||
| 124 | - 单点纠正部分 | ||
| 125 | - */ | ||
| 126 | 292 | ||
| 293 | + //两点校正模式 | ||
| 294 | + dealInfo->TPC_LastTPCMode = dealInfo->TPC_mode; | ||
| 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) | 951 | + else if (mode == 1 || mode == 2 || mode == 3 || mode == 4) |
| 815 | { | 952 | { |
| 816 | - JZSDK_LOG_INFO("手动高低温模式"); | ||
| 817 | - if (Last_TpcMode != mode) | ||
| 818 | - { | ||
| 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 | } |
| 1164 | - | 1229 | + IrcDealCfg->Factory_HighT_Mark_Data_flag = JZ_FLAGCODE_OFF; |
| 1165 | 1230 | ||
| 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,33 +346,59 @@ T_JZsdkReturnCode JZIrcLib_TPC(U16_t *ImageData,struct IRC_param *dealInfo) | @@ -550,33 +346,59 @@ 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 | } |
| 562 | - | ||
| 563 | - // 应用两点校正公式 | 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; | ||
| 376 | + | ||
| 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++) | ||
| 387 | + { | ||
| 388 | + if (dealInfo->HighT_NineFrame_Avg[i] != dealInfo->LowT_NineFrame_Avg[i]) | ||
| 568 | { | 389 | { |
| 569 | - ImageData[i] = 0; | 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 | - } | ||
| 576 | - | ||
| 577 | - return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; // 返回校正后的灰度数组 | ||
| 578 | -} | 398 | + } |
| 579 | 399 | ||
| 400 | + return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS; | ||
| 401 | +} | ||
| 580 | 402 | ||
| 581 | 403 | ||
| 582 | /*计算直方图均衡化并转换为8位灰度值 | 404 | /*计算直方图均衡化并转换为8位灰度值 |
| @@ -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 | - } | 96 | +// void dump_frame_to_file(MppCtx ctx, MppApi *mpi, MppFrame frame, FILE *out_fp) |
| 97 | +// { | ||
| 98 | +// printf("decode_and_dump_to_file\n"); | ||
| 99 | + | ||
| 100 | +// MPP_RET ret; | ||
| 101 | + | ||
| 102 | +// if (mpp_frame_get_info_change(frame)) { | ||
| 103 | +// printf("mpp_frame_get_info_change\n"); | ||
| 104 | +// /** | ||
| 105 | +// * 第一次解码会到这个分支,需要为解码器设置缓冲区. | ||
| 106 | +// * 解码器缓冲区支持3种模式。参考【图像内存分配以及交互模式】Rockchip_Developer_Guide_MPP_CN.pdf | ||
| 107 | +// * 这里使用纯内部模式。 | ||
| 108 | +// */ | ||
| 109 | +// ret = mpi->control(ctx, MPP_DEC_SET_INFO_CHANGE_READY, NULL); | ||
| 110 | +// if (ret) { | ||
| 111 | +// printf("mpp_frame_get_info_change mpi->control error" | ||
| 112 | +// "MPP_DEC_SET_INFO_CHANGE_READY %d\n", ret); | ||
| 113 | +// } | ||
| 114 | +// return; | ||
| 115 | +// } | ||
| 116 | + | ||
| 117 | +// RK_U32 err_info = mpp_frame_get_errinfo(frame); | ||
| 118 | +// RK_U32 discard = mpp_frame_get_discard(frame); | ||
| 119 | +// printf("err_info: %u discard: %u\n", err_info, discard); | ||
| 120 | + | ||
| 121 | +// if (err_info) { | ||
| 122 | +// return; | ||
| 123 | +// } | ||
| 124 | 124 | ||
| 125 | - // save | ||
| 126 | - dump_frame(frame, out_fp); | ||
| 127 | - return; | ||
| 128 | -} | 125 | +// // save |
| 126 | +// dump_frame(frame, out_fp); | ||
| 127 | +// return; | ||
| 128 | +// } | ||
| 129 | 129 | ||
| 130 | 130 | ||
| 131 | //rtk解码器初始化 | 131 | //rtk解码器初始化 |
| @@ -298,8 +298,10 @@ T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFram | @@ -298,8 +298,10 @@ T_JZsdkReturnCode RTK_mmp_dec_Init(void **index, MppCodingType int_type, MppFram | ||
| 298 | } | 298 | } |
| 299 | 299 | ||
| 300 | //输出的码流格式 | 300 | //输出的码流格式 |
| 301 | - param = &out_format; | ||
| 302 | - ret = DecConfigInput->mpi->control(DecConfigInput->ctx, MPP_DEC_SET_OUTPUT_FORMAT, param); | 301 | + //param = &out_format; |
| 302 | + //也不知道为什么只能设420sp没法设420p | ||
| 303 | + MppFrameFormat format = out_format; | ||
| 304 | + ret = DecConfigInput->mpi->control(DecConfigInput->ctx, MPP_DEC_SET_OUTPUT_FORMAT, &format); | ||
| 303 | if (ret == MPP_OK) | 305 | if (ret == MPP_OK) |
| 304 | { | 306 | { |
| 305 | printf("输出格式正确\n"); | 307 | printf("输出格式正确\n"); |
| @@ -3,7 +3,7 @@ | @@ -3,7 +3,7 @@ | ||
| 3 | 3 | ||
| 4 | #include "version_choose.h" | 4 | #include "version_choose.h" |
| 5 | 5 | ||
| 6 | -#if RTK_MPP_STATUS == VERSION_SWITCH_ON | 6 | +#ifdef RTK_MPP_STATUS_ON |
| 7 | 7 | ||
| 8 | #include "rockchip/rk_type.h" | 8 | #include "rockchip/rk_type.h" |
| 9 | #include "rockchip/mpp_frame.h" | 9 | #include "rockchip/mpp_frame.h" |
| @@ -5,7 +5,7 @@ | @@ -5,7 +5,7 @@ | ||
| 5 | #include "JZsdkLib.h" | 5 | #include "JZsdkLib.h" |
| 6 | #include "./RTK_mmp_enc.h" | 6 | #include "./RTK_mmp_enc.h" |
| 7 | 7 | ||
| 8 | -#if RTK_MPP_STATUS == VERSION_SWITCH_ON | 8 | +#ifdef RTK_MPP_STATUS_ON |
| 9 | #include "rockchip/mpp_packet.h" | 9 | #include "rockchip/mpp_packet.h" |
| 10 | #include "rockchip/rk_mpi.h" | 10 | #include "rockchip/rk_mpi.h" |
| 11 | #include "rockchip/mpp_env.h" //这个.h能在mpp的源码中找到 | 11 | #include "rockchip/mpp_env.h" //这个.h能在mpp的源码中找到 |
| @@ -3,7 +3,7 @@ | @@ -3,7 +3,7 @@ | ||
| 3 | 3 | ||
| 4 | #include "version_choose.h" | 4 | #include "version_choose.h" |
| 5 | 5 | ||
| 6 | -#if RTK_MPP_STATUS == VERSION_SWITCH_ON | 6 | +#ifdef RTK_MPP_STATUS_ON |
| 7 | 7 | ||
| 8 | #include "rockchip/rk_type.h" | 8 | #include "rockchip/rk_type.h" |
| 9 | #include "rockchip/mpp_frame.h" | 9 | #include "rockchip/mpp_frame.h" |
| @@ -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 | 18 | +*/ |
| 19 | +void *JZsdk_RtkMmpGetEncHandle(int CameraIndex) | ||
| 20 | +{ | ||
| 21 | + return RtkMmpEncHandle[CameraIndex]; | ||
| 26 | } | 22 | } |
| 27 | 23 | ||
| 28 | -//原始视频流通过rtkmmp转为h264 | ||
| 29 | -T_JZsdkReturnCode JZsdk_RTKMMP_RawData_to_h264(unsigned char *RawData, int data_len) | ||
| 30 | -{ | ||
| 31 | -#if RTK_MPP_STATUS == VERSION_SWITCH_ON | ||
| 32 | - MppPacket Packet = NULL; | ||
| 33 | 24 | ||
| 34 | - RTK_mmp_enc_data_to_h264(&Kt_Irc_enc_index, RawData, data_len, &Packet); | ||
| 35 | - | ||
| 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 |
-
请 注册 或 登录 后发表评论