Share via


サンプル ビデオ DSP プラグインのビデオ形式ネゴシエーション

[このページWindows メディア プレーヤー SDK に関連付けられている機能は、レガシ機能です。 MediaPlayer に置き換わりました。 MediaPlayer は、Windows 10とWindows 11用に最適化されています。 可能な場合は、新しいコードで SDK ではなく MediaPlayerWindows メディア プレーヤー使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

Windows メディア プレーヤービデオ DSP プラグインをシグナル チェーンに挿入する前に、プレーヤーはプラグインが再生中のビデオを処理できるかどうかを判断する必要があります。 プラグインとプレーヤーがサポートされているビデオ形式について通信するプロセスは、フォーマット ネゴシエーションと呼ばれます。

サポートされている入力と出力の種類の提供

DSP プラグインが DirectX Media Object (DMO) として機能している場合、Player は IMediaObject::GetInputType と IMediaObject::GetOutputType を一連の呼び出しを行うことで、サポートされている形式についてプラグインに対 してクエリを実行します

DSP プラグインが Media Foundation Transform (MFT) として機能している場合、Player は 、IMFTransform::GetInputAvailableType と IMFTransform::GetOutputAvailableType を一連の呼び出しを行うことで、サポートされている形式についてプラグインに対してクエリを実行 します

Windows メディア プレーヤー プラグイン ウィザードによって生成されたサンプル ビデオ プラグインには、サポートされているビデオ形式の一覧が GUID の配列として格納されます。 次のコードは、メイン .cpp ファイルからのコードです。

static const GUID*    k_guidValidSubtypes[] = {
    &MEDIASUBTYPE_NV12,
    &MEDIASUBTYPE_YV12,
    &MEDIASUBTYPE_YUY2,
    &MEDIASUBTYPE_UYVY,
    &MEDIASUBTYPE_RGB32,
    &MEDIASUBTYPE_RGB24,
    &MEDIASUBTYPE RGB555,
    &MEDIASUBTYPE RGB565
};

プレーヤーは IMediaObject::GetInputTypeIMediaObject::GetOutputType を任意の順序で呼び出すことができるので、プラグイン コードはこれを予測する必要があります。 同様に、Player は IMFTransform::GetInputAvailableTypeIMFTransform::GetOutputAvailableType を任意の順序で呼び出すことができます。 GetOutputType と GetOutputAvailableType のサンプル実装では、入力型が既に定義されているかどうかをテストします。 ある場合、プラグインはその型のみをサポートすると応答します。 それ以外の場合、次のコードで示すように、プラグインは指定されたインデックスに対応する型を返します。

// If input type has been defined, then use that as output type.
if (GUID_NULL != m_mtInput.majortype)
{
    hr = ::MoCopyMediaType( pmt, &m_mtInput );
}
else // Otherwise use default for this plug-in.
{
    ::ZeroMemory( pmt, sizeof( DMO_MEDIA_TYPE ) );
    pmt->majortype = MEDIATYPE_Video;
    pmt->subtype = *k_guidValidSubtypes[dwTypeIndex];     
}

入力と出力の種類の設定

DSP プラグインが DMO として機能している場合、Windows メディア プレーヤーは IMediaObject::SetInputTypeIMediaObject::SetOutputType を呼び出してメディアの種類を設定し、各関数に要求されたメディアの種類を表すDMO_MEDIA_TYPE構造体へのポインターを渡します。

DSP プラグインが MFT として機能している場合、Windows メディア プレーヤーは、IMFTransform::SetInputType と IMFTransform::SetOutputType を呼び出してメディアの種類を設定し、各関数に要求されたメディアの種類を表す IMFMediaType インターフェイスへのポインターを渡します。

プレーヤーが特定の順序でフォーマット ネゴシエーション メソッドを呼び出す保証はないため、プラグイン コードは任意のケースを処理する必要があります。 たとえば、プレーヤーが SetInputType を呼び出す前に SetOutputType を呼び出した場合、プラグインが提案された出力メディアの種類を拒否するのは有効なアクションです。 IMediaObject::SetOutputType のサンプル実装の次のコードは、これを示しています。

if( GUID_NULL != m_mtInput.majortype )
{
    // Validate that the output media type matches our requirements 
    // and matches our input type (if set).
    hr = ValidateMediaType(pmt, &m_mtInput);
}
else
{
    hr = DMO_E_TYPE_NOT_ACCEPTED;
}

SetInputType と SetOutputType のサンプル プラグイン実装では、ValidateMediaType という名前のカスタム関数が呼び出されます。 このプラグイン関数は、メディアの種類が適切な形式であり、プラグインでサポートされていることを確認するように設計された、提案されたメディアの種類に対して一連のテストを実行します。 ValidateMediaType は、次のテストを実行します。

  • majortype メンバーと formattype メンバーに正しい値が含まれていることを確認します。
  • サブタイプ メンバーが、サポートされているいずれかの形式と一致することを確認します。
  • BITMAPINFOHEADER および VIDEOINFOHEADER または VIDEOINFOHEADER2 構造体の情報に有効な値が含まれていることを確認します。
  • プラグインが形式を入力から出力に変換しないため、入力メディアと出力メディアの種類が一致するかどうかをテストします。

提案されたメディアの種類が検証テストに合格した場合は、メンバー変数に格納されます。入力メディアの種類 のm_mtInput 、出力メディアの種類 m_mtOutput

ビデオ DSP プラグインの実装