目录
说明
本博客性质属于个人学习记录,都是自己踩过的坑。
本文叙述的测试程序和动作在淘宝上买得到的Hi3516EV200+IMX307开发板和荣品Hi3516DV300上进行。
开发环境和交叉编译工具链
Hi3516EV200/Hi3516DV300均使用4.0版本的MPP。使用的交叉编译工具链为:
(uClibc)arm-himix100-linux-
(glibc)arm-himix200-linux-
这两个交叉编译工具链下载地址在文末获取。
交叉编译工具链的安装非常简单,运行目录下的安装文件再更新一下PATH就可以了。
IMX307的MIPI配置
IMX307是1080P的MIPI传感器。MIPI配置的时候需要注意在combo_dev_attr_t结构体中对lane的配置。
参考《MIPI使用指南》P14、P55:
Hi3516EV200只有两条LANE,分别为lane 0和lane 2,所以lane _id配置为{0,2,-1,-1}。
这个结构体中lane配置错误将导致VI-PIPE和通道建立成功,但是没有视频数据。
VENC视频缩小和VGS
因为Hi3516EV200是所有使用MPP4.0的芯片中为最低端的一款,所以有些限制。它的VGS输入只支持非压缩图像(《HiMPP V4.0 媒体处理软件开发参考》P1499)。
当我使用VENC进行图像的分辨率设置时,如果目的分辨率小于源图像分辨率,VENC会调用VGS进行缩小(《HiMPP V4.0 媒体处理软件开发参考》P795),这个时候,如果源图像是压缩的,那么Hi3516EV200调用VGS就会失败,在/proc/umap/venc中表现为VENC SEND2项的SendVgs值和StartFail值相等且不断增加,但码流无法产生;在/proc/umap/vgs中表现为VGS JOB STATUS项的Cancel子项数值不断增加。
而保证输入到VENC源图像是非压缩的话,不仅要修改VPSS(此处使用VENC接收VPSS传来的图像)的通道属性的 enCompressMode 成员是 COMPRESS_MODE_NONE 的。还要在初始化VB视频缓冲池、计算VB公共缓冲池块大小的时候,将COMPRESS_MODE_NONE 参数算进去。比如这样:
VB_CONFIG_S stVbConf;
memset(&stVbConf,0,sizeof(VB_CONFIG_S));
stVbConf.astCommPool[0].u64BlkSize=COMMON_GetPicBufferSize(1920,1080,PIXEL_FORMAT_YVU_SEMIPLANAR_420,DATA_BITWIDTH_8,COMPRESS_MODE_NONE,DEFAULT_ALIGN);
stVbConf.astCommPool[0].u32BlkCnt=3;//在线模式3,离线模式2
stVbConf.u32MaxPoolCnt=VB_MAX_POOLS;
注意COMMON_GetPicBufferSize函数的第5个参数。
关于同时启动的VENC编码通道数
Hi3516EV200的VENC最大支持建立16个编码通道,这说明在建立编码通道的时候,通道号可以从0~15任意选择,如果建立多个通道,通道号可以任意选择。不过不一定能建立16个通道,这取决于内存大小以及MMZ划分方式。
本文资源分享
百度网盘链接: https://pan.baidu.com/s/1BHM0wKsiL98q7Y2W6ZTGjw
提取码: 1mnd
————2020-3-12@燕卫博————