1. 功能概述¶
解码h264/h265视频或jpg图片,生成yuv图像。
1.1. 软件架构¶
采用MediaCodec的poll模式来解耦输入和输出,可使解码帧率性能达到最优。 在主线程中灌码流数据:取出一个空的input buffer,配置码流数据的地址信息(如phys addr),再queue input buffer并通知解码器处理该帧数据; 另一个线程取输出YUV图像:通过select接收硬件解码完成通知,取出一个硬件填满输出图像的output buffer,将解码结果写到文件中后归还output buffer。

1.2. 硬件数据流说明¶

1.3. 代码位置及目录结构¶
sample代码位置在工程目录{sdk_dir}/test/samples/platform_samples/source/S83_Sample/S83E04_Module/codec_sample。
目录结构如下:
根目录包含Kconfig、codec_sample.sh和外部接口的makefile,Kconfig用于控制该demo是否加入整体编译;codec_sample.sh提供几种编解码执行脚本。
src目录下的makefile用于src目录下的编译。src目录下的sample.c是main入口的所在文件,sample_common包含了一些共用的api,sample_venc.c包含编码相关函数,sample_vdec.c包含解码相关函数。
2. 编译¶
2.1. 编译环境¶
2.2. 编译说明¶
本sample主要依赖libmm提供的API头文件:
编译依赖的库有如下:
编译命令:
3. 运行¶
3.1. 支持平台¶
Matrix 6P/H
3.2. 板端部署及配置¶
可能需要用到的资源:
- 执行脚本 codec_sample.sh 位于板端:/app/sample/S83_Sample/S83E04_Module/codec_sample/bin/;
输入H264、H265、JPG文件可使用脚本或者用户自行准备。
3.3. 运行指南¶
3.3.1. 运行参数说明¶
下面的表格是具体参数的说明:
参数名 | 用法 | 是否必需 |
|---|---|---|
-m | 编码或解码,默认编码, 0: encoder 1: decoder | 否 |
-c | 编解码器类型,默认H264, 0:H264 1:H265 2:mjpg 3:jpg | 否 |
-w | 图像宽度,默认3840 | 否 |
-h | 图像高度,默认2160 | 否 |
-p | 编解码图像格式,默认nv12, 0:yuv420p 1:nv12 2:nv21 | 否 |
-n | 测试线程数量,默认1个 | 否 |
-i | 输入文件的路径,默认./input_${w}x${h}_${pixfmt}.yuv | 是 |
-o | 输出文件的路径,默认./output_${w}x${h}_${pixfmt}.{code_type} | 否 |
-H | 打印帮助信息 | 否 |
-u | 指定硬件单元 | 否 |
3.3.2. 帮助菜单¶
3.3.3. 运行方法¶
输入源准备:
执行如下脚本,此脚本的作用是把测试用的源文件拷贝到/map/路径下,然后用-i指定文件路径;
用户也可以不执行脚本,自行准备源文件,拷贝到/map/路径下,然后用-i指定文件路径。
解码一路 3840x2160 的 h264 视频, 生成 yuv 图像。
解码一路 1920x1080 的 h265 视频, 生成 yuv 图像。
解码一张 1920x1088 的 jpg 图片, 生成 yuv 图像。
解码两路 3840x2160 的 h264 视频, 生成 yuv 图像。
解码四路 1920x1080 的 h265 视频, 生成 yuv 图像。
上面的命令默认跑VPU或者JPU硬件核0,可通过-u 参数调整,加入-u 1表示指定运行VPU核1或者JPU核1,加入-u 2表示指定运行VPU核2或者JPU核2。
例如跑VPU核1,解码一路 3840x2160 的 h264 视频,生成 yuv 图像。
例如跑JPU核2,解码一张 1920x1088 的 jpg 图片,生成 yuv 图像。
3.3.4. 运行结果说明¶
如下图所示为运行成功:

使用yuvplayer查看生成的yuv图像文件是否正常:
