Hi3516EV200进行H264/H265视频编码要点注意

目录

  • 说明
  • 开发环境和交叉编译工具链
  • IMX307的MIPI配置
  • VENC视频缩小和VGS
  • 关于同时启动的VENC编码通道数
  • 本文资源分享

说明

本博客性质属于个人学习记录,都是自己踩过的坑。

本文叙述的测试程序和动作在淘宝上买得到的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@燕卫博————

你可能感兴趣的:(Hi3516EV200进行H264/H265视频编码要点注意)