video - ingeniería - ingenieria inversa ppt
¿Cómo puedo aplicar ingeniería inversa a un gráfico de DirectShow? (7)
Tengo un gráfico DirectShow para reproducir películas MPEG2 / 4 desde una transmisión en red. Cuando ensamblo el gráfico conectando los pines manualmente, no se procesa. Pero cuando llamo a Render en GraphBuilder, funciona bien.
Obviamente, hay algún paso de configuración que no estoy realizando en algún filtro en el gráfico que está ejecutando GraphBuilder.
¿Hay alguna forma 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 vive en la caja de DirectShow?
¡Gracias! -Z
Necesitas:
- Registre su gráfico de filtro en la "Tabla de Objetos en ejecución" - ROT - Usando el siguiente código
- Conéctese a su gráfico de filtro usando GraphEdit (Archivo-> Conectar a Remote Graph) o incluso mejor - Con GraphEditPlus
Para registrar su gráfico de filtro como un gráfico "conectable", llámelo 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 llámalo antes de lanzar el gráfico:
void RemoveFromROT(DWORD pdwRegister)
{
IRunningObjectTable *pROT;
if (SUCCEEDED(GetRunningObjectTable(0, &pROT)))
{
pROT->Revoke(pdwRegister);
pROT->Release();
}
}
`
Puede ver el gráfico que creó utilizando GraphEdit, una herramienta del DirectShow SDK. En GraphEdit, seleccione Archivo-> Conectarse a Gráfico remoto ...
Para encontrar su gráfico en la lista, debe registrarlo 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 del ROT llamando a IRunningObjectTable :: Revoke
Las versiones anteriores de DirectX, creo 9a, pero no 9b tenían un "modo de depuración" para dshow. Emitiría registros de información de depuración en la consola de depuración.
Descargue una versión anterior, configúrela para depurar. luego abra debugview o cargue graphedt.exe en Visual Studio para ver la información de depuración.
Roman Ryltsov ha creado una herramienta DirectShow Filter Graph Spy ( http://alax.info/blog/777 ), una DLL dúplex COM 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 podrá visualizar utilizando herramientas como GraphEdit o GraphStudio. Muy útil cuando necesita ver cómo se ve un gráfico de Windows Media Player.
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
Hay una entrada detallada de MSDN sobre esto. http://msdn.microsoft.com/en-us/library/windows/desktop/dd390650(v=vs.85).aspx
Puede "guardar" el gráfico (serializarlo) en un archivo .grf graphedit, posiblemente: https://.com/a/10612735/32453
También parece que graphedit puede "conectarse a distancia" a un gráfico en ejecución? http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html