如何对DirectShow图进行反向工程?

时间:2020-03-05 18:43:15  来源:igfitidea点击:

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

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

组装图形时,有什么方法可以查看GraphBuilder的调试输出吗?

有没有一种方法可以转储工作图以查看如何将其组合在一起?

关于揭开DirectShow包装盒中的奥秘的任何其他想法?

谢谢!
-Z

解决方案

回答

我们可以观看使用GraphEdit(DirectShow SDK中的工具)创建的图形。在GraphEdit中,选择"文件"->"连接到远程Graph ..."。

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

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中删除。

回答

DirectX的较旧版本,我相信9a,但9b却没有dshow的"调试模式"。它将调试信息的日志输出到调试控制台。

因此,下载较旧的版本,将其设置为调试。然后在Visual Studio中打开debugview或者加载graphedtt.exe以查看调试信息。

回答

Roman Ryltsov创建了DirectShow筛选器图形间谍工具(http://alax.info/blog/777),它是FilterGraph界面上的包装COM dll,用于记录对FilterGraph方法的所有调用。

它还会将所有创建的图形添加到"运行对象表"(ROT)中,然后我们可以使用诸如GraphEdit或者GraphStudio之类的工具对其进行可视化。当我们需要查看Windows Media Player图的外观时非常有用。