アロケーターのネゴシエート

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

2 つのピンを接続する場合は、メディア データを交換するためのメカニズムが必要です。 このメカニズムは トランスポートと呼ばれます。 一般に、DirectShow アーキテクチャはトランスポートに関して中立です。 2 つのフィルターは、両方がサポートする任意のトランスポートを使用して接続することに同意できます。

最も一般的なトランスポートは、メディア データがメモリ内に存在するローカル メモリ トランスポートメインです。 ローカル メモリ トランスポートには、 プッシュ モデルプル モデルの 2 種類があります。 プッシュ モデルでは、ソース フィルターはダウンストリーム フィルターの入力ピンの IMemInputPin インターフェイスを使用して、ダウンストリーム フィルターにデータをプッシュします。 プル モデルでは、ダウンストリーム フィルターは、ソース フィルターの出力ピンの IAsyncReader インターフェイスを使用して、ソース フィルターからデータを要求します。 これら 2 つのデータ フロー モデルの詳細については、「フィルター グラフのData Flow」を参照してください。

ローカル メモリ トランスポートでは、メモリ バッファーの割り当てを担当するオブジェクトを アロケーターと呼びます。 アロケーターは IMemAllocator インターフェイスを サポートします。 どちらのピンも 1 つのアロケーターを共有します。 どちらのピンでもアロケーターを提供できますが、出力ピンは使用するアロケーターを選択します。

出力ピンでは、アロケーターによって作成されるバッファーの数、各バッファーのサイズ、メモリアラインメントを決定するアロケーター プロパティも設定されます。 出力ピンは、バッファー要件の入力ピンに遅延する場合があります。

IMemInputPin 接続では、アロケーター ネゴシエーションは次のように機能します。

  1. 必要に応じて、出力ピンは IMemInputPin::GetAllocatorRequirements を呼び出します。 このメソッドは、メモリの配置など、入力ピンのバッファー要件を取得します。 一般に、適切な理由がない限り、出力ピンは入力ピンの要求を受け入れる必要があります。
  2. 必要に応じて、出力ピンは IMemInputPin::GetAllocator を呼び出します。 このメソッドは、入力ピンからアロケーターを要求します。 入力ピンは 1 つを提供するか、エラー コードを返します。
  3. 出力ピンはアロケーターを選択します。 入力ピンによって提供されたものを使用することも、独自のピンを作成することもできます。
  4. 出力ピンは IMemAllocator::SetProperties を呼び出してアロケーター のプロパティを設定します。 ただし、アロケーターは、要求されたプロパティを考慮しない場合があります。 (たとえば、入力ピンでアロケーターが提供されている場合に発生する可能性があります)。アロケーターは 、SetProperties メソッドの出力パラメーターとして実際のプロパティを返します。
  5. outpin は IMemInputPin::NotifyAllocator を呼び出して、選択内容を入力ピンに通知します。
  6. 入力ピンは IMemAllocator::GetProperties を呼び出して、アロケーター のプロパティが許容できるかどうかを確認する必要があります。
  7. 出力ピンは、アロケーターのコミットとコミット解除を行います。 これは、ストリーミングが開始および停止したときに発生します。

IAsyncReader 接続では、アロケーター ネゴシエーションは次のように機能します。

  1. 入力ピンは、出力ピンで IAsyncReader::RequestAllocator を呼び出します。 入力ピンはバッファー要件を指定し、必要に応じてアロケーターを提供します。
  2. 出力ピンはアロケーターを選択します。 入力ピンによって提供されたもの (存在する場合) を使用するか、独自のピンを作成できます。
  3. 出力ピンは、 RequestAllocator メソッドの出力パラメーターとしてアロケーターを返します。 入力ピンは、アロケーターのプロパティをチェックする必要があります。
  4. 入力ピンは、アロケーターのコミットとコミット解除を行います。
  5. アロケーター ネゴシエーション プロセス中はいつでも、いずれかのピンが接続に失敗する可能性があります。
  6. 出力ピンが入力ピンのアロケーターを使用する場合は、そのアロケーターを使用して、その入力ピンにサンプルを配信できます。 所有フィルターでは、アロケーターを使用して他のピンにサンプルを配信することはできません。

カスタム アロケーターの提供