|
|
|
|
|
#include <stdio.h>
|
|
|
#include <stdlib.h>
|
|
|
#include <string.h>
|
|
|
#include <pthread.h>
|
|
|
#include <time.h>
|
|
|
#include <unistd.h>
|
|
|
|
|
|
#include "JZsdkLib.h"
|
|
|
#include "BaseConfig.h"
|
|
|
#include <pthread.h>
|
|
|
#include <stdatomic.h>
|
|
|
#include "JZsdk_usb_bulk/JZsdk_usb_bulk.h"
|
|
|
|
|
|
#include "IRCUT/ircut.h"
|
|
|
|
|
|
|
|
|
#ifdef RTK_MPP_STATUS_ON
|
|
|
#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结构体
|
|
|
#endif
|
|
|
|
|
|
|
|
|
#include "MediaProc/MediaProc.h"
|
|
|
#include "UI_control/UI_control.h"
|
|
|
#include "CommonMod/PowerManger/PowerManger.h"
|
|
|
|
|
|
typedef struct C1_RgaInfo
|
|
|
{
|
|
|
//源图像
|
...
|
...
|
@@ -42,27 +39,57 @@ typedef struct C1_RgaInfo |
|
|
|
|
|
}C1_RgaInfo;
|
|
|
|
|
|
static C1_RgaInfo *g_C1_RgaIrcInfo = NULL;
|
|
|
static C1_RgaInfo *g_C1_RgaOptInfo = NULL;
|
|
|
typedef struct T_JZC1_info
|
|
|
{
|
|
|
/*************************************************************/
|
|
|
//红外相机的编码器信息
|
|
|
T_rtk_mmp_enc_info *IRC_enc_info;
|
|
|
|
|
|
static unsigned char *g_MixedIrc_Buffer = NULL;
|
|
|
//红外相机的rga信息
|
|
|
C1_RgaInfo *IRC_rga_info;
|
|
|
|
|
|
static unsigned char *g_MixedOpt_Buffer = NULL;
|
|
|
static unsigned int g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_OFF;
|
|
|
/*************************************************************/
|
|
|
//光学相机的解码器信息
|
|
|
T_rtk_mmp_dec_info *Opt_dec_info;
|
|
|
|
|
|
//光学相机的编码器信息
|
|
|
T_rtk_mmp_enc_info *Opt_enc_info;
|
|
|
|
|
|
//光学相机的相机信息
|
|
|
JZsdk_CameraInfo *Opt_Camera_info;
|
|
|
|
|
|
C1_RgaInfo *Opt_rga_info;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef MEDIA_PROC_CONFIG_STATUS_ON
|
|
|
/*************************************************************/
|
|
|
//融合相机的编码器信息
|
|
|
T_rtk_mmp_enc_info *Fuse_enc_info;
|
|
|
|
|
|
#include "MediaProc/Camera/Cam_FrameCatch/Cam_FrameCatch.h"
|
|
|
#include "MediaProc/MediaParm.h"
|
|
|
#include "MediaProc/VideoMgmt/VideoStreamPush/VideoStream_Push.h"
|
|
|
#include "MediaProc/VideoMgmt/VideoMgmt.h"
|
|
|
#include "MediaProc/IRC_funtion/IRC_Param.h"
|
|
|
#include "MediaProc/IRC_funtion/IRC_funtion.h"
|
|
|
#include "MediaProc/MediaProc_Param.h"
|
|
|
}T_JZC1_info;
|
|
|
|
|
|
#define JZ_C1_IRC_WIDTH 320
|
|
|
#define JZ_C1_IRC_HEIGHT 256
|
|
|
#define JZ_C1_IRC_FRAMERATE 30
|
|
|
#define JZ_C1_IRC_INDEX VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST
|
|
|
|
|
|
#define JZ_C1_OPT_WIDTH 1920
|
|
|
#define JZ_C1_OPT_HEIGHT 1080
|
|
|
#define JZ_C1_OPT_FRAMERATE 30
|
|
|
#define JZ_C1_OPT_INDEX VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND
|
|
|
#define JZ_C1_OPT_DEV_PATH ("/dev/video21")
|
|
|
#define JZ_C1_OPT_PIXEL V4L2_PIX_FMT_MJPEG
|
|
|
|
|
|
#define JZ_C1_FUSE_WIDTH 1920
|
|
|
#define JZ_C1_FUSE_HEIGHT 1080
|
|
|
#define JZ_C1_FUSE_FRAMERATE 30
|
|
|
#define JZ_C1_FUSE_INDEX VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD
|
|
|
|
|
|
static unsigned char *g_MixedIrc_Buffer = NULL;
|
|
|
static unsigned char *g_MixedOpt_Buffer = NULL;
|
|
|
static unsigned int g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_OFF;
|
|
|
|
|
|
|
|
|
static T_JZC1_info g_JZC1_info;
|
|
|
|
|
|
static void *g_usb_index = NULL;
|
|
|
|
...
|
...
|
@@ -72,15 +99,15 @@ static const unsigned char FRAME_HEADER[FRAME_HEADER_SIZE] = {0xaa, 0xbb, 0xcc, |
|
|
#define NSEC_PER_SEC 1000000000L //1秒的纳秒数
|
|
|
#define TARGET_FPS 30
|
|
|
|
|
|
static unsigned char FrameBuffer[FIRST_HEIGHT * FIRST_WIDTH *2]; //用于存储帧数据的缓冲区
|
|
|
static unsigned char FrameBuffer[JZ_C1_IRC_HEIGHT * JZ_C1_IRC_WIDTH *2]; //用于存储帧数据的缓冲区
|
|
|
static unsigned int FrameBufferLen = 0; //用于存储帧数据的长度
|
|
|
static int 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)
|
|
|
{
|
...
|
...
|
@@ -93,7 +120,7 @@ static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, un |
|
|
}
|
|
|
|
|
|
//红外相机
|
|
|
if (currentIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST && CameraIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_FIRST)
|
|
|
if (currentIndex == JZ_C1_IRC_INDEX && CameraIndex == JZ_C1_IRC_INDEX)
|
|
|
{
|
|
|
|
|
|
//推送数据到流转模块
|
...
|
...
|
@@ -101,14 +128,14 @@ static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, un |
|
|
}
|
|
|
|
|
|
//光学相机
|
|
|
if(CameraIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND && currentIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_SECOND)
|
|
|
if(CameraIndex == JZ_C1_OPT_INDEX && currentIndex == JZ_C1_OPT_INDEX)
|
|
|
{
|
|
|
//推送数据到流转模块
|
|
|
VideoMgmt_Single_FrameIn(data, data_len);
|
|
|
}
|
|
|
|
|
|
//组合视频流
|
|
|
if (currentIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD && CameraIndex == VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD)
|
|
|
if (currentIndex == JZ_C1_FUSE_INDEX && CameraIndex == JZ_C1_FUSE_INDEX)
|
|
|
{
|
|
|
//推送数据到流转模块
|
|
|
VideoMgmt_Single_FrameIn(data, data_len);
|
...
|
...
|
@@ -119,17 +146,13 @@ static T_JZsdkReturnCode JZC1_PushFrame(int CameraIndex, unsigned char* data, un |
|
|
|
|
|
static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len)
|
|
|
{
|
|
|
|
|
|
|
|
|
#ifdef RTK_MPP_STATUS_ON
|
|
|
|
|
|
//JZSDK_LOG_INFO("JZC1_OptDeal");
|
|
|
|
|
|
MppFrame yuv_data = NULL; //用于传递yuv数据的地址
|
|
|
MppPacket Packet = NULL;
|
|
|
|
|
|
//输入数据进入解码器
|
|
|
RTK_mmp_dec_input(JZsdk_RtkMmpGetDecHandleAddr(1), data, data_len, &yuv_data);
|
|
|
RTK_mmp_dec_input(g_JZC1_info.Opt_dec_info, data, data_len, &yuv_data);
|
|
|
|
|
|
// int width = mpp_frame_get_width(yuv_data);
|
|
|
// int height = mpp_frame_get_height(yuv_data);
|
...
|
...
|
@@ -180,7 +203,7 @@ static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len |
|
|
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);
|
|
|
JZC1_RgaDeal(g_JZC1_info.Opt_rga_info, ZoomRatio, temp_data, &size);
|
|
|
|
|
|
//重新将数据放回
|
|
|
memcpy(mpp_buffer_get_ptr(temp), temp_data, size);
|
...
|
...
|
@@ -200,7 +223,7 @@ static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len |
|
|
|
|
|
|
|
|
//将返回的数据输入进编码器
|
|
|
RTK_mmp_enc_yuv_to_h264_byFrame(JZsdk_RtkMmpGetEncHandleAddr(1), yuv_data, &Packet);
|
|
|
RTK_mmp_enc_yuv_to_h264_byFrame(g_JZC1_info.Opt_enc_info, yuv_data, &Packet);
|
|
|
|
|
|
//获取数据指针与长度
|
|
|
int packet_len = mpp_packet_get_length(Packet);
|
...
|
...
|
@@ -211,7 +234,6 @@ static T_JZsdkReturnCode JZC1_OptDeal(unsigned char *data, unsigned int data_len |
|
|
|
|
|
//释放掉编码图像
|
|
|
mpp_packet_deinit(&Packet);
|
|
|
#endif
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
...
|
...
|
@@ -230,7 +252,6 @@ static T_JZsdkReturnCode JZC1_Irc_DataCorrect(unsigned char *data) |
|
|
//在这里将灰度图数据转换成目标数据
|
|
|
static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len)
|
|
|
{
|
|
|
#ifdef IRC_CONFIG_STATUS_ON
|
|
|
//JZSDK_LOG_DEBUG("irc数据处理");
|
|
|
if (data_len == 0)
|
|
|
{
|
...
|
...
|
@@ -291,7 +312,7 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len |
|
|
|
|
|
if (ZoomRatio != JZ_FLAGCODE_OFF)
|
|
|
{
|
|
|
JZC1_RgaDeal(g_C1_RgaIrcInfo, ZoomRatio, raw_data, &raw_data_len);
|
|
|
JZC1_RgaDeal(g_JZC1_info.IRC_rga_info, ZoomRatio, raw_data, &raw_data_len);
|
|
|
}
|
|
|
|
|
|
//将数据放入混合缓冲区
|
...
|
...
|
@@ -304,10 +325,9 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len |
|
|
unsigned char *h264Data = NULL;
|
|
|
unsigned int h264DataLen = 0;
|
|
|
|
|
|
#ifdef RTK_MPP_STATUS_ON
|
|
|
MppPacket Packet = NULL;
|
|
|
|
|
|
RTK_mmp_enc_data_to_h264(JZsdk_RtkMmpGetEncHandleAddr(0), raw_data, raw_data_len, &Packet);
|
|
|
RTK_mmp_enc_data_to_h264(g_JZC1_info.IRC_enc_info, raw_data, raw_data_len, &Packet);
|
|
|
|
|
|
h264DataLen = mpp_packet_get_length(Packet);
|
|
|
h264Data = (unsigned char *)mpp_packet_get_pos(Packet);
|
...
|
...
|
@@ -316,7 +336,6 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len |
|
|
|
|
|
//释放掉packet
|
|
|
mpp_packet_deinit(&Packet);
|
|
|
#endif
|
|
|
|
|
|
//将h264数据推送
|
|
|
JZC1_PushFrame(1, h264Data, h264DataLen);
|
...
|
...
|
@@ -334,11 +353,10 @@ static T_JZsdkReturnCode JZC1_IrcDeal(unsigned char *data, unsigned int data_len |
|
|
u16Data = NULL;
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
|
|
|
static void *JZC1_IrcDataBuffer_Thread(void *args)
|
|
|
{
|
|
|
|
...
|
...
|
@@ -350,12 +368,12 @@ static void *JZC1_IrcDataBuffer_Thread(void *args) |
|
|
long long prev_time = start_time.tv_sec * NSEC_PER_SEC + start_time.tv_nsec;
|
|
|
|
|
|
//设置间隔时间
|
|
|
long long period = NSEC_PER_SEC / TARGET_FPS;
|
|
|
long long period = NSEC_PER_SEC / JZ_C1_IRC_FRAMERATE;
|
|
|
|
|
|
unsigned char *TempBuffer = (unsigned char *)malloc(163840);
|
|
|
unsigned int TempBufferLen = 0;
|
|
|
|
|
|
|
|
|
int num = 0;
|
|
|
|
|
|
while (1)
|
|
|
{
|
...
|
...
|
@@ -386,16 +404,47 @@ static void *JZC1_IrcDataBuffer_Thread(void *args) |
|
|
JZC1_IrcDeal(TempBuffer, TempBufferLen);
|
|
|
|
|
|
prev_time = current_time;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 为了防止过于频繁地调用 clock_gettime,可以添加一个小的睡眠时间
|
|
|
// 例如,休眠1毫秒(100000000纳秒),以减少CPU占用
|
|
|
struct timespec req = { .tv_sec = 0, .tv_nsec = 1000000 };
|
|
|
nanosleep(&req, NULL);
|
|
|
// // 为了防止过于频繁地调用 clock_gettime,可以添加一个小的睡眠时间
|
|
|
// // 例如,休眠1毫秒(100000000纳秒),以减少CPU占用
|
|
|
// struct timespec req = { .tv_sec = 0, .tv_nsec = 1000000 };
|
|
|
// nanosleep(&req, NULL);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// static void *JZC1_IrcDataBuffer_Thread(void *args)
|
|
|
// {
|
|
|
// unsigned char *TempBuffer = (unsigned char *)malloc(163840);
|
|
|
// unsigned int TempBufferLen = 0;
|
|
|
|
|
|
}
|
|
|
// const long long period = NSEC_PER_SEC / TARGET_FPS; // 33,333,333 ns
|
|
|
// struct timespec next;
|
|
|
// clock_gettime(CLOCK_MONOTONIC, &next);
|
|
|
|
|
|
// while(1) {
|
|
|
// // 精确周期控制
|
|
|
// next.tv_nsec += period;
|
|
|
// if (next.tv_nsec >= NSEC_PER_SEC) {
|
|
|
// next.tv_sec++;
|
|
|
// next.tv_nsec -= NSEC_PER_SEC;
|
|
|
// }
|
|
|
|
|
|
// // 无锁化改造
|
|
|
// if(atomic_exchange(&FrameBuffer_UseFlag, JZ_FLAGCODE_ON) == JZ_FLAGCODE_OFF) {
|
|
|
// memcpy(TempBuffer, FrameBuffer, FrameBufferLen); // 零拷贝优化见方案2
|
|
|
// atomic_store(&FrameBuffer_UseFlag, JZ_FLAGCODE_OFF);
|
|
|
|
|
|
// JZC1_IrcDeal(TempBuffer, FrameBufferLen);
|
|
|
|
|
|
// JZSDK_LOG_INFO("deal");
|
|
|
// }
|
|
|
|
|
|
// // 高精度休眠
|
|
|
// clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &next, NULL);
|
|
|
// }
|
|
|
// }
|
|
|
|
|
|
static T_JZsdkReturnCode JZC1_IrcDataSave(unsigned char *data, unsigned int data_len)
|
|
|
{
|
...
|
...
|
@@ -419,7 +468,7 @@ static T_JZsdkReturnCode JZC1_IrcDataSave(unsigned char *data, unsigned int data |
|
|
//红外数据接收线程
|
|
|
static void *JZC1_IrcDataRecv_Thread(void *args)
|
|
|
{
|
|
|
int frame_len = FIRST_WIDTH *2* FIRST_HEIGHT; //163840
|
|
|
int frame_len = g_JZC1_info.IRC_enc_info->width * g_JZC1_info.IRC_enc_info->height *2; //163840
|
|
|
unsigned char buf[frame_len]; //usb数据缓冲区需要为512的倍数
|
|
|
unsigned char frameData[frame_len]; // 存储整帧数据的画面缓冲区
|
|
|
unsigned int lineNum = 0;
|
...
|
...
|
@@ -547,14 +596,13 @@ static void *JZC1_IrcDataRecv_Thread(void *args) |
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//C1 红外相机数据的初始化
|
|
|
static T_JZsdkReturnCode JZsdk_JZC1_Irc_Data_Init()
|
|
|
{
|
|
|
T_JZsdkReturnCode ret;
|
|
|
|
|
|
//初始化接收的usb口
|
|
|
ret = JZsdk_HalUsbBulk_Init(&g_usb_index, 0, 0, LINUX_USB_PID, LINUX_USB_VID, USB_IN_POINT, USB_OUT_POINT);
|
|
|
ret = JZsdk_HalUsbBulk_Init(&g_usb_index, 0, 0, JZSDK_USB_PID, JZSDK_USB_VID, USB_IN_POINT, USB_OUT_POINT);
|
|
|
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
{
|
|
|
return ret;
|
...
|
...
|
@@ -584,44 +632,68 @@ static T_JZsdkReturnCode JZsdk_JZC1_Irc_Data_Init() |
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
|
|
|
}
|
|
|
|
|
|
JZSDK_LOG_INFO("JZsdk_JZC1_Irc_Data_Init sucess");
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
|
|
|
// /********************
|
|
|
// *
|
|
|
// * 混合视频说明
|
|
|
// *
|
|
|
// * 1920*1088 做处理 并输出为 1920*1080
|
|
|
// * __________________________________________________________________
|
|
|
// * |_________________________________ |
|
|
|
// * | |________________________________|
|
|
|
// * | | |
|
|
|
// * | | 1920*1088 /2 960* 544 |
|
|
|
// * | | |
|
|
|
// * | 320*256 拉伸4到 1280*1024 | |
|
|
|
// * | 裁剪出 3/4 到 960 * 768 | |
|
|
|
// * | | |
|
|
|
// * | |________________________________|
|
|
|
// * |_________________________________| |
|
|
|
// * |__________________________________________________________________|
|
|
|
// *
|
|
|
// * ******************/
|
|
|
|
|
|
|
|
|
static T_JZsdkReturnCode JZC1_RgaInit(C1_RgaInfo *rgaInfo, int dst_width, int dst_height, int dst_format)
|
|
|
{
|
|
|
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;
|
|
|
|
|
|
/********************
|
|
|
*
|
|
|
* 混合视频说明
|
|
|
*
|
|
|
* 1920*1088 做处理 并输出为 1920*1080
|
|
|
* __________________________________________________________________
|
|
|
* |_________________________________ |
|
|
|
* | |________________________________|
|
|
|
* | | |
|
|
|
* | | 1920*1088 /2 960* 544 |
|
|
|
* | | |
|
|
|
* | 320*256 拉伸4到 1280*1024 | |
|
|
|
* | 裁剪出 3/4 到 960 * 768 | |
|
|
|
* | | |
|
|
|
* | |________________________________|
|
|
|
* |_________________________________| |
|
|
|
* |__________________________________________________________________|
|
|
|
*
|
|
|
* ******************/
|
|
|
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); //初始化裁剪模块
|
|
|
|
|
|
/******************
|
|
|
*
|
|
|
* 混合视频处理
|
|
|
*
|
|
|
*
|
|
|
* ********************/
|
|
|
static void JZC1_MixedVideo_Deal()
|
|
|
{
|
|
|
rgaInfo->dst_img = NULL;
|
|
|
RK_Rga_ImageInit(&(rgaInfo->dst_img), width, height, dst_format, rect_x, rect_y, rect_w, rect_h); //初始化输出模块
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
|
|
|
// /******************
|
|
|
// *
|
|
|
// * 混合视频处理
|
|
|
// *
|
|
|
// *
|
|
|
// * ********************/
|
|
|
// static void JZC1_MixedVideo_Deal()
|
|
|
// {
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
static void *MixedVideo_Thread(void *args)
|
|
|
{
|
|
|
#ifdef RTK_RGA_STATUS_ON
|
...
|
...
|
@@ -642,16 +714,16 @@ static void *MixedVideo_Thread(void *args) |
|
|
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);
|
|
|
Irc_Rect.width = g_JZC1_info.IRC_enc_info->hor_stride;
|
|
|
Irc_Rect.height = g_JZC1_info.IRC_enc_info->ver_stride;
|
|
|
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;
|
|
|
Irc_ResizeRect.width = g_JZC1_info.IRC_enc_info->hor_stride * 4;
|
|
|
Irc_ResizeRect.height = g_JZC1_info.IRC_enc_info->ver_stride * 4;
|
|
|
|
|
|
//红外裁剪区域
|
|
|
im_rect Irc_CropRect;
|
...
|
...
|
@@ -678,16 +750,16 @@ static void *MixedVideo_Thread(void *args) |
|
|
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);
|
|
|
Opt_Rect.width = g_JZC1_info.Opt_enc_info->hor_stride;
|
|
|
Opt_Rect.height = g_JZC1_info.Opt_enc_info->ver_stride;
|
|
|
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;
|
|
|
Opt_ResizeRect.width = g_JZC1_info.Opt_enc_info->hor_stride / 2;
|
|
|
Opt_ResizeRect.height = g_JZC1_info.Opt_enc_info->ver_stride / 2;
|
|
|
|
|
|
//光学源图像
|
|
|
RK_RgaImage *Opt_SrcImg = NULL;
|
...
|
...
|
@@ -704,8 +776,8 @@ static void *MixedVideo_Thread(void *args) |
|
|
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);
|
|
|
Dst_Rect.width = g_JZC1_info.Opt_enc_info->hor_stride;
|
|
|
Dst_Rect.height = g_JZC1_info.Opt_enc_info->ver_stride;
|
|
|
int Dst_Format = RK_FORMAT_YCbCr_420_SP;
|
|
|
|
|
|
//目标图像中光学图像的矩形
|
...
|
...
|
@@ -765,8 +837,8 @@ static void *MixedVideo_Thread(void *args) |
|
|
memset(Opt_SrcImg->buf, 0, Opt_SrcImg->buf_size);
|
|
|
|
|
|
//将数据放入缓冲区
|
|
|
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);
|
|
|
memcpy(Irc_SrcImg->buf, g_MixedIrc_Buffer, (g_JZC1_info.IRC_enc_info->hor_stride) * (g_JZC1_info.IRC_enc_info->ver_stride) * 3 / 2);
|
|
|
memcpy(Opt_SrcImg->buf, g_MixedOpt_Buffer, g_JZC1_info.Opt_enc_info->hor_stride * g_JZC1_info.Opt_enc_info->ver_stride * 3 / 2);
|
|
|
|
|
|
g_MixedOptBuffer_UseFlag = JZ_FLAGCODE_OFF;
|
|
|
|
...
|
...
|
@@ -817,10 +889,9 @@ static void *MixedVideo_Thread(void *args) |
|
|
|
|
|
//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);
|
|
|
RTK_mmp_enc_data_to_h264(g_JZC1_info.Fuse_enc_info, DstImg->buf, DstImg->buf_size, &Packet);
|
|
|
|
|
|
h264DataLen = mpp_packet_get_length(Packet);
|
|
|
h264Data = (unsigned char *)mpp_packet_get_pos(Packet);
|
...
|
...
|
@@ -829,7 +900,6 @@ static void *MixedVideo_Thread(void *args) |
|
|
|
|
|
//释放掉packet
|
|
|
mpp_packet_deinit(&Packet);
|
|
|
#endif
|
|
|
|
|
|
//推送视频流
|
|
|
JZC1_PushFrame(VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD, h264Data, h264DataLen);
|
...
|
...
|
@@ -858,8 +928,9 @@ static void *MixedVideo_Thread(void *args) |
|
|
static T_JZsdkReturnCode JZC1_MixedVideo_Init()
|
|
|
{
|
|
|
#ifdef IRC_CONFIG_STATUS_ON
|
|
|
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);
|
|
|
|
|
|
g_MixedIrc_Buffer = (unsigned char *)malloc(g_JZC1_info.IRC_enc_info->hor_stride * g_JZC1_info.IRC_enc_info->ver_stride * 3/2);
|
|
|
g_MixedOpt_Buffer = (unsigned char *)malloc(g_JZC1_info.Opt_enc_info->hor_stride * g_JZC1_info.Opt_enc_info->ver_stride * 3/2);
|
|
|
|
|
|
//混合视频初始化
|
|
|
pthread_t Task;
|
...
|
...
|
@@ -880,150 +951,13 @@ static T_JZsdkReturnCode JZC1_MixedVideo_Init() |
|
|
}
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
//JZ_C1 的媒体初始化
|
|
|
static T_JZsdkReturnCode JZC1_MediaInit()
|
|
|
{
|
|
|
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
|
|
|
|
|
|
//初始化媒体模块
|
|
|
#ifdef MEDIA_PROC_CONFIG_STATUS_ON
|
|
|
|
|
|
//初始化videoMgmt模块
|
|
|
VideoMgmt_Init();
|
|
|
|
|
|
//初始化Mulit模块
|
|
|
#ifdef RTK_MPP_STATUS_ON
|
|
|
//初始化红外的编解码器
|
|
|
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);
|
|
|
|
|
|
//初始化混合视频流的编码器
|
|
|
RTK_mmp_enc_Init(JZsdk_RtkMmpGetEncHandleAddr(2), MPP_VIDEO_CodingAVC, MPP_FMT_YUV420SP, SECOND_WIDTH, SECOND_HEIGHT, 30, 15);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
//初始化Camera模块
|
|
|
int CameraFd = -1;
|
|
|
ret = V4l2_Camarainit2(&CameraFd, SECOND_WIDTH, SECOND_HEIGHT, 30);
|
|
|
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("光学相机启动失败");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
|
|
|
//光学相机的抓取
|
|
|
ret = JZsdk_FrameCatch_Single(JZC1_OptDeal);
|
|
|
}
|
|
|
|
|
|
//初始化IRC_funtion模块
|
|
|
ret = IRC_ParamInit(FIRST_HEIGHT, FIRST_WIDTH, 25);
|
|
|
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("初始化红外的数据处理失败");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//初始化红外的数据输入
|
|
|
ret = JZsdk_JZC1_Irc_Data_Init();
|
|
|
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("红外相机初始化失败");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//设置默认参数
|
|
|
|
|
|
//默认推送红外摄像头 后续改成 红外+光学 的组合画面
|
|
|
VideoMgmt_VideoStreamFlowIndex(VIDEOMGMT_STREAMING_FLOW_INDEX_THIRD);
|
|
|
|
|
|
//设置快门为开
|
|
|
JZsdk_Camera_ShutterSwitch(JZ_FLAGCODE_ON);
|
|
|
|
|
|
//设置伪彩颜色为hot
|
|
|
int value = 8;
|
|
|
Camera_param(JZ_FLAGCODE_SET, CAMERA_PSEUDO_COLOR, &value);
|
|
|
|
|
|
//设置为默认输出模式
|
|
|
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();
|
|
|
|
|
|
//初始化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);
|
|
|
|
|
|
//混合视频初始化
|
|
|
JZC1_MixedVideo_Init();
|
|
|
#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)
|
|
|
if (g_JZC1_info.IRC_rga_info == 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;
|
...
|
...
|
@@ -1089,33 +1023,306 @@ static T_JZsdkReturnCode JZC1_RgaDeal(C1_RgaInfo *rga_info, int resize, unsigned |
|
|
|
|
|
}
|
|
|
|
|
|
T_JZsdkReturnCode JZC1_SetNextFrame_IDR(unsigned int index)
|
|
|
{
|
|
|
if (index == JZ_C1_IRC_INDEX)
|
|
|
{
|
|
|
RTK_mmp_enc_SetNextFrame_IDR(g_JZC1_info.IRC_enc_info);
|
|
|
}
|
|
|
else if (index == JZ_C1_OPT_INDEX)
|
|
|
{
|
|
|
RTK_mmp_enc_SetNextFrame_IDR(g_JZC1_info.Opt_enc_info);
|
|
|
}
|
|
|
else if (index == JZ_C1_FUSE_INDEX)
|
|
|
{
|
|
|
RTK_mmp_enc_SetNextFrame_IDR(g_JZC1_info.Fuse_enc_info);
|
|
|
}
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
T_JZsdkReturnCode JZC1_Init()
|
|
|
|
|
|
static int save_int_to_file(const char* filename, int value)
|
|
|
{
|
|
|
T_JZsdkReturnCode ret;
|
|
|
FILE* file = fopen(filename, "wb");
|
|
|
if (!file) {
|
|
|
perror("fopen failed");
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
//初始化引脚
|
|
|
Ircut_Init();
|
|
|
size_t written = fwrite(&value, sizeof(int), 1, file);
|
|
|
fclose(file);
|
|
|
|
|
|
//初始化媒体模块
|
|
|
ret = JZC1_MediaInit();
|
|
|
if (written != 1) {
|
|
|
fprintf(stderr, "Failed to write integer\n");
|
|
|
return -1;
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
JZSDK_LOG_INFO("JZ_C1 INIT COMPLETED\n");
|
|
|
static int read_int_from_file(const char* filename) {
|
|
|
FILE* file = fopen(filename, "rb");
|
|
|
if (!file) {
|
|
|
perror("fopen failed");
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
int value = 0;
|
|
|
size_t read = fread(&value, sizeof(int), 1, file);
|
|
|
fclose(file);
|
|
|
|
|
|
if (read != 1) {
|
|
|
fprintf(stderr, "Failed to read integer\n");
|
|
|
return 0;
|
|
|
}
|
|
|
return value;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
T_JZsdkReturnCode JZC1_PowerOff_Save()
|
|
|
{
|
|
|
|
|
|
JZSDK_LOG_INFO("开始关机保存");
|
|
|
|
|
|
JZsdk_Osal_Mkdir("/root/ValueSave");
|
|
|
|
|
|
//获取校正类型
|
|
|
int correction_type;
|
|
|
Camera_param(JZ_FLAGCODE_GET, CAMERA_CORRCTION_MODE, &correction_type);
|
|
|
//保存
|
|
|
save_int_to_file("/root/ValueSave/correction_type", correction_type);
|
|
|
JZSDK_LOG_INFO("已存储校正类型:%d", correction_type);
|
|
|
|
|
|
//保存单点校正模式
|
|
|
int single_point_correction_mode;
|
|
|
Proc_IRC_param(JZ_FLAGCODE_GET, JZSDK_WIDGET_SPC_MODE, &single_point_correction_mode);
|
|
|
//保存
|
|
|
save_int_to_file("/root/ValueSave/single_point_correction_mode", single_point_correction_mode);
|
|
|
JZSDK_LOG_INFO("已存储单点校正模式:%d", single_point_correction_mode);
|
|
|
|
|
|
//保存两点校正模式
|
|
|
int double_point_correction_mode;
|
|
|
Proc_IRC_param(JZ_FLAGCODE_GET, JZSDK_WIDGET_TPC_MODE, &double_point_correction_mode);
|
|
|
//保存
|
|
|
save_int_to_file("/root/ValueSave/double_point_correction_mode", double_point_correction_mode);
|
|
|
JZSDK_LOG_INFO("已存储两点校正模式:%d", double_point_correction_mode);
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
static T_JZsdkReturnCode JZC1_PowerOn_Read()
|
|
|
{
|
|
|
//读取校正类型
|
|
|
int correction_type = read_int_from_file("/root/ValueSave/correction_type");
|
|
|
//设置校正类型
|
|
|
UIcontrol_CameraCorrectionMode(NO_SPECIFIED ,correction_type);
|
|
|
|
|
|
//读取单点校正模式
|
|
|
int single_point_correction_mode = read_int_from_file("/root/ValueSave/single_point_correction_mode");
|
|
|
//设置单点校正模式
|
|
|
UIcontrol_Set_SPCmode(NO_SPECIFIED, single_point_correction_mode);
|
|
|
|
|
|
//读取两点校正模式
|
|
|
int double_point_correction_mode = read_int_from_file("/root/ValueSave/double_point_correction_mode");
|
|
|
//设置两点校正模式
|
|
|
UIcontrol_Set_TpcMode(NO_SPECIFIED, double_point_correction_mode);
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
}
|
|
|
|
|
|
//c1的实际初始化函数
|
|
|
T_JZsdkReturnCode JZC1_Init(int mode)
|
|
|
{
|
|
|
//网口初始化
|
|
|
if (mode == APP_UART)
|
|
|
{
|
|
|
//网口初始化
|
|
|
JZsdk_NetWork_Init();
|
|
|
}
|
|
|
|
|
|
|
|
|
#ifdef RTK_MPP_STATUS_ON
|
|
|
|
|
|
T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
|
|
|
T_JZsdkVideoMgmtHandler VideoMgmtHandler = {
|
|
|
.SetNextFrame_IDR = JZC1_SetNextFrame_IDR,
|
|
|
};
|
|
|
VideoMgmt_Init(VideoMgmtHandler);
|
|
|
|
|
|
//初始化红外的编码器
|
|
|
g_JZC1_info.IRC_enc_info = (T_rtk_mmp_enc_info *)malloc(sizeof(T_rtk_mmp_enc_info));
|
|
|
if (g_JZC1_info.IRC_enc_info == NULL)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("malloc enc_info failed");
|
|
|
}
|
|
|
|
|
|
g_JZC1_info.IRC_enc_info->Input_fmt = MPP_FMT_YUV420SP;
|
|
|
g_JZC1_info.IRC_enc_info->encType = MPP_VIDEO_CodingAVC;
|
|
|
g_JZC1_info.IRC_enc_info->width = JZ_C1_IRC_WIDTH;
|
|
|
g_JZC1_info.IRC_enc_info->height = JZ_C1_IRC_HEIGHT;
|
|
|
g_JZC1_info.IRC_enc_info->FrameNum = JZ_C1_IRC_FRAMERATE;
|
|
|
g_JZC1_info.IRC_enc_info->IDR_gop = 5;
|
|
|
|
|
|
g_JZC1_info.IRC_enc_info->hor_stride = JZ_ALIGN(g_JZC1_info.IRC_enc_info->width, 16);
|
|
|
g_JZC1_info.IRC_enc_info->ver_stride = JZ_ALIGN(g_JZC1_info.IRC_enc_info->height, 16);
|
|
|
|
|
|
RTK_mmp_enc_Init(g_JZC1_info.IRC_enc_info);
|
|
|
|
|
|
//初始化光学摄像头的解码器
|
|
|
g_JZC1_info.Opt_dec_info = (T_rtk_mmp_dec_info *)malloc(sizeof(T_rtk_mmp_dec_info));
|
|
|
if (g_JZC1_info.Opt_dec_info == NULL)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("malloc dec_info failed");
|
|
|
}
|
|
|
|
|
|
g_JZC1_info.Opt_dec_info->Dec_type = MPP_VIDEO_CodingMJPEG;
|
|
|
g_JZC1_info.Opt_dec_info->out_format = MPP_FMT_YUV420SP;
|
|
|
g_JZC1_info.Opt_dec_info->width = JZ_C1_OPT_WIDTH;
|
|
|
g_JZC1_info.Opt_dec_info->height = JZ_C1_OPT_HEIGHT;
|
|
|
|
|
|
g_JZC1_info.Opt_dec_info->hor_stride = JZ_ALIGN(g_JZC1_info.Opt_dec_info->width, 16);
|
|
|
g_JZC1_info.Opt_dec_info->ver_stride = JZ_ALIGN(g_JZC1_info.Opt_dec_info->height, 16);
|
|
|
|
|
|
RTK_mmp_dec_Init(g_JZC1_info.Opt_dec_info);
|
|
|
|
|
|
//初始化光学的编码器
|
|
|
g_JZC1_info.Opt_enc_info = (T_rtk_mmp_enc_info *)malloc(sizeof(T_rtk_mmp_enc_info));
|
|
|
if (g_JZC1_info.Opt_enc_info == NULL)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("malloc enc_info failed");
|
|
|
}
|
|
|
|
|
|
g_JZC1_info.Opt_enc_info->Input_fmt = MPP_FMT_YUV420SP;
|
|
|
g_JZC1_info.Opt_enc_info->encType = MPP_VIDEO_CodingAVC;
|
|
|
g_JZC1_info.Opt_enc_info->width = JZ_C1_OPT_WIDTH;
|
|
|
g_JZC1_info.Opt_enc_info->height = JZ_C1_OPT_HEIGHT;
|
|
|
g_JZC1_info.Opt_enc_info->FrameNum = JZ_C1_OPT_FRAMERATE;
|
|
|
g_JZC1_info.Opt_enc_info->IDR_gop = 15;
|
|
|
|
|
|
g_JZC1_info.Opt_enc_info->hor_stride = JZ_ALIGN(g_JZC1_info.Opt_enc_info->width, 16);
|
|
|
g_JZC1_info.Opt_enc_info->ver_stride = JZ_ALIGN(g_JZC1_info.Opt_enc_info->height, 16);
|
|
|
|
|
|
RTK_mmp_enc_Init(g_JZC1_info.Opt_enc_info);
|
|
|
|
|
|
//初始化融合的编码器
|
|
|
g_JZC1_info.Fuse_enc_info = (T_rtk_mmp_enc_info *)malloc(sizeof(T_rtk_mmp_enc_info));
|
|
|
if (g_JZC1_info.Fuse_enc_info == NULL)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("malloc enc_info failed");
|
|
|
}
|
|
|
|
|
|
g_JZC1_info.Fuse_enc_info->Input_fmt = MPP_FMT_YUV420SP;
|
|
|
g_JZC1_info.Fuse_enc_info->encType = MPP_VIDEO_CodingAVC;
|
|
|
g_JZC1_info.Fuse_enc_info->width = JZ_C1_FUSE_WIDTH;
|
|
|
g_JZC1_info.Fuse_enc_info->height = JZ_C1_FUSE_HEIGHT;
|
|
|
g_JZC1_info.Fuse_enc_info->FrameNum = JZ_C1_FUSE_FRAMERATE;
|
|
|
g_JZC1_info.Fuse_enc_info->IDR_gop = 15;
|
|
|
|
|
|
g_JZC1_info.Fuse_enc_info->hor_stride = JZ_ALIGN(g_JZC1_info.Fuse_enc_info->width, 16);
|
|
|
g_JZC1_info.Fuse_enc_info->ver_stride = JZ_ALIGN(g_JZC1_info.Fuse_enc_info->height, 16);
|
|
|
|
|
|
RTK_mmp_enc_Init(g_JZC1_info.Fuse_enc_info);
|
|
|
|
|
|
//初始化光学相机
|
|
|
g_JZC1_info.Opt_Camera_info = (JZsdk_CameraInfo *)malloc(sizeof(JZsdk_CameraInfo));
|
|
|
if (g_JZC1_info.Opt_Camera_info == NULL)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("malloc camera_info failed");
|
|
|
}
|
|
|
|
|
|
g_JZC1_info.Opt_Camera_info->width = JZ_C1_OPT_WIDTH;
|
|
|
g_JZC1_info.Opt_Camera_info->height = JZ_C1_OPT_HEIGHT;
|
|
|
g_JZC1_info.Opt_Camera_info->FrameNum = JZ_C1_OPT_FRAMERATE;
|
|
|
g_JZC1_info.Opt_Camera_info->CameraFormat = JZ_C1_OPT_PIXEL;
|
|
|
g_JZC1_info.Opt_Camera_info->ThreadMode = JZSDK_SINGLE_THREAD;
|
|
|
memset(&(g_JZC1_info.Opt_Camera_info->CameraParam), 0, sizeof(JZsdk_CameraParam));
|
|
|
memset(g_JZC1_info.Opt_Camera_info->CmeraDevPath, 0, sizeof(g_JZC1_info.Opt_Camera_info->CmeraDevPath));
|
|
|
memcpy(g_JZC1_info.Opt_Camera_info->CmeraDevPath, JZ_C1_OPT_DEV_PATH, strlen(JZ_C1_OPT_DEV_PATH));
|
|
|
g_JZC1_info.Opt_Camera_info->SingleDataOutput = JZC1_OptDeal;
|
|
|
|
|
|
|
|
|
ret = Camera_Init(g_JZC1_info.Opt_Camera_info);
|
|
|
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("光学相机启动失败");
|
|
|
}
|
|
|
|
|
|
//初始化IRC_funtion模块
|
|
|
ret = IRC_ParamInit(JZ_C1_IRC_HEIGHT, JZ_C1_IRC_WIDTH, 25);
|
|
|
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("初始化红外的数据处理失败");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//初始化红外的数据输入
|
|
|
ret = JZsdk_JZC1_Irc_Data_Init();
|
|
|
if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("红外相机初始化失败");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//默认推送红外摄像头 后续改成 红外+光学 的组合画面
|
|
|
VideoMgmt_VideoStreamFlowIndex(JZ_C1_FUSE_INDEX);
|
|
|
|
|
|
//设置快门为开
|
|
|
JZsdk_Camera_ShutterSwitch(JZ_FLAGCODE_ON);
|
|
|
|
|
|
//设置伪彩颜色为hot
|
|
|
int value = 8;
|
|
|
Camera_param(JZ_FLAGCODE_SET, CAMERA_PSEUDO_COLOR, &value);
|
|
|
|
|
|
//设置为默认输出模式
|
|
|
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();
|
|
|
|
|
|
//初始化C1的RGA模块
|
|
|
#ifdef RTK_RGA_STATUS_ON
|
|
|
|
|
|
g_JZC1_info.IRC_rga_info = (C1_RgaInfo *)malloc(sizeof(C1_RgaInfo));
|
|
|
if (g_JZC1_info.IRC_rga_info == NULL)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("malloc IRC_rga_info failed");
|
|
|
}
|
|
|
|
|
|
ret = JZC1_RgaInit(g_JZC1_info.IRC_rga_info, g_JZC1_info.IRC_enc_info->hor_stride, g_JZC1_info.IRC_enc_info->ver_stride, RK_FORMAT_YCbCr_420_SP);
|
|
|
|
|
|
g_JZC1_info.Opt_rga_info = (C1_RgaInfo *)malloc(sizeof(C1_RgaInfo));
|
|
|
if (g_JZC1_info.Opt_rga_info == NULL)
|
|
|
{
|
|
|
JZSDK_LOG_ERROR("malloc Opt_rga_info failed");
|
|
|
}
|
|
|
|
|
|
ret = JZC1_RgaInit(g_JZC1_info.Opt_rga_info, g_JZC1_info.Opt_enc_info->hor_stride, g_JZC1_info.Opt_enc_info->ver_stride, RK_FORMAT_YCbCr_420_SP);
|
|
|
|
|
|
//混合视频初始化
|
|
|
JZC1_MixedVideo_Init();
|
|
|
#endif
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
//注册保存的回调函数
|
|
|
PowerManager_RegisterPowerOffCallback(JZC1_PowerOff_Save);
|
|
|
|
|
|
//注册读取保存的回调函数
|
|
|
PowerManager_RegisterPowerOnCallback(JZC1_PowerOn_Read);
|
|
|
|
|
|
JZSDK_LOG_INFO("JZC1_Init success");
|
|
|
|
|
|
return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
|
|
|
} |
...
|
...
|
|