Microsoft DirectX 8.0 |
Microsoft® DirectX® SDK には、フィルタ グラフの作成とテストに使用する GraphEdit というデバッグ ユーティリティが提供されている。
ここでは次の内容について説明する。
GraphEdit は、フィルタ グラフを構築するためのビジュアル ツールである。GraphEdit を使用すると、アプリケーション コードを書く前にフィルタ グラフをテストすることができる。また、アプリケーションで作成するフィルタ グラフをロードし、アプリケーションで正しいグラフが構築されることを検証できる。カスタム フィルタを開発した場合は、GraphEdit を使用してフィルタをすばやくテストできる。テストを行うには、カスタム フィルタを使ってグラフをロードし、グラフを実行するだけでよい。DirectShow を使ったことがない場合、GraphEdit は、フィルタ グラフおよび DirectShow アーキテクチャに慣れるよい方法である。
次の図は、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 はレジストリの情報からこの一覧を構築する。次の図にこのダイアログ ボックスを示す。
グラフにフィルタを追加するには、フィルタの名前を選択して [Insert Filters] をクリックするか、フィルタ名をダブルクリックする。フィルタを追加した後、1 つのフィルタの出力ピンからもう 1 つのフィルタの入力ピンにマウスをドラッグすると、2 つのフィルタを接続できる。ピンが接続を受け入れると、ピンを接続する矢印が表示される。
GraphEdit でフィルタ グラフを構築した後、グラフを実行し、グラフが予測どおりに動作するかどうかを確認できる。[Graph] メニューには、[Play]、[Pause]、および [Stop] のメニュー コマンドがある。これらのコマンドはそれぞれ、IMediaControl メソッドである Run、Pause、および Stop を呼び出す。 [GraphEdit] ツール バーにも、これらのコマンドを実行するボタンが表示される。
注 : GraphEdit の [Stop] コマンドは、最初にグラフをポーズし、タイム ゼロをシークする (グラフはシーク可能とする)。ファイルを再生するために、この動作でビデオ ウィンドウが最初にフレームにリセットされる。次に、GraphEdit は IMediaControl::Stop を呼び出す。
グラフがシーク可能な場合は、ツール バーの下に表示されるスライダ バーをドラッグすると、グラフをシークできる。スライダ バーをドラッグすると IMediaSeeking::SetPositions メソッドが呼び出される。
カスタム プロパティ ページをサポートしているフィルタもある。カスタム プロパティ ページは、フィルタのプロパティを設定するためのユーザー インターフェイスを提供する。GraphEdit でフィルタのプロパティ ページを表示するには、フィルタを右クリックし、ポップアップ ウィンドウの [Properties] をクリックする。フィルタに定義されているプロパティ シートがある場合は、プロパティ シートがプロパティ ページに表示される。さらに、GraphEdit にはフィルタの各ピンのプロパティ シートが含まれている。ピン プロパティ シートは、フィルタではなく GraphEdit によって定義される。ピンが接続されている場合は、ピン プロパティ シートに接続のメディア タイプが表示される。ピンが接続されていない場合は、ピンの優先メディア タイプが表示される。
GraphEdit は外部プロセスによって作成されたフィルタ グラフをロードできる。この機能を使用すると、アプリケーションにわずかなコードを追加するだけで、アプリケーションで構築するフィルタ グラフを正確に知ることができる。
アプリケーションでフィルタ グラフのインスタンスを実行中オブジェクト テーブル (ROT) に登録しなければならない。ROT は、実行中オブジェクトを追跡管理するグローバルにアクセス可能なルックアップ テーブルである。オブジェクトはモニカによって ROT に登録される。グラフに接続するために、GraphEdit は表示名が特定のフォーマットに一致するモニカを ROT で検索する。
!FilterGraph X pid Y
X と Y は、それぞれフィルタ グラフのアドレスとプロセス 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] ダイアログ ボックスを示す。