Использование VMR при разработке фильтров

Требования для декодеров

Декодеры, которые поставляют сэмплы VMR'у, должны отвечать следующим правилам:

  • There should be one subpicture frame delivered to the VMR for each video frame. Два фрейма должны иметь одинаковые временные отметки.
  • Если подизображение не изменяется, нужно использовать флаг AM_GBF_NOTASYNCPOINT в методе IMemAllocator::GetBuffer для того, чтобы заставить аллокатор вернуть буфер, содержащий последний фрейм, передаваемый VMR'у. Нужно только выставить отметку о времени на сэмпле и снова доставить его VMR'у. If the subpicture fame is blank, you should still deliver it. VMR обнаружит пустой фрейм и не будет смешивать его с видео. Этот тест выполняется чипом VGA и не влияет на воспроизведение.
  • Все сэмплы, за исключением живых потоков, должны иметь допустимые временные отметки начала и конца. (DVD не является живым потоком).
  • Временные отметки медиасэмплов должны быть непрерывными.
  • Декодер должен самоидентифицироваться как VMR-совместимый для использования построителем графа.
  • Поток подизображения может теперь содержать встроенные попиксельные значения интенсивности.
  • Нельзя допускать, чтобы шаг подизображения был таким же, как и ширина поверхности.Это не всегда так в случае с VMR.

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

Интерфейс IVMRVideoStreamControl на входящем контакте (-ах) позволяет приложениям и вышележащим фильтрам управлять поведением компоненты смешения (component mixer), включая Z-порядок и активное состояние входящих потоков VMR'а. Хотя этот интерфейс предоставляется контактами, он действует в компоненте миксера VMR'а, так что доступен он только тогда, когда микшер загружен, что происходит в том случае, когда VMR обрабатывает несколько входящих потоков. Вышележащие фильтры используют методы SetColorKey и GetColorKey для управления цветовым ключом источника. Эти методы дают возможность производить такие эффекты, как оверлейный показ над видео. Нужно просто установить цветовой ключ в цвет фона анимационного потока, и VMR смешает этот поток с другим видеопотоком. Приложение долждно быть осторожным, чтобы не установить цветовой ключ в некое значение, отличающееся от значения, установленного вышележащим фильтром, таким, как декодер.

Фильтры используют методы GetStreamActiveState и SetStreamActiveState для того, чтобы сообщить микшеру о необходимости ожидать входящие данные с указанного контакта. Например, декодер Line21 использует эти методы для активации входящего контакта VMR'а для Line21 только в том случае, когда данные присутствуют в потоке. Установка контакта в активное состояние указывает микшеру, что не нужно ожидать данные с входящего контакта перед составлением изображения.

Сообщения качества

VMR поддерживает интерфейс IQualityControl и предоставляет исходные данные вышележащему фильтру. Это поведение идентично старому Overlay Mixer'у, но отличается от старого Overlay Renderer'а, который пытается интерпретировать the quality data before passing it upstream.

Координатные отображения VMR

