ROCK 5B (RK3588) でhwエンコード ( rkmppenc )

Rock 5BのRK3588 SoCはhwデコーダ・エンコーダを内蔵していて、下記のコーデックに対応している。

hwエンコード
H.264/HEVC

hwデコード
H.264/HEVC/AV1/MPEG1/MPEG2

このデコーダ・エンコーダを試すため、rkmppenc というアプリを作成した。

rkmppenc_0_00_1080p_encode.jpg

H.264からH.264への1080pのエンコードで、400fps以上出しながら、CPU使用率は70%台(Linuxで8コアCPUなのでmaxは800%)と非常に低く抑えられている。

まあ、Bフレームとかはないので、画質はいまいちだけど、とりあえずこの速度でエンコードできるのはかなり高速なエンコーダが積まれているということだと思う。



ROCK 5BのRK3588 SoCのhwデコーダ・エンコーダ



Rock 5BのRK3588 SoCのhwエンコーダ・デコーダはmppというライブラリから呼び出すことができる。

また、リサイズ等を行うことのできる画像処理エンジン(NPU)を搭載しており、これはlibrgaというライブラリから呼び出すことができる。



ffmpeg-rkのテスト



実際のアプリケーションとしては、公式ではgstreamerで対応しており、また下記のffmpegのフォークから使うことができる。

gstreamerはなんかコマンドラインが独特で使いにくいので、できればffmpeg系を使いたい。ただ、試したかぎり、このffmpeg-rkだといろいろな問題が発生してしまった。

- MPEG2 hwデコードがまともに行えない
dropが多発して、そもそもまともにデコードできなかった。

- hwデコードすると勝手にインタレ解除される

- HEVCエンコードに対応していない

- H.264エンコード時に、levelが適切に設定されない
このため、プレーヤーによっては再生できなかったりという問題が発生する。

- hwデコード + hwエンコードの組み合わせのみしか動作しない
例えば、swデコード + hwエンコード、hwデコード + swエンコード等がうまく動作しない。

- librgaによるリサイズがうまく動作しない
使用しているlibrgaのAPIバージョンが古いため、RK3588 SoCでは動作しない?

といろいろな問題があった。

gstreamerはもう少しちゃんと動作するようだが、やはりMPEG2デコードが安定しないなどの問題がある。



rkmppenc



ffmpeg-rkでは多くの問題があるため、ffmpegの枠組みの中でいろいろ調査するよりも、自分が全体を理解しているコードで自由に実装できるほうが調べやすいと思ったので、VCEEncをベースに新たにrkmppencというアプリを作成した。

いろいろ試行錯誤して、ひととおりffmpeg-rkでいろいろあった問題は解消でき、安定して動作できるようになった。

対応状況は下記の通り。

- hwエンコード
H.264/HEVC

- hwデコード
H.264/HEVC/MPEG2 (8bitのみ)

- librgaによるhwリサイズ
- iepによるhwインタレ解除
- OpenCLによるフィルタ



一番の問題だったhw MPEG2デコードも問題なく動くようになって、
MPEG hwデコード → hwインタレ解除(iep) → hwリサイズ(librga) → H.264 hwエンコード
みたいに処理してこんな感じ。

rkmppenc_0_00_1080p_vpp_deinterlace_normal.jpg

MPEG2デコードは、H.264デコードより遅いのだけど、それでもCPU使用率も低めに抑えられ、60fpsちょっと出すことができている。



エンコードというよりはおそらくインタレ解除周りで律速しているので、インタレ解除でbob化を選択すると、もう少し速度が出て、130fpsぐらい。

rkmppenc_0_00_1080p_vpp_deinterlace_bob.jpg



なお、RK3588のhwエンコーダはBフレームは非対応なので、圧縮率・画質はあまりよろしくはない。このあたりはSBCだし仕方ないだろうし、まあ画質を求めるならQSVとかNVENC、あるいはswエンコーダを使用したほうがよいだろう。

課題は下のようあるけど、一通りは動作するようになったかも。
- hwデコードで対応しているコーデックが限られている
- hwデコードで10bit未対応 (一応ハード的には対応しているはずだが、そこまで実装できていない)
- RK3588以外でどう動作するかわからん
 なんかライブラリのバージョン違いで呼び出し方とかも大きく変わるらしい…?



ビルド方法



Ubuntuでのビルド方法は下記に書いてみたので、試す場合はこちらを参考にしてみてほしい。
https://github.com/rigaya/rkmppenc/blob/master/Build.ja.md



