Files
gk-sdk/sample/region/sample_region.c
T

1007 lines
32 KiB
C
Executable File

/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif
#endif /* End of #ifdef __cplusplus */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/prctl.h>
#include "sample_comm.h"
#include "sample_comm_isp.h"
#include "sample_comm_sys.h"
#include "sample_comm_vi.h"
#include "sample_comm_vpss.h"
#include "sample_comm_vo.h"
#include "sample_comm_venc.h"
#include "sample_comm_region.h"
#include "sample_comm_livestream.h"
#define vi_chn_0_bmp "./res/vi_chn_0.bmp"
#define mm_bmp "./res/mm.bmp"
#define mm2_bmp "./res/mm2.bmp"
#define RGN_SAMPLE_WIDTH (200)
#define RGN_SAMPLE_HEIGHT (200)
#define RGN_CALC_HANDLE_NUM(width, height) \
((((width) / RGN_SAMPLE_WIDTH) < ((height) / RGN_SAMPLE_HEIGHT)) ? \
((width) / RGN_SAMPLE_WIDTH) : ((height) / RGN_SAMPLE_HEIGHT))
static sample_comm_sensor_type sample_region_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};
xmedia_s32 g_vi_dev = 0;
xmedia_s32 g_vi_pipe = 0;
xmedia_s32 g_vi_chn = 0;
xmedia_s32 g_vpss_chn = 0;
xmedia_s32 g_vpss_pipe = 0;
xmedia_s32 g_vpss_ichn = 0;
xmedia_s32 g_vpss_ochn[2] = { 0, 1 };
xmedia_s32 g_vo_dev = 0;
xmedia_s32 g_vo_layer = 0;
xmedia_s32 g_vo_chn[1] = { 0 };
xmedia_s32 g_vo_chn_num = 1;
xmedia_s32 g_venc_chnl = 0;
xmedia_s32 g_venc_chn[2] = { 0, 1 };
xmedia_s32 g_venc_chn_cnt = 2;
static sample_venc_config g_venc_config = { 0 };
static xmedia_bool g_venc_use = XMEDIA_TRUE; // vpss test 默认开启venc 看流
static sample_vi_config g_vi_config = { 0 };
static sample_isp_param g_isp_param = { 0 };
static sample_vpss_config g_vpss_config = { 0 };
static xmedia_char* g_path_bmp;
static xmedia_bool g_vo_display = XMEDIA_FALSE; // VO 打osd, 需要申请vb
static sample_vo_config g_vo_config = { 0 };
/******************************************************************************
* function : show usage
******************************************************************************/
static xmedia_void sample_region_usage(char* args)
{
printf("usage : %s <index> \n", args);
printf("index:\n");
printf("\t 0)VPSS OVERLAYEX.\n");
printf("\t 1)VPSS COVEREX.\n");
printf("\t 2)VPSS MOSAICEX.\n");
printf("\t 3)VPSS CORNER RECTEX.\n");
printf("\t 4)VO OVERLAYEX.\n");
printf("\t 5)VO COVEREX.\n");
printf("\t 6)VO CORNER RECTEX.\n");
printf("\t 7)VENC OVERLAY.\n");
printf("\t 8)VENC COVER.\n");
printf("\t 9)VENC MOSAIC.\n");
printf("\t 10)VENC CORNER RECT.\n");
return;
}
xmedia_s32 sample_region_sys_init(sample_sys_config *sys_config)
{
xmedia_s32 ret = 0;
ret = sample_comm_sys_init(sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sample_comm_sys_init failed!\n");
return ret;
}
ret = sample_comm_region_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_vo_init failed!\n");
return ret;
}
return XMEDIA_SUCCESS;
}
xmedia_void sample_region_sys_exit(void)
{
sample_comm_venc_exit();
sample_comm_vo_exit();
sample_comm_vpss_exit();
sample_comm_vi_exit();
sample_comm_region_exit();
sample_comm_sys_exit();
}
xmedia_void sample_region_handle_sig(xmedia_s32 signo)
{
if (SIGINT == signo || SIGTSTP == signo || SIGTERM == signo) {
sample_comm_venc_stop_get_stream();
sample_comm_venc_stop(&g_venc_config);
sample_comm_isp_stop(&g_isp_param);
sample_comm_isp_exit(&g_isp_param);
sample_region_sys_exit();
SAMPLE_PRT("\033[0;31mprogram exit abnormally!\033[0;39m\n");
}
exit(0);
}
xmedia_s32 sample_comm_media_vi_vpss_vo_start(xmedia_void)
{
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 sensor_type = sample_region_sensor_type[0];
xmedia_u32 framerate = 0;
vi_sensor_info sensor_info = { 0 };
xmedia_isp_config isp_config = { 0 };
xmedia_bool mirror = XMEDIA_FALSE;
xmedia_bool flip = XMEDIA_FALSE;
xmedia_video_size g_vpss_ochn_size[VPSS_MAX_OCHN_NUM] = { 0 };
sample_vo_config_input vo_input = { 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[g_vi_pipe].vicap_viproc_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.sys_conf.pipe_mode[g_vi_pipe].viproc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.sys_conf.pipe_mode[g_vi_pipe].gdc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
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 = 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_region_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
memset(&g_vi_config, 0 , sizeof(sample_vi_config));
g_vi_config.dev_info[g_vi_dev].dev_en = XMEDIA_TRUE;
g_vi_config.dev_info[g_vi_dev].dev_no = g_vi_dev;
g_vi_config.dev_info[g_vi_dev].sensor_type = sensor_type;
g_vi_config.pipe_info[g_vi_pipe].pipe_en = XMEDIA_TRUE;
g_vi_config.pipe_info[g_vi_pipe].pipe_no = g_vi_pipe;
g_vi_config.pipe_info[g_vi_pipe].chn_info[g_vi_chn].chn_en = XMEDIA_TRUE;
g_vi_config.pipe_info[g_vi_pipe].chn_info[g_vi_chn].chn_no = g_vi_chn;
g_vi_config.dev_bind_pipe[g_vi_dev].pipe[0] = g_vi_pipe;
g_vi_config.dev_bind_pipe[g_vi_dev].pipe[1] = -1;
isp_config.bayer_fmt = XMEDIA_VIDEO_BAYER_FMT_RGGB;
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
memset(&g_isp_param, 0 , sizeof(sample_isp_param));
g_isp_param.pipe[g_vi_pipe] = g_vi_pipe;
g_isp_param.isp_info[g_vi_pipe].isp_pipe_en = XMEDIA_TRUE;
g_isp_param.isp_info[g_vi_pipe].isp_sensor_en = XMEDIA_TRUE;
g_isp_param.isp_info[g_vi_pipe].sensor_type = sensor_type;
g_isp_param.isp_info[g_vi_pipe].mirror = mirror;
g_isp_param.isp_info[g_vi_pipe].flip = flip;
memcpy(&(g_isp_param.isp_info[g_vi_pipe].isp_config), &isp_config, sizeof(xmedia_isp_config));
// isp init
ret = sample_comm_isp_init(&g_isp_param, &g_vi_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&g_vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&g_isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start isp failed!\n");
goto exit2;
}
// vpss config
memset(&g_vpss_config, 0 , sizeof(sample_vpss_config));
ret = sample_comm_vpss_get_default_pipe_cfg(&g_vpss_config.pipe_info[g_vpss_pipe].pipe_config, pic_size, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit3;
}
g_vpss_ochn_size[0].width = sensor_info.width;
g_vpss_ochn_size[0].height = sensor_info.height;
g_vpss_ochn_size[1].width = 640;
g_vpss_ochn_size[1].height = 480;
g_vpss_config.pipe_info[g_vpss_pipe].pipe_en = XMEDIA_TRUE;
g_vpss_config.pipe_info[g_vpss_pipe].pipe_no = g_vpss_pipe;
g_vpss_chn = g_vpss_ochn[0];
g_vpss_config.pipe_info[g_vpss_pipe].chn_info[g_vpss_chn].chn_en = XMEDIA_TRUE;
g_vpss_config.pipe_info[g_vpss_pipe].chn_info[g_vpss_chn].chn_no = g_vpss_ochn[0];
ret = sample_comm_vpss_get_default_ochn_cfg(&g_vpss_config.pipe_info[g_vpss_pipe].chn_info[g_vpss_chn].chn_config,
g_vpss_ochn_size[g_vpss_chn], &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit3;
}
g_vpss_chn = g_vpss_ochn[1];
g_vpss_config.pipe_info[g_vpss_pipe].chn_info[g_vpss_chn].chn_en = XMEDIA_TRUE;
g_vpss_config.pipe_info[g_vpss_pipe].chn_info[g_vpss_chn].chn_no = g_vpss_ochn[1];
ret = sample_comm_vpss_get_default_ochn_cfg(&g_vpss_config.pipe_info[g_vpss_pipe].chn_info[g_vpss_chn].chn_config,
g_vpss_ochn_size[g_vpss_chn], &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit3;
}
// vpss start
ret = sample_comm_vpss_start(&g_vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit3;
}
ret = sample_comm_sys_vi_bind_vpss(g_vi_pipe, g_vi_chn, g_vpss_pipe, g_vpss_ichn);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit4;
}
// vo init
ret = sample_comm_vo_get_default_config(vo_input, &g_vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get vo default config failed !\n");
goto exit5;
}
ret = sample_comm_vo_start(g_vo_dev, g_vo_layer, g_vo_chn, g_vo_chn_num, g_vo_display, &g_vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vo start failed !\n");
goto exit5;
}
ret = sample_comm_sys_vpss_bind_vo(g_vpss_pipe, g_vpss_ochn[0], g_vo_layer, g_vo_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit6;
}
return XMEDIA_SUCCESS;
exit6:
sample_comm_vo_stop(g_vo_dev, g_vo_layer, g_vo_chn, g_vo_chn_num);
exit5:
sample_comm_sys_vi_unbind_vpss(g_vi_pipe, g_vi_chn, g_vpss_pipe, g_vpss_ichn);
exit4:
sample_comm_vpss_stop(&g_vpss_config);
exit3:
sample_comm_isp_stop(&g_isp_param);
exit2:
sample_comm_vi_stop(&g_vi_config);
exit1:
sample_comm_isp_exit(&g_isp_param);
exit0:
sample_region_sys_exit();
return ret;
}
xmedia_void sample_comm_media_vi_vpss_vo_stop(xmedia_void)
{
sample_comm_sys_vpss_unbind_vo(g_vpss_pipe, g_vpss_ochn[0], g_vo_layer, g_vo_chn[0]);
sample_comm_vo_stop(g_vo_dev, g_vo_layer, g_vo_chn, g_vo_chn_num);
sample_comm_sys_vi_unbind_vpss(g_vi_pipe, g_vi_chn, g_vpss_pipe, g_vpss_ichn);
sample_comm_vpss_stop(&g_vpss_config);
sample_comm_isp_stop(&g_isp_param);
sample_comm_vi_stop(&g_vi_config);
sample_comm_isp_exit(&g_isp_param);
sample_region_sys_exit();
return ;
}
xmedia_s32 sample_comm_media_vi_vpss_venc_start(xmedia_void)
{
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 sensor_type = sample_region_sensor_type[0];
xmedia_u32 framerate = 0;
vi_sensor_info sensor_info = { 0 };
xmedia_isp_config isp_config = { 0 };
xmedia_bool mirror = XMEDIA_FALSE;
xmedia_bool flip = XMEDIA_FALSE;
xmedia_video_size g_vpss_ochn_size[VPSS_MAX_OCHN_NUM] = { 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[g_vi_pipe].vicap_viproc_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.sys_conf.pipe_mode[g_vi_pipe].viproc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
sys_config.sys_conf.pipe_mode[g_vi_pipe].gdc_vpss_mode = XMEDIA_WORK_MODE_OFFLINE;
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 = 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_region_sys_init(&sys_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sys init failed !\n");
return ret;
}
memset(&g_vi_config, 0 , sizeof(sample_vi_config));
g_vi_config.dev_info[g_vi_dev].dev_en = XMEDIA_TRUE;
g_vi_config.dev_info[g_vi_dev].dev_no = g_vi_dev;
g_vi_config.dev_info[g_vi_dev].sensor_type = sensor_type;
g_vi_config.pipe_info[g_vi_pipe].pipe_en = XMEDIA_TRUE;
g_vi_config.pipe_info[g_vi_pipe].pipe_no = g_vi_pipe;
g_vi_config.pipe_info[g_vi_pipe].chn_info[g_vi_chn].chn_en = XMEDIA_TRUE;
g_vi_config.pipe_info[g_vi_pipe].chn_info[g_vi_chn].chn_no = g_vi_chn;
g_vi_config.dev_bind_pipe[g_vi_dev].pipe[0] = g_vi_pipe;
g_vi_config.dev_bind_pipe[g_vi_dev].pipe[1] = -1;
isp_config.bayer_fmt = XMEDIA_VIDEO_BAYER_FMT_RGGB;
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
memset(&g_isp_param, 0 , sizeof(sample_isp_param));
g_isp_param.pipe[g_vi_pipe] = g_vi_pipe;
g_isp_param.isp_info[g_vi_pipe].isp_pipe_en = XMEDIA_TRUE;
g_isp_param.isp_info[g_vi_pipe].isp_sensor_en = XMEDIA_TRUE;
g_isp_param.isp_info[g_vi_pipe].sensor_type = sensor_type;
g_isp_param.isp_info[g_vi_pipe].mirror = mirror;
g_isp_param.isp_info[g_vi_pipe].flip = flip;
memcpy(&(g_isp_param.isp_info[g_vi_pipe].isp_config), &isp_config, sizeof(xmedia_isp_config));
// isp init
ret = sample_comm_isp_init(&g_isp_param, &g_vi_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("isp init failed!\n");
goto exit0;
}
// vi start
ret = sample_comm_vi_start(&g_vi_config, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start vi failed!\n");
goto exit1;
}
// isp start
ret = sample_comm_isp_start(&g_isp_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("start isp failed!\n");
goto exit2;
}
// vpss config
memset(&g_vpss_config, 0 , sizeof(sample_vpss_config));
ret = sample_comm_vpss_get_default_pipe_cfg(&g_vpss_config.pipe_info[g_vpss_pipe].pipe_config, pic_size, &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit3;
}
g_vpss_ochn_size[0].width = sensor_info.width;
g_vpss_ochn_size[0].height = sensor_info.height;
g_vpss_ochn_size[1].width = 640;
g_vpss_ochn_size[1].height = 480;
g_vpss_config.pipe_info[g_vpss_pipe].pipe_en = XMEDIA_TRUE;
g_vpss_config.pipe_info[g_vpss_pipe].pipe_no = g_vpss_pipe;
g_vpss_chn = g_vpss_ochn[0];
g_vpss_config.pipe_info[g_vpss_pipe].chn_info[g_vpss_chn].chn_en = XMEDIA_TRUE;
g_vpss_config.pipe_info[g_vpss_pipe].chn_info[g_vpss_chn].chn_no = g_vpss_ochn[0];
ret = sample_comm_vpss_get_default_ochn_cfg(&g_vpss_config.pipe_info[g_vpss_pipe].chn_info[g_vpss_chn].chn_config,
g_vpss_ochn_size[g_vpss_chn], &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit3;
}
g_vpss_chn = g_vpss_ochn[1];
g_vpss_config.pipe_info[g_vpss_pipe].chn_info[g_vpss_chn].chn_en = XMEDIA_TRUE;
g_vpss_config.pipe_info[g_vpss_pipe].chn_info[g_vpss_chn].chn_no = g_vpss_ochn[1];
ret = sample_comm_vpss_get_default_ochn_cfg(&g_vpss_config.pipe_info[g_vpss_pipe].chn_info[g_vpss_chn].chn_config,
g_vpss_ochn_size[g_vpss_chn], &video_param);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("get default pipe cfg failed !\n");
goto exit3;
}
// vpss start
ret = sample_comm_vpss_start(&g_vpss_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss start failed !\n");
goto exit3;
}
ret = sample_comm_sys_vi_bind_vpss(g_vi_pipe, g_vi_chn, g_vpss_pipe, g_vpss_ichn);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind vo failed !\n");
goto exit4;
}
app_liveserver_init();
app_liveserver_start(g_vpss_ochn_size, g_venc_chn_cnt, framerate);
// venc config
memset(&g_venc_config, 0 , sizeof(sample_venc_config));
g_venc_chnl = g_venc_chn[0];
g_venc_config.chn_info[g_venc_chnl].venc_en = XMEDIA_TRUE;
g_venc_config.chn_info[g_venc_chnl].venc_chn = g_venc_chnl;
g_venc_config.chn_info[g_venc_chnl].payload_type = PT_H265;
g_venc_config.chn_info[g_venc_chnl].rc_mode = VENC_RC_MODE_H265CBR;
sample_comm_venc_get_default_chn_info(g_vpss_ochn_size[0], framerate, &g_venc_config.chn_info[g_venc_chnl]);
g_venc_chnl = g_venc_chn[1];
g_venc_config.chn_info[g_venc_chnl].venc_en = XMEDIA_TRUE;
g_venc_config.chn_info[g_venc_chnl].venc_chn = g_venc_chnl;
g_venc_config.chn_info[g_venc_chnl].payload_type = PT_H265;
g_venc_config.chn_info[g_venc_chnl].rc_mode = VENC_RC_MODE_H265CBR;
sample_comm_venc_get_default_chn_info(g_vpss_ochn_size[1], framerate, &g_venc_config.chn_info[g_venc_chnl]);
ret = sample_comm_venc_start(&g_venc_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start failed !\n");
goto exit5;
}
ret = sample_comm_sys_vpss_bind_venc(g_vpss_pipe, g_vpss_ochn[0], g_venc_chn[0]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit6;
}
ret = sample_comm_sys_vpss_bind_venc(g_vpss_pipe, g_vpss_ochn[1], g_venc_chn[1]);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("vpss bind venc failed !\n");
goto exit7;
}
ret = sample_comm_venc_start_get_stream(g_venc_chn, g_venc_chn_cnt, XMEDIA_TRUE, XMEDIA_FALSE, ".");
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("venc start get stream failed !\n");
goto exit8;
}
return XMEDIA_SUCCESS;
exit8:
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(g_vpss_pipe, g_vpss_ochn[1], g_venc_chn[1]);
exit7:
sample_comm_sys_vpss_unbind_venc(g_vpss_pipe, g_vpss_ochn[0], g_venc_chn[0]);
exit6:
sample_comm_venc_stop(&g_venc_config);
exit5:
sample_comm_sys_vi_unbind_vpss(g_vi_pipe, g_vi_chn, g_vpss_pipe, g_vpss_ichn);
exit4:
sample_comm_vpss_stop(&g_vpss_config);
exit3:
sample_comm_isp_stop(&g_isp_param);
exit2:
sample_comm_vi_stop(&g_vi_config);
exit1:
sample_comm_isp_exit(&g_isp_param);
exit0:
sample_region_sys_exit();
return ret;
}
xmedia_void sample_comm_media_vi_vpss_venc_stop(xmedia_void)
{
app_liveserver_stop();
app_liveserver_deinit();
sample_comm_sys_vpss_unbind_venc(g_vpss_pipe, g_vpss_ochn[1], g_venc_chn[1]);
sample_comm_sys_vpss_unbind_venc(g_vpss_pipe, g_vpss_ochn[0], g_venc_chn[0]);
sample_comm_venc_stop(&g_venc_config);
sample_comm_sys_vi_unbind_vpss(g_vi_pipe, g_vi_chn, g_vpss_pipe, g_vpss_ichn);
sample_comm_vpss_stop(&g_vpss_config);
sample_comm_isp_stop(&g_isp_param);
sample_comm_vi_stop(&g_vi_config);
sample_comm_isp_exit(&g_isp_param);
sample_region_sys_exit();
return ;
}
static xmedia_s32 sample_region_set_bmp(xmedia_s32 handle_num, xmedia_rgn_type type)
{
xmedia_s32 min_handle, i, ret;
min_handle = sample_comm_region_get_min_handle(type);
ret = sample_comm_region_check_min(min_handle);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("min_handle(%d) should be in [0, %d).\n", min_handle, RGN_HANDLE_MAX);
return ret;
}
if (type == XMEDIA_RGN_TYPE_OVERLAY || type == XMEDIA_RGN_TYPE_OVERLAYEX) {
for (i = min_handle; i < min_handle + handle_num; i++) {
ret = sample_comm_region_get_up_canvas(i, g_path_bmp);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sample_comm_region_get_up_canvas failed!\n");
return ret;
}
}
}
return XMEDIA_SUCCESS;
}
xmedia_s32 sample_region_media_start(xmedia_s32 handle_num,xmedia_rgn_type type, xmedia_chn_info *chn)
{
xmedia_s32 ret;
xmedia_s32 min_handle;
if (g_venc_use == XMEDIA_TRUE) {
ret = sample_comm_media_vi_vpss_venc_start();
} else {
ret = sample_comm_media_vi_vpss_vo_start();
}
if(XMEDIA_SUCCESS != ret) {
return ret;
}
ret = sample_comm_region_create(handle_num, type);
if(XMEDIA_SUCCESS != ret) {
SAMPLE_PRT("sample_comm_region_create failed!\n");
goto EXIT1;
}
ret = sample_comm_region_attach_to_chn(handle_num, type, chn);
if(XMEDIA_SUCCESS != ret) {
SAMPLE_PRT("sample_comm_region_attach_to_chn failed!\n");
goto EXIT2;
}
min_handle = sample_comm_region_get_min_handle(type);
if(min_handle == -1) {
SAMPLE_PRT("sample_comm_region_get_min_handle failed!\n");
return XMEDIA_FAILURE;
}
ret = sample_region_set_bmp(handle_num, type);
if(XMEDIA_SUCCESS != ret) {
SAMPLE_PRT("sample_comm_region_attach_to_chn failed!\n");
goto EXIT2;
}
PAUSE(0);
EXIT2:
ret = sample_comm_region_detach_frm_chn(handle_num, type, chn);
if(XMEDIA_SUCCESS!= ret) {
SAMPLE_PRT("sample_comm_region_detach_frm_chn failed!\n");
}
EXIT1:
ret = sample_comm_region_destroy(handle_num, type);
if(XMEDIA_SUCCESS != ret) {
SAMPLE_PRT("sample_comm_region_destroy failed!\n");
}
if (g_venc_use == XMEDIA_TRUE) {
sample_comm_venc_stop_get_stream();
sample_comm_media_vi_vpss_venc_stop();
} else {
sample_comm_media_vi_vpss_vo_stop();
}
return ret;
}
xmedia_s32 sample_region_vpss_overlayex(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 handle_num;
xmedia_rgn_type type;
xmedia_chn_info chn;
handle_num = 4;
type = XMEDIA_RGN_TYPE_OVERLAYEX;
chn.mod_id = MOD_ID_VPSS;
chn.dev_id = 0;
chn.chn_id = 0;
g_path_bmp = mm_bmp;
ret = sample_region_media_start(handle_num, type, &chn);
return ret;
}
xmedia_s32 sample_region_vpss_coverex(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 handle_num;
xmedia_rgn_type type;
xmedia_chn_info chn;
handle_num = 4;
type = XMEDIA_RGN_TYPE_COVEREX;
chn.mod_id = MOD_ID_VPSS;
chn.dev_id = 0;
chn.chn_id = 0;
ret = sample_region_media_start(handle_num, type, &chn);
return ret;
}
xmedia_s32 sample_region_vpss_mosaicex(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 handle_num;
xmedia_rgn_type type;
xmedia_chn_info chn;
handle_num = 4;
type = XMEDIA_RGN_TYPE_MOSAICEX;
chn.mod_id = MOD_ID_VPSS;
chn.dev_id = 0;
chn.chn_id = 0;
ret = sample_region_media_start(handle_num, type, &chn);
return ret;
}
xmedia_s32 sample_region_vpss_corner_rectex(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 handle_num;
xmedia_rgn_type type;
xmedia_chn_info chn;
handle_num = 4;
type = XMEDIA_RGN_TYPE_CORNER_RECTEX;
chn.mod_id = MOD_ID_VPSS;
chn.dev_id = 0;
chn.chn_id = 0;
ret = sample_region_media_start(handle_num, type, &chn);
return ret;
}
xmedia_s32 sample_region_vo_overlayex(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 handle_num;
xmedia_rgn_type type;
xmedia_chn_info chn;
handle_num = 1;
type = XMEDIA_RGN_TYPE_OVERLAYEX;
chn.mod_id = MOD_ID_VO;
chn.dev_id = 0;
chn.chn_id = 0;
g_path_bmp = mm_bmp;
g_vo_display = XMEDIA_TRUE;
g_venc_use = XMEDIA_FALSE;
ret = sample_region_media_start(handle_num, type, &chn);
g_vo_display = XMEDIA_FALSE;
g_venc_use = XMEDIA_TRUE;
return ret;
}
xmedia_s32 sample_region_vo_coverex(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 handle_num;
xmedia_rgn_type type;
xmedia_chn_info chn;
handle_num = 1;
type = XMEDIA_RGN_TYPE_COVEREX;
chn.mod_id = MOD_ID_VO;
chn.dev_id = 0;
chn.chn_id = 0;
g_vo_display = XMEDIA_TRUE;
g_venc_use = XMEDIA_FALSE;
ret = sample_region_media_start(handle_num, type, &chn);
g_vo_display = XMEDIA_FALSE;
g_venc_use = XMEDIA_TRUE;
return ret;
}
xmedia_s32 sample_region_vo_corner_rectex(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 handle_num;
xmedia_rgn_type type;
xmedia_chn_info chn;
sample_vo_config_input vo_input = { 0 };
vo_input.square_sort = 1;
vo_input.screen_type = sample_vo_screen_type[0];
ret = sample_comm_vo_get_default_config(vo_input, &g_vo_config);
if (ret != XMEDIA_SUCCESS) {
SAMPLE_PRT("sample_comm_vo_get_default_config failed !\n");
return ret;
}
handle_num = RGN_CALC_HANDLE_NUM(g_vo_config.chn_attr[0].out_rect.width, g_vo_config.chn_attr[0].out_rect.height);
type = XMEDIA_RGN_TYPE_CORNER_RECTEX;
chn.mod_id = MOD_ID_VO;
chn.dev_id = 0;
chn.chn_id = 0;
g_vo_display = XMEDIA_TRUE;
g_venc_use = XMEDIA_FALSE;
ret = sample_region_media_start(handle_num, type, &chn);
g_vo_display = XMEDIA_FALSE;
g_venc_use = XMEDIA_TRUE;
return ret;
}
xmedia_s32 sample_region_venc_overlay(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 handle_num;
xmedia_rgn_type type;
xmedia_chn_info chn;
handle_num = 2;
type = XMEDIA_RGN_TYPE_OVERLAY;
chn.mod_id = MOD_ID_VENC;
chn.dev_id = 0;
chn.chn_id = 0;
g_path_bmp = mm_bmp;
g_vo_display = XMEDIA_FALSE;
g_venc_use = XMEDIA_TRUE;
ret = sample_region_media_start(handle_num, type, &chn);
g_vo_display = XMEDIA_FALSE;
g_venc_use = XMEDIA_TRUE;
return ret;
}
xmedia_s32 sample_region_venc_cover(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 handle_num;
xmedia_rgn_type type;
xmedia_chn_info chn;
handle_num = 2;
type = XMEDIA_RGN_TYPE_COVER;
chn.mod_id = MOD_ID_VENC;
chn.dev_id = 0;
chn.chn_id = 0;
g_path_bmp = mm_bmp;
g_vo_display = XMEDIA_FALSE;
g_venc_use = XMEDIA_TRUE;
ret = sample_region_media_start(handle_num, type, &chn);
g_vo_display = XMEDIA_FALSE;
g_venc_use = XMEDIA_TRUE;
return ret;
}
xmedia_s32 sample_region_venc_mosaic(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 handle_num;
xmedia_rgn_type type;
xmedia_chn_info chn;
handle_num = 2;
type = XMEDIA_RGN_TYPE_MOSAIC;
chn.mod_id = MOD_ID_VENC;
chn.dev_id = 0;
chn.chn_id = 0;
g_path_bmp = mm_bmp;
g_vo_display = XMEDIA_FALSE;
g_venc_use = XMEDIA_TRUE;
ret = sample_region_media_start(handle_num, type, &chn);
g_vo_display = XMEDIA_FALSE;
g_venc_use = XMEDIA_TRUE;
return ret;
}
xmedia_s32 sample_region_venc_corner_rect(xmedia_void)
{
xmedia_s32 ret;
xmedia_s32 handle_num;
xmedia_rgn_type type;
xmedia_chn_info chn;
handle_num = 2;
type = XMEDIA_RGN_TYPE_CORNER_RECT;
chn.mod_id = MOD_ID_VENC;
chn.dev_id = 0;
chn.chn_id = 0;
g_path_bmp = mm_bmp;
g_vo_display = XMEDIA_FALSE;
g_venc_use = XMEDIA_TRUE;
ret = sample_region_media_start(handle_num, type, &chn);
g_vo_display = XMEDIA_FALSE;
g_venc_use = XMEDIA_TRUE;
return ret;
}
int main(int argc, char* argv[])
{
xmedia_s32 ret = XMEDIA_FAILURE;
xmedia_s32 index;
if (argc != 2) {
sample_region_usage(argv[0]);
return XMEDIA_FAILURE;
}
if (!strncmp(argv[1], "-h", 2)) { /* 2:arg num */
sample_region_usage(argv[0]);
return XMEDIA_FAILURE;
}
signal(SIGINT, sample_region_handle_sig);
signal(SIGTERM, sample_region_handle_sig);
index = atoi(argv[1]);
switch (index) {
case 0:
ret = sample_region_vpss_overlayex();
break;
case 1:
ret = sample_region_vpss_coverex();
break;
case 2:
ret = sample_region_vpss_mosaicex();
break;
case 3:
ret = sample_region_vpss_corner_rectex();
break;
case 4:
ret = sample_region_vo_overlayex();
break;
case 5:
ret = sample_region_vo_coverex();
break;
case 6:
ret = sample_region_vo_corner_rectex();
break;
case 7:
ret = sample_region_venc_overlay();
break;
case 8:
ret = sample_region_venc_cover();
break;
case 9:
ret = sample_region_venc_mosaic();
break;
case 10:
ret = sample_region_venc_corner_rect();
break;
default:
SAMPLE_PRT("the index %d is invaild!\n",index);
sample_region_usage(argv[0]);
ret = XMEDIA_FAILURE;
break;
}
if (XMEDIA_SUCCESS == ret) {
SAMPLE_PRT("program exit normally!\n");
} else {
SAMPLE_PRT("program exit abnormally!\n");
}
return (ret);
}
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */