RK3588编解码之mpp解码demo解析: mpi_dec_test
1. 简介
-
mpi_dec_test 是rockchip官方解码 demo
-
本篇文章进行mpi_dec_test 的代码解析,解码流程解析
2. 环境介绍
-
硬件环境: ArmSoM-W3 RK3588开发板
-
软件版本: OS:ArmSoM-W3 Debian11
3. mpp解码流程解析
-
mpp_create :获取 MppCtx 实例以及 MppApi 结构体
-
mpp_init: 初始化MppCtx 的编解码类型与格式
-
mpi->control:通过相应的命令来配置解码参数
-
decode_put_packet:输入码流:编码数据 MppPacke,例如264、265数据
-
decode_get_frame: 获取解码的数据存放到MppFrame,例如YUV、RGB数据
-
mpi->reset:使解码器恢复为正常初始化后的状态。
-
mpp_destroy:释放申请的内存空间,做销毁善后工作
4. 重要函数解析
mpp_init函数:初始化MppCtx 的编解码类型与格式
mpp_init函数原型:
MPP_RET mpp_init(MppCtx ctx, MppCtxType type, MppCodingType coding)
mpp_init函数调用实例:
ret = mpp_init(ctx, MPP_CTX_DEC, MppCodingType::MPP_VIDEO_CodingAVC);
if (ret)
{
mpp_err("mpp_init failed ret %d\n", ret);
goto MPP_TEST_OUT;
}
mpp_init函数参数解析:
-
MppCtxType 参数:初始化编码还是解码
MPP_CTX_DEC : 解码
MPP_CTX_ENC : 编码 -
MppCodingType 参数:编解码的格式
MPP_VIDEO_CodingAVC : H.264
MPP_VIDEO_CodingHEVC: H.265
MPP_VIDEO_CodingVP8 : VP8
MPP_VIDEO_CodingVP9 : VP9
MPP_VIDEO_CodingMJPEG : MJPEG
5. mpi_dec_test 流程解析
mpi_dec_test 解码命令举例:
sudo mpi_dec_test -i /oem/200frames_count.h264 -t 7 -n 200 -o /oem/decode.yuv -w 1920 -h 1080
mpi_dec_test 流程解析:
main( ) ---> dec_decode( ) ---> thread_decode( ) ---> dec_simple( ) ---> mpp_destroy( )
-
main函数根据传进来的参数(参数char **argv 对应命令中的 -i /oem/200frames_count.h264 -t 7 -n 200 -o /oem/decode.yuv -w 1920 -h 1080)对参数进行解析保存到 MpiDecTestCmd * cmd 结构体中
-
dec_decode(cmd) 函数是封装好的解码函数,传入 MpiDecTestCmd * cmd 结构体即可完成解码
-
dec_decode 函数执行了一些MPP的初始化操作:mpp_create() mpp_init() ,mpp_dec_cfg_init() , mpi->control。初始化之后创建解码线程: thread_decode 进行解码。
-
解码线程: thread_decode 线程根据 cmd->simple 变量判断是使用 dec_simple 解码还是 dec_advanced 解码
-
解码完最后一帧之后执行 pthread_join() 函数等待解码线程: thread_decode 结束后做线程释放工作
-
线程释放完毕之后执行reset复位操作:mpi->reset(ctx)把解码器恢复为正常初始化后的状态。
-
解码器复位之后通过mpp_destroy()释放申请的内存空间,进行一些销毁操作防止内存泄漏。
6. mpi_dec_test使用实例
终端执行解码命令:
sudo mpi_dec_test -i /oem/200frames_count.h264 -t 7 -n 200 -o /oem/decode.yuv -w 1920 -h 1080
-
其中,-t 7 表示是输入 H.264 码流,-i 表示输入文件,-n 200 表示解码 200 帧 -w 图像宽度 -h 图像高度
解码输出如下: