カクタスソフトウェア
カクタスソフトウェア
サウンド MIDI マルチメディア アプリケーション

DMOをDirectShowで使う

IDMOWrapperFilterインターフェースを用いるとDMOをDirectShowのフィルタグラフで使うことができます。既存のフィルタグラフにDMOの機能を追加したいときに用います。

IDMOWrapperFilterインターフェースはDMOをフィルターとして機能させるためのラッパーです。IDMOWrapperFilterはIMediaBufferオブジェクトの割り当てなどDMOをフィルタグラフで動作させるための一連の作業を行います。これによりプログラムではDMOをDirectShowのフィルターのように扱うことができます。

DMOWrapperFilterオブジェクト作成

DMOWrapperFilterオブジェクトを作成し、IDMOWrapperFilterインターフェースを取得します。Init関数でDMOのカテゴリーを示すCLSIDとDMOを識別する固有のCLSIDを用いて初期化します。関数が成功したらオブジェクトをフィルタグラフに挿入することができます。

HRESULT hr = S_OK;

IBaseFilter *pWrapperFilter;
hr = CoCreateInstance(
    CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC, IID_IBaseFilter, (void **)&pWrapperFilter);

if (SUCCEEDED(hr))
{
    IDMOWrapperFilter *pDmoWrapper;
    hr = pWrapperFilter->QueryInterface(IID_IDMOWrapperFilter, (void **)&pDmoWrapper);

    if (SUCCEEDED(hr))
    {
        hr = pDmoWrapper->Init(CLSID_MyDMO, DMOCATEGORY_MyDMO);
        pDmoWrapper->Release();

        if (SUCCEEDED(hr))
        {
            // DMOWrapperFilterをフィルタグラフに挿入する
            hr = pGraphBuilder->AddFilter(pWrapperFilter, L"My DMO");
        }
    }
    pWrapperFilter->Release();
}

IDMOWrapperFilter::Init

DMOWrapperFilterにDMOを結び付けます。

ここで用いるCLSIDはセクション「DMOを列挙する」で解説していますので参照して下さい。
HRESULT Init(
    REFCLSID    clsidDMO,
    REFCLSID    catDMO);

clsidDMO

DMO固有のCLSIDです。

catDMO

DMOが属するカテゴリーを示すCLSIDです。

C#によるDMOWrapperFilterオブジェクト作成

以下にC#による実装例を示します。

IDMOWrapperFilter dmoWrapper;
int hr;

try
{
    Type comType = Type.GetTypeFromCLSID(CLSID_DMOWrapperFilter);
    object comObj = Activator.CreateInstance(comType);
    dmoWrapper = (IDMOWrapperFilter)comObj; comObj = null;

    hr = dmoWrapper.Init(CLSID_MyDMO, DMOCATEGORY_MyDMO);
    if (hr < S_OK)      Marshal.ThrowExceptionForHR(hr);

    hr = graphBuilder.AddFilter(dmoWrapper, "My DMO");
    if (hr < S_OK)      Marshal.ThrowExceptionForHR(hr);
}
catch (Exception e)
{
    // エラー処理
}
finally
{
    if (dmoWrapper != null)
        Marshal.ReleaseComObject(dmoWrapper); dmoWrapper = null;
}

ドキュメントの先頭へ

カクタスソフトウェア 技術協力 資料室 資料室の広場 SourceForge.jp お問い合わせ