Далее будут описаны пять преобразований, применяемые к изображению-источнику перед его отображением VMR'ом на финальном выходящем изображении.

  1. Преобразование T(Src) отображает исходный прямоугольник в результирующий прямоугольник. Они задаются членами rcSource и rcTarget структуры VIDEOINFOHEADER или структуры VIDEOINFOHEADER2 в медиатипе. This mapping preprocesses the source image as it passes to the VMR.
  2. Преобразование T(Flag) выполняет любые обработки с изображением, указанные флагами в медиасэмпле. Они включают такие преобразования, как вертикальная трансляция и масштабирование для to accommodate the bob interlace flags. Интерлейсное преобразование удваивает высоту изображения и, возможно, переносит изображение половиной видеолинии, если это - нечетное поле.
  3. Преобразование T(AR) устанавливает изображение в квадратные пиксели, основанные на отношении длины к высоте для изображения (aspect ratio). Для медиатипов VIDEOINFOHEADER aspect ratio определяется размерами изображения. Для типов VIDEOINFOHEADER2 aspect ratio определяется полями dwPictAspectRatioX иdwPictAspectRatioY, если установлены флаги AMCONTROL_PAD_TO_16x9 или AMCONTROL_PAD_TO_4x3. Преобразование предполагает, что установки монитора совпадают с физическим aspect ratio монитора. Например, если используется монитор с aspect ratio 4x3, но дисплей установлен в 1280x768 пикселей (5x3), изображение может не иметь корректного aspect ratio.
  4. Преобразование T(Mix) переносит положение изображения в пределах результирующего изображения с использованием нормализационных прямоугольников, указываемых в методах IVMRMixerControl. Нормализационные прямоугольники дают возможность приложению to organize how the source streams are positioned and scaled relative to each other. VMR обсчитывает изображение назначения путем вычисления максимальной размерности всех изображений-источников и центрированием каждого из них внутри ограничивающего прямоугольника. Углы ограничивающего прямоугольника связываются со значениями (0,0) и (1,1). Ограничивающий прямоугольник фиксируется перед запуском графа и остается постоянным, даже если потоки добавляются или удаляются. Прямоугольники назначения для каждого потока могут лежать вне области (0,0) и (1,1) и быть, тем не менее, допустимым. Нормализованный прямоугольник назначения имеет также пару флагов, которые изменяют семантику координат назначения. Флаги могут иметь следующие значения:
  5. VMRDest_AdjustHeight (0x00000001): Будет принята высота (и центрирование посередине нормализационного прямоугольника) для поддержки aspect ratio изображения.
  6. VMRDest_AdjustWidth (0x00000002): Будет принята высота (и центрирование посередине нормализационного прямоугольника) для поддержки aspect ratio изображения.
  7. И, наконец, часть смешанного изображения может быть преобразована отображением T(Dst), определенным прямоугольниками источника и назначения интерфейса IBasicVideo VMR'а. Если аллокатор-презентер заменен и интерфейс IBasicVideo не используется, приложение должно реализовать интерфейс IVMRWindowlessControl и отобразить координаты назад в 2D-линейное пространство. Координаты мышки, возвращенные DVD-навигатору, должны быть выражены тоже в этом пространстве. Например, если приложение отрисовывает изображение на вращающемся кубе, they would report back the entire display для безоконного управления и вернуть координаты мыши относительно дисплея.

Общее преобразование изображения из исходных данных в окончательное отображение имеет, таким образом, следующий вид:

T = T(Src)*T(Flag)T(AR)T(Mix)*T(Dst)*

где * указывает, что изображение может быть врезано (clipped) на изображение назначения на этом этапе. Нужно заметить, что все эти преобразования - афинные, так что VMR может скомбинировать их в одно преобразование.

Обратным преобразованием будет:

T-1 = TDst-1 TMix-1 TAR-1 TFlag-1 TSrc-1

Множитель T(Src)T(Flag)T(AR) относится к разрешению источника. В множителе T(Mix) нормализованный прямоугольник источника относится к aspect-corrected изображению. Нормализованный прямоугольник назначения относится к окончательному разрешению. Следующая диаграмма показывает эти соотношения:

Рис. 2. VMR и координатные преобразования

Препроцессорные преобразования MPEG-декодера

Изображение 4x3 может быть сформировано заполнением верха и низа изображения (Letterbox-изображение) или извлечением 4x3-порции изображения (PanScan-изображение). Меню и потоки подизображения располагаются поверху результирующего видеоизображения. 16x9 ratio-изображения хранятся в 4x3 anamorphic-формате. Растяжение anamorphic 4x3 aspect ratio 720x480 источника видео к 16x9 aspect ratio формирует подлинное 16x9 aspect изображение.

Ниже дано описание того, как правильно отображать каждый режим and their highlights:

  • Widescreen: Исходное видео растягивается в наибольший 16x9 - области окна отображения. The highlights относится к внутренности области 16x9. Черные полосы будут добавлены вверх и вниз или по сторонам для поддержании пропорции 16x9.
  • Pan Scan: From the 16x9 video, use the horizontal offset provided in the MPEG2 stream to extract a 4x3 subwindow. Положите подокно 4x3 в наибольшую область клиентского окна вывода. The highlight's координаты относятся к 4x3 - окну вывода и имеют отношение к исходному видео 16x9. Черные полосы будут добавлены вверх и вниз или по сторонам для поддержании пропорции 4x3.
  • Letterbox: Вычислите наибольшую область 4x3 окна вывода.

