RK356X rockit_mpi解析 (一)实现HDMI输出

主要目的为能在debian下实现HDMI输出Camera ISP流

平台:RK3568

熟悉瑞芯微RV1126的应该知道之前有一套rkmedia的框架,现在的rk3568已经不再是之前的旧框架了,但仍沿用了RK_MPI的内容。

rockit代码路径在external\rockit\mpi\example\mod

文件夹下的demo并不是全部编译的,要想编译哪个demo,可以编辑文件下的CMakeLists.txt文件

此处我们使用的demo为test_mpi_vi.cpp,编辑CMakeList.txt文件打开mpi_vi的编译

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")

在buildroot文件夹下运行

make rockit-rebuild

可以看到rockit下的demo的编译细节

编译会遇到一个函数定义报错的问题,直接注释掉报错内容即可

/home/hya/workspace/SVN/RK3568SDK_Kernel5/buildroot/output/rockchip_rk3568/build/rockit/mpi/example/mod/test_mpi_vi.cpp: 在函数‘RK_S32 readFromPic(TEST_VI_CTX_S*, VIDEO_FRAME_S*)’中:
/home/hya/workspace/SVN/RK3568SDK_Kernel5/buildroot/output/rockchip_rk3568/build/rockit/mpi/example/mod/test_mpi_vi.cpp:377:14: 警告:ignoring return value of ‘size_t fread(void*, size_t, size_t, FILE*)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  377 |         fread(RK_MPI_MB_Handle2VirAddr(srcBlk), 1 , stMbPicCalResult.u32MBSize, fp);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[100%] Linking CXX executable rk_mpi_vi_test
/home/hya/workspace/SVN/RK3568SDK_Kernel5/buildroot/output/rockchip_rk3568/host/lib/gcc/aarch64-buildroot-linux-gnu/12.3.0/../../../../aarch64-buildroot-linux-gnu/bin/ld: CMakeFiles/rk_mpi_vi_test.dir/test_mpi_vi.cpp.o: in function `main':
test_mpi_vi.cpp:(.text.startup+0x1ee0): undefined reference to `TEST_COMM_APP_VDEC_StopProcWithDstChn'
/home/hya/workspace/SVN/RK3568SDK_Kernel5/buildroot/output/rockchip_rk3568/host/lib/gcc/aarch64-buildroot-linux-gnu/12.3.0/../../../../aarch64-buildroot-linux-gnu/bin/ld: test_mpi_vi.cpp:(.text.startup+0x1eec): undefined reference to `TEST_COMM_APP_VDEC_Stop'
/home/hya/workspace/SVN/RK3568SDK_Kernel5/buildroot/output/rockchip_rk3568/host/lib/gcc/aarch64-buildroot-linux-gnu/12.3.0/../../../../aarch64-buildroot-linux-gnu/bin/ld: test_mpi_vi.cpp:(.text.startup+0x1fec): undefined reference to `TEST_COMM_APP_VDEC_StartProcWithDstChn'
collect2: 错误:ld 返回 1
make[4]: *** [mpi/example/mod/CMakeFiles/rk_mpi_vi_test.dir/build.make:99:mpi/example/mod/rk_mpi_vi_test] 错误 1
make[3]: *** [CMakeFiles/Makefile2:390:mpi/example/mod/CMakeFiles/rk_mpi_vi_test.dir/all] 错误 2
make[2]: *** [Makefile:136:all] 错误 2
make[1]: *** [package/pkg-generic.mk:314:/home/hya/workspace/SVN/RK3568SDK_Kernel5/buildroot/output/rockchip_rk3568/build/rockit/.stamp_built] 错误 2
make: *** [Makefile:110:_all] 错误 2

编译完的可执行文件在buildroot\output/rockchip_rk3568/target/usr/bin/rk_mpi_vi_test

默认是编译到buildroot里的,然而我们的系统为debian系统

