RK3399_Android7.1_MPI_Demo_說 明

tt7643066發表於2020-08-03

1 mpi_mul _test 簡介
mpi_multi_test 是基於 mpp api  開發的  demo。 Mpp api 是 Rockchip 演算法組新
開發的一套編解碼 api。 mpi_multi_test 支援同時多解析度的多路編碼和多路解碼, 只需要修改
傳遞的引數。
介面支援:
 h264 和 jpeg 編碼
 mpeg2, ,h263,h264, ,vp8,vp9,avs+解碼  
2 mpi_multi_test 編譯
2.1 mpi_multi_test 原始碼路徑
多路編解碼 demo 原始碼路徑: external/mpp-demo。 重要原始碼目錄說明:
├── build
│ ├── android
│ │ ├── android.toolchain.cmake 編譯規則檔案
│ │ ├── 
│ │ │ ├── make-Android.bash 編譯指令碼檔案
├── doc 說明文件
├── inc 標頭檔案
├── mpp 編解碼基礎庫檔案
├── osal 系統層檔案
├── test
│ ├── mpi_multi_test.c 多路編解碼 demo 原始碼
├── tools 除錯分析工具
├── utils 公用方法檔案 
2.2 mpi_multi_test 原始碼編譯OMX_RK_VIDEO_CodingKhronosExtensions = 0x6F000000, /**< Reserved region for
introducing Khronos Standard Extensions */
OMX_RK_VIDEO_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for
introducing Vendor Extensions */
OMX_RK_VIDEO_CodingMax = 0x7FFFFFFF
} OMX_RK_VIDEO_CODINGTYPE;
測試多解析度的多路 H264 解碼(丟棄解碼後的資料, 排除 io 效能影響解碼) :
./mpi_multi_test {i=/data/640x480.h264:w=640:h=360:t=7:p=10:q=1}
{i=/data/1280x720.h264: w=1280:h=720:t=7:p=1:q=1} {i=/data/1920x1080.h264:
w=1920:h=1080:t=7:p=1:q=1}
mpi_multi_test 多路解碼是透過建立多個執行緒來實現解碼, 每路解碼裡面又分為兩個執行緒:
send packet 執行緒和 get frame 執行緒。
Send packet 執行緒: 呼叫 decode_sendstream 將待解碼的 packet 傳入給解碼器, Pack
et 不需要外部分幀, mpp 內部會自行組幀。
Get frame 執行緒: 呼叫 decode_getframe 從解碼器獲取解碼後的 frame, decode_getfr
ame 為阻塞介面, 還未能獲取到 frame 時阻塞。
3.2 解碼邏輯
如何判斷解碼全部結束?
送解碼時依賴的 packet 結構是 struct VideoPacket_t, 透過設定 VideoPacket_t 的
nFlags 成員在 packet 中打上結束標誌, 在解碼到最後一幀時 decode_getframe 會返回 -1011
作為標識。
3.3 寬高對齊
以輸入源為 1080p 為例:
1. H264 解碼後, 輸出的影像寬 1920 高 1088(h264 寬高均 16 對齊);
福州瑞芯微 股份有限公司
5
2. H265 解碼後, 輸出的影像寬 2160 高 1088(h265 寬 256 對齊, 高 1088 對齊);
4 多路編碼
4.1 mpi_multi_test 使用和引數說明
測試多解析度的多路 H264 編碼:(寫檔案)
./ mpi_multi_test
{i=/data/640x480.y :o=/data/640x480.yuv.h264:w=640:h=480:f=4:n=100:t=7:p=1:q=2:r=1}
{i=/data/1280x720.yuv:o=/data/1280x720.yuv.h264:w=1280:h=720:f=4:n=100:t=7:p=1:q=2:
r=1}
{i=/data/1920x1080.yuv:o=/data/1920x1080.yuv.h264:w=1920:h=1080:f=4:n=100:t=7:p=1:
q=2:r=1}
引數說明:(引數之間用:隔開)
i 指定待編碼的檔案
o 指定報錯解碼後的檔案(當測試 vpu 解碼效能時, 不需要填, 排除寫 flash 影響)
w 影片寬
h 影片高
p 同時幾路編碼, p=1 表示一路編碼
q 編碼或者解碼, q=1 表示解碼, q=2 表示編碼
t 指定編碼後協議型別, 7 代表的是 H.264, 8 代表的是 JPEG, 參考 2.1 章節說明
r 指定編碼 rc_mode, 0 為 VBR, 1 為 CBR。 參考 4.3 章節說明
f 是輸入影像的格式, 當原始資料為 YUV420P 格式時, f 設為 4; 原始資料為 NV12 時,
f 設定為 5。 具體指出以下幾種:
typedef enum {
MPP_FMT_YUV420SP = MPP_FRAME_FMT_YUV, /* YYYY... UV... (NV12) */
MPP_FMT_YUV420SP_10BIT,
福州瑞芯微電子股份有限公司
6
MPP_FMT_ SP, /* YYYY... UVUV... (N 4) */
MPP_FMT_YUV422SP_10BIT, ///< Not part of ABI
MPP_FMT_YUV420P, /* YYYY... U...V... (I420) */
MPP_FMT_YUV420SP_VU, /* YYYY... VUVUVU... (NV21) */
MPP_FMT_YUV422P, /* YYYY... UU...VV...(422P) */
MPP_FMT_YUV422SP_VU, /* YYYY... VUVUVU... (NV42) */
MPP_FMT_YUV422_YUYV, /* YUYVYUYV... (YUY2) */
MPP_FMT_YUV422_UYVY, /* UYVYUYVY... (UYVY) */
MPP_FMT_YUV400SP, /* YYYY... */
MPP_FMT_YUV440SP, /* YYYY... UVUV... */
MPP_FMT_YUV411SP, /* YYYY... UV... */
MPP_FMT_YUV444SP, /* YYYY... UVUVUVUV... */
MPP_FMT_YUV_BUTT,
MPP_FMT_RGB565 = MPP_FRAME_FMT_RGB, /* 16-bit RGB */
MPP_FMT_BGR565, /* 16-bit RGB */
MPP_FMT_RGB555, /* 15-bit RGB */
MPP_FMT_BGR555, /* 15-bit RGB */
MPP_FMT_RGB444, /* 12-bit RGB */
MPP_FMT_BGR444, /* 12-bit RGB */
MPP_FMT_RGB888, /* 24-bit RGB */
MPP_FMT_BGR888, /* 24-bit RGB */
MPP_FMT_RGB101010, /* 30-bit RGB */
MPP_FMT_BGR101010, /* 30-bit RGB */
MPP_FMT_ARGB8888, /* 32-bit RGB */
MPP_FMT_ABGR8888, /* 32-bit RGB */
MPP_FMT_RGB_BUTT,
福州瑞芯微電子股份有限公司
7
/* simliar to I420, but Pixels are grouped in macroblocks of 8x4 size */
MPP_FMT_YUV420_8Z4 = MPP_FRAME_FMT_COMPLEX,
/* The end of the formats have a complex layout */
MPP_FMT_COMPLEX_BUTT,
MPP_FMT_BUTT = MPP_FMT_COMPLEX_BUTT,
} MppFrameFormat;
測試多解析度的多路 H264 編碼(丟棄編碼後的資料, 排除 io 效能影響解碼) :
./ mpi_multi_test {i=/data/640x480.yuv:w=640:h=480:f=4:n=100:t=7:p=1:q=2:r=1}
{i=/data/1280x720.yuv:w=1280:h=720:f=4:n=100:t=7:p=1:q=2:r=1}
{i=/data/1920x1080.yuv:w=1920:h=1080:f=4:n=100:t=7:p=1:q=2:r=1}
4.2 編碼邏輯
編碼 h264, 在呼叫 test_mpp_preprare 後會生成 sps 和 pps, 這兩個輔助說明資訊在後
續解碼時會用到, 缺少 sps 和 pps 無法解碼。
編碼只有一個 encode 介面需要呼叫, 每次呼叫輸入一幀影像的同時獲取一幀輸出。
福州瑞芯微電子股份有限公司
8
4.3 位元速率控制
編碼時的位元速率控制透過呼叫 test_mpp_setup 介面來設定。 編碼時, 根據實際需求修改位元速率
等引數, 修改 mpi_multi_test.c 檔案 test_mpp_setup 函式里面的引數賦值。
typedef struct MppEncRcCfg_t {
RK_U32 change;
/*
* rc_mode - rate control mode
* *
mpp provide two rate control mode:
* *
Constant Bit Rate (CBR) mode
* - paramter 'bps*' define target bps
* - paramter quality and qp will not take effect
* *
Variable Bit Rate (VBR) mode
* - paramter 'quality' define 5 quality levels
福州瑞芯微電子股份有限公司
9
* - paramter 'bps*' is used as reference but not strict condition
* - special Constant QP (CQP) mode is under VBR mode
* CQP mode will work with qp in  Cfg. But only use for test
* *
default: CBR
*/
MppEncRcMode rc_mode;
/*
* quality - quality parameter, only takes effect in VBR mode
* *
Mpp does not give the direct parameter in d ferent protocol.
* *
Mpp provide total 5 quality level:
* Worst - worse - Medium - better - best
* *
extra CQP level means special constant-qp (CQP) mode
* *
default value: Medium
*/
MppEncRcQuality quality;
/*
* bit rate parameters
* mpp gives three bit rate control parameter for control
* bps_target - target bit rate, unit: bit per second
* bps_max - maximun bit rate, unit: bit per second
福州瑞芯微電子股份有限公司
10
* bps_min - minimun bit rate, unit: bit per second
* if user need constant bit rate set parameters to the similar value
* if user need variable bit rate set parameters as they need
*/
RK_S32 bps_target;
RK_S32 bps_max;
RK_S32 bps_min;
/*
* frame rate parameters have great effect on rate control
* *
fps_in_flex
* 0 - fix input frame rate
* 1 - variable input frame rate
* *
fps_in_num
* input frame rate numerator, if 0 then default 30
* *
fps_in_denorm
* input frame rate denorminator, if 0 then default 1
* *
fps_out_flex
* 0 - fix output frame rate
* 1 - variable output frame rate
* *
fps_out_num
福州瑞芯微電子股份有限公司
11
* output frame rate numerator, if 0 then default 30
* *
fps_out_denorm
* output frame rate denorminator, if 0 then default 1
*/
RK_S32 fps_in_flex;
RK_S32 fps_in_num;
RK_S32 fps_in_denorm;
RK_S32 fps_out_flex;
RK_S32 fps_out_num;
RK_S32 fps_out_denorm;
/*
* gop - group of picture, gap between Intra frame
* 0 for only 1 I frame the rest are all P frames
* 1 for all I frame
* 2 for I P I P I P
* 3 for I P P I P P
* etc...
*/
RK_S32 gop;
/*
* skip_cnt - max continuous frame skip count
* 0 - frame skip is not allow
*/
RK_S32 skip_cnt;
福州瑞芯微電子股份有限公司
12
} MppEncRcCfg;
rc_mode 可選固定 VBR 模式或 CBR 模式。 CBR mode 是固定位元速率, VBR mode 是變位元速率。
測試 demo 裡面用的是 CBR 固定位元速率, 實際使用一般建議用 VBR 模式。
5 多路解碼和編碼
5.1 mpi_multi_test 使用
測試多解析度的多路 H264 編解碼:(寫檔案)
./ mpi_multi_test
{i=/data/1280x720.yuv:o=/data/1280x720.yuv.h264:w=1280:h=720:f=0:n=100:t=7:p=1:
q=2}
{i=/data/1920x1080.yuv:o=/data/1920x1080.yuv.h264:w=1920:h=1080:f=0:n=100:t=7:p
=1:q=2}
{i=/data/1920x1080.h264:o=/data/1920x1080.h264.yuv:w=1920:h=1080:t=7:p=1:q=1:r
=1}
測試多解析度的多路 H264 編解碼:(丟棄編解碼後的資料, 排除 io 效能影響解碼)
./ mpi_multi_test {i=/data/1280x720.yuv:w=1280:h=720:f=0:n=100:t=7:p=1:q=2}
{i=/data/1920x1080.yuv:w=1920:h=1080:f=0:n=100:t=7:p=1:q=2}
{i=/data/1920x1080.h264:w=1920:h=1080:t=7:p=1:q=1:r=1}
5.2 多路編解碼自動化測試
多路編解碼測試可以參考 mpp_test.sh 指令碼:
./mpp_test.sh 1 ---decode_bench is not save yuv file
./mpp_test.sh 2 ---decode_bench_save_file is save yuv file
./mpp_test.sh 3 ---encode_bench is not save yuv file
./mpp_test.sh 4 ---encode_bench_save_file is save h264 file
福州瑞芯微電子股份有限公司
13
./mpp_test.sh 5 ---decode_4K_bench is not save yuv file
./mpp_test.sh 6 ---mpi_test_bench is all-around test
測試幀率 log: 
編譯
cd external/mpp-demo/build/android/arm/
./make-Android.bash
編譯完成後, 會生成 so 庫和可執行檔案:
test/mpi_multi_test
mpp/legacy/libvpu.so
mpp/libmpp.so
2.3 推送 so 庫和可執行檔案到 3399 
adb root;adb disable-verity;adb reboot
adb root;adb remount
adb push mpi_multi_test /system/bin/
adb push libvpu.so /system/lib/
adb push libmpp.so /system/lib/
adb shell sync
3 多路解碼
3.1 Mpi_multi_test 使用和引數說明
測試多解析度的多路 H264 解碼(寫檔案) :
./mpi_multi_test
{i=/data/640x480.h264:o=/data/640x360.h264.yuv:w=640:h=360:t=7:p=10:q=1}
{i=/data/1280x720.h264:o=/data/1280x720.h264.yuv:w=1280:h=720:t=7:p=1:q=1}
{i=/data/1920x1080.h264:o=/data/1920x1080.h264.yuv:w=1920:h=1080:t=7:p=1:q=1} 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69948385/viewspace-2708807/,如需轉載,請註明出處,否則將追究法律責任。