第 9章バッファとイベント

パイプラインを流れるデータを構成するのは、バッファとイベントの組み合わせです。バッファには実際のメディアデータが含まれています。イベントには、シーク情報やストリームの最後の通知といったコントロール情報が含まれています。これらすべてが、パイプラインの実行中に自動的にパイプラインを流れることになります。この章ではコンセプトの説明に重点を置いているので、特別な前提知識は必要ありません。

9.1. バッファ

バッファには、作成したパイプラインを流れるデータが含まれています。一般に、ソースエレメントは新しいバッファを作成し、作成したバッファをパッドを経由してチェインの中の次のエレメントに渡します。GStreamer インフラを使ってメディアパイプラインを作成するときは、プログラマがバッファについて操作する必要はありません。エレメントが代わりに作業をしてくれるからです。

バッファはさまざまなものから構成されますが、中でも重要なのが以下のものです。

最も単純なケースでは、バッファが作成され、メモリが割り当てられ、そこにデータが入れられ、次のエレメントへと渡されることになります。次のエレメントはデータを読み取り、何らかの処理 (新しいバッファを作成してデコードしたデータをこのバッファに入れるなど) を行って、バッファへの参照を解除します。これで元のデータは解放され、バッファは破棄されます。典型的な動画デコーダや音声デコーダはこのような仕組みで動作します。

ただし、もう少し込み入ったケースもたくさんあります。エレメントは、インプレイスで、すなわち新しいバッファを作成することなく、バッファに変更を加えることができます。また、エレメントは、ハードウェアメモリに (ビデオキャプチャソースからなど) 書き込みをしたり、X サーバーから割り当てられたメモリに (XShm を使って) 書き込みをしたりすることもできます。さらに、バッファを読み取り専用にしたりすることもできます。