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


Класс CTransInPlaceFilter

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

Иерархия классов ctransinplacefilter

Класс CTransInPlaceFilter предназначен для фильтров преобразования на месте, которые представляют собой фильтры, которые изменяют входные данные, а не копируют данные по буферам. Чтобы использовать этот класс, наследуйте новый класс от CTransInPlaceFilter и реализуйте следующие методы:

Этот класс использует класс CTransInPlaceInputPin в качестве входного контакта и класс CTransInPlaceOutputPin для выходного контакта. Как правило, переопределять эти классы закрепления не требуется. Фильтр создает оба контакта в методе CTransInPlaceFilter::GetPin . Если классы закрепления переопределяются, необходимо переопределить GetPin для создания пользовательских контактов.

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

Предпочтительные типы мультимедиа

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

Закрепление подключений

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

Предположим, что входной контакт подключается первым. Выполняются следующие действия.

  1. Входной контакт вызывает метод CheckInputType фильтра, чтобы проверка тип носителя.
  2. Фильтр вышестоящий выбирает распределитель. На этом этапе входной контакт не имеет требований к распределителю и принимает любой распределитель для подключения. Если фильтр вышестоящий запрашивает распределитель, контакт создает новый. По причинам, описанным вкратце, этот распределитель не будет использоваться в окончательном соединении. Он предоставляется только для завершения этого этапа процесса подключения.

Позже, когда выходной контакт соединит:

  1. Выходной контакт вызывает метод CheckInputType фильтра, чтобы проверка тип носителя. Он также вызывает IPin::QueryAccept в фильтре вышестоящий. Это гарантирует, что пин-код ввода может изменить тип носителя на соответствие.
  2. Выходной контакт вызывает метод CheckInputType фильтра, чтобы проверка тип носителя. Он также вызывает IPin::QueryAccept в фильтре вышестоящий. Это гарантирует, что пин-код ввода может изменить тип носителя на соответствие.
  3. Выходной контакт вызывает метод CheckInputType фильтра, чтобы проверка тип носителя. Он также вызывает IPin::QueryAccept в фильтре вышестоящий. Это гарантирует, что пин-код ввода может изменить тип носителя на соответствие.
  4. На этот раз метод GetAllocator входного контакта возвращает подчиненный распределитель, а GetAllocatorRequirements — требования к распределителю нижестоящего фильтра. Контакт ввода принимает любой распределитель, выбранный фильтром вышестоящий.
  5. На этот раз метод GetAllocator входного контакта возвращает подчиненный распределитель, а GetAllocatorRequirements — требования к распределителю нижестоящего фильтра. Контакт ввода принимает любой распределитель, выбранный фильтром вышестоящий.

Теперь рассмотрим противоположный сценарий, в котором выходной контакт является первым контактом для подключения.

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

Затем при подключении входного контакта:

  1. Входной контакт проверяет тип носителя, вызывая CheckInputType в фильтре и вызывая QueryAccept в выходном контакте нижестоящего фильтра.
  2. Если тип входных данных не соответствует типу выходных данных, фильтр повторно подключает выходной контакт.
  3. Фильтр вышестоящий выбирает распределитель. Метод GetAllocator входного контакта возвращает подчиненный распределитель, а контакт ввода принимает любой распределитель, который выбирает фильтр вышестоящий.
  4. Фильтр использует тот же распределитель для подчиненного подключения, возможно, переопределяя исходный нисходящий распределитель.

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

Дополнительные сведения об использовании этого класса см. в разделе Написание фильтров преобразования.

Защищенные переменные-члены Описание
m_bModifiesData Указывает, изменяет ли фильтр образец данных.
Защищенные методы Описание
Копировать Копирует пример носителя.
InputPin Извлекает указатель на входной контакт фильтра.
OutputPin Извлекает указатель на выходной контакт фильтра.
TypesMatch Определяет, совпадает ли тип входного носителя с типом выходного носителя.
UsingDifferentAllocators Определяет, используются ли входные и выходные контакты разными распределителями.
Открытые методы Описание
CTransInPlaceFilter Метод конструктора.
GetPin Извлекает закрепление.
GetMediaType Извлекает предпочтительный тип носителя для выходного пин-кода.
DecideBufferSize Задает требования к буферу выходного контакта.
CheckTransform Проверяет, совместим ли тип входного носителя с типом выходного носителя.
CompleteConnect Завершает закрепление подключения.
Receive Получает образец мультимедиа, обрабатывает его и доставляет в нижестоящий фильтр.
Чистые виртуальные методы Описание
Преобразование Преобразует пример на месте.

Требования

Требование Значение
Заголовок
Transip.h (включая Streams.h)
Библиотека
Strmbase.lib (розничные сборки);
Strmbasd.lib (отладочные сборки)