DMO でのメディアの種類の設定
[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayer、IMFMediaEngine、Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]
DMO がデータを処理する前に、クライアントはストリームごとにメディアの種類を設定する必要があります。 (この規則には小さな例外が 1 つあります。 「省略可能なストリーム」を参照してください)。ストリームの数を見つけるには、 IMediaObject::GetStreamCount メソッドを呼び出します。
DWORD cInput = 0, cOutput = 0;
pDMO->GetStreamCount(&cInput, &cOutput);
このメソッドは、入力の数と出力の数の 2 つの値を返します。 これらの値は、DMO の有効期間中は固定されています。
優先される型
すべてのストリームに対して、DMO は優先順に使用可能なメディアタイプのリストを割り当てます。 たとえば、32-RGB、24 ビット RGB、16 ビット RGB の順に使用することをお勧めします。 クライアントがメディアの種類を設定するときに、これらのリストをヒントとして使用できます。 ストリームの優先型を取得するには、 IMediaObject::GetInputType メソッドまたは IMediaObject::GetOutputType メソッドを 呼び出します。 型のストリーム番号とインデックス値を指定します (0 から始まります)。 たとえば、次のコードは、最初の入力ストリームから最初の優先型を取得します。
DMO_MEDIA_TYPE mt
hr = pDMO->GetInputType(0, 0, &mt)
if (SUCCEEDED(hr))
{
// Examine this media type (not shown).
/* ... */
// Free the format block.
MoFreeMediaType(&mt);
}
特定のストリーム上のすべての優先メディア型を列挙するには、次の例に示すように、メソッドがDMO_E_NO_MORE_ITEMSを返すまで型インデックスをインクリメントするループを使用します。
DMO_MEDIA_TYPE mt;
DWORD dwType = 0;
while (hr = pDMO->GetInputType(0, dwType, &mt), SUCCEEDED(hr))
{
// Examine this media type (not shown).
/* ... */
// Free the format block.
MoFreeMediaType(&mt);
++dwType;
}
優先される型については、次の点に注意してください。
- DMO は、書式ブロックのない型を返す場合があります。 たとえば、DMO では、画像の幅と高さを指定せずに、24 ビット RGB などのビデオの種類を指定できます。 ただし、型を設定する場合は、完全な書式ブロックを指定する必要があります。 (MIDI などの一部のメディアタイプでは、フォーマットブロックは必要ありません。その場合、この解説は適用されません)。
- DMO は、返される優先型のすべての組み合わせをサポートする必要はありません。 たとえば、DMO に 2 つのストリームがあり、各ストリームに 4 つの優先型がある場合、16 個の組み合わせが可能ですが、それらのすべてが有効であるとは限りません。
- クライアントが 1 つのストリームのメディアの種類を設定すると、DMO は新しい状態を反映するように他のストリームの優先する種類を更新する場合があります。 ただし、そうする必要はありません。
- 一部のストリームでは、DMO で推奨される型が提供されない場合があります。 通常、DMO では、一部のストリームで少なくともいくつかの優先型を提供する必要があります。
- DMO は、受け入れ可能なメディアの種類の完全な一覧を提供する必要はありません。 DMO でサポートされているが、推奨される型として提供されていない "変換されていない" 型がある可能性があります。
つまり、クライアントは推奨される型をガイドラインとしてのみ扱う必要があります。 サポートされている型を特定する唯一の方法は、次のセクションで説明するように、それらをテストすることです。
ストリームでのメディアの種類の設定
各ストリームの型を設定するには、 IMediaObject::SetInputType メソッドと IMediaObject::SetOutputType メソッドを使用します。 メディアの種類の完全な説明を含む DMO_MEDIA_TYPE 構造体を指定する必要があります。 次の例では、44.1 kHz 16 ビット ステレオ PCM オーディオを使用して、入力ストリーム 0 にメディアの種類を設定します。
DMO_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(DMO_MEDIA_TYPE));
// Allocate memory for the format block.
HRESULT hr = MoInitMediaType(&mt, sizeof(WAVEFORMATEX));
if (SUCCEEDED(hr))
{
// Set the type GUIDs.
mt.majortype = MEDIATYPE_Audio;
mt.subtype = MEDIASUBTYPE_PCM;
mt.formattype = FORMAT_WaveFormatEx;
// Initialize the format block.
WAVEFORMATEX *pWave = reinterpret_cast<WAVEFORMATEX*>(mt.pbFormat);
pWave->wFormatTag = WAVE_FORMAT_PCM;
pWave->nChannels = 2;
pWave->nSamplesPerSec = 44100;
pWave->wBitsPerSample = 16;
pWave->nBlockAlign = (pWave->nChannels * pWave->wBitsPerSample) / 8;
pWave->nAvgBytesPerSec = pWave->nSamplesPerSec * pWave->nBlockAlign;
pWave->cbSize = 0;
// Set the media type.
hr = pDMO->SetInputType(0, &mt, 0);
// Release the format block.
MoFreeMediaType(&mt);
}
メディアの種類を設定せずにテストするには、DMO_SET_TYPEF_TEST_ONLY フラグを指定して SetInputType または SetOutputType を呼び出します。 メソッドは、型が許容される場合はS_OKを返し、それ以外の場合はS_FALSE返します。
if (S_OK == pDMO->SetInputType(0, &mt, DMO_SET_TYPEF_TEST_ONLY)
{
// Media type is OK.
}
あるストリームの設定は別のストリームに影響を与える可能性があるため、ストリームのメディアの種類をクリアする必要がある場合があります。 これを行うには、DMO_SET_TYPEF_CLEAR フラグを指定して SetInputType または SetOutputType を呼び出します。
デコーダー DMO の場合、クライアントは通常、最初に入力の種類を設定してから、出力の種類を選択します。 エンコーダー DMO の場合、クライアントは最初に出力の種類を設定し、次に入力の種類を設定します。
関連トピック