所以尝试将二进制文件直接push到debian系统下运行,报错

./rk_mpi_vi_test: /lib/aarch64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by ./rk_mpi_vi_test)

由此可知是debian与buildroot的GLIBC版本不兼容的问题

debian的glibc版本为2.31

root@hya:/# ldd --version
ldd (Debian GLIBC 2.31-13+deb11u7) 2.31

buildroo的glibc为2.37

root@rk3568-buildroot:/# strings ./usr/lib/libc.so.6 | grep "version"
versionsort64
gnu_get_libc_version
argp_program_version
versionsort
__nptl_version
argp_program_version_hook
RPC: Incompatible versions of RPC
RPC: Program/version mismatch
GNU C Library (Buildroot) stable release version 2.37.
Compiled by GNU CC version 12.3.0.

所以buildroot里编译的rockit_demo,push到debian系统里无法运行

升级debian的glibc版本

编辑 /etc/apt/sources.list 文件,将所有的bullseye替换为 testing

deb http://mirrors.ustc.edu.cn/debian testing main contrib
deb-src http://mirrors.ustc.edu.cn/debian testing main contrib
deb http://mirrors.ustc.edu.cn/debian-security testing-security main contrib
deb-src http://mirrors.ustc.edu.cn/debian-security testing-security main contrib
deb http://mirrors.ustc.edu.cn/debian testing-updates main contrib
deb-src http://mirrors.ustc.edu.cn/debian testing-updates main contrib
deb http://mirrors.ustc.edu.cn/debian/ testing-backports main contrib
deb-src http://mirrors.ustc.edu.cn/debian/ testing-backports main contrib

更新libc版本

sudo apt update
sudo apt install libc6/testing

升级完后再切换回Bullseye版本

deb http://mirrors.ustc.edu.cn/debian bullseye main contrib
deb-src http://mirrors.ustc.edu.cn/debian bullseye main contrib
deb http://mirrors.ustc.edu.cn/debian-security bullseye-security main contrib
deb-src http://mirrors.ustc.edu.cn/debian-security bullseye-security main contrib
deb http://mirrors.ustc.edu.cn/debian bullseye-updates main contrib
deb-src http://mirrors.ustc.edu.cn/debian bullseye-updates main contrib
deb http://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib
deb-src http://mirrors.ustc.edu.cn/debian/ bullseye-backports main contrib

更新系统

apt-get update
apt-get upgrade

使用此命令查看libc版本,可以看到debian的版本已经是最新的了

ldd --version

root@linaro-alip:/tmp# ldd --version
ldd (Debian GLIBC 2.37-12) 2.37
Copyright (C) 2023 自由软件基金会。
这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性
或者适合某些特殊目的。
由 Roland McGrath 和 Ulrich Drepper 编写。

手动更新GLIBC库有风险!慎用

将rockit的依赖库都push到debian的/usr/lib下

库路径在

buildroot/output/rockchip_rk3568/target/usr/lib/librockit.so

buildroot/output/rockchip_rk3568/target/usr/lib/libRkSwCas.so

buildroot/output/rockchip_rk3568/target/usr/lib/librkAlgoDis.so

buildroot/output/rockchip_rk3568/target/usr/lib/libgraphic_lsf.so

运行命令为rk_mpi_vi_test -w 1920 -h 1080 -t 4 -n /dev/video8 -m 4

其中-n为isp的mainpath节点

-m 4为vi_bind_vo_loop(阅读源码可以知道这个demo有多种bind模式)

大致流程则为

test_vi_init

create_vo

vi_bind_vo

重点关注create_vo前可以选择要使能的VoLayer和VoDev

基本流程也是getDev、setDev、enableDev、bind_dev_volayer、setLayerattr、enableLayer、setChnattr、enableChn

通过stLayerAttr设置要使能的图层分辨率、位置、帧率、格式等参数

通过stChnAttr设置通道参数

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值