まとめ



ということで、mpp/iep/rgaライブラリを活用して、RK3588 SoCでエンコードするアプリを作成した。

うまく動くようになるまで、いろいろ大変だった。とにかく情報が少ないのが、こういうデバイスの難点。でも、とりあえずそこそこ安定して動くようになって本当によかった。



おわりに



ROCK 5Bのhwデコーダ・エンコーダ調査に関して、tsukumi様にさまざまなご助言・情報提供・テスト等、多大なご協力をいただきました。ありがとうございました。
スポンサーサイト



コメントの投稿

非公開コメント

プロフィール

rigaya

Author:rigaya
アニメとか見たり、エンコードしたり。
連絡先: rigaya34589@live.jp
github twitter

最新記事
最新コメント
カテゴリ
月別アーカイブ
カウンター
検索フォーム
いろいろ
公開中のAviutlプラグインとかのダウンロード

○Aviutl 出力プラグイン
x264guiEx 3.xx
- x264を使用したH264出力
- x264guiExの導入紹介動画>
- x264guiExの導入
- x264guiExのエラーと対処方法>
- x264.exeはこちら>

x265guiEx
- x265を使用したH.265/HEVC出力
- x265guiExの導入>
- x265.exeはこちら>

QSVEnc + QSVEncC
- QuickSyncVideoによるHWエンコード
- QSVEnc 導入/使用方法>
- QSVEncCオプション一覧>

NVEnc + NVEncC
- NVIDIAのNVEncによるHWエンコード
- NVEnc 導入/使用方法>
- NVEncCオプション一覧>

VCEEnc + VCEEncC
- AMDのVCE/VCNによるHWエンコード
- VCEEnc 導入/使用方法>
- VCEEncCオプション一覧>

svtAV1guiEx
- SVT-AV1によるAV1出力
- svtAV1guiExの導入>
- SVT-AV1単体はこちら>

VVenCguiEx
- VVenCによるVVC出力
- VVenCguiExの導入>

ffmpegOut
- ffmpegを使用した出力
- ffmpegOutの導入>


○Aviutl フィルタプラグイン
自動フィールドシフト (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: aji様

clcufilters 
- OpenCL/CUDAのGPUフィルタ集
- 対応フィルタの一覧等はこちら

エッジレベル調整MT (ミラー)
- エッジレベル調整の並列化/高速化
- SSE2~AVX512対応
- オリジナル: まじぽか太郎様

バンディング低減MT (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: まじぽか太郎様

PMD_MT
- SSE2~AVX512による高速化版
- オリジナル: スレ48≫989氏

透過性ロゴ (ミラー)
- SSE2~FMA3によるSIMD版
- オリジナル: MakKi氏

AviutlColor (ミラー)
- BT.2020nc向け色変換プラグイン
- BT.709/BT.601向けも同梱

○その他
Amatsukaze改造版
- AmatsukazeのAV1対応版

tsreplace
- tsの映像のみを置き換えて圧縮

rkmppenc
- Rockchip系SoCのhwエンコーダ

fawutil
- FAW(FakeAACWave)⇔aac変換
- 二重音声の取り扱いにも対応

x264afs (ミラー)
- x264のafs対応版

aui_indexer (ミラー使い方>)
- lsmashinput.aui/m2v.auiの
 インデックス事前・一括生成

auc_export (ミラー使い方>)
- Aviutl Controlの
 エクスポートプラグイン版
 エクスポートをコマンドから

aup_reseter (ミラー)
- aupプロジェクトファイルの
 終了フラグを一括リセット

CheckBitrate (ミラー, 使い方, ソース)
- ビットレート分布の分析(HEVC対応)

チャプター変換 (使い方>)
- nero/appleチャプター形式変換

エッジレベル調整 (avisynth)
- Avisynth用エッジレベル調整

メモリ・キャッシュ速度測定
- スレッド数を変えて測定
- これまでの測定結果はこちら

○ビルドしたものとか
L-SMASH (ミラー)
x264 (ミラー)
x265 (ミラー)
SVT-AV1 (ミラー)

○その他
サンプル動画
その他

○読みもの (ミラー)
Aviutl/x264guiExの色変換
動画関連ダウンロードリンク集
簡易インストーラの概要

○更新停止・公開終了
改造版x264gui
x264guiEx 0.xx
RSSリンクの表示
リンク
QRコード
QR