SoC:RK3588S
框架:rockit
demo:test_mpi_vi.cpp
rockit mpi的源码位于rk3588s/external/rockit/mpi/example/mod/
首先要编辑目录下的CMakeLists文件,打开test_mpi_vi.cpp的编译选项
set(RK_MPI_TEST_VI_SRC
test_mpi_vi.cpp
)
#--------------------------
#rk_mpi_vi_test
#--------------------------
add_executable(rk_mpi_vi_test ${RK_MPI_TEST_VI_SRC} ${RK_MPI_TEST_COMMON_SRC})
target_link_libraries(rk_mpi_vi_test ${ROCKIT_DEP_COMMON_LIBS})
install(TARGETS rk_mpi_vi_test RUNTIME DESTINATION "bin")
SDK中的demo有很多问题,要想运行需要修改
修改记录1:
注释
fread(RK_MPI_MB_Handle2VirAddr(srcBlk), 1 , stMbPicCalResult.u32MBSize, fp);
修改记录2:
注释掉函数实现,main中相关的case也要注释掉
static RK_S32 test_vi_bind_vdec_bind_vo_loop(TEST_VI_CTX_S *ctx)
修改记录3:
修改create_vo函数实现,官方源码的实现顺序有问题,需要重新调整为
1)RK_MPI_VO_GetPubAttr
2)定义PubAttr参数
3)RK_MPI_VO_SetPubAttr
4)RK_MPI_VO_Enable
5)RK_MPI_VO_BindLayer
6)定义LayerAttr参数
7)RK_MPI_VO_SetLayerAttr
8)定义ChnAttr参数
9)RK_MPI_VO_SetChnAttr
10)RK_MPI_VO_EnableLayer
static RK_S32 create_vo(TEST_VI_CTX_S *ctx, RK_U32 u32Ch) {
/* Enable VO */
VO_PUB_ATTR_S VoPubAttr;
VO_VIDEO_LAYER_ATTR_S stLayerAttr;
RK_S32 s32Ret = RK_SUCCESS;
VO_CHN_ATTR_S stChnAttr;
VO_LAYER VoLayer = ctx->s32VoLayer;
VO_DEV VoDev = ctx->s32VoDev;
RK_MPI_VO_DisableLayer(VoLayer);
RK_MPI_VO_DisableLayer(RK356X_VOP_LAYER_ESMART_0);
RK_MPI_VO_DisableLayer(RK356X_VOP_LAYER_ESMART_1);
RK_MPI_VO_DisableLayer(RK356X_VOP_LAYER_SMART_0);
RK_MPI_VO_DisableLayer(RK356X_VOP_LAYER_SMART_1);
RK_MPI_VO_Disable(VoDev);
memset(&VoPubAttr, 0, sizeof(VO_PUB_ATTR_S));
memset(&stLayerAttr, 0, sizeof(VO_VIDEO_LAYER_ATTR_S));
s32Ret = RK_MPI_VO_GetPubAttr(VoDev, &VoPubAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VO_GetPubAttr failed,s32Ret:%d\n", s32Ret);
return s32Ret;
}
VoPubAttr.enIntfType = VO_INTF_HDMI;
VoPubAttr.enIntfSync = VO_OUTPUT_1080P60;
s32Ret = RK_MPI_VO_SetPubAttr(VoDev, &VoPubAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VO_SetPubAttr failed,s32Ret:%d\n", s32Ret);
return s32Ret;
}
s32Ret = RK_MPI_VO_Enable(VoDev);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VO_Enable failed,s32Ret:%d\n", s32Ret);
return s32Ret;
}
// stLayerAttr.enPixFormat = RK_FMT_YUV420SP;
// stLayerAttr.stDispRect.s32X = 0;
// stLayerAttr.stDispRect.s32Y = 0;
// stLayerAttr.u32DispFrmRt = 30;
// stLayerAttr.stDispRect.u32Width = 1920;
// stLayerAttr.stDispRect.u32Height = 1080;
// stLayerAttr.stImageSize.u32Width = 1920;
// stLayerAttr.stImageSize.u32Height = 1080;
// s32Ret = RK_MPI_VO_GetPubAttr(VoDev, &VoPubAttr);
// if (s32Ret != RK_SUCCESS) {
// return s32Ret;
// }
// s32Ret = RK_MPI_VO_SetPubAttr(VoDev, &VoPubAttr);
// if (s32Ret != RK_SUCCESS) {
// return s32Ret;
// }
// s32Ret = RK_MPI_VO_Enable(VoDev);
// if (s32Ret != RK_SUCCESS) {
// RK_LOGE("QHYCCD----------------- RK_MPI_VO_Enable failed,s32Ret:%d\n", s32Ret);
// return s32Ret;
// }
s32Ret = RK_MPI_VO_BindLayer(VoLayer, VoDev, VO_LAYER_MODE_VIDEO); //from vi,chose VO_LAYER_MODE_GRAPHIC
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VO_BindLayer failed,s32Ret:%d\n", s32Ret);
return RK_FAILURE;
}
stLayerAttr.enPixFormat = RK_FMT_YUV420SP; //RK_FMT_YUV420SP
stLayerAttr.stDispRect.s32X = 0;
stLayerAttr.stDispRect.s32Y = 0;
stLayerAttr.u32DispFrmRt = 30;
stLayerAttr.stDispRect.u32Width = 1920;
stLayerAttr.stDispRect.u32Height = 1080;
stLayerAttr.stImageSize.u32Width = 1920;
stLayerAttr.stImageSize.u32Height = 1080;
s32Ret = RK_MPI_VO_SetLayerAttr(VoLayer, &stLayerAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VO_SetLayerAttr failed,s32Ret:%d\n", s32Ret);
return RK_FAILURE;
}
// s32Ret = RK_MPI_VO_BindLayer(VoLayer, VoDev, VO_LAYER_MODE_VIDEO);
// if (s32Ret != RK_SUCCESS) {
// RK_LOGE("RK_MPI_VO_BindLayer failed,s32Ret:%d\n", s32Ret);
// return RK_FAILURE;
// }
stChnAttr.stRect.s32X = 0;
stChnAttr.stRect.s32Y = 0;
stChnAttr.stRect.u32Width = stLayerAttr.stImageSize.u32Width;
stChnAttr.stRect.u32Height = stLayerAttr.stImageSize.u32Height;
stChnAttr.u32Priority = 0;
stChnAttr.u32FgAlpha = 128;
stChnAttr.u32BgAlpha = 0;
s32Ret = RK_MPI_VO_SetChnAttr(VoLayer, u32Ch, &stChnAttr);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("set chn Attr failed,s32Ret:%d\n", s32Ret);
return RK_FAILURE;
}
s32Ret = RK_MPI_VO_EnableLayer(VoLayer);
if (s32Ret != RK_SUCCESS) {
RK_LOGE("RK_MPI_VO_EnableLayer failed,s32Ret:%d\n", s32Ret);
return RK_FAILURE;
}
return s32Ret;
}
Buildroot系统部署
因为rockit是基于buildroot系统编译的,所以依赖库等都是打包到系统里的
直接运行命令就可以,在运行时要注意通过media-ctl确定isp的mainpath节点,我们的系统是video14
运行demo程序
rk_mpi_vi_test -w 1920 -h 1080 -t 4 -n /dev/video11 -m 4
Debian系统部署
debian系统需要从buildroot中移植rockit的依赖库
在buildroot的rootfs中将libgraphic_lsf.so librkAlgoDis.so libRkSwCac.so librockit.so打包到debian系统/usr/lib中
若在debian下运行屏幕会全绿的问题,debian需要替换mali库
在debian运行,要注意看rkaiq 3a server有没有跑起来
rkaiq_3A_server &
rk_mpi_vi_test -w 1920 -h 1080 -t 4 -n /dev/video11 -m 4