2016-09-29 17 views
1

По какой-то причине я не могу декодировать H.264. Конфигурация ввода/вывода прошла хорошо, точно так же, как создание буфера ввода/вывода.Как сделать декодер Media Foundation H.264?

Я вручную подаю декодер H.264 с использованием потокового видео. Поэтому я использую MFVideoFormat_H264_ES как подтип мультимедиа. Декодирование происходит очень медленно, а декодированные кадры - полный мусор. Другие декодеры должным образом декодируют один и тот же поток.

Странно то, что как только ProcessInput() возвращает MF_E_NOTACCEPTING, следующий ProcessOutput() возвращает MF_E_TRANSFORM_NEED_MORE_INPUT. Согласно MSDN, этого никогда не должно быть.

Может ли кто-нибудь предоставить конкретную информацию о том, как это сделать? (предполагая, что MF H.264 является функциональным, о чем я серьезно сомневаюсь).

Я готов предоставить дополнительную информацию, но я не знаю, что может кому-то понадобиться, чтобы помочь.

Редактировать: Когда нужно сбросить количество байтов в буфере ввода до нуля? Btw, я сброшу выходной буфер, когда ProcessOutput() поставляет что-то (мусор).

Редактирование2: Без сброса текущего размера буфера на входном буфере до 0 мне удалось получить некоторый полу-действительный вывод. По полу-значению я имею в виду, что на каждом успешном ProcessOutput() я получаю изображение YUV, где текущее изображение содержит несколько декодированных макроблоков больше, чем предыдущий кадр. Остальная часть кадра черная. Поскольку я не сбрасываю размер, это останавливается через некоторое время. Таким образом, я думаю, что есть проблема с сбросом размера буфера, и я думаю, что я должен получить некоторое уведомление, когда весь кадр будет выполнен (или нет).

Редактирование3: При создании входного буфера GetInputStreamInfo() возвращает 4096 в качестве размера входного буфера. Выравнивание 0. Однако 4k недостаточно. Увеличение до 4 МБ помогает в распаковке фрагмента кадра фрагментом кадра. Все еще нужно выяснить, есть ли способ рассказать, когда декодируется весь кадр.

+0

Как вы называете SetInputType и SetOutputType декодера? Вы отправили сообщения MFT_MESSAGE_NOTIFY_BEGIN_STREAMING и MFT_MESSAGE_NOTIFY_START_OF_STREAM перед первым вызовом ProcessInput? – VuVirt

+0

Не следует сбросить ни входной, ни выходной буфер. Цитата из MSDN: «Если вызывающий абонент выделяет образец носителя, образец носителя должен содержать буфер, который достаточно велик для хранения выходных данных. Чтобы найти требования к буферам, вызовите GetOutputStreamInfo. MFT записывает выходные данные в начало буфер, переписывая любые данные, которые уже существуют в буфере ». https://msdn.microsoft.com/en-us/library/windows/desktop/ms704014(v=vs.85).aspx – VuVirt

+0

Да, оба сообщения были успешно отправлены, MFT_MESSAGE_NOTIFY_BEGIN_STREAMING и MFT_MESSAGE_NOTIFY_START_OF_STREAM. SetInputType & SetOutputType прошел хорошо. При декодировании я получил MF_E_TRANSFORM_STREAM_CHANGE и успешно обработал его. Когда дело доходит до перезаписывания буфера, на самом деле все не работает, как описывает MSDN. На некоторых декодерах мне пришлось сбросить длину буфера до 0, как только ProcessOutput() доставил что-то. – kytodrk

ответ

1

При создании входного буфера GetInputStreamInfo() возвращает 4096 в качестве размера буфера, который слишком мал. Настройка входного буфера на 4 МБ позволила решить проблему. Буфер, вероятно, может быть меньше ... еще нужно проверить это.

+1

Тем не менее, MF производит мусор вместо правильных кадров как другие декодеры. В конце концов, это бесполезно. – kytodrk