Как я могу перепроектировать граф DirectShow? - PullRequest
14 голосов
/ 26 августа 2008

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

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

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

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

Есть ли еще идеи раскрыть тайну, которая живет в коробке DirectShow?

Спасибо! -Z

Ответы [ 7 ]

13 голосов
/ 26 августа 2008

Вы можете посмотреть график, который вы создали, используя GraphEdit, инструмент из 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 ...
}

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

10 голосов
/ 01 июля 2009

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

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

4 голосов
/ 01 апреля 2011

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

1 голос
/ 06 ноября 2014

Вам необходимо:

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

`

1 голос
/ 02 октября 2011

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

0 голосов
/ 02 августа 2012

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

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

0 голосов
/ 16 сентября 2008

В старых версиях DirectX, я полагаю, 9a, но не 9b, был режим отладки для dshow. Это выведет журналы отладочной информации в консоль отладки.

Загрузите старую версию и установите ее для отладки. затем откройте debugview или загрузите graphedt.exe в visual studio, чтобы увидеть информацию об отладке.

...