Доступ к DirectDraw-поверхностям

Media Sample - объекты предоставляются VMR'ом для поддержки вышележащим фильтром интерфейса IVMRSurface. Для получения этого интерфейса нужно вызвать QueryInterface на интерфейсе IMediaSample и указать IID_IVMRSurface. Вышележащие фильтры могут затем использовать методы IVMRSurface'а для доступа и манипуляций поверхностью, созданной VMR'ом.

Поддержка VMR’ом DirectX-ускорения

Видеоускорение DirectX (DirectX Video Acceleration) - это API и соответствующий Device Driver Interface (DDI) для аппаратного ускорения декодирования цифрового видео с поддержкой яркостного смешивания для поддержки, например, DVD-подизображений. DirectX VA документировано в Windows DDK. Интерфейс IAMVideoAccelerator, который предоставляет пользовательский режим доступа к функциональности DirectX VA на аппаратном устройстве, описывается в этом (т.е. DirectShow) SDK.

VMR поддерживает IAMVideoAccelerator, и реализация последнего идентична той, что была в старом Overlay Mixer'е, за исключением одного важного отличия. Overlay Mixer гарантировал, что выход будет воспроизведен на оверлейной поверхности, тогда как VMR может послать выход на дальнейшую обработку, например, 3D операцию, или может послать выход на внеэкранную поверхность, которая потом будет blitted на первичную поверхность.

Работа с медиатипами, ориентированными на Direct3D-отображение

Новые медиатипы определны для использования для VMR-7 и VMR-9. Когда вышележащий фильтр предлагает соединение с использованием одного из этих подтипов, это есть указанием VMR'у, что отображение будет выполняться на Direct3D render target. Для VMR-7 будет использоваться DirectX 7 Direct3D render target, а для VMR-9 -DirectX 9 Direct3D render target. Если VMR находится в режиме микширования, поверхность будет также поверхностью текстуры Direct3D. Если же VMR не находится в режиме микширования, поверхность будет регулярной поверхностью Direct3D. Формат пикселей ARGB тоже поддерживается, когда VMR находится в режиме микширования. Новые подтипы таковы:

VMR-7VMR-9
MEDIASUBTYPE_RGB32_D3D_DX7_RTMEDIASUBTYPE_RGB32_D3D_DX9_RT
MEDIASUBTYPE_RGB16_D3D_DX7_RTMEDIASUBTYPE_RGB16_D3D_DX9_RT
MEDIASUBTYPE_ARGB32_D3D_DX7_RTMEDIASUBTYPE_ARGB32_D3D_DX9_RT
MEDIASUBTYPE_ARGB4444_D3D_DX7_RTMEDIASUBTYPE_ARGB4444_D3D_DX9_RT
MEDIASUBTYPE_ARGB1555_D3D_DX7_RTMEDIASUBTYPE_ARGB1555_D3D_DX9_RT

Эти новые подтипы опредеоены в модуле uuids.h вместе с другими медиа-подтипами DirectShow. Медиатипы MEDIASUBTYPE_RGB32 имеют формат RGBx888, а медиатипы MEDIASUBTYPE_RGB16 - формат RGB565.

Запрашивание и разблокирование поверхности

Блокирование и разблокирование поверхностей DirectDraw - дорогие операции в вычислительном отношении. Когда используются ориентированные на Direct3D-отображение медиатипы, вышележащему фильтру нужны поверхности, которые нужно разблокировать так, чтобы он смог выполнять с ними действия посредством графического аппаратного обеспечения. Для того, чтобы избежать необязательных операций блокировки-разблокировки, VMR поддерживает новый флаг AM_GBF_NODDRAWSURFACELOCK для использования его в методе IMemAllocator::GetBuffer, который указывает VMR'у, чтобы он не блокировал DirectDraw-поверхность перед передачей сэмпла вышележащему фильтру. Если этот флаг используется, вызов IMediaSample::GetPointer будет неуспешным, поскольку указатель на заблокированный буфер отсутствует. Для получения доступа к DirectDraw-поверхности, фильтр должен вызвать метод QueryInterface на возвращенном объекте IMediaSample и запросить интерфейс IVMRSurface. Очевидно, что вышележащий фильтр должен быть уверен в том, что поверхность не заблокирована в то время, когда он отпускает сэмпл назад в свободный список (???).

