Шаг 3. Поддержка согласования типов мультимедиа

Это шаг 3 руководства по написанию фильтров преобразования.

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

Основным механизмом согласования типов мультимедиа является метод IPin::ReceiveConnection . Выходной пин-код вызывает этот метод на входном контакте с предлагаемым типом носителя. Входной контакт принимает соединение или отклоняет его. Если он отклоняет подключение, выходной пин-код может попробовать другой тип носителя. Если подходящие типы не найдены, подключение завершается сбоем. При необходимости входной пин-код может объявлять список типов, которые он предпочитает, с помощью метода IPin::EnumMediaTypes . Выходной пин-код может использовать этот список, если он предлагает типы мультимедиа, хотя это не обязательно.

Класс CTransformFilter реализует общую платформу для этого процесса следующим образом:

  • Входной пин-код не имеет предпочтительных типов мультимедиа. Он полностью полагается на вышестоящий фильтр, чтобы предложить тип носителя. Для видеоданных это имеет смысл, так как тип мультимедиа включает размер изображения и частоту кадров. Как правило, эти сведения должны быть предоставлены вышестоящим исходным фильтром или фильтром средства синтаксического анализа. В случае звуковых данных набор возможных форматов меньше, поэтому он может быть практическим для входных контактов, чтобы предложить некоторые предпочтительные типы. В этом случае переопределите CBasePin::GetMediaType на входном контакте.
  • Когда вышестоящий фильтр предлагает тип носителя, входной контакт вызывает метод CTransformFilter::CheckInputType , который принимает или отклоняет тип.
  • Выходной пин-код не будет подключаться, если входной пин-код не будет подключен первым. Это поведение типично для фильтров преобразования. В большинстве случаев фильтр должен определить входной тип, прежде чем он сможет задать тип вывода.
  • Когда выходной контакт подключается, он содержит список типов мультимедиа, которые он предлагает для нижестоящего фильтра. Он вызывает метод CTransformFilter::GetMediaType для создания этого списка. Выходной пин-код также будет пытаться использовать любые типы мультимедиа, которые предлагает подчиненный фильтр.
  • Чтобы проверить, совместим ли конкретный тип вывода с типом ввода, выходной контакт вызывает метод CTransformFilter::CheckTransform .

Три перечисленных выше метода CTransformFilter являются чистыми виртуальными методами, поэтому производный класс должен их реализовать. Ни один из этих методов не принадлежит com-интерфейсу; они просто являются частью реализации, предоставляемой базовыми классами.

В следующих разделах подробно описан каждый метод:

Как фильтровать Подключение

Написание фильтров DirectShow