如何对DirectShow图形进行逆向工程?

时间:2008-08-26 12:02:08

标签: video directx directshow mpeg

我有一个DirectShow图表来从网络流中呈现MPEG2 / 4电影。当我通过手动连接引脚组装图形时,它不会渲染。但是当我在GraphBuilder上调用Render时,渲染效果很好。

显然有一些设置步骤,我没有在GraphBuilder执行的图形中的某个过滤器上执行。

有没有办法在组装图形时看到GraphBuilder的调试输出?

有没有办法转储工作图,看看它是如何组合在一起的?

解开生活在DirectShow框中的神秘的任何其他想法?

谢谢! -Z

7 个答案:

答案 0 :(得分:13)

您可以使用DirectShow SDK中的工具GraphEdit观看您创建的图表。在GraphEdit中,选择文件 - >连接到远程图...

为了在列表中找到您的图表,您必须在运行对象表中注册它:

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 ...
}

在销毁图表后,您应该通过调用IRunningObjectTable :: Revoke将其从ROT中删除

答案 1 :(得分:10)

Roman Ryltsov创建了一个DirectShow Filter Graph Spy工具(http://alax.info/blog/777),它是FilterGraph接口上的一个包装器,它记录了对FilterGraph方法的所有调用。

此外,它会将所有创建的图形添加到运行对象表(ROT)中,然后可以使用GraphEdit或GraphStudio等工具进行可视化。当您需要查看Windows Media Player图形的外观时非常有用。

答案 2 :(得分: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

答案 3 :(得分:1)

答案 4 :(得分:1)

你需要:

  1. 将过滤器图表注册到"运行对象表" - ROT - 使用下面的代码
  2. 使用GraphEdit(文件 - >连接到远程图表)连接到您的过滤器图表,甚至更好 - 使用GraphEditPlus
  3. 将过滤器图表注册为"可连接的"图表,请使用过滤器图表调用:

    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();
        }
    }
    

    `

答案 5 :(得分:0)

旧版本的DirectX,我相信9a,但不是9b有dshow的“调试模式”。它会将调试信息的日志输出到调试控制台。

所以下载旧版本,将其设置为debug。然后在visual studio中打开debugview或加载graphedt.exe以查看调试信息。

答案 6 :(得分:0)

您可以将图表(序列化)“保存”到.grf graphedit文件中,可能是:https://stackoverflow.com/a/10612735/32453

看来graphedit可以“远程连接”到正在运行的图形吗? http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html