EVR メディアの種類のネゴシエーション
[このページで説明されているコンポーネントである拡張ビデオ レンダラーは、レガシ機能です。 これは、MediaPlayer および IMFMediaEngine コンポーネントを介して公開される単純なビデオ レンダラー (SVR) に置き換えられました。 ビデオ コンテンツを再生するには、これらのコンポーネントのいずれかにデータを送信し、新しいビデオ レンダラーをインスタンス化できるようにする必要があります。 これらのコンポーネントは、Windows 10 および Windows 11 用に最適化されています。 Windows でビデオ メディアを再生する新しいコードでは、可能な場合は、EVR ではなく、MediaPlayer または下位レベルの IMFMediaEngine API を使うことを強くお勧めします。 Microsoft は、レガシ API を使用する既存コードを、新しい API を使用するように可能であれば書き直すことを提案しています。]
このトピックでは、拡張ビデオ レンダラー (EVR) によるメディアの種類の検証方法について説明します。
DirectShow EVR フィルターの場合、フィルターのピンが接続されるときに種類のネゴシエーションが行われます。
EVR メディア シンクの場合、メディアの種類はストリーム シンクの IMFMediaTypeHandler インターフェイスを介して設定されます。 通常は、トポロジ ローダーによってメディアの種類がネゴシエートされますが、アプリケーションでメディアの種類を直接設定することもできます。
EVR では、推奨されるメディアの種類は報告されません。 クライアントは、受け入れられる種類が見つかるまで、メディアの種類をテストする必要があります。 いずれかのサブストリームで種類を設定する前に、参照ストリームのメディアの種類を設定する必要があります。
参照ストリームの場合、EVR ミキサーは互換性のある DirectX ビデオ アクセラレータ (DXVA) レンダー ターゲット形式のリストを取得します。 EVR プレゼンターは、このリストを使って、Direct3D スワップ チェーンの形式を選びます。 互換性のあるレンダー ターゲット形式が見つからない場合、EVR はそのメディアの種類を拒否します。
サブストリームの場合、EVR ミキサーは、そのサブストリーム形式と、参照ストリームに対して選択されたレンダー ターゲット形式の組み合わせを、DXVA デバイスがサポートしているかどうかを問い合わせます。 その結果、参照ストリームによっては、利用できるサブストリーム形式が変更される可能性があります。
プロセスの詳細を次に示します。 これらの詳細は、ほとんどのアプリケーションでは重要ではありませんが、カスタム ミキサーまたはプレゼンターを作成する場合に役立つ可能性があります。
参照ストリームの場合、ネゴシエーションは次のように行われます。
EVR は、ミキサーで IMFTransform::SetInputType を呼び出します。
ミキサーは、DXVA2_VideoDesc 構造体を使って、メディアの種類を DXVA 2.0 の記述に変換します。
ミキサーは、IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids を呼び出して、ビデオ プロセッサ GUID のリストを取得します。
ビデオ プロセッサ GUID ごとに、ミキサーは IDirectXVideoProcessorService::GetVideoProcessorRenderTargets を呼び出して、サポートされているレンダー ターゲット形式を取得します。
EVR は、MFVP_MESSAGE_INVALIDATEMEDIATYPE メッセージを使ってレンダラーで IMFVideoPresenter::ProcessMessage を呼び出します。 このメッセージにより、プレゼンターは新しい形式を選びます。
プレゼンターは、IMFTransform::GetOutputAvailableType を呼び出して、ミキサーから利用できる出力形式のリストを取得します。 ミキサーは、ステップ 4 で取得した形式からこのリストを生成します。
プレゼンターは形式を選び、ミキサーで IMFTransform::SetOutputType を呼び出します。
サブストリームの場合、プロセスはもっと簡単です。
EVR は、ミキサーで IMFTransform::SetInputType を呼び出します。
ミキサーは、IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats を呼び出して、利用できるサブストリーム形式のリストを取得します。
提案された形式がこのリストに含まれている場合、EVR はその入力の種類を受け入れます。