804 lines
23 KiB
C
Executable File
804 lines
23 KiB
C
Executable File
/*
|
|
* Copyright (c) Hunan xmedia,Chengdu xmedia,Shandong xmedia. 2021. All rights reserved.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <signal.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
#include <fcntl.h>
|
|
#include <sys/mman.h>
|
|
#include "math_fun.h"
|
|
|
|
#include "sample_comm.h"
|
|
#include "xmedia_type.h"
|
|
#include "xmedia_sys.h"
|
|
#include "xmedia_vb.h"
|
|
#include "xmedia_vo.h"
|
|
#include "sample_comm_sys.h"
|
|
#include "xmedia_scene.h"
|
|
|
|
static sample_comm_npu_workspace_cfg g_npu_workspace_cfg = {0};
|
|
static xmedia_s32 g_mem_dev;
|
|
|
|
xmedia_s32 sample_comm_sys_init(sample_sys_config *sys_conifg)
|
|
{
|
|
CHECK_RET(xmedia_vb_exit(), "vb exit");
|
|
|
|
CHECK_RET(xmedia_sys_exit(), "sys exit");
|
|
|
|
CHECK_RET(xmedia_sys_init(&sys_conifg->sys_conf), "sys init");
|
|
|
|
CHECK_RET(xmedia_vb_init(&sys_conifg->vb_conf), "vb init");
|
|
|
|
#if 0
|
|
// setting scene capability if necessary
|
|
|
|
CHECK_RET(xmedia_scene_init(), "scene init");
|
|
|
|
xmedia_media_npu_load npu_load = XMEDIA_NPU_LOAD_LIGHT;
|
|
xmedia_scene_capability scene_capability = { 0 };
|
|
|
|
scene_capability.vpu_chn[0].vpu_chn_id = 0;
|
|
scene_capability.vpu_chn[0].capability.width = 3840;
|
|
scene_capability.vpu_chn[0].capability.height = 2160;
|
|
scene_capability.vpu_chn[0].capability.framerate = 30;
|
|
scene_capability.vpu_chn[1].vpu_chn_id = 1;
|
|
scene_capability.vpu_chn[1].capability.width = 1280;
|
|
scene_capability.vpu_chn[1].capability.height = 720;
|
|
scene_capability.vpu_chn[1].capability.framerate = 30;
|
|
CHECK_RET(xmedia_scene_config(npu_load, &scene_capability), "scene config");
|
|
#endif
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_cmp_init(sample_sys_config *sys_conifg)
|
|
{
|
|
CHECK_RET(xmedia_vb_exit(), "vb exit");
|
|
|
|
CHECK_RET(xmedia_sys_exit(), "sys exit");
|
|
|
|
CHECK_RET(xmedia_sys_init(&sys_conifg->sys_conf), "sys init");
|
|
|
|
CHECK_RET(xmedia_sys_set_compress_level(sys_conifg->compress_level), "set compress level");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_vb_init(sample_sys_config *sys_conifg)
|
|
{
|
|
CHECK_RET(xmedia_vb_init(&sys_conifg->vb_conf), "vb init");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_exit(xmedia_void)
|
|
{
|
|
CHECK_RET(xmedia_vb_exit(), "vb exit");
|
|
|
|
CHECK_RET(xmedia_sys_exit(), "sys exit");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vi_bind_vo(xmedia_s32 vi_pipe, xmedia_s32 vi_chn, xmedia_vo_layer vo_layer,
|
|
xmedia_s32 vo_chn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VI;
|
|
src_chn.dev_id = vi_pipe;
|
|
src_chn.chn_id = vi_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VO;
|
|
dst_chn.dev_id = vo_layer;
|
|
dst_chn.chn_id = vo_chn;
|
|
|
|
CHECK_RET(xmedia_sys_bind(&src_chn, &dst_chn), "xmedia_sys_bind(VI-VO)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vi_unbind_vo(xmedia_s32 vi_pipe, xmedia_s32 vi_chn, xmedia_vo_layer vo_layer,
|
|
xmedia_s32 vo_chn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VI;
|
|
src_chn.dev_id = vi_pipe;
|
|
src_chn.chn_id = vi_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VO;
|
|
dst_chn.dev_id = vo_layer;
|
|
dst_chn.chn_id = vo_chn;
|
|
|
|
CHECK_RET(xmedia_sys_unbind(&src_chn, &dst_chn), "xmedia_sys_unbind(VI-VO)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vi_bind_vpss(xmedia_s32 vi_pipe, xmedia_s32 vi_chn, xmedia_s32 vpss_pipe,
|
|
xmedia_s32 vpss_ichn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VI;
|
|
src_chn.dev_id = vi_pipe;
|
|
src_chn.chn_id = vi_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VPSS;
|
|
dst_chn.dev_id = vpss_pipe;
|
|
dst_chn.chn_id = vpss_ichn;
|
|
|
|
CHECK_RET(xmedia_sys_bind(&src_chn, &dst_chn), "xmedia_sys_bind(VI-VPSS)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vi_unbind_vpss(xmedia_s32 vi_pipe, xmedia_s32 vi_chn, xmedia_s32 vpss_pipe,
|
|
xmedia_s32 vpss_ichn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VI;
|
|
src_chn.dev_id = vi_pipe;
|
|
src_chn.chn_id = vi_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VPSS;
|
|
dst_chn.dev_id = vpss_pipe;
|
|
dst_chn.chn_id = vpss_ichn;
|
|
|
|
CHECK_RET(xmedia_sys_unbind(&src_chn, &dst_chn), "xmedia_sys_unbind(VI-VPSS)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vi_bind_mcf(xmedia_s32 vi_pipe, xmedia_s32 vi_chn, xmedia_s32 mcf_pipe,
|
|
xmedia_s32 mcf_ichn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VI;
|
|
src_chn.dev_id = vi_pipe;
|
|
src_chn.chn_id = vi_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_MCF;
|
|
dst_chn.dev_id = mcf_pipe;
|
|
dst_chn.chn_id = mcf_ichn;
|
|
|
|
CHECK_RET(xmedia_sys_bind(&src_chn, &dst_chn), "xmedia_sys_bind(VI-MCF)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vi_unbind_mcf(xmedia_s32 vi_pipe, xmedia_s32 vi_chn, xmedia_s32 mcf_pipe,
|
|
xmedia_s32 mcf_ichn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VI;
|
|
src_chn.dev_id = vi_pipe;
|
|
src_chn.chn_id = vi_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_MCF;
|
|
dst_chn.dev_id = mcf_pipe;
|
|
dst_chn.chn_id = mcf_ichn;
|
|
|
|
CHECK_RET(xmedia_sys_unbind(&src_chn, &dst_chn), "xmedia_sys_unbind(VI-MCF)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vi_bind_venc(xmedia_s32 vi_pipe, xmedia_s32 vi_chn, xmedia_s32 venc_chn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VI;
|
|
src_chn.dev_id = vi_pipe;
|
|
src_chn.chn_id = vi_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VENC;
|
|
dst_chn.dev_id = 0;
|
|
dst_chn.chn_id = venc_chn;
|
|
|
|
CHECK_RET(xmedia_sys_bind(&src_chn, &dst_chn), "xmedia_sys_bind(VI-VENC)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vi_unbind_venc(xmedia_s32 vi_pipe, xmedia_s32 vi_chn, xmedia_s32 venc_chn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VI;
|
|
src_chn.dev_id = vi_pipe;
|
|
src_chn.chn_id = vi_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VENC;
|
|
dst_chn.dev_id = 0;
|
|
dst_chn.chn_id = venc_chn;
|
|
|
|
CHECK_RET(xmedia_sys_unbind(&src_chn, &dst_chn), "xmedia_sys_unbind(VI-VENC)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_mcf_bind_vpss(xmedia_s32 mcf_pipe, xmedia_s32 mcf_chn, xmedia_s32 vpss_pipe,
|
|
xmedia_s32 vpss_ichn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_MCF;
|
|
src_chn.dev_id = mcf_pipe;
|
|
src_chn.chn_id = mcf_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VPSS;
|
|
dst_chn.dev_id = vpss_pipe;
|
|
dst_chn.chn_id = vpss_ichn;
|
|
|
|
CHECK_RET(xmedia_sys_bind(&src_chn, &dst_chn), "xmedia_sys_bind(MCF-VPSS)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_mcf_unbind_vpss(xmedia_s32 mcf_pipe, xmedia_s32 mcf_chn, xmedia_s32 vpss_pipe,
|
|
xmedia_s32 vpss_ichn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_MCF;
|
|
src_chn.dev_id = mcf_pipe;
|
|
src_chn.chn_id = mcf_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VPSS;
|
|
dst_chn.dev_id = vpss_pipe;
|
|
dst_chn.chn_id = vpss_ichn;
|
|
|
|
CHECK_RET(xmedia_sys_unbind(&src_chn, &dst_chn), "xmedia_sys_unbind(MCF-VPSS)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vpss_bind_vo(xmedia_s32 vpss_pipe, xmedia_s32 vpss_ochn, xmedia_vo_layer vo_layer,
|
|
xmedia_s32 vo_chn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VPSS;
|
|
src_chn.dev_id = vpss_pipe;
|
|
src_chn.chn_id = vpss_ochn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VO;
|
|
dst_chn.dev_id = vo_layer;
|
|
dst_chn.chn_id = vo_chn;
|
|
|
|
CHECK_RET(xmedia_sys_bind(&src_chn, &dst_chn), "xmedia_sys_bind(VPSS-VO)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vpss_unbind_vo(xmedia_s32 vpss_pipe, xmedia_s32 vpss_ochn, xmedia_vo_layer vo_layer,
|
|
xmedia_s32 vo_chn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VPSS;
|
|
src_chn.dev_id = vpss_pipe;
|
|
src_chn.chn_id = vpss_ochn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VO;
|
|
dst_chn.dev_id = vo_layer;
|
|
dst_chn.chn_id = vo_chn;
|
|
|
|
CHECK_RET(xmedia_sys_unbind(&src_chn, &dst_chn), "xmedia_sys_unbind(VPSS-VO)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vpss_bind_venc(xmedia_s32 vpss_pipe, xmedia_s32 vpss_ochn, xmedia_s32 venc_chn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VPSS;
|
|
src_chn.dev_id = vpss_pipe;
|
|
src_chn.chn_id = vpss_ochn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VENC;
|
|
dst_chn.dev_id = 0;
|
|
dst_chn.chn_id = venc_chn;
|
|
|
|
CHECK_RET(xmedia_sys_bind(&src_chn, &dst_chn), "xmedia_sys_bind(VPSS-VENC)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vpss_unbind_venc(xmedia_s32 vpss_pipe, xmedia_s32 vpss_ochn, xmedia_s32 venc_chn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VPSS;
|
|
src_chn.dev_id = vpss_pipe;
|
|
src_chn.chn_id = vpss_ochn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VENC;
|
|
dst_chn.dev_id = 0;
|
|
dst_chn.chn_id = venc_chn;
|
|
|
|
CHECK_RET(xmedia_sys_unbind(&src_chn, &dst_chn), "xmedia_sys_unbind(VPSS-VENC)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vdec_bind_vpss(xmedia_s32 vdec_chn, xmedia_s32 vpss_pipe, xmedia_s32 vpss_ichn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VDEC;
|
|
src_chn.dev_id = 0;
|
|
src_chn.chn_id = vdec_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VPSS;
|
|
dst_chn.dev_id = vpss_pipe;
|
|
dst_chn.chn_id = vpss_ichn;
|
|
|
|
CHECK_RET(xmedia_sys_bind(&src_chn, &dst_chn), "xmedia_sys_bind(VDEC-VPSS)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vdec_unbind_vpss(xmedia_s32 vdec_chn, xmedia_s32 vpss_pipe, xmedia_s32 vpss_ichn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VDEC;
|
|
src_chn.dev_id = 0;
|
|
src_chn.chn_id = vdec_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VPSS;
|
|
dst_chn.dev_id = vpss_pipe;
|
|
dst_chn.chn_id = vpss_ichn;
|
|
|
|
CHECK_RET(xmedia_sys_unbind(&src_chn, &dst_chn), "xmedia_sys_unbind(VDEC-VPSS)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vdec_bind_vo(xmedia_vo_dev vo_dev, xmedia_vo_chn vo_chn, xmedia_s32 vdec_chn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VDEC;
|
|
src_chn.dev_id = 0;
|
|
src_chn.chn_id = vdec_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VO;
|
|
dst_chn.dev_id = vo_dev;
|
|
dst_chn.chn_id = vo_chn;
|
|
|
|
CHECK_RET(xmedia_sys_bind(&src_chn, &dst_chn), "xmedia_sys_bind(VDEC-VO)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vdec_unbind_vo(xmedia_vo_dev vo_dev, xmedia_vo_chn vo_chn, xmedia_s32 vdec_chn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VDEC;
|
|
src_chn.dev_id = 0;
|
|
src_chn.chn_id = vdec_chn;
|
|
|
|
dst_chn.mod_id = MOD_ID_VO;
|
|
dst_chn.dev_id = vo_dev;
|
|
dst_chn.chn_id = vo_chn;
|
|
|
|
CHECK_RET(xmedia_sys_unbind(&src_chn, &dst_chn), "xmedia_sys_unbind(VDEC-VO)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vo_bind_venc(xmedia_vo_dev vo_dev, xmedia_s32 venc_chn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VO;
|
|
src_chn.dev_id = vo_dev;
|
|
src_chn.chn_id = 0;
|
|
|
|
dst_chn.mod_id = MOD_ID_VENC;
|
|
dst_chn.dev_id = 0;
|
|
dst_chn.chn_id = venc_chn;
|
|
|
|
CHECK_RET(xmedia_sys_bind(&src_chn, &dst_chn), "xmedia_sys_bind(VO-VENC)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_vo_unbind_venc(xmedia_vo_dev vo_dev, xmedia_s32 venc_chn)
|
|
{
|
|
xmedia_chn_info src_chn;
|
|
xmedia_chn_info dst_chn;
|
|
|
|
src_chn.mod_id = MOD_ID_VO;
|
|
src_chn.dev_id = vo_dev;
|
|
src_chn.chn_id = 0;
|
|
|
|
dst_chn.mod_id = MOD_ID_VENC;
|
|
dst_chn.dev_id = 0;
|
|
dst_chn.chn_id = venc_chn;
|
|
|
|
|
|
CHECK_RET(xmedia_sys_unbind(&src_chn, &dst_chn), "xmedia_sys_unbind(VO-VENC)");
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
pic_size_e sample_comm_sys_get_picszie_by_wxh(xmedia_u32 width, xmedia_u32 height)
|
|
{
|
|
pic_size_e pic_size;
|
|
|
|
if ((width == 352) && (height == 288)) {
|
|
pic_size = PIC_CIF;
|
|
} else if ((width == 640) && (height == 360)) {
|
|
pic_size = PIC_360P;
|
|
} else if ((width == 640) && (height == 480)) {
|
|
pic_size = PIC_VGA;
|
|
} else if ((width == 640) && (height == 360)) {
|
|
pic_size = PIC_640x360;
|
|
} else if ((width == 720) && (height == 576)) {
|
|
pic_size = PIC_D1_PAL;
|
|
} else if ((width == 720) && (height == 480)) {
|
|
pic_size = PIC_D1_NTSC;
|
|
} else if ((width == 1280) && (height == 720)) {
|
|
pic_size = PIC_720P;
|
|
} else if ((width == 1920) && (height == 1080)) {
|
|
pic_size = PIC_1080P;
|
|
} else if ((width == 2304) && (height == 1296)) {
|
|
pic_size = PIC_2304x1296;
|
|
} else if ((width == 2560) && (height == 1440)) {
|
|
pic_size = PIC_2560x1440;
|
|
} else if ((width == 2560) && (height == 1920)) {
|
|
pic_size = PIC_2560x1920;
|
|
} else if ((width == 2592) && (height == 1520)) {
|
|
pic_size = PIC_2592x1520;
|
|
} else if ((width == 2592) && (height == 1944)) {
|
|
pic_size = PIC_2592x1944;
|
|
} else if ((width == 2592) && (height == 1536)) {
|
|
pic_size = PIC_2592x1536;
|
|
} else if ((width == 2688) && (height == 1520)) {
|
|
pic_size = PIC_2688x1520;
|
|
} else if ((width == 2716) && (height == 1524)) {
|
|
pic_size = PIC_2716x1524;
|
|
} else if ((width == 3840) && (height == 2160)) {
|
|
pic_size = PIC_3840x2160;
|
|
} else if ((width == 3000) && (height == 3000)) {
|
|
pic_size = PIC_3000x3000;
|
|
} else if ((width == 4000) && (height == 3000)) {
|
|
pic_size = PIC_4000x3000;
|
|
} else if ((width == 4096) && (height == 2160)) {
|
|
pic_size = PIC_4096x2160;
|
|
} else if ((width == 7680) && (height == 4320)) {
|
|
pic_size = PIC_7680x4320;
|
|
} else if ((width == 3840) && (height == 8640)) {
|
|
pic_size = PIC_3840x8640;
|
|
} else if ((width == 2688) && (height == 1536)) {
|
|
pic_size = PIC_2688x1536;
|
|
} else if ((width == 2688) && (height == 1944)) {
|
|
pic_size = PIC_2688x1944;
|
|
} else if ((width == 2880) && (height == 1620)) {
|
|
pic_size = PIC_2880x1620;
|
|
} else if ((width == 3072) && (height == 1728)) {
|
|
pic_size = PIC_3072x1728;
|
|
} else {
|
|
pic_size = PIC_BUTT;
|
|
}
|
|
|
|
return pic_size;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_get_buffer_size(xmedia_video_size pic_size, xmedia_video_format video_fmt,
|
|
xmedia_video_pixel_format pixel_fmt, xmedia_video_data_width data_width,
|
|
xmedia_video_compress_mode compress_mode)
|
|
{
|
|
xmedia_vb_base_info vb_base_info = { 0 };
|
|
xmedia_vb_cal_cfg vb_cfg = { 0 };
|
|
|
|
vb_base_info.width = pic_size.width;
|
|
vb_base_info.height = pic_size.height;
|
|
vb_base_info.video_fmt = video_fmt;
|
|
vb_base_info.pixel_fmt = pixel_fmt;
|
|
vb_base_info.bit_width = data_width;
|
|
vb_base_info.align = DEFAULT_ALIGN;
|
|
vb_base_info.cmp_mode = compress_mode;
|
|
|
|
xmedia_vb_get_buffer_config(&vb_base_info, &vb_cfg);
|
|
|
|
return vb_cfg.vb_size;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_get_wrap_buffer_size(xmedia_video_size pic_size, xmedia_video_format video_fmt,
|
|
xmedia_video_pixel_format pixel_fmt, xmedia_video_data_width data_width,
|
|
xmedia_video_compress_mode compress_mode, xmedia_u32 *wrap_buffer_line)
|
|
{
|
|
xmedia_vb_base_info vb_base_info = { 0 };
|
|
|
|
vb_base_info.width = pic_size.width;
|
|
vb_base_info.height = pic_size.height;
|
|
vb_base_info.video_fmt = XMEDIA_VIDEO_FMT_TILE_32x4;
|
|
vb_base_info.pixel_fmt = pixel_fmt;
|
|
vb_base_info.bit_width = XMEDIA_VIDEO_DATA_WIDTH_8;
|
|
vb_base_info.align = DEFAULT_ALIGN;
|
|
vb_base_info.cmp_mode = XMEDIA_VIDEO_COMPRESS_MODE_TILE_COMPACT;
|
|
|
|
*wrap_buffer_line = XM_ALIGN_DOWN(pic_size.height * 5 / 10, 8);
|
|
SAMPLE_PRT("wrap buffer line is %d \n", *wrap_buffer_line);
|
|
|
|
return xmedia_vb_get_wrap_buffer_size(&vb_base_info, *wrap_buffer_line);
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_getchar_timeout(xmedia_u32 timeout_ms)
|
|
{
|
|
fd_set read_fds;
|
|
struct timeval timeout;
|
|
xmedia_s32 retval;
|
|
|
|
FD_ZERO(&read_fds);
|
|
FD_SET(STDIN_FILENO, &read_fds);
|
|
|
|
timeout.tv_sec = timeout_ms / 1000;
|
|
timeout.tv_usec = (timeout_ms % 1000) * 1000;
|
|
|
|
retval = select(STDIN_FILENO + 1, &read_fds, XMEDIA_NULL, XMEDIA_NULL, &timeout);
|
|
if (retval <= 0) {
|
|
return XMEDIA_FAILURE;
|
|
} else {
|
|
if (FD_ISSET(STDIN_FILENO, &read_fds)) {
|
|
retval = getchar();
|
|
return retval;
|
|
}
|
|
}
|
|
|
|
return XMEDIA_FAILURE;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_npu_acquire_workspace(sample_comm_npu_workspace_info *npu_info)
|
|
{
|
|
xmedia_s32 s32_ret = XMEDIA_FAILURE;
|
|
xmedia_s32 cl_err_code = 0;
|
|
xmedia_u32 cl_work_size = 0;
|
|
xmedia_u32 cl_weight_size = 0;
|
|
xmedia_u32 max_cl_work_size = 0;
|
|
|
|
CHECK_NULL_PTR(npu_info);
|
|
|
|
if (npu_info->npu_modle_num == 0) {
|
|
SAMPLE_ERR("acquire workspace fail model num 0 .\n");
|
|
return XMEDIA_FAILURE;
|
|
}
|
|
|
|
s32_ret = xmedia_cl_init();
|
|
if (s32_ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_cl_init fail \n");
|
|
return s32_ret;
|
|
}
|
|
|
|
s32_ret = xmedia_cl_get_device_ids(XMEDIA_CL_DEVICE_ALL, XMEDIA_NULL, &g_npu_workspace_cfg.cl_device_num);
|
|
if (s32_ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_cl_get_device_ids fail \n");
|
|
goto CL_ERR0;
|
|
}
|
|
|
|
g_npu_workspace_cfg.cl_device = (xmedia_cl_device_id *)calloc(g_npu_workspace_cfg.cl_device_num, sizeof(xmedia_cl_device_id));
|
|
if (g_npu_workspace_cfg.cl_device == XMEDIA_NULL) {
|
|
SAMPLE_ERR("cl device calloc fail\n");
|
|
goto CL_ERR0;
|
|
}
|
|
|
|
s32_ret = xmedia_cl_get_device_ids(XMEDIA_CL_DEVICE_ALL, g_npu_workspace_cfg.cl_device, &g_npu_workspace_cfg.cl_device_num);
|
|
if (s32_ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_cl_get_device_ids sec fail \n");
|
|
goto CL_ERR1;
|
|
}
|
|
|
|
g_npu_workspace_cfg.cl_ctx = xmedia_cl_create_context(g_npu_workspace_cfg.cl_device_num, g_npu_workspace_cfg.cl_device, &cl_err_code);
|
|
if (cl_err_code != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_cl_create_context fail\n");
|
|
goto CL_ERR2;
|
|
}
|
|
|
|
for (xmedia_s32 i = 0; i < npu_info->npu_modle_num; i++) {
|
|
s32_ret = xmedia_cl_graph_querysize_from_file(npu_info->npu_model_path[i], &cl_work_size, &cl_weight_size);
|
|
if (cl_err_code != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_cl_graph_querysize_from_file fail\n");
|
|
goto CL_ERR3;
|
|
}
|
|
|
|
max_cl_work_size = (max_cl_work_size > cl_work_size) ? max_cl_work_size : cl_work_size;
|
|
}
|
|
|
|
g_npu_workspace_cfg.work_space_phyaddr = xmedia_mmz_alloc(XMEDIA_NULL, "AIworkspace", max_cl_work_size);
|
|
if (g_npu_workspace_cfg.work_space_phyaddr == XMEDIA_NULL) {
|
|
SAMPLE_ERR("xmedia_mmz_alloc fail\n");
|
|
goto CL_ERR3;
|
|
}
|
|
|
|
g_npu_workspace_cfg.work_space_viraddr = xmedia_mmz_map(g_npu_workspace_cfg.work_space_phyaddr, max_cl_work_size, 1);
|
|
if (g_npu_workspace_cfg.work_space_viraddr == XMEDIA_NULL) {
|
|
SAMPLE_ERR("xmedia_mmz_map fail\n");
|
|
goto CL_ERR4;
|
|
}
|
|
|
|
s32_ret = xmedia_cl_set_workspace_addr(g_npu_workspace_cfg.cl_ctx, g_npu_workspace_cfg.work_space_viraddr, max_cl_work_size);
|
|
if (s32_ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_mmz_map fail\n");
|
|
goto CL_ERR5;
|
|
}
|
|
|
|
return XMEDIA_SUCCESS;
|
|
|
|
CL_ERR5:
|
|
if (g_npu_workspace_cfg.work_space_viraddr != XMEDIA_NULL) {
|
|
xmedia_mmz_unmap(g_npu_workspace_cfg.work_space_viraddr);
|
|
}
|
|
CL_ERR4:
|
|
xmedia_mmz_free(g_npu_workspace_cfg.work_space_phyaddr);
|
|
CL_ERR3:
|
|
s32_ret = xmedia_cl_release_context(g_npu_workspace_cfg.cl_ctx);
|
|
if (s32_ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_cl_release_context id fail \n");
|
|
}
|
|
CL_ERR2:
|
|
s32_ret = xmedia_cl_release_device_ids(g_npu_workspace_cfg.cl_device, &g_npu_workspace_cfg.cl_device_num);
|
|
if (s32_ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_cl_release_device_ids id fail \n");
|
|
}
|
|
CL_ERR1:
|
|
free(g_npu_workspace_cfg.cl_device);
|
|
g_npu_workspace_cfg.cl_device = XMEDIA_NULL;
|
|
CL_ERR0:
|
|
s32_ret = xmedia_cl_uninit();
|
|
if (s32_ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_cl_uninit fail \n");
|
|
return s32_ret;
|
|
}
|
|
|
|
return XMEDIA_FAILURE;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_npu_release_workspace()
|
|
{
|
|
xmedia_s32 s32_ret = XMEDIA_FAILURE;
|
|
|
|
if (g_npu_workspace_cfg.work_space_viraddr != XMEDIA_NULL) {
|
|
xmedia_mmz_unmap(g_npu_workspace_cfg.work_space_viraddr);
|
|
}
|
|
|
|
xmedia_mmz_free(g_npu_workspace_cfg.work_space_phyaddr);
|
|
|
|
s32_ret = xmedia_cl_release_context(g_npu_workspace_cfg.cl_ctx);
|
|
if (s32_ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_cl_release_context id fail \n");
|
|
}
|
|
|
|
s32_ret = xmedia_cl_release_device_ids(g_npu_workspace_cfg.cl_device, &g_npu_workspace_cfg.cl_device_num);
|
|
if (s32_ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_cl_release_device_ids id fail \n");
|
|
}
|
|
|
|
free(g_npu_workspace_cfg.cl_device);
|
|
g_npu_workspace_cfg.cl_device = XMEDIA_NULL;
|
|
|
|
s32_ret = xmedia_cl_uninit();
|
|
if (s32_ret != XMEDIA_SUCCESS) {
|
|
SAMPLE_ERR("xmedia_cl_uninit fail \n");
|
|
return s32_ret;
|
|
}
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_mem_open(xmedia_void)
|
|
{
|
|
if (g_mem_dev <= 0) {
|
|
g_mem_dev = open ("/dev/mem", O_CREAT | O_RDWR | O_SYNC);
|
|
if (g_mem_dev <= 0) {
|
|
return XMEDIA_FAILURE;
|
|
}
|
|
}
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_void sample_comm_sys_mem_close(xmedia_void)
|
|
{
|
|
if (g_mem_dev > 0) {
|
|
close(g_mem_dev);
|
|
g_mem_dev = 0;
|
|
}
|
|
}
|
|
|
|
xmedia_void* sample_comm_sys_mem_map(xmedia_u32 phy_addr, xmedia_u32 size)
|
|
{
|
|
xmedia_u32 diff;
|
|
xmedia_u32 page_phy;
|
|
xmedia_u32 page_size;
|
|
xmedia_u8* page_addr;
|
|
|
|
page_phy = phy_addr & 0xfffff000;
|
|
diff = phy_addr - page_phy;
|
|
|
|
page_size = ((size + diff - 1) & 0xfffff000) + 0x1000;
|
|
page_addr = mmap((void *)0, page_size, PROT_READ|PROT_WRITE, MAP_SHARED, g_mem_dev, page_phy);
|
|
if (MAP_FAILED == page_addr) {
|
|
perror("mmap error\n");
|
|
return XMEDIA_NULL;
|
|
}
|
|
|
|
return (xmedia_void *) (page_addr + diff);
|
|
}
|
|
|
|
xmedia_void sample_comm_sys_mem_unmap(xmedia_void* vir_addr, xmedia_u32 size)
|
|
{
|
|
xmedia_u32 page_addr;
|
|
xmedia_u32 page_size;
|
|
xmedia_u32 diff;
|
|
|
|
page_addr = (((xmedia_u32)vir_addr) & 0xfffff000);
|
|
diff = (xmedia_u32)vir_addr - page_addr;
|
|
page_size = ((size + diff - 1) & 0xfffff000) + 0x1000;
|
|
|
|
munmap((xmedia_void*)page_addr, page_size);
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_set_reg(xmedia_u32 addr, xmedia_u32 value)
|
|
{
|
|
xmedia_u32 *vir_addr = XMEDIA_NULL;
|
|
|
|
vir_addr = sample_comm_sys_mem_map(addr, sizeof(value));
|
|
if (vir_addr == XMEDIA_NULL) {
|
|
SAMPLE_PRT("sample sys mem map 0x%x failed\n", addr);
|
|
return XMEDIA_FAILURE;
|
|
}
|
|
|
|
*vir_addr = value;
|
|
sample_comm_sys_mem_unmap(vir_addr, sizeof(value));
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|
|
|
|
xmedia_s32 sample_comm_sys_get_reg(xmedia_u32 addr, xmedia_u32 *value)
|
|
{
|
|
xmedia_u32 *vir_addr;
|
|
|
|
vir_addr = sample_comm_sys_mem_map(addr, sizeof(value));
|
|
if (vir_addr == XMEDIA_NULL) {
|
|
SAMPLE_PRT("sample sys mem map 0x%x failed\n", addr);
|
|
return XMEDIA_FAILURE;
|
|
}
|
|
|
|
*value = *vir_addr;
|
|
sample_comm_sys_mem_unmap(vir_addr, sizeof(value));
|
|
|
|
return XMEDIA_SUCCESS;
|
|
}
|