第 5章エレメント

アプリケーションプログラマにとって GStreamer で最も重要なオブジェクトは GstElement オブジェクトです。エレメントは、メディアパイプラインの基本要素です。プログラマが使用するさまざまなハイレベルコンポーネントはすべて GstElement から派生したものです。あらゆるデコーダ、エンコーダ、デマルチプレクサ (demuxer)、動画、音声の出力は実際には GstElement です。

5.1. エレメントとは

アプリケーションプログラマの視点からみると、エレメントはブラックボックスとして表現するのが最も適切です。プログラマは一方の端から何かを入力します。すると、エレメントが何らかの処理をほどこし、もう一方の端からは何か別のものが出て来ます。たとえば、デコーダエレメントの場合、プログラマはエンコードされたデータを入力します。すると、エレメントはデコードされたデータを出力します。次の章 (パッドとケイパビリティを参照) では、エレメントでのデータの入力と出力についてもっと詳しく取り上げ、アプリケーションの中でこれらの入力や出力をセットアップする方法について説明します。

5.1.1. ソースエレメント

ソースエレメントは、パイプラインによって使われるデータを生成します。たとえば、ディスクやサウンドカードからデータを読み取ります。図5-1 は、ソースエレメントを図示したものです。以後、このような図では常にエレメントの右にソースパッドを表示します。

図 5-1. ソースエレメント

ソースエレメントはデータを受け付けません。ただデータを生成するだけです。図を見ると、このことがよくわかります。ソースエレメントにはソースパッド (右側) しかないからです。ソースパッドで可能なのは、データを生成することだけです。

5.1.2. フィルタ、コンバータ、デマルチプレクサ、マルチプレクサ、コーデック

フィルタとフィルタライクなエレメントは、入力パッドと出力パッドの両方を持っています。これらのエレメントは、入力パッド (シンク (sink) パッド) で受け取ったデータに処理を加え、出力パッド (ソースパッド) でデータを提供します。こうしたエレメントの例として、ボリュームエレメント (フィルタ)、動画スケーラ (コンバータ)、Ogg デマルチプレクサ (demuxer)、Vorbis デコーダなどを挙げることができます。

フィルタライクなエレメントは、任意の数のソースパッドまたはシンクパッドを持つことができます。たとえば、動画デマルチプレクサは、1 つのシンクパッドと複数 (1-N) のソースパッドを持ち、コンテナ形式に含まれるエレメンタリストリームごとに 1 つのソースパッドを備えることになります。一方、デコーダは、ソースパッドとシンクパッドをそれぞれ 1 つだけ持つことになるでしょう。

図 5-2. フィルタエレメント

図5-2 は、フィルタライクなエレメントを図示したものです。図に示したエレメントは、1 つのシンクパッドと 1 つのソースパッドを持っています。入力を受け取るシンクパッドは、エレメントの左側に描かれています。ソースパッドは、ソースエレメントの場合と同様、右側にあります。

図 5-3. 複数の出力パッドを持つフィルタエレメント

図5-3 は、別のフィルタライクなエレメントを図示したもので、今度は出力パッド (ソースパッド) が複数あります。こうしたエレメントの例として、音声と動画の両方を含む Ogg ストリーム用の Ogg デマルチプレクサを挙げることができます。一方のソースパッドには動画エレメンタリストリームが含まれ、もう一方のソースパッドには音声エレメンタリストリームが含まれることになります。一般にデマルチプレクサは、新しいパッドが作成されると、シグナルを発信します。アプリケーションプログラマはこれを受けて、シグナルハンドラの中で新しいエレメンタリストリームを処理することができます。

5.1.3. シンクエレメント

シンク (sink) エレメントは、メディアパイプラインのエンドポイントです。シンクエレメントはデータを受け取りますが、何も生成しません。ディスクへの書き込み、サウンドカードでの再生、およびビデオ出力は、すべてシンクエレメントによって実装されることになります。図5-4 は、シンクエレメントを図示したものです。

図 5-4. シンクエレメント