...
|
...
|
@@ -6,7 +6,6 @@ |
|
|
#include <time.h>
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
|
#include "JZsdkLib.h"
|
|
|
#include "BaseConfig.h"
|
|
|
#include "JZsdk_usb_bulk/JZsdk_usb_bulk.h"
|
...
|
...
|
@@ -18,6 +17,33 @@ |
|
|
#include "MediaProc/MultProc/RTK_mmp/RTK_mmp.h"
|
|
|
#include "MediaProc/MultProc/RTK_mmp/Dec/RTK_mmp_dec.h"
|
|
|
#include "MediaProc/MultProc/RTK_mmp/Enc/RTK_mmp_enc.h"
|
|
|
#include "MediaProc/Camera/Camera.h"
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef RTK_RGA_STATUS_ON
|
|
|
|
|
|
#include "MediaProc/RgaProc/RK_Rga/RK_Rga.h"
|
|
|
|
|
|
//c1的rga结构体
|
|
|
typedef struct C1_RgaInfo
|
|
|
{
|
|
|
//源图像
|
|
|
RK_RgaImage *src_img;
|
|
|
|
|
|
//裁剪图像
|
|
|
RK_RgaImage *corp_img;
|
|
|
|
|
|
//目标图像
|
|
|
RK_RgaImage *dst_img;
|
|
|
|
|
|
//放大倍数
|
|
|
int scale;
|
|
|
|
|
|
}C1_RgaInfo;
|
|
|
|
|
|
static C1_RgaInfo *g_C1_RgaIrcInfo = NULL;
|
|
|
static C1_RgaInfo *g_C1_RgaOptInfo = NULL;
|
|
|
|
|
|
#endif
|
|
|
|
...
|
...
|
@@ -45,6 +71,10 @@ static unsigned char FrameBuffer[FIRST_HEIGHT * FIRST_WIDTH *2]; //用于存储 |
|
|
static unsigned int FrameBufferLen = 0; //用于存储帧数据的长度
|
|
|
static FrameBuffer_UseFlag = JZ_FLAGCODE_OFF;
|
|
|
|
|
|
#ifdef RTK_RGA_STATUS_ON
|
|
|
static T_JZsdkReturnCode JZC1_RgaDeal(C1_RgaInfo *rga_info, int resize, unsigned char *image, unsigned int *imgage_size);
|
|
|
static T_JZsdkReturnCode JZC1_RgaInit(C1_RgaInfo **rgaInfo, int dst_width, int dst_height, int dst_format);
|
|
|
#endif
|
|
|
|
|
|
//数据推送函数
|
|
|
static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, unsigned int data_len)
|
...
|
...
|
@@ -74,12 +104,14 @@ static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, un |
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
|
|
|
static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len)
|
|
|
{
|
|
|
//JZSDK_LOG_INFO("JZC1_OptDeal");
|
|
|
|
|
|
|
|
|
#ifdef RTK_MPP_STATUS_ON
|
|
|
|
|
|
//JZSDK_LOG_INFO("JZC1_OptDeal");
|
|
|
|
|
|
MppFrame yuv_data = NULL; //用于传递yuv数据的地址
|
|
|
MppPacket Packet = NULL;
|
|
|
|
...
|
...
|
@@ -93,6 +125,68 @@ static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len |
|
|
|
|
|
// JZSDK_LOG_INFO("w:%d h:%d hor:%d ver:%d",width,height,h_stride,v_stride);
|
|
|
|
|
|
//光学数据缩放
|
|
|
int resize = JZ_FLAGCODE_OFF;
|
|
|
Camera_param(JZ_FLAGCODE_GET, CAMERA_RESIZE, &resize);
|
|
|
|
|
|
//将size转化为倍数
|
|
|
int ZoomRatio = 0;
|
|
|
switch (resize)
|
|
|
{
|
|
|
case 0:
|
|
|
ZoomRatio = JZ_FLAGCODE_OFF;
|
|
|
break;
|
|
|
|
|
|
case 1:
|
|
|
ZoomRatio = 2;
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
ZoomRatio = 4;
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
ZoomRatio = 8;
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
ZoomRatio = JZ_FLAGCODE_OFF;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
|
|
|
if (ZoomRatio != JZ_FLAGCODE_OFF)
|
|
|
{
|
|
|
|
|
|
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);
|
|
|
|
|
|
JZC1_RgaDeal(g_C1_RgaOptInfo, ZoomRatio, temp_data, &size);
|
|
|
|
|
|
//重新将数据放回
|
|
|
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);
|
|
|
|
|
|
|
|
|
//将返回的数据输入进编码器
|
|
|
RTK_mmp_enc_yuv_to_h264_byFrame(JZsdk_RtkMmpGetEncHandleAddr(1), yuv_data, &Packet);
|
|
|
|
...
|
...
|
@@ -150,6 +244,41 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len |
|
|
//将原始码流数据转换为rgb数据
|
|
|
IRC_FrameDeal(u16Data, u16DataSize, &raw_data, &raw_data_len);
|
|
|
|
|
|
//获取放大的倍数
|
|
|
//光学数据缩放
|
|
|
int resize = JZ_FLAGCODE_OFF;
|
|
|
Camera_param(JZ_FLAGCODE_GET, CAMERA_RESIZE, &resize);
|
|
|
|
|
|
//将size转化为倍数
|
|
|
int ZoomRatio = 0;
|
|
|
switch (resize)
|
|
|
{
|
|
|
case 0:
|
|
|
ZoomRatio = JZ_FLAGCODE_OFF;
|
|
|
break;
|
|
|
|
|
|
case 1:
|
|
|
ZoomRatio = 2;
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
ZoomRatio = 4;
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
ZoomRatio = 8;
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
ZoomRatio = 0;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
if (ZoomRatio != JZ_FLAGCODE_OFF)
|
|
|
{
|
|
|
JZC1_RgaDeal(g_C1_RgaIrcInfo, ZoomRatio, raw_data, &raw_data_len);
|
|
|
}
|
|
|
|
|
|
//将原始码流数据写入到编码器 并转换为h264
|
|
|
unsigned char *h264Data = NULL;
|
|
|
unsigned int h264DataLen = 0;
|
...
|
...
|
@@ -436,6 +565,205 @@ static T_JZsdkReturnCode JZsdk_JZC1_Irc_Data_Init() |
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/********************
|
|
|
*
|
|
|
* 混合视频说明
|
|
|
*
|
|
|
* 1920*1088 做处理 并输出为 1920*1080
|
|
|
* __________________________________________________________________
|
|
|
* |_________________________________ |
|
|
|
* | |________________________________|
|
|
|
* | | |
|
|
|
* | | 1920*1088 /2 960* 544 |
|
|
|
* | | |
|
|
|
* | 320*256 拉伸4到 1280*1024 | |
|
|
|
* | 裁剪出 3/4 到 960 * 768 | |
|
|
|
* | | |
|
|
|
* | |________________________________|
|
|
|
* |_________________________________| |
|
|
|
* |__________________________________________________________________|
|
|
|
*
|
|
|
* ******************/
|
|
|
|
|
|
static unsigned char *g_MixedIrc_Buffer = NULL;
|
|
|
static unsigned char *g_MixedOpt_Buffer = NULL;
|
|
|
|
|
|
/******************
|
|
|
*
|
|
|
* 混合视频处理
|
|
|
*
|
|
|
*
|
|
|
* ********************/
|
|
|
static void JZC1_MixedVideo_Deal()
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
static void *MixedVideo_Thread(void *args)
|
|
|
{
|
|
|
#ifdef RTK_RGA_STATUS_ON
|
|
|
struct timespec now;
|
|
|
int d_ret = 0;
|
|
|
|
|
|
//获取起始时间
|
|
|
struct timespec start_time;
|
|
|
clock_gettime(CLOCK_MONOTONIC, &start_time);
|
|
|
long long prev_time = start_time.tv_sec * NSEC_PER_SEC + start_time.tv_nsec;
|
|
|
|
|
|
//设置间隔时间
|
|
|
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;
|
|
|
|
|
|
//红外源图像
|
|
|
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_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_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_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_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_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);
|
|
|
|
|
|
while (1)
|
|
|
{
|
|
|
//获取当前时间
|
|
|
clock_gettime(CLOCK_MONOTONIC, &now);
|
|
|
long long current_time = now.tv_sec * NSEC_PER_SEC + now.tv_nsec;
|
|
|
|
|
|
//计算时间差
|
|
|
long long elapsed_time = current_time - prev_time;
|
|
|
|
|
|
//超过33ms
|
|
|
if (elapsed_time >= period)
|
|
|
{
|
|
|
// while (FrameBuffer_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);
|
|
|
|
|
|
//混合视频处理
|
|
|
memset(MixedIrc_Buffer, 0, sizeof(MixedIrc_Buffer));
|
|
|
memset(MixedOpt_Buffer, 0, sizeof(MixedOpt_Buffer));
|
|
|
|
|
|
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);
|
|
|
|
|
|
//FrameBuffer_UseFlag = JZ_FLAGCODE_OFF;
|
|
|
|
|
|
//光学数据处理
|
|
|
//缩小图像到1/2
|
|
|
d_ret = imresize(Opt_SrcImg->img, Opt_ResizeImg->img);
|
|
|
if (d_ret != IM_STATUS_SUCCESS)
|
|
|
{
|
|
|
printf("irc resize failed\n");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
//红外数据处理
|
|
|
//放大图像到4倍
|
|
|
d_ret = imresize(Irc_SrcImg->img, Irc_ResizeImg->img);
|
|
|
if (d_ret != IM_STATUS_SUCCESS)
|
|
|
{
|
|
|
printf("opt resize failed\n");
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
//裁切红外图像
|
|
|
d_ret = imcrop(Irc_ResizeImg->img, Irc_CropImg->img, Irc_CropImg->rect);
|
|
|
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()
|
|
|
|
|
|
|
|
|
// prev_time = current_time;
|
|
|
}
|
|
|
|
|
|
// 为了防止过于频繁地调用 clock_gettime,可以添加一个小的睡眠时间
|
|
|
// 例如,休眠1毫秒(100000000纳秒),以减少CPU占用
|
|
|
struct timespec req = { .tv_sec = 0, .tv_nsec = 1000000 };
|
|
|
nanosleep(&req, NULL);
|
|
|
}
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
|
|
|
/******************
|
|
|
*
|
|
|
* 混合视频初始化
|
|
|
*
|
|
|
*
|
|
|
* ********************/
|
|
|
static JZC1_MixedVideo_Init()
|
|
|
{
|
|
|
g_MixedIrc_Buffer = (unsigned char *)malloc(JZ_ALIGN(FIRST_WIDTH, 16)*JZ_ALIGN(FIRST_HEIGHT, 16)*3/2);
|
|
|
g_MixedOpt_Buffer = (unsigned char *)malloc(JZ_ALIGN(SECOND_WIDTH, 16)*JZ_ALIGN(SECOND_HEIGHT, 16)*3/2);
|
|
|
|
|
|
//混合视频初始化
|
|
|
pthread_t Task;
|
|
|
pthread_attr_t attribute; //线程属性
|
|
|
pthread_attr_init(&attribute); //初始化线程属性
|
|
|
pthread_attr_setdetachstate(&attribute, PTHREAD_CREATE_DETACHED); //设置线程分离属性
|
|
|
int bufferdata_Protection = pthread_create(&Task,&attribute,MixedVideo_Thread,NULL); //线程
|
|
|
if(bufferdata_Protection != 0)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("创建混合视频初始化失败!");
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
|
|
|
}
|
|
|
|
|
|
JZSDK_LOG_INFO("MixedVidoe_Init Success");
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
//JZ_C1 的媒体初始化
|
...
|
...
|
@@ -453,11 +781,14 @@ static T_JZsdkReturnCode JZC1_MediaInit() |
|
|
//初始化Mulit模块
|
|
|
#ifdef RTK_MPP_STATUS_ON
|
|
|
//初始化红外的编解码器
|
|
|
RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(0), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420P, FIRST_WIDTH, FIRST_HEIGHT, 30, 5);
|
|
|
RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(0), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, FIRST_WIDTH, FIRST_HEIGHT, 30, 5);
|
|
|
|
|
|
//初始化光学的编解码器
|
|
|
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_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);
|
|
|
#endif
|
|
|
|
|
|
//初始化Camera模块
|
...
|
...
|
@@ -469,6 +800,7 @@ static T_JZsdkReturnCode JZC1_MediaInit() |
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
//光学相机的抓取
|
|
|
ret = JZsdk_FrameCatch_Single(JZC1_OptDeal);
|
|
|
}
|
...
|
...
|
@@ -505,12 +837,132 @@ static T_JZsdkReturnCode JZC1_MediaInit() |
|
|
value = 0;
|
|
|
Camera_param(JZ_FLAGCODE_SET, CAMERA_PIXEL_PSEUDO_COLOR_MODE, &value);
|
|
|
|
|
|
//初始化变焦模块
|
|
|
Cam_Zoom_Init();
|
|
|
|
|
|
//初始化RGA模块
|
|
|
#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);
|
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
#ifdef RTK_RGA_STATUS_ON
|
|
|
|
|
|
static T_JZsdkReturnCode JZC1_RgaInit(C1_RgaInfo **rgaInfo, int dst_width, int dst_height, int dst_format)
|
|
|
{
|
|
|
|
|
|
|
|
|
//初始化rga结构体
|
|
|
(*rgaInfo) = (C1_RgaInfo *)malloc(sizeof(C1_RgaInfo));
|
|
|
if ((*rgaInfo) == NULL)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("RGA初始化失败");
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
|
|
|
}
|
|
|
|
|
|
int width = dst_width;
|
|
|
int height = dst_height;
|
|
|
int rect_x = 0;
|
|
|
int rect_y = 0;
|
|
|
int rect_w = dst_width;
|
|
|
int rect_h = dst_height;
|
|
|
|
|
|
|
|
|
(*rgaInfo)->src_img = NULL;
|
|
|
RK_Rga_ImageInit(&(*rgaInfo)->src_img, width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化输入模块
|
|
|
|
|
|
(*rgaInfo)->corp_img = NULL;
|
|
|
RK_Rga_ImageInit(&(*rgaInfo)->corp_img, width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化裁剪模块
|
|
|
|
|
|
(*rgaInfo)->dst_img = NULL;
|
|
|
RK_Rga_ImageInit(&(*rgaInfo)->dst_img, width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化输出模块
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
//rga处理
|
|
|
#ifdef RTK_RGA_STATUS_ON
|
|
|
static T_JZsdkReturnCode JZC1_RgaDeal(C1_RgaInfo *rga_info, int resize, unsigned char *image, unsigned int *imgage_size)
|
|
|
{
|
|
|
int d_ret;
|
|
|
|
|
|
|
|
|
if (g_C1_RgaIrcInfo == NULL || *imgage_size != rga_info->src_img->buf_size)
|
|
|
{
|
|
|
printf("C1_Rga_Deal failed imagesize:%d bufsize:%d\n", *imgage_size, rga_info->src_img->buf_size);
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
|
|
|
}
|
|
|
|
|
|
//检查裁剪倍数是否改变
|
|
|
if (resize != rga_info->scale)
|
|
|
{
|
|
|
rga_info->scale = resize;
|
|
|
|
|
|
//释放裁剪区域, 并重新注册
|
|
|
if (rga_info->corp_img != NULL)
|
|
|
{
|
|
|
RK_Rga_ImageDeInit(&(rga_info->corp_img));
|
|
|
|
|
|
int width = rga_info->src_img->width / resize;
|
|
|
int height = rga_info->src_img->height / resize;
|
|
|
int rect_x = (rga_info->src_img->width) / 2 - width / 2;
|
|
|
int rect_y = (rga_info->src_img->height) / 2 - height / 2;
|
|
|
int rect_w = width;
|
|
|
int rect_h = height;
|
|
|
int dst_format = rga_info->src_img->format;
|
|
|
|
|
|
RK_Rga_ImageInit(&(rga_info->corp_img), width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化裁剪模块
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//将图像放入处理器
|
|
|
memcpy(rga_info->src_img->buf, image, *imgage_size);
|
|
|
|
|
|
//JZSDK_LOG_DEBUG("裁剪倍率%d",resize);
|
|
|
|
|
|
if (resize == 0)
|
|
|
{
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
//裁剪图像
|
|
|
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");
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
|
|
|
}
|
|
|
|
|
|
//缩放图像
|
|
|
d_ret = imresize(rga_info->corp_img->img, rga_info->dst_img->img);
|
|
|
if (d_ret != IM_STATUS_SUCCESS)
|
|
|
{
|
|
|
printf("resize failed\n");
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
|
|
|
}
|
|
|
|
|
|
//返回图像
|
|
|
memcpy(image, rga_info->dst_img->buf, rga_info->dst_img->buf_size);
|
|
|
//printf("image[0]:%d image[1]:%d\n", image[0], image[1]);
|
|
|
*imgage_size = rga_info->dst_img->buf_size;
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
T_JZsdkReturnCode JZC1_Init()
|
|
|
{
|
...
|
...
|
|