Попиксельное смешение яркости

Для попиксельного смешения яркости определены четыре новые медиаподтипы. Они поддерживаются только тогда, когда VMR находится в режиме смешивания. VMR может отвергнуть соединение, если он не находится в режиме смешения, когда вышележащий фильтр пытается соединиться с использованием одного из этих подтипов. Они определны в файле uuids.h:

  • MEDIASUBTYPE_ARGB1555
  • MEDIASUBTYPE_ARGB4444
  • MEDIASUBTYPE_ARGB32

MEDIASUBTYPE_AYUV

Для получения более подробной информации о MEDIASUBTYPE_AYUV нужно смотреть документацию по DXVA в Microsoft Platform DDK.

Эксклюзивный режим DirectDraw

Этот раздел применим только к VMR-7. VMR-9 имеет другую технику для разрешения исключительного режима.

В эксклюзивном режиме DirectDraw приложению требуется эксклюзивное управление графическим аппаратным обеспечением. Это полезно для таких, например, приложений, как игры, или, возможно, полноэкранного видеоприложения. Обычно VMR создает объекты DirectDraw и устанавливает в качестве обычного - совместный (кооперативный) уровень. Однако, для запуска VMR'а в исключительном режиме DirectDraw, приложение само должно должно создать объект DirectDraw и первичную поверхность, и вызвать методSetCooperativeLevel для указания эксклюзивного режима.

VMR имеет специальный аллокатор-презентер, который позволяет запускать эксклюзивный режим DirectDraw. Для конфигурирования VMR'а нужно использовать это аллокатор-презентер:

  1. Создать граф фильтров и добавить в него VMR с использованием метода IFilterGraph::AddFilter.
  2. Создать аллокатор-презентер эксклюзивного режима:
IVMRImagePresenterExclModeConfig* pExclModeConfig;
CoCreateInstance(
CLSID_AllocPresenterDDXclMode,
NULL,
CLSCTX_INPROC_SERVER,
IID_IVMRImagePresenterExclModeConfig,
(void**)&pExclModeConfig
);
  1. Отконфигурировать новый аллокатор-презентер:
pExclModeConfig->SetXlcModeDDObjAndPrimarySurface(...);
  1. Подключить новый аллокатор-презентер к VMR'у.
  2. Построить остаток графа фильтров обычным образом.

Фильтр Overlay Mixer

Фильтр Overlay Mixer - это фильтр видеотображения, разработанный специально для проигрывания DVD и широковещательных видеопотоков с line-21 closed captioning. Overlay Mixer поддерживает также расширение видеопортов ( Video Port Extensions - VPEs ), что позволяет работать с аппаратными декодерами MPEG-2 или аналоговыми TV-тюнерами, которые отсылают видео напрямую видеокарте, не используя шину PCI.

Замечание. Если есть возможность, более предпочтительно использовать фильтр VMR-9, а не Overlay Mixer, за исключением случаем VPE.

Overlay Mixer использует для отображения DirectDraw. Это требует от видеокарты поддержки оверлейной поверхности. Первичный видеопоток соединяется с нулевым контактом. Вторичные потоки (closed caption graphics или DVD-подизображения (subpictures)) соединяются с контактом 1 или выше. Overlay Mixer переносит (blits) вторичные потоки непосредственно на первичную поверхность; это происходит без смешивания.

Overlay Mixer использует фильтр Video Renderer для работы с окном. Video Renderer подсоединяется к исходящему контакту Overlay Mixer'а.

