如何反向工程一个DirectShow图形?

15

我有一个DirectShow图形,可以从网络流中呈现MPEG2/4电影。当我手动连接引脚组装图形时,它无法渲染。但是在GraphBuilder上调用Render时,它可以正常渲染。

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

是否有任何方法可以查看GraphBuilder组装图形时的调试输出?

是否有一种方法可以转储工作图以查看其如何组合?

其他任何想法可用于解开DirectShow盒子中存在的神秘问题吗?

谢谢!-Z

7个回答

14

你可以使用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中删除。


10

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

此外,它还将所有创建的图形添加到Running Object Table (ROT)中,您可以使用GraphEdit或GraphStudio等工具来可视化这些图形。当您需要查看Windows Media Player图形的外观时,非常有用。


5

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


太好了!我学到了一个关于DirectShow非常有用的新信息 :-) - Martin Delille

1
你需要做的是:
  1. 使用以下代码将你的过滤器图表注册到“运行对象表” - ROT
  2. 使用GraphEdit(文件->连接到远程图形)或者更好的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();
    }
}

`


1

0

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

因此,下载旧版本,将其设置为调试模式。然后打开DebugView或在Visual Studio中加载GraphEdt.exe以查看调试信息。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接