Microsoft DirectX 8.0

GraphEdit によるグラフ構築のシミュレーション

Microsoft® DirectX® SDK には、フィルタ グラフの作成とテストに使用する GraphEdit というデバッグ ユーティリティが提供されている。

ここでは次の内容について説明する。

GraphEdit の概要

GraphEdit は、フィルタ グラフを構築するためのビジュアル ツールである。GraphEdit を使用すると、アプリケーション コードを書く前にフィルタ グラフをテストすることができる。また、アプリケーションで作成するフィルタ グラフをロードし、アプリケーションで正しいグラフが構築されることを検証できる。カスタム フィルタを開発した場合は、GraphEdit を使用してフィルタをすばやくテストできる。テストを行うには、カスタム フィルタを使ってグラフをロードし、グラフを実行するだけでよい。DirectShow を使ったことがない場合、GraphEdit は、フィルタ グラフおよび DirectShow アーキテクチャに慣れるよい方法である。

次の図は、GraphEdit で簡単なフィルタ グラフがどのように表現されるかを示している。

GraphEdit の簡単なフィルタ グラフ

各フィルタは矩形で表される。フィルタの周囲に付いている小さい四角はピンを表す。入力ピンはフィルタの左側にあり、出力ピンは右側にある。矢印はピンの間の接続を表す。

GraphEdit を使用すると、次のことができる。

GraphEdit の使い方

DirectX SDK をインストールすると、[スタート] メニューの [Microsoft DirectX 8 SDK] の下の [DX Utilities] に GraphEdit が表示される。実行モジュール ファイルは GraphEdt.exe で、デフォルトでは Mssdk\Bin\DXUtils フォルダにインストールされる。これらのどの場所からでも GraphEdit を開くことができる。

次に、GraphEdit を使って実行できることについて簡単に説明する。これらの機能 (およびその他の機能) の詳細については、GraphEdit アプリケーション ヘルプを参照すること。

ファイル再生グラフの構築

GraphEdit を使用すると、ファイルを再生するフィルタ グラフを構築できる。この機能は、アプリケーションで IGraphBuilder::RenderFile メソッドを呼び出すのと同じである。[File] メニューの [Render Media File] をクリックする。GraphEdit の [Open File] ダイアログ ボックスが表示される。マルチメディア ファイルを選択して [Open] をクリックする。選択したファイルを再生するためのフィルタ グラフが GraphEdit で構築される。

特定の URL にあるメディア ファイルをレンダリングすることもできる。[File] メニューの [Render URL] をクリックする。URL を指定するダイアログ ボックスが表示される。

カスタム フィルタ グラフの構築

GraphEdit では、システムに登録されているフィルタを使ってカスタム フィルタ グラフを構築できる。[Graph] メニューの [Insert Filters] をクリックする。システムに登録されているフィルタの一覧をフィルタ カテゴリ別に示すダイアログ ボックスが表示される。GraphEdit はレジストリの情報からこの一覧を構築する。次の図にこのダイアログ ボックスを示す。

[Which filters do you want to insert?] ダイアログ ボックス

グラフにフィルタを追加するには、フィルタの名前を選択して [Insert Filters] をクリックするか、フィルタ名をダブルクリックする。フィルタを追加した後、1 つのフィルタの出力ピンからもう 1 つのフィルタの入力ピンにマウスをドラッグすると、2 つのフィルタを接続できる。ピンが接続を受け入れると、ピンを接続する矢印が表示される。

2 つのフィルタの接続

グラフの実行

GraphEdit でフィルタ グラフを構築した後、グラフを実行し、グラフが予測どおりに動作するかどうかを確認できる。[Graph] メニューには、[Play]、[Pause]、および [Stop] のメニュー コマンドがある。これらのコマンドはそれぞれ、IMediaControl メソッドである RunPause、および Stop を呼び出す。 [GraphEdit] ツール バーにも、これらのコマンドを実行するボタンが表示される。

[Play]、[Pause]、および [Stop] ボタン

注 :  GraphEdit の [Stop] コマンドは、最初にグラフをポーズし、タイム ゼロをシークする (グラフはシーク可能とする)。ファイルを再生するために、この動作でビデオ ウィンドウが最初にフレームにリセットされる。次に、GraphEdit は IMediaControl::Stop を呼び出す。

