Контроль качества по умолчанию

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

Базовые классы DirectShow реализуют некоторые поведения по умолчанию для управления качеством видео.

Сообщения о качестве начинаются с отрисовщика. Базовым классом для отрисовщиков видео является CBaseVideoRenderer, который имеет следующее поведение:

  1. Когда отрисовщик видео получает образец, он сравнивает метку времени в образце с текущим эталонным временем.
  2. Отрисовщик видео создает сообщение о качестве. В базовом классе элемент Пропорции сообщения о качестве ограничен диапазоном от 500 (50 %) до 2000 (200 %). Значения за пределами этого диапазона могут привести к резким изменениям качества.
  3. По умолчанию отрисовщик видео отправляет сообщение о качестве в выходной контакт вышестоящий (контакт, подключенный к его входному контакту). Приложения могут переопределить это поведение, вызвав метод SetSink .

Дальнейшие действия зависят от фильтра вышестоящий. Как правило, это фильтр преобразования. Базовым классом для фильтров преобразования является CTransformFilter, который использует классы CTransformInputPin и CTransformOutputPin для реализации входных и выходных контактов. Вместе эти классы имеют следующее поведение:

  1. Метод CTransformOutputPin::Notify вызывает CTransformFilter::AlterQuality, частный метод в базовом классе фильтра.
  2. Производные фильтры могут переопределить AlterQuality для обработки сообщения о качестве. По умолчанию AlterQuality игнорирует сообщение о качестве.
  3. Если AlterQuality не обрабатывает сообщение о качестве, выходной контакт вызывает CBaseInputPin::P assNotify, частный метод во входном контакте фильтра.
  4. PassNotify передает сообщение о качестве в соответствующее место — следующий вывод вышестоящий или в пользовательский диспетчер качества.

Если фильтр преобразования не обрабатывает сообщение о качестве, сообщение в конечном итоге достигает выходного контакта в исходном фильтре. В базовых классах CBasePin::Notify возвращает E_NOTIMPL. То, как определенный фильтр источника обрабатывает сообщения о качестве, зависит от характера источника. Некоторые источники, такие как запись видеотрансляций, не могут выполнять значимый контроль качества. Другие источники могут изменять скорость, с которой они доставляют образцы.

На следующей схеме показано поведение по умолчанию.

контроль качества в базовых классах

Базовый отрисовщик видео реализует IQualityControl::Notify, что означает, что вы можете передавать сообщения качества самому отрисовщику. Если для элемента Пропорция задано значение меньше 1000, отрисовщик видео вставляет период ожидания между каждым кадром, который он отображает, фактически замедляя отрисовщик. (Это можно сделать, например, для сокращения использования системы.) Дополнительные сведения см. в разделе CBaseVideoRenderer::ThrottleWait. Установка значения, превышающего 1000, для элемента Пропорции не оказывает никакого влияния.

Управление контролем качества