Как я могу реконструировать граф DirectShow?

У меня есть график DirectShow для рендеринга фильмов MPEG2/4 из сетевого потока. Когда я собираю график, соединяя контакты вручную, он не отображается. Но когда я вызываю Render в GraphBuilder, он отображается нормально.

Очевидно, что есть какой-то шаг настройки, который я не выполняю для какого-то фильтра на графике, который выполняет GraphBuilder.

Есть ли способ увидеть вывод отладки из GraphBuilder, когда он собирает график?

Есть ли способ сбросить рабочий график, чтобы увидеть, как он был собран?

Какие еще есть идеи, как разгадать тайну коробки DirectShow?

Спасибо! -Z


person ZebZiggle    schedule 26.08.2008    source источник


Ответы (7)


Вы можете просмотреть график, созданный с помощью GraphEdit, инструмента из DirectShow SDK. В GraphEdit выберите File->Connect to remote 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 ...
}

После уничтожения вашего графа вы должны удалить его из ROT, вызвав IRunningObjectTable::Revoke

person Timbo    schedule 26.08.2008

Роман Рыльцов создал инструмент DirectShow Filter Graph Spy (http://alax.info/blog/777) , DLL-оболочка COM над интерфейсом FilterGraph, которая регистрирует все вызовы методов FilterGraph.

Также он добавит все созданные графики в таблицу текущих объектов (ROT), которую затем можно визуализировать с помощью таких инструментов, как GraphEdit или GraphStudio. Очень полезно, когда вам нужно увидеть, как выглядит график проигрывателя Windows Media.

person Cristian Adam    schedule 01.07.2009

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

person persiflage    schedule 01.04.2011
comment
Здорово! Узнаю новую очень полезную информацию о DirectShow :-) - person Martin Delille; 10.12.2012

Об этом есть подробная запись MSDN. http://msdn.microsoft.com/en-us/library/windows/desktop/dd390650(v=vs.85).aspx

person Aliza    schedule 02.10.2011

Тебе надо:

  1. Зарегистрируйте график фильтрации в «Таблице бегущих объектов» — ROT — используя код ниже.
  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();
    }
}

`

person Nitay    schedule 06.11.2014

Более старые версии DirectX, я думаю, 9a, но не 9b имели «режим отладки» для dshow. Он будет выводить журналы отладочной информации в консоль отладки.

Поэтому скачайте более старую версию, установите ее для отладки. затем откройте debugview или загрузите graphedt.exe в Visual Studio, чтобы просмотреть информацию об отладке.

person Jon Clegg    schedule 15.09.2008

Вы можете «сохранить» график (сериализовать его) в файл графического редактирования .grf, возможно: https://stackoverflow.com/a/10612735/32453

Также кажется, что graphedit может «удаленно подключаться» к работающему графику? http://rxwen.blogspot.com/2010/04/directshow-debugging-tips.html

person rogerdpack    schedule 02.08.2012