Поделиться через


Согласование распределителей

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

При подключении двух контактов им нужен механизм обмена данными мультимедиа. Этот механизм называется транспортом. Как правило, архитектура DirectShow не зависит от транспорта. Два фильтра могут согласиться на подключение с помощью любого транспорта, который поддерживает оба.

Наиболее распространенным транспортом является локальный транспорт памяти, в котором данные мультимедиа находятся в main памяти. Существуют два варианта локального транспорта памяти: модель отправки и модель извлечения. В модели отправки исходный фильтр отправляет данные в подчиненный фильтр с помощью интерфейса IMemInputPin на входном контакте подчиненного фильтра. В модели извлечения подчиненный фильтр запрашивает данные из исходного фильтра, используя интерфейс IAsyncReader в выходном контакте исходного фильтра. Дополнительные сведения об этих двух моделях потока данных см. в разделе Поток данных в графе фильтров.

В локальном транспорте памяти объект, отвечающий за выделение буферов памяти, называется распределителем. Распределитель поддерживает интерфейс IMemAllocator . Оба контакта совместно используют один распределитель. Любой из них может предоставить распределитель, но выходной контакт выбирает, какой распределитель следует использовать.

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

В подключении IMemInputPin согласование распределителя работает следующим образом:

  1. При необходимости выходной пин-код вызывает IMemInputPin::GetAllocatorRequirements. Этот метод извлекает требования к буферу входного контакта, например выравнивание памяти. Как правило, выходной пин-код должен учитывать запрос входного пин-кода, если нет веской причины этого не делать.
  2. При необходимости выходной пин-код вызывает IMemInputPin::GetAllocator. Этот метод запрашивает распределитель из входного пин-кода. Пин-код ввода предоставляет или возвращает код ошибки.
  3. Выходной контакт выбирает распределитель. Он может использовать один из них, предоставленный входным пин-кодом, или создать собственный.
  4. Выходной пин-код вызывает IMemAllocator::SetProperties для задания свойств распределителя. Однако распределитель может не учитывать запрошенные свойства. (Например, это может произойти, если входной контакт предоставляет распределитель.) Распределитель возвращает фактические свойства в качестве выходного параметра в методе SetProperties .
  5. Outpin вызывает IMemInputPin::NotifyAllocator , чтобы сообщить входной контакт о выделении.
  6. Входной пин-код должен вызывать IMemAllocator::GetProperties , чтобы проверить, допустимы ли свойства распределителя.
  7. Выходной контакт отвечает за фиксацию и списание распределителя. Это происходит при запуске и остановке потоковой передачи.

В подключении IAsyncReader согласование распределителя работает следующим образом:

  1. Входной контакт вызывает IAsyncReader::RequestAllocator для выходного пин-кода. Входной контакт задает требования к буферу и, при необходимости, предоставляет распределитель.
  2. Выходной контакт выбирает распределитель. Он может использовать тот, который предоставляется входным контактом, если таковой имеется, или создать свой собственный.
  3. Выходной контакт возвращает распределитель в качестве исходящего параметра в методе RequestAllocator . Входной контакт должен проверка свойства распределителя.
  4. Пин-код ввода отвечает за фиксацию и списание распределителя.
  5. В любой момент во время согласования распределителя любой контакт может завершиться ошибкой подключения.
  6. Если выходной контакт использует распределитель входного контакта, он может использовать этот распределитель только для доставки образцов в этот входной контакт. Фильтр-владение не должен использовать распределитель для доставки образцов другим контактам.

Предоставление пользовательского распределителя