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

[Функция, связанная с этой страницей, 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. Он сообщает о поверхностном шаге в biWidth в элементе BITMAPINFOHEADER в формате видео. Если вышестоящий фильтр не возвращает S_OK из QueryAccept, vmR отклоняет формат и пытается подключиться с помощью следующего формата, объявленного вышестоящим фильтром. VmR подключает тип носителя с новым форматом к первому образцу носителя. После первого примера формат остается постоянным; VmR не переключает форматы во время выполнения графа.

Улучшенный видеорендеринг (EVR)

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

QueryAccept (вверх по течению)