Files

5177 lines
191 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 <sys/time.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include "sample_comm.h"
#include "sample_comm_sys.h"
#include "sample_comm_vi.h"
#include "sample_comm_vpss.h"
#include "sample_comm_vo.h"
#include "sample_comm_isp.h"
#include "sample_comm_vgs.h"
#include "sample_comm_venc.h"
#include "sample_comm_ircut.h"
#include "sample_comm_livestream.h"
#include "sample_comm_tp.h"
#define SAMPLE_STITCH_DEBUG 0
#define SAMPLE_STITCH_LUMA_ADJ_TIME 50
#define SAMPLE_STITCH_MIN_LUMA_DIFF 2
#define SAMPLE_STITCH_MAX_LUMA_GAIN 128
#define ISP_DYNAMIC_SWITCH_SLEEP_TIME 5000
static sample_comm_sensor_type sample_vio_sensor_type[MAX_SENSOR_NUM] = { SENSOR0_TYPE, SENSOR1_TYPE, SENSOR2_TYPE,
SENSOR3_TYPE, SENSOR4_TYPE };
static sample_comm_screen_type sample_vo_screen_type[MAX_SCREEN_NUM] = { SCREEN0_TYPE, SCREEN0_TYPE};
static xmedia_bool g_force_exit = XMEDIA_FALSE;
static xmedia_bool g_venc_use = XMEDIA_TRUE;
xmedia_void sample_vio_usage(xmedia_char *args)
{
printf("\n"
"***************************************************************\n"
"Usage: %s [work_mode] [stream_mode]\n"
"work_mode: \n"
" 0: vi online vpss online\n"
" 1: vi offline vpss online (can use for 4K sensor)\n"
" 2: vi offline vpss offline\n"
" 3: vi online/offline vpss online wdr (default vi online)\n"
" 4: vi offline vpss offline switch linear and wdr\n"
" 5: vi offline vpss offline switch resolution\n"
" 6: vi offline vpss online double sensor\n"
" 7: vi offline vpss online double sensor splicing \n"
" 8: vi online vpss online double sensor(switch)\n"
" 9: vi offline vpss offline preroll switch to normal and then switch to readback\n"
" 10: vi offline vpss online ldc\n"
" 11: vi offline vpss online ahd mipi\n"
" 12: vi offline vpss online ext switch x4\n"
" 13: vi_offline_vpss_online_switch_to_relay_zoom\n"
"stream_mode: (default 1)\n"
" 0: VO output\n"
" 1: VENC output\n"
"e.g: ./sample_vio 0 || ./sample_vio 0 0\n"
"***************************************************************\n"
"\n",
args);
return;
}
xmedia_s32 sample_vio_sys_init(sample_sys_config *sys_config)
{
xmedia_s32 ret = 0;
ret = sample_comm_vb_init(sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sample_comm_vb_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_vo_init();
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sample_comm_vo_init failed!\n");
return ret;
}
ret = sample_comm_venc_init();
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sample_comm_venc_init failed!\n");
return ret;
}
return XMEDIA_SUCCESS;
}
xmedia_void sample_vio_sys_exit(void)
{
sample_comm_venc_stop_get_stream();
sample_comm_venc_exit();
sample_comm_vo_exit();
sample_comm_vpss_exit();
sample_comm_vi_exit();
sample_comm_vgs_exit();
sample_comm_sys_exit();
}
xmedia_void sample_vio_handle_sig(xmedia_s32 signo)
{
if (SIGINT == signo || SIGTSTP == signo || SIGTERM == signo) {
g_force_exit = XMEDIA_TRUE;
}
}
xmedia_s32 sample_vio_vi_online_vpss_online()
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size = { 0 };
xmedia_video_size sub_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_vio_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[2] = { 0, 1 };
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;
sample_venc_config venc_config = { 0 };
xmedia_s32 vo_dev = 0;
xmedia_s32 vo_layer = vo_dev;
xmedia_s32 vo_chn[1] = { 0 };
xmedia_s32 vo_chn_num = 1;
sample_vo_config_input vo_input = { 0 };
sample_vo_config vo_config = { 0 };
vo_input.square_sort = 1;
vo_input.screen_type = sample_vo_screen_type[0];
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);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &framerate);
// sys init
sys_config.sys_conf.pipe_mode[0].vicap_viproc_mode = XMEDIA_WORK_MODE_ONLINE;
sys_config.sys_conf.pipe_mode[0].viproc_vpss_mode = XMEDIA_WORK_MODE_ONLINE;
sys_config.sys_conf.pipe_mode[0].gdc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 20;
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[0].block_size = blk_size;
sys_config.vb_conf.common_pool[0].block_cnt = 1;
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[1].block_size = blk_size;
sys_config.vb_conf.common_pool[1].block_cnt = 3;
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
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].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_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("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_PRT("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_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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
if (g_venc_use == XMEDIA_TRUE) {
// venc init
app_liveserver_init();
app_liveserver_start(vpss_ochn_size, venc_chn_cnt, framerate);
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_H265CBR;
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_H265CBR;
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_PRT("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_PRT("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_PRT("vpss bind venc failed !\n");
goto exit5;
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_FALSE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit6;
}
} else {
// vo init
ret = sample_comm_vo_get_default_config(vo_input, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get vo default config failed !\n");
goto exit3;
}
ret = sample_comm_vo_start(vo_dev, vo_layer, vo_chn, vo_chn_num, XMEDIA_TRUE, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vo start failed !\n");
goto exit3;
}
ret = sample_comm_sys_vpss_bind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit4;
}
}
PAUSE(g_force_exit);
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop_get_stream();
}
exit6:
if (g_venc_use == XMEDIA_TRUE) {
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
}
exit5:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
} else {
sample_comm_sys_vpss_unbind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
}
exit4:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop(&venc_config);
} else {
sample_comm_vo_stop(vo_dev, vo_layer, vo_chn, vo_chn_num);
}
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_vio_sys_exit();
return ret;
}
xmedia_s32 sample_vio_vi_offline_vpss_online()
{
xmedia_s32 i = 0;
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size = { 0 };
xmedia_video_size sub_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_vio_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[2] = { 0, 1 };
sample_vpss_config vpss_config = { 0 };
xmedia_video_size vpss_ochn_size[VPSS_MAX_OCHN_NUM] = { 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_s32 vo_dev = 0;
xmedia_s32 vo_layer = vo_dev;
xmedia_s32 vo_chn[1] = { 0 };
xmedia_s32 vo_chn_num = 1;
sample_vo_config_input vo_input = { 0 };
sample_vo_config vo_config = { 0 };
vo_input.square_sort = 1;
vo_input.screen_type = sample_vo_screen_type[0];
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);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &framerate);
// 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.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 20;
pic_size.width = sensor_info.width;
pic_size.height = sensor_info.height;
/* vicap-viproc offline VB */
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, sensor_info.pixel_format,
sensor_info.bit_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[0].block_size = blk_size;
sys_config.vb_conf.common_pool[0].block_cnt = 1;
SAMPLE_PRT("offline vb size : %d \n", blk_size);
/* VPSS-VENC VB */
blk_size = sample_comm_sys_get_buffer_size(pic_size, XMEDIA_VIDEO_FMT_TILE_32x4, video_param.pixel_fmt,
video_param.data_width, XMEDIA_VIDEO_COMPRESS_MODE_TILE);
sys_config.vb_conf.common_pool[1].block_size = blk_size;
sys_config.vb_conf.common_pool[1].block_cnt = 1;
SAMPLE_PRT("vpss-venc 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[2].block_size = blk_size;
sys_config.vb_conf.common_pool[2].block_cnt = 2;
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
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.pipe_info[vi_pipe].lowdelay_attr.enable = XMEDIA_TRUE;
vi_config.pipe_info[vi_pipe].lowdelay_attr.line_cnt = sensor_info.height / 2;
vi_config.pipe_info[vi_pipe].lowdelay_attr.one_buf_en = XMEDIA_TRUE;
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].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_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("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_PRT("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_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.enable = XMEDIA_TRUE;
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].wrap_attr.buf_line = sensor_info.height;
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.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
if (g_venc_use == XMEDIA_TRUE) {
// venc init
app_liveserver_init();
app_liveserver_start(vpss_ochn_size, venc_chn_cnt, framerate);
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_H265CBR;
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_H265CBR;
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_PRT("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_PRT("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_PRT("vpss bind venc failed !\n");
goto exit5;
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_FALSE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit6;
}
} else {
// vo init
ret = sample_comm_vo_get_default_config(vo_input, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get vo default config failed !\n");
goto exit3;
}
ret = sample_comm_vo_start(vo_dev, vo_layer, vo_chn, vo_chn_num, XMEDIA_TRUE, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vo start failed !\n");
goto exit3;
}
ret = sample_comm_sys_vpss_bind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit4;
}
}
PAUSE(g_force_exit);
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop_get_stream();
}
exit6:
if (g_venc_use == XMEDIA_TRUE) {
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
}
exit5:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
} else {
sample_comm_sys_vpss_unbind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
}
exit4:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop(&venc_config);
} else {
sample_comm_vo_stop(vo_dev, vo_layer, vo_chn, vo_chn_num);
}
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_vio_sys_exit();
return ret;
}
xmedia_s32 sample_vio_vi_offline_vpss_offline()
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size = { 0 };
xmedia_video_size sub_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_vio_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_ichn = 0;
xmedia_s32 vpss_ochn[2] = { 0, 1 };
sample_vpss_config vpss_config = { 0 };
xmedia_video_size vpss_ochn_size[VPSS_MAX_OCHN_NUM] = { 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_s32 vo_dev = 0;
xmedia_s32 vo_layer = vo_dev;
xmedia_s32 vo_chn[1] = { 0 };
xmedia_s32 vo_chn_num = 1;
sample_vo_config_input vo_input = { 0 };
sample_vo_config vo_config = { 0 };
vo_input.screen_type = sample_vo_screen_type[0];
vo_input.square_sort = 1;
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);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &framerate);
// sys init
sys_config.sys_conf.pipe_mode[vi_pipe].vicap_viproc_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.sys_conf.pipe_mode[vi_pipe].viproc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.sys_conf.pipe_mode[vi_pipe].gdc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 25;
pic_size.width = sensor_info.width;
pic_size.height = sensor_info.height;
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, sensor_info.pixel_format,
sensor_info.bit_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[0].block_size = blk_size;
sys_config.vb_conf.common_pool[0].block_cnt = 2;
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, video_param.pixel_fmt,
video_param.data_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[1].block_size = blk_size;
sys_config.vb_conf.common_pool[1].block_cnt = 3;
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[2].block_size = blk_size;
sys_config.vb_conf.common_pool[2].block_cnt = 3;
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
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;
framerate = 15; // 全离线vb占用过多,默认用15fps
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].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_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("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_PRT("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_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];
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.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
ret = sample_comm_sys_vi_bind_vpss(vi_pipe, vi_chn, vpss_pipe, vpss_ichn);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vi bind vpss failed !\n");
goto exit3;
}
if (g_venc_use == XMEDIA_TRUE) {
// venc init
app_liveserver_init();
app_liveserver_start(vpss_ochn_size, venc_chn_cnt, framerate);
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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[0], framerate, &venc_config.chn_info[venc_chnl]);
venc_config.chn_info[venc_chnl].rcn_ref_share_buf = XMEDIA_TRUE;
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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[1], framerate, &venc_config.chn_info[venc_chnl]);
venc_config.chn_info[venc_chnl].rcn_ref_share_buf = XMEDIA_TRUE;
ret = sample_comm_venc_start(&venc_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start failed !\n");
goto exit4;
}
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit5;
}
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit6;
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_FALSE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit7;
}
} else {
// vo init
ret = sample_comm_vo_get_default_config(vo_input, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get vo default config failed !\n");
goto exit4;
}
ret = sample_comm_vo_start(vo_dev, vo_layer, vo_chn, vo_chn_num, XMEDIA_TRUE, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vo start failed !\n");
goto exit4;
}
ret = sample_comm_sys_vpss_bind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit5;
}
}
PAUSE(g_force_exit);
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop_get_stream();
}
exit7:
if (g_venc_use == XMEDIA_TRUE) {
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
}
exit6:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
} else {
sample_comm_sys_vpss_unbind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
}
exit5:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop(&venc_config);
} else {
sample_comm_vo_stop(vo_dev, vo_layer, vo_chn, vo_chn_num);
}
exit4:
sample_comm_sys_vi_unbind_vpss(vi_pipe, vi_chn, vpss_pipe, vpss_ichn);
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_vio_sys_exit();
return ret;
}
xmedia_s32 sample_vio_vi_offline_vpss_offline_wdr()
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size = { 0 };
xmedia_video_size sub_pic_size = { 0 };
sample_comm_video_param video_param = { 0 };
sample_sys_config sys_config = { 0 };
xmedia_s32 vi_dev = 0;
xmedia_s32 vi_pipe0 = 0;
xmedia_s32 vi_pipe1 = 1;
xmedia_s32 vi_grp = 0;
xmedia_s32 vi_chn = 0;
sample_vi_config vi_config = { 0 };
sample_vi_wdr_param wdr_param = { 0 };
xmedia_s32 sensor_type = sample_vio_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_ichn = 0;
xmedia_s32 vpss_ochn[2] = { 0, 1 };
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;
sample_venc_config venc_config = { 0 };
xmedia_s32 vo_dev = 0;
xmedia_s32 vo_layer = vo_dev;
xmedia_s32 vo_chn[1] = { 0 };
xmedia_s32 vo_chn_num = 1;
sample_vo_config_input vo_input = { 0 };
sample_vo_config vo_config = { 0 };
vo_input.intf_sync = XMEDIA_VO_INTF_SYNC_800x480_50;
vo_input.intf_type = XMEDIA_INTF_TYPE_LCD;
vo_input.square_sort = 1;
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;
sensor_type = sample_comm_vi_get_wdr_sensor_type(sensor_type);
sample_comm_vi_get_sensor_info(sensor_type, &sensor_info);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &framerate);
// sys init
for(int i = 0; i < VI_MAX_PIPE_NUM; i ++) {
sys_config.sys_conf.pipe_mode[i].vicap_viproc_mode = (i == 0) ? XMEDIA_WORK_MODE_ONLINE : 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.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 25;
pic_size.width = sensor_info.width;
pic_size.height = sensor_info.height;
if(sys_config.sys_conf.pipe_mode[0].vicap_viproc_mode == XMEDIA_WORK_MODE_OFFLINE)
{
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, sensor_info.pixel_format,
sensor_info.bit_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[0].block_size = blk_size;
sys_config.vb_conf.common_pool[0].block_cnt = 4;
}
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[1].block_size = blk_size;
sys_config.vb_conf.common_pool[1].block_cnt = 1;
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[2].block_size = blk_size;
sys_config.vb_conf.common_pool[2].block_cnt = 3;
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
wdr_param.vi_dev = vi_dev;
wdr_param.vi_pipe[0] = vi_pipe0;
wdr_param.vi_pipe[1] = vi_pipe1;
wdr_param.vi_grp = vi_grp;
wdr_param.vi_chn = vi_chn;
wdr_param.sensor_type = sensor_type;
wdr_param.wdr_mode = sensor_info.wdr_mode;
if(sys_config.sys_conf.pipe_mode[0].vicap_viproc_mode == XMEDIA_WORK_MODE_ONLINE)
{
wdr_param.cache_line = pic_size.height / 2;
}
sample_comm_vi_wdr_config_init(&wdr_param, &vi_config);
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_pipe0] = vi_pipe0;
isp_param.isp_info[vi_pipe0].isp_pipe_en = XMEDIA_TRUE;
isp_param.isp_info[vi_pipe0].isp_sensor_en = XMEDIA_TRUE;
isp_param.isp_info[vi_pipe0].sensor_type = sensor_type;
isp_param.isp_info[vi_pipe0].mirror = mirror;
isp_param.isp_info[vi_pipe0].flip = flip;
memcpy(&(isp_param.isp_info[vi_pipe0].isp_config), &isp_config, sizeof(xmedia_isp_config));
// isp init
ret = sample_comm_isp_init(&isp_param, &vi_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("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_PRT("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_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;
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
ret = sample_comm_sys_vi_bind_vpss(vi_pipe0, vi_chn, vpss_pipe, vpss_ichn);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vi bind vpss failed !\n");
goto exit3;
}
if (g_venc_use == XMEDIA_TRUE) {
// venc init
app_liveserver_init();
app_liveserver_start(vpss_ochn_size, venc_chn_cnt, framerate);
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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[0], framerate, &venc_config.chn_info[venc_chnl]);
venc_config.chn_info[venc_chnl].rcn_ref_share_buf = XMEDIA_TRUE;
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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[1], framerate, &venc_config.chn_info[venc_chnl]);
venc_config.chn_info[venc_chnl].rcn_ref_share_buf = XMEDIA_TRUE;
ret = sample_comm_venc_start(&venc_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start failed !\n");
goto exit4;
}
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit5;
}
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit6;
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_FALSE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit7;
}
} else {
// vo init
ret = sample_comm_vo_get_default_config(vo_input, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get vo default config failed !\n");
goto exit4;
}
ret = sample_comm_vo_start(vo_dev, vo_layer, vo_chn, vo_chn_num, XMEDIA_TRUE, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vo start failed !\n");
goto exit4;
}
ret = sample_comm_sys_vpss_bind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit5;
}
}
PAUSE(g_force_exit);
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop_get_stream();
}
exit7:
if (g_venc_use == XMEDIA_TRUE) {
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
}
exit6:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
} else {
sample_comm_sys_vpss_unbind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
}
exit5:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop(&venc_config);
} else {
sample_comm_vo_stop(vo_dev, vo_layer, vo_chn, vo_chn_num);
}
exit4:
sample_comm_sys_vi_unbind_vpss(vi_pipe0, vi_chn, vpss_pipe, vpss_ichn);
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_vio_sys_exit();
return ret;
}
static xmedia_s32 sample_vio_switch_to_linear(sample_vi_config *vi_config, sample_comm_video_param *video_param,
xmedia_s32 venc_chn[2])
{
vi_sensor_info sensor_info = { 0 };
xmedia_isp_attr isp_attr = { 0 };
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 sensor_type = sample_vio_sensor_type[0];
xmedia_s32 vi_dev = 0;
xmedia_s32 vi_pipe = 0;
xmedia_s32 vi_chn = 0;
xmedia_u32 fps = 0;
xmedia_u8 mipi_lane[4] = {1, 2, 4 ,8};
xmedia_u64 start, end;
xmedia_sensor_attr attr = {0};
xmedia_venc_recv_pic_param recv_param = { 0 };
recv_param.recv_pic_num = -1;
sample_comm_vi_stop(vi_config);
xmedia_sensor_stop(vi_pipe);
sample_comm_vi_exit();
xmedia_venc_stop_recv_frame(venc_chn[0]);
xmedia_venc_stop_recv_frame(venc_chn[1]);
xmedia_venc_reset_chn(venc_chn[0]);
xmedia_venc_reset_chn(venc_chn[1]);
xmedia_venc_start_recv_frame(venc_chn[0], &recv_param);
xmedia_venc_start_recv_frame(venc_chn[1], &recv_param);
sample_comm_vi_init();
sample_comm_vi_get_sensor_info(sensor_type, &sensor_info);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &fps);
ret = xmedia_sensor_set_mipi_lanes(vi_pipe, mipi_lane[sensor_info.lane_mode]);
CHECK_RET(ret, "sensor set mipi_lanes");
attr.width = sensor_info.width;
attr.height = sensor_info.height;
attr.wdr_mode = XMEDIA_VIDEO_WDR_MODE_NONE;
ret = xmedia_sensor_set_attr(vi_pipe, &attr);
CHECK_RET(ret, "sensor set attr");
xmedia_sys_get_cur_pts(&start);
xmedia_isp_get_attr(vi_pipe, &isp_attr);
isp_attr.wdr_mode = XMEDIA_VIDEO_WDR_MODE_NONE;
isp_attr.fps = fps;
xmedia_isp_set_attr(vi_pipe, &isp_attr);
do {
usleep(ISP_DYNAMIC_SWITCH_SLEEP_TIME);
xmedia_isp_get_attr(vi_pipe, &isp_attr);
} while (isp_attr.wdr_mode != XMEDIA_VIDEO_WDR_MODE_NONE);
xmedia_sys_get_cur_pts(&end);
SAMPLE_PRT("switch to linear cost time: %llu us.\n", end - start);
memset(vi_config, 0, sizeof(sample_vi_config));
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;
ret = sample_comm_vi_start(vi_config, video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sample_comm_vi_start failed !\n");
return ret;
}
xmedia_sensor_start(vi_pipe);
return XMEDIA_SUCCESS;
}
static xmedia_s32 sample_vio_switch_to_wdr(sample_vi_config *vi_config, sample_comm_video_param *video_param,
xmedia_s32 venc_chn[2])
{
vi_sensor_info sensor_info = { 0 };
xmedia_isp_attr isp_attr = { 0 };
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 sensor_type = sample_vio_sensor_type[0];
xmedia_s32 vi_dev = 0;
xmedia_s32 vi_chn = 0;
xmedia_s32 vi_pipe0 = 0;
xmedia_s32 vpss_pipe = 0;
xmedia_s32 vi_pipe1 = 1;
xmedia_s32 vi_grp = 0;
xmedia_u32 fps = 0;
xmedia_u8 mipi_lane[4] = {1, 2, 4 ,8};
xmedia_u64 start, end;
xmedia_sensor_attr attr = {0};
xmedia_venc_recv_pic_param recv_param = { 0 };
recv_param.recv_pic_num = -1;
sample_comm_vi_stop(vi_config);
xmedia_sensor_stop(vi_pipe0);
sample_comm_vi_exit();
xmedia_venc_stop_recv_frame(venc_chn[0]);
xmedia_venc_stop_recv_frame(venc_chn[1]);
xmedia_vpss_reset_pipe(vpss_pipe);
xmedia_venc_reset_chn(venc_chn[0]);
xmedia_venc_reset_chn(venc_chn[1]);
xmedia_venc_start_recv_frame(venc_chn[0], &recv_param);
xmedia_venc_start_recv_frame(venc_chn[1], &recv_param);
sample_comm_vi_init();
sensor_type = sample_comm_vi_get_wdr_sensor_type(sensor_type);
sample_comm_vi_get_sensor_info(sensor_type, &sensor_info);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &fps);
ret = xmedia_sensor_set_mipi_lanes(vi_pipe0, mipi_lane[sensor_info.lane_mode]);
CHECK_RET(ret, "sensor set mipi_lanes");
attr.width = sensor_info.width;
attr.height = sensor_info.height;
attr.wdr_mode = XMEDIA_VIDEO_WDR_MODE_2TO1_LINE;
ret = xmedia_sensor_set_attr(vi_pipe0, &attr);
CHECK_RET(ret, "sensor set attr");
xmedia_sys_get_cur_pts(&start);
xmedia_isp_get_attr(vi_pipe0, &isp_attr);
isp_attr.wdr_mode = XMEDIA_VIDEO_WDR_MODE_2TO1_LINE;
isp_attr.fps = fps;
xmedia_isp_set_attr(vi_pipe0, &isp_attr);
do {
usleep(ISP_DYNAMIC_SWITCH_SLEEP_TIME);
xmedia_isp_get_attr(vi_pipe0, &isp_attr);
} while (isp_attr.wdr_mode != XMEDIA_VIDEO_WDR_MODE_2TO1_LINE);
xmedia_sys_get_cur_pts(&end);
SAMPLE_PRT("switch to wdr cost time: %llu us.\n", end - start);
memset(vi_config, 0, sizeof(sample_vi_config));
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_pipe0].pipe_en = XMEDIA_TRUE;
vi_config->pipe_info[vi_pipe0].pipe_no = vi_pipe0;
vi_config->pipe_info[vi_pipe0].chn_info[vi_chn].chn_en = XMEDIA_TRUE;
vi_config->pipe_info[vi_pipe0].chn_info[vi_chn].chn_no = vi_chn;
vi_config->pipe_info[vi_pipe1].pipe_en = XMEDIA_TRUE;
vi_config->pipe_info[vi_pipe1].pipe_no = vi_pipe1;
vi_config->pipe_info[vi_pipe1].chn_info[vi_chn].chn_en = XMEDIA_FALSE;
vi_config->pipe_info[vi_pipe1].chn_info[vi_chn].chn_no = vi_chn;
vi_config->dev_bind_pipe[vi_dev].pipe[0] = vi_pipe0;
vi_config->dev_bind_pipe[vi_dev].pipe[1] = vi_pipe1;
vi_config->grp_info[vi_grp].grp = vi_grp;
vi_config->grp_info[vi_grp].grp_en = XMEDIA_TRUE;
vi_config->grp_info[vi_grp].grp_config.grp_type = XMEDIA_VI_GRP_TYPE_WDR;
vi_config->grp_info[vi_grp].grp_config.wdr_grp_config.pipe_id[0] = vi_pipe0;
vi_config->grp_info[vi_grp].grp_config.wdr_grp_config.pipe_id[1] = vi_pipe1;
vi_config->grp_info[vi_grp].grp_config.wdr_grp_config.wdr_mode = sensor_info.wdr_mode;
vi_config->grp_info[vi_grp].grp_config.wdr_grp_config.cache_line = sensor_info.height >> 1;
ret = sample_comm_vi_start(vi_config, video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
return ret;
}
xmedia_sensor_start(vi_pipe0);
return XMEDIA_SUCCESS;
}
xmedia_s32 sample_vio_vi_offline_vpss_offline_switch_linear_wdr()
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size = { 0 };
xmedia_video_size sub_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_vio_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_ichn = 0;
xmedia_s32 vpss_ochn[2] = { 0, 1 };
sample_vpss_config vpss_config = { 0 };
xmedia_video_size vpss_ochn_size[VPSS_MAX_OCHN_NUM] = { 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_s32 vo_dev = 0;
xmedia_s32 vo_layer = vo_dev;
xmedia_s32 vo_chn[1] = { 0 };
xmedia_s32 vo_chn_num = 1;
sample_vo_config_input vo_input = { 0 };
sample_vo_config vo_config = { 0 };
vo_input.screen_type = sample_vo_screen_type[0];
vo_input.square_sort = 1;
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);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &framerate);
// sys init
sys_config.sys_conf.pipe_mode[vi_pipe].vicap_viproc_mode = XMEDIA_WORK_MODE_ONLINE;
sys_config.sys_conf.pipe_mode[vi_pipe].viproc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.sys_conf.pipe_mode[vi_pipe].gdc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 25;
pic_size.width = sensor_info.width;
pic_size.height = sensor_info.height;
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, sensor_info.pixel_format,
sensor_info.bit_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[0].block_size = blk_size;
sys_config.vb_conf.common_pool[0].block_cnt = 4;
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, video_param.pixel_fmt,
video_param.data_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[1].block_size = blk_size;
sys_config.vb_conf.common_pool[1].block_cnt = 5;
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[2].block_size = blk_size;
sys_config.vb_conf.common_pool[2].block_cnt = 3;
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
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].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_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("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_PRT("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_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];
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
ret = sample_comm_sys_vi_bind_vpss(vi_pipe, vi_chn, vpss_pipe, vpss_ichn);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vi bind vpss failed !\n");
goto exit3;
}
if (g_venc_use == XMEDIA_TRUE) {
// venc init
app_liveserver_init();
app_liveserver_start(vpss_ochn_size, venc_chn_cnt, framerate);
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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[0], framerate, &venc_config.chn_info[venc_chnl]);
venc_config.chn_info[venc_chnl].rcn_ref_share_buf = XMEDIA_TRUE;
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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[1], framerate, &venc_config.chn_info[venc_chnl]);
venc_config.chn_info[venc_chnl].rcn_ref_share_buf = XMEDIA_TRUE;
ret = sample_comm_venc_start(&venc_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start failed !\n");
goto exit4;
}
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit5;
}
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit6;
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_TRUE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit7;
}
} else {
// vo init
ret = sample_comm_vo_get_default_config(vo_input, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get vo default config failed !\n");
goto exit4;
}
ret = sample_comm_vo_start(vo_dev, vo_layer, vo_chn, vo_chn_num, XMEDIA_TRUE, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vo start failed !\n");
goto exit4;
}
ret = sample_comm_sys_vpss_bind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit5;
}
}
/* ----------------------------------------------------------------- */
/* ---------- dynamic switch between linear and wdr begin ---------- */
/* ----------------------------------------------------------------- */
printf("---------- press enter to switch linear to 2to1wdr. ----------\n");
PAUSE(g_force_exit);
sample_vio_switch_to_wdr(&vi_config, &video_param, venc_chn);
printf("---------- press enter to switch 2to1wdr to linear. ----------\n");
PAUSE(g_force_exit);
sample_vio_switch_to_linear(&vi_config, &video_param, venc_chn);
/* --------------------------------------------------------------- */
/* ---------- dynamic switch between linear and wdr end ---------- */
/* --------------------------------------------------------------- */
PAUSE(g_force_exit);
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop_get_stream();
}
exit7:
if (g_venc_use == XMEDIA_TRUE) {
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
}
exit6:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
} else {
sample_comm_sys_vpss_unbind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
}
exit5:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop(&venc_config);
} else {
sample_comm_vo_stop(vo_dev, vo_layer, vo_chn, vo_chn_num);
}
exit4:
sample_comm_sys_vi_unbind_vpss(vi_pipe, vi_chn, vpss_pipe, vpss_ichn);
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_vio_sys_exit();
return ret;
}
static xmedia_s32 sample_vio_set_isp_nr_param(xmedia_s32 pipe)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_vi_pipe_config vi_pipe_config = { 0 };
xmedia_isp_bnr_attr bnr_attr = { 0 };
xmedia_isp_stnr_attr stnr_attr = { 0 };
ret = xmedia_vi_get_pipe_config(pipe, &vi_pipe_config);
CHECK_RET(ret, "get vi pipe attr");
ret = xmedia_isp_get_bnr_attr(pipe, &bnr_attr);
CHECK_RET(ret, "get bnr attr");
bnr_attr.enable = vi_pipe_config.bnr_attr.bnr_en;
bnr_attr.tnr_enable = vi_pipe_config.bnr_attr.bnr_en;
ret = xmedia_isp_set_bnr_attr(pipe, &bnr_attr);
CHECK_RET(ret, "set bnr attr");
// STNR
ret = xmedia_isp_get_stnr_attr(pipe, &stnr_attr);
CHECK_RET(ret, "get stnr attr");
stnr_attr.stnr_enable = vi_pipe_config.stnr_attr.stnr_en;
stnr_attr.tnr_enable = vi_pipe_config.stnr_attr.stnr_en;
stnr_attr.cnr_enable = vi_pipe_config.stnr_attr.stnr_en;
ret = xmedia_isp_set_stnr_attr(pipe, &stnr_attr);
CHECK_RET(ret, "set stnr attr");
return ret;
}
static xmedia_s32 sample_vio_switch_to_2M(sample_vi_config *vi_config, sample_comm_video_param *video_param)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 vi_dev = 0;
xmedia_s32 vi_pipe = 0;
xmedia_s32 vi_chn = 0;
xmedia_u32 fps = 0;
vi_sensor_info sensor_info = { 0 };
xmedia_s32 sensor_type = OMNIVISION_OS08A20_MIPI_2M_30FPS_10BIT;
xmedia_isp_attr isp_attr = { 0 };
xmedia_u8 mipi_lane[4] = {1, 2, 4 ,8};
xmedia_u64 start, end;
xmedia_sensor_attr attr = {0};
sample_comm_vi_stop(vi_config);
xmedia_sensor_stop(vi_pipe);
sample_comm_vi_get_sensor_info(sensor_type, &sensor_info);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &fps);
ret = xmedia_sensor_set_mipi_lanes(vi_pipe, mipi_lane[sensor_info.lane_mode]);
CHECK_RET(ret, "sensor set mipi_lanes");
attr.width = sensor_info.width;
attr.height = sensor_info.height;
attr.wdr_mode = XMEDIA_VIDEO_WDR_MODE_NONE;
ret = xmedia_sensor_set_attr(vi_pipe, &attr);
CHECK_RET(ret, "sensor set attr");
xmedia_sys_get_cur_pts(&start);
xmedia_isp_get_attr(vi_pipe, &isp_attr);
isp_attr.size.width = sensor_info.width;
isp_attr.size.height = sensor_info.height;
isp_attr.fps = fps;
xmedia_isp_set_attr(vi_pipe, &isp_attr);
do {
usleep(ISP_DYNAMIC_SWITCH_SLEEP_TIME);
xmedia_isp_get_attr(vi_pipe, &isp_attr);
} while (isp_attr.size.width != sensor_info.width || isp_attr.size.height != sensor_info.height);
xmedia_sys_get_cur_pts(&end);
SAMPLE_PRT("switch to 2M cost time: %llu us.\n", end - start);
memset(vi_config, 0, sizeof(sample_vi_config));
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;
ret = sample_comm_vi_start(vi_config, video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
return ret;
}
sample_vio_set_isp_nr_param(vi_pipe);
xmedia_sensor_start(vi_pipe);
return XMEDIA_SUCCESS;
}
static xmedia_s32 sample_vio_switch_to_8M(sample_vi_config *vi_config, sample_comm_video_param *video_param)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 vi_dev = 0;
xmedia_s32 vi_pipe = 0;
xmedia_s32 vi_chn = 0;
xmedia_u32 fps = 0;
vi_sensor_info sensor_info = { 0 };
xmedia_s32 sensor_type = OMNIVISION_OS08A20_MIPI_8M_20FPS_10BIT;
xmedia_isp_attr isp_attr = { 0 };
xmedia_u8 mipi_lane[4] = {1, 2, 4 ,8};
xmedia_u64 start, end;
xmedia_sensor_attr attr = {0};
sample_comm_vi_stop(vi_config);
xmedia_sensor_stop(vi_pipe);
sample_comm_vi_get_sensor_info(sensor_type, &sensor_info);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &fps);
ret = xmedia_sensor_set_mipi_lanes(vi_pipe, mipi_lane[sensor_info.lane_mode]);
CHECK_RET(ret, "sensor set mipi_lanes");
attr.width = sensor_info.width;
attr.height = sensor_info.height;
attr.wdr_mode = XMEDIA_VIDEO_WDR_MODE_NONE;
ret = xmedia_sensor_set_attr(vi_pipe, &attr);
CHECK_RET(ret, "sensor set attr");
xmedia_sys_get_cur_pts(&start);
xmedia_isp_get_attr(vi_pipe, &isp_attr);
isp_attr.size.width = sensor_info.width;
isp_attr.size.height = sensor_info.height;
isp_attr.fps = fps;
xmedia_isp_set_attr(vi_pipe, &isp_attr);
do {
usleep(ISP_DYNAMIC_SWITCH_SLEEP_TIME);
xmedia_isp_get_attr(vi_pipe, &isp_attr);
} while (isp_attr.size.width != sensor_info.width || isp_attr.size.height != sensor_info.height);
xmedia_sys_get_cur_pts(&end);
SAMPLE_PRT("switch to 8M cost time: %llu us.\n", end - start);
memset(vi_config, 0, sizeof(sample_vi_config));
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;
// vi start
ret = sample_comm_vi_start(vi_config, video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
return ret;
}
sample_vio_set_isp_nr_param(vi_pipe);
xmedia_sensor_start(vi_pipe);
return XMEDIA_SUCCESS;
}
static xmedia_s32 sample_vio_switch_to_readback(sample_vi_config *vi_config, sample_comm_video_param *video_param)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 vi_dev = 0;
xmedia_s32 vi_pipe = 0;
xmedia_s32 vi_chn = 0;
vi_sensor_info sensor_info = { 0 };
xmedia_s32 sensor_type = CVSENS_CV4003_MIPI_1M_120FPS_10BIT_PREROLL_READBACK;
xmedia_sensor_property property = { 0 };
xmedia_isp_attr isp_attr = { 0 };
xmedia_u8 mipi_lane[4] = {1, 2, 4 ,8};
xmedia_sensor_attr attr = {0};
xmedia_u64 start, end;
sample_comm_vi_stop(vi_config);
xmedia_sensor_stop(vi_pipe);
usleep(1000000);
sample_comm_vi_get_sensor_info(sensor_type, &sensor_info);
ret = xmedia_sensor_set_mipi_lanes(vi_pipe, mipi_lane[sensor_info.lane_mode]);
CHECK_RET(ret, "sensor set mipi_lanes");
attr.width = sensor_info.width;
attr.height = sensor_info.height;
attr.wdr_mode = XMEDIA_VIDEO_WDR_MODE_NONE;
ret = xmedia_sensor_set_attr(vi_pipe, &attr);
CHECK_RET(ret, "sensor set attr");
xmedia_sys_get_cur_pts(&start);
xmedia_sensor_get_property(vi_pipe, &property);
xmedia_isp_get_attr(vi_pipe, &isp_attr);
isp_attr.size.width = sensor_info.width;
isp_attr.size.height = sensor_info.height;
isp_attr.fps = property.max_fps;
xmedia_isp_set_attr(vi_pipe, &isp_attr);
do {
usleep(ISP_DYNAMIC_SWITCH_SLEEP_TIME);
xmedia_isp_get_attr(vi_pipe, &isp_attr);
} while (isp_attr.size.width != sensor_info.width || isp_attr.size.height != sensor_info.height);
xmedia_sys_get_cur_pts(&end);
SAMPLE_PRT("switch to readback cost time: %llu us.\n", end - start);
memset(vi_config, 0, sizeof(sample_vi_config));
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;
// vi start
ret = sample_comm_vi_start(vi_config, video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
return ret;
}
sample_vio_set_isp_nr_param(vi_pipe);
xmedia_sensor_start(vi_pipe);
return XMEDIA_SUCCESS;
}
xmedia_s32 sample_vio_vi_offline_vpss_offline_switch_resolution()
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size = { 0 };
xmedia_video_size sub_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 = OMNIVISION_OS08A20_MIPI_2M_30FPS_10BIT;
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_ichn = 0;
xmedia_s32 vpss_ochn[2] = { 0, 1 };
sample_vpss_config vpss_config = { 0 };
xmedia_video_size vpss_ochn_size[VPSS_MAX_OCHN_NUM] = { 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_s32 vo_dev = 0;
xmedia_s32 vo_layer = vo_dev;
xmedia_s32 vo_chn[1] = { 0 };
xmedia_s32 vo_chn_num = 1;
sample_vo_config_input vo_input = { 0 };
sample_vo_config vo_config = { 0 };
vo_input.screen_type = sample_vo_screen_type[0];
vo_input.square_sort = 1;
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);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &framerate);
// sys init
sys_config.sys_conf.pipe_mode[vi_pipe].vicap_viproc_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.sys_conf.pipe_mode[vi_pipe].viproc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.sys_conf.pipe_mode[vi_pipe].gdc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 25;
pic_size.width = 3840;//sensor_info.width;
pic_size.height = 2160;//sensor_info.height;
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, sensor_info.pixel_format,
sensor_info.bit_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[0].block_size = blk_size;
sys_config.vb_conf.common_pool[0].block_cnt = 2;
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, video_param.pixel_fmt,
video_param.data_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[1].block_size = blk_size;
sys_config.vb_conf.common_pool[1].block_cnt = 3;
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[2].block_size = blk_size;
sys_config.vb_conf.common_pool[2].block_cnt = 3;
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
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;
framerate = 15; // 全离线vb占用过多,默认用15fps
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].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_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("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_PRT("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_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];
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.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
ret = sample_comm_sys_vi_bind_vpss(vi_pipe, vi_chn, vpss_pipe, vpss_ichn);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vi bind vpss failed !\n");
goto exit3;
}
if (g_venc_use == XMEDIA_TRUE) {
// venc init
app_liveserver_init();
app_liveserver_start(vpss_ochn_size, venc_chn_cnt, framerate);
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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[0], framerate, &venc_config.chn_info[venc_chnl]);
venc_config.chn_info[venc_chnl].rcn_ref_share_buf = XMEDIA_TRUE;
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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[1], framerate, &venc_config.chn_info[venc_chnl]);
venc_config.chn_info[venc_chnl].rcn_ref_share_buf = XMEDIA_TRUE;
ret = sample_comm_venc_start(&venc_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start failed !\n");
goto exit4;
}
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit5;
}
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit6;
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_FALSE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit7;
}
} else {
// vo init
ret = sample_comm_vo_get_default_config(vo_input, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get vo default config failed !\n");
goto exit4;
}
ret = sample_comm_vo_start(vo_dev, vo_layer, vo_chn, vo_chn_num, XMEDIA_TRUE, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vo start failed !\n");
goto exit4;
}
ret = sample_comm_sys_vpss_bind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit5;
}
}
/* ------------------------------------------------------------ */
/* ---------- dynamic switch between 2M and 8M begin ---------- */
/* ------------------------------------------------------------ */
printf("---------- press enter to switch 2M to 8M. ----------\n");
PAUSE(g_force_exit);
sample_vio_switch_to_8M(&vi_config, &video_param);
printf("---------- press enter to switch 8M to 2M. ----------\n");
PAUSE(g_force_exit);
sample_vio_switch_to_2M(&vi_config, &video_param);
/* --------------------------------------------------------------- */
/* ---------- dynamic switch between linear and wdr end ---------- */
/* --------------------------------------------------------------- */
PAUSE(g_force_exit);
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop_get_stream();
}
exit7:
if (g_venc_use == XMEDIA_TRUE) {
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
}
exit6:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
} else {
sample_comm_sys_vpss_unbind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
}
exit5:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop(&venc_config);
} else {
sample_comm_vo_stop(vo_dev, vo_layer, vo_chn, vo_chn_num);
}
exit4:
sample_comm_sys_vi_unbind_vpss(vi_pipe, vi_chn, vpss_pipe, vpss_ichn);
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_vio_sys_exit();
return ret;
}
xmedia_s32 sample_vio_vi_offline_vpss_offline_preroll_normal_readback()
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size = { 0 };
xmedia_video_size sub_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 = CVSENS_CV4003_MIPI_4M_30FPS_10BIT;
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_ichn = 0;
xmedia_s32 vpss_ochn[2] = { 0, 1 };
sample_vpss_config vpss_config = { 0 };
xmedia_video_size vpss_ochn_size[VPSS_MAX_OCHN_NUM] = { 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_s32 vo_dev = 0;
xmedia_s32 vo_layer = vo_dev;
xmedia_s32 vo_chn[1] = { 0 };
xmedia_s32 vo_chn_num = 1;
sample_vo_config_input vo_input = { 0 };
sample_vo_config vo_config = { 0 };
vo_input.screen_type = sample_vo_screen_type[0];
vo_input.square_sort = 1;
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);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &framerate);
// sys init
sys_config.sys_conf.pipe_mode[vi_pipe].vicap_viproc_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.sys_conf.pipe_mode[vi_pipe].viproc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.sys_conf.pipe_mode[vi_pipe].gdc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 25;
pic_size.width = sensor_info.width;//sensor_info.width;
pic_size.height = sensor_info.width;//sensor_info.height;
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, sensor_info.pixel_format,
sensor_info.bit_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[0].block_size = blk_size;
sys_config.vb_conf.common_pool[0].block_cnt = 2;
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, video_param.pixel_fmt,
video_param.data_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[1].block_size = blk_size;
sys_config.vb_conf.common_pool[1].block_cnt = 3;
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[2].block_size = blk_size;
sys_config.vb_conf.common_pool[2].block_cnt = 3;
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
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].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_PRT("isp init failed!\n");
goto exit0;
}
//isp_init完成之后,sensor进入预录阶段
PAUSE(g_force_exit);
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("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_PRT("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_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];
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.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
ret = sample_comm_sys_vi_bind_vpss(vi_pipe, vi_chn, vpss_pipe, vpss_ichn);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vi bind vpss failed !\n");
goto exit3;
}
if (g_venc_use == XMEDIA_TRUE) {
// venc init
app_liveserver_init();
app_liveserver_start(vpss_ochn_size, venc_chn_cnt, framerate);
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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[0], framerate, &venc_config.chn_info[venc_chnl]);
venc_config.chn_info[venc_chnl].rcn_ref_share_buf = XMEDIA_TRUE;
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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[1], framerate, &venc_config.chn_info[venc_chnl]);
venc_config.chn_info[venc_chnl].rcn_ref_share_buf = XMEDIA_TRUE;
ret = sample_comm_venc_start(&venc_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start failed !\n");
goto exit4;
}
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit5;
}
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit6;
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_TRUE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit7;
}
} else {
// vo init
ret = sample_comm_vo_get_default_config(vo_input, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get vo default config failed !\n");
goto exit4;
}
ret = sample_comm_vo_start(vo_dev, vo_layer, vo_chn, vo_chn_num, XMEDIA_TRUE, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vo start failed !\n");
goto exit4;
}
ret = sample_comm_sys_vpss_bind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit5;
}
}
/* ------------------------------------------------------------ */
/* ---------- dynamic switch between normal and readback -------*/
/* ------------------------------------------------------------ */
PAUSE(g_force_exit);
sample_comm_venc_stop_get_stream();
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit7;
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_TRUE, XMEDIA_FALSE, ".");
xmedia_awb_info wb_info;
xmedia_sensor_init_param init_param = { 0 };
xmedia_awb_query_info(vi_pipe, &wb_info);
init_param.wb_bgain = wb_info.bgain;
init_param.wb_ggain = wb_info.grgain;
init_param.wb_rgain = wb_info.rgain;
xmedia_sensor_set_init_param(vi_pipe, &init_param);
sample_vio_switch_to_readback(&vi_config, &video_param);
PAUSE(g_force_exit);
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop_get_stream();
}
exit7:
if (g_venc_use == XMEDIA_TRUE) {
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
}
exit6:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
} else {
sample_comm_sys_vpss_unbind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
}
exit5:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop(&venc_config);
} else {
sample_comm_vo_stop(vo_dev, vo_layer, vo_chn, vo_chn_num);
}
exit4:
sample_comm_sys_vi_unbind_vpss(vi_pipe, vi_chn, vpss_pipe, vpss_ichn);
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_vio_sys_exit();
return ret;
}
xmedia_s32 sample_vio_vi_offline_vpss_online_double()
{
xmedia_s32 i = 0;
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size[2] = { 0 };
xmedia_video_size sub_pic_size = { 0 };
sample_comm_video_param video_param = { 0 };
sample_sys_config sys_config = { 0 };
xmedia_s32 total_input_capability = 0;
xmedia_s32 pool_count = 0;
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_vio_sensor_type[0], sample_vio_sensor_type[1]};
xmedia_u32 framerate[2] = { 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_pipe[2] = { 0, 1 };
xmedia_s32 vpss_chnl = 0;
xmedia_s32 vpss_ochn[2] = { 0, 1 };
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_video_size rtsp_chn_size[4] = { 0 };
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;
// 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.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 20;
for(i = 0; i < 2; i ++)
{
sample_comm_vi_get_sensor_info(sensor_type[i], &sensor_info[i]);
sample_comm_vi_get_framerate_by_sensor(sensor_type[i], &framerate[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_count].block_size = blk_size;
sys_config.vb_conf.common_pool[pool_count].block_cnt = ((i == 0) ? 1 : 2);
pool_count ++;
}
/* wrap VB */
wrap_share_cfg.enable = XMEDIA_TRUE;
wrap_share_cfg.wrap_pos = XMEDIA_VPSS_WRAP_POS_PHY_OCHN;
for(i = 0; i < 2; 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]);
sys_config.vb_conf.common_pool[pool_count].block_size = wrap_share_cfg.buf_size;
sys_config.vb_conf.common_pool[pool_count].block_cnt = 1;
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)
{
pool_count ++;
SAMPLE_PRT("wrap share vb size : %d \n", wrap_share_cfg.buf_size);
}
}
else
{
pool_count ++;
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_count].block_size = blk_size;
sys_config.vb_conf.common_pool[pool_count].block_cnt = 6;
total_input_capability = (sensor_info[0].width * sensor_info[0].height * framerate[0]) + (sensor_info[1].width * sensor_info[1].height * framerate[1]);
if(total_input_capability > 3840 * 2160 * 20) {
framerate[0] = 20;
framerate[1] = 20;
}
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
for(i = 0; i < 2; 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.pipe_info[vi_pipe[i]].lowdelay_attr.enable = ((i == 0) ? XMEDIA_TRUE : XMEDIA_FALSE);
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 = ((i == 0) ? XMEDIA_TRUE : XMEDIA_FALSE);
vi_config.dev_bind_pipe[vi_dev[i]].pipe[0] = vi_pipe[i];
vi_config.dev_bind_pipe[vi_dev[i]].pipe[1] = -1;
isp_config.fps = framerate[i];
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]].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_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start isp failed!\n");
goto exit2;
}
// vpss config
for(i = 0; i < 2; 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_PRT("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_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;
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
}
// set wrap buf share
ret = xmedia_vpss_set_wrap_buf_share_config(&wrap_share_cfg);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("set wrap buf share failed !\n");
goto exit2;
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
for(i = 0; i < 2; i ++)
{
memcpy(&rtsp_chn_size[2 * i], &vpss_ochn_size[i][0], sizeof(xmedia_video_size));
memcpy(&rtsp_chn_size[2 * i + 1], &vpss_ochn_size[i][1], sizeof(xmedia_video_size));
}
app_liveserver_init();
app_liveserver_start(rtsp_chn_size, 4, framerate[0]);
for(i = 0; i < 2; 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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[i][0], framerate[i], &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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[i][1], framerate[i], &venc_config.chn_info[venc_chnl]);
}
ret = sample_comm_venc_start(&venc_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start failed !\n");
goto exit3;
}
for(i = 0; i < 2; i ++)
{
xmedia_venc_chn_param chn_param;
xmedia_venc_get_chn_param(venc_chn[2 * i], &chn_param);
chn_param.priority = 1;
xmedia_venc_set_chn_param(venc_chn[2 * i], &chn_param);
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe[i], vpss_ochn[0], venc_chn[2 * i]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("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_PRT("vpss bind venc failed !\n");
goto exit5;
}
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_FALSE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit6;
}
PAUSE(g_force_exit);
sample_comm_venc_stop_get_stream();
exit6:
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(vpss_pipe[0], vpss_ochn[1], venc_chn[1]);
sample_comm_sys_vpss_unbind_venc(vpss_pipe[1], vpss_ochn[1], venc_chn[3]);
exit5:
sample_comm_sys_vpss_unbind_venc(vpss_pipe[0], vpss_ochn[0], venc_chn[0]);
sample_comm_sys_vpss_unbind_venc(vpss_pipe[1], vpss_ochn[0], venc_chn[2]);
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_vio_sys_exit();
return ret;
}
xmedia_s32 sample_vio_vi_offline_vpss_online_double_splicing()
{
xmedia_s32 i = 0;
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size[2] = { 0 };
xmedia_video_size splicing_pic_size[2] = { 0 };
xmedia_video_size sub_pic_size = { 0 };
sample_comm_video_param video_param = { 0 };
sample_sys_config sys_config = { 0 };
xmedia_s32 pool_count = 0;
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_vio_sensor_type[0], sample_vio_sensor_type[1]};
xmedia_u32 framerate[2] = { 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_TRUE;
xmedia_s32 vpss_pipe[2] = { 0, 1 };
xmedia_s32 vpss_chnl = 0;
xmedia_s32 vpss_ochn[2] = { 0, 1 };
sample_vpss_config vpss_config = { 0 };
xmedia_video_size vpss_ochn_size[2][VPSS_MAX_OCHN_NUM] = { 0 };
xmedia_vpss_output_mode vpss_output_mode[2] = { XMEDIA_VPSS_OUTPUT_MODE_V_SPLICING, XMEDIA_VPSS_OUTPUT_MODE_INDEPENDENT};
xmedia_vpss_splicing_grp_config splicing_grp_cfg = { 0 };
xmedia_s32 venc_chnl = 0;
xmedia_s32 venc_chn[4] = { 0, 1, 2, 3 };
xmedia_s32 venc_chn_cnt = 2;
sample_venc_config venc_config = { 0 };
xmedia_video_size rtsp_chn_size[4] = { 0 };
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;
// 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.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 20;
for(i = 0; i < 2; i ++)
{
sample_comm_vi_get_sensor_info(sensor_type[i], &sensor_info[i]);
sample_comm_vi_get_framerate_by_sensor(sensor_type[i], &framerate[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_count].block_size = blk_size;
sys_config.vb_conf.common_pool[pool_count].block_cnt = ((i == 0) ? 1 : 2);
pool_count ++;
}
if (vpss_output_mode[0] == XMEDIA_VPSS_OUTPUT_MODE_H_SPLICING && pic_size[0].height == pic_size[1].height) {
splicing_pic_size[0].width = pic_size[0].width + pic_size[1].width;
splicing_pic_size[0].height = pic_size[0].height;
} else if (vpss_output_mode[0] == XMEDIA_VPSS_OUTPUT_MODE_V_SPLICING && pic_size[0].width == pic_size[1].width) {
splicing_pic_size[0].width = pic_size[0].width;
splicing_pic_size[0].height = pic_size[0].height + pic_size[1].height;
} else {
SAMPLE_ERR("unsupport H/V splicing, please check the sensor info\n");
return XMEDIA_FAILURE;
}
blk_size = sample_comm_sys_get_buffer_size(splicing_pic_size[0], video_param.video_fmt, video_param.pixel_fmt,
video_param.data_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[pool_count].block_size = blk_size;
sys_config.vb_conf.common_pool[pool_count].block_cnt = 2;
pool_count ++;
SAMPLE_PRT("splicing vb size : %u \n", blk_size);
sub_pic_size.width = 640;
sub_pic_size.height = 480;
splicing_pic_size[1].width = (vpss_output_mode[1] == XMEDIA_VPSS_OUTPUT_MODE_H_SPLICING) ? (sub_pic_size.width * 2) : sub_pic_size.width;
splicing_pic_size[1].height = (vpss_output_mode[1] == XMEDIA_VPSS_OUTPUT_MODE_V_SPLICING) ? (sub_pic_size.height * 2) : sub_pic_size.height;
blk_size = sample_comm_sys_get_buffer_size(splicing_pic_size[1], video_param.video_fmt, video_param.pixel_fmt,
video_param.data_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[pool_count].block_size = blk_size;
sys_config.vb_conf.common_pool[pool_count].block_cnt = (vpss_output_mode[1] == XMEDIA_VPSS_OUTPUT_MODE_INDEPENDENT) ? 4 : 2;
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
for(i = 0; i < 2; 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.pipe_info[vi_pipe[i]].lowdelay_attr.enable = ((i == 0) ? XMEDIA_TRUE : XMEDIA_FALSE);
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 = ((i == 0) ? XMEDIA_TRUE : XMEDIA_FALSE);
vi_config.dev_bind_pipe[vi_dev[i]].pipe[0] = vi_pipe[i];
vi_config.dev_bind_pipe[vi_dev[i]].pipe[1] = -1;
framerate[i] = 15;
isp_config.fps = framerate[i];
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]].mirror = mirror;
isp_param.isp_info[vi_pipe[i]].flip = flip;
isp_param.isp_info[vi_pipe[i]].disable_dynamic_fps = XMEDIA_TRUE;
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_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start isp failed!\n");
goto exit2;
}
// set vpss splicing config
splicing_grp_cfg.pipe_num = 2;
splicing_grp_cfg.pipe_id[0] = 0;
splicing_grp_cfg.pipe_id[1] = 1;
splicing_grp_cfg.master_pipe_id = 0;
splicing_grp_cfg.output_mode[0] = vpss_output_mode[0];
splicing_grp_cfg.output_mode[1] = vpss_output_mode[1];
splicing_grp_cfg.output_mode[2] = XMEDIA_VPSS_OUTPUT_MODE_INDEPENDENT;
ret = xmedia_vpss_set_splicing_grp_config(0, &splicing_grp_cfg);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("set vpss splicing grp cfg failed !\n");
goto exit2;
}
// vpss config
for(i = 0; i < 2; 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_PRT("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_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];
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.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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);
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
memcpy(&rtsp_chn_size[0], &splicing_pic_size[0], sizeof(xmedia_video_size));
if(vpss_output_mode[1] == XMEDIA_VPSS_OUTPUT_MODE_INDEPENDENT) {
memcpy(&rtsp_chn_size[1], &sub_pic_size, sizeof(xmedia_video_size));
memcpy(&rtsp_chn_size[2], &sub_pic_size, sizeof(xmedia_video_size));
venc_chn_cnt = 3;
} else {
memcpy(&rtsp_chn_size[1], &splicing_pic_size[1], sizeof(xmedia_video_size));
venc_chn_cnt = 2;
}
app_liveserver_init();
app_liveserver_start(rtsp_chn_size, venc_chn_cnt, framerate[0]);
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_H265CBR;
sample_comm_venc_get_default_chn_info(splicing_pic_size[0], framerate[0], &venc_config.chn_info[venc_chnl]);
if(vpss_output_mode[1] == XMEDIA_VPSS_OUTPUT_MODE_INDEPENDENT)
{
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_H265CBR;
sample_comm_venc_get_default_chn_info(sub_pic_size, framerate[0], &venc_config.chn_info[venc_chnl]);
venc_chnl = venc_chn[2];
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_H265CBR;
sample_comm_venc_get_default_chn_info(sub_pic_size, framerate[1], &venc_config.chn_info[venc_chnl]);
}
else
{
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_H265CBR;
sample_comm_venc_get_default_chn_info(splicing_pic_size[1], framerate[0], &venc_config.chn_info[venc_chnl]);
}
ret = sample_comm_venc_start(&venc_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start failed !\n");
goto exit3;
}
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe[0], vpss_ochn[0], venc_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit4;
}
if(vpss_output_mode[1] == XMEDIA_VPSS_OUTPUT_MODE_INDEPENDENT)
{
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe[0], vpss_ochn[1], venc_chn[1]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit5;
}
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe[1], vpss_ochn[1], venc_chn[2]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit5;
}
}
else
{
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe[0], vpss_ochn[1], venc_chn[1]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit5;
}
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_FALSE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit6;
}
PAUSE(g_force_exit);
sample_comm_venc_stop_get_stream();
exit6:
app_liveserver_stop();
app_liveserver_deinit();
if(vpss_output_mode[1] == XMEDIA_VPSS_OUTPUT_MODE_INDEPENDENT) {
sample_comm_sys_vpss_unbind_venc(vpss_pipe[0], vpss_ochn[1], venc_chn[1]);
sample_comm_sys_vpss_unbind_venc(vpss_pipe[1], vpss_ochn[1], venc_chn[2]);
} else {
sample_comm_sys_vpss_unbind_venc(vpss_pipe[0], vpss_ochn[1], venc_chn[1]);
}
exit5:
sample_comm_sys_vpss_unbind_venc(vpss_pipe[0], 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_vio_sys_exit();
return ret;
}
xmedia_s32 sample_vio_vi_online_vpss_online_double()
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 i;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size = { 0 };
xmedia_video_size sub_pic_size = { 0 };
sample_comm_video_param video_param = { 0 };
sample_sys_config sys_config = { 0 };
xmedia_s32 pool_count = 0;
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_sys_switch_config switch_config = { 0 };
xmedia_s32 sensor_type = sample_vio_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_pipe[2] = {0, 1};
xmedia_s32 vpss_chnl = 0;
xmedia_s32 vpss_ochn[2] = { 0, 1 };
sample_vpss_config vpss_config = { 0 };
xmedia_video_size vpss_ochn_size[2][VPSS_MAX_OCHN_NUM] = { 0 };
xmedia_u32 wrap_buffer_line = 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_video_size rtsp_chn_size[4] = { 0 };
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);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &framerate);
framerate = 15; // 双路15fps
for (i = 0; i < 2; i++) {
// sys init
sys_config.sys_conf.pipe_mode[i].vicap_viproc_mode = XMEDIA_WORK_MODE_ONLINE;
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.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 20;
for (i = 0; i < 2; i++) {
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_count].block_size = blk_size;
sys_config.vb_conf.common_pool[pool_count].block_cnt = 1;
SAMPLE_PRT("wrap vb size : %d \n", blk_size);
pool_count++;
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_count].block_size = blk_size;
sys_config.vb_conf.common_pool[pool_count].block_cnt = 3;
pool_count++;
}
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
// switch init
switch_config.ext_switch_en = XMEDIA_FALSE;
switch_config.master_pipe_id = 0;
switch_config.multi_pipe_mode = XMEDIA_SYS_MULTI_PIPE_MODE_DUAL_SWITCH;
switch_config.pipe_id[0] = 0;
switch_config.pipe_id[1] = 1;
switch_config.pipe_num = 2;
switch_config.pipe_sel[0] = 0;
switch_config.pipe_sel[1] = 1;
switch_config.sync_mode = XMEDIA_SYS_SWITCH_SYNC_MODE_SOC_MASTER_SLAVE;
ret = xmedia_sys_set_switch_config(0, &switch_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("xmedia_sys_set_switch_config failed!\n");
sample_vio_sys_exit();
return ret;
}
for (i = 0; i < 2; 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;
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;
}
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
for (i = 0; i < 2; i++) {
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;
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));
}
// switch 主从:sensor0默认,sensor1从
isp_param.isp_info[0].sns_work_mode = XMEDIA_SENSOR_WORK_MODE_NORMAL;
isp_param.isp_info[1].sns_work_mode = XMEDIA_SENSOR_WORK_MODE_SLAVE;
isp_param.isp_info[0].disable_dynamic_fps = XMEDIA_TRUE;
isp_param.isp_info[1].disable_dynamic_fps = XMEDIA_TRUE;
// isp init
ret = sample_comm_isp_init(&isp_param, &vi_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start isp failed!\n");
goto exit2;
}
// vpss config
for (i = 0; i < 2; i++) {
ret = sample_comm_vpss_get_default_pipe_cfg(&vpss_config.pipe_info[vpss_pipe[i]].pipe_config, pic_size, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
vpss_ochn_size[vpss_pipe[i]][0].width = sensor_info.width;
vpss_ochn_size[vpss_pipe[i]][0].height = sensor_info.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_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;
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;
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].chn_config.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
for(i = 0; i < 2; i ++)
{
memcpy(&rtsp_chn_size[2 * i], &vpss_ochn_size[i][0], sizeof(xmedia_video_size));
memcpy(&rtsp_chn_size[2 * i + 1], &vpss_ochn_size[i][1], sizeof(xmedia_video_size));
}
app_liveserver_init();
app_liveserver_start(rtsp_chn_size, 4, framerate);
for (i = 0; i < 2; 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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[i][1], framerate, &venc_config.chn_info[venc_chnl]);
}
ret = sample_comm_venc_start(&venc_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start failed !\n");
goto exit3;
}
for (i = 0; i < 2; i++) {
xmedia_venc_chn_param chn_param;
xmedia_venc_get_chn_param(venc_chn[2 * i], &chn_param);
chn_param.priority = 1;
xmedia_venc_set_chn_param(venc_chn[2 * i], &chn_param);
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe[i], vpss_ochn[0], venc_chn[2 * i]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("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_PRT("vpss bind venc failed !\n");
goto exit5;
}
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_FALSE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit6;
}
PAUSE(g_force_exit);
sample_comm_venc_stop_get_stream();
exit6:
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(vpss_pipe[0], vpss_ochn[1], venc_chn[1]);
sample_comm_sys_vpss_unbind_venc(vpss_pipe[1], vpss_ochn[1], venc_chn[3]);
exit5:
sample_comm_sys_vpss_unbind_venc(vpss_pipe[0], vpss_ochn[0], venc_chn[0]);
sample_comm_sys_vpss_unbind_venc(vpss_pipe[1], vpss_ochn[0], venc_chn[2]);
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_vio_sys_exit();
return ret;
}
xmedia_s32 sample_vio_vi_offline_vpss_online_ldc()
{
xmedia_s32 i = 0;
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size = { 0 };
xmedia_video_size sub_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_video_ldc_attr vi_ldc_attr = { 0 };
xmedia_s32 sensor_type = sample_vio_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[2] = { 0, 1 };
sample_vpss_config vpss_config = { 0 };
xmedia_video_size vpss_ochn_size[VPSS_MAX_OCHN_NUM] = { 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_s32 vo_dev = 0;
xmedia_s32 vo_layer = vo_dev;
xmedia_s32 vo_chn[1] = { 0 };
xmedia_s32 vo_chn_num = 1;
sample_vo_config_input vo_input = { 0 };
sample_vo_config vo_config = { 0 };
vo_input.square_sort = 1;
vo_input.screen_type = sample_vo_screen_type[0];
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);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &framerate);
// 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.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 20;
pic_size.width = sensor_info.width;
pic_size.height = sensor_info.height;
/* vicap-viproc offline VB */
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, sensor_info.pixel_format,
sensor_info.bit_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[0].block_size = blk_size;
sys_config.vb_conf.common_pool[0].block_cnt = 2;
SAMPLE_PRT("offline vb size : %d \n", blk_size);
/* VPSS-VENC VB */
blk_size = sample_comm_sys_get_buffer_size(pic_size, XMEDIA_VIDEO_FMT_LINEAR, video_param.pixel_fmt,
video_param.data_width, XMEDIA_VIDEO_COMPRESS_MODE_NONE);
sys_config.vb_conf.common_pool[1].block_size = blk_size;
sys_config.vb_conf.common_pool[1].block_cnt = 2;
SAMPLE_PRT("vpss-venc 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[2].block_size = blk_size;
sys_config.vb_conf.common_pool[2].block_cnt = 2;
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
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;
vi_ldc_attr.enable = XMEDIA_TRUE;
vi_ldc_attr.version = XMEDIA_VIDEO_LDC_V1;
if (vi_ldc_attr.version == XMEDIA_VIDEO_LDC_V1) {
// LDC_V1需手动调整参数以达到最佳的矫正效果.
vi_ldc_attr.ldcv1_attr.aspect = 1; // 0;仅开水平LDC 1: 水平和垂直LDC都开.
vi_ldc_attr.ldcv1_attr.x_ratio = 0;
vi_ldc_attr.ldcv1_attr.y_ratio = 0;
vi_ldc_attr.ldcv1_attr.xy_ratio = 0;
vi_ldc_attr.ldcv1_attr.center_xoffset = 0;
vi_ldc_attr.ldcv1_attr.center_yoffset = 0;
vi_ldc_attr.ldcv1_attr.distortion_ratio = 300;
} else {
// LDC_V2参数通过标定得到.
vi_ldc_attr.ldcv2_attr.focal_len_x = 53272;
vi_ldc_attr.ldcv2_attr.focal_len_y = 53310;
vi_ldc_attr.ldcv2_attr.coor_shift_x = 40362;
vi_ldc_attr.ldcv2_attr.coor_shift_y = 24146;
vi_ldc_attr.ldcv2_attr.src_calibration_ratio[0] = -53082;
vi_ldc_attr.ldcv2_attr.src_calibration_ratio[1] = 23062;
vi_ldc_attr.ldcv2_attr.src_calibration_ratio[2] = -5125;
}
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].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_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
ret = xmedia_vi_set_chn_ldc_attr(vi_pipe, vi_chn, &vi_ldc_attr);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vi set chn ldc attr failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("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_PRT("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_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];
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.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
if (g_venc_use == XMEDIA_TRUE) {
// venc init
app_liveserver_init();
app_liveserver_start(vpss_ochn_size, venc_chn_cnt, framerate);
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_H265CBR;
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_H265CBR;
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_PRT("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_PRT("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_PRT("vpss bind venc failed !\n");
goto exit5;
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_FALSE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit6;
}
} else {
// vo init
ret = sample_comm_vo_get_default_config(vo_input, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get vo default config failed !\n");
goto exit3;
}
ret = sample_comm_vo_start(vo_dev, vo_layer, vo_chn, vo_chn_num, XMEDIA_TRUE, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vo start failed !\n");
goto exit3;
}
ret = sample_comm_sys_vpss_bind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit4;
}
}
PAUSE(g_force_exit);
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop_get_stream();
}
exit6:
if (g_venc_use == XMEDIA_TRUE) {
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
}
exit5:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
} else {
sample_comm_sys_vpss_unbind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
}
exit4:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop(&venc_config);
} else {
sample_comm_vo_stop(vo_dev, vo_layer, vo_chn, vo_chn_num);
}
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_vio_sys_exit();
return ret;
}
xmedia_s32 sample_vio_vi_offline_vpss_online_ahd_mipi()
{
xmedia_s32 i = 0;
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size = { 0 };
xmedia_video_size sub_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 };
sample_comm_tp9963_cfg tp9963_cfg = { 0 };
xmedia_s32 sensor_type = VI_AHD_MIPI_2M_YUV;
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[2] = { 0, 1 };
sample_vpss_config vpss_config = { 0 };
xmedia_video_size vpss_ochn_size[VPSS_MAX_OCHN_NUM] = { 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_s32 vo_dev = 0;
xmedia_s32 vo_layer = vo_dev;
xmedia_s32 vo_chn[1] = { 0 };
xmedia_s32 vo_chn_num = 1;
sample_vo_config_input vo_input = { 0 };
sample_vo_config vo_config = { 0 };
vo_input.square_sort = 1;
vo_input.screen_type = sample_vo_screen_type[0];
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);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &framerate);
// 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.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 20;
pic_size.width = sensor_info.width;
pic_size.height = sensor_info.height;
/* vicap-viproc offline VB */
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, sensor_info.pixel_format,
sensor_info.bit_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[0].block_size = blk_size;
sys_config.vb_conf.common_pool[0].block_cnt = 2;
SAMPLE_PRT("offline vb size : %d \n", blk_size);
/* VPSS-VENC VB */
blk_size = sample_comm_sys_get_buffer_size(pic_size, XMEDIA_VIDEO_FMT_TILE_32x4, video_param.pixel_fmt,
video_param.data_width, XMEDIA_VIDEO_COMPRESS_MODE_TILE);
sys_config.vb_conf.common_pool[1].block_size = blk_size;
sys_config.vb_conf.common_pool[1].block_cnt = 2;
SAMPLE_PRT("vpss-venc 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[2].block_size = blk_size;
sys_config.vb_conf.common_pool[2].block_cnt = 2;
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
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;
vi_config.dev_info[vi_dev].mipi_phy_en = XMEDIA_TRUE;
vi_config.dev_info[vi_dev].mipi_phy_config.mipi_rate = 594;
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_FALSE;
isp_param.isp_info[vi_pipe].sensor_type = sensor_type;
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));
ret = sample_comm_isp_sensor_reset(vi_config.dev_info[vi_dev].sns_clk_id);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("isp sensor reset failed!\n");
sample_vio_sys_exit();
return ret;
}
// isp init
ret = sample_comm_isp_init(&isp_param, &vi_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start isp failed!\n");
goto exit2;
}
tp9963_cfg.i2c_dev = vi_config.dev_info[vi_dev].i2c_id;
tp9963_cfg.chn[0] = TP_CH_1;
tp9963_cfg.fmt[0] = TP_FMT_FHD25;
tp9963_cfg.std[0] = TP_STD_TVI;
tp9963_cfg.chn[1] = TP_CH_MAX;
tp9963_cfg.mipi_mode = TP_MIPI_MODE_1CH2LANE_297M;
ret = sample_comm_tp9963_init(&tp9963_cfg);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("tp9963 init 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_PRT("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_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];
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;
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config.video_fmt = XMEDIA_VIDEO_FMT_TILE_32x4;
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].chn_config.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
if (g_venc_use == XMEDIA_TRUE) {
// venc init
app_liveserver_init();
app_liveserver_start(vpss_ochn_size, venc_chn_cnt, framerate);
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_H265CBR;
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_H265CBR;
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_PRT("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_PRT("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_PRT("vpss bind venc failed !\n");
goto exit5;
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_FALSE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit6;
}
} else {
// vo init
ret = sample_comm_vo_get_default_config(vo_input, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get vo default config failed !\n");
goto exit3;
}
ret = sample_comm_vo_start(vo_dev, vo_layer, vo_chn, vo_chn_num, XMEDIA_TRUE, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vo start failed !\n");
goto exit3;
}
ret = sample_comm_sys_vpss_bind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit4;
}
}
PAUSE(g_force_exit);
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop_get_stream();
}
exit6:
if (g_venc_use == XMEDIA_TRUE) {
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
}
exit5:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
} else {
sample_comm_sys_vpss_unbind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
}
exit4:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop(&venc_config);
} else {
sample_comm_vo_stop(vo_dev, vo_layer, vo_chn, vo_chn_num);
}
exit3:
sample_comm_vpss_stop(&vpss_config);
exit2:
sample_comm_tp9963_deinit();
sample_comm_isp_stop(&isp_param);
exit1:
sample_comm_vi_stop(&vi_config);
exit0:
sample_comm_isp_exit(&isp_param);
sample_vio_sys_exit();
return ret;
}
xmedia_s32 sample_vio_vi_offline_vpss_online_ext_switchx4()
{
xmedia_s32 i = 0;
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size = { 0 };
xmedia_video_size sub_pic_size = { 0 };
sample_comm_video_param video_param = { 0 };
sample_sys_config sys_config = { 0 };
xmedia_sys_switch_config switch_config0 = { 0 };
xmedia_sys_switch_config switch_config1 = { 0 };
xmedia_s32 vi_dev[2] = { 0, 1 };
xmedia_s32 vi_pipe[4] = { 0, 1, 2, 3 };
xmedia_s32 vi_chn = 0;
sample_vi_config vi_config = { 0 };
xmedia_s32 sensor_type = sample_vio_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[4] = { 0, 1, 2, 3 };
xmedia_s32 vpss_ochn = 0;
sample_vpss_config vpss_config = { 0 };
xmedia_video_size vpss_ochn_size[4][1] = { 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 };
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);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &framerate);
// 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.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
sys_config.vb_conf.max_pool_cnt = 20;
pic_size.width = sensor_info.width;
pic_size.height = sensor_info.height;
sub_pic_size.width = 640;
sub_pic_size.height = 480;
/* vicap-viproc offline VB */
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, sensor_info.pixel_format,
sensor_info.bit_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[0].block_size = blk_size;
sys_config.vb_conf.common_pool[0].block_cnt = 4;
SAMPLE_PRT("offline vb size : %d \n", blk_size);
/* VPSS-VENC VB */
blk_size = sample_comm_sys_get_buffer_size(sub_pic_size, XMEDIA_VIDEO_FMT_TILE_32x4, video_param.pixel_fmt,
video_param.data_width, XMEDIA_VIDEO_COMPRESS_MODE_TILE);
sys_config.vb_conf.common_pool[1].block_size = blk_size;
sys_config.vb_conf.common_pool[1].block_cnt = 4;
SAMPLE_PRT("vpss-venc vb size : %d \n", blk_size);
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
// switch init
switch_config0.ext_switch_en = XMEDIA_TRUE;
switch_config0.master_pipe_id = vi_pipe[0];
switch_config0.multi_pipe_mode = XMEDIA_SYS_MULTI_PIPE_MODE_DUAL_SWITCH;
switch_config0.pipe_id[0] = vi_pipe[0];
switch_config0.pipe_id[1] = vi_pipe[1];
switch_config0.pipe_num = 2;
switch_config0.pipe_sel[0] = 0;
switch_config0.pipe_sel[1] = 1;
switch_config0.sync_mode = XMEDIA_SYS_SWITCH_SYNC_MODE_SOC_MASTER_SLAVE;
ret = xmedia_sys_set_switch_config(0, &switch_config0);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("xmedia_sys_set_switch_config failed!\n");
sample_vio_sys_exit();
return ret;
}
switch_config1.ext_switch_en = XMEDIA_TRUE;
switch_config1.master_pipe_id = vi_pipe[2];
switch_config1.multi_pipe_mode = XMEDIA_SYS_MULTI_PIPE_MODE_DUAL_SWITCH;
switch_config1.pipe_id[0] = vi_pipe[2];
switch_config1.pipe_id[1] = vi_pipe[3];
switch_config1.pipe_num = 2;
switch_config1.pipe_sel[0] = 0;
switch_config1.pipe_sel[1] = 1;
switch_config1.sync_mode = XMEDIA_SYS_SWITCH_SYNC_MODE_SOC_MASTER_SLAVE;
ret = xmedia_sys_set_switch_config(1, &switch_config1);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("xmedia_sys_set_switch_config failed!\n");
sample_vio_sys_exit();
return ret;
}
for (i = 0; i < sizeof(vi_dev) / sizeof(vi_dev[0]); 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;
}
/*
* mipi0-dev0-pipe0(主)&pipe1(从)
* mipi1-dev1-pipe2(主)&pipe3(从)
*/
vi_config.dev_bind_pipe[vi_dev[0]].pipe[0] = vi_pipe[0];
vi_config.dev_bind_pipe[vi_dev[0]].pipe[1] = vi_pipe[1];
vi_config.dev_bind_pipe[vi_dev[1]].pipe[0] = vi_pipe[2];
vi_config.dev_bind_pipe[vi_dev[1]].pipe[1] = vi_pipe[3];
for (i = 0; i < sizeof(vi_pipe) / sizeof(vi_pipe[0]); 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;
}
framerate = 10;
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;
for (i = 0; i < sizeof(vi_pipe) / sizeof(vi_pipe[0]); i++) {
// 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;
isp_param.isp_info[vi_pipe[i]].mirror = mirror;
isp_param.isp_info[vi_pipe[i]].flip = flip;
isp_param.isp_info[vi_pipe[i]].disable_dynamic_fps = XMEDIA_TRUE;
if (vi_pipe[i] == switch_config0.master_pipe_id || vi_pipe[i] == switch_config1.master_pipe_id) {
isp_param.isp_info[vi_pipe[i]].sns_work_mode = XMEDIA_SENSOR_WORK_MODE_NORMAL;
} else {
isp_param.isp_info[vi_pipe[i]].sns_work_mode = XMEDIA_SENSOR_WORK_MODE_SLAVE;
isp_param.isp_info[vi_pipe[i]].serdes_enable = XMEDIA_TRUE;
isp_param.isp_info[vi_pipe[i]].i2c_addr_en = XMEDIA_TRUE;
isp_param.isp_info[vi_pipe[i]].i2c_addr = 0X62;
}
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_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start isp failed!\n");
goto exit2;
}
// vpss config
for (i = 0; i < sizeof(vpss_pipe) / sizeof(vpss_pipe[0]); i++) {
ret = sample_comm_vpss_get_default_pipe_cfg(&vpss_config.pipe_info[vpss_pipe[i]].pipe_config, pic_size, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
vpss_ochn_size[vpss_pipe[i]][0].width = sub_pic_size.width;
vpss_ochn_size[vpss_pipe[i]][0].height = sub_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;
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;
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].wrap_attr.enable = XMEDIA_FALSE;
vpss_config.pipe_info[vpss_pipe[i]].chn_info[vpss_chnl].wrap_attr.buf_line = sensor_info.height;
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.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
// venc init
app_liveserver_init();
app_liveserver_start((xmedia_video_size*)vpss_ochn_size, venc_chn_cnt, framerate);
for (i = 0; i < venc_chn_cnt; i++) {
venc_chnl = venc_chn[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_H265CBR;
sample_comm_venc_get_default_chn_info(vpss_ochn_size[vpss_pipe[i]][0], framerate, &venc_config.chn_info[venc_chnl]);
}
ret = sample_comm_venc_start(&venc_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start failed !\n");
goto exit3;
}
for (i = 0; i < venc_chn_cnt; i++) {
ret = sample_comm_sys_vpss_bind_venc(vpss_pipe[i], vpss_ochn, venc_chn[i]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit4;
}
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_FALSE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit4;
}
PAUSE(g_force_exit);
sample_comm_venc_stop_get_stream();
exit4:
for (i = 0; i < venc_chn_cnt; i++) {
sample_comm_sys_vpss_unbind_venc(vpss_pipe[i], vpss_ochn, venc_chn[i]);
}
sample_comm_venc_stop(&venc_config);
exit3:
app_liveserver_stop();
app_liveserver_deinit();
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_vio_sys_exit();
return ret;
}
xmedia_s32 sample_vio_vi_offline_vpss_online_switch_to_relay_zoom()
{
xmedia_s32 i = 0;
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 blk_size = 0;
xmedia_video_size pic_size = { 0 };
xmedia_video_size sub_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 = SMART_SC431HAI_MIPI_4M_30FPS_10BIT;
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[2] = { 0, 1 };
sample_vpss_config vpss_config = { 0 };
xmedia_video_size vpss_ochn_size[VPSS_MAX_OCHN_NUM] = { 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_s32 vo_dev = 0;
xmedia_s32 vo_layer = vo_dev;
xmedia_s32 vo_chn[1] = { 0 };
xmedia_s32 vo_chn_num = 1;
sample_vo_config_input vo_input = { 0 };
sample_vo_config vo_config = { 0 };
vo_input.square_sort = 1;
vo_input.screen_type = sample_vo_screen_type[0];
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);
sample_comm_vi_get_framerate_by_sensor(sensor_type, &framerate);
// 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.compress_level = XMEDIA_SYS_COMPRESS_LEVEL_0;
ret = sample_comm_sys_cmp_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("common sys failed !\n");
return ret;
}
// ret = xmedia_sys_set_vsync(vi_pipe, 1);
// if (ret != XMEDIA_SUCCESS) {
// SAMPLE_PRT("common sys vsync failed !\n");
// return ret;
// }
sys_config.vb_conf.max_pool_cnt = 20;
pic_size.width = sensor_info.width;
pic_size.height = sensor_info.height;
/* vicap-viproc offline VB */
blk_size = sample_comm_sys_get_buffer_size(pic_size, video_param.video_fmt, sensor_info.pixel_format,
sensor_info.bit_width, video_param.compress_mode);
sys_config.vb_conf.common_pool[0].block_size = blk_size;
sys_config.vb_conf.common_pool[0].block_cnt = 1;
SAMPLE_PRT("offline vb size : %d \n", blk_size);
/* VPSS-VENC VB */
blk_size = sample_comm_sys_get_buffer_size(pic_size, XMEDIA_VIDEO_FMT_TILE_32x4, video_param.pixel_fmt,
video_param.data_width, XMEDIA_VIDEO_COMPRESS_MODE_TILE);
sys_config.vb_conf.common_pool[1].block_size = blk_size;
sys_config.vb_conf.common_pool[1].block_cnt = 1;
SAMPLE_PRT("vpss-venc 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[2].block_size = blk_size;
sys_config.vb_conf.common_pool[2].block_cnt = 2;
sys_config.vb_conf.supplement_config = 1;
ret = sample_vio_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
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.pipe_info[vi_pipe].lowdelay_attr.enable = XMEDIA_TRUE;
vi_config.pipe_info[vi_pipe].lowdelay_attr.line_cnt = sensor_info.height / 2;
vi_config.pipe_info[vi_pipe].lowdelay_attr.one_buf_en = XMEDIA_TRUE;
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_param.isp_info[vi_pipe].sns_work_mode = XMEDIA_SENSOR_WORK_MODE_SLAVE;
// isp_param.isp_info[vi_pipe].signal.source = XMEDIA_SENSOR_TRIG_SOURCE_HOST;
// isp_param.isp_info[vi_pipe].signal.dev_id = 0; // Configure according to the actual situation
// 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].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_PRT("isp init failed!\n");
goto exit0;
}
xmedia_u32 isp_pipe = 1;
xmedia_sensor_attr sns_attr = { 0 };
xmedia_sensor_config sensor_cfg = { 0 };
sns_attr.width = isp_config.size.width;
sns_attr.height = isp_config.size.height;
sns_attr.wdr_mode = isp_config.wdr_mode;
sensor_cfg.ctrl_sig.clk_ch = vi_config.dev_info[vi_dev].sns_clk_id;
sensor_cfg.ctrl_sig.rst_ch = vi_config.dev_info[vi_dev].sns_clk_id;
sensor_cfg.comm_bus.type = XMEDIA_SENSOR_BUS_TYPE_I2C;
sensor_cfg.comm_bus.i2c_dev = vi_config.dev_info[vi_dev].i2c_id;
XMEDIA_SENSOR_REGISTER_DRIVER(isp_pipe, sc431hai);
ret = xmedia_sensor_init(isp_pipe, &sensor_cfg);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("pipe 1 sensor init failed!\n");
goto exit0;
}
ret = xmedia_sensor_set_mipi_lanes(isp_pipe, XMEDIA_SENSOR_MIPI_LANES_2L);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("pipe 1 sensor set mipi lanes");
goto exit0;
}
ret= xmedia_sensor_set_dev_addr(isp_pipe, 0x64);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("pipe 1 sensor set i2c addr");
goto exit0;
}
ret = xmedia_sensor_set_attr(isp_pipe, &sns_attr);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("pipe 1 sensor set attr");
goto exit0;
}
ret = xmedia_sensor_set_work_mode(isp_pipe, isp_param.isp_info[vi_pipe].sns_work_mode);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("pipe 1 sensor set work mode");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start isp failed!\n");
goto exit2;
}
ret = xmedia_sensor_start(isp_pipe);
if (ret != XMEDIA_SUCCESS) {
xmedia_sensor_stop(isp_pipe);
SAMPLE_PRT("pipe 1 start sensor failed!\n");
goto exit2;
}
xmedia_sensor_standby(isp_pipe);
// 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_PRT("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_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.enable = XMEDIA_TRUE;
vpss_config.pipe_info[vpss_pipe].chn_info[vpss_chnl].wrap_attr.buf_line = sensor_info.height;
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.depth = 0;
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit2;
}
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_PRT("get default pipe cfg failed !\n");
goto exit2;
}
// vpss start
ret = sample_comm_vpss_start(&vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit2;
}
if (g_venc_use == XMEDIA_TRUE) {
// venc init
app_liveserver_init();
app_liveserver_start(vpss_ochn_size, venc_chn_cnt, framerate);
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_H265CBR;
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_H265CBR;
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_PRT("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_PRT("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_PRT("vpss bind venc failed !\n");
goto exit5;
}
ret = sample_comm_venc_start_get_stream(venc_chn, venc_chn_cnt, XMEDIA_FALSE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit6;
}
} else {
// vo init
ret = sample_comm_vo_get_default_config(vo_input, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get vo default config failed !\n");
goto exit3;
}
ret = sample_comm_vo_start(vo_dev, vo_layer, vo_chn, vo_chn_num, XMEDIA_TRUE, &vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vo start failed !\n");
goto exit3;
}
ret = sample_comm_sys_vpss_bind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit4;
}
}
PAUSE(g_force_exit);
system("xmmm 0x100C0018 0x1025");
system("echo 35 > /sys/class/gpio/export");
system("echo out > /sys/class/gpio/gpio35/direction");
//切换地址和切换视频流--sensor 0x60 ->sensor 0x64
for (i = 0; i <= 3; i++) {
ret = xmedia_isp_wait_state(vi_pipe, XMEDIA_ISP_WAIT_TYPE_FE_END, 1000);
if (i == 0) {
if (ret == XMEDIA_SUCCESS) {
//1.切地址 2.唤醒sensor 1;
xmedia_sensor_set_dev_addr(vi_pipe, 0x64);
xmedia_sensor_resume(vi_pipe);
}
} else if (i == 3) {
//1. 切流 2.待机sensor 0
system("echo 1 > /sys/class/gpio/gpio35/value");
xmedia_sensor_set_dev_addr(isp_pipe, 0x60);
xmedia_sensor_standby(isp_pipe);
}
}
PAUSE(g_force_exit);
//切换地址和切换视频流-sensor 0x64 ->sensor 0x60
for (i = 0; i <= 3; i++) {
ret = xmedia_isp_wait_state(vi_pipe, XMEDIA_ISP_WAIT_TYPE_FE_END, 1000);
if (i == 0) {
if (ret == XMEDIA_SUCCESS) {
//1.切地址 2.唤醒sensor 0;
xmedia_sensor_set_dev_addr(vi_pipe, 0x60);
xmedia_sensor_resume(vi_pipe);
}
} else if (i == 3) {
//1. 切流 2.待机sensor 1
system("echo 0 > /sys/class/gpio/gpio35/value");
xmedia_sensor_set_dev_addr(isp_pipe, 0x64);
xmedia_sensor_standby(isp_pipe);
}
}
PAUSE(g_force_exit);
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop_get_stream();
}
exit6:
if (g_venc_use == XMEDIA_TRUE) {
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[1], venc_chn[1]);
}
exit5:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_sys_vpss_unbind_venc(vpss_pipe, vpss_ochn[0], venc_chn[0]);
} else {
sample_comm_sys_vpss_unbind_vo(vpss_pipe, vpss_ochn[0], vo_layer, vo_chn[0]);
}
exit4:
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop(&venc_config);
} else {
sample_comm_vo_stop(vo_dev, vo_layer, vo_chn, vo_chn_num);
}
exit3:
sample_comm_vpss_stop(&vpss_config);
exit2:
sample_comm_isp_stop(&isp_param);
xmedia_sensor_stop(isp_pipe);
exit1:
sample_comm_vi_stop(&vi_config);
exit0:
sample_comm_isp_exit(&isp_param);
xmedia_sensor_exit(isp_pipe);
XMEDIA_SENSOR_UNREGISTER_DRIVER(isp_pipe, sc431hai);
sample_vio_sys_exit();
return ret;
}
int main(int argc, char **argv)
{
xmedia_s32 ret = XMEDIA_SUCCESS;
xmedia_s32 work_mode = 0;
xmedia_s32 stream_mode = 0;
signal(SIGINT, sample_vio_handle_sig);
signal(SIGTERM, sample_vio_handle_sig);
if (argc == 2) {
if (!strncmp(argv[1], "-h", 2)) {
sample_vio_usage(argv[0]);
return 0;
}
g_venc_use = XMEDIA_TRUE;
} else if (argc == 3) {
stream_mode = atoi(argv[2]);
if (stream_mode == 1) {
g_venc_use = XMEDIA_TRUE;
} else if (stream_mode == 0) {
g_venc_use = XMEDIA_FALSE;
} else {
sample_vio_usage(argv[0]);
return 0;
}
} else {
sample_vio_usage(argv[0]);
return 0;
}
work_mode = atoi(argv[1]);
switch (work_mode) {
case 0:
ret = sample_vio_vi_online_vpss_online();
break;
case 1:
ret = sample_vio_vi_offline_vpss_online();
break;
case 2:
ret = sample_vio_vi_offline_vpss_offline();
break;
case 3:
ret = sample_vio_vi_offline_vpss_offline_wdr();
break;
case 4:
ret = sample_vio_vi_offline_vpss_offline_switch_linear_wdr();
break;
case 5:
ret = sample_vio_vi_offline_vpss_offline_switch_resolution();
break;
case 6:
ret = sample_vio_vi_offline_vpss_online_double();
break;
case 7:
ret = sample_vio_vi_offline_vpss_online_double_splicing();
break;
case 8:
ret = sample_vio_vi_online_vpss_online_double();
break;
case 9:
ret = sample_vio_vi_offline_vpss_offline_preroll_normal_readback();
break;
case 10:
ret = sample_vio_vi_offline_vpss_online_ldc();
break;
case 11:
ret = sample_vio_vi_offline_vpss_online_ahd_mipi();
break;
case 12:
ret = sample_vio_vi_offline_vpss_online_ext_switchx4();
break;
case 13:
ret = sample_vio_vi_offline_vpss_online_switch_to_relay_zoom();
break;
default:
sample_vio_usage(argv[0]);
return 0;
}
if (XMEDIA_SUCCESS == ret) {
SAMPLE_PRT("program exit normally!\n");
} else {
SAMPLE_PRT("program exit abnormally!\n");
}
return 0;
}