作者 ookk303

10改动

... ... @@ -19,7 +19,7 @@
#define MAJOR_VERSION 0x01
#define MINOR_VERSION 0x03
#define MODIFY_VERSION 0x09
#define DEBUG_VERSION 0x07
#define DEBUG_VERSION 0x06
//禁止修改行 滤波方式
#define FILTERING_TYPE HIGH_PASS_FILTERING
... ...
... ... @@ -45,6 +45,11 @@ typedef struct C1_RgaInfo
static C1_RgaInfo *g_C1_RgaIrcInfo = NULL;
static C1_RgaInfo *g_C1_RgaOptInfo = NULL;
static unsigned char *g_MixedIrc_Buffer = NULL;
static unsigned char *g_MixedOpt_Buffer = NULL;
static unsigned int g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_OFF;
#endif
#ifdef MEDIA_PROC_CONFIG_STATUS_ON
... ... @@ -88,7 +93,7 @@ static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, un
}
//红外相机
if (currentIndex == 1 && CameraIndex == 1)
if (currentIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST && CameraIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST)
{
//推送数据到流转模块
... ... @@ -96,11 +101,19 @@ static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, un
}
//光学相机
if(CameraIndex == 2 && currentIndex == 2)
if(CameraIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND && currentIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND)
{
//推送数据到流转模块
VideoMgmt_Single_FrameIn(data, data_len);
}
//组合视频流
if (currentIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD && CameraIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD)
{
//推送数据到流转模块
VideoMgmt_Single_FrameIn(data, data_len);
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -173,18 +186,17 @@ static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len
memcpy(mpp_buffer_get_ptr(temp), temp_data, size);
free(temp_data);
}
//测试
MppBuffer temp = mpp_frame_get_buffer(yuv_data);
RK_U32 h = mpp_frame_get_hor_stride(yuv_data);
RK_U32 w = mpp_frame_get_ver_stride(yuv_data);
int size = (h * w * 1.5);
unsigned char *temp_data = (unsigned char *)malloc(size);
memcpy(temp_data, mpp_buffer_get_ptr(temp), size);
//将数据放入混合缓冲区
MppBuffer temp = mpp_frame_get_buffer(yuv_data);
if (g_MixedOpt_Buffer != NULL && g_MixedOptBuffer_UseFlag == JZ_FLAGCODE_OFF)
{
g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_ON;
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));
g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_OFF;
}
//将返回的数据输入进编码器
... ... @@ -266,7 +278,9 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len
break;
case 3:
ZoomRatio = 8;
//红外做不了8倍放大咧
ZoomRatio = 4;
//ZoomRatio = 8;
break;
default:
... ... @@ -279,6 +293,12 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len
JZC1_RgaDeal(g_C1_RgaIrcInfo, ZoomRatio, raw_data, &raw_data_len);
}
//将数据放入混合缓冲区
if (g_MixedIrc_Buffer != NULL)
{
memcpy(g_MixedIrc_Buffer, raw_data, raw_data_len);
}
//将原始码流数据写入到编码器 并转换为h264
unsigned char *h264Data = NULL;
unsigned int h264DataLen = 0;
... ... @@ -586,8 +606,6 @@ static T_JZsdkReturnCode JZsdk_JZC1_Irc_Data_Init()
*
* ******************/
static unsigned char *g_MixedIrc_Buffer = NULL;
static unsigned char *g_MixedOpt_Buffer = NULL;
/******************
*
... ... @@ -615,51 +633,102 @@ static void *MixedVideo_Thread(void *args)
//设置间隔时间
long long period = NSEC_PER_SEC / TARGET_FPS;
//混合视频缓冲区
unsigned char * MixedIrc_Buffer = (unsigned char *)malloc((JZ_ALIGN(FIRST_WIDTH, 16)) * (JZ_ALIGN(FIRST_HEIGHT, 16)) * 3 / 2);
unsigned char * MixedOpt_Buffer = (unsigned char *)malloc(JZ_ALIGN(SECOND_WIDTH, 16) * JZ_ALIGN(SECOND_HEIGHT, 16) * 3 / 2);
//初始化混合视频的rga
int Irc_width = JZ_ALIGN(FIRST_WIDTH, 16);
int Irc_height = JZ_ALIGN(FIRST_HEIGHT, 16);
int IRc_Rect_x = 0;
int IRc_Rect_y = 0;
int Irc_Rect_w = JZ_ALIGN(FIRST_WIDTH, 16);
int Irc_Rect_h = JZ_ALIGN(FIRST_HEIGHT, 16);
int Irc_Format = RK_FORMAT_YCbCr_420_SP;
int Opt_width = JZ_ALIGN(SECOND_WIDTH, 16);
int Opt_height = JZ_ALIGN(SECOND_HEIGHT, 16);
int Opt_Rect_x = 0;
int Opt_Rect_y = 0;
int Opt_Rect_w = JZ_ALIGN(SECOND_WIDTH, 16);
int Opt_Rect_h = JZ_ALIGN(SECOND_HEIGHT, 16);
int Opt_Format = RK_FORMAT_YCbCr_420_SP;
/***** 红外图像参数 **********************************************************************************************************/
//红外源图像
im_rect Irc_Rect;
Irc_Rect.x = 0;
Irc_Rect.y = 0;
Irc_Rect.width = JZ_ALIGN(FIRST_WIDTH, 16);
Irc_Rect.height = JZ_ALIGN(FIRST_HEIGHT, 16);
int IRc_Format = RK_FORMAT_YCbCr_420_SP;
//红外放大图像
im_rect Irc_ResizeRect;
Irc_ResizeRect.x = 0;
Irc_ResizeRect.y = 0;
Irc_ResizeRect.width = JZ_ALIGN(FIRST_WIDTH, 16) * 4;
Irc_ResizeRect.height = JZ_ALIGN(FIRST_HEIGHT, 16) * 4;
//红外裁剪区域
im_rect Irc_CropRect;
Irc_CropRect.width = Irc_ResizeRect.width / 4 * 3;
Irc_CropRect.height = Irc_ResizeRect.height / 4 * 3;
Irc_CropRect.x = (Irc_ResizeRect.width - Irc_CropRect.width)/2;
Irc_CropRect.y = (Irc_ResizeRect.height - Irc_CropRect.height)/2;
//红外源图像
RK_RgaImage *Irc_SrcImg = NULL;
RK_Rga_ImageInit(&Irc_SrcImg, Irc_width, Irc_height, Irc_Format, IRc_Rect_x, IRc_Rect_y, Irc_Rect_w, Irc_Rect_h);
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);
//红外放大图像
RK_RgaImage *Irc_ResizeImg = NULL;
RK_Rga_ImageInit(&Irc_ResizeImg, Irc_width*4, Irc_height*4, Irc_Format, IRc_Rect_x, IRc_Rect_y, Irc_Rect_w*4, Irc_Rect_h*4);
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);
//红外裁剪图像
RK_RgaImage *Irc_CropImg = NULL;
RK_Rga_ImageInit(&Irc_CropImg, (Irc_width*4) /4 *3, (Irc_height*4) /4 *3, Irc_Format, (Irc_width*4)/4, (Irc_height*4)/4, (Irc_width*4) /4 *3, (Irc_height*4) /4 *3);
RK_Rga_ImageInit(&Irc_CropImg, Irc_CropRect.width, Irc_CropRect.height, IRc_Format, 0, 0, Irc_CropRect.width, Irc_CropRect.height);
/***** 光学图像参数 **********************************************************************************************************/
//光学源图像
im_rect Opt_Rect;
Opt_Rect.x = 0;
Opt_Rect.y = 0;
Opt_Rect.width = JZ_ALIGN(SECOND_WIDTH, 16);
Opt_Rect.height = JZ_ALIGN(SECOND_HEIGHT, 16);
int Opt_Format = RK_FORMAT_YCbCr_420_SP;
//光学源缩小图像
im_rect Opt_ResizeRect;
Opt_ResizeRect.x = 0;
Opt_ResizeRect.y = 0;
Opt_ResizeRect.width = JZ_ALIGN(SECOND_WIDTH, 16) / 2;
Opt_ResizeRect.height = JZ_ALIGN(SECOND_HEIGHT, 16) / 2;
//光学源图像
RK_RgaImage *Opt_SrcImg = NULL;
RK_Rga_ImageInit(&Opt_SrcImg, Opt_width, Opt_height, Opt_Format, Opt_Rect_x, Opt_Rect_y, Opt_Rect_w, Opt_Rect_h);
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);
//光学的缩小图像
RK_RgaImage *Opt_ResizeImg = NULL;
RK_Rga_ImageInit(&Opt_ResizeImg, Opt_width/2, Opt_height/2, Opt_Format, Opt_Rect_x, Opt_Rect_y, Opt_Rect_w/2, Opt_Rect_h/2);
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);
/***** 目标图像参数 ***************************************************************************************************/
//目标图像的矩形
im_rect Dst_Rect;
Dst_Rect.x = 0;
Dst_Rect.y = 0;
Dst_Rect.width = JZ_ALIGN(SECOND_WIDTH, 16);
Dst_Rect.height = JZ_ALIGN(SECOND_HEIGHT, 16);
int Dst_Format = RK_FORMAT_YCbCr_420_SP;
//目标图像中光学图像的矩形
im_rect Dst_OptRect;
Dst_OptRect.x = Dst_Rect.width / 2;
Dst_OptRect.y = Dst_Rect.height / 4;
Dst_OptRect.width = Opt_ResizeRect.width;
Dst_OptRect.height = Opt_ResizeRect.height;
//目标图像中红外图像的矩形
im_rect Dst_IrcRect;
Dst_IrcRect.x = 0;
Dst_IrcRect.y = (Dst_Rect.height - Irc_CropRect.height) / 2;
Dst_IrcRect.width = Irc_CropRect.width;
Dst_IrcRect.height = Irc_CropRect.height;
//目标图像
RK_RgaImage *DstImg = NULL;
RK_Rga_ImageInit(&DstImg, Irc_width, Irc_height, Irc_Format, IRc_Rect_x, IRc_Rect_y, Irc_Rect_w, Irc_Rect_h);
RK_Rga_ImageInit(&DstImg, Dst_Rect.width, Dst_Rect.height, Dst_Format, Dst_Rect.x, Dst_Rect.y, Dst_Rect.width, Dst_Rect.height);
JZSDK_LOG_DEBUG("Dstimg witdh :%d height:%d DstImg->buf_size:%d", DstImg->width, DstImg->height, DstImg->buf_size);
//空缓冲区
rga_buffer_t EmptyImg = {0};
im_rect EmptyRect = {0};
//开始绘制画面,待优化,如多步骤合成为一个步骤
while (1)
{
//获取当前时间
... ... @@ -672,23 +741,31 @@ static void *MixedVideo_Thread(void *args)
//超过33ms
if (elapsed_time >= period)
{
// while (FrameBuffer_UseFlag == JZ_FLAGCODE_ON)
// {
// delayUs(100);
// }
if (g_MixedIrc_Buffer == NULL || g_MixedOpt_Buffer == NULL)
{
delayMs(100);
continue;
}
while (g_MixedOptBuffer_UseFlag == JZ_FLAGCODE_ON)
{
delayUs(100);
}
//将数据放入缓冲区
memcpy(MixedIrc_Buffer, g_MixedIrc_Buffer, (JZ_ALIGN(FIRST_WIDTH, 16)) * (JZ_ALIGN(FIRST_HEIGHT, 16)) * 3 / 2);
memcpy(MixedOpt_Buffer, g_MixedOpt_Buffer, JZ_ALIGN(SECOND_WIDTH, 16) * JZ_ALIGN(SECOND_HEIGHT, 16) * 3 / 2);
g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_ON;
//填充输出图像
memset(DstImg->buf, 0x80, DstImg->buf_size);
//混合视频处理
memset(MixedIrc_Buffer, 0, sizeof(MixedIrc_Buffer));
memset(MixedOpt_Buffer, 0, sizeof(MixedOpt_Buffer));
memset(Irc_SrcImg->buf, 0, Irc_SrcImg->buf_size);
memset(Opt_SrcImg->buf, 0, Opt_SrcImg->buf_size);
memcpy(MixedIrc_Buffer, g_MixedIrc_Buffer, (JZ_ALIGN(FIRST_WIDTH, 16)) * (JZ_ALIGN(FIRST_HEIGHT, 16)) * 3 / 2);
memcpy(MixedOpt_Buffer, g_MixedOpt_Buffer, JZ_ALIGN(SECOND_WIDTH, 16) * JZ_ALIGN(SECOND_HEIGHT, 16) * 3 / 2);
//将数据放入缓冲区
memcpy(Irc_SrcImg->buf, g_MixedIrc_Buffer, (JZ_ALIGN(FIRST_WIDTH, 16)) * (JZ_ALIGN(FIRST_HEIGHT, 16)) * 3 / 2);
memcpy(Opt_SrcImg->buf, g_MixedOpt_Buffer, JZ_ALIGN(SECOND_WIDTH, 16) * JZ_ALIGN(SECOND_HEIGHT, 16) * 3 / 2);
//FrameBuffer_UseFlag = JZ_FLAGCODE_OFF;
g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_OFF;
//光学数据处理
//缩小图像到1/2
... ... @@ -709,21 +786,55 @@ static void *MixedVideo_Thread(void *args)
}
//裁切红外图像
d_ret = imcrop(Irc_ResizeImg->img, Irc_CropImg->img, Irc_CropImg->rect);
d_ret = imcrop(Irc_ResizeImg->img, Irc_CropImg->img, Irc_CropRect);
if (d_ret != IM_STATUS_SUCCESS)
{
printf("opt crop failed\n");
continue;
}
//以下参考rga_alpha_yuv_demo.cpp
//将缩放好的光学画面放入目标画面
int usage = IM_SYNC | IM_ALPHA_BLEND_DST_OVER | IM_ALPHA_BLEND_PRE_MUL;
// d_ret = improcess()
d_ret = improcess(Opt_ResizeImg->img, DstImg->img, EmptyImg, Opt_ResizeRect, Dst_OptRect, EmptyRect, IM_SYNC);
if (d_ret != IM_STATUS_SUCCESS)
{
printf("opt improcess failed\n");
continue;
}
//将裁切好的红外画面放入目标画面
d_ret = improcess(Irc_CropImg->img, DstImg->img, EmptyImg, Irc_CropImg->rect, Dst_IrcRect, EmptyRect, IM_SYNC);
if (d_ret != IM_STATUS_SUCCESS)
{
printf("irc improcess failed\n");
}
//将原始码流数据写入到编码器 并转换为h264
unsigned char *h264Data = NULL;
unsigned int h264DataLen = 0;
//JZSDK_LOG_DEBUG("DstImg->buf_size:%d", DstImg->buf_size);
#ifdef RTK_MPP_STATUS_ON
MppPacket Packet = NULL;
RTK_mmp_enc_data_to_h264(JZsdk_RtkMmpGetEncHandleAddr(2), DstImg->buf, DstImg->buf_size, &Packet);
h264DataLen = mpp_packet_get_length(Packet);
h264Data = (unsigned char *)mpp_packet_get_pos(Packet);
//EncCfg->Packet_eos = mpp_packet_get_eos(packet);
// printf("获取到编码内容 len:%d\n",packet_len);
//释放掉packet
mpp_packet_deinit(&Packet);
#endif
// prev_time = current_time;
//推送视频流
JZC1_PushFrame(VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD, h264Data, h264DataLen);
//JZSDK_LOG_DEBUG("混合一帧 :%d", h264DataLen);
//更新时间
prev_time = current_time;
}
// 为了防止过于频繁地调用 clock_gettime,可以添加一个小的睡眠时间
... ... @@ -789,6 +900,10 @@ static T_JZsdkReturnCode JZC1_MediaInit()
// RTK_mmp_dec_Init(JZsdk_RtkMmpGetDecHandleAddr(1), MPP_VIDEO_CodingMJPEG, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT);
// RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(1), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT, 30, 15);
//初始化混合视频流的编码器
RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(2), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT, 30, 15);
#endif
//初始化Camera模块
... ... @@ -824,7 +939,7 @@ static T_JZsdkReturnCode JZC1_MediaInit()
//设置默认参数
//默认推送红外摄像头 后续改成 红外+光学 的组合画面
VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST);
VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD);
//设置快门为开
JZsdk_Camera_ShutterSwitch(JZ_FLAGCODE_ON);
... ... @@ -837,6 +952,10 @@ static T_JZsdkReturnCode JZC1_MediaInit()
value = 0;
Camera_param(JZ_FLAGCODE_SET, CAMERA_PIXEL_PSEUDO_COLOR_MODE, &value);
//设置默认打开自动校正
value = JZ_FLAGCODE_ON;
Proc_IRC_param(JZ_FLAGCODE_SET, JZSDK_WIDGET_BAD_PIXEL_CORRECT_MODE, &value);
//初始化变焦模块
Cam_Zoom_Init();
... ... @@ -844,6 +963,9 @@ static T_JZsdkReturnCode JZC1_MediaInit()
#ifdef RTK_RGA_STATUS_ON
ret = JZC1_RgaInit(&g_C1_RgaIrcInfo, JZ_ALIGN(FIRST_WIDTH, 16), JZ_ALIGN(FIRST_HEIGHT, 16), RK_FORMAT_YCbCr_420_SP);
ret = JZC1_RgaInit(&g_C1_RgaOptInfo, JZ_ALIGN(SECOND_WIDTH, 16), JZ_ALIGN(SECOND_HEIGHT, 16), RK_FORMAT_YCbCr_420_SP);
//混合视频初始化
JZC1_MixedVideo_Init();
#endif
#endif
... ... @@ -938,7 +1060,7 @@ static T_JZsdkReturnCode JZC1_RgaDeal(C1_RgaInfo *rga_info, int resize, unsigned
d_ret = imcrop(rga_info->src_img->img, rga_info->corp_img->img, rga_info->corp_img->rect);
if (d_ret != IM_STATUS_SUCCESS)
{
printf("crop failed\n");
printf("crop failed resize:%d\n",resize);
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
... ...
... ... @@ -76,8 +76,8 @@ typedef struct IRC_param
unsigned int TPC_ResetFlag; //tpc校准标志位 开启时进行tpc校准
unsigned int TPC_mode; //tpc模式 0出厂打档 1手动打档
unsigned int TPC_mode; //tpc数据模式 0出厂数据 1手动数据A 2手动数据B 3手动数据C 4手动数据D
unsigned int TPC_LastTPCMode; //上一次tpc数据模式
//画面纠正模式
unsigned int FrameCorrectMode; //画面纠正模式 0 无纠正 1 单点纠正 2 两点纠正
... ... @@ -128,13 +128,27 @@ typedef struct IRC_param
typedef enum TEMP_CHOOSE
{
HIGH_SD_TEMP = 0,
LOW_SD_TEMP = 1,
HIGH_LOCAL_TEMP = 2,
LOW_LOCAL_TEMP = 3,
SPC_MARK_DATA = 4,
HIGH_DGCE_THRESHOLD = 5,
LOW_DGCE_THRESHOLD = 6,
FACTORY_HIGH_TEMP = 10, //出厂高温数据
FACTORY_LOW_TEMP = 11, //出厂低温数据
LOCAL_HIGH_TEMP_1 = 12, //手动高温数据1型
LOCAL_LOW_TEMP_1 = 13, //手动低温数据1型
LOCAL_HIGH_TEMP_2 = 14, //手动高温数据2型
LOCAL_LOW_TEMP_2 = 15, //手动低温数据2型
LOCAL_HIGH_TEMP_3 = 16, //手动高温数据3型
LOCAL_LOW_TEMP_3 = 17, //手动低温数据3型
LOCAL_HIGH_TEMP_4 = 18, //手动高温数据4型
LOCAL_LOW_TEMP_4 = 19, //手动低温数据4型
}TEMP_CHOOSE;
/* Exported types ------------------------------------------------------------*/
... ...
... ... @@ -9,10 +9,21 @@
#include "./IRC_data_deal.h"
#define IRC_FILE_DIR "/root/IRC_File"
#define HIGH_SD_DIR "AvgMarkedHighT.txt"
#define LOW_SD_DIR "AvgMarkedLowT.txt"
#define HIGH_LOCAL_DIR "AvgMarkedHighTLocal.txt"
#define LOW_LOCAL_DIR "AvgMarkedLowTLocal.txt"
#define FACTORY_HIGH_DATA_DIR "AvgMarkedHighT.txt"
#define FACTORY_LOW_DATA_DIR "AvgMarkedLowT.txt"
#define LOCAL_HIGH_SPC_DATA_DIR "AvgMarkedHighTLocal.txt" //沿用之前的
#define LOCAL_LOW_SPC_DATA_DIR "AvgMarkedLowTLocal.txt" //沿用之前的
#define LOCAL_HIGH_SPC_DATA_DIR_2 "AvgMarkedHighTLocal_2.txt"
#define LOCAL_LOW_SPC_DATA_DIR_2 "AvgMarkedLowTLocal_2.txt"
#define LOCAL_HIGH_SPC_DATA_DIR_3 "AvgMarkedHighTLocal_3.txt"
#define LOCAL_LOW_SPC_DATA_DIR_3 "AvgMarkedLowTLocal_3.txt"
#define LOCAL_HIGH_SPC_DATA_DIR_4 "AvgMarkedHighTLocal_4.txt"
#define LOCAL_LOW_SPC_DATA_DIR_4 "AvgMarkedLowTLocal_4.txt"
#define SPC_MARK_DATA_DIR "SPCMarkData.txt"
#define HIGH_THRESHOLD_DIR "/root/highThreshold.txt"
... ... @@ -67,9 +78,6 @@ T_JZsdkReturnCode IRC_LowT_CycleCalibration(U16_t *ImageData,struct IRC_param *d
dealInfo->LowT_NineFrame_Avg[i] = dealInfo->LowT_NineFrameAdd[i] / 9;
}
//存放到本地
IRC_LocalFrame_DataWrite(LOW_LOCAL_TEMP,dealInfo, (U16_t *)dealInfo->LowT_NineFrame_Avg, dealInfo->PixelNum);
dealInfo->LowT_flag = JZ_FLAGCODE_OFF; //将标志位归位
JZSDK_LOG_DEBUG("低温数据记录完成");
... ... @@ -114,7 +122,7 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param
dealInfo->HighT_flag++;
}
JZSDK_LOG_DEBUG("高温标定基准值已存入%d组",dealInfo->LowT_flag - 1);
JZSDK_LOG_DEBUG("高温标定基准值已存入%d组",dealInfo->HighT_flag - 1);
if (dealInfo->HighT_flag > 9) //已经存储了9组数据
{
... ... @@ -123,9 +131,6 @@ T_JZsdkReturnCode IRC_HighT_CycleCalibration(U16_t *ImageData, struct IRC_param
dealInfo->HighT_NineFrame_Avg[i] = dealInfo->HighT_NineFrameAdd[i] / 9;
}
//存放到本地
IRC_LocalFrame_DataWrite(HIGH_LOCAL_TEMP,dealInfo, (U16_t *)dealInfo->HighT_NineFrame_Avg, dealInfo->PixelNum);
dealInfo->HighT_flag = JZ_FLAGCODE_OFF; //将标志位归位
JZSDK_LOG_DEBUG("高温数据记录完成");
... ... @@ -666,19 +671,44 @@ T_JZsdkReturnCode IRC_LocalFrame_DataRead(int flag,struct IRC_param *dealInfo)
switch (flag)
{
case HIGH_SD_TEMP:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, HIGH_SD_DIR);
case FACTORY_HIGH_TEMP:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, FACTORY_HIGH_DATA_DIR);
break;
case LOW_SD_TEMP:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOW_SD_DIR);
case LOCAL_HIGH_TEMP_1:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR);
break;
case LOCAL_HIGH_TEMP_2:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR_2);
break;
case HIGH_LOCAL_TEMP:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, HIGH_LOCAL_DIR);
case LOCAL_HIGH_TEMP_3:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR_3);
break;
case LOW_LOCAL_TEMP:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOW_LOCAL_DIR);
case LOCAL_HIGH_TEMP_4:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR_4);
break;
case FACTORY_LOW_TEMP:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, FACTORY_LOW_DATA_DIR);
break;
case LOCAL_LOW_TEMP_1:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR);
break;
case LOCAL_LOW_TEMP_2:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR_2);
break;
case LOCAL_LOW_TEMP_3:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR_3);
break;
case LOCAL_LOW_TEMP_4:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR_4);
break;
case SPC_MARK_DATA:
... ... @@ -730,24 +760,22 @@ T_JZsdkReturnCode IRC_LocalFrame_DataRead(int flag,struct IRC_param *dealInfo)
switch (flag)
{
case HIGH_SD_TEMP:
memcpy(dealInfo->Factory_HighT_Mark_Data, numbers, count * sizeof(U16_t));
JZSDK_LOG_DEBUG("读取高SD温度数据");
break;
case LOW_SD_TEMP:
memcpy(dealInfo->Factory_LowT_Mark_Data, numbers, count * sizeof(U16_t));
JZSDK_LOG_DEBUG("读取低SD温度数据");
break;
case HIGH_LOCAL_TEMP:
case FACTORY_HIGH_TEMP:
case LOCAL_HIGH_TEMP_1:
case LOCAL_HIGH_TEMP_2:
case LOCAL_HIGH_TEMP_3:
case LOCAL_HIGH_TEMP_4:
memcpy(dealInfo->HighT_NineFrame_Avg, numbers, count * sizeof(U16_t));
JZSDK_LOG_DEBUG("读取高本地温度数据");
JZSDK_LOG_DEBUG("读取高数据");
break;
case LOW_LOCAL_TEMP:
case FACTORY_LOW_TEMP:
case LOCAL_LOW_TEMP_1:
case LOCAL_LOW_TEMP_2:
case LOCAL_LOW_TEMP_3:
case LOCAL_LOW_TEMP_4:
memcpy(dealInfo->LowT_NineFrame_Avg, numbers, count * sizeof(U16_t));
JZSDK_LOG_DEBUG("读取低本地温度数据");
JZSDK_LOG_DEBUG("读取低数据");
break;
case SPC_MARK_DATA:
... ... @@ -800,19 +828,44 @@ T_JZsdkReturnCode IRC_LocalFrame_DataWrite(int flag,struct IRC_param *dealInfo,
switch (flag)
{
case HIGH_SD_TEMP:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, HIGH_SD_DIR);
case FACTORY_HIGH_TEMP:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, FACTORY_HIGH_DATA_DIR);
break;
case LOCAL_HIGH_TEMP_1:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR);
break;
case LOCAL_HIGH_TEMP_2:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR_2);
break;
case LOW_SD_TEMP:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOW_SD_DIR);
case LOCAL_HIGH_TEMP_3:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR_3);
break;
case LOCAL_HIGH_TEMP_4:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_HIGH_SPC_DATA_DIR_4);
break;
case FACTORY_LOW_TEMP:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, FACTORY_LOW_DATA_DIR);
break;
case LOCAL_LOW_TEMP_1:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR);
break;
case LOCAL_LOW_TEMP_2:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR_2);
break;
case HIGH_LOCAL_TEMP:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, HIGH_LOCAL_DIR);
case LOCAL_LOW_TEMP_3:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR_3);
break;
case LOW_LOCAL_TEMP:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOW_LOCAL_DIR);
case LOCAL_LOW_TEMP_4:
snprintf(str, sizeof(str), "%s/%s",IRC_FILE_DIR, LOCAL_LOW_SPC_DATA_DIR_4);
break;
case SPC_MARK_DATA:
... ...
... ... @@ -44,6 +44,8 @@ T_JZsdkReturnCode IRC_ParamInit(int height, int width, int frameRate)
return ret;
}
static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int *rawSize, struct IRC_param *dealInfo)
{
T_JZsdkReturnCode ret;
... ... @@ -91,18 +93,206 @@ static T_JZsdkReturnCode IRC_data_PreliminaryDeal(U16_t *rawData ,unsigned int *
}
/*************************************两点纠正部分******************************************************************/
//判断两点的数据模式是否有改变
//注:该判断默认拥有出厂的数据
if (dealInfo->TPC_mode != dealInfo->TPC_LastTPCMode)
{
/********读取高温数据**********************************************************/
switch (dealInfo->TPC_mode)
{
//读取出厂的高温数据
case 0:
ret = IRC_LocalFrame_DataRead(FACTORY_HIGH_TEMP, dealInfo);
break;
//读取手动数据1
case 1:
ret = IRC_LocalFrame_DataRead(LOCAL_HIGH_TEMP_1, dealInfo);
break;
//读取手动数据2
case 2:
ret = IRC_LocalFrame_DataRead(LOCAL_HIGH_TEMP_2, dealInfo);
break;
//读取手动数据3
case 3:
ret = IRC_LocalFrame_DataRead(LOCAL_HIGH_TEMP_3, dealInfo);
break;
//读取手动数据4
case 4:
ret = IRC_LocalFrame_DataRead(LOCAL_HIGH_TEMP_4, dealInfo);
break;
//其余读取出厂数据
default:
ret = IRC_LocalFrame_DataRead(FACTORY_HIGH_TEMP, dealInfo);
break;
}
//如果读取数据失败,则当场开启录入标志位
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("数据读取失败");
//先填入出厂数据
IRC_LocalFrame_DataRead(FACTORY_HIGH_TEMP, dealInfo);
//且开启数据录入标志位
dealInfo->HighT_flag = JZ_FLAGCODE_ON;
}
/********读取低温数据**********************************************************/
switch (dealInfo->TPC_mode)
{
//读取出厂的低温数据
case 0:
ret = IRC_LocalFrame_DataRead(FACTORY_LOW_TEMP, dealInfo);
break;
//读取手动数据1
case 1:
ret = IRC_LocalFrame_DataRead(LOCAL_LOW_TEMP_1, dealInfo);
break;
//读取手动数据2
case 2:
ret = IRC_LocalFrame_DataRead(LOCAL_LOW_TEMP_2, dealInfo);
break;
//读取手动数据3
case 3:
ret = IRC_LocalFrame_DataRead(LOCAL_LOW_TEMP_3, dealInfo);
break;
//读取手动数据4
case 4:
ret = IRC_LocalFrame_DataRead(LOCAL_LOW_TEMP_4, dealInfo);
break;
//其余读取出厂数据
default:
ret = IRC_LocalFrame_DataRead(FACTORY_LOW_TEMP, dealInfo);
break;
}
//如果读取数据失败,则当场开启录入标志位
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("数据读取失败");
//先填入出厂数据
IRC_LocalFrame_DataRead(FACTORY_LOW_TEMP, dealInfo);
//且开启数据录入标志位
dealInfo->LowT_flag = JZ_FLAGCODE_ON;
}
//***********重新计算两点校正的斜率**************************************/
JZIrcLib_TPC_Slope_Calculation2(dealInfo);
}
//如果开启了低温循环标定,计算低温循环数据
if (dealInfo->LowT_flag != JZ_FLAGCODE_OFF)
{
//将数据写入缓冲区
IRC_LowT_CycleCalibration(rawData, dealInfo);
//数据重新缓存完毕,将缓存保存到本地
if (dealInfo->LowT_flag == JZ_FLAGCODE_OFF)
{
switch (dealInfo->TPC_mode)
{
//写入出厂的低温数据
case 0:
JZSDK_LOG_DEBUG("无法覆盖出厂的低温数据");
break;
//写入手动数据1
case 1:
IRC_LocalFrame_DataWrite(LOCAL_LOW_TEMP_1,dealInfo, dealInfo->LowT_NineFrame_Avg, dealInfo->PixelNum);
break;
//写入手动数据2
case 2:
IRC_LocalFrame_DataWrite(LOCAL_LOW_TEMP_2,dealInfo, dealInfo->LowT_NineFrame_Avg, dealInfo->PixelNum);
break;
//写入手动数据3
case 3:
IRC_LocalFrame_DataWrite(LOCAL_LOW_TEMP_3,dealInfo, dealInfo->LowT_NineFrame_Avg, dealInfo->PixelNum);
break;
//写入手动数据4
case 4:
IRC_LocalFrame_DataWrite(LOCAL_LOW_TEMP_4,dealInfo, dealInfo->LowT_NineFrame_Avg, dealInfo->PixelNum);
break;
default:
JZSDK_LOG_DEBUG("无法覆盖出厂的低温数据");
break;
}
}
//***********重新计算两点校正的斜率**************************************/
JZIrcLib_TPC_Slope_Calculation2(dealInfo);
}
//如果开启了高温循环标定,计算高温循环数据
if (dealInfo->HighT_flag != JZ_FLAGCODE_OFF)
{
//将数据写入缓冲区
IRC_HighT_CycleCalibration(rawData, dealInfo);
//数据重新缓存完毕,将缓存保存到本地
if (dealInfo->HighT_flag == JZ_FLAGCODE_OFF)
{
switch (dealInfo->TPC_mode)
{
//写入出厂的高温数据
case 0:
JZSDK_LOG_DEBUG("无法覆盖出厂的高温数据");
break;
//写入手动数据1
case 1:
IRC_LocalFrame_DataWrite(LOCAL_HIGH_TEMP_1,dealInfo, dealInfo->HighT_NineFrame_Avg, dealInfo->PixelNum);
break;
//写入手动数据2
case 2:
IRC_LocalFrame_DataWrite(LOCAL_HIGH_TEMP_2,dealInfo, dealInfo->HighT_NineFrame_Avg, dealInfo->PixelNum);
break;
//写入手动数据3
case 3:
IRC_LocalFrame_DataWrite(LOCAL_HIGH_TEMP_3,dealInfo, dealInfo->HighT_NineFrame_Avg, dealInfo->PixelNum);
break;
//写入手动数据4
case 4:
IRC_LocalFrame_DataWrite(LOCAL_HIGH_TEMP_4,dealInfo, dealInfo->HighT_NineFrame_Avg, dealInfo->PixelNum);
break;
default:
JZSDK_LOG_DEBUG("无法覆盖出厂的高温数据");
break;
}
}
//***********重新计算两点校正的斜率**************************************/
JZIrcLib_TPC_Slope_Calculation2(dealInfo);
}
//两点校正模式
dealInfo->TPC_LastTPCMode = dealInfo->TPC_mode;
/*************************************单点纠正部分******************************************************************/
//单点校正spc如果未进行过数据的标定,则进行一次
if (dealInfo->FirstSPC_flag == JZ_FLAGCODE_OFF)
... ... @@ -744,7 +934,6 @@ static T_JZsdkReturnCode IRC_Set_SpcTime(int timebase)
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
int Last_TpcMode = 0;
/********************************************
*
* 设置两点纠正模式
... ... @@ -758,28 +947,16 @@ static T_JZsdkReturnCode IRC_Set_TpcMode(int mode)
if (mode == 0)
{
JZSDK_LOG_INFO("出厂高低温模式");
if (Last_TpcMode != mode)
{
//重新读取数据
IRC_LocalFrame_DataRead(HIGH_SD_TEMP, g_IRC_Param);
}
}
else if (mode == 1)
else if (mode == 1 || mode == 2 || mode == 3 || mode == 4)
{
JZSDK_LOG_INFO("手动高低温模式");
if (Last_TpcMode != mode)
{
//重新读取数据
IRC_LocalFrame_DataRead(HIGH_LOCAL_TEMP, g_IRC_Param);
}
JZSDK_LOG_INFO("手动高低温模式 %d", mode);
}
else
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
}
Last_TpcMode = mode;
g_IRC_Param->TPC_mode = mode;
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
... ... @@ -922,73 +1099,6 @@ T_JZsdkReturnCode Proc_IRC_param(int flagcode, enum JZsdk_Widget_Control paramfl
/*
填入高温数据
*/
static T_JZsdkReturnCode IRC_Set_HighTempData(struct IRC_param *dealInfo)
{
T_JZsdkReturnCode ret;
//先尝试 填入录入的数据
ret = IRC_LocalFrame_DataRead(HIGH_SD_TEMP, dealInfo);
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_INFO("外置高温数据录入成功");
dealInfo->Factory_HighT_Mark_Data_flag = JZ_FLAGCODE_ON;
}
//失败了录入 本地数据
ret = IRC_LocalFrame_DataRead(HIGH_LOCAL_TEMP, dealInfo);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("没有本地高温数据数据,打开录入标志");
dealInfo->HighT_flag = JZ_FLAGCODE_ON; //打开录入标志
}
else
{
JZSDK_LOG_INFO("本地高温数据录入成功");
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
/*
填入低温数据
*/
static T_JZsdkReturnCode IRC_Set_LowTempData(struct IRC_param *dealInfo)
{
T_JZsdkReturnCode ret;
//先尝试 填入录入的数据
ret = IRC_LocalFrame_DataRead(LOW_SD_TEMP, dealInfo);
if (ret == JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_INFO("外置低温数据录入成功");
dealInfo->Factory_LowT_Mark_Data_flag = JZ_FLAGCODE_ON;
}
//失败了录入 本地数据
ret = IRC_LocalFrame_DataRead(LOW_LOCAL_TEMP, dealInfo);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("没有本地低温数据数据,打开录入标志");
dealInfo->LowT_flag = JZ_FLAGCODE_ON; //打开录入标志
}
else
{
JZSDK_LOG_INFO("本地低温数据录入成功");
}
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
... ... @@ -1132,11 +1242,14 @@ static T_JZsdkReturnCode IRC_param_Init(struct IRC_param **index, int height, in
*
**********************************************************************************************/
//填入高温数据
IRC_Set_HighTempData(IrcDealCfg);
//填入出厂的高温数据
IRC_LocalFrame_DataRead(FACTORY_HIGH_TEMP, IrcDealCfg);
//填入低温数据
IRC_Set_LowTempData(IrcDealCfg);
IRC_LocalFrame_DataRead(FACTORY_LOW_TEMP, IrcDealCfg);
//计算两点系数***********重新计算两点校正的斜率**************************************/
JZIrcLib_TPC_Slope_Calculation2(IrcDealCfg);
//开启tpc校验标志
IrcDealCfg->TPC_ResetFlag = JZ_FLAGCODE_ON;
... ...
... ... @@ -254,14 +254,9 @@ static T_JZsdkReturnCode JZIrcLib_SPC_Slope_Calculation(struct IRC_param *dealIn
IRC_SPC_ParamCorrect(dealInfo, dealInfo->Factory_LowT_Mark_Data);
}
//采用手动模式的斜率
else if (dealInfo->TPC_mode == 1 && dealInfo->LowT_NineFrame_Avg != NULL)
{
IRC_SPC_ParamCorrect(dealInfo, dealInfo->LowT_NineFrame_Avg);
}
//都不满足的情况下,采用默认的斜率
else
{
IRC_SPC_ParamCorrect(dealInfo, dealInfo->SPC_Mark_Data);
IRC_SPC_ParamCorrect(dealInfo, dealInfo->LowT_NineFrame_Avg);
}
}
//都不满足的情况下,采用默认的斜率
... ... @@ -368,7 +363,7 @@ static T_JZsdkReturnCode JZIrcLib_TPC_Slope_Calculation(struct IRC_param *dealIn
*
*
* *******************/
static T_JZsdkReturnCode JZIrcLib_TPC_Slope_Calculation2(struct IRC_param *dealInfo)
T_JZsdkReturnCode JZIrcLib_TPC_Slope_Calculation2(struct IRC_param *dealInfo)
{
//判断是否存在结构体
if (dealInfo == NULL)
... ... @@ -621,19 +616,12 @@ T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
// 如果打开了两点校正
if (dealInfo->FrameCorrectMode == IRC_CORRCTION_TPC)
{
if (dealInfo->TPC_ResetFlag == JZ_FLAGCODE_ON)
{
//计算两点校正的斜率
JZIrcLib_TPC_Slope_Calculation2(dealInfo);
}
//对数据进行两点校正
ret = JZIrcLib_TPC(u16_CorrentData, dealInfo);
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
JZSDK_LOG_ERROR("两点校正失败");
}
}
U8_t *GrayImage = NULL;
... ...
... ... @@ -16,6 +16,7 @@ extern "C" {
T_JZsdkReturnCode JZIrcLib_DataDeal(U16_t* U16_data, unsigned int U16_dataSize,
U8_t **RGB_data, unsigned int *RGB_dataSize,
struct IRC_param *dealInfo);
T_JZsdkReturnCode JZIrcLib_TPC_Slope_Calculation2(struct IRC_param *dealInfo);
#ifdef __cplusplus
... ...
... ... @@ -55,7 +55,7 @@ T_JZsdkReturnCode Stream_rgb888_to_yuv420p(U8_t *rgb_data, int width, int height
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}
//rgb888 转yuv420sp(NV12)
//rgb888 转yuv420sp MPP_FMT_YUV420SP = (MPP_FRAME_FMT_YUV + 0), /* YYYY... UV... (NV12) */
T_JZsdkReturnCode Stream_rgb888_to_yuv420sp(U8_t *rgb_data, int width, int height, U8_t *yuv_data)
{
// YUV420SP(NV12)格式的大小:Y平面后面跟着一个交织的UV平面
... ... @@ -66,15 +66,16 @@ T_JZsdkReturnCode Stream_rgb888_to_yuv420sp(U8_t *rgb_data, int width, int heigh
U8_t *y_plane = yuv_data;
U8_t *uv_plane = yuv_data + y_size;
// 用于存储每个2x2块的U和V值的临时变量
int u_temp = 0, v_temp = 0;
int u_count = 0, v_count = 0;
// RGB888到YUV420SP的转换
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
// 计算Y分量的索引
int y_idx = j * width + i;
// 计算UV分量的索引(每个第二个像素存储一次)
int uv_idx = (j / 2) * (width / 2) + (i / 2);
// 提取RGB分量
U8_t r = rgb_data[y_idx * 3];
... ... @@ -89,36 +90,15 @@ T_JZsdkReturnCode Stream_rgb888_to_yuv420sp(U8_t *rgb_data, int width, int heigh
// 存储Y分量
y_plane[y_idx] = (U8_t)y;
// 对于U和V分量,我们每4个RGB像素(2x2块)存储一次
if ((i & 1) == 0 && (j & 1) == 0) {
// 初始化临时变量(对于每个2x2块的第一个像素)
u_temp = u;
v_temp = v;
u_count = 0;
v_count = 0;
}
// 更新UV计数器和临时变量(对于2x2块中的每个像素)
u_count++;
v_count++;
// 在2x2块的右下角像素处存储U和V分量
if (u_count == 2 && v_count == 2) {
// 计算UV分量的索引(交织存储)
int uv_idx = ((j / 2) * (width / 2) + (i / 2)) * 2;
// 仅当为每第二个像素时存储U和V分量
if ((i & 1) == 0 && (j & 1) == 0)
{
// 存储U分量
uv_plane[uv_idx] = (U8_t)u_temp;
uv_plane[uv_idx * 2] = (U8_t)u;
// 存储V分量
uv_plane[uv_idx + 1] = (U8_t)v_temp;
// 重置临时变量和计数器(为下一个2x2块做准备)
u_temp = 0;
v_temp = 0;
u_count = 0;
v_count = 0;
uv_plane[uv_idx * 2 + 1] = (U8_t)v;
}
}
}
... ...
... ... @@ -67,6 +67,10 @@ T_JZsdkReturnCode JZsdk_Kt_CamMMPenc_SetNextFrame_IDR(int CameraIndex)
{
RTK_mmp_enc_SetNextFrame_IDR(JZsdk_RtkMmpGetEncHandleAddr(1));
}
else if(CameraIndex == 2)
{
RTK_mmp_enc_SetNextFrame_IDR(JZsdk_RtkMmpGetEncHandleAddr(2));
}
else
{
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
... ...
... ... @@ -741,6 +741,11 @@ static T_JZsdkReturnCode Irc_Widget(unsigned int index, unsigned int value)
{
JZSDK_LOG_DEBUG("切换视频流2");
}
else if (value == 3)
{
JZSDK_LOG_DEBUG("切换视频流3");
}
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_VIDEOPUSH_INDEX, value);
break;
... ... @@ -936,7 +941,19 @@ static T_JZsdkReturnCode Irc_Widget(unsigned int index, unsigned int value)
}
else if (value == 1)
{
printf("手动高低温模式");
printf("手动高低温模式1");
}
else if (value == 2)
{
printf("手动高低温模式2");
}
else if (value == 3)
{
printf("手动高低温模式3");
}
else if (value == 4)
{
printf("手动高低温模式4");
}
JZSDK_WidgetMgMT_ConrtrolInputTask(JZSDK_WIDGET_TPC_MODE, value);
... ...