1. PYM模块简述
1.1 硬件数据流
PYM(Pyramid)作为一个硬件加速模块(图像缩小及 ROI 提取),对输入的图像按照金字塔图层的方式处理,并输出到 DDR:
PYM 模块在 Camsys 子系统的数量和位置如下,总共3个 PYM 硬件,PYM0、PYM1、PYM4(只支持 offline)。
1.2 PYM-Sample软件架构
本文的 demo sample 采用回灌流程,即从系统存储中读取文件,作为 PYM 的输入图像。 调用 VIO API 实现整个数据通路初始化并完成 PYM 处理。
1.3 PYM-Sample
#Sample源码路径
/test/samples/platform_samples/source/S83_Sample/S83E04_Module/pym_sample
#cfg中包含了VPM配置文件,res包含了YUV图像资源文件
#src下pym_sample.c为sample源代码
1.3.1 API 调用流程:
1.3.2 Sample 源码解析:
get_opts_for_pym():配置参数
配置 pym 设备参数,下面是具体参数说明:
int32_t hb_vio_init(const char cfg_file):本 Sample 中为单进程模式
读取:"/sys/module/hobot_vio_common/parameters/vio_mp_en" 判断是否多进程模式。
单进程:根据 VPM 配置文件(-v)初始化每个 VIO 管道。对于初始化错误的管道回滚进行反初始化。
多进程:根据 VPM 配置文件(-v)初始化每个 VIO 管道。创建套接字并根据"/var/vio_service.unix"连接服务器并向 server 发送初始化的 VIO 管道。
int32_t hb_vio_start_pipeline(uint32_t pipeline_id):
单进程:根据 id 启动 VIO 管道中的实体并激活每个 VFlow 流程中的所有节点(vnode)。
多进程:发送启动命令给 server 以启动 VIO 管道,接受 server 返回的信息。
**pym_feedback_worker_func:
int32_t hb_vio_get_data(uint32_t pipeline_id, VIO_DATA_TYPE_E data_type, void data):*
单进程:根据管道句柄和类型获取信息;
多进程:发送获取数据命令给 server,接受返回的信息。
int read_yuv420_file(const char filename, char addr0, char *addr1, uint32_t y_size):
解析yuv文件信息。
int32_t hb_vio_run_pym(uint32_t pipeline_id, hb_vio_buffer_t *src_img_info):
单进程:将缓冲区类型从 VIO 缓冲区转换为 VNODE 实体,将图像数据转换为帧描述符格式排入设备队列并轮询以获取结果。
多进程:获取图像缓冲区的地址,向 server 发送空闲 pym 信息,接受 server 返回的信息。
int32_t hb_vio_free_pymbuf(uint32_t pipeline_id, VIO_DATA_TYPE_E data_type, void *img_info):
单进程:根据管道 id 和类型释放内存。
多进程:向 server 发送释放内存命令,接受返回信息。
2. Sample使用
2.1 编译
获取 AppSDK 包后,进入 appuser 执行:
*其中 hbrootfs-sdk_0.0.1.XXX_all.deb 是地平线自己的库和头文件,rootfs-sdk-focal_0.0.1.XXX_all.deb 是系统库,aarch64-linux-hb-gcc_12.2.0_amd64.deb 是gcc 12.2.0 工具链,目前在 ubuntu22.04 非 docker 环境下运行正常。其它环境不能保证。
dpkg-deb -x rootfs-sdk*.deb ./sdk
dpkg-deb -x hbrootfs-sdk*.deb ./sdk
##移动sdk库路径,本文档放入/usr/lib中
sudo mv sdk/ /usr/lib
进入 toolchain 执行:
dpkg -x aarch64-linux-hb-gcc_12.2.0_amd64.deb ./arm-gnu-toolchain
##移动toolchain库路径,本文档放入/usr/lib中
sudo mv arm-gnu-toolchain/ /usr/lib
nano ~/.bashrc
##添加系统路径
export PATH="/usr/lib/arm-gnu-toolchain/bin:$PATH"
export LD_LIBRARY_PATH="/usr/lib/arm-gnu-toolchain/lib:$LD_LIBRARY_PATH"
##
source ~/.bashrc
Sample代码路径:
#Sample源码路径
/test/samples/platform_samples/source/S83_Sample/S83E04_Module/pym_sample
复制/src源码到新建文件夹 pym 并构建新 Makefile:
*cfg 和 res 也拷贝到该目录
pym
├── cfg
│ └── 1v_cpe0_ddr_pym0_4k
│ └── vpm_config.json
├── Makefile
├── res
│ └── 4k.yuv
└── src
└── pym_sample.c
Makefile:
CROSS_COMPILE = aarch64-none-linux-gnu-
OUTPUT_HBROOTFS_DIR = /usr/lib/sdk
CXX := ${CROSS_COMPILE}gcc
INC_DIR := ${OUTPUT_HBROOTFS_DIR}/usr/hobot/include
LIB_DIR := ${OUTPUT_HBROOTFS_DIR}/usr/hobot/lib
LIB_DIR += ${OUTPUT_HBROOTFS_DIR}/usr/lib/aarch64-linux-gnu
LIBS := -lvio -lpthread -lalog -lhbmem -lvpf -lgdcbin -lcam -lcjson
CXXFLAGS := -Wall -O2 -I$(INC_DIR)
LDFLAGS := $(addprefix -L, $(LIB_DIR)) $(LIBS)
SRC_DIR := src
TARGET := program
SRCS := $(wildcard $(SRC_DIR)/*.c)
OBJS := $(SRCS:.c=.o)
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $^ -o $@
%.o: %.c
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -f $(OBJS) $(TARGET)
执行make 完成编译,生成的文件为./programD
2.2 文件传输
使用 WinScp 将 vpm_config.json、4k.yuv 和 program 传输到单板上。*WinScp 使用方法请参考 征程 6E/M 底软开发 Sample-IPC 2.1.2
2.3 运行
通过 ssh 或串口进入/home/hobot/执行:
./program -v vpm_config.json -y 4k.yuv -l 10 -s 1 -m 1
Sample 运行时日志:
[DBG] pym: pipe(0)Test pym work thread---running.
[DBG] pym: pipe(0) pym feedback worker_thread Ready !
[DBG] pym: (read_yuv420_file):file read(/4k.yuv), size(8294400)
[DBG] pym: filedump(3840x2160_pipe0_pym_ds0_f0_roi_1.yuv, size(8294400) is successed
[DBG] pym: ds0 w3840xh2160 3840x2160_pipe0_pym_ds0_f0_roi_1.yuv
[DBG] pym: filedump(1920x1080_pipe0_pym_ds1_f0_roi_1.yuv, size(2073600) is successed
[DBG] pym: ds1 w1920xh1080 1920x1080_pipe0_pym_ds1_f0_roi_1.yuv
[DBG] pym: filedump(960x540_pipe0_pym_ds2_f0_roi_1.yuv, size(518400) is successed
[DBG] pym: ds2 w960xh540 960x540_pipe0_pym_ds2_f0_roi_1.yuv
[DBG] pym: filedump(480x270_pipe0_pym_ds3_f0_roi_1.yuv, size(129600) is successed
[DBG] pym: ds3 w480xh270 480x270_pipe0_pym_ds3_f0_roi_1.yuv
[DBG] pym: filedump(240x134_pipe0_pym_ds4_f0_roi_1.yuv, size(32160) is successed
[DBG] pym: ds4 w240xh134 240x134_pipe0_pym_ds4_f0_roi_1.yuv
[DBG] pym: filedump(112x66_pipe0_pym_ds5_f0_roi_1.yuv, size(7392) is successed
[DBG] pym: ds5 w112xh66 112x66_pipe0_pym_ds5_f0_roi_1.yuv
[DBG] pym: (read_yuv420_file):file read(/4k.yuv), size(8294400)
[DBG] pym: (read_yuv420_file):file read(/4k.yuv), size(8294400)
[DBG] pym: (read_yuv420_file):file read(/4k.yuv), size(8294400)
[DBG] pym: (read_yuv420_file):file read(/4k.yuv), size(8294400)
[DBG] pym: (read_yuv420_file):file read(/4k.yuv), size(8294400)
[DBG] pym: (read_yuv420_file):file read(/4k.yuv), size(8294400)
[DBG] pym: (read_yuv420_file):file read(/4k.yuv), size(8294400)
[DBG] pym: (read_yuv420_file):file read(/4k.yuv), size(8294400)
[DBG] pym: (read_yuv420_file):file read(/4k.yuv), size(8294400)
[DBG] pym: pipe(0) pym feedback worker thread quit !
[DBG] pym: pipe(0)Test pym work thread---try stop.
[DBG] pym: pipe(0)Test pym work thread---join done.
生成的缩放 yuv 文件存放在程序执行目录下。检查生成的 yuv 文件,本文档使用 YUView:*请用户自行下载将生成的文件传输给 window
使用 YUView 打开:
*请配置色度分量水平偏移量为1/2:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。