2214 lines
81 KiB
C
Executable File
2214 lines
81 KiB
C
Executable File
/*
|
|
* Copyright (c) XMEDIA. All rights reserved.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
#include <errno.h>
|
|
#include <unistd.h>
|
|
#include <signal.h>
|
|
#include <sys/times.h>
|
|
#include <time.h>
|
|
#include <sys/time.h>
|
|
#include <sys/ioctl.h>
|
|
|
|
#include "sample_comm.h"
|
|
#include "sample_comm_sys.h"
|
|
#include "sample_comm_vi.h"
|
|
#include "sample_comm_vpss.h"
|
|
#include "sample_comm_isp.h"
|
|
#include "sample_comm_vgs.h"
|
|
#include "sample_comm_venc.h"
|
|
#include "sample_comm_aov.h"
|
|
#include "sample_comm_pq_bin.h"
|
|
#include "sample_osd_time.h"
|
|
#include "sample_aov_audio.h"
|
|
|
|
static sample_comm_sensor_type sample_aov_sensor_type[MAX_SENSOR_NUM] = { SENSOR0_TYPE, SENSOR1_TYPE, SENSOR2_TYPE,
|
|
SENSOR3_TYPE, SENSOR4_TYPE };
|
|
|
|
static sample_aov_work_mode g_aov_work_mode = MEDIA_WORK_NORMAL;
|
|
static xmedia_bool g_force_exit = XMEDIA_FALSE;
|
|
static xmedia_s32 g_misc_fd = -1;
|
|
|
|
#define IS_SAME_CAMERA_SENSOR 1
|
|
|
|
#define SENSOR0_PQ_BIN_PATH "/usr/param/sensor0/pq.bin"
|
|
#ifdef IS_SAME_CAMERA_SENSOR
|
|
#define SENSOR1_PQ_BIN_PATH SENSOR0_PQ_BIN_PATH
|
|
#else
|
|
#define SENSOR1_PQ_BIN_PATH "/usr/param/sensor1/pq.bin"
|
|
#endif
|
|
|
|
#define SENSOR0_FPN_BIN_PATH "/usr/param/sensor0/fpn.bin"
|
|
#define SENSOR1_FPN_BIN_PATH "/usr/param/sensor1/fpn.bin"
|
|
|
|
#define ISP_AINR_MODEL_PATH "/usr/param/neuron_network.xmm"
|
|
#define AOV_NPU_MODEL_PATH "/usr/param/gnn_aov_person_detect_640x360_rgb888hwc_v0101_20240909.bin"
|
|
|
|
|
|
xmedia_void sample_aov_set_work_mode_state(sample_aov_work_mode work_mode)
|
|
{
|
|
g_aov_work_mode = work_mode;
|
|
}
|
|
|
|
xmedia_void sample_aov_get_work_mode_state(sample_aov_work_mode *work_mode)
|
|
{
|
|
*work_mode = g_aov_work_mode;
|
|
}
|
|
|
|
xmedia_s32 sample_aov_create_npu_person_detect(xmedia_s32 *handle)
|
|
{
|
|
xmedia_s32 s32_ret = XMEDIA_FAILURE;
|
|
xmedia_svp_modules model[1] = {0};
|
|
xmedia_svp_task_cfg task_cfg = {0};
|
|
|
|
model[0].pathname = AOV_NPU_MODEL_PATH;
|
|
model[0].alg_type = XMEDIA_SVP_ALG_TYPE_PERSON;
|
|
model[0].load_mode = XMEDIA_SVP_MODEL_FILE;
|
|
model[0].format = XMEDIA_SVP_INPUTDATA_FORMAT_RGB888;
|
|
|
|
task_cfg.module_num = 1;
|
|
task_cfg.modules = model;
|
|
task_cfg.task_type = XMEDIA_SVP_TASK_AOV;
|
|
|
|
s32_ret = sample_comm_aov_npu_create(handle, &task_cfg);
|
|
if (XMEDIA_SUCCESS != s32_ret) {
|
|
SAMPLE_ERR("------------- svp create fail--please check your npu model name & path.\n");
|
|
return s32_ret;
|
|
}
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
#ifdef NORMAL_SUPPORT_AUDIO
|
|
static xmedia_void sample_aov_audio_start(xmedia_void)
|
|
{
|
|
sample_aov_audio_init();
|
|
sample_aov_audio_start_play();
|
|
sample_aov_audio_start_record();
|
|
}
|
|
|
|
static xmedia_void sample_aov_audio_stop(xmedia_void)
|
|
{
|
|
sample_aov_audio_stop_play();
|
|
sample_aov_audio_stop_record();
|
|
sample_aov_audio_exit();
|
|
}
|
|
#endif
|
|
|
|
static xmedia_void sample_aov_normal_suspend_func()
|
|
{
|
|
#ifdef NORMAL_SUPPORT_AUDIO
|
|
sample_aov_audio_stop();
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
static xmedia_void sample_aov_normal_resume_func()
|
|
{
|
|
#ifdef NORMAL_SUPPORT_AUDIO
|
|
sample_aov_audio_start();
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
xmedia_s32 sample_aov_media_start(sample_aov_init_param *aov_init_param)
|
|
{
|
|
sample_comm_aov_init(aov_init_param);
|
|
sample_comm_aov_venc_thread_create();
|
|
sample_comm_aov_work_thread_create();
|
|
#ifdef NORMAL_SUPPORT_AUDIO
|
|
sample_aov_audio_start();
|
|
#endif
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_aov_media_stop()
|
|
{
|
|
sample_comm_aov_venc_thread_destroy();
|
|
sample_comm_aov_work_thread_destroy();
|
|
sample_comm_aov_exit();
|
|
#ifdef NORMAL_SUPPORT_AUDIO
|
|
sample_aov_audio_stop();
|
|
#endif
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_aov_sys_init(sample_sys_config *sys_config)
|
|
{
|
|
xmedia_s32 ret = 0;
|
|
|
|
ret = sample_comm_sys_init(sys_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_PRT("sample_comm_sys_init failed!\n");
|
|
return ret;
|
|
}
|
|
|
|
ret = sample_comm_vgs_init();
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_PRT("sample_comm_vgs_init failed!\n");
|
|
return ret;
|
|
}
|
|
|
|
// in online-online mode,vi and vpss must be reset at the same time
|
|
ret = sample_comm_vi_init();
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_PRT("sample_comm_vi_init failed!\n");
|
|
return ret;
|
|
}
|
|
|
|
ret = sample_comm_vpss_init();
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_PRT("sample_comm_vpss_init failed!\n");
|
|
return ret;
|
|
}
|
|
|
|
ret = sample_comm_venc_init();
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_PRT("sample_comm_venc_init failed!\n");
|
|
return ret;
|
|
}
|
|
|
|
ret = sample_comm_aov_npu_init();
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_PRT("sample_comm_aov_npu_init failed!\n");
|
|
return ret;
|
|
}
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_void sample_aov_sys_exit(void)
|
|
{
|
|
sample_comm_aov_npu_exit();
|
|
sample_comm_venc_exit();
|
|
sample_comm_vpss_exit();
|
|
sample_comm_vi_exit();
|
|
sample_comm_vgs_exit();
|
|
sample_comm_sys_exit();
|
|
}
|
|
|
|
xmedia_s32 sample_aov_single_sensor_stnr_only(xmedia_s32 frame_rate, xmedia_s32 suspend_time_ms)
|
|
{
|
|
xmedia_s32 ret = XMEDIA_SUCCESS;
|
|
xmedia_s32 i = 0;
|
|
xmedia_s32 pool_num = 0;
|
|
xmedia_s32 blk_size = 0;
|
|
xmedia_video_size pic_size = { 0 };
|
|
xmedia_video_size sub_pic_size = { 0 };
|
|
xmedia_video_size npu_pic_size = { 0 };
|
|
sample_comm_video_param video_param = { 0 };
|
|
sample_sys_config sys_config = { 0 };
|
|
|
|
xmedia_s32 vi_dev = 0;
|
|
xmedia_s32 vi_pipe = 0;
|
|
xmedia_s32 vi_chn = 0;
|
|
sample_vi_config vi_config = { 0 };
|
|
|
|
xmedia_s32 sensor_type = sample_aov_sensor_type[0];
|
|
xmedia_u32 framerate = 0;
|
|
vi_sensor_info sensor_info = { 0 };
|
|
sample_isp_param isp_param = { 0 };
|
|
xmedia_isp_config isp_config = { 0 };
|
|
xmedia_bool mirror = XMEDIA_FALSE;
|
|
xmedia_bool flip = XMEDIA_FALSE;
|
|
|
|
xmedia_s32 vpss_chnl = 0;
|
|
xmedia_s32 vpss_pipe = 0;
|
|
xmedia_s32 vpss_ochn[3] = { 0, 1 ,2};
|
|
sample_vpss_config vpss_config = { 0 };
|
|
xmedia_video_size vpss_ochn_size[VPSS_MAX_OCHN_NUM] = { 0 };
|
|
xmedia_u32 wrap_buffer_line = 0;
|
|
|
|
xmedia_s32 venc_chnl = 0;
|
|
xmedia_s32 venc_chn[2] = { 0, 1 };
|
|
xmedia_s32 venc_chn_cnt = 2;
|
|
xmedia_venc_chn_param venc_chn_param;
|
|
sample_venc_config venc_config = { 0 };
|
|
|
|
misc_aov_isp_info isp_info = {0};
|
|
xmedia_u32 sleep_time = 500; //us
|
|
#ifdef SUPPORT_OSD_TIME
|
|
xmedia_chn_info mpp_chn;
|
|
xmedia_rgn_chn_attr rgn_chn_attr = {0};
|
|
xmedia_rgn_overlay_chn_attr *overlay_chn;
|
|
#endif
|
|
|
|
video_param.video_fmt = XMEDIA_VIDEO_FMT_LINEAR;
|
|
video_param.pixel_fmt = XMEDIA_VIDEO_PIXEL_FMT_YVU_SEMIPLANAR_420;
|
|
video_param.data_width = XMEDIA_VIDEO_DATA_WIDTH_8;
|
|
video_param.compress_mode = XMEDIA_VIDEO_COMPRESS_MODE_NONE;
|
|
|
|
sample_comm_vi_get_sensor_info(sensor_type, &sensor_info);
|
|
framerate = frame_rate;
|
|
|
|
// sys init
|
|
for(i = 0; i < VI_MAX_PIPE_NUM; i++) {
|
|
sys_config.sys_conf.pipe_mode[i].vicap_viproc_mode = XMEDIA_WORK_MODE_OFFLINE;
|
|
sys_config.sys_conf.pipe_mode[i].viproc_vpss_mode = XMEDIA_WORK_MODE_ONLINE;
|
|
sys_config.sys_conf.pipe_mode[i].gdc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
|
|
}
|
|
sys_config.sys_conf.pipe_mode[0].vicap_viproc_mode = XMEDIA_WORK_MODE_ONLINE;
|
|
|
|
pic_size.width = sensor_info.width;
|
|
pic_size.height = sensor_info.height;
|
|
|
|
/* wrap VB */
|
|
blk_size = sample_comm_sys_get_wrap_buffer_size(pic_size, video_param.video_fmt, video_param.pixel_fmt,
|
|
video_param.data_width, video_param.compress_mode, &wrap_buffer_line);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 1;
|
|
pool_num ++;
|
|
SAMPLE_PRT("wrap vb size : %d \n", blk_size);
|
|
|
|
sub_pic_size.width = 640;
|
|
sub_pic_size.height = 480;
|
|
blk_size = sample_comm_sys_get_buffer_size(sub_pic_size, video_param.video_fmt, video_param.pixel_fmt,
|
|
video_param.data_width, video_param.compress_mode);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 3;
|
|
pool_num ++;
|
|
|
|
npu_pic_size.width = 640;
|
|
npu_pic_size.height = 360;
|
|
blk_size = sample_comm_sys_get_buffer_size(npu_pic_size, video_param.video_fmt, video_param.pixel_fmt,
|
|
video_param.data_width, video_param.compress_mode);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 3;
|
|
pool_num ++;
|
|
|
|
sys_config.vb_conf.max_pool_cnt = pool_num;
|
|
|
|
sys_config.vb_conf.supplement_config = 1;
|
|
|
|
ret = sample_aov_sys_init(&sys_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("sys init failed !\n");
|
|
return ret;
|
|
}
|
|
|
|
isp_info.isp_pipe_num = 1;
|
|
isp_info.isp_pipe[0] = vi_pipe;
|
|
#ifdef SUPPORT_SENSOR_PWDN_MODE
|
|
isp_info.support_sensor_pwdn_standby[0] = XMEDIA_TRUE;
|
|
#endif
|
|
sample_comm_aov_misc_init(&isp_info);
|
|
g_misc_fd = sample_comm_aov_get_misc_fd();
|
|
|
|
vi_config.dev_info[vi_dev].dev_en = XMEDIA_TRUE;
|
|
vi_config.dev_info[vi_dev].dev_no = vi_dev;
|
|
vi_config.dev_info[vi_dev].sensor_type = sensor_type;
|
|
vi_config.pipe_info[vi_pipe].pipe_en = XMEDIA_TRUE;
|
|
vi_config.pipe_info[vi_pipe].pipe_no = vi_pipe;
|
|
vi_config.pipe_info[vi_pipe].chn_info[vi_chn].chn_en = XMEDIA_TRUE;
|
|
vi_config.pipe_info[vi_pipe].chn_info[vi_chn].chn_no = vi_chn;
|
|
vi_config.dev_bind_pipe[vi_dev].pipe[0] = vi_pipe;
|
|
vi_config.dev_bind_pipe[vi_dev].pipe[1] = -1;
|
|
|
|
isp_config.fps = framerate;
|
|
isp_config.mode_config.work_mode = XMEDIA_ISP_WORK_MODE_MASTER;
|
|
isp_config.mode_config.master_mode.blend_stat_enable = XMEDIA_FALSE;
|
|
isp_config.mode_config.master_mode.slave_num = 0;
|
|
isp_config.pixel_fmt = sensor_info.pixel_format;
|
|
isp_config.size.height = sensor_info.height;
|
|
isp_config.size.width = sensor_info.width;
|
|
isp_config.wdr_mode = sensor_info.wdr_mode;
|
|
|
|
// isp pipe init
|
|
isp_param.pipe[vi_pipe] = vi_pipe;
|
|
isp_param.isp_info[vi_pipe].isp_pipe_en = XMEDIA_TRUE;
|
|
isp_param.isp_info[vi_pipe].isp_sensor_en = XMEDIA_TRUE;
|
|
isp_param.isp_info[vi_pipe].sensor_type = sensor_type;
|
|
isp_param.isp_info[vi_pipe].disable_dynamic_fps = XMEDIA_TRUE;
|
|
isp_param.isp_info[vi_pipe].mirror = mirror;
|
|
isp_param.isp_info[vi_pipe].flip = flip;
|
|
memcpy(&(isp_param.isp_info[vi_pipe].isp_config), &isp_config, sizeof(xmedia_isp_config));
|
|
|
|
// isp init
|
|
ret = sample_comm_isp_init(&isp_param, &vi_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("isp init failed!\n");
|
|
goto exit0;
|
|
}
|
|
|
|
// vi start
|
|
ret = sample_comm_vi_start(&vi_config, &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("start vi failed!\n");
|
|
goto exit1;
|
|
}
|
|
|
|
// isp start
|
|
ret = sample_comm_isp_start(&isp_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("start isp failed!\n");
|
|
goto exit2;
|
|
}
|
|
|
|
// vpss config
|
|
ret = sample_comm_vpss_get_default_pipe_cfg(&vpss_config.pipe_info[vpss_pipe].pipe_config, pic_size, &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
|
|
vpss_ochn_size[0].width = sensor_info.width;
|
|
vpss_ochn_size[0].height = sensor_info.height;
|
|
vpss_ochn_size[1].width = sub_pic_size.width;
|
|
vpss_ochn_size[1].height = sub_pic_size.height;
|
|
vpss_ochn_size[2].width = npu_pic_size.width;
|
|
vpss_ochn_size[2].height = npu_pic_size.height;
|
|
|
|
vpss_config.pipe_info[vpss_pipe].pipe_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe].pipe_no = vpss_pipe;
|
|
|
|
vpss_chnl = vpss_ochn[0];
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_no = vpss_ochn[0];
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].wrap_attr.buf_line = wrap_buffer_line;
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].wrap_attr.enable = XMEDIA_TRUE;
|
|
ret = sample_comm_vpss_get_default_ochn_cfg(&vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config,
|
|
vpss_ochn_size[vpss_chnl], &video_param);
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config.cmp_mode = XMEDIA_VIDEO_COMPRESS_MODE_TILE_COMPACT;
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config.video_fmt = XMEDIA_VIDEO_FMT_TILE_32x4;
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config.depth = 0;
|
|
|
|
vpss_chnl = vpss_ochn[1];
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_no = vpss_ochn[1];
|
|
ret = sample_comm_vpss_get_default_ochn_cfg(&vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config,
|
|
vpss_ochn_size[vpss_chnl], &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config.depth = 0;
|
|
|
|
vpss_chnl = vpss_ochn[2];
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_no = vpss_ochn[2];
|
|
ret = sample_comm_vpss_get_default_ochn_cfg(&vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config,
|
|
vpss_ochn_size[vpss_chnl], &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
|
|
// vpss start
|
|
ret = sample_comm_vpss_start(&vpss_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("vpss start failed !\n");
|
|
goto exit2;
|
|
}
|
|
|
|
// venc init
|
|
venc_chnl = venc_chn[0];
|
|
venc_config.chn_info[venc_chnl].venc_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].venc_chn = venc_chnl;
|
|
venc_config.chn_info[venc_chnl].payload_type = PT_H265;
|
|
venc_config.chn_info[venc_chnl].rc_mode = VENC_RC_MODE_H265AVBR;
|
|
venc_config.chn_info[venc_chnl].str_buffer_size = ALIGN_UP(pic_size.width * pic_size.height * 2, 64);
|
|
venc_config.chn_info[venc_chnl].vui_info.vui_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].vui_info.stream_display_fps = frame_rate;
|
|
sample_comm_venc_get_default_chn_info(vpss_ochn_size[0], framerate, &venc_config.chn_info[venc_chnl]);
|
|
|
|
venc_chnl = venc_chn[1];
|
|
venc_config.chn_info[venc_chnl].venc_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].venc_chn = venc_chnl;
|
|
venc_config.chn_info[venc_chnl].payload_type = PT_H265;
|
|
venc_config.chn_info[venc_chnl].rc_mode = VENC_RC_MODE_H265AVBR;
|
|
venc_config.chn_info[venc_chnl].str_buffer_size = ALIGN_UP(sub_pic_size.width * sub_pic_size.height * 2, 64);
|
|
venc_config.chn_info[venc_chnl].vui_info.vui_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].vui_info.stream_display_fps = frame_rate;
|
|
sample_comm_venc_get_default_chn_info(vpss_ochn_size[1], framerate, &venc_config.chn_info[venc_chnl]);
|
|
|
|
ret = sample_comm_venc_start(&venc_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("venc start failed !\n");
|
|
goto exit3;
|
|
}
|
|
|
|
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("vpss bind venc failed !\n");
|
|
goto exit4;
|
|
}
|
|
|
|
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("vpss bind venc failed !\n");
|
|
goto exit5;
|
|
}
|
|
|
|
for(i = 0; i < venc_chn_cnt; i++) {
|
|
ret = xmedia_venc_get_chn_param(venc_chn[i], &venc_chn_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_venc_get_chn_param failed(0x%x), venc_chn[%d]!\n", ret, venc_chn[i]);
|
|
goto exit6;
|
|
}
|
|
|
|
venc_chn_param.max_strm_cnt = VENC_STR_BUF_DEFAULT_MAX_FRAME_COUNT;
|
|
|
|
ret = xmedia_venc_set_chn_param(venc_chn[i], &venc_chn_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_venc_set_chn_param failed(0x%x), venc_chn[%d]!\n", ret, venc_chn[i]);
|
|
goto exit6;
|
|
}
|
|
}
|
|
|
|
xmedia_s32 svp_handle = 0;
|
|
ret = sample_aov_create_npu_person_detect(&svp_handle);
|
|
if (XMEDIA_SUCCESS != ret) {
|
|
SAMPLE_ERR("npu init fail \n");
|
|
goto exit6;
|
|
}
|
|
|
|
sample_aov_init_param aov_init_param = {0};
|
|
|
|
aov_init_param.isp_param.isp_pipe_num = 1;
|
|
aov_init_param.isp_param.isp_pipe[0] = isp_param.pipe[vi_pipe];
|
|
|
|
//vpss normal, aov should disable ochn
|
|
aov_init_param.vpss_param.vpss_pipe_num = 1;
|
|
aov_init_param.vpss_param.vpss_pipe[0] = vpss_pipe;
|
|
aov_init_param.vpss_param.vpss_ochn_num[0] = 1;
|
|
aov_init_param.vpss_param.vpss_ochn[0][0] = vpss_ochn[1];
|
|
|
|
aov_init_param.npu_param.npu_detect_num = 1;
|
|
aov_init_param.npu_param.vpss_pipe[0] = vpss_pipe;
|
|
aov_init_param.npu_param.vpss_ochn[0] = vpss_ochn[2];
|
|
aov_init_param.npu_param.npu_svp_handle[0] = svp_handle;
|
|
aov_init_param.npu_param.en_switch_mode[0] = XMEDIA_TRUE;
|
|
|
|
aov_init_param.venc_param.venc_chn_num = venc_chn_cnt;
|
|
aov_init_param.venc_param.venc_chn[0] = venc_chn[0];
|
|
aov_init_param.venc_param.en_aov[0] = XMEDIA_TRUE;
|
|
aov_init_param.venc_param.chn_max_size[0] = venc_config.chn_info[0].str_buffer_size;
|
|
aov_init_param.venc_param.chn_threshold_size[0] = aov_init_param.venc_param.chn_max_size[0] / 5;
|
|
aov_init_param.venc_param.venc_chn[1] = venc_chn[1];
|
|
aov_init_param.venc_param.en_aov[1] = XMEDIA_FALSE;
|
|
aov_init_param.venc_param.chn_max_size[1] = venc_config.chn_info[1].str_buffer_size;
|
|
aov_init_param.venc_param.chn_threshold_size[1] = aov_init_param.venc_param.chn_max_size[1] / 5;
|
|
|
|
aov_init_param.suspend_time = suspend_time_ms;
|
|
aov_init_param.npu_notice_callback = sample_aov_set_work_mode_state;
|
|
aov_init_param.normal_resume_callback = sample_aov_normal_resume_func;
|
|
aov_init_param.normal_suspend_callback = sample_aov_normal_suspend_func;
|
|
|
|
ret = sample_aov_media_start(&aov_init_param);
|
|
if (XMEDIA_SUCCESS != ret) {
|
|
SAMPLE_ERR("media start fail \n");
|
|
goto exit6;
|
|
}
|
|
|
|
#ifdef SUPPORT_OSD_TIME
|
|
sample_osd_time_init();
|
|
|
|
mpp_chn.mod_id = MOD_ID_VENC;
|
|
mpp_chn.dev_id = 0;
|
|
mpp_chn.chn_id = venc_chn[0];
|
|
|
|
rgn_chn_attr.is_show = XMEDIA_TRUE;
|
|
rgn_chn_attr.type = XMEDIA_RGN_TYPE_OVERLAY;
|
|
|
|
overlay_chn = &rgn_chn_attr.attr.overlay_chn;
|
|
overlay_chn->alpha0 = 128;
|
|
overlay_chn->alpha1 = 128;
|
|
overlay_chn->qp_info.disable = XMEDIA_TRUE;
|
|
overlay_chn->qp_info.is_abs_qp = XMEDIA_FALSE;
|
|
overlay_chn->qp_info.qp_val = -2;
|
|
overlay_chn->dst = XMEDIA_RGN_ATTACH_JPEG_MAIN;
|
|
overlay_chn->point.x = 0;
|
|
overlay_chn->point.y = 0;
|
|
overlay_chn->layer = 0;
|
|
|
|
sample_osd_time_attach_to_chn(&mpp_chn, &rgn_chn_attr);
|
|
|
|
mpp_chn.mod_id = MOD_ID_VENC;
|
|
mpp_chn.dev_id = 0;
|
|
mpp_chn.chn_id = venc_chn[1];
|
|
sample_osd_time_attach_to_chn(&mpp_chn, &rgn_chn_attr);
|
|
|
|
sample_osd_time_start();
|
|
#endif
|
|
|
|
sample_aov_work_mode work_mode = MEDIA_WORK_NORMAL;
|
|
sample_aov_work_mode last_work_mode = MEDIA_WORK_NORMAL;
|
|
|
|
while(g_force_exit != XMEDIA_TRUE) {
|
|
sample_aov_get_work_mode_state(&work_mode);
|
|
if (work_mode != last_work_mode) {
|
|
if (work_mode == MEDIA_WORK_AOV) {
|
|
sample_comm_aov_set_work_mode(MEDIA_WORK_AOV);
|
|
last_work_mode = MEDIA_WORK_AOV;
|
|
}
|
|
|
|
if (work_mode == MEDIA_WORK_NORMAL) {
|
|
last_work_mode = MEDIA_WORK_NORMAL;
|
|
}
|
|
}
|
|
|
|
#ifdef SUPPORT_OSD_TIME
|
|
sample_osd_time_update(sleep_time, work_mode);
|
|
#endif
|
|
usleep(sleep_time);
|
|
}
|
|
|
|
sample_aov_media_stop();
|
|
sample_comm_aov_npu_destroy(svp_handle);
|
|
|
|
#ifdef SUPPORT_OSD_TIME
|
|
sample_osd_time_destroy();
|
|
#endif
|
|
|
|
exit6:
|
|
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
|
|
|
|
exit5:
|
|
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
|
|
|
|
exit4:
|
|
sample_comm_venc_stop(&venc_config);
|
|
|
|
exit3:
|
|
sample_comm_vpss_stop(&vpss_config);
|
|
|
|
exit2:
|
|
sample_comm_isp_stop(&isp_param);
|
|
|
|
exit1:
|
|
sample_comm_vi_stop(&vi_config);
|
|
|
|
exit0:
|
|
sample_comm_isp_exit(&isp_param);
|
|
sample_aov_sys_exit();
|
|
|
|
return ret;
|
|
}
|
|
|
|
xmedia_s32 sample_aov_dual_sensor_stnr_only(xmedia_s32 frame_rate, xmedia_s32 suspend_time_ms)
|
|
{
|
|
xmedia_s32 ret = XMEDIA_SUCCESS;
|
|
xmedia_s32 i = 0;
|
|
xmedia_s32 pool_num = 0;
|
|
xmedia_s32 blk_size = 0;
|
|
xmedia_video_size pic_size[2] = { 0 };
|
|
xmedia_video_size sub_pic_size = { 0 };
|
|
xmedia_video_size npu_pic_size = { 0 };
|
|
sample_comm_video_param video_param = { 0 };
|
|
sample_sys_config sys_config = { 0 };
|
|
xmedia_s32 media_pipe_num = 2;
|
|
|
|
xmedia_s32 vi_dev[2] = {0,1};
|
|
xmedia_s32 vi_pipe[2] = {0,1};
|
|
xmedia_s32 vi_chn = 0;
|
|
sample_vi_config vi_config = { 0 };
|
|
|
|
xmedia_s32 sensor_type[2] = {sample_aov_sensor_type[0], sample_aov_sensor_type[1]};
|
|
xmedia_u32 framerate = 0;
|
|
vi_sensor_info sensor_info[2] = { 0 };
|
|
sample_isp_param isp_param = { 0 };
|
|
xmedia_isp_config isp_config = { 0 };
|
|
xmedia_bool mirror = XMEDIA_FALSE;
|
|
xmedia_bool flip = XMEDIA_FALSE;
|
|
|
|
xmedia_s32 vpss_chnl = 0;
|
|
xmedia_s32 vpss_pipe[2] = {0,1};
|
|
xmedia_s32 vpss_ochn[3] = { 0, 1 ,2};
|
|
sample_vpss_config vpss_config = { 0 };
|
|
xmedia_video_size vpss_ochn_size[2][VPSS_MAX_OCHN_NUM] = { 0 };
|
|
xmedia_u32 wrap_buffer_line[2] = {0};
|
|
xmedia_vpss_wrap_buf_share_config wrap_share_cfg = { 0 };
|
|
|
|
xmedia_s32 venc_chnl = 0;
|
|
xmedia_s32 venc_chn[4] = { 0, 1, 2, 3 };
|
|
xmedia_s32 venc_chn_cnt = 4;
|
|
sample_venc_config venc_config = { 0 };
|
|
xmedia_venc_chn_param venc_chn_param;
|
|
|
|
misc_aov_isp_info isp_info = {0};
|
|
xmedia_u32 sleep_time = 500; //us
|
|
#ifdef SUPPORT_OSD_TIME
|
|
xmedia_chn_info mpp_chn;
|
|
xmedia_rgn_chn_attr rgn_chn_attr = {0};
|
|
xmedia_rgn_overlay_chn_attr *overlay_chn;
|
|
#endif
|
|
|
|
video_param.video_fmt = XMEDIA_VIDEO_FMT_LINEAR;
|
|
video_param.pixel_fmt = XMEDIA_VIDEO_PIXEL_FMT_YVU_SEMIPLANAR_420;
|
|
video_param.data_width = XMEDIA_VIDEO_DATA_WIDTH_8;
|
|
video_param.compress_mode = XMEDIA_VIDEO_COMPRESS_MODE_NONE;
|
|
|
|
framerate = frame_rate;
|
|
|
|
// sys init
|
|
for(i = 0; i < VI_MAX_PIPE_NUM; i++) {
|
|
sys_config.sys_conf.pipe_mode[i].vicap_viproc_mode = XMEDIA_WORK_MODE_OFFLINE;
|
|
sys_config.sys_conf.pipe_mode[i].viproc_vpss_mode = XMEDIA_WORK_MODE_ONLINE;
|
|
sys_config.sys_conf.pipe_mode[i].gdc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
|
|
}
|
|
|
|
for(i = 0; i < media_pipe_num; i ++)
|
|
{
|
|
sample_comm_vi_get_sensor_info(sensor_type[i], &sensor_info[i]);
|
|
|
|
pic_size[i].width = sensor_info[i].width;
|
|
pic_size[i].height = sensor_info[i].height;
|
|
|
|
/*vi-viproc offline raw VB*/
|
|
blk_size = sample_comm_sys_get_buffer_size(pic_size[i], video_param.video_fmt, sensor_info[i].pixel_format,
|
|
sensor_info[i].bit_width, video_param.compress_mode);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 1;
|
|
|
|
pool_num ++;
|
|
}
|
|
|
|
/* wrap VB */
|
|
wrap_share_cfg.enable = XMEDIA_TRUE;
|
|
wrap_share_cfg.wrap_pos = XMEDIA_VPSS_WRAP_POS_PHY_OCHN;
|
|
|
|
for(i = 0; i < media_pipe_num; i ++)
|
|
{
|
|
blk_size = sample_comm_sys_get_wrap_buffer_size(pic_size[i], video_param.video_fmt, video_param.pixel_fmt,
|
|
video_param.data_width, video_param.compress_mode, &wrap_buffer_line[i]);
|
|
|
|
|
|
if(wrap_share_cfg.enable == XMEDIA_TRUE)
|
|
{
|
|
wrap_share_cfg.buf_size = (wrap_share_cfg.buf_size > blk_size) ? wrap_share_cfg.buf_size : blk_size;
|
|
if(i == 1)
|
|
{
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = wrap_share_cfg.buf_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 1;
|
|
pool_num ++;
|
|
SAMPLE_PRT("wrap share vb size : %d \n", wrap_share_cfg.buf_size);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 1;
|
|
pool_num ++;
|
|
SAMPLE_PRT("sensor%d wrap vb size : %d \n", i, blk_size);
|
|
}
|
|
}
|
|
|
|
sub_pic_size.width = 640;
|
|
sub_pic_size.height = 480;
|
|
blk_size = sample_comm_sys_get_buffer_size(sub_pic_size, video_param.video_fmt, video_param.pixel_fmt,
|
|
video_param.data_width, video_param.compress_mode);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 6;
|
|
pool_num ++;
|
|
|
|
npu_pic_size.width = 640;
|
|
npu_pic_size.height = 360;
|
|
blk_size = sample_comm_sys_get_buffer_size(npu_pic_size, video_param.video_fmt, video_param.pixel_fmt,
|
|
video_param.data_width, video_param.compress_mode);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 6;
|
|
pool_num ++;
|
|
|
|
sys_config.vb_conf.max_pool_cnt = pool_num;
|
|
|
|
sys_config.vb_conf.supplement_config = 1;
|
|
|
|
ret = sample_aov_sys_init(&sys_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("sys init failed !\n");
|
|
return ret;
|
|
}
|
|
|
|
isp_info.isp_pipe_num = 2;
|
|
isp_info.isp_pipe[0] = vi_pipe[0];
|
|
isp_info.isp_pipe[1] = vi_pipe[1];
|
|
#ifdef SUPPORT_SENSOR_PWDN_MODE
|
|
isp_info.support_sensor_pwdn_standby[0] = XMEDIA_TRUE;
|
|
isp_info.support_sensor_pwdn_standby[1] = XMEDIA_TRUE;
|
|
#endif
|
|
sample_comm_aov_misc_init(&isp_info);
|
|
g_misc_fd = sample_comm_aov_get_misc_fd();
|
|
|
|
for(i = 0; i < media_pipe_num; i ++)
|
|
{
|
|
vi_config.dev_info[i].dev_en = XMEDIA_TRUE;
|
|
vi_config.dev_info[i].dev_no = vi_dev[i];
|
|
vi_config.dev_info[i].sensor_type = sensor_type[i];
|
|
vi_config.pipe_info[i].pipe_en = XMEDIA_TRUE;
|
|
vi_config.pipe_info[i].pipe_no = vi_pipe[i];
|
|
vi_config.pipe_info[i].chn_info[vi_chn].chn_en = XMEDIA_TRUE;
|
|
vi_config.pipe_info[i].chn_info[vi_chn].chn_no = vi_chn;
|
|
vi_config.pipe_info[vi_pipe[i]].lowdelay_attr.enable = XMEDIA_TRUE;
|
|
vi_config.pipe_info[vi_pipe[i]].lowdelay_attr.line_cnt = sensor_info[i].height / 2;
|
|
vi_config.pipe_info[vi_pipe[i]].lowdelay_attr.one_buf_en = XMEDIA_TRUE;
|
|
vi_config.dev_bind_pipe[i].pipe[0] = vi_pipe[i];
|
|
vi_config.dev_bind_pipe[i].pipe[1] = -1;
|
|
|
|
if (sensor_type[i] == SMART_SC235HAI_MIPI_2M_2LANE_30FPS_10BIT ||
|
|
sensor_type[i] == SMART_SC485SL_MIPI_4M_30FPS_2LANE_12BIT) {
|
|
mirror = XMEDIA_TRUE;
|
|
flip = XMEDIA_TRUE;
|
|
}
|
|
|
|
isp_config.fps = framerate;
|
|
isp_config.mode_config.work_mode = XMEDIA_ISP_WORK_MODE_MASTER;
|
|
isp_config.mode_config.master_mode.blend_stat_enable = XMEDIA_FALSE;
|
|
isp_config.mode_config.master_mode.slave_num = 0;
|
|
isp_config.pixel_fmt = sensor_info[i].pixel_format;
|
|
isp_config.size.height = sensor_info[i].height;
|
|
isp_config.size.width = sensor_info[i].width;
|
|
isp_config.wdr_mode = sensor_info[i].wdr_mode;
|
|
|
|
// isp pipe init
|
|
isp_param.pipe[vi_pipe[i]] = vi_pipe[i];
|
|
isp_param.isp_info[vi_pipe[i]].isp_pipe_en = XMEDIA_TRUE;
|
|
isp_param.isp_info[vi_pipe[i]].isp_sensor_en = XMEDIA_TRUE;
|
|
isp_param.isp_info[vi_pipe[i]].sensor_type = sensor_type[i];
|
|
isp_param.isp_info[vi_pipe[i]].disable_dynamic_fps = XMEDIA_TRUE;
|
|
isp_param.isp_info[vi_pipe[i]].mirror = mirror;
|
|
isp_param.isp_info[vi_pipe[i]].flip = flip;
|
|
memcpy(&(isp_param.isp_info[vi_pipe[i]].isp_config), &isp_config, sizeof(xmedia_isp_config));
|
|
}
|
|
|
|
// isp init
|
|
ret = sample_comm_isp_init(&isp_param, &vi_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("isp init failed!\n");
|
|
goto exit0;
|
|
}
|
|
|
|
// vi start
|
|
ret = sample_comm_vi_start(&vi_config, &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("start vi failed!\n");
|
|
goto exit1;
|
|
}
|
|
|
|
// isp start
|
|
ret = sample_comm_isp_start(&isp_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("start isp failed!\n");
|
|
goto exit2;
|
|
}
|
|
|
|
// vpss config
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
ret = sample_comm_vpss_get_default_pipe_cfg(&vpss_config.pipe_info[vpss_pipe[i]].pipe_config, pic_size[i], &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
|
|
vpss_ochn_size[vpss_pipe[i]][0].width = sensor_info[i].width;
|
|
vpss_ochn_size[vpss_pipe[i]][0].height = sensor_info[i].height;
|
|
vpss_ochn_size[vpss_pipe[i]][1].width = sub_pic_size.width;
|
|
vpss_ochn_size[vpss_pipe[i]][1].height = sub_pic_size.height;
|
|
vpss_ochn_size[vpss_pipe[i]][2].width = npu_pic_size.width;
|
|
vpss_ochn_size[vpss_pipe[i]][2].height = npu_pic_size.height;
|
|
|
|
vpss_config.pipe_info[i].pipe_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[i].pipe_no = i;
|
|
|
|
vpss_chnl = vpss_ochn[0];
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_no = vpss_ochn[0];
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].wrap_attr.buf_line = wrap_buffer_line[i];
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].wrap_attr.enable = XMEDIA_TRUE;
|
|
ret = sample_comm_vpss_get_default_ochn_cfg(&vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config,
|
|
vpss_ochn_size[vpss_pipe[i]][vpss_chnl], &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.cmp_mode = XMEDIA_VIDEO_COMPRESS_MODE_TILE_COMPACT;
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.video_fmt = XMEDIA_VIDEO_FMT_TILE_32x4;
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.depth = 0;
|
|
|
|
vpss_chnl = vpss_ochn[1];
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_no = vpss_ochn[1];
|
|
ret = sample_comm_vpss_get_default_ochn_cfg(&vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config,
|
|
vpss_ochn_size[vpss_pipe[i]][vpss_chnl], &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.depth = 0;
|
|
|
|
vpss_chnl = vpss_ochn[2];
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_no = vpss_ochn[2];
|
|
ret = sample_comm_vpss_get_default_ochn_cfg(&vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config,
|
|
vpss_ochn_size[vpss_pipe[i]][vpss_chnl], &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.depth = 4;
|
|
}
|
|
|
|
// set wrap buf share
|
|
if(wrap_share_cfg.enable == XMEDIA_TRUE) {
|
|
ret = xmedia_vpss_set_wrap_buf_share_config(&wrap_share_cfg);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("set wrap buf share failed !\n");
|
|
goto exit2;
|
|
}
|
|
}
|
|
|
|
// vpss start
|
|
ret = sample_comm_vpss_start(&vpss_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("vpss start failed !\n");
|
|
goto exit2;
|
|
}
|
|
|
|
// venc init
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
venc_chnl = venc_chn[2 * i];
|
|
venc_config.chn_info[venc_chnl].venc_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].venc_chn = venc_chnl;
|
|
venc_config.chn_info[venc_chnl].payload_type = PT_H265;
|
|
venc_config.chn_info[venc_chnl].rc_mode = VENC_RC_MODE_H265AVBR;
|
|
venc_config.chn_info[venc_chnl].str_buffer_size = ALIGN_UP(pic_size[i].width * pic_size[i].height * 2, 64);
|
|
venc_config.chn_info[venc_chnl].vui_info.vui_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].vui_info.stream_display_fps = frame_rate;
|
|
sample_comm_venc_get_default_chn_info(vpss_ochn_size[vpss_pipe[i]][0], framerate, &venc_config.chn_info[venc_chnl]);
|
|
|
|
venc_chnl = venc_chn[2 * i + 1];
|
|
venc_config.chn_info[venc_chnl].venc_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].venc_chn = venc_chnl;
|
|
venc_config.chn_info[venc_chnl].payload_type = PT_H265;
|
|
venc_config.chn_info[venc_chnl].rc_mode = VENC_RC_MODE_H265AVBR;
|
|
venc_config.chn_info[venc_chnl].str_buffer_size = ALIGN_UP(sub_pic_size.width * sub_pic_size.height * 2, 64);
|
|
venc_config.chn_info[venc_chnl].vui_info.vui_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].vui_info.stream_display_fps = frame_rate;
|
|
sample_comm_venc_get_default_chn_info(vpss_ochn_size[vpss_pipe[i]][1], framerate, &venc_config.chn_info[venc_chnl]);
|
|
}
|
|
|
|
ret = sample_comm_venc_start(&venc_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("venc start failed !\n");
|
|
goto exit3;
|
|
}
|
|
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe[i], vpss_ochn[0], venc_chn[2*i+0]);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("vpss bind venc failed !\n");
|
|
goto exit4;
|
|
}
|
|
|
|
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe[i], vpss_ochn[1], venc_chn[2*i+1]);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("vpss bind venc failed !\n");
|
|
goto exit5;
|
|
}
|
|
}
|
|
|
|
for(i = 0; i < venc_chn_cnt; i++) {
|
|
ret = xmedia_venc_get_chn_param(venc_chn[i], &venc_chn_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_venc_get_chn_param failed(0x%x), venc_chn[%d]!\n", ret, venc_chn[i]);
|
|
goto exit5;
|
|
}
|
|
|
|
venc_chn_param.max_strm_cnt = VENC_STR_BUF_DEFAULT_MAX_FRAME_COUNT;
|
|
|
|
ret = xmedia_venc_set_chn_param(venc_chn[i], &venc_chn_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_venc_set_chn_param failed(0x%x), venc_chn[%d]!\n", ret, venc_chn[i]);
|
|
goto exit5;
|
|
}
|
|
}
|
|
|
|
xmedia_s32 svp_handle = 0;
|
|
ret = sample_aov_create_npu_person_detect(&svp_handle);
|
|
if (XMEDIA_SUCCESS != ret) {
|
|
SAMPLE_ERR("npu init fail \n");
|
|
goto exit6;
|
|
}
|
|
|
|
sample_aov_init_param aov_init_param = {0};
|
|
|
|
aov_init_param.isp_param.isp_pipe_num = 2;
|
|
aov_init_param.isp_param.isp_pipe[0] = isp_param.pipe[vpss_pipe[0]];
|
|
aov_init_param.isp_param.isp_pipe[1] = isp_param.pipe[vpss_pipe[1]];
|
|
|
|
//vpss normal, aov should disable ochn
|
|
aov_init_param.vpss_param.vpss_pipe_num = 2;
|
|
aov_init_param.vpss_param.vpss_pipe[0] = vpss_pipe[0];
|
|
aov_init_param.vpss_param.vpss_pipe[1] = vpss_pipe[1];
|
|
aov_init_param.vpss_param.vpss_ochn_num[0] = 1;
|
|
aov_init_param.vpss_param.vpss_ochn_num[1] = 1;
|
|
aov_init_param.vpss_param.vpss_ochn[0][0] = vpss_ochn[1];
|
|
aov_init_param.vpss_param.vpss_ochn[1][0] = vpss_ochn[1];
|
|
|
|
aov_init_param.npu_param.npu_detect_num = 2;
|
|
aov_init_param.npu_param.vpss_pipe[0] = vpss_pipe[0];
|
|
aov_init_param.npu_param.vpss_ochn[0] = vpss_ochn[2];
|
|
aov_init_param.npu_param.npu_svp_handle[0] = svp_handle;
|
|
aov_init_param.npu_param.en_switch_mode[0] = XMEDIA_TRUE;
|
|
aov_init_param.npu_param.vpss_pipe[1] = vpss_pipe[1];
|
|
aov_init_param.npu_param.vpss_ochn[1] = vpss_ochn[2];
|
|
aov_init_param.npu_param.npu_svp_handle[1] = svp_handle;
|
|
aov_init_param.npu_param.en_switch_mode[1] = XMEDIA_TRUE;
|
|
|
|
aov_init_param.venc_param.venc_chn_num = venc_chn_cnt;
|
|
for(i = 0; i < media_pipe_num; i ++)
|
|
{
|
|
aov_init_param.venc_param.venc_chn[2*i] = venc_chn[2*i];
|
|
aov_init_param.venc_param.en_aov[2*i] = XMEDIA_TRUE;
|
|
aov_init_param.venc_param.chn_max_size[2*i] = venc_config.chn_info[venc_chn[2*i]].str_buffer_size;
|
|
aov_init_param.venc_param.chn_threshold_size[2*i] = aov_init_param.venc_param.chn_max_size[2*i] / 5;
|
|
|
|
aov_init_param.venc_param.venc_chn[2*i+1] = venc_chn[2*i+1];
|
|
aov_init_param.venc_param.en_aov[2*i+1] = XMEDIA_FALSE;
|
|
aov_init_param.venc_param.chn_max_size[2*i+1] = venc_config.chn_info[venc_chn[2*i+1]].str_buffer_size;
|
|
aov_init_param.venc_param.chn_threshold_size[2*i+1] = aov_init_param.venc_param.chn_max_size[2*i+1] / 5;
|
|
}
|
|
|
|
aov_init_param.suspend_time = suspend_time_ms;
|
|
aov_init_param.npu_notice_callback = sample_aov_set_work_mode_state;
|
|
aov_init_param.normal_resume_callback = sample_aov_normal_resume_func;
|
|
aov_init_param.normal_suspend_callback = sample_aov_normal_suspend_func;
|
|
|
|
ret = sample_aov_media_start(&aov_init_param);
|
|
if (XMEDIA_SUCCESS != ret) {
|
|
SAMPLE_ERR("media start fail \n");
|
|
goto exit6;
|
|
}
|
|
|
|
#ifdef SUPPORT_OSD_TIME
|
|
sample_osd_time_init();
|
|
|
|
mpp_chn.mod_id = MOD_ID_VENC;
|
|
mpp_chn.dev_id = 0;
|
|
mpp_chn.chn_id = venc_chn[0];
|
|
|
|
rgn_chn_attr.is_show = XMEDIA_TRUE;
|
|
rgn_chn_attr.type = XMEDIA_RGN_TYPE_OVERLAY;
|
|
|
|
overlay_chn = &rgn_chn_attr.attr.overlay_chn;
|
|
overlay_chn->alpha0 = 128;
|
|
overlay_chn->alpha1 = 128;
|
|
overlay_chn->qp_info.disable = XMEDIA_TRUE;
|
|
overlay_chn->qp_info.is_abs_qp = XMEDIA_FALSE;
|
|
overlay_chn->qp_info.qp_val = -2;
|
|
overlay_chn->dst = XMEDIA_RGN_ATTACH_JPEG_MAIN;
|
|
overlay_chn->point.x = 0;
|
|
overlay_chn->point.y = 0;
|
|
overlay_chn->layer = 0;
|
|
|
|
sample_osd_time_attach_to_chn(&mpp_chn, &rgn_chn_attr);
|
|
|
|
mpp_chn.mod_id = MOD_ID_VENC;
|
|
mpp_chn.dev_id = 0;
|
|
mpp_chn.chn_id = venc_chn[1];
|
|
sample_osd_time_attach_to_chn(&mpp_chn, &rgn_chn_attr);
|
|
|
|
mpp_chn.mod_id = MOD_ID_VENC;
|
|
mpp_chn.dev_id = 0;
|
|
mpp_chn.chn_id = venc_chn[2];
|
|
sample_osd_time_attach_to_chn(&mpp_chn, &rgn_chn_attr);
|
|
|
|
mpp_chn.mod_id = MOD_ID_VENC;
|
|
mpp_chn.dev_id = 0;
|
|
mpp_chn.chn_id = venc_chn[3];
|
|
sample_osd_time_attach_to_chn(&mpp_chn, &rgn_chn_attr);
|
|
|
|
sample_osd_time_start();
|
|
#endif
|
|
|
|
sample_aov_work_mode work_mode = MEDIA_WORK_NORMAL;
|
|
sample_aov_work_mode last_work_mode = MEDIA_WORK_NORMAL;
|
|
|
|
while(g_force_exit != XMEDIA_TRUE) {
|
|
sample_aov_get_work_mode_state(&work_mode);
|
|
if (work_mode != last_work_mode) {
|
|
if (work_mode == MEDIA_WORK_AOV) {
|
|
sample_comm_aov_set_work_mode(MEDIA_WORK_AOV);
|
|
last_work_mode = MEDIA_WORK_AOV;
|
|
}
|
|
|
|
if (work_mode == MEDIA_WORK_NORMAL) {
|
|
last_work_mode = MEDIA_WORK_NORMAL;
|
|
}
|
|
}
|
|
|
|
#ifdef SUPPORT_OSD_TIME
|
|
sample_osd_time_update(sleep_time, work_mode);
|
|
#endif
|
|
usleep(sleep_time);
|
|
}
|
|
|
|
sample_aov_media_stop();
|
|
sample_comm_aov_npu_destroy(svp_handle);
|
|
|
|
#ifdef SUPPORT_OSD_TIME
|
|
sample_osd_time_destroy();
|
|
#endif
|
|
|
|
exit6:
|
|
for(i = 0; i < media_pipe_num; i ++)
|
|
sample_comm_sys_vpss_unbind_venc(vpss_pipe[i], vpss_ochn[1], venc_chn[2*i+1]);
|
|
|
|
exit5:
|
|
for(i = 0; i < media_pipe_num; i ++)
|
|
sample_comm_sys_vpss_unbind_venc(vpss_pipe[i], vpss_ochn[0], venc_chn[2*i+0]);
|
|
|
|
exit4:
|
|
sample_comm_venc_stop(&venc_config);
|
|
|
|
exit3:
|
|
sample_comm_vpss_stop(&vpss_config);
|
|
|
|
exit2:
|
|
sample_comm_isp_stop(&isp_param);
|
|
|
|
exit1:
|
|
sample_comm_vi_stop(&vi_config);
|
|
|
|
exit0:
|
|
sample_comm_isp_exit(&isp_param);
|
|
sample_aov_sys_exit();
|
|
|
|
return ret;
|
|
}
|
|
|
|
xmedia_s32 sample_aov_single_sensor_ainr(xmedia_s32 frame_rate, xmedia_s32 suspend_time_ms)
|
|
{
|
|
xmedia_s32 ret = XMEDIA_SUCCESS;
|
|
xmedia_s32 i = 0;
|
|
xmedia_s32 blk_size = 0;
|
|
xmedia_s32 pool_num = 0;
|
|
xmedia_video_size pic_size = { 0 };
|
|
xmedia_video_size sub_pic_size = { 0 };
|
|
xmedia_video_size npu_pic_size = { 0 };
|
|
xmedia_vb_cal_cfg vb_cfg = {0};
|
|
xmedia_vb_base_info vb_base_info = {0};
|
|
sample_comm_video_param video_param = { 0 };
|
|
sample_sys_config sys_config = { 0 };
|
|
|
|
xmedia_s32 vi_dev = 0;
|
|
xmedia_s32 vi_pipe = 0;
|
|
xmedia_s32 vi_chn = 0;
|
|
sample_vi_config vi_config = { 0 };
|
|
|
|
xmedia_s32 sensor_type = sample_aov_sensor_type[0];
|
|
xmedia_u32 framerate = 0;
|
|
vi_sensor_info sensor_info = { 0 };
|
|
sample_isp_param isp_param = { 0 };
|
|
xmedia_isp_config isp_config = { 0 };
|
|
xmedia_bool mirror = XMEDIA_FALSE;
|
|
xmedia_bool flip = XMEDIA_FALSE;
|
|
bin_module_info pq_info = {0};
|
|
|
|
xmedia_s32 vpss_chnl = 0;
|
|
xmedia_s32 vpss_pipe = 0;
|
|
xmedia_s32 vpss_ochn[3] = { 0, 1 ,2};
|
|
sample_vpss_config vpss_config = { 0 };
|
|
xmedia_video_size vpss_ochn_size[VPSS_MAX_OCHN_NUM] = { 0 };
|
|
xmedia_u32 wrap_buffer_line = 0;
|
|
|
|
xmedia_s32 svp_handle = 0;
|
|
sample_comm_npu_workspace_info npu_work_sapce_info = {0};
|
|
|
|
xmedia_s32 venc_chnl = 0;
|
|
xmedia_s32 venc_chn[2] = { 0, 1 };
|
|
xmedia_s32 venc_chn_cnt = 2;
|
|
sample_venc_config venc_config = { 0 };
|
|
xmedia_venc_chn_param venc_chn_param;
|
|
sample_aov_init_param aov_init_param = {0};
|
|
|
|
misc_aov_isp_info isp_info = {0};
|
|
xmedia_u32 sleep_time = 500; //us
|
|
#ifdef SUPPORT_OSD_TIME
|
|
xmedia_chn_info mpp_chn;
|
|
xmedia_rgn_chn_attr rgn_chn_attr = {0};
|
|
xmedia_rgn_overlay_chn_attr *overlay_chn;
|
|
#endif
|
|
|
|
video_param.video_fmt = XMEDIA_VIDEO_FMT_LINEAR;
|
|
video_param.pixel_fmt = XMEDIA_VIDEO_PIXEL_FMT_YVU_SEMIPLANAR_420;
|
|
video_param.data_width = XMEDIA_VIDEO_DATA_WIDTH_8;
|
|
video_param.compress_mode = XMEDIA_VIDEO_COMPRESS_MODE_NONE;
|
|
|
|
sample_comm_vi_get_sensor_info(sensor_type, &sensor_info);
|
|
framerate = frame_rate;
|
|
|
|
if (!(sensor_info.bit_width == XMEDIA_VIDEO_DATA_WIDTH_10 || sensor_info.bit_width == XMEDIA_VIDEO_DATA_WIDTH_12)) {
|
|
SAMPLE_ERR("ainr bit width should be 10bit or 12bit\n");
|
|
return XMEDIA_FAILURE;
|
|
}
|
|
|
|
// sys init
|
|
for(i = 0; i < VI_MAX_PIPE_NUM; i++) {
|
|
sys_config.sys_conf.pipe_mode[i].vicap_viproc_mode = XMEDIA_WORK_MODE_OFFLINE;
|
|
sys_config.sys_conf.pipe_mode[i].viproc_vpss_mode = XMEDIA_WORK_MODE_ONLINE;
|
|
sys_config.sys_conf.pipe_mode[i].gdc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
|
|
}
|
|
|
|
pic_size.width = sensor_info.width;
|
|
pic_size.height = sensor_info.height;
|
|
|
|
/* wrap VB */
|
|
blk_size = sample_comm_sys_get_wrap_buffer_size(pic_size, video_param.video_fmt, video_param.pixel_fmt,
|
|
video_param.data_width, video_param.compress_mode, &wrap_buffer_line);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 1;
|
|
pool_num ++;
|
|
SAMPLE_PRT("wrap vb size : %d \n", blk_size);
|
|
|
|
vb_base_info.width = pic_size.width;
|
|
vb_base_info.height = pic_size.height;
|
|
vb_base_info.cmp_mode = XMEDIA_VIDEO_COMPRESS_MODE_NONE;
|
|
vb_base_info.bit_width = sensor_info.bit_width;
|
|
vb_base_info.pixel_fmt = XMEDIA_VIDEO_PIXEL_FMT_RAW;
|
|
vb_base_info.video_fmt = video_param.video_fmt;
|
|
vb_base_info.align = DEFAULT_ALIGN;
|
|
vb_base_info.ainr_attr.ainr_en = XMEDIA_TRUE;
|
|
vb_base_info.ainr_attr.ainr_direction = XMEDIA_VB_AINR_DIRECTION_INPUT;
|
|
|
|
xmedia_vb_get_buffer_config(&vb_base_info, &vb_cfg);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = vb_cfg.vb_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 2;
|
|
pool_num ++;
|
|
|
|
// vi proc
|
|
vb_base_info.ainr_attr.ainr_direction = XMEDIA_VB_AINR_DIRECTION_OUTPUT;
|
|
xmedia_vb_get_buffer_config(&vb_base_info, &vb_cfg);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = vb_cfg.vb_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 2;
|
|
pool_num ++;
|
|
|
|
sub_pic_size.width = 640;
|
|
sub_pic_size.height = 480;
|
|
blk_size = sample_comm_sys_get_buffer_size(sub_pic_size, video_param.video_fmt, video_param.pixel_fmt,
|
|
video_param.data_width, video_param.compress_mode);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 3;
|
|
pool_num ++;
|
|
|
|
npu_pic_size.width = 640;
|
|
npu_pic_size.height = 360;
|
|
blk_size = sample_comm_sys_get_buffer_size(npu_pic_size, video_param.video_fmt, video_param.pixel_fmt,
|
|
video_param.data_width, video_param.compress_mode);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 3;
|
|
pool_num ++;
|
|
|
|
sys_config.vb_conf.max_pool_cnt = pool_num;
|
|
sys_config.vb_conf.supplement_config = 1;
|
|
|
|
ret = sample_aov_sys_init(&sys_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("sys init failed !\n");
|
|
return ret;
|
|
}
|
|
|
|
isp_info.isp_pipe_num = 1;
|
|
isp_info.isp_pipe[0] = vi_pipe;
|
|
#ifdef SUPPORT_SENSOR_PWDN_MODE
|
|
isp_info.support_sensor_pwdn_standby[0] = XMEDIA_TRUE;
|
|
#endif
|
|
sample_comm_aov_misc_init(&isp_info);
|
|
g_misc_fd = sample_comm_aov_get_misc_fd();
|
|
|
|
vi_config.dev_info[vi_dev].dev_en = XMEDIA_TRUE;
|
|
vi_config.dev_info[vi_dev].dev_no = vi_dev;
|
|
vi_config.dev_info[vi_dev].sensor_type = sensor_type;
|
|
vi_config.pipe_info[vi_pipe].pipe_en = XMEDIA_TRUE;
|
|
vi_config.pipe_info[vi_pipe].pipe_no = vi_pipe;
|
|
vi_config.pipe_info[vi_pipe].chn_info[vi_chn].chn_en = XMEDIA_TRUE;
|
|
vi_config.pipe_info[vi_pipe].chn_info[vi_chn].chn_no = vi_chn;
|
|
vi_config.dev_bind_pipe[vi_dev].pipe[0] = vi_pipe;
|
|
vi_config.dev_bind_pipe[vi_dev].pipe[1] = -1;
|
|
|
|
isp_config.fps = framerate;
|
|
isp_config.mode_config.work_mode = XMEDIA_ISP_WORK_MODE_MASTER;
|
|
isp_config.mode_config.master_mode.blend_stat_enable = XMEDIA_FALSE;
|
|
isp_config.mode_config.master_mode.slave_num = 0;
|
|
isp_config.pixel_fmt = sensor_info.pixel_format;
|
|
isp_config.size.height = sensor_info.height;
|
|
isp_config.size.width = sensor_info.width;
|
|
isp_config.wdr_mode = sensor_info.wdr_mode;
|
|
|
|
// isp pipe init
|
|
isp_param.pipe[vi_pipe] = vi_pipe;
|
|
isp_param.isp_info[vi_pipe].isp_pipe_en = XMEDIA_TRUE;
|
|
isp_param.isp_info[vi_pipe].isp_sensor_en = XMEDIA_TRUE;
|
|
isp_param.isp_info[vi_pipe].sensor_type = sensor_type;
|
|
isp_param.isp_info[vi_pipe].disable_dynamic_fps = XMEDIA_TRUE;
|
|
isp_param.isp_info[vi_pipe].mirror = mirror;
|
|
isp_param.isp_info[vi_pipe].flip = flip;
|
|
memcpy(&(isp_param.isp_info[vi_pipe].isp_config), &isp_config, sizeof(xmedia_isp_config));
|
|
|
|
// isp init
|
|
ret = sample_comm_isp_init(&isp_param, &vi_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("isp init failed!\n");
|
|
goto exit0;
|
|
}
|
|
|
|
// vi start
|
|
ret = sample_comm_vi_start(&vi_config, &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("start vi failed!\n");
|
|
goto exit1;
|
|
}
|
|
|
|
// isp start
|
|
ret = sample_comm_isp_start(&isp_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("start isp failed!\n");
|
|
goto exit2;
|
|
}
|
|
|
|
// vpss config
|
|
ret = sample_comm_vpss_get_default_pipe_cfg(&vpss_config.pipe_info[vpss_pipe].pipe_config, pic_size, &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
|
|
vpss_ochn_size[0].width = sensor_info.width;
|
|
vpss_ochn_size[0].height = sensor_info.height;
|
|
vpss_ochn_size[1].width = sub_pic_size.width;
|
|
vpss_ochn_size[1].height = sub_pic_size.height;
|
|
vpss_ochn_size[2].width = npu_pic_size.width;
|
|
vpss_ochn_size[2].height = npu_pic_size.height;
|
|
|
|
vpss_config.pipe_info[vpss_pipe].pipe_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe].pipe_no = vpss_pipe;
|
|
|
|
vpss_chnl = vpss_ochn[0];
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_no = vpss_ochn[0];
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].wrap_attr.buf_line = wrap_buffer_line;
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].wrap_attr.enable = XMEDIA_TRUE;
|
|
ret = sample_comm_vpss_get_default_ochn_cfg(&vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config,
|
|
vpss_ochn_size[vpss_chnl], &video_param);
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config.cmp_mode = XMEDIA_VIDEO_COMPRESS_MODE_TILE_COMPACT;
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config.video_fmt = XMEDIA_VIDEO_FMT_TILE_32x4;
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config.depth = 0;
|
|
|
|
vpss_chnl = vpss_ochn[1];
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_no = vpss_ochn[1];
|
|
ret = sample_comm_vpss_get_default_ochn_cfg(&vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config,
|
|
vpss_ochn_size[vpss_chnl], &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config.depth = 0;
|
|
|
|
vpss_chnl = vpss_ochn[2];
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_no = vpss_ochn[2];
|
|
ret = sample_comm_vpss_get_default_ochn_cfg(&vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config,
|
|
vpss_ochn_size[vpss_chnl], &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
|
|
// vpss start
|
|
ret = sample_comm_vpss_start(&vpss_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("vpss start failed !\n");
|
|
goto exit2;
|
|
}
|
|
|
|
ret = sample_aov_create_npu_person_detect(&svp_handle);
|
|
if (XMEDIA_SUCCESS != ret) {
|
|
SAMPLE_ERR("npu init fail \n");
|
|
goto exit3;
|
|
}
|
|
|
|
npu_work_sapce_info.npu_modle_num = 2;
|
|
npu_work_sapce_info.npu_model_path[0] = ISP_AINR_MODEL_PATH;
|
|
npu_work_sapce_info.npu_model_path[1] = AOV_NPU_MODEL_PATH;
|
|
|
|
ret = sample_comm_sys_npu_acquire_workspace(&npu_work_sapce_info);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("acquire workspace fail\n");
|
|
goto exit4;
|
|
}
|
|
|
|
isp_param.ainr_model_path[vi_pipe] = npu_work_sapce_info.npu_model_path[0];
|
|
|
|
ret = sample_comm_isp_ainr_init(&isp_param, &vi_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("isp init failed!\n");
|
|
goto exit5;
|
|
} else {
|
|
SAMPLE_PRT("isp load ainr success!\n");
|
|
}
|
|
|
|
pq_info.vi.enable = XMEDIA_TRUE;
|
|
pq_info.vi.pipe = vi_pipe;
|
|
pq_info.mcf.enable = XMEDIA_FALSE;
|
|
pq_info.vpss.enable = XMEDIA_FALSE;
|
|
|
|
ret = sample_comm_pq_bin_import(&pq_info, SENSOR0_PQ_BIN_PATH);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("isp load pq bin failed!\n");
|
|
goto exit6;
|
|
} else {
|
|
SAMPLE_PRT("isp load pq success!\n");
|
|
}
|
|
|
|
ret = sample_comm_isp_enable_fpn(isp_param.pipe[vi_pipe], SENSOR0_FPN_BIN_PATH);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("isp load fpn bin failed!\n");
|
|
goto exit6;
|
|
} else {
|
|
SAMPLE_PRT("isp load fpn success!\n");
|
|
}
|
|
|
|
// venc init
|
|
venc_chnl = venc_chn[0];
|
|
venc_config.chn_info[venc_chnl].venc_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].venc_chn = venc_chnl;
|
|
venc_config.chn_info[venc_chnl].payload_type = PT_H265;
|
|
venc_config.chn_info[venc_chnl].rc_mode = VENC_RC_MODE_H265AVBR;
|
|
venc_config.chn_info[venc_chnl].str_buffer_size = ALIGN_UP(pic_size.width * pic_size.height * 2, 64);
|
|
venc_config.chn_info[venc_chnl].vui_info.vui_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].vui_info.stream_display_fps = frame_rate;
|
|
sample_comm_venc_get_default_chn_info(vpss_ochn_size[0], framerate, &venc_config.chn_info[venc_chnl]);
|
|
|
|
venc_chnl = venc_chn[1];
|
|
venc_config.chn_info[venc_chnl].venc_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].venc_chn = venc_chnl;
|
|
venc_config.chn_info[venc_chnl].payload_type = PT_H265;
|
|
venc_config.chn_info[venc_chnl].rc_mode = VENC_RC_MODE_H265AVBR;
|
|
venc_config.chn_info[venc_chnl].str_buffer_size = ALIGN_UP(sub_pic_size.width * sub_pic_size.height * 2, 64);
|
|
venc_config.chn_info[venc_chnl].vui_info.vui_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].vui_info.stream_display_fps = frame_rate;
|
|
sample_comm_venc_get_default_chn_info(vpss_ochn_size[1], framerate, &venc_config.chn_info[venc_chnl]);
|
|
|
|
ret = sample_comm_venc_start(&venc_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("venc start failed !\n");
|
|
goto exit7;
|
|
}
|
|
|
|
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("vpss bind venc failed !\n");
|
|
goto exit8;
|
|
}
|
|
|
|
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("vpss bind venc failed !\n");
|
|
goto exit9;
|
|
}
|
|
|
|
for(i = 0; i < venc_chn_cnt; i++) {
|
|
ret = xmedia_venc_get_chn_param(venc_chn[i], &venc_chn_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_venc_get_chn_param failed(0x%x), venc_chn[%d]!\n", ret, venc_chn[i]);
|
|
goto exit9;
|
|
}
|
|
|
|
venc_chn_param.max_strm_cnt = VENC_STR_BUF_DEFAULT_MAX_FRAME_COUNT;
|
|
|
|
ret = xmedia_venc_set_chn_param(venc_chn[i], &venc_chn_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_venc_set_chn_param failed(0x%x), venc_chn[%d]!\n", ret, venc_chn[i]);
|
|
goto exit9;
|
|
}
|
|
}
|
|
|
|
aov_init_param.isp_param.isp_pipe_num = 1;
|
|
aov_init_param.isp_param.isp_pipe[0] = isp_param.pipe[vi_pipe];
|
|
|
|
//vpss normal, aov should disable ochn
|
|
aov_init_param.vpss_param.vpss_pipe_num = 1;
|
|
aov_init_param.vpss_param.vpss_pipe[0] = vpss_pipe;
|
|
aov_init_param.vpss_param.vpss_ochn_num[0] = 1;
|
|
aov_init_param.vpss_param.vpss_ochn[0][0] = vpss_ochn[1];
|
|
|
|
aov_init_param.npu_param.npu_detect_num = 1;
|
|
aov_init_param.npu_param.vpss_pipe[0] = vpss_pipe;
|
|
aov_init_param.npu_param.vpss_ochn[0] = vpss_ochn[2];
|
|
aov_init_param.npu_param.npu_svp_handle[0] = svp_handle;
|
|
aov_init_param.npu_param.en_switch_mode[0] = XMEDIA_TRUE;
|
|
|
|
aov_init_param.venc_param.venc_chn_num = venc_chn_cnt;
|
|
aov_init_param.venc_param.venc_chn[0] = venc_chn[0];
|
|
aov_init_param.venc_param.en_aov[0] = XMEDIA_TRUE;
|
|
aov_init_param.venc_param.chn_max_size[0] = venc_config.chn_info[0].str_buffer_size;
|
|
aov_init_param.venc_param.chn_threshold_size[0] = aov_init_param.venc_param.chn_max_size[0] / 5;
|
|
aov_init_param.venc_param.venc_chn[1] = venc_chn[1];
|
|
aov_init_param.venc_param.en_aov[1] = XMEDIA_FALSE;
|
|
aov_init_param.venc_param.chn_max_size[1] = venc_config.chn_info[1].str_buffer_size;
|
|
aov_init_param.venc_param.chn_threshold_size[1] = aov_init_param.venc_param.chn_max_size[1] / 5;
|
|
|
|
aov_init_param.suspend_time = suspend_time_ms;
|
|
aov_init_param.npu_notice_callback = sample_aov_set_work_mode_state;
|
|
aov_init_param.normal_resume_callback = sample_aov_normal_resume_func;
|
|
aov_init_param.normal_suspend_callback = sample_aov_normal_suspend_func;
|
|
|
|
ret = sample_aov_media_start(&aov_init_param);
|
|
if (XMEDIA_SUCCESS != ret) {
|
|
SAMPLE_ERR("media start fail \n");
|
|
goto exit9;
|
|
}
|
|
|
|
#ifdef SUPPORT_OSD_TIME
|
|
sample_osd_time_init();
|
|
|
|
mpp_chn.mod_id = MOD_ID_VENC;
|
|
mpp_chn.dev_id = 0;
|
|
mpp_chn.chn_id = venc_chn[0];
|
|
|
|
rgn_chn_attr.is_show = XMEDIA_TRUE;
|
|
rgn_chn_attr.type = XMEDIA_RGN_TYPE_OVERLAY;
|
|
|
|
overlay_chn = &rgn_chn_attr.attr.overlay_chn;
|
|
overlay_chn->alpha0 = 128;
|
|
overlay_chn->alpha1 = 128;
|
|
overlay_chn->qp_info.disable = XMEDIA_TRUE;
|
|
overlay_chn->qp_info.is_abs_qp = XMEDIA_FALSE;
|
|
overlay_chn->qp_info.qp_val = -2;
|
|
overlay_chn->dst = XMEDIA_RGN_ATTACH_JPEG_MAIN;
|
|
overlay_chn->point.x = 0;
|
|
overlay_chn->point.y = 0;
|
|
overlay_chn->layer = 0;
|
|
|
|
sample_osd_time_attach_to_chn(&mpp_chn, &rgn_chn_attr);
|
|
|
|
mpp_chn.mod_id = MOD_ID_VENC;
|
|
mpp_chn.dev_id = 0;
|
|
mpp_chn.chn_id = venc_chn[1];
|
|
sample_osd_time_attach_to_chn(&mpp_chn, &rgn_chn_attr);
|
|
|
|
sample_osd_time_start();
|
|
#endif
|
|
|
|
sample_aov_work_mode work_mode = MEDIA_WORK_NORMAL;
|
|
sample_aov_work_mode last_work_mode = MEDIA_WORK_NORMAL;
|
|
|
|
while(g_force_exit != XMEDIA_TRUE) {
|
|
sample_aov_get_work_mode_state(&work_mode);
|
|
if (work_mode != last_work_mode) {
|
|
if (work_mode == MEDIA_WORK_AOV) {
|
|
sample_comm_aov_set_work_mode(MEDIA_WORK_AOV);
|
|
last_work_mode = MEDIA_WORK_AOV;
|
|
}
|
|
|
|
if (work_mode == MEDIA_WORK_NORMAL) {
|
|
last_work_mode = MEDIA_WORK_NORMAL;
|
|
}
|
|
}
|
|
|
|
#ifdef SUPPORT_OSD_TIME
|
|
sample_osd_time_update(sleep_time, work_mode);
|
|
#endif
|
|
usleep(sleep_time);
|
|
}
|
|
|
|
sample_aov_media_stop();
|
|
sample_comm_aov_npu_destroy(svp_handle);
|
|
|
|
#ifdef SUPPORT_OSD_TIME
|
|
sample_osd_time_destroy();
|
|
#endif
|
|
|
|
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
|
|
|
|
exit9:
|
|
|
|
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
|
|
exit8:
|
|
sample_comm_venc_stop(&venc_config);
|
|
|
|
exit7:
|
|
sample_comm_isp_disable_fpn(isp_param.pipe[vi_pipe]);
|
|
|
|
exit6:
|
|
sample_comm_isp_ainr_exit(&isp_param);
|
|
|
|
exit5:
|
|
sample_comm_sys_npu_release_workspace();
|
|
|
|
exit4:
|
|
sample_comm_aov_npu_destroy(svp_handle);
|
|
|
|
exit3:
|
|
sample_comm_vpss_stop(&vpss_config);
|
|
|
|
exit2:
|
|
sample_comm_isp_stop(&isp_param);
|
|
|
|
exit1:
|
|
sample_comm_vi_stop(&vi_config);
|
|
|
|
exit0:
|
|
sample_comm_isp_exit(&isp_param);
|
|
sample_aov_sys_exit();
|
|
|
|
return ret;
|
|
}
|
|
|
|
xmedia_s32 sample_aov_dual_sensor_ainr(xmedia_s32 frame_rate, xmedia_s32 suspend_time_ms)
|
|
{
|
|
xmedia_s32 ret = XMEDIA_SUCCESS;
|
|
xmedia_s32 i = 0;
|
|
xmedia_s32 blk_size = 0;
|
|
xmedia_s32 pool_num = 0;
|
|
xmedia_video_size pic_size[2] = { 0 };
|
|
xmedia_video_size sub_pic_size = { 0 };
|
|
xmedia_video_size npu_pic_size = { 0 };
|
|
xmedia_vb_cal_cfg vb_cfg = {0};
|
|
xmedia_vb_base_info vb_base_info = {0};
|
|
sample_comm_video_param video_param = { 0 };
|
|
sample_sys_config sys_config = { 0 };
|
|
xmedia_s32 media_pipe_num = 2;
|
|
|
|
xmedia_s32 vi_dev[2] = {0,1};
|
|
xmedia_s32 vi_pipe[2] = {0,1};
|
|
xmedia_s32 vi_chn = 0;
|
|
sample_vi_config vi_config = { 0 };
|
|
|
|
xmedia_s32 sensor_type[2] = {sample_aov_sensor_type[0], sample_aov_sensor_type[1]};
|
|
xmedia_u32 framerate = 0;
|
|
vi_sensor_info sensor_info[2] = { 0 };
|
|
sample_isp_param isp_param = { 0 };
|
|
xmedia_isp_config isp_config = { 0 };
|
|
xmedia_bool mirror = XMEDIA_FALSE;
|
|
xmedia_bool flip = XMEDIA_FALSE;
|
|
bin_module_info pq_info = {0};
|
|
|
|
xmedia_s32 vpss_chnl = 0;
|
|
xmedia_s32 vpss_pipe[2] = {0,1};
|
|
xmedia_s32 vpss_ochn[3] = { 0, 1 ,2};
|
|
sample_vpss_config vpss_config = { 0 };
|
|
xmedia_video_size vpss_ochn_size[2][VPSS_MAX_OCHN_NUM] = { 0 };
|
|
xmedia_u32 wrap_buffer_line[2] = {0};
|
|
xmedia_vpss_wrap_buf_share_config wrap_share_cfg = { 0 };
|
|
|
|
xmedia_s32 svp_handle = 0;
|
|
sample_comm_npu_workspace_info npu_work_sapce_info = {0};
|
|
|
|
xmedia_s32 venc_chnl = 0;
|
|
xmedia_s32 venc_chn[4] = { 0, 1, 2, 3 };
|
|
xmedia_s32 venc_chn_cnt = 4;
|
|
sample_venc_config venc_config = { 0 };
|
|
xmedia_venc_chn_param venc_chn_param;
|
|
sample_aov_init_param aov_init_param = {0};
|
|
|
|
misc_aov_isp_info isp_info = {0};
|
|
xmedia_u32 sleep_time = 500; //us
|
|
#ifdef SUPPORT_OSD_TIME
|
|
xmedia_chn_info mpp_chn;
|
|
xmedia_rgn_chn_attr rgn_chn_attr = {0};
|
|
xmedia_rgn_overlay_chn_attr *overlay_chn;
|
|
#endif
|
|
|
|
video_param.video_fmt = XMEDIA_VIDEO_FMT_LINEAR;
|
|
video_param.pixel_fmt = XMEDIA_VIDEO_PIXEL_FMT_YVU_SEMIPLANAR_420;
|
|
video_param.data_width = XMEDIA_VIDEO_DATA_WIDTH_8;
|
|
video_param.compress_mode = XMEDIA_VIDEO_COMPRESS_MODE_NONE;
|
|
|
|
framerate = frame_rate;
|
|
|
|
|
|
// sys init
|
|
for(i = 0; i < VI_MAX_PIPE_NUM; i++) {
|
|
sys_config.sys_conf.pipe_mode[i].vicap_viproc_mode = XMEDIA_WORK_MODE_OFFLINE;
|
|
sys_config.sys_conf.pipe_mode[i].viproc_vpss_mode = XMEDIA_WORK_MODE_ONLINE;
|
|
sys_config.sys_conf.pipe_mode[i].gdc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
|
|
}
|
|
|
|
/* wrap VB */
|
|
wrap_share_cfg.enable = XMEDIA_TRUE;
|
|
wrap_share_cfg.wrap_pos = XMEDIA_VPSS_WRAP_POS_PHY_OCHN;
|
|
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
sample_comm_vi_get_sensor_info(sensor_type[i], &sensor_info[i]);
|
|
|
|
if (!(sensor_info[i].bit_width == XMEDIA_VIDEO_DATA_WIDTH_10 || sensor_info[i].bit_width == XMEDIA_VIDEO_DATA_WIDTH_12)) {
|
|
SAMPLE_ERR("ainr bit width should be 10bit or 12bit\n");
|
|
return XMEDIA_FAILURE;
|
|
}
|
|
|
|
pic_size[i].width = sensor_info[i].width;
|
|
pic_size[i].height = sensor_info[i].height;
|
|
|
|
/* wrap VB */
|
|
blk_size = sample_comm_sys_get_wrap_buffer_size(pic_size[i], video_param.video_fmt, video_param.pixel_fmt,
|
|
video_param.data_width, video_param.compress_mode, &wrap_buffer_line[i]);
|
|
if(wrap_share_cfg.enable == XMEDIA_TRUE) {
|
|
wrap_share_cfg.buf_size = (wrap_share_cfg.buf_size > blk_size) ? wrap_share_cfg.buf_size : blk_size;
|
|
if(i == 1) {
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = wrap_share_cfg.buf_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 1;
|
|
pool_num ++;
|
|
SAMPLE_PRT("wrap share vb size : %d \n", wrap_share_cfg.buf_size);
|
|
}
|
|
}
|
|
else {
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 1;
|
|
pool_num ++;
|
|
SAMPLE_PRT("sensor%d wrap vb size : %d \n", i, blk_size);
|
|
}
|
|
}
|
|
|
|
if(pic_size[0].width * pic_size[0].height >= pic_size[1].width * pic_size[1].height) {
|
|
i = 0;
|
|
}
|
|
else {
|
|
i = 1;
|
|
}
|
|
vb_base_info.width = pic_size[i].width;
|
|
vb_base_info.height = pic_size[i].height;
|
|
vb_base_info.cmp_mode = XMEDIA_VIDEO_COMPRESS_MODE_NONE;
|
|
vb_base_info.bit_width = sensor_info[i].bit_width;
|
|
vb_base_info.pixel_fmt = XMEDIA_VIDEO_PIXEL_FMT_RAW;
|
|
vb_base_info.video_fmt = video_param.video_fmt;
|
|
vb_base_info.align = DEFAULT_ALIGN;
|
|
vb_base_info.ainr_attr.ainr_en = XMEDIA_TRUE;
|
|
vb_base_info.ainr_attr.ainr_direction = XMEDIA_VB_AINR_DIRECTION_INPUT;
|
|
|
|
xmedia_vb_get_buffer_config(&vb_base_info, &vb_cfg);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = vb_cfg.vb_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 4;
|
|
pool_num ++;
|
|
|
|
// vi proc
|
|
vb_base_info.ainr_attr.ainr_direction = XMEDIA_VB_AINR_DIRECTION_OUTPUT;
|
|
xmedia_vb_get_buffer_config(&vb_base_info, &vb_cfg);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = vb_cfg.vb_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 2;
|
|
pool_num ++;
|
|
|
|
sub_pic_size.width = 640;
|
|
sub_pic_size.height = 480;
|
|
blk_size = sample_comm_sys_get_buffer_size(sub_pic_size, video_param.video_fmt, video_param.pixel_fmt,
|
|
video_param.data_width, video_param.compress_mode);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 6;
|
|
pool_num ++;
|
|
|
|
npu_pic_size.width = 640;
|
|
npu_pic_size.height = 360;
|
|
blk_size = sample_comm_sys_get_buffer_size(npu_pic_size, video_param.video_fmt, video_param.pixel_fmt,
|
|
video_param.data_width, video_param.compress_mode);
|
|
sys_config.vb_conf.common_pool[pool_num].block_size = blk_size;
|
|
sys_config.vb_conf.common_pool[pool_num].block_cnt = 6;
|
|
pool_num ++;
|
|
|
|
sys_config.vb_conf.max_pool_cnt = pool_num;
|
|
sys_config.vb_conf.supplement_config = 1;
|
|
|
|
ret = sample_aov_sys_init(&sys_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("sys init failed !\n");
|
|
return ret;
|
|
}
|
|
|
|
isp_info.isp_pipe_num = 2;
|
|
isp_info.isp_pipe[0] = vi_pipe[0];
|
|
isp_info.isp_pipe[1] = vi_pipe[1];
|
|
#ifdef SUPPORT_SENSOR_PWDN_MODE
|
|
isp_info.support_sensor_pwdn_standby[0] = XMEDIA_TRUE;
|
|
isp_info.support_sensor_pwdn_standby[1] = XMEDIA_TRUE;
|
|
#endif
|
|
sample_comm_aov_misc_init(&isp_info);
|
|
g_misc_fd = sample_comm_aov_get_misc_fd();
|
|
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
vi_config.dev_info[vi_dev[i]].dev_en = XMEDIA_TRUE;
|
|
vi_config.dev_info[vi_dev[i]].dev_no = vi_dev[i];
|
|
vi_config.dev_info[vi_dev[i]].sensor_type = sensor_type[i];
|
|
vi_config.pipe_info[vi_pipe[i]].pipe_en = XMEDIA_TRUE;
|
|
vi_config.pipe_info[vi_pipe[i]].pipe_no = vi_pipe[i];
|
|
vi_config.pipe_info[vi_pipe[i]].chn_info[vi_chn].chn_en = XMEDIA_TRUE;
|
|
vi_config.pipe_info[vi_pipe[i]].chn_info[vi_chn].chn_no = vi_chn;
|
|
vi_config.dev_bind_pipe[vi_dev[i]].pipe[0] = vi_pipe[i];
|
|
vi_config.dev_bind_pipe[vi_dev[i]].pipe[1] = -1;
|
|
|
|
if (sensor_type[i] == SMART_SC235HAI_MIPI_2M_2LANE_30FPS_10BIT ||
|
|
sensor_type[i] == SMART_SC485SL_MIPI_4M_30FPS_2LANE_12BIT) {
|
|
mirror = XMEDIA_TRUE;
|
|
flip = XMEDIA_TRUE;
|
|
}
|
|
|
|
isp_config.fps = framerate;
|
|
isp_config.mode_config.work_mode = XMEDIA_ISP_WORK_MODE_MASTER;
|
|
isp_config.mode_config.master_mode.blend_stat_enable = XMEDIA_FALSE;
|
|
isp_config.mode_config.master_mode.slave_num = 0;
|
|
isp_config.pixel_fmt = sensor_info[i].pixel_format;
|
|
isp_config.size.height = sensor_info[i].height;
|
|
isp_config.size.width = sensor_info[i].width;
|
|
isp_config.wdr_mode = sensor_info[i].wdr_mode;
|
|
|
|
// isp pipe init
|
|
isp_param.pipe[vi_pipe[i]] = vi_pipe[i];
|
|
isp_param.isp_info[vi_pipe[i]].isp_pipe_en = XMEDIA_TRUE;
|
|
isp_param.isp_info[vi_pipe[i]].isp_sensor_en = XMEDIA_TRUE;
|
|
isp_param.isp_info[vi_pipe[i]].sensor_type = sensor_type[i];
|
|
isp_param.isp_info[vi_pipe[i]].disable_dynamic_fps = XMEDIA_TRUE;
|
|
isp_param.isp_info[vi_pipe[i]].mirror = mirror;
|
|
isp_param.isp_info[vi_pipe[i]].flip = flip;
|
|
memcpy(&(isp_param.isp_info[vi_pipe[i]].isp_config), &isp_config, sizeof(xmedia_isp_config));
|
|
}
|
|
|
|
// isp init
|
|
ret = sample_comm_isp_init(&isp_param, &vi_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("isp init failed!\n");
|
|
goto exit0;
|
|
}
|
|
|
|
// vi start
|
|
ret = sample_comm_vi_start(&vi_config, &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("start vi failed!\n");
|
|
goto exit1;
|
|
}
|
|
|
|
// isp start
|
|
ret = sample_comm_isp_start(&isp_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("start isp failed!\n");
|
|
goto exit2;
|
|
}
|
|
|
|
// vpss config
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
ret = sample_comm_vpss_get_default_pipe_cfg(&vpss_config.pipe_info[vpss_pipe[i]].pipe_config, pic_size[i], &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
|
|
vpss_ochn_size[vpss_pipe[i]][0].width = sensor_info[i].width;
|
|
vpss_ochn_size[vpss_pipe[i]][0].height = sensor_info[i].height;
|
|
vpss_ochn_size[vpss_pipe[i]][1].width = sub_pic_size.width;
|
|
vpss_ochn_size[vpss_pipe[i]][1].height = sub_pic_size.height;
|
|
vpss_ochn_size[vpss_pipe[i]][2].width = npu_pic_size.width;
|
|
vpss_ochn_size[vpss_pipe[i]][2].height = npu_pic_size.height;
|
|
|
|
vpss_config.pipe_info[vpss_pipe[i]].pipe_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe[i]].pipe_no = vpss_pipe[i];
|
|
|
|
vpss_chnl = vpss_ochn[0];
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_no = vpss_ochn[0];
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].wrap_attr.buf_line = wrap_buffer_line[i];
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].wrap_attr.enable = XMEDIA_TRUE;
|
|
ret = sample_comm_vpss_get_default_ochn_cfg(&vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config,
|
|
vpss_ochn_size[vpss_pipe[i]][vpss_chnl], &video_param);
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.cmp_mode = XMEDIA_VIDEO_COMPRESS_MODE_TILE_COMPACT;
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.video_fmt = XMEDIA_VIDEO_FMT_TILE_32x4;
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.depth = 0;
|
|
|
|
vpss_chnl = vpss_ochn[1];
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_no = vpss_ochn[1];
|
|
ret = sample_comm_vpss_get_default_ochn_cfg(&vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config,
|
|
vpss_ochn_size[vpss_pipe[i]][vpss_chnl], &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.depth = 0;
|
|
|
|
vpss_chnl = vpss_ochn[2];
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_en = XMEDIA_TRUE;
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_no = vpss_ochn[2];
|
|
ret = sample_comm_vpss_get_default_ochn_cfg(&vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config,
|
|
vpss_ochn_size[vpss_pipe[i]][vpss_chnl], &video_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("get default pipe cfg failed !\n");
|
|
goto exit2;
|
|
}
|
|
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.depth = 4;
|
|
}
|
|
|
|
// set wrap buf share
|
|
if(wrap_share_cfg.enable == XMEDIA_TRUE) {
|
|
ret = xmedia_vpss_set_wrap_buf_share_config(&wrap_share_cfg);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("set wrap buf share failed !\n");
|
|
goto exit2;
|
|
}
|
|
}
|
|
|
|
// vpss start
|
|
ret = sample_comm_vpss_start(&vpss_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("vpss start failed !\n");
|
|
goto exit2;
|
|
}
|
|
|
|
ret = sample_aov_create_npu_person_detect(&svp_handle);
|
|
if (XMEDIA_SUCCESS != ret) {
|
|
SAMPLE_ERR("npu init fail \n");
|
|
goto exit3;
|
|
}
|
|
|
|
npu_work_sapce_info.npu_modle_num = 2;
|
|
npu_work_sapce_info.npu_model_path[0] = ISP_AINR_MODEL_PATH;
|
|
npu_work_sapce_info.npu_model_path[1] = AOV_NPU_MODEL_PATH;
|
|
|
|
ret = sample_comm_sys_npu_acquire_workspace(&npu_work_sapce_info);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("acquire workspace fail\n");
|
|
goto exit4;
|
|
}
|
|
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
isp_param.ainr_model_path[vi_pipe[i]] = npu_work_sapce_info.npu_model_path[0];
|
|
}
|
|
|
|
ret = sample_comm_isp_ainr_init(&isp_param, &vi_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("isp init failed!\n");
|
|
goto exit5;
|
|
} else {
|
|
SAMPLE_PRT("isp load ainr success!\n");
|
|
}
|
|
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
pq_info.vi.enable = XMEDIA_TRUE;
|
|
pq_info.vi.pipe = vi_pipe[i];
|
|
pq_info.mcf.enable = XMEDIA_FALSE;
|
|
pq_info.vpss.enable = XMEDIA_FALSE;
|
|
|
|
ret = sample_comm_pq_bin_import(&pq_info, i == 0? SENSOR0_PQ_BIN_PATH:SENSOR1_PQ_BIN_PATH);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("isp load pq bin failed!\n");
|
|
goto exit6;
|
|
} else {
|
|
SAMPLE_PRT("isp load pq success!\n");
|
|
}
|
|
|
|
ret = sample_comm_isp_enable_fpn(isp_param.pipe[vi_pipe[i]], i == 0? SENSOR0_FPN_BIN_PATH:SENSOR1_FPN_BIN_PATH);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("isp load fpn bin failed!\n");
|
|
goto exit6;
|
|
} else {
|
|
SAMPLE_PRT("isp load fpn success!\n");
|
|
}
|
|
}
|
|
|
|
// venc init
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
venc_chnl = venc_chn[2*i+0];
|
|
venc_config.chn_info[venc_chnl].venc_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].venc_chn = venc_chnl;
|
|
venc_config.chn_info[venc_chnl].payload_type = PT_H265;
|
|
venc_config.chn_info[venc_chnl].rc_mode = VENC_RC_MODE_H265AVBR;
|
|
//venc_config.chn_info[venc_chnl].str_buffer_size = ALIGN_UP(pic_size[i].width * pic_size[i].height * 2, 64);
|
|
venc_config.chn_info[venc_chnl].str_buffer_size = ALIGN_UP(pic_size[i].width * pic_size[i].height, 64);
|
|
venc_config.chn_info[venc_chnl].vui_info.vui_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].vui_info.stream_display_fps = frame_rate;
|
|
sample_comm_venc_get_default_chn_info(vpss_ochn_size[vpss_pipe[i]][0], framerate, &venc_config.chn_info[venc_chnl]);
|
|
|
|
venc_chnl = venc_chn[2*i+1];
|
|
venc_config.chn_info[venc_chnl].venc_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].venc_chn = venc_chnl;
|
|
venc_config.chn_info[venc_chnl].payload_type = PT_H265;
|
|
venc_config.chn_info[venc_chnl].rc_mode = VENC_RC_MODE_H265AVBR;
|
|
//venc_config.chn_info[venc_chnl].str_buffer_size = ALIGN_UP(sub_pic_size.width * sub_pic_size.height * 2, 64);
|
|
venc_config.chn_info[venc_chnl].str_buffer_size = ALIGN_UP(sub_pic_size.width * sub_pic_size.height, 64);
|
|
venc_config.chn_info[venc_chnl].vui_info.vui_en = XMEDIA_TRUE;
|
|
venc_config.chn_info[venc_chnl].vui_info.stream_display_fps = frame_rate;
|
|
sample_comm_venc_get_default_chn_info(vpss_ochn_size[vpss_pipe[i]][1], framerate, &venc_config.chn_info[venc_chnl]);
|
|
}
|
|
|
|
ret = sample_comm_venc_start(&venc_config);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("venc start failed !\n");
|
|
goto exit7;
|
|
}
|
|
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe[i], vpss_ochn[0], venc_chn[2*i+0]);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("vpss bind venc failed !\n");
|
|
goto exit8;
|
|
}
|
|
|
|
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe[i], vpss_ochn[1], venc_chn[2*i+1]);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("vpss bind venc failed !\n");
|
|
goto exit9;
|
|
}
|
|
}
|
|
|
|
for(i = 0; i < venc_chn_cnt; i++) {
|
|
ret = xmedia_venc_get_chn_param(venc_chn[i], &venc_chn_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_venc_get_chn_param failed(0x%x), venc_chn[%d]!\n", ret, venc_chn[i]);
|
|
goto exit9;
|
|
}
|
|
|
|
venc_chn_param.max_strm_cnt = VENC_STR_BUF_DEFAULT_MAX_FRAME_COUNT;
|
|
|
|
ret = xmedia_venc_set_chn_param(venc_chn[i], &venc_chn_param);
|
|
if (ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_venc_set_chn_param failed(0x%x), venc_chn[%d]!\n", ret, venc_chn[i]);
|
|
goto exit9;
|
|
}
|
|
}
|
|
|
|
aov_init_param.isp_param.isp_pipe_num = 2;
|
|
aov_init_param.vpss_param.vpss_pipe_num = 2;
|
|
aov_init_param.npu_param.npu_detect_num = 2;
|
|
aov_init_param.venc_param.venc_chn_num = venc_chn_cnt;
|
|
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
aov_init_param.isp_param.isp_pipe[i] = isp_param.pipe[vi_pipe[i]];
|
|
|
|
//vpss normal, aov should disable ochn
|
|
aov_init_param.vpss_param.vpss_pipe[i] = vpss_pipe[i];
|
|
aov_init_param.vpss_param.vpss_ochn_num[i] = 1;
|
|
aov_init_param.vpss_param.vpss_ochn[i][0] = vpss_ochn[1];
|
|
|
|
aov_init_param.npu_param.vpss_pipe[i] = vpss_pipe[i];
|
|
aov_init_param.npu_param.vpss_ochn[i] = vpss_ochn[2];
|
|
aov_init_param.npu_param.npu_svp_handle[i] = svp_handle;
|
|
aov_init_param.npu_param.en_switch_mode[i] = XMEDIA_TRUE;
|
|
|
|
aov_init_param.venc_param.venc_chn[2*i] = venc_chn[2*i];
|
|
aov_init_param.venc_param.en_aov[2*i] = XMEDIA_TRUE;
|
|
aov_init_param.venc_param.chn_max_size[2*i] = venc_config.chn_info[venc_chn[2*i]].str_buffer_size;
|
|
aov_init_param.venc_param.chn_threshold_size[2*i] = aov_init_param.venc_param.chn_max_size[2*i] / 5;
|
|
|
|
aov_init_param.venc_param.venc_chn[2*i+1] = venc_chn[2*i+1];
|
|
aov_init_param.venc_param.en_aov[2*i+1] = XMEDIA_FALSE;
|
|
aov_init_param.venc_param.chn_max_size[2*i+1] = venc_config.chn_info[2*i+1].str_buffer_size;
|
|
aov_init_param.venc_param.chn_threshold_size[2*i+1] = aov_init_param.venc_param.chn_max_size[2*i+1] / 5;
|
|
}
|
|
|
|
aov_init_param.suspend_time = suspend_time_ms;
|
|
aov_init_param.npu_notice_callback = sample_aov_set_work_mode_state;
|
|
aov_init_param.normal_resume_callback = sample_aov_normal_resume_func;
|
|
aov_init_param.normal_suspend_callback = sample_aov_normal_suspend_func;
|
|
|
|
ret = sample_aov_media_start(&aov_init_param);
|
|
if (XMEDIA_SUCCESS != ret) {
|
|
SAMPLE_ERR("media start fail \n");
|
|
goto exit9;
|
|
}
|
|
|
|
#ifdef SUPPORT_OSD_TIME
|
|
sample_osd_time_init();
|
|
|
|
mpp_chn.mod_id = MOD_ID_VENC;
|
|
mpp_chn.dev_id = 0;
|
|
mpp_chn.chn_id = venc_chn[0];
|
|
|
|
rgn_chn_attr.is_show = XMEDIA_TRUE;
|
|
rgn_chn_attr.type = XMEDIA_RGN_TYPE_OVERLAY;
|
|
|
|
overlay_chn = &rgn_chn_attr.attr.overlay_chn;
|
|
overlay_chn->alpha0 = 128;
|
|
overlay_chn->alpha1 = 128;
|
|
overlay_chn->qp_info.disable = XMEDIA_TRUE;
|
|
overlay_chn->qp_info.is_abs_qp = XMEDIA_FALSE;
|
|
overlay_chn->qp_info.qp_val = -2;
|
|
overlay_chn->dst = XMEDIA_RGN_ATTACH_JPEG_MAIN;
|
|
overlay_chn->point.x = 0;
|
|
overlay_chn->point.y = 0;
|
|
overlay_chn->layer = 0;
|
|
|
|
sample_osd_time_attach_to_chn(&mpp_chn, &rgn_chn_attr);
|
|
|
|
mpp_chn.mod_id = MOD_ID_VENC;
|
|
mpp_chn.dev_id = 0;
|
|
mpp_chn.chn_id = venc_chn[1];
|
|
sample_osd_time_attach_to_chn(&mpp_chn, &rgn_chn_attr);
|
|
|
|
mpp_chn.mod_id = MOD_ID_VENC;
|
|
mpp_chn.dev_id = 0;
|
|
mpp_chn.chn_id = venc_chn[2];
|
|
sample_osd_time_attach_to_chn(&mpp_chn, &rgn_chn_attr);
|
|
|
|
mpp_chn.mod_id = MOD_ID_VENC;
|
|
mpp_chn.dev_id = 0;
|
|
mpp_chn.chn_id = venc_chn[3];
|
|
sample_osd_time_attach_to_chn(&mpp_chn, &rgn_chn_attr);
|
|
|
|
sample_osd_time_start();
|
|
#endif
|
|
|
|
sample_aov_work_mode work_mode = MEDIA_WORK_NORMAL;
|
|
sample_aov_work_mode last_work_mode = MEDIA_WORK_NORMAL;
|
|
|
|
while(g_force_exit != XMEDIA_TRUE) {
|
|
sample_aov_get_work_mode_state(&work_mode);
|
|
if (work_mode != last_work_mode) {
|
|
if (work_mode == MEDIA_WORK_AOV) {
|
|
sample_comm_aov_set_work_mode(MEDIA_WORK_AOV);
|
|
last_work_mode = MEDIA_WORK_AOV;
|
|
}
|
|
|
|
if (work_mode == MEDIA_WORK_NORMAL) {
|
|
last_work_mode = MEDIA_WORK_NORMAL;
|
|
}
|
|
}
|
|
|
|
#ifdef SUPPORT_OSD_TIME
|
|
sample_osd_time_update(sleep_time, work_mode);
|
|
#endif
|
|
usleep(sleep_time);
|
|
}
|
|
|
|
sample_aov_media_stop();
|
|
sample_comm_aov_npu_destroy(svp_handle);
|
|
|
|
#ifdef SUPPORT_OSD_TIME
|
|
sample_osd_time_destroy();
|
|
#endif
|
|
|
|
exit9:
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
sample_comm_sys_vpss_unbind_venc(vpss_pipe[i], vpss_ochn[0], venc_chn[2*i+0]);
|
|
sample_comm_sys_vpss_unbind_venc(vpss_pipe[i], vpss_ochn[1], venc_chn[2*i+1]);
|
|
}
|
|
exit8:
|
|
sample_comm_venc_stop(&venc_config);
|
|
|
|
exit7:
|
|
for(i = 0; i < media_pipe_num; i ++) {
|
|
sample_comm_isp_disable_fpn(isp_param.pipe[vi_pipe[i]]);
|
|
}
|
|
|
|
exit6:
|
|
sample_comm_isp_ainr_exit(&isp_param);
|
|
|
|
exit5:
|
|
sample_comm_sys_npu_release_workspace();
|
|
|
|
exit4:
|
|
sample_comm_aov_npu_destroy(svp_handle);
|
|
|
|
exit3:
|
|
sample_comm_vpss_stop(&vpss_config);
|
|
|
|
exit2:
|
|
sample_comm_isp_stop(&isp_param);
|
|
|
|
exit1:
|
|
sample_comm_vi_stop(&vi_config);
|
|
|
|
exit0:
|
|
sample_comm_isp_exit(&isp_param);
|
|
sample_aov_sys_exit();
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
xmedia_void sample_aov_usage(xmedia_char *args)
|
|
{
|
|
printf("\n"
|
|
"***************************************************************\n"
|
|
"Usage: %s [work_mode] [frame_rate] [suspend_time]\n"
|
|
"work_mode: \n"
|
|
" 0: aov single sensor stnr olny. \n"
|
|
" 1: aov single sensor ainr. \n"
|
|
" 2: aov dual sensor stnr olny. \n"
|
|
" 3: aov dual sensor ainr. \n"
|
|
"frame_rate: (12 - 25fps). \n"
|
|
"suspend_time: ms (1000). \n"
|
|
"e.g: ./sample_aov 0 25 1000. \n"
|
|
"***************************************************************\n"
|
|
"\n",
|
|
args);
|
|
return;
|
|
}
|
|
|
|
xmedia_void sample_aov_handle_sig(xmedia_s32 signo)
|
|
{
|
|
if (SIGINT == signo || SIGTSTP == signo || SIGTERM == signo) {
|
|
g_force_exit = XMEDIA_TRUE;
|
|
}
|
|
}
|
|
|
|
xmedia_s32 main(xmedia_s32 argc, xmedia_char **argv)
|
|
{
|
|
xmedia_s32 ret = XMEDIA_SUCCESS;
|
|
xmedia_pm_init_param pm_param = {0};
|
|
xmedia_s32 work_mode = 0;
|
|
xmedia_s32 frame_rate = 0;
|
|
xmedia_s32 suspend_time = 0;
|
|
|
|
signal(SIGINT, sample_aov_handle_sig);
|
|
signal(SIGTERM, sample_aov_handle_sig);
|
|
|
|
if (argc < 4) {
|
|
sample_aov_usage(argv[0]);
|
|
return 0;
|
|
}
|
|
|
|
work_mode = atoi(argv[1]);
|
|
frame_rate = atoi(argv[2]);
|
|
suspend_time = atoi(argv[3]);
|
|
|
|
pm_param.type = PM_INIT_TYPE_STR;
|
|
|
|
ret = xmedia_pm_init_ext(&pm_param);
|
|
if (XMEDIA_SUCCESS != ret) {
|
|
SAMPLE_PRT("pm init fail \n");
|
|
}
|
|
|
|
switch (work_mode) {
|
|
case 0:
|
|
ret = sample_aov_single_sensor_stnr_only(frame_rate, suspend_time);
|
|
break;
|
|
case 1:
|
|
ret = sample_aov_single_sensor_ainr(frame_rate, suspend_time);
|
|
break;
|
|
case 2:
|
|
ret = sample_aov_dual_sensor_stnr_only(frame_rate, suspend_time);
|
|
break;
|
|
case 3:
|
|
ret = sample_aov_dual_sensor_ainr(frame_rate, suspend_time);
|
|
break;
|
|
|
|
default:
|
|
sample_aov_usage(argv[0]);
|
|
return 0;
|
|
}
|
|
|
|
if (XMEDIA_SUCCESS == ret) {
|
|
SAMPLE_PRT("program exit normally!\n");
|
|
} else {
|
|
SAMPLE_PRT("program exit abnormally!\n");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|