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

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

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

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

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

Любые другие идеи для разгадки тайны, которая живет в коробке DirectShow?

Спасибо! -Z

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

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

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

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. Зарегистрируйте график фильтра в "Таблице запущенных объектов" - 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();
    }
}

`

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

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

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

Вы можете "сохранить" график (сериализовать его) в файл графического файла.grf, возможно: /questions/42773680/est-li-kakoj-nibud-vspomogatelnyij-instrument-dlya-sozdaniya-graficheskih-fajlov-na-letu-programmno/42773689#42773689

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

Другие вопросы по тегам