DirectShow フィルタ開発の概要
ここでは、カスタム DirectShow フィルタの開発に関わるタスクの簡単な概要を示す。また、このようなタスクについて詳しく説明しているトピックへのリンクも示す。このトピックを読む前に、「DirectShow について」のトピックを読むこと。そこでは、DirectShow アーキテクチャ全体について説明している。
DirectShow 基底クラス ライブラリ
DirectShow SDK には、フィルタ作成用の C++ クラスの集合が含まれている。これらのクラスの使用は必須ではないが、新しいフィルタの作成手法として推奨する。基底クラスを使うには、「DirectShow フィルタのビルド」で説明しているように、基底クラスを静的ライブラリにコンパイルし、プロジェクトに .lib ファイルをリンクする。
基底クラス ライブラリはフィルタのルート クラスである CBaseFilter クラスを定義する。CBaseFilter からは他のクラスがいくつか派生している。これらのクラスは特定の種類のフィルタ専用である。たとえば、CTransformFilter クラスは変換フィルタ用に設計されている。新しいフィルタを作成するには、フィルタ クラスの 1 つを継承しているクラスを実装すること。たとえば、クラス宣言は次のようになる。
class CMyFilter : public CTransformFilter
{
private:
/* フィルタに固有の変数とメソッドを宣言する。 */
public:
/* CTransformFilter のさまざまなメソッドをオーバーライドする。 */
};
DirectShow 基底クラスの詳細については、次のトピックを参照すること。
ピンの作成
フィルタは 1 つ以上のピンを作成する必要がある。ピンの数は設計時に固定できる。また、フィルタは必要に応じて新しいピンを作成することもできる。通常、ピンは CBasePin クラスから、または CBasePin を継承する CBaseInputPin などのクラスから派生する。フィルタのピンはフィルタ クラスのメンバ変数として宣言すること。フィルタ クラスの一部では既にピンを定義しているが、作成するフィルタが CBaseFilter から直接派生する場合は、派生クラスでピンを宣言する必要がある。
ピン接続の調整
フィルタ グラフ マネージャが 2 つのフィルタを接続しようとするとき、ピンはさまざまな点で一致する必要がある。一致できない場合、接続は失敗する。通常、ピンは次の点について調整を行う。
- トランスポート。トランスポートは、フィルタが出力ピンから入力ピンにメディア サンプルを移動させるときに使う機構である。たとえば、IMemInputPin インターフェイス ("プッシュ モデル") または IAsyncReader インターフェイス ("プル モデル") を使える。
- メディア タイプ。ほとんどすべてのピンはメディア タイプを使って、送信するデータのフォーマットを記述する。
- アロケータ。アロケータはデータを保持するバッファを作成するオブジェクトである。ピンはどのピンがアロケータを提供するかについて一致する必要がある。バッファのサイズ、作成するバッファの数、他のバッファ プロパティについても一致する必要がある。
基底クラスはこのような調整のフレームワークを実装する。基底クラスのさまざまなメソッドをオーバーライドして、詳細を決定する必要がある。オーバーライドする必要があるメソッドの集合は、クラスやフィルタの機能によって異なる。詳細については、「フィルタの接続」を参照すること。
データの処理と送信
ほとんどのフィルタの主な機能はメディア データの処理と送信である。その処理方法はフィルタのタイプによって異なる。
- プッシュ ソースには、常にサンプルにデータを入れ、サンプルをダウンストリームに送信するワーカー スレッドがある。
- プル ソースは、隣接するダウンストリーム フィルタがサンプルを要求するまで待機する。要求に応答してデータをサンプルに書き込み、ダウンストリーム フィルタにサンプルを送信する。ダウンストリーム フィルタはデータ フローを動かすスレッドを作成する。
- 変換フィルタには、隣接するアップストリーム フィルタからサンプルが送信される。サンプルを受信すると、データを処理し、ダウンストリームに送信する。
- レンダリング フィルタはアップストリームからサンプルを受信し、タイム スタンプに基づいてサンプルのレンダリングをスケジュールする。
他にストリーミングに関係するタスクとして、グラフからのデータのフラッシュ、ストリームの最後の処理、シーク要求への応答などがある。これらの問題の詳細については、次のトピックを参照すること。
COM のサポート
DirectShow フィルタは COM オブジェクトであり、通常はDLL 内にパッケージ化されている。基底クラス ライブラリは COM をサポートするフレームワークを実装する。詳細については、「DirectShow と COM」を参照すること。