代码之家  ›  专栏  ›  技术社区  ›  ZebZiggle

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

  •  14
  • ZebZiggle  · 技术社区  · 16 年前

    我有一个DirectShow图形可以从网络流渲染MPEG2/4电影。当我通过手动连接插脚组装图形时,它不会呈现。但当我调用graphbuilder上的render时,它会呈现良好的效果。

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

    当graphbuilder组装图形时,是否有任何方法可以看到它的调试输出?

    有没有一种方法可以转储一个工作图来查看它是如何组合在一起的?

    有没有其他的方法来解开DirectShow盒子里的谜团?

    谢谢! -Z

    7 回复  |  直到 16 年前
        1
  •  13
  •   Timbo    16 年前

    您可以查看使用DirectShow SDK中的工具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中删除。

        2
  •  10
  •   Cristian Adam    15 年前

    Roman Ryltsov创建了一个DirectShow过滤器图形间谍工具( http://alax.info/blog/777 )在filtergraph接口上的包装COM DLL,它记录对filtergraph方法的所有调用。

    此外,它还将把所有创建的图形添加到正在运行的对象表(rot)中,然后您可以使用诸如graphedit或graphstudio之类的工具进行可视化。当您需要查看Windows Media Player图形的外观时非常有用。

        3
  •  4
  •   persiflage    13 年前

    igraphbuilder::setlogfile(请参见 http://msdn.microsoft.com/en-us/library/dd390091(v=vs.85).aspx )将为您提供许多有用的诊断信息,以了解在图形构建过程中发生了什么。传递一个文件句柄(例如,由createfile打开)并将其强制转换为dword指针。在关闭文件句柄之前,使用空值再次调用以完成日志记录。

    下面的博客文章中用于转储图形的代码将为您提供一些额外的信息来解释日志文件中的数字。

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

        4
  •  1
  •   Aliza    13 年前
        5
  •  1
  •   Nitay    9 年前

    你需要:

    1. 使用下面的代码将您的过滤图注册到“正在运行的对象表”中。
    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();
        }
    }
    

    `

        6
  •  0
  •   Jon Clegg    16 年前

    我相信旧版本的DirectX是9A,但不是9B,它有一个DShow的“调试模式”。它将把调试信息的日志输出到调试控制台中。

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

        7
  •  0
  •   Community paulsm4    7 年前

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

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