メディア サンプルとアロケータについて

フィルタはピン接続を介してデータを送る。データは、あるフィルタの出力ピンから別のフィルタの入力ピンに移動する。出力ピンがデータを送る場合、いくつかのメカニズムが存在するが、最も一般的な方法は、入力について IMemInputPin::Receive メソッドを呼び出す方法である。

フィルタに応じて、メディア データのメモリはさまざまな方法で割り当てることができる。たとえば、ヒープ上、DiredtDraw サーフェイス内、共有 GDI メモリの使用、またはその他のアロケーション メカニズムの使用などがある。メモリの割り当てを行うオブジェクトは "アロケータ" と呼ばれ、IMemAllocator インターフェイスを公開する COM オブジェクトである。

2 つのピンを接続する場合、一方のピンがアロケータを提供する必要がある。DirectShow では、どのピンがアロケータを提供するかを決定するために使われるメソッド呼び出しのシーケンスを定義している。ピンは、アロケータが作成するバッファの数、およびバッファのサイズについても合意する。

ストリーミングが始まる前に、アロケータはバッファのプールを作成する。ストリーミング中、アップストリーム フィルタはバッファにデータを入れ、データをダウンストリーム フィルタに送る。ただし、アップストリーム フィルタはダウンストリーム フィルタにバッファへの未処理のポインタは渡さない。その代わりに、アップストリーム フィルタは、アロケータがバッファを管理するために作成する "メディア サンプル" と呼ばれる COM オブジェクトを使う。メディア サンプルは IMediaSample インターフェイスを公開する。メディア サンプルには、次の情報が含まれる。

  • 使用するバッファへのポインタ
  • タイム スタンプ
  • さまざまなフラグ
  • オプションのメディア タイプ

タイム スタンプは、レンダリング フィルタがレンダリングをスケジュールするために使うプレゼンテーション タイムを定義する。フラグによって、データ内の前のサンプル以降にブレークがあるかどうかなどの情報を示す。メディア タイプは、フィルタがストリームの途中でフォーマットを変更する方法を提供する。通常、サンプルはメディア タイプを持たず、フォーマットが前のサンプル以降、変更されていないことを示す。

フィルタがバッファを使っている場合、フィルタはサンプルの参照カウントを保持する。アロケータはこの参照カウントを使って、バッファを再利用できる時期を判断する。これによって、フィルタが使用中のバッファを、別のフィルタが上書きすることを防止する。サンプルは、各フィルタがサンプルを解放するまで、アロケータの利用可能なサンプルのプールには戻らない。

参照

次のトピックは、独自のカスタム フィルタを作成する開発者を対象にしている。