GStreamer の観点からの性能改善

マルチメディア ユーザー ガイド (UG1449)

Document ID
UG1449
Release Date
2022-04-21
Revision
1.4 日本語

queue エレメント

シングル スレッドの GStreamer パイプラインでは、データ スタベーションが起こることがあります。queue エレメントを使用することで、シングル スレッド パイプラインの性能を改善できます。

max-size-buffersmax-size-bytesmax-size-time プロパティで指定したいずれかの上限値に達するまで、データはキューに格納されます。それ以上のバッファーをキューにプッシュしようとしても、空きができるまでそのスレッドはブロックされます。

queue エレメントはパイプラインにスレッド境界とバッファー サポートを追加します。queue はソース パッド上に新規スレッドを作成し、シンクおよびソース パッドの処理を分離します。

キュー サイズはデフォルトで 200 バッファー、データ サイズで 10MB、時間で 1 秒分のデータに制限されており、これらのいずれかに達した時点が上限となります。

次に、queue エレメントを使用したパイプラインの例を示します。

gst-launch-1.0 filesrc location="/media/card/input-file.mp4" !qtdemux name=demux
demux.video_0 ! h265parse ! omxh265dec ! queue max-size-bytes=0 ! 
fpsdisplaysink text-overlay=false 
video-sink="kmssink bus-id=a0070000.v_mix" -v

サービス品質 (QoS)

GStreamer では、パイプラインのリアルタイム性能を測定および調整することによってサービス品質 (QoS) を改善します。リアルタイム性能は常にパイプライン クロックを基準に測定されます。これは通常、シンクでバッファーがクロックに同期されるときに実行されます。

バッファーがシンクに遅れて到着した場合、つまりバッファーの方がクロックよりも実行時間が短い場合、パイプラインに QoS 上の問題が存在します。これにはいくつかの理由が考えられます。

  • CPU 負荷が高い: ストリームの処理に十分な CPU 性能がないと、バッファーがシンクに遅れて到着します。
  • ネットワークの問題
  • その他のリソースの問題: ディスク負荷、メモリ ボトルネックなど

測定結果に基づいて QoS イベントが生成され、1 つまたは複数のアップストリーム エレメントのデータ レートが調整されます。この調整には 2 つの種類があります。

  • シンクでの最新の測定結果に基づく短期的な緊急補正
  • シンクで測定されたトレンドに基づく長期的なレート補正
短期補正

短期補正は、QOS イベントの timestamp と jitter の値を使用して実行します。jitter が正の値の場合、直前のバッファーが遅れて到着しており、timestamp < timestamp + jitter のバッファーも遅れて到着することが予測されます。したがって、timestamp が timestamp + jitter より小さいバッファーはすべてドロップするようにします。

長期補正

長期補正はもう少し複雑です。この補正では、QOS イベントの proportion の値を使用します。エレメントは、QoS メッセージの proportion フィールドの値だけリソースの使用量を減らす必要があります。

それには、次のような方法があります。

  • 永続的にフレームをドロップするか、エレメントの CPU または帯域幅の要件を緩和する。
  • 品質を下げた処理に切り替えるか、アルゴリズムの複雑さを緩和する。ただし、これによって視覚的または聴覚的なグリッチが生じないように注意する必要があります。
  • より品質の低いソースに切り替えてネットワーク帯域幅を軽減する。
  • パイプラインの重要な部分に割り当てる CPU サイクルを増やす。これには、スレッドの優先度を上げるなどの方法があります。

いずれの場合も、QOS イベントの proportion メンバーが理想の proportion 値に近付いたらエレメントを通常の処理レートに戻せるようにしておく必要があります。

エンコーダーおよびデコーダー プラグインも QoS の機能をサポートしています。

  • デコーダーではデフォルトで QoS が有効で、デコードが完了するとダウンストリームからの QoS イベントに基づいてフレームをドロップします。
  • エンコーダーではデフォルトで QoS が無効で、QoS 条件が真の場合、ダウンストリームからの QoS イベントに基づいてエンコード中に入力バッファーをドロップします。

sync

GStreamer パイプラインでは、sync フラグが重要な役割を果たします。sync フラグは、シンク エレメントのタイムスタンプをチェックしてパイプラインのオーディオ/ビデオを同期します。パイプラインの最大性能を確認するには、パイプラインのシンク エレメントで sync フラグを FALSE に設定して同期を無効にします (この設定で同期が達成されることはありません)。sync フラグは、録画パイプラインのシンク エレメントでデータを受信後、直ちにダンプする場合に役立ちます。

次に、録画パイプラインで sync=false に設定した例を示します。

gst-launch-1.0 v4l2src
device=/dev/video0 io-mode=4 ! video/x-raw, format=NV12,width=3840,height=2160,framerate=60/1 ! omxh265enc qp-
mode=auto  gop-mode=basic
gop-length=60 b-frames=0 target-bitrate=60000 num-slices=8 control- rate=constant
prefetch-buffer=true cpb-size=1000 initial-delay=500 ! queue ! video/x- h265, profile=main,
alignment=au ! mpegtsmux alignment=7 name=mux ! filesink location="/ media/card/test.ts"
sync=false