Переговоры по распределителям
[Функция, связанная с этой страницей, DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngineи аудио и видеозахват в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать новый код MediaPlayer, IMFMediaEngine и аудио-видеозахват в Media Foundation вместо DirectShowпо возможности. Корпорация Майкрософт предлагает, что существующий код, использующий устаревшие API, будет перезаписан для использования новых API, если это возможно.]
При подключении двух закреплений им нужен механизм обмена данными мультимедиа. Этот механизм называется транспортом. Как правило, архитектура DirectShow нейтраличена для транспорта. Два фильтра могут согласиться подключиться с помощью любого транспорта, поддерживаемого обоими.
Наиболее распространенным транспортом является локальная память транспорт, в котором данные мультимедиа находятся в основной памяти. Существует два варианта транспорта локальной памяти, модель отправки и модель извлечения. В модели push-отправки исходный фильтр отправляет данные в подчиненный фильтр с помощью интерфейса IMemInputPin на входном пин-коде нижнего фильтра. В модели извлечения подчиненный фильтр запрашивает данные из исходного фильтра с помощью интерфейса IAsyncReader на выходном закреплении исходного фильтра. Дополнительные сведения об этих двух моделях потока данных см. в потоке данных вграфа фильтров.
В локальном транспорте памяти объект, ответственный за выделение буферов памяти, называется распределителем. Распределитель поддерживает интерфейсIMemAllocator. Оба закрепления совместно используют один распределитель. Любой пин-код может предоставить распределитель, но выходной пин-код выбирает, какой распределитель следует использовать.
Выходной пин-код также задает свойства распределителя, определяющие, сколько буферов создаются распределителем, размером каждого буфера и выравниванием памяти. Выходной пин-код может отложить входной пин-код для требований буфера.
В подключении IMemInputPin согласование распределителя работает следующим образом:
- При необходимости выходные пин-коды вызывают IMemInputPin::GetAllocatorRequirements. Этот метод извлекает требования к буферу входных контактов, например выравнивание памяти. Как правило, выходной пин-код должен учитывать запрос входного пин-кода, если не существует веской причины.
- При необходимости выходные пин-коды вызывают IMemInputPin::GetAllocator. Этот метод запрашивает распределитель из входного пин-кода. Входной пин-код предоставляет один или возвращает код ошибки.
- Выходной закрепление выбирает распределитель. Он может использовать один из входных пин-кодов или создать свой собственный.
- Выходные пин-коды вызывают IMemAllocator::SetProperties, чтобы задать свойства распределителя. Однако распределитель может не учитывать запрошенные свойства. (Например, это может произойти, если входной пин-код предоставляет распределитель.) Распределитель возвращает фактические свойства в качестве выходного параметра в методе SetProperties.
- Выход вызывает IMemInputPin::NotifyAllocator для информирования о входных пин-кодах выбора.
- Входной пин-код должен вызывать IMemAllocator::GetProperties, чтобы проверить, допустимы ли свойства распределителя.
- Выходной пин-код отвечает за фиксацию и вывод из эксплуатации распределителя. Это происходит при запуске и остановке потоковой передачи.
В подключении IAsyncReader согласование распределителя работает следующим образом:
- Входной пин-код вызывает IAsyncReader::RequestAllocator на выходном пин-коде. Входной пин указывает требования к буферу и, при необходимости, предоставляет распределитель.
- Выходной закрепление выбирает распределитель. Он может использовать тот, который предоставляется входным закреплением, если он есть, или создать собственный.
- Выходной пин-код возвращает распределитель в качестве исходящего параметра в методе RequestAllocator. Входной пин-код должен проверять свойства распределителя.
- Входной пин-код отвечает за фиксацию и отключение распределителя.
- В любое время во время процесса согласования распределителя любой пин-код может завершиться ошибкой подключения.
- Если выходной пин-код использует распределитель входных контактов, он может использовать этот распределитель только для доставки примеров в этот входной пин-код. Фильтр владения не должен использовать распределитель для доставки примеров другим закреплениям.
Связанные разделы