Microsoft DirectX 8.0 |
ここでは、Microsoft® DirectShow® アプリケーションで Microsoft® DirectX® Media Object (DMO) を使用する方法を説明する。DirectShow の外で DMO を使用する方法については、「DirectX Media Object の使用」を参照すること。
次のトピックスがある。
DMO ラッパー フィルタを利用すれば、DirectShow アプリケーションは、フィルタ グラフ内で DMO を使用できる。このフィルタは、DMO をラップし、DMO とのデータの受け渡しなど、DMO を使用する際のすべての細かい作業を処理する。また、このフィルタは DMO を集成するため、アプリケーションは DMO が公開するすべての COM インターフェイスをフィルタに問い合わせることができる。
ただし、すべてのストリーム制御は、アプリケーションとフィルタの間、またはアプリケーションとフィルタ グラフ マネージャの間で行う必要がある。DMO の状態を変更する可能性がある DMO インターフェイスのメソッドを呼び出してはいけない。たとえば、ストリームのメディア タイプの設定、バッファの処理、DMO のフラッシュ、DMO のロック、品質コントロールの有効化または無効化、またはビデオ最適化の設定を行ってはいけない。DMO ラッパー フィルタは DMO のすべてのストリーミングを処理するため、これらのメソッドを直接呼び出すとエラーが発生することがある。
DMO をフィルタ グラフに追加するには 2 つの方法がある。
以下では、それぞれの方法について説明する。
まず、DMO ラッパー フィルタのインスタンスを作成する。DMO ラッパー フィルタに IDMOWrapperFilter インターフェイスを問い合わせる。次に、IDMOWrapperFilter::Init メソッドを呼び出す。このメソッドは、DMO の CLSID および DMO のカテゴリの GUID を受け取る。
DMOEnum 関数を使って、ユーザーのシステムに登録されている DMO を列挙できる。DMO は、DirectShow フィルタに使われるカテゴリ GUID とは異なるカテゴリ GUID を使って登録される。DMO カテゴリの一覧については、「カテゴリ GUID」を参照すること。
次のコードは、IDMOWrapperFilter インターフェイスの使い方を示している。
// IMediaObject // DMO ラッパー フィルタを作成する。 IBaseFilter *pFilter; HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&pFilter); if (SUCCEEDED(hr)) { IDMOWrapperFilter *pWrap; hr = pFilter->QueryInterface(IID_IDMOWrapperFilter, (void **)&pWrap); if (SUCCEEDED(hr)) { // フィルタを初期化。 hr = pWrap->Init(CLSID_MyDMO, CLSID_MyDMOCategory); pWrap->Release(); } if (SUCCEEDED(hr)) { // フィルタをグラフに追加。 hr = pGraph->AddFilter(pFilter, L"My DMO"); } pFilter->Release(); }
システム デバイス列挙子は、一部の DirectShow デバイス カテゴリを列挙するときに DMO も列挙する。システム デバイス列挙子は、以下の DMO カテゴリを 同等の DirectShow カテゴリにマップする。
DMO カテゴリ | 同等の DirectShow カテゴリ |
---|---|
DMOCATEGORY_AUDIO_ENCODER | CLSID_AudioCompressorCategory |
DMOCATEGORY_AUDIO_DECODER | CLSID_LegacyAmFilterCategory |
DMOCATEGORY_VIDEO_ENCODER | CLSID_VideoCompressorCategory |
DMOCATEGORY_VIDEO_DECODER | CLSID_LegacyAmFilterCategory |
さらに、システム デバイス列挙子を使って、DMOCATEGORY_AUDIO_EFFECT および DMOCATEGORY_VIDEO_EFFECT を含むすべての DMO カテゴリを列挙できる。システム デバイス列挙子の使い方の詳細については、「システム デバイス列挙子の使用」を参照すること。IMoniker::BindToObject メソッドは、DMO を DMO ラッパー フィルタで自動的にラップする。