Как работают несколько буферов DirectShow?

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

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

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

1

Решение

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

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]