RK3588 MPP 硬編碼之mpi_enc_test .c解析
一. 簡(jiǎn)介
mpi_enc_test 是rockchip官方編碼 demo
本篇文章進(jìn)行mpi_enc_test 的代碼解析,編碼流程解析
二. 環(huán)境介紹
硬件環(huán)境: ArmSoM-W3 RK3588開(kāi)發(fā)板
軟件版本: OS:ArmSoM-W3 Debian11
三. mpp編解碼流程解析

mpp_create :獲取 MppCtx 實(shí)例以及 MppApi 結(jié)構(gòu)體
mpp_init: 初始化MppCtx 的編解碼類型與格式
mpi->control:通過(guò)相應(yīng)的命令來(lái)配置編解碼參數(shù)
encode_put_frame:輸入圖像數(shù)據(jù)MppFrame,例如YUV、RGB數(shù)據(jù)
encode_get_packet: 獲取編碼后的碼流數(shù)據(jù)存放到MppPacket,例如H.264、H.265數(shù)據(jù)
mpi->reset:使解碼器恢復(fù)為正常初始化后的狀態(tài)。
mpp_destroy:釋放申請(qǐng)的內(nèi)存空間,做銷毀善后工作
四. 重要函數(shù)解析
4.1 mpp_init函數(shù):初始化MppCtx 的編解碼類型與格式
mpp_init函數(shù)原型:
mpp_init函數(shù)調(diào)用實(shí)例:
mpp_init函數(shù)參數(shù)解析:
MppCtxType 參數(shù):初始化編碼還是解碼
MppCodingType 參數(shù):編解碼的格式
等等,詳細(xì)參看rk_type.h定義
4.2 設(shè)置編碼器參數(shù):test_mpp_enc_cfg_setup
函數(shù)原型:
函數(shù)解析: 主要是設(shè)置編碼器參數(shù),并將編碼器參數(shù)保存到 MpiEncMultiCtxInfo 結(jié)構(gòu)體中
4.3 編碼函數(shù):test_mpp_run
函數(shù)原型:
函數(shù)解析: 輸入圖像數(shù)據(jù)MppFrame,獲取編碼后的碼流數(shù)據(jù)存放到MppPacket
五. mpi_enc_test 流程解析
mpi_enc_test 編碼命令舉例:
mpi_enc_test 流程解析:
主要流程:init 初始化 ---> test_mpp_enc_cfg_setup設(shè)置編碼器相關(guān)參數(shù) ?----> ?test_mpp_run(info):輸入圖像數(shù)據(jù),輸出碼流
main函數(shù)根據(jù)傳進(jìn)來(lái)的參數(shù)(參數(shù)char **argv 對(duì)應(yīng)命令中的 -i /oem/decode.yuv -t 7 -n 200 -o /oem/encode.h264 -w 1920 -h 1080 -fps 60)對(duì)參數(shù)進(jìn)行解析保存到 ?MpiEncTestArgs *cmd?結(jié)構(gòu)體中
enc_test_multi(cmd, argv[0]);?函數(shù)是封裝好的編碼函數(shù),傳入?MpiDecTestCmd * cmd 結(jié)構(gòu)體即可實(shí)現(xiàn) H.265/H.264 視頻編碼的多路并發(fā)處理
enc_test_multi(cmd, argv[0]);?函數(shù)使用for循環(huán)創(chuàng)建新線程并調(diào)用 enc_test 來(lái)執(zhí)行編碼任務(wù)
enc_test? 函數(shù)是整個(gè)的編碼流程函數(shù)。首先執(zhí)行了一些MPP的初始化操作:mpp_create() mpp_init() ?,mpp_enc_cfg_init() , mpi->control。初始化之后執(zhí)行?test_mpp_enc_cfg_setup函數(shù)來(lái)設(shè)置編碼器相關(guān)參數(shù)。隨后再進(jìn)行最重要的編碼操作:test_mpp_run(info):輸入圖像數(shù)據(jù),輸出碼流
編碼完成之后執(zhí)行reset復(fù)位操作:p->mpi->reset(p->ctx)把編碼器恢復(fù)為正常初始化后的狀態(tài)。
編碼器復(fù)位之后通過(guò)mpp_destroy()釋放申請(qǐng)的內(nèi)存空間,進(jìn)行一些銷毀操作防止內(nèi)存泄漏。
pthread_join 函數(shù)等待編碼線程結(jié)束,隨后調(diào)用MPP_FREE(ctxs)函數(shù)做線程釋放工作
編碼線程結(jié)束,回到主線程的main()函數(shù),執(zhí)行mpi_enc_test_cmd_put(cmd), 釋放 cmd 對(duì)象所占內(nèi)存
六. mpi_enc_test 使用實(shí)例
終端執(zhí)行編碼命令:
將decode.yuv轉(zhuǎn)成h264,分辨率1920x1080,fps60,總幀數(shù)200。
其中,-i 表示輸入文件,-t 7 表示輸出 H.264 碼流,-n 200 表示編碼 200 幀 -w 圖像寬度 -h 圖像高度,fps 60
查看編解碼輸出的信息:
編碼輸出如下: