QueryAccept (ダウンストリーム)
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
このメカニズムにより、出力ピンはダウンストリーム ピアに新しい形式を提案できます。 新しい形式では、バッファー サイズを大きくする必要はありません。 出力ピンは次の処理を行います。
ダウンストリーム ピンで IPin::QueryAccept または IPinConnection::D ynamicQueryAccept を呼び出して、もう一方のピンが新しいメディアの種類を受け入れられるかどうかを確認します (図、手順 A を参照)。
手順 1 の戻り値がS_OK場合、ピンはメディアの種類を次のサンプルにアタッチします。 これを行うには、まず IMemAllocator::GetBuffer を呼び出してサンプル (B) を取得します。 次に 、IMediaSample::SetMediaType を呼び出して、メディアの種類をそのサンプル (C) にアタッチします。 サンプルにメディアの種類をアタッチすると、フィルターは、そのサンプルから始めて、形式が変更されたことを示します。
ピンはサンプル (D) を提供します。
ダウンストリーム フィルターは、サンプルを受信すると、 IMediaSample::GetMediaType を呼び出して新しいメディアの種類を取得します。
すべてのピンで メソッドがサポートされています QueryAccept
。 ただし、S_OKの戻り値では、グラフがアクティブな間に形式を変更できるとは限らないため、このメソッドは少しあいまいです。 一部のフィルターはS_OKを返す場合がありますが、グラフがアクティブな場合は変更を拒否します。 一部の入力ピンでサポートされている DynamicQueryAccept メソッドは、アクティブな間にピンの形式を変更できることを意味するS_OKを明示的に定義します。 入力ピンが IPinConnection インターフェイスをサポートしている場合は、 ではなく QueryAccept
DynamicQueryAccept を呼び出す必要があります。
ほとんどの場合、このメカニズムでは、ビット深度の変更など、形式を大幅に変更することはできません。 使用できる状況の 1 つは、ビデオ デコーダーがパレットを切り替えるときです。 画像のサイズやビット深度など、形式の基本的な詳細は変わりませんが、新しいメディアの種類にはパレット エントリのセットが異なります。
実装に関する注意事項
DirectShow 基本クラスでは、 CBasePin::QueryAccept は CheckMediaType メソッドを呼び出します。これは、初期ピン接続中にも呼び出されます。 変換フィルターの場合、入力ピンの CheckMediaType メソッドは、出力ピンが接続されているかどうか、および接続されている場合は、入力メディアの種類が出力メディアの種類と互換性があるかどうかを常にチェックする必要があります。 したがって、この実装は に対して QueryAccept
有効である可能性があります。 そうでない場合は、必要な追加のチェックを実行するために をオーバーライド QueryAccept
する必要があります。 また、 CTransformFilter クラスは 、CheckInputType メソッドと CheckTransform メソッド内にこのロジックをカプセル化します。 一方、 CTransInPlaceFilter クラスは、常に次のアップストリームまたはダウンストリーム フィルターで を呼び出 QueryAccept
します。
CBaseInputPin::Receive メソッドは、受信サンプルのメディアの種類を確認し、存在する場合は CheckMediaType を呼び出します。 ただし、現在のメディアの種類を保持するピンの m_mt メンバーは更新されません。 フィルターでサンプルを処理するときは、メディアの種類のサンプルをチェックする必要があります。 新しい型がある場合は、ピンで SetMediaType を呼び出すか、 m_mt の値を直接設定して格納する必要があります。 一方、ビデオ変換フィルター用に設計された CVideoTransformFilter クラスは、メディアの種類が変更されたときに格納されます。 詳細については、DirectShow 基本クラス ライブラリの CVideoTransformFilter::Receive のソース コードを参照してください。
場合によっては、呼び出しをダウンストリームに QueryAccept
渡し、メディアの種類を出力サンプルにアタッチし、ダウンストリーム フィルターで形式の変更を処理させる場合があります。