RK3588 MPP 硬编码之mpi_enc_test .c解析
一. 简介
mpi_enc_test 是rockchip官方编码 demo
本篇文章进行mpi_enc_test 的代码解析,编码流程解析
二. 环境介绍
硬件环境: ArmSoM-W3 RK3588开发板
软件版本: OS:ArmSoM-W3 Debian11
三. mpp编解码流程解析

mpp_create :获取 MppCtx 实例以及 MppApi 结构体
mpp_init: 初始化MppCtx 的编解码类型与格式
mpi->control:通过相应的命令来配置编解码参数
encode_put_frame:输入图像数据MppFrame,例如YUV、RGB数据
encode_get_packet: 获取编码后的码流数据存放到MppPacket,例如H.264、H.265数据
mpi->reset:使解码器恢复为正常初始化后的状态。
mpp_destroy:释放申请的内存空间,做销毁善后工作
四. 重要函数解析
4.1 mpp_init函数:初始化MppCtx 的编解码类型与格式
mpp_init函数原型:
mpp_init函数调用实例:
mpp_init函数参数解析:
MppCtxType 参数:初始化编码还是解码
MppCodingType 参数:编解码的格式
等等,详细参看rk_type.h定义
4.2 设置编码器参数:test_mpp_enc_cfg_setup
函数原型:
函数解析: 主要是设置编码器参数,并将编码器参数保存到 MpiEncMultiCtxInfo 结构体中
4.3 编码函数:test_mpp_run
函数原型:
函数解析: 输入图像数据MppFrame,获取编码后的码流数据存放到MppPacket
五. mpi_enc_test 流程解析
mpi_enc_test 编码命令举例:
mpi_enc_test 流程解析:
主要流程:init 初始化 ---> test_mpp_enc_cfg_setup设置编码器相关参数 ----> test_mpp_run(info):输入图像数据,输出码流
main函数根据传进来的参数(参数char **argv 对应命令中的 -i /oem/decode.yuv -t 7 -n 200 -o /oem/encode.h264 -w 1920 -h 1080 -fps 60)对参数进行解析保存到 MpiEncTestArgs *cmd 结构体中
enc_test_multi(cmd, argv[0]); 函数是封装好的编码函数,传入 MpiDecTestCmd * cmd 结构体即可实现 H.265/H.264 视频编码的多路并发处理
enc_test_multi(cmd, argv[0]); 函数使用for循环创建新线程并调用 enc_test 来执行编码任务
enc_test 函数是整个的编码流程函数。首先执行了一些MPP的初始化操作:mpp_create() mpp_init() ,mpp_enc_cfg_init() , mpi->control。初始化之后执行 test_mpp_enc_cfg_setup函数来设置编码器相关参数。随后再进行最重要的编码操作:test_mpp_run(info):输入图像数据,输出码流
编码完成之后执行reset复位操作:p->mpi->reset(p->ctx)把编码器恢复为正常初始化后的状态。
编码器复位之后通过mpp_destroy()释放申请的内存空间,进行一些销毁操作防止内存泄漏。
pthread_join 函数等待编码线程结束,随后调用MPP_FREE(ctxs)函数做线程释放工作
编码线程结束,回到主线程的main()函数,执行mpi_enc_test_cmd_put(cmd), 释放 cmd 对象所占内存
六. mpi_enc_test 使用实例
终端执行编码命令:
将decode.yuv转成h264,分辨率1920x1080,fps60,总帧数200。
其中,-i 表示输入文件,-t 7 表示输出 H.264 码流,-n 200 表示编码 200 帧 -w 图像宽度 -h 图像高度,fps 60
查看编解码输出的信息:
编码输出如下: