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

Zeb*_*gle 14 directx video directshow mpeg

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

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

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

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

解开生活在DirectShow盒子里的神秘的任何其他想法?

谢谢!-Z

Tim*_*mbo 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 ...
}
Run Code Online (Sandbox Code Playgroud)

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


Cri*_*dam 10

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

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


per*_*age 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