グラフがシーク可能な場合は、ツール バーの下に表示されるスライダ バーをドラッグすると、グラフをシークできる。スライダ バーをドラッグすると IMediaSeeking::SetPositions メソッドが呼び出される。

プロパティ ページの表示

カスタム プロパティ ページをサポートしているフィルタもある。カスタム プロパティ ページは、フィルタのプロパティを設定するためのユーザー インターフェイスを提供する。GraphEdit でフィルタのプロパティ ページを表示するには、フィルタを右クリックし、ポップアップ ウィンドウの [Properties] をクリックする。フィルタに定義されているプロパティ シートがある場合は、プロパティ シートがプロパティ ページに表示される。さらに、GraphEdit にはフィルタの各ピンのプロパティ シートが含まれている。ピン プロパティ シートは、フィルタではなく GraphEdit によって定義される。ピンが接続されている場合は、ピン プロパティ シートに接続のメディア タイプが表示される。ピンが接続されていない場合は、ピンの優先メディア タイプが表示される。

外部プロセスからのグラフのロード

GraphEdit は外部プロセスによって作成されたフィルタ グラフをロードできる。この機能を使用すると、アプリケーションにわずかなコードを追加するだけで、アプリケーションで構築するフィルタ グラフを正確に知ることができる。

アプリケーションでフィルタ グラフのインスタンスを実行中オブジェクト テーブル (ROT) に登録しなければならない。ROT は、実行中オブジェクトを追跡管理するグローバルにアクセス可能なルックアップ テーブルである。オブジェクトはモニカによって ROT に登録される。グラフに接続するために、GraphEdit は表示名が特定のフォーマットに一致するモニカを ROT で検索する。

!FilterGraph X pid Y

XY は、それぞれフィルタ グラフのアドレスとプロセス id を表す 16 進数である。

アプリケーションで最初にフィルタ グラフを作成するには、次の関数を呼び出す。

HRESULT AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister) 
{
    IMoniker * pMoniker;
    IRunningObjectTable *pROT;
    if (FAILED(GetRunningObjectTable(0, &pROT))) {
        return E_FAIL;
    }
    WCHAR wsz[256];
    wsprintfW(wsz, L"FilterGraph %08p pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId());
    HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
    if (SUCCEEDED(hr)) {
        hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister);
        pMoniker->Release();
    }
    pROT->Release();
    return hr;
}

この関数は、フィルタ グラフのモニカと新しい ROT 項目を作成する。最初のパラメータはフィルタ グラフのポインタである。2 番目のパラメータは、新しい ROT 項目を識別する値を受け取る。アプリケーションでフィルタ グラフを解放する前に、次の関数を呼び出して ROT 項目を削除する。pdwRegister パラメータは、AddToRot 関数から返される識別子である。

void RemoveFromRot(DWORD pdwRegister)
{
    IRunningObjectTable *pROT;
    if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
        pROT->Revoke(pdwRegister);
        pROT->Release();
    }
}

次のコード例は、これらの関数を呼び出す方法を示している。この例では、ROT 項目を追加および削除するコードは条件付きでコンパイルされ、デバッグ ビルドにのみ組み込まれる。

IGraphBuilder *pGraph;
DWORD dwRegister;
    
// フィルタ グラフ マネージャを作成する。
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **) &pGraph);
#ifdef DEBUG
hr = AddToRot(pGraph, &dwRegister);
#endif

// アプリケーションの残りの部分 (省略)。

#ifdef DEBUG
RemoveFromRot(dwRegister);
#endif
pGraph->Release();

GraphEdit でフィルタ グラフを表示するには、アプリケーションと GraphEdit を同時に実行する。GraphEdit で [File] メニューの [Connect] をクリックする。[Connect To Graph] ダイアログ ボックスで、アプリケーションのプロセス id (pid) を選択し、[OK] をクリックする。GraphEdit はフィルタ グラフをロードし、表示する。予測できない結果になる可能性があるので、このグラフではその他の GraphEdit 機能を使用しないこと。たとえば、フィルタの追加、削除、またはグラフの停止、開始は行わないこと。GraphEdit を終了してから、アプリケーションを終了する。

注 :  アプリケーションでは、終了時にさまざまなエラーが発生することがある。

次の図に [Connect To Graph] ダイアログ ボックスを示す。

[Connect To Graph] ダイアログ ボックス