ROCK 5B (RK3588) でhwエンコード ( rkmppenc )
Rock 5BのRK3588 SoCはhwデコーダ・エンコーダを内蔵していて、下記のコーデックに対応している。
hwエンコード
H.264/HEVC
hwデコード
H.264/HEVC/AV1/MPEG1/MPEG2
このデコーダ・エンコーダを試すため、rkmppenc というアプリを作成した。

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エンコード
みたいに処理してこんな感じ。

MPEG2デコードは、H.264デコードより遅いのだけど、それでもCPU使用率も低めに抑えられ、60fpsちょっと出すことができている。
エンコードというよりはおそらくインタレ解除周りで律速しているので、インタレ解除でbob化を選択すると、もう少し速度が出て、130fpsぐらい。

なお、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様にさまざまなご助言・情報提供・テスト等、多大なご協力をいただきました。ありがとうございました。
hwエンコード
H.264/HEVC
hwデコード
H.264/HEVC/AV1/MPEG1/MPEG2
このデコーダ・エンコーダを試すため、rkmppenc というアプリを作成した。

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エンコード
みたいに処理してこんな感じ。

MPEG2デコードは、H.264デコードより遅いのだけど、それでもCPU使用率も低めに抑えられ、60fpsちょっと出すことができている。
エンコードというよりはおそらくインタレ解除周りで律速しているので、インタレ解除でbob化を選択すると、もう少し速度が出て、130fpsぐらい。

なお、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様にさまざまなご助言・情報提供・テスト等、多大なご協力をいただきました。ありがとうございました。
スポンサーサイト