主要目的为能在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设置通道参数