Автор: Валентин Вовк
Video Renderer Filter
Этот фильтр - подходящий вариант для надежного видеовоспроизведения.
Нужно заметить, что в Windows XP фильтром видеовоспроизведения по умолчанию есть Video Mixing Renderer (VMR). И VMP, и Video Renderer имеют общее "дружественное имя" - "Video Renderer". На всех других платформах по умолчанию фильтром видеовоспроизведения есть Video Renderer, хотя приложения и могут использовать VMR-9 для использования дополнительных возможностей видеовоспроизведения.
Video Renderer использует DirectDraw и оверлейные поверхности, если их поддерживает видеокарта. Менеджер графа фильтров предоставляет интерфейс IVideoWindow, который позволяет приложению устанавливать и возвращать свойства Video Renderer'а. На новых видеокартах Video Renderer поддерживает полноэкранный режим отображения. В других случаях МГФ автоматически переключается на фильтр полноэкранного отображателя ( Full Screen Renderer ) для полноэкранного режима.
Нужно заметить, что обычно фильтры таких видеоокон обрабатывают сообщения на рабочем потоке, созданном МГФ. Однако, если приложение напрямую создает фильтр с использованием вызова CoCreateInstance, видеокно обрабатывает сообщение на потоке приложения. В этом случае поток приложения должен иметь цикл обработки для диспетчеризации сообщений, предназначенных видеоокну. Этот поток не должен прекращать выполнение до тех пор, пока Video Renderer не вызовет финальный Release, который происходит в том случае, когда прекращает работу МГФ. В противном случае приложение может получить взаимоблокировку.
В следующей таблице описываются свойства фильтра Video Renderer:
| Свойство | Описание |
|---|---|
| Интерфейсы фильтра | IBaseFilter, IBasicVideo, IBasicVideo2, IDirectDrawVideo, IKsPropertySet, IMediaPosition, IMediaSeeking, IQualityControl, IQualProp, IVideoWindow |
| Медиатип входящего контакта | MEDIATYPE_Video |
| Интерфейсы входящего контакта | IMemInputPin, IOverlay, IPin, IPinConnection, IQualityControl |
| Медиатипы исходящего контакта | - |
| Интерфейсы исходящего контакта | - |
| CLSID фильтра | CLSID_VideoRenderer |
| CLSID страницы свойств | - |
| Исполнимый файл | quartz.dll |
| Merit | Windows 98, Me, NT, 2000: MERIT_PREFERRED Windows XP: MERIT_UNLIKELY |
| Категория фильтров | CLSID_LegacyAmFilterCategory |
В отладочной версии файла quartz.dll, в случае, если уровень отладки LOG_TRACE установлен в значение 5 или выше, Video Renderer отображает временную метку для каждого видеокадра. В обычной же версии quartz.dll эти значения не даются.
Следующие замечания предназначаются для разработчиков фильтров:
Video Renderer применяет форматы YUV, если видеокарта поддерживает оверлейные поверхности YUV. Но в момент его первичного соединения с вышележащим фильтром он запрашивает формат RGB соответствующего глубине цвета текущих установок монитора. Например, если текущей установкой есть 24-битный цвет, вышележащий фильтр должен предоставлять 24-битное RGB-видео. Когда граф фильтров переключается в запущенное состояние, Video Renderer договаривается о динамическом изменении формата для подходящего YUV - цветового пространства.
Соединившись в режиме RGB, Video Renderer обеспечивает себе возможность использовать GDI в случае недоступности режима DirectDraw. Он переключится в режим GDI, если другое приложение использует видеопамять, если область видеотображения захватывает два монитора в многоэкранной системе, или если прямоугольник видеоотображения полностью перекрывается другим окном (or if the video rectangle is completely obscured by another window ?).
Нужно заметить, что Video Mixing Renderer не выполняет динамического изменения формата такого типа и не требует медиатипа RGB, поскольку никогда не использует для отображения GDI.
Для того, чтобы договориться об изменении формата, Video Renderer выполняет вызов IPin::QueryAccept с новым медиатипом. Если вышележазий фильтр возвращает S_OK, Video Renderer использует новый медиатип уже для следующего кадра. Вышележащий фильтр будет произволить вызовы IMediaSample::GetMediaType на каждом сємпле. Если GetMediaType вернет не-NULL значение, это будет указывать на изменение формата, и вышележащий фильтр сможет ответить переключением исходящих медиатипов (Не следует переключать типы в методе QueryAccept ??). Вышележащий фильтр примет наименьший старший RGB-тип и в идеале поддержит общий тип YUV (???). На всем протяжении процесса отображения Video Renderer может переключаться назад и вперед между YUV и RGB любое количество раз. Video Renderer не принимает динамического изменения формата, инициированного вышележащим фильтром.
Когда Video Renderer рисует на поверхности оверлея DirectDraw, он выделяет один буффер для своего входящего контакта. Если вышележащий фильтр попытается соединиться, используя несколько буфферов, Video Renderer не сможет использовать оверлей.
Video Mixing Renderer Filter 9
Этот фильтр расширяет возможности воспроизведения видео для всех платформ, поддерживающих DirectX. Он полностью интегрирован с 3D свойствами DirectX9. Например, можно легко добавлять видео к играм и другим 3D оболочкам или преобразовывать видеоизображения с использованием теневых пикселей Direct3D (3D pixel shaders) и других эффектов.
Этот фильтр не поддерживает видеопорты ( о видеопортах нужно что-нибудь сказать ).
Для обеспечения обратной совместимости VMR-9 не является фильтром отображения по умолчанию ни на какой системе. Для использования этого фильтра нужно добавить его к графу фильтров явно и отконфигурировать его перед соединением с любыми из его входящих контактов. VMR-9 использует собственный набор интерфейсов, структур, перечислителей, которые не всегда идентичны соответствующим типам данных, используемых VMR-7.
| Свойство | Описание |
|---|---|
| Интерфейсы фильтра | IAMVideoAccelerator, IBaseFilter, IBasicVideo,IBasicVideo2,IQualProp, IVideoWindow, IVMRAspectRatioControl9, IVMRDeinterlaceControl9, IVMRFilterConfig9, IVMRImageCompositor9, IVMRImagePresenter9, IVMRImagePresenterConfig9, IVMRMixerBitmap9, IVMRMixerControl9, IVMRMonitorConfig9, IVMRSurface9,IVMRSurfaceAllocator9, IVMRSurfaceAllocatorNotify9, IVMRWindowlessControl9 |
| Медиатипы входящего контакта | Входящий контакт может соединяться с любым типом, поддерживаемым на на аппаратном уровне видео |
| Интерфейсы входящего контакта | IAMVideoAccelerator, IMemInputPin, IOverlay, IQualityControl, IPin, IPinConnection, IVMRVideoStreamControl9 |
| Медиатипы исходящего контакта | - |
| Интерфейсы исходящего контакта | - |
| CLSID фильтра | CLSID_VideoMixingRenderer9 |
| CLSID страницы свойств | - |
| Исполнимый файл | quartz.dll |
| Merit | MERIT_DO_NOT_USE |
| Категория фильтров | CLSID_LegacyAmFilterCategory |
Video Mixing Renderer Filter 7
Этот раздел применим только для Windows XP.
В Windows XP этот фильтр (VMR-7) есть фильтром видеотображения по умолчанию. Он называется VMR-7, потому что внутри себя использует Direct Draw 7. В DirectX 9, похожий, но отдельный фильтр VMR-9 доступен для redistribution на не XP-системах. VMR-9 использует Direct3D 9.
Замечание. VMR (имеется в виду VMR-7 ?) доступен только на платформе Windows XP. Он недоступен through the DirectX redistributable или предыдущих версиях Windows. В большинстве случаев разработчики приложений должны использовать VMR-9.
Особенностями VMR есть:
- Смешивание до 16 входящих каналов (true alpha blending)
- Возможность доступ к образованному изображению перед его отображением.
- Plug-in - модель, дающая возможность реализации собственных видеоэффектов.
МГФ при построении графа в Windows XP не использует старые фильтры Video Renderer или Overlay Mixer, если приложение явно не создаст их и не добавит к графу.
| Свойство | Описание |
|---|---|
| Интерфейсы фильтра | IAMVideoAccelerator, IBaseFilter, IBasicVideo, IBasicVideo2, IQualProp, IVideoWindow, IVMRAspectRatioControl, IVMRDeinterlaceControl, IVMRFilterConfig, IVMRImageCompositor, IVMRImagePresenter, IVMRImagePresenterConfig, IVMRMixerBitmap, IVMRMixerControl,IVMRSurfaceAllocator, IVMRSurfaceAllocatorNotify, IVMRWindowlessControl |
| Медиатипы входящего контакта | Любые типы со старшим типом MEDIATYPE_Video |
| Интерфейсы входящего контакта | IAMVideoAccelerator, IMemInputPin, IOverlay (см. примечание), IPin, IPinConnection, IQualityControl, IVMRVideoStreamControl |
| Медиатипы исходящего контакта | - |
| Интерфейсы исходящего контакта | - |
| CLSID фильтра | Есть два разных CLSID, относящихся к этому фильтру:CLSID_VideoMixingRenderer: Для создания VMR-7. В случае нехватки системных ресурсов вызов CoCreateInstance терпит неудачу. CLSID_VideoRendererDefault: Создается VMR-7, если систепмные ресурсы are available или если создается старый фильтр Video Renderer.CLSID_VideoMixingRenderer используется в том случае, если нужно использовать специфические свойства VMR-7. В противном случае следует пользоваться CLSID_VideoRendererDefault, вызов которого almost наверняка не потерпит неудачи, т.к. может создать старый Video Renderer. |
| CLSID страницы свойств | - |
| Исполнимый файл | quartz.dll |
| Merit | MERIT_PREFERRED + 1 |
| Категория фильтров | CLSID_LegacyAmFilterCategory |
Примечание
Входящий контакт предоставляет интерфейс IOverlay только в том случае, если фильтр VMR-7 находится в оконном режиме (windowed mode). Тогда исходящий контакт констуктивно реализует только метод GetWindowHandle интерфейса IOverlay, что позволяет приложению получить хэндл видеоокна фильтра. Остальные методы интерфеса IOverlay возвращают E_NOTIMPL. В безоконном режиме (windowless mode) фильтр не создает видеоокна, так что контакт не предоставляет этого интерфейса.