次の方法で共有


DirectShow での DMO の使い方

DirectShow を利用するアプリケーションは、DMO ラッパー フィルタを通して、フィルタ グラフ内の DMO を使える。このフィルタは、DMO を集成し、DMO とのデータの受け渡しや IMediaBuffer オブジェクトの割り当てなど、DMO を使う際のすべての細かい作業を処理する。

DMO はフィルタによって集成されるため、アプリケーションは DMO が公開するすべての COM インターフェイスをフィルタに問い合わせることができる。ただし、アプリケーションは、DMO でのすべてのストリーミング操作の実行を、フィルタに任せなければならない。たとえば、メディア タイプの設定、バッファの処理、DMO のフラッシュ、DMO のロック、品質コントロールを有効にするか無効にするか、またはビデオ最適化の設定を行ってはいけない。

使用する特定の DMO のクラス識別子 (CLSID) がわかっていれば、以下のようにして、その DMO で DMO ラッパー フィルタを初期化できる。

  1. CoCreateInstance を呼び出して、DMO ラッパー フィルタを作成する。
  2. DMO ラッパー フィルタに IDMOWrapperFilter インターフェイスを問い合わせる。
  3. IDMOWrapperFilter::Init メソッドを呼び出す。DMO の CLSID および DMO のカテゴリの GUID を指定する。DMO カテゴリの一覧については、「DMO の GUID」を参照すること。

次のコードは、以上の手順を示したものである。

// DMO ラッパー フィルタを作成する。
IBaseFilter *pFilter;
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, 
    CLSCTX_INPROC_SERVER, IID_IBaseFilter, 
    reinterpret_cast<void**>(&pFilter));

if (SUCCEEDED(hr)) 
{
    // IDMOWrapperFilter を問い合わせる。
    IDMOWrapperFilter *pDmoWrapper;
    hr = pFilter->QueryInterface(IID_IDMOWrapperFilter, 
        reinterpret_cast<void**>(&pDmoWrapper));

    if (SUCCEEDED(hr)) 
    {     
        // フィルタを初期化する。
        hr = pDmoWrapper->Init(CLSID_MyDMO, DMOCATEGORY_VIDEO_EFFECT); 
        pDmoWrapper->Release();

        if (SUCCEEDED(hr)) 
        {
            // グラフにフィルタを追加する。
            hr = pGraph->AddFilter(pFilter, L"My DMO");
        }
    }
    pFilter->Release();
}

DMOEnum 関数は、レジストリ内の DMO を列挙する。この関数は、DirectShow フィルタに使われるカテゴリ GUID とは異なるカテゴリ GUID 群を使う。

DMO でのシステム デバイス列挙子の使い方

DMO を直接作成する代わりに、システム デバイス列挙子を使える。システム デバイス列挙子は、DMOEnum メソッドによってサポートされるすべての DMO カテゴリを列挙できる。システム デバイス列挙子は、一部の 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

システム デバイス列挙子は、モニカ オブジェクトのリストを返す。モニカが DMO を表している場合、IMoniker::BindToObject メソッドは DMO ラッパー フィルタを自動的に作成し、その DMO で初期化する。したがって、DMO が含まれているという事実は、アプリケーションからは認識されない。システム デバイス列挙子の使い方の詳細については、DirectShow のマニュアルのトピック「システム デバイス列挙子の使用」を参照すること。

制限事項

DirectShow で DMO を使う際には、いくつかの制限事項がある。

  • DMO ラッパー フィルタは、入力のない DMO、複数の入力がある DMO、または出力のない DMO をサポートしない。
  • DMO ラッパー フィルタ上のすべてのピン接続は、IMemInputPin インターフェイスを使う。
  • 現バージョンの DirectShow 編集サービスは、DMO ベースのエフェクトまたはトランジションをサポートしない。