Пользовательский фильтр источника DirectShow - динамическое изменение разрешения - PullRequest
3 голосов
/ 10 января 2012

Ранее я задавал очень похожий вопрос для фильтра видео рендеринга.

См. Здесь: Пользовательский фильтр видео рендерера DirectShow - динамическое изменение разрешения

Но этовремя, мне нужно решение для фильтра источника.Этот исходный фильтр подключается непосредственно к видео рендереру.Декодер встроен.

Я могу получить изменения разрешения из потока.Я также изменяю размеры буферов, когда получаю новое разрешение.Но я не знаю, как уведомить мое новое решение через булавку.Должен ли я каким-либо образом создать экземпляр из CMediaType, заполнить новые значения и вызвать метод SetMediaType() для вывода или каково правильное решение?В настоящее время я делаю это.

if(nWidth * nHeight * 3 != reader->m_RGB24BufferSize) { // if resolution changed
    reader->m_RGB24BufferSize = nWidth * nHeight * 3;
    reader->m_RGB24Buffer = (BYTE*)malloc(reader->m_RGB24BufferSize);

    reader->m_pin->m_bmpInfo.biWidth = nWidth;
    reader->m_pin->m_bmpInfo.biHeight = nHeight;
    reader->m_pin->m_bmpInfo.biSizeImage = GetBitmapSize(&reader->m_pin->m_bmpInfo);

    // Now what? How to notify the video renderer?
}

m_pin является единственным выходным выводом фильтра источника здесь, который объявлен как;

class MyPin : public CSourceStream { ... };

Я знаю, что ответ должен быть простыми вокруг должно быть много примеров, но, поскольку я немного запутался в этих вопросах, я предпочитаю хорошее объяснение, помимо примера.

Ответы [ 2 ]

1 голос
/ 12 января 2012

У вас может быть выходной вывод, полученный из CDynamicOutputPin, и вы можете выполнить следующее, когда вам нужно отправить нисходящее (в средство визуализации) уведомление об изменении формата:

hr = StartUsingOutputPin();
if (SUCCEEDED(hr))
{
    hr = ChangeMediaType(&m_mt);
    StopUsingOutputPin();
}

Существует реализация CDynamicSourceStream и соответствие CDynamicSource в примерах DirectShow из Windows SDK, которые могут оказаться полезными.

1 голос
/ 11 января 2012

Из MSDN Динамические изменения формата :

  1. QueryAccept (Downstream) используется, если выходной вывод предлагает изменение формата для своего нисходящего партнера, но только если новый формат делает не требует большего буфера.

  2. ReceiveConnection используется, когда выходной вывод предлагает изменение формата для своего нисходящего партнера, а новый формат требует большего буфер.

У вас была возможность попробовать что-нибудь из этих двух?

...