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


Обработка изменений формата из отрисовщика видео

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

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

Фильтр отрисовщика видео

При подключении старого фильтра отрисовщика видео требуется формат RGB, соответствующий формату отображения основного монитора. Это позволяет использовать GDI для отрисовки, если DirectDraw недоступен. При запуске воспроизведения отрисовщик видео может переключиться на формат, совместимый с DirectDraw. Чтобы определить, может ли фильтр вышестоящий поддерживать новый формат, видео отрисовщик вызывает IPin::QueryAccept для выходного закрепления фильтра вышестоящий. Если фильтр вышестоящий принимает новый формат, метод QueryAccept возвращает S_OK. Видео отрисовщик переключает форматы, присоединяя тип мультимедиа с новым форматом к следующему образцу мультимедиа, возвращенном распределителем. Фильтр вышестоящий должен проверка изменения формата путем вызова IMediaSample::GetMediaType для каждого примера. Отрисовщик видео может переключаться между исходным и новым форматом в любое время во время потоковой передачи. Он не вызывает QueryAccept после первого изменения формата. После того как фильтр вышестоящий примет новый формат, он должен иметь возможность переключения взад и вперед.

Фильтр вышестоящий может отклонить изменение формата, возвращая S_FALSE из QueryAccept. В этом случае отрисовщик видео продолжает использовать GDI с исходным форматом.

Фильтр отрисовщика смешанного видео

Фильтр отрисовщика смешанного видео (VMR-7 и VMR-9) будет подключаться к любому формату, поддерживаемому графическим оборудованием в системе. VMR-7 всегда использует DirectDraw для отрисовки и выделяет базовые поверхности DirectDraw при подключении фильтра вышестоящий. VMR-9 всегда использует Direct3D для отрисовки и выделяет базовые поверхности Direct3D при подключении фильтра вышестоящий.

Графическому оборудованию может потребоваться больший шаг поверхности, чем ширина изображения. В этом случае VMR запрашивает новый формат, вызывая QueryAccept. Он сообщает о шаге поверхности в элементе biWidthBITMAPINFOHEADER в формате видео. Если фильтр вышестоящий не возвращает S_OK из QueryAccept, VMR отклоняет формат и пытается подключиться с использованием следующего формата, объявленного фильтром вышестоящий. VMR присоединяет тип носителя с новым форматом к первому образцу мультимедиа. После первого примера формат остается постоянным; VMR не будет переключать форматы во время работы графа.

Улучшенная отрисовка видео (EVR)

EVR всегда использует Direct3D для отрисовки. Если требуется более крупный шаг поверхности, EVR использует тот же механизм QueryAccept , что и VMR.

QueryAccept (вышестоящий)