/* * Copyright (c) XMEDIA. All rights reserved. */ #include #include #include #include #include #include #include #include #include #include #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; }