RK3588S HDMI显示Camera ISP流方案

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

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值