アロケータの調整
2 つのピンが接続すると、メディア データを交換するためのしくみが必要となる。このしくみは "トランスポート" と呼ばれる。通常、DirectShow アーキテクチャはトランスポートに関して中立的である。2 つのフィルタは、両者がサポートする任意のトランスポート方法で接続することに一致できる。
最も一般的なトランスポートは、"ローカル メモリ" トランスポートである。この場合、メディア データはメイン メモリに保持される。"プッシュ モデル" と "プル モデル" という 2 種類のローカル メモリ トランスポートが存在する。プッシュ モデルでは、ソース フィルタはダウンストリーム フィルタの入力ピンの IMemInputPin インターフェイスを使って、ダウンストリーム フィルタにデータをプッシュする。プル モデルでは、ダウンストリーム フィルタはソース フィルタの出力ピンの IAsyncReader インターフェイスを使って、ソースフィルタからのデータを要求する。これら 2 つのデータ フロー モデルの詳細については、「フィルタ グラフのデータ フロー」を参照すること。
ローカル メモリ トランスポートでは、"アロケータ" と呼ばれるオブジェクトがメモリ バッファの割り当てを担当する。アロケータは IMemAllocator インターフェイスをサポートする。両方のピンが 1 つのアロケータを共有する。どちらのピンもアロケータを提供できるが、使用するアロケータを選択するのは出力ピンである。
出力ピンはアロケータのプロパティも設定する。プロパティでは、アロケータで作成するバッファ数、各バッファのサイズ、メモリのアラインメントを指定する。出力ピンがバッファ要求について入力ピンに従う場合もある。
IMemInputPin 接続で、アロケータの調整は次のように行われる。
- 出力ピンが IMemInputPin::GetAllocatorRequirements を呼び出す (省略可能)。このメソッドは、メモリ アラインメントなど、入力ピンのバッファ要求を取得する。通常、出力ピンは、十分な理由がない限り入力ピンの要求を受け入れることになる。
- 出力ピンが IMemInputPin::GetAllocator を呼び出す (省略可能)。このメソッドは、入力ピンからアロケータを要求する。入力ピンはアロケータを提供するか、提供できない場合はエラー コードを返す。
- 出力ピンがアロケータを選択する。入力ピンから提供されたアロケータを使うか、または独自のアロケータを作成する。
- 出力ピンは IMemAllocator::SetProperties を呼び出し、アロケータ プロパティを設定する。ただし、アロケータは要求されたプロパティに従わないことがある。(たとえば、入力ピンがアロケータを提供する場合に起こる。)アロケータは、SetProperties メソッドの出力パラメータとして実際のプロパティを返す。
- 出力ピンが IMemInputPin::NotifyAllocator を呼び出して、入力ピンに選択結果を通知する。
- 入力ピンは IMemAllocator::GetProperties を呼び出して、アロケータ プロパティが受け入れ可能であるかどうかを確認する必要がある。
- 出力ピンはアロケータのコミットとデコミットを担当する。この処理は、ストリーミングの開始と終了のときに行われる。
IAsyncReader 接続では、アロケータの調整は次のように行われる。
- 入力ピンは出力ピンの IAsyncReader::RequestAllocator を呼び出す。入力ピンはバッファ要求を指定する。また、アロケータを提供する (省略可能)。
- 出力ピンがアロケータを選択する。入力ピンで提供されるアロケータがあれば、そのアロケータを使える。また、独自のアロケータを作成することもできる。
- 出力ピンは RequestAllocator メソッドの出力パラメータとしてアロケータを返す。入力ピンはアロケータ プロパティを確認する必要がある。
- 入力ピンはアロケータのコミットとデコミットを担当する。
- アロケータ調整処理中、いつでもどちらかのピンの接続に障害が発生する可能性がある。
- 出力ピンが入力ピンのアロケータを使う場合、そのアロケータはその入力ピンにサンプルを送信するときにしか使用できない。所有するフィルタは、他のピンにサンプルを送信するときにそのアロケータを使えない。
参照