2008-08-26 16 views
14

que tienen un gráfico de DirectShow para hacer MPEG2/4 películas a partir de una corriente de red. Cuando ensamblo el gráfico conectando los pines manualmente, no se procesa. Pero cuando llamo a Render en GraphBuilder, funciona bien.¿Cómo puedo aplicar ingeniería inversa a un gráfico de DirectShow?

Obviamente hay algún paso de configuración que no estoy realizando en algún filtro en el gráfico que GraphBuilder está realizando.

¿Hay alguna manera de ver la salida de depuración desde GraphBuilder cuando ensambla un gráfico?

¿Hay alguna manera de volcar un gráfico de trabajo para ver cómo se armó?

¿Alguna otra idea para desentrañar el misterio que se vive en la caja de DirectShow?

Gracias! -Z

Respuesta

13

Puede ver el gráfico que creó utilizando GraphEdit, una herramienta del DirectShow SDK. En GraphEdit, seleccione Archivo-> Conectar a distancia ... Gráfico

el fin de encontrar su gráfico en la lista, hay que registrarse en la tabla de objetos en ejecución:

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

Después de destruir su gráfico , debe eliminarlo de la ROT llamando IRunningObjectTable :: Revocar

0

antiguas versiones de DirectX, I belive 9a, 9b, pero no tenía un "modo de depuración" para DShow. Emitiría registros de información de depuración en la consola de depuración.

Así que descargue una versión más antigua, la pusieron de depurar. luego abra debugview o cargue graphedt.exe en Visual Studio para ver la información de depuración.

10

Roman Ryltsov ha creado una herramienta DirectShow Filter Graph Spy (http://alax.info/blog/777), una envoltura COM dll sobre la interfaz FilterGraph, que registra todas las llamadas a los métodos FilterGraph.

También agregará todos los gráficos creados en la Tabla de objetos en ejecución (ROT) que luego puede visualizar utilizando herramientas como GraphEdit o GraphStudio. Muy útil cuando necesita ver cómo se ve un gráfico de Windows Media Player.

4

IGraphBuilder :: SetLogFile (ver http://msdn.microsoft.com/en-us/library/dd390091(v=vs.85).aspx) le dará mucha información de diagnóstico útil sobre lo que sucede durante la creación de gráficos. Pase un identificador de archivo (por ejemplo, abierto por CreateFile) y transfiéralo a DWORD_PTR. Vuelva a llamar con NULL para finalizar el registro antes de cerrar el identificador del archivo.

El código en la siguiente publicación de blog para volcar un gráfico le dará información adicional para interpretar los números en el archivo de registro.

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

+0

Gran! Aprendo una nueva información muy útil sobre DirectShow :-) –

1

es necesario:

  1. Registro filtrar gráfica de la "Ejecución de los objetos de tabla" - ROT - Usando el código de abajo
  2. Conexión al gráfico de filtro usando GraphEdit (Archivo-> Conectar a distancia gráfico) o incluso mejor - con GraphEditPlus

Para registrar el gráfico de filtro en forma de gráfico "conectable", llama a esto con su gráfico de filtro:

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

Y llamar a esto antes de soltar el gráfico:

void RemoveFromROT(DWORD pdwRegister) 
{ 
    IRunningObjectTable *pROT; 

    if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) 
    { 
     pROT->Revoke(pdwRegister); 
     pROT->Release(); 
    } 
} 

`

Cuestiones relacionadas