2014-02-03 2 views
1

Фильтры DirectShow позволяют выделять несколько буферов в DecideBufferSize.Как работают несколько буферов DirectShow?

У меня есть фильтр преобразования, который кодирует необработанные кадры с помощью x264, генерируя 1+ NAL для передачи вверх по потоку к следующему фильтру. Я думал, что выделение пула буферов для NAL может быть решением, но я не могу понять, как получить доступ ко всем буферам, которые я уже выделил.

Возможно, есть лучший способ решить проблему - выделить один большой буфер и передать все NAL внутри?

ответ

1

На штыревом соединении контакты согласуются на использование распределителя памяти, а метод задает вопрос о согласовании параметров такого распределителя. DecideBufferSize НЕ делает распределение.

Следующее, что вы, возможно, ошибочно используете, использует буферы. В конце концов, вы передаете данные, используя эти буферы, принимающие один за другим и проходящие вниз по течению. Независимо от того, сколько буферов имеет распределитель, вы можете использовать хотя бы один буфер для передачи всех ваших NALU, потому что вы по очереди буферизуете один за другим. Если у вас есть еще один NAL для доставки, тогда вы запрашиваете новый буфер (кстати, метод для запроса нового буфера - IMemAllocator::GetBuffer) для заполнения, и у вас есть его, когда есть бесплатный. Таким образом, количество буферов не имеет значения и не является ответом на вашу проблему.

Обычно вам требуется больше буферов, если вы заинтересованы в буферизации для какой-либо синхронной деятельности или вам нужно несколько за раз, и в этом случае DecideBufferSize - это хорошее место, чтобы указать ваши минимальные требования.

Наполнение нескольких NALU в один большой буфер вряд ли будет решением: в основном вы должны заполнить один буфер на кадр, независимо от того, сколько там NALU. Возможно, буфер с NALU без фрейма является приемлемым, но многократные NALU в одном буфере не являются/маловероятными. Хотя, это больше вопрос совместимости декодера/мультиплексора.

+0

Так что мне просто нужно запросить буфер в соответствии с максимальным размером NALU и доставить их 1 к 1 вниз по течению? –

+1

Лучшим было бы взять некоторый хорошо сформированный видеофайл H.264 (MP4 и т. Д.) И передать его через DirectShow, чтобы посмотреть, как именно буферы перемещаются по входу декодера. Вам нужно будет отправить их таким же образом. Обычно вы отправляете единицы изображения по одному на буфер, предварительно добавляя единицы набора параметров, если необходимо, с I-кадрами. Обратите внимание, что существует специальное соглашение о том, как использовать или не использовать стартовые коды, см. [Типы видео H.264] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd757808%28v=vs. 85% 29.aspx). –