Не удается получить DirectShow MPEG-2 декодер для вывода YV12 / NV12 Progressive - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь получить декодер MPEG-2 (он же DTV-DVD Video Decoder), чтобы дать мне прогрессивные кадры YV12 или NV12, которые можно загружать в OpenGL для рендеринга.Но то, что я вижу, выглядит как какая-то форма несжатого адаптивного чередования движений или просто B или P кадры, которые не дают полного изображения.(Код, который отображает YV12 / NV12 в OpenGL, хорошо работает с другими источниками, так что это не проблема.)

not how it's supposed to look ;-)

Одна важная подсказка: Iувидеть один идеально визуализированный кадр, когда начинается фильм и когда он возвращается к началу.Это говорит мне, что это единственный раз, когда я получаю полный кадр действительных данных YV12 / NV12.

Самое короткое описание возможно:

1) Создан пользовательский Sample Grabber (на основе CTransInPlaceFilter), такчто я мог бы получить образцы, которые имеют VIDEOINFOHEADER2.Это работает, как и ожидалось, и размеры выборки соответствуют ожиданиям для YV12 / NV12 в разрешении, которое я играю.(Полезный пример прокрутки вашего собственного образца Graabber здесь .)

2) Чтобы убедиться, что я получаю только прогрессивные кадры, метод CheckInputType () моего образца Grabber возвращает E_FAIL, если поле dwInterlaceFlagsVIDEOINFOHEADER2 имеет установленный флаг AMINTERLACE_IsInterlaced.

3) Я устанавливаю флаг eAVDecVideoSoftwareDeinterlaceMode_ProgressiveDeinterlacing на декодере с помощью интерфейса ICodecAPI с CODECAPI_AVDecVideoSoftwareD.(Если я этого не сделаю, декодер не будет подключаться к моему Sample Grabber, потому что он не принимает чересстрочные кадры.)

4) Для отладки я использую интерфейс IMediaSample2, чтобы получитьсвойства входящих образцов мультимедиа в Sample Grabber.Член dwTypeSpecificFlags в структуре AM_SAMPLE2_PROPERTIES сообщает мне, что кадры являются AM_VIDEO_FLAG_INTERLEAVED_FRAME, что, как я считаю, указывает на получение полного кадра вместо одного поля.Бит AM_VIDEO_FLAG_I_SAMPLE также устанавливается для всех кадров, указывая, что я получаю полные кадры "I", а не кадры "B" или "P".

5) Учитывая, что все кадры являются кадрами "I", Я ожидаю увидеть мое изображение вместо тарабарщины, как показано выше.Как упомянуто выше, единственный раз, когда я вижу правильное изображение, когда фильм возвращается к первому кадру.

6) Последнее: я вижу, что мои сэмплы имеют установленный AM_VIDEO_FLAG_WEAVE.Это «плетение» изображения - проблема?

Спасибо, Марк

...