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


QueryAccept (downstream)

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

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

  1. Вызывает метод IPin::QueryAccept или IPinConnection::D ynamicQueryAccept в подчиненном контакте, чтобы проверить, может ли другой контакт принять новый тип мультимедиа (см. рисунок, шаг A).

  2. Если возвращаемое значение из шага 1 является S_OK, контакт прикрепляет тип носителя к следующему образцу. Для этого сначала вызывается метод IMemAllocator::GetBuffer для получения примера (B). Затем он вызывает метод IMediaSample::SetMediaType , чтобы присоединить тип мультимедиа к этому образцу (C). При присоединении типа мультимедиа к образцу фильтр указывает, что формат изменился, начиная с этого примера.

  3. Закрепление доставляет образец (D).

  4. Когда подчиненный фильтр получает пример, он вызывает IMediaSample::GetMediaType для получения нового типа мультимедиа.

    queryaccept (подчиненный)

Все контакты поддерживают QueryAccept метод . Однако этот метод немного неоднозначн, так как возвращаемое значение S_OK не всегда гарантирует, что формат можно изменить, пока граф активен. Некоторые фильтры могут возвращать S_OK но отклонять изменение, если граф активен. Метод DynamicQueryAccept , поддерживаемый некоторыми входными контактами, явно определяет, S_OK означает, что пин-код может изменять форматы во время активности. Если входной контакт поддерживает интерфейс IPinConnection , следует вызывать DynamicQueryAccept , а не QueryAccept.

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

Примечание о реализации

В базовых классах DirectShow CBasePin::QueryAccept вызывает метод CheckMediaType , который также вызывается во время начального соединения закрепления. В случае фильтра преобразования метод CheckMediaType входного контакта всегда должен проверка, подключен ли выходной контакт, и если да, совместим ли тип входного носителя с типом выходного носителя. Таким образом, эта реализация, скорее всего, будет допустимой для QueryAccept. В противном случае необходимо переопределить QueryAccept , чтобы выполнить все необходимые дополнительные проверки. Кроме того, обратите внимание, что класс CTransformFilter инкапсулирует эту логику в методах CheckInputType и CheckTransform . С другой стороны, класс CTransInPlaceFilter всегда вызывает QueryAccept следующий вышестоящий или подчиненный фильтр.

Метод CBaseInputPin::Receive проверяет тип мультимедиа во входящем примере, и при его наличии вызывает CheckMediaType. Однако он не обновляет элемент m_mt контакта, который содержит текущий тип мультимедиа. Когда фильтр обрабатывает пример, следует проверка пример для типа носителя. При наличии нового типа его, вероятно, потребуется сохранить, вызвав Метод SetMediaType в pin-коде или задав значение m_mt напрямую. С другой стороны, класс CVideoTransformFilter , предназначенный для фильтров преобразования видео, сохраняет тип мультимедиа при его изменении. Дополнительные сведения см. в исходном коде для CVideoTransformFilter::Receive в библиотеке базовых классов DirectShow.

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