Microsoft DirectX 8.0

DMO とメディア タイプ

メディア タイプとは、メディア データのストリームに関連付けられたフォーマットの説明である。ここでは、Microsoft® DirectX® Media Objects (DMO) によるメディア タイプの処理方法について説明する。これは主にカスタム DMO を作成する開発者向けの内容である。DMO を使用するアプリケーションについては、「DirectX Media Object の使用」を参照すること。

ここでは、以下の項目について説明する。

概要

メディア タイプを記述する情報は大別して次の 3 つである。

詳細については、DMO_MEDIA_TYPE 構造体を参照すること。

アプリケーションがまず DMO のインスタンスを作成する時点では、DMO 内のストリームには特定のメディア タイプが指定されていない。アプリケーションが DMO を使ってデータを処理できるようになるには、ストリーム全体に対してメディア タイプを指定する必要がある(オプションのストリームは例外である。「破棄可能ストリームとオプション ストリーム」を参照すること)。

特定のストリームに適合するメディア タイプを見つけるために、アプリケーションは DMO に問い合わせる。DMO は利用できるタイプを列挙し、アプリケーションはその中から 1 つを選択する。あるストリームにメディア タイプを設定すると、ほかのストリームで利用できるタイプを変更できる。たとえば、オーディオ エフェクト DMO は一定の範囲のサンプリング レートをサポートするが、出力レートを入力レートに一致させる必要がある。この場合、入力タイプを設定すると、使用できる出力タイプが限定される。

レジストリ内のメディア タイプ

DMORegister 関数は、入力用および出力用のメディア タイプの一覧など、DMO に関する情報をレジストリに追加する。アプリケーションはこの情報を使って、要件に合致する DMO を検索する。この情報は包括的なものであるとは限らない。多くの場合、DMO がサポートする主なタイプのみを含めることになる。

レジストリ情報には入力タイプと出力タイプの一覧が設定されるが、個別のストリームは区別されない。たとえば、DMO がオーディオとビデオで別個の入力ストリームを持つ場合、レジストリ情報には、入力タイプとしてその両方が設定されることになる。

DMORegister 関数の場合、メディア タイプは DMO_PARTIAL_MEDIATYPE 構造体で指定される。この点で、DMO_MEDIA_TYPE を使用する IMediaObject インターフェイスとは異なる。DMO_PARTIAL_MEDIATYPE 構造体には、メジャー タイプとサブタイプを表す 2 つのフィールドのみが含まれる。フォーマット ブロック用のフィールドはない。多くの場合、フォーマットには、ビデオ イメージの高さと幅など、レジストリに格納するには向かない詳細な情報が含まれる。

優先されるメディア タイプ

サポートされるタイプを DMO に問い合わせるために、アプリケーションは IMediaObject::GetInputType メソッドと IMediaObject::GetOutputType メソッドを呼び出す。これら 2 つのメソッドは、指定されたストリームで優先されるタイプを優先順に列挙する。ストリームで優先されるタイプは、アプリケーションがほかのストリームにメディア タイプを設定するときに動的に変更できる。たとえば、優先される出力タイプを入力タイプに応じて変更できる (またはその逆も可)。ストリームはほかのストリームにタイプが指定されるまで優先タイプを持たないこともある。ただし、DMO は優先タイプをこの方法で更新する必要はない。アプリケーションは、受け取るタイプがすべて有効であるとは仮定できない。このため、SetInputType メソッドと SetOutputType メソッドは特定のタイプを検査するためのフラグをサポートしている。

詳細に指定されたメディア タイプは、詳細すぎて優先タイプとして使用しにくいことがある。より一般的なタイプを示すために、DMO は不完全なタイプを返すことができる。メディア タイプのメジャー タイプ、サブタイプ、またはフォーマット タイプに値 GUID_NULL が設定されている場合、メディア タイプは不完全である。GetInputType メソッドと GetOutputType メソッドでは通常、フォーマット タイプを GUID_NULL に設定する。

アプリケーションがすべての入力タイプを設定した後でも、DMO は通常、各出力ストリームに対して 1 つ以上の完全なタイプを返す必要がある。完全なタイプを設定すると、機能の検査やアプリケーションでは、そのタイプを妥当な既定値として使用できる(一部のメディア タイプはフォーマット タイプがなくても完全であることに注意)。SDK に付属する DMO テスト アプリケーションは、この方法で動作する DMO に依存している (「DMO テスト アプリケーション」を参照すること)。

メディア タイプの設定

ストリームに対してタイプをテスト、設定、または消去するために、アプリケーションは IMediaObject::SetInputType メソッドと IMediaObject::SetOutputType メソッドを使う。DMO がデータを正しく処理できるように、タイプは詳細に指定する必要がある。DMO は各ストリームについて、提案されたタイプがほかのストリームとの互換性を備えていることを検証する必要がある。DMO_SET_TYPEF_CLEAR フラグを使ってストリームのタイプを消去すると、アプリケーションは元の状態に戻って別の組み合わせを試すことができる。

使用例

次の例では、いくつかの典型的なシナリオを用いて、これまでの説明を具体的に示す。

デコーダ

一般的なビデオ デコーダでは、出力フォーマットは入力フォーマットにより部分的に決定される。たとえば、出力ストリームは通常、入力ストリームと同じフレーム レートおよびビデオ サイズを持つ必要がある。デコーダ用のあるオプションは、入力タイプが設定されるまで出力タイプを返さないことになっている。別のオプションは、フォーマット ブロックを持たない不完全なタイプのセットを列挙することになっている。その場合、サブタイプを使って、16 ビット RGB、24 ビット RGB など、サポートされる非圧縮タイプを指定する。

また、ビデオ デコーダは通常、入力タイプを設定する前に出力タイプを設定するアプリケーションはサポートしない。多くの場合、既知の入力フォーマットからデコードすることになるので、この制限は妥当である。

オーディオ レコーダでは、サポートする出力フォーマット群が固定されていることがある。このような場合、アプリケーションが入力フォーマットを設定する前に、出力フォーマットを列挙できる。

コンプレッサ

通常、ビデオ コンプレッサは、アプリケーションが入力フォーマットを設定するまで、優先される出力フォーマットを詳細に指定することはできない (その逆も同様)。その代わりに、フォーマット ブロックを持たない不完全なタイプを返すことになる。オーディオ圧縮とビデオ圧縮の両方で、アプリケーションは、出力ビット レートなどさまざまなフォーマット パラメータを制御する必要がある。ただし、入力タイプが設定されている場合は、前に説明した理由から、コンプレッサは完全な出力タイプを 1 つ以上列挙することになる。