Этот фильтр добавляется к графу фильтров автоматически при использовании приложением интерфейсов IDvdGraphBuilder и ICaptureGraphBuilder2 для создания графа. МГФ не добавляет автоматически Overlay Mixer в граф.

Замечание. Медиаподтипы, принимаемые входящим контактом 0, что описывается в следующей таблице, зависят от аппаратной части. Overlay Mixer не может определить, всегда ли поддерживается подтип, пока не создаст поверхность DirectDraw. Т.о., вышележащему фильтру для того, чтобы определить, поддерживается ли некоторый подтип, нужно произвести соединения с таким подтипом (Therefore, the only way for an upstream filter to determine whether a subtype is supported is to attempt a connection with that subtype).

СвойствоОписание
Интерфейсы фильтраIAMOverlayFX, IAMVideoDecimationProperties, IBaseFilter, IDDrawExclModeVideo, IKsPropertySet, IMediaPosition, IMediaSeeking, IMixerOCX, IQualProp, IVPNotify, IVPNotify2
Медиатипы входящего контактаСтарший тип: MEDIATYPE_VideoПодтипы:MEDIASUBTYPE_Overlay (только 0-вой контакт) форматы DirectDraw YUV: MEDIASUBTYPE_YUVxx (только 0 -вой контакт) форматы DirectDraw Video Accelaration: MEDIASUBTYPE_DVAxxx (только 0-вой контакт) RGB-форматы DirectDraw: MEDIASUBTYPE_RGBxx (все входящие контакты)Тип формата: Format_VIDEOINFO, Format_VIDEOINFO2
Интерфейсы входящего контактаIAMVideoAccelerator, IKsPin, IKsPropertySet, IMemInputPin, IMixerPinConfig, IMixerPinConfig2, IOverlay (только 0-вой контакт), IPin, IPinConnection, IQualityControl, IVPNotify, IVPNotify2
Медиатип исходящего контактаMEDIATYPE_Video, MEDIASUBTYPE_Overlay
Интерфейсы исходящего контактаIMediaPosition, IMediaSeeking, IPin, IQualityControl
CLSID фильтраCLSID_OverlayMixer
CLSID страницы свойств-
Исполнимый файлqdvd.dll
MeritMERIT_DO_NOT_USE
Категория фильтровCLSID_LegacyAmFilterCategory

Примечания

Overlay Mixer использует результирующие ключевые цвета (destination color keying) для смешивания видеоповерхностей с оверлеями. Оно (что оно?) переносит ключевой цвет и вторичное видео на первичную поверхность и посылает первичное видео на оверлейную поверхность. Видеокарта смешивает две эти поверхности в своем буффере кадра.

Приложения могут до некоторой степени управлять поведением Overlay Mixer'а путем использования интерфейса IMixerPinConfig2. Разработчики игр могут использовать Overlay Mixer для отображения видео в Direct Draw Exclusive Mode, как описано ниже в этом разделе. VMR-9, однако, предоставляет улучшенную поддержку для видео в играх. См. также Фильтры видеоотображения(Video Rendering Filters).

Информация, представленная далее, может быть полезной для разработчиков фильтров и разработчиков игр, которые хотят использовать Overlay Mixer в DirectShow Exclusive Mode.

Внутренние операции Overlay Mixer'а.

Overlay Mixer предоставляет входящий контакт для каждого входящего потока. Обычно их три: 0-вой контакт для видеоданных, и котакты 1-ин и 2-ва для 21-ой линии и DVD-подизображения. Внутри себя Overlay Mixer создает объект DirectDraw с первичной поверхностью, охватывающей весь десктоп, плюс оверлейную поверхность, прямоугольник которой определяется размерами, задаваемыми видеопотоком на 0-вом контакте. Если декодер не указывает ключевой цвет, Overlay Mixer использует ключевые цвета, заданные по умолчанию: темносерый (dark-gray) для более современных видеокарт и magenta для старых 256-цветных карт.

Замечание. Результаты неопределенны, если декодер шлет два вторичных видеопотока одновременно в одно место на поверхности оверлея. (Это иногда происходит с DVD, содержащим подизображение и line 21 streams). Видео может мерцать или отображать только один поток.

На Windows98SE и Windows2000 Overlay Mixer не поддерживает соединения видеопорта на второй монитор. Соединение контакта в этом случае завершится неудачей. Этого ограничения нет на Windows ME или Windows XP.

Соединение с вышележащим видеодекодером

Обычно входящие контакты Overlay Mixer'а соединяются с вышележащим видеодекодером. Первичный видеопоток должен быть подключен к 0-ому контакту. Потоки 21-ой линии или подизображения должны подключаться к 1-ому контакту или выше. Если декодер - программный, использующий исключительно главный процессор, для соединения с декодером через 0-вой контакт используется интерфейс IMemInputPin. Если декодер использует аппаратное ускорение, это соединение должно совершаться через интерфейс IAMVideoAccelerator. Эти два типа соединений взаимоисключающие.

Если декодер рисует напрямую на поверхности оверлея, он должен использовать интерфейс IOverlay 0-вого контакта и реализовать интерфейс IOverlayNotify.

Фильтры, являющиеся оболочками аппаратных декодеров, и соединяющиеся с Overlay Mixer'ом через видеопорт, должны реализовывать интерфейс IVPConfig. Overlay Mixer реализует интерфейс IVPNotify. Эти два интерфейса дают возможность декодеру указать оверлейные поверхности, требуемые им, и позволяют Overlay Mixer'у информировать декодер о местонахождении этих поверхностей в видеопамяти.

Overlay Mixer обеспечивает также правильное масштабирование прямоугольника видеовывода. Video capture involves certain issues with respect to scaling the preview image and capturing interleaved video frames. Если вы разрабатываете фильтр или WDM-драйвер для аппаратного устройства видеозахвата, смотрите для получение большего количества информации ссылки на IVPConfig и IVPNotify.

Overlay Mixer не используется с целбю захвата для USB или 1394. Он используется для видеозахвата с шины PCI.

Соединение с нижележащим фильтром видеоотображения

Overlay Mixer имеет исходящий контакт, соединяющийся с фильтром видеоотображения (Video Renderer). Video Renderer в этом случае не воспроизводит видео, он служит только для управления окном видеовывода.

Соединение контактов обычно использует интерфейс IOverlay, а не IMemInputPin. Video Renderer передает хэндл окна Overlay Mixer'у для выполнения DirectDraw-операций, которые заполняют изображением прямоугольник вывода. Приложение может управлять Video Renderer'ом используя интерфейсы IVideoWindow и IBasicVideo2, полученные у МГФ.

Исключительный режим DirectDraw

Эксклюзивный режим DirectDraw для Overlay Mixer'а дает возможность играм отображать видео в некоторой части экрана. В этом режиме Overlay Mixer отображает видео непосредственно на DirectDraw-поверхности, созданной игрой, а не использует окно, предоставляемое Video Renderer'ом. Это позволяет игре управлять цветовым ключом. Overlay Mixer предоставляет только один входящий контакт в эксклюзивном DirectDraw-режиме, что означает, что в нем никакое смешение с 21-ой линией или подизображением DVD выполнено быть не может.

Для использования Overlay Mixer'а в эксклюзивном режиме DirectDraw, нужно создать его экземпляр и запросить у него интерфейс IDDrawExclModeVideo перед построением графа фильтров. Затем следует вызвать метод IDDrawExclModeVideo::SetDDrawSurface  для указания поверхности DirectDraw для отображения. Одно важное ограничение этого режима состоит в том, что игра не дает доступа к действительным видеобитам. Если вы используете IDDrawExclModeVideo, ваше приложение создает первичную поверхность, а Overlay Mixer создает оверлейную поверхность.

Можно также использовать эксклюзивный режим DirectDraw для выполнения безоконного отображения, например, на веб-странице, но этого делать не рекомендуется, потому что Overlay Mixer не выполняет никакого смешивания в этом режиме. Это значит, что 21-ая линия или данные подизображения могут быть отображены (???). Для написания приложения для проигрывания DVD в безоконном режиме рекомендуется использовать MSWebDVD ActiveX .

Comments