次の方法で共有


DMO メディアの種類

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

メディアの種類は、メディア データのストリームに関連付けられている形式を表します。 この記事では、DMU がメディアの種類を処理する方法について説明します。 これは主に、独自のカスタム DLO を記述する開発者を対象としています。

メディアの種類は、 DMO_MEDIA_TYPE 構造体を使用して定義されます。 この構造体には、次の情報が含まれます。

  • 主な種類は、オーディオやビデオなどの広範なカテゴリを定義するグローバル一意識別子 (GUID) です。
  • サブタイプは、型のより具体的な側面を定義する GUID です。 たとえば、ビデオ内では、サブタイプには 16 ビット RGB、24 ビット RGB、UYVY、DV エンコードビデオなどが含まれます。
  • フォーマット ブロックは、形式を完全に指定するセカンダリ構造体です。 フォーマット ブロックのレイアウトは、データの種類によって異なります。 たとえば、PCM オーディオでは WAVEFORMATEX 構造体が使用されます。 ビデオでは、 VIDEOINFOHEADER や VIDEOINFOHEADER2 など、他のさまざまな構造 が使用されます。 書式ブロックのレイアウトは、形式の種類 GUID によって識別されます。 たとえば、FORMAT_WaveFormatExは WAVEFORMATEX 構造体を指定します。

DMO が最初に作成されるとき、ストリームにはメディアの種類がありません。 DMO でデータを処理するには、クライアントでストリームごとにメディアの種類を設定する必要があります。 このプロセスについては、「 DMO でのメディアの種類の設定」でクライアントの観点から説明します。

レジストリ内のメディアの種類

DMO は、 DMORegister 関数を呼び出すことによって、サポートされているメディアの種類の一覧をレジストリに追加できます。 アプリケーションでは、この情報を使用して、特定の形式に一致する DNO を検索できます。 レジストリ内の情報は、包括的なものではありません。 通常、DMO がサポートするメイン型のみを含めます。 レジストリ エントリには、入力と出力の種類に対して個別のキーがありますが、個々のストリームは区別されません。

DMORegister 関数は、DMO_PARTIAL_MEDIATYPE構造体を使用してメディアの種類を記述します。 この構造体には、 DMO_MEDIA_TYPE 構造体内にある情報のサブセット (メジャー型とサブタイプ) が含まれます。 フォーマット ブロックには通常、ビデオ イメージの高さと幅など、レジストリに含めるには細かい情報が含まれているため、フォーマット ブロックは含まれません。

優先メディアの種類

アプリケーションが DMO を作成したら、サポートされているメディアの種類について DMO に対してクエリを実行できます。 各ストリームについて、DMO はメディアの種類 (空の場合もあります) の一覧を優先順にランク付けして作成します。 IMediaObject::GetInputType メソッドと IMediaObject::GetOutputType メソッドは、優先する型を列挙します。 ストリームの優先型は、アプリケーションが他のストリームにメディアの種類を設定するときに動的に変更される可能性があります。 たとえば、入力の種類が設定された後に、優先される出力の種類の一覧が変更される場合があります。またはその逆も同様です。 ただし、DMO は、優先する型を動的に更新する必要はありません。 アプリケーションでは、受け取るすべての型が有効であると想定することはできません。 このため、 IMediaObject::SetInputType メソッドと IMediaObject::SetOutputType メソッドは、特定の型をテストするためのフラグをサポートしています。

GetInputType メソッドと GetOutputType メソッドはどちらもDMO_MEDIA_TYPE構造体を返します。 DMO では、この構造体の情報の一部を空白のままにして、種類の範囲を示すことができます。 メジャー型またはサブタイプはGUID_NULLでき、書式ブロックは空 (0 バイト) にすることができます。 書式ブロックが空の場合は、書式の種類をGUID_NULLする必要があります。

アプリケーションが DMO のすべての入力型を設定した後、DMO は通常、出力ストリームごとに少なくとも 1 つの完全な型を返す必要があります。 完全な出力の種類を使用すると、テストが容易になり、アプリケーションでは適切な既定値として使用できます。 DMO テスト アプリケーションは、この動作に依存しています。 ( 「DMOTest アプリケーションの使用」を参照してください)。

メディアの種類の設定

アプリケーションでは 、SetInputType メソッドと SetOutputType メソッドを使用して、指定したストリームの型をテスト、設定、またはクリアします。 アプリケーションで型を完全に指定する必要があります。 DMO は、提案された型を受け入れられるかどうかを確認します。 その答えは、他のストリームで設定されている型によって異なります。 DMO_SET_TYPEF_CLEAR フラグはストリームの種類をクリアするため、アプリケーションは "バックアウト" して別の組み合わせを試すことができます。

シナリオの例

次の例では、前のセクションで行った点を示すために、いくつかの一般的なシナリオについて説明します。

  • ビデオ デコーダー。 一般的なビデオ デコーダーでは、入力の種類によって出力の種類が部分的に決定されます。 たとえば、通常、両方のストリームのフレーム レートと画像のサイズが同じである必要があります。 1 つのオプションは、入力の種類が設定されるまで、優先される出力の種類を定義しないことです。 もう 1 つのオプションは、形式ブロックを省略して、不完全な型のセットを列挙することです。 サブタイプを使用して、サポートされている非圧縮型 (16 ビット RGB、24 ビット RGB など) を示します。 また、ビデオ デコーダーでは、通常、入力の種類の前に出力の種類を設定することはできません。 通常のシナリオでは、既知の入力形式からデコードするため、この制限は妥当です。
  • オーディオ デコーダー。 オーディオ デコーダーでは、制限付きの固定された出力形式のセットがサポートされる場合があります。 その場合、入力形式がわかる前に、優先される出力形式のリストを作成できる場合があります。
  • コンプレッサー。 ほとんどの場合、ビデオコンプレッサーは、アプリケーションが入力形式を設定するまで、その優先出力形式を完全に指定することはできません。その逆も同様です。 代わりに、DMO は形式ブロックのない不完全な型を返す必要があります。 オーディオとビデオの両方の圧縮では、通常、アプリケーションでビット レートなどのさまざまな出力パラメーターを設定する必要があります。 ただし、入力タイプを設定した後は、前述の理由により、コンプレッサーは少なくとも 1 つの完全な出力タイプを返す必要があります。

DMO の作成