征程 6P codec decoder sample

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。

目录结构如下:

Plain 复制代码
.
├── codec_sample.sh
├── Kconfig
├── Makefile
├── Makefile.in
└── src
    ├── Makefile
    ├── sample.c
    ├── sample_common.c
    ├── sample.h

根目录包含 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. 编译环境

本 sample 的编译环境使用 SDK 中的 build 工具,请参考: Build 环境建立

2.2. 编译说明

本 sample 主要依赖 libmm 提供的 API 头文件:

Plain 复制代码
#include "hb_media_codec.h"
#include "hb_media_error.h"

编译依赖的库有如下:

Plain 复制代码
LIBS += -lpthread -ldl -lhbmem -lalog  -lmultimedia
LIBS += -lavformat -lavcodec -lavutil -lswresample

编译命令:

Plain 复制代码
# 进入SDK所有目录{sdk_dir},并source构建环境(参见上)。
# 编译本sample:
bdm libmm-sample
# 输出文件:
{sdk_dir}/out/debug-gcc_{gcc_version}/build/test/samples/platform_samples/source/S83_Sample/S83E04_Module/codec_sample

3. 运行

3.1. 支持平台

Matrix 6P/H

3.2. 板端部署及配置

刷写系统软件镜像后,本 sample 的可执行文件位于板端:/app/sample/S83_Sample/S83E04_Module/codec_sample/bin/。

可能需要用到的资源:

  • 执行脚本 codec_sample.sh 位于板端:/app/sample/S83_Sample/S83E04_Module/codec_sample/bin/;
  • 输入 H264、H265、JPG 文件可使用脚本或者用户自行准备。

3.3. 运行指南

3.3.1. 运行参数说明

codec_sample : 应用程序名字。

下面的表格是具体参数的说明:

3.3.2. 帮助菜单
Plain 复制代码
Usage: ./codec_sample
  -m --samplemode sample mode, default encoder, {0-encoder, 1-decoder}
  -c --codecid codec id, default h264, {0-h264, 1-h265, 2-mjpeg, 3-jpeg}
  -w --width width, default 3840
  -h --height height, default 2160
  -p --pixfmt pix fmt, default nv12, {0-yuv420p, 1-nv12, ..}
  -n --threadnum test thread number, default 1
  -i --inputfile input file name, default ./input_${w}x${h}_${pixfmt}.yuv
  -o --outputfile output file name, default ./output_${w}x${h}_${pixfmt}.{code_type}
  -u --core unit, default 0
3.3.3. 运行方法

输入源准备:

执行如下脚本,此脚本的作用是把测试用的源文件拷贝到/map/路径下,然后用-i 指定文件路径;

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/codec_sample/bin/decoder_resoure_prepare.sh

用户也可以不执行脚本,自行准备源文件,拷贝到/map/路径下,然后用-i 指定文件路径。

解码一路 3840x2160 的 h264 视频, 生成 yuv 图像。

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/codec_sample/bin/codec_sample -m 1 -i /map/input_3840x2160_nv12.h264

解码一路 1920x1080 的 h265 视频, 生成 yuv 图像。

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/codec_sample/bin/codec_sample -m 1 -c 1 -w 1920 -h 1080 -i /map/input_1920x1080_nv12.h265

解码一张 1920x1088 的 jpg 图片, 生成 yuv 图像。

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/codec_sample/bin/codec_sample -m 1 -c 3 -w 1920 -h 1088 -i /map/input_1920x1088_nv12.jpg

解码两路 3840x2160 的 h264 视频, 生成 yuv 图像。

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/codec_sample/bin/codec_sample -m 1 -n 2 -i /map/input_3840x2160_nv12.h264

解码四路 1920x1080 的 h265 视频, 生成 yuv 图像。

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/codec_sample/bin/codec_sample -m 1 -c 1 -n 4 -w 1920 -h 1080 -i /map/input_1920x1080_nv12.h265

上面的命令默认跑 VPU 或者 JPU 硬件核 0,可通过-u 参数调整,加入-u 1 表示指定运行 VPU 核 1 或者 JPU 核 1,加入-u 2 表示指定运行 VPU 核 2 或者 JPU 核 2。

例如跑 VPU 核 1,解码一路 3840x2160 的 h264 视频,生成 yuv 图像。

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/codec_sample/bin/codec_sample -u 1 -m 1 -i /map/input_3840x2160_nv12.h264

例如跑 JPU 核 2,解码一张 1920x1088 的 jpg 图片,生成 yuv 图像。

Plain 复制代码
/app/sample/S83_Sample/S83E04_Module/codec_sample/bin/codec_sample -u 2 -m 1 -c 3 -w 1920 -h 1088 -i /map/input_1920x1088_nv12.jpg
3.3.4. 运行结果说明

如下图所示为运行成功:

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

相关推荐
小欣加油12 小时前
leetcode2161 根据给定数字划分数组
数据结构·c++·算法·leetcode·职场和发展
Momo__zz12 小时前
零代码平台设计
算法·深度优先
cpp_250113 小时前
P2947 [USACO09MAR] Look Up S
数据结构·c++·算法·题解·单调栈·洛谷
生成论实验室13 小时前
判断力与六十四卦:AI的第三块基石
人工智能·语言模型·机器人·自动驾驶·安全架构
水木流年追梦13 小时前
大模型入门-大模型优化方法13- MTP 多 token 输出、DCA 双块注意力
人工智能·分布式·算法·正则表达式·prompt
数据皮皮侠13 小时前
全国消协智慧 315 平台投诉信息数据库
大数据·人工智能·算法·百度·制造
8Qi813 小时前
LeetCode 115 & 392:不同子序列 / 判断子序列
算法·leetcode·职场和发展·动态规划
小蒋学算法14 小时前
算法-乘法表中第K小的数-二分
数据结构·算法
智者知已应修善业14 小时前
【51单片机8个LED,已经使用了D1D2,怎么样在不动D1D2的前提下实现D6~D8的流水灯】2024-1-19
c++·经验分享·笔记·算法·51单片机
Evand J14 小时前
【MATLAB例程】自适应渐消扩展卡尔曼滤波(AFEKF)三维雷达目标跟踪|效果已调优,附下载链接和运行结果,代码直接运行即可
开发语言·算法·matlab·目标跟踪·卡尔曼滤波·自适应滤波·代码定制