2008-08-26 20 views
14

ネットワークストリームからMPEG2/4ムービーをレンダリングするDirectShowグラフがあります。手動でピンを接続してグラフをアセンブルすると、レンダリングされません。しかし、GraphBuilderでRenderを呼び出すと、レンダリングがうまくいきます。DirectShowグラフをリバースエンジニアリングするにはどうすればよいですか?

もちろん、私はGraphBuilderが実行しているグラフにいくつかのフィルタ上に行っていないよ、いくつかのセットアップ手順があります。

グラフをアセンブルするとき、GraphBuilderからデバッグ出力を見る方法はありますか?

作業グラフをダンプして、どのように組み立てられたかを確認する方法はありますか?

DirectShowボックスに存在する謎を解明するための他のアイデアはありますか?

ありがとうございます! -Z

答えて

13

あなたはGraphEditを、DirectShowのSDKからツールを使用して作成したグラフを見ることができます。あなたのグラフを破壊した後

void AddToRot(IUnknown *pUnkGraph, DWORD *pdwRegister) 
{ 
    IMoniker* pMoniker; 
    IRunningObjectTable* pROT; 
    GetRunningObjectTable(0, &pROT); 

    WCHAR wsz[256];  
    swprintf_s(wsz, L"FilterGraph %08p pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId()); 
    CreateItemMoniker(L"!", wsz, &pMoniker); 

    pROT->Register(0, pUnkGraph, pMoniker, pdwRegister); 

    // Clean up any COM stuff here ... 
} 

:GraphEditのでは、遠隔グラフに[ファイル] - > [接続]を選択し...

リストであなたのグラフを見つけるために、あなたが実行中のオブジェクトテーブルに登録する必要があります、あなたがIRunningObjectTableを呼び出すことにより、ROTから削除する必要があります::はDirectXの取り消し

0

古いバージョンでは、私は9aと信じますが、9bはdshowのための「デバッグモード」を持っていません。デバッグ情報のログをデバッグコンソールに出力します。

古いバージョンをダウンロードして、デバッグするように設定します。デバッグ情報を表示するには、debugviewを開くか、visual studioでgraphedt.exeをロードします。

10

Roman Ryltsovは、FilterGraphインターフェイス上のラッパーCOM dllであるDirectShowフィルターグラフスパイツール(http://alax.info/blog/777)を作成しました。これは、すべての呼び出しをFilterGraphメソッドに記録します。

はまた、それはあなたがしてGraphEditのかGraphStudioのようなツールを使用して可視化することができます実行中のオブジェクトテーブル(ROT)に作成されたすべてのグラフを追加します。 Windows Media Playerのグラフがどのように見えるかを確認する必要があるときに非常に便利です。

4

IGraphBuilder :: SetLogFileは(http://msdn.microsoft.com/en-us/library/dd390091(v=vs.85).aspxを参照してください)あなたのグラフの建物の間に何が起こるかについての有用な診断情報の多くを与えるだろう。ファイルハンドル(CreateFileで開くなど)を渡し、DWORD_PTRにキャストします。ファイルハンドルを閉じる前に、NULLを指定して再度呼び出してログを終了してください。グラフをダンプするために、次のブログ記事で

コードを使用すると、ログファイルに番号を解釈するためにいくつかの余分な情報を提供します。

http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html

+0

グレートを!私はDirectShowについての非常に有益な情報を学びます:-) –

1

あなたがする必要がある:

  1. 登録を使用すると、「実行中のオブジェクト表」にグラフをフィルタリングする - リモートにGraphEditの([ファイル] - > [接続を使用してフィルタグラフに接続
  2. 以下のコードを使用して - ROTより良いグラフ)または - GraphEditPlus

であなたのフィルタグラフでこれを呼んで、「接続」グラフとしてあなたのフィルタグラフを登録するには:

void AddToROT(IUnknown *pUnkGraph, DWORD *pdwRegister) 
{ 
    IMoniker * pMoniker; 
    IRunningObjectTable *pROT; 
    WCHAR wsz[128]; 
    HRESULT hr; 

    if (FAILED(GetRunningObjectTable(0, &pROT))) 
     return; 

    wsprintfW(wsz, L"FilterGraph %08x pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId()); 

    hr = CreateItemMoniker(L"!", wsz, &pMoniker); 
    if (SUCCEEDED(hr)) 
    { 
     hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister); 
     pMoniker->Release(); 
    } 

    pROT->Release(); 
} 

そして、あなたがグラフリリースする前にこれを呼び出す:

void RemoveFromROT(DWORD pdwRegister) 
{ 
    IRunningObjectTable *pROT; 

    if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) 
    { 
     pROT->Revoke(pdwRegister); 
     pROT->Release(); 
    } 
} 

`

関連する問題