Подробное проектирование для IHV и изготовителей оборудования (профиль камеры версии 2)
Чтобы помочь понять новую схему профиля камеры версии 2, мы начнем с простого объявления профиля и расчленяем его, чтобы понять отдельные разделы.
Мы берем гипотетическую камеру, которая поддерживает новый профиль высокой частоты кадров. Сначала мы определим некоторые гипотетические аппаратные ограничения для нашего устройства.
Для предварительного просмотра используется закрепление 0. В KSFILTER_DESCRIPTOR, определяемой драйвером камеры, при определении массива KSPIN_DESCRIPTOR_EX первым KSPIN_DESCRIPTOR_EX является дескриптор контакта предварительного просмотра. Аналогично, закрепление 1 — закрепление захвата, а закрепление 2 — контакт с фотографией.
Из-за аппаратных ограничений устройство не может обрабатывать масштабирование с частотой кадров 60 кадров/с или более. Поэтому потоки предварительного просмотра и записи должны иметь одинаковое разрешение.
Аналогичным образом устройство не может обрабатывать преобразование цветового пространства для 60 кадров/с или выше, поэтому подтип должен быть одинаковым между предварительным просмотром и записью.
Камера поддерживает потоковую передачу видео 4K 16x9 при 60 кадров/с. Камера также может 3840x2880@60fps (видео 4:3 при 60 кадров/с).
Камера не может предоставить никаких операций с фотографией при работе со 60 кадрами в/с.
В дополнение к профилю высокой частоты кадров мы объявляем профиль записи видео.
Профиль записи видео позволяет использовать любое сочетание типов мультимедиа, но без типов мультимедиа со значением более 30 кадров/с.
Профиль записи видео также поддерживает одну операцию с фотографиями (например, не последовательность фотографий).
Для объявления на основе INF в разделе DDInstall.Interfaces для публикации сведений профиля используется директива AddReg.
Каждому фильтру типа носителя закрепления должно быть присвоено имя записи реестра. Это имя должно быть MTF#, где # представляет целочисленное значение. Целочисленное значение не обязательно должно быть последовательным, просто уникальным, так как оно представляет именованное значение в реестре ОС.
Учитывая эти ограничения, можно объявить следующий профиль:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","BlockedControls",0,"VHDR;VPS;{E0766E84-36A2-4945-906D-092ECBD87445},2;WARM1"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"
; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"
OEMCameraProfileVersion
Чтобы включить поддержку профиля камеры версии 2, объявите версию профиля:
Запись OEMCameraProfileVersion определяет версию профиля и для этой редакции спецификации должна иметь значение 2:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
Если запись реестра OEMCameraProfileVersion отсутствует, а запись OEMCameraProfile присутствует, конвейер возвращается к схеме профиль камеры 1507.
Это обеспечивает обратную совместимость с существующими профилями камеры.
Если запись OEMCameraProfileVersion доступна, все существующие сведения о профиле камеры 1507 игнорируются и обрабатываются только профиль камеры версии 2.
Примечание. Если для записи OEMCameraProfileVersion задано значение 2, но не найдены объявления профиля камеры версии 2, профили не будут опубликованы.
После объявления все профили должны храниться в разделе реестра Профили в узле Интерфейс устройства.
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
Каждый профиль должен быть подразделом в разделе Profiles с идентификатором профиля.
Идентификатор профиля — это сочетание типа профиля и индекса профиля.
Тип профиля может быть одной из следующих строк или строкой {GUID}:
KSCAMERAPROFILE_VideoRecording
KSCAMERAPROFILE_HighQualityPhoto
KSCAMERAPROFILE_BalancedVideoAndPhoto
KSCAMERAPROFILE_VideoConferencing
KSCAMERAPROFILE_PhotoSequence
KSCAMERAPROFILE_FaceAuth_Mode
KSCAMERAPROFILE_HighFrameRate
KSCAMERAPROFILE_HDRWithWCGVideo
KSCAMERAPROFILE_HDRWithWCGPhoto
KSCAMERAPROFILE_VariablePhotoSequence
KSCAMERAPROFILE_VideoHDR8
Индекс профиля может иметь любое значение от 0 до 0x7FFFFFFF. Значения индекса с набором битов высокого порядка зарезервированы для внутреннего использования.
Базовый профиль камеры версии 2 разбит на две записи схемы main:
Ограничения профиля
Закрепление фильтров типов мультимедиа
Ограничение профиля
Ограничения профиля — это широкое объявление профиля, влияющее на обработку фильтров типа носителя pin. Это шесть поддерживаемых тегов. Они могут отображаться в любом порядке, разделенном ";":
Ограничение профиля | Описание |
---|---|
LRS | Разрешение блокировки по всем контактам. Все контакты, объявленные в профиле, должны иметь одинаковое разрешение при активности. |
LFR | Блокировка частоты кадров по всем контактам. Все контакты, объявленные в профиле, должны иметь одинаковую частоту кадров при активности. |
LST | Блокировка подтипа по всем контактам. Все контакты, объявленные в профиле, должны иметь один и тот же подтип, когда активен. |
AAR | Примените объявление профиля уровня пин-кода ко всем пропорциям. Фильтрация на основе разрешения выполняется с помощью продукта Ширина * Высота разрешения, и этот продукт используется в качестве значения для сравнения. Однако если тег AAR не задан, сравнение будет выполняться только для разрешений с одинаковыми пропорциями. |
DIS | Отключено. Если это ограничение используется для ограничения профиля, фильтр типа носителя закрепления игнорируется и будет рассматриваться как недопустимый синтаксис профиля. Этот тег не может быть объединен с другими тегами ограничения профиля. |
UAR | Разрешить произвольное сочетание пропорций разрешения между контактами. По умолчанию пропорции между контактами должны быть одинаковыми. Этот тег удаляет это ограничение по умолчанию. Примечание. Приложениям рекомендуется сохранять одинаковые пропорции между доступными контактами. |
Если тег UAR не задан в объявлении профиля, все пропорции между контактами должны быть одинаковыми. В частности, потоковая предварительная версия в 16:9 при съемке фотографии или потоковой передачи с контакта захвата в 4:3 не поддерживается. Попытки сделать это приведут к ошибке.
Обработка приведенного выше примера профиля:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
Ограничение профиля указывает, что для профиля [KSCAMERAPROFILE_HighFrameRate,0] разрешения и подтип во всех контактах должны быть одинаковыми. Это соответствует ограничению HW гипотетической камеры (без масштабирования и преобразования цветового пространства при выполнении со значением 60 кадров/с или выше).
Ограничения кодировщика
Необязательный набор ограничений профиля может содержать рекомендуемые параметры кодировщика для приложений, которые выбирают профиль для операций кодирования видео. Например, IHV/OEM может рекомендовать использовать HEVC вместо H264 для определенных систем, если тип носителя превышает предопределенное пороговое значение с точки зрения разрешения и /или частоты кадров.
Кроме того, поскольку кодировщик HW, присутствующий на компьютере, может обеспечить более оптимальную работу при настройке параметров кодирования, изготовитель оборудования может создать профиль с дополнительными "указаниями" для приложения.
Чтобы упростить эту поддержку, в любой профиль можно добавить следующие дополнительные ограничения.
Предпочтительный кодированный подтип
Ниже приведен список подтипов, которые являются предпочтительными кодировщиками:
eSPSubtype_H264
eSPSubtype_HEVC
Эти два ограничения являются взаимоисключающими. Может быть объявлен только один. Объявление обоих приведет к недопустимому профилю и будет отклонено.
При объявлении ограничения предпочтительного кодированного подтипа хранилище атрибутов MF IMFSensorProfile предоставляет объявленный предпочтительный кодированный подтип с атрибутом MF_MT_SUBTYPE.
Предпочтительный профиль кодировщика
Следующий список Предпочтительный профиль кодировщика соответствует перечислению eAVEncH264VProfile .
eSPProfile_Simple
eSPProfile_Base
eSPProfile_Main
eSPProfile_High
eSPProfile_422
eSPProfile_High10
eSPProfile_444
eSPProfile_Extended
eSPProfile_ScalableBase
eSPProfile_ScalableHigh
eSPProfile_MultiviewHigh
eSPProfile_StereoHigh
eSPProfile_ConstrainedBase
eSPProfile_UCConstrainedHigh
eSPProfile_UCScalableConstrainedBase
eSPProfile_UCScalableConstrainedHigh
eSPProfileH265_Main_420_8
eSPProfileH265_Main_420_10
eSPProfileH265_Main_420_12
eSPProfileH265_Main_422_10
eSPProfileH265_Main_422_12
eSPProfileH265_Main_444_8
eSPProfileH265_Main_444_10
eSPProfileH265_Main_444_12
eSPProfileH265_Monochrome_12
eSPProfileH265_Monochrome_16
eSPProfileH265_MainIntra_420_8
eSPProfileH265_MainIntra_420_10
eSPProfileH265_MainIntra_420_12
eSPProfileH265_MainIntra_422_10
eSPProfileH265_MainIntra_422_12
eSPProfileH265_MainIntra_444_8
eSPProfileH265_MainIntra_444_10
eSPProfileH265_MainIntra_444_12
eSPProfileH265_MainIntra_444_12
eSPProfileH265_MainStill_420_8
eSPProfileH265_MainStill_444_8
eSPProfileH265_MainStill_444_16
Приведенное выше объявление предпочтительных профилей кодировщика является взаимоисключающим. Может быть объявлен только один. Объявление нескольких профилей приведет к недопустимому профилю и будет отклонено.
При объявлении ограничения профиля предпочтительного кодировщика хранилище атрибутов MF IMFSensorProfile предоставляет объявленный профиль предпочтительного кодировщика с атрибутом MF_MT_MPEG2_PROFILE.
ПРИМЕЧАНИЕ. Профили eSPProfileH265 допустимы только для подтипов в кодировке HEVC.
Рекомендуемое число кадров B
Рекомендуемое ограничение числа BFrame предоставляет изготовителю оборудования способ указать рекомендуемое число кадров B для закодированного видео:
- eSPBFCount_X
Где X представляет число BFrame: например, eSPBFCount_0 обозначает число кадров 0 B.
При объявлении ограничения числа рекомендуемых BFrame хранилище атрибутов MF IMFSensorProfile предоставляет объявленное значение Recommended BFrame Count с атрибутом CODECAPI_AVEncMPVDefaultBPictureCount.
Рекомендуемая скорость передачи
Рекомендуемое ограничение скорости позволяет изготовителю оборудования указать как среднюю скорость кодирования (при использовании соответствующего режима управления скоростью кодирования), так и (или) максимальную скорость передачи:
eSPBitRate_XXXXX
eSPMaxBitRate_XXXXX
Эти два ограничения могут быть указаны независимо или вместе. XXXXX представляет скорость передачи в Кбит/с. Например, eSPBitRate_5000 представляет 5 000 000 бит в секунду.
ESPBitRate_XXXXX, если он указан изготовителем оборудования, будет предоставляться через хранилище атрибутов MF IMFSensorProfile через атрибут CODECAPI_AVEncCommonMeanBitRate.
ESPMaxBitRate_XXXXX, указанные изготовителем оборудования, будут доступны через хранилище атрибутов MF IMFSensorProfile через CODECAPI_AVEncCommonMaxBitRate.
Пример ограничения кодировщика
В следующем примере INF показано, как изготовитель оборудования может объявить ограничения кодировщика:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","Constraint",0,"eSPSubtype_HEVC;eSPProfile_Main;eSPBFCount_1;eSPBitRate_20000;eSPMaxBitRate_50000"
Приведенный выше пример ограничения кодировщика приведет к хранилищу атрибутов MF профиля KSCAMERAPROFILE_VIDEORECORDING,0 IMFSensorProfile (см. описание API ниже) с различными атрибутами кодировщика следующим образом:
HRESULT
CheckEncoderParameters(
_In_ IMFSensorProfile* pProfile
)
{
HRESULT hr = S_OK;
ComPtr<IMFAttributes> spAttributes;
GUID guidSubtype = GUID_NULL;
UINT32 eProfile = eAVEncH264VProfile_unknown;
UINT32 uiBFrameCount = 0;
UINT32 uiBitRate = 0;
UINT32 uiMaxBitRate = 0;
if (nullptr == pProfile)
{
return E_INVALIDARG;
}
RETURN_IF_FAILED (pProfile->QueryInterface(IID_PPV_ARGS(&spAttributes)));
if (SUCCEEDED(spAttributes->GetGUID(MF_MT_SUBTYPE, &guidSubtype)))
{
if (guidSubtype == MFVideoFormat_HEVC)
{
// Use HEVC codec.
}
else
{
// Use H264 codec.
}
}
if (SUCCEEDED(spAttributes->GetUINT32(MF_MT_MPEG2_PROFILE, &eProfile)))
{
// Use the eProfile provided for encoder profile.
}
if (SUCCEEDED(spAttributes->GetUINT32(CODECAPI_AVEncMPVDefaultBPictureCount, &uiBFrameCount)))
{
// This is the BFrame count...
}
if (SUCCEEDED(spAttributes->GetUINT32(CODECAPI_AVEncCommonMeanBitRate, &uiBitRate)))
{
// This is the average bit rate...
}
if (SUCCEEDED(spAttributes->GetUINT32(CODECAPI_AVEncCommonMaxBitRate, &uiMaxBitRate)))
{
// This is the max bit rate...
}
return hr;
}
На поверхности API WinRT эти же атрибуты можно получить с помощью CameraProfile.Properties (см. описание API WinRT ниже).
Заблокированные элементы управления
Заблокированные элементы управления позволят OEM/IHV выборочно отключать определенные элементы управления камерой на основе выбранного профиля:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","BlockedControls",0,"VHDR;PHSEQ;{E0766E84-36A2-4945-906D-092ECBD87445},2;WARM1"
В приведенном выше примере KSCAMERAPROFILE_HighFrameRate,0 объявляет, что видео HDR (VHDR), последовательность фотографий (PHSEQ) — пользовательский элемент управления KSPROPERTY. Set = {E0766E84-36A2-4945-906D-092ECBD87445} и KSPROPERTY.Id = 2, а горячее начало на pin1 не поддерживается.
Если выбран этот профиль, конвейер явно блокирует выдачу этих элементов управления драйверу DMFT или камеры. Это позволяет драйверу DMFT и камеры предоставлять поддержку для всех элементов управления камерой, а конвейер гарантирует, что приложение, использующее профиль камеры, не будет пытаться коснуться заблокированных элементов управления.
Заблокированные элементы управления можно определить с помощью одного из тегов ниже для определенных элементов управления камерой или использовать формат {GUID},Id.
Тег | Описание элемента управления |
---|---|
PHSEQ | Расширенный элемент управления камерой — последовательность фотографий Примечание. Блокировка последовательности фотографий также блокирует переменную последовательность фотографий. |
ТЕПЛЫЙ# | Расширенный элемент управления камерой — элемент управления "Теплый запуск". # представляет идентификатор закрепления, для которого отключается элемент управления "Теплый запуск". |
СЦЕНЫ | Расширенное управление камерой — режим сцены. |
ФАКЕЛ | Расширенное управление камерой — режим факела. |
ВСПЫШКИ | Расширенное управление камерой — режим вспышки. |
ISO | Расширенный элемент управления камерой — ISO |
EVCOMP | Расширенное управление камерой — компенсация ev |
WBAL | Расширенный элемент управления камерой — баланс белого |
ВЫСТАВКАХ | Расширенное управление камерой — экспозиция |
ФОКУС | Расширенный элемент управления камерой — фокус |
Рентабельность инвестиций (ROI) | Расширенное управление камерой — рентабельность инвестиций |
EXTZOOM | Расширенный элемент управления камерой — масштаб |
СОВЕТЫ | Расширенный элемент управления камерой — ISO Advanced |
VIDST | Расширенное управление камерой — стабилизация видео |
ЛИЦЕО | Расширенное управление камерой — распознавание лиц |
VHDR | Расширенный элемент управления камерой — видео HDR |
OIS | Расширенное управление камерой — оптическая стабилизация изображения |
ADVPHOTO | Расширенный элемент управления камерой — расширенная фотография |
FACEAUTH | Расширенное управление камерой — проверка подлинности лиц |
БЕЗОПАСНОСТЬ | Расширенное управление камерой — безопасный режим |
VFP | Расширенное управление камерой — VFR |
Помимо расширенных элементов управления камерой профили также могут блокировать устаревшие элементы управления в PROPSETID_VIDCAP_VIDEOPROCAMP и PROPSETID_VIDCAP_CAMERACONTROL наборах элементов управления. PROPSETID_VIDCAP_VIDEOPROCAMP элементы управления можно заблокировать с помощью:
VIDPROC#
Где # представляет идентификатор элемента управления:
KSPROPERTY_VIDEOPROCAMP_BRIGHTNESS // 0
KSPROPERTY_VIDEOPROCAMP_CONTRAST // 1
KSPROPERTY_VIDEOPROCAMP_HUE // 2
KSPROPERTY_VIDEOPROCAMP_SATURATION // 3
KSPROPERTY_VIDEOPROCAMP_SHARPNESS // 4
KSPROPERTY_VIDEOPROCAMP_GAMMA // 5
KSPROPERTY_VIDEOPROCAMP_COLORENABLE // 6
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE // 7
KSPROPERTY_VIDEOPROCAMP_BACKLIGHT_COMPENSATION // 8
KSPROPERTY_VIDEOPROCAMP_GAIN // 9
KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER // 10
KSPROPERTY_VIDEOPROCAMP_DIGITAL_MULTIPLIER_LIMIT // 11
KSPROPERTY_VIDEOPROCAMP_WHITEBALANCE_COMPONENT // 12
KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY // 13
Например, VIDPROC13 блокирует элемент управления Частота линии питания.
Аналогичным образом PROPSETID_VIDCAP_CAMERACONTROL можно заблокировать следующим образом:
CAMCTRL#
Где # представляет идентификатор элемента управления:
KSPROPERTY_CAMERACONTROL_PAN // 0
KSPROPERTY_CAMERACONTROL_TILT // 1
KSPROPERTY_CAMERACONTROL_ROLL // 2
KSPROPERTY_CAMERACONTROL_ZOOM // 3
KSPROPERTY_CAMERACONTROL_EXPOSURE // 4
KSPROPERTY_CAMERACONTROL_IRIS // 5
KSPROPERTY_CAMERACONTROL_FOCUS // 6
KSPROPERTY_CAMERACONTROL_SCANMODE // 7
KSPROPERTY_CAMERACONTROL_PRIVACY // 8
KSPROPERTY_CAMERACONTROL_PANTILT // 9
KSPROPERTY_CAMERACONTROL_PAN_RELATIVE // 10
KSPROPERTY_CAMERACONTROL_TILT_RELATIVE // 11
KSPROPERTY_CAMERACONTROL_ROLL_RELATIVE // 12
KSPROPERTY_CAMERACONTROL_ZOOM_RELATIVE // 13
KSPROPERTY_CAMERACONTROL_EXPOSURE_RELATIVE // 14
KSPROPERTY_CAMERACONTROL_IRIS_RELATIVE // 15
KSPROPERTY_CAMERACONTROL_FOCUS_RELATIVE // 16
KSPROPERTY_CAMERACONTROL_PANTILT_RELATIVE // 17
KSPROPERTY_CAMERACONTROL_FOCAL_LENGTH // 18
KSPROPERTY_CAMERACONTROL_AUTO_EXPOSURE_PRIORITY // 19
Закрепление фильтра типов мультимедиа
Переходя к образцу профиля, мы увидим фильтр типа носителя pin для профиля высокой частоты кадров:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"
В приведенном выше разделе Pin0 (контакт предварительного просмотра) профиля высокой частоты кадров мы разрешаем любое разрешение и частоту кадров, доступные для контакта. Для нашего гипотетического устройства драйвер не будет предоставлять частоту кадров, превышающую 30 кадров/с для контакта предварительного просмотра.
Числа закрепления при объявлении с помощью INF соответствуют порядковому номеру индекса на основе 0 структуры KSPIN_DESCRIPTOR_EX, определенной в структуре KSFILTER_DESCRIPTOR, объявляемой драйверами мини-портов AVStream.
Чтобы интерпретировать фильтр типа носителя pin и соответствующий набор фильтров, необходимо определить схему синтаксиса:
В этом определении строки используется следующая схема фильтра типа носителя pin. Если показаны [], включенная строка является необязательной, в противном случае вся строка, объявленная в синтаксисе, является обязательной (синтаксис ограничения не учитывает регистр):
PinMediaTypeFilter : Pin#:[(!)]|(FilterSet0)(FilterSet1)...(FilterSetN)
FilterSet : [!](ResolutionFilter;FrameRateFilter;FourCCFilter)
Resolution : RES[==|<=|>=|!=]Width,Height
FrameRate : FRT[==|<=|>=|!=]Num,Denom
Subtype : SUT[==|!=]SubtypeValue
SubtypeValue : <See below>
SubtypeValue может принимать форму одного шестнадцатеричного представления значения Four CC (например, 0x3231564E == NV12), {GUID} в случае пользовательского типа носителя (открытые или закрываемые фигурные скобки должны иметь вид: {55D24460-45B7-450E-829B-91A94FF84180} или тег well know (NV12, YUY2 и т. д.)).
Представление {GUID} также может использоваться для подтипов MFVideoFormat_*, если известный подтип не имеет указанного тега.
Для нашего примера:
Pin0:((RES==;FRT==;SUT==ALL))
Выполняет синтаксический анализ:
Resolution : Ignore all resolution checks (implies all resolutions are allowed)
Frame rate : Ignore all frame rate checks (implies all frame rates are allowed)
Subtype : All
Это семантически: "Разрешить все типы мультимедиа".
Определение отдельных тегов разрешения, частоты кадров и подтипов см. в разделе Фильтр частоты кадров ниже.
Для pin1 (закрепление захвата) объявление частота кадров имеет другое значение:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"
Выполняет синтаксический анализ:
Resolution : Ignore all resolution checks (implies all resolutions are allowed)
Frame rate : Equal or greater than 60,1
Subtype : All
В этом профиле для Pin1 разрешены только типы мультимедиа с частотой кадров 60 кадров/с или более.
Пока для pin2 (контакт с фотографией) недоступен:
[SampleDriver.CameraInterface.AddReg]
HKR,,"OEMCameraProfileVersion",0x00010001,2
; This is our High Frame Rate Profile.
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","Constraint",0,"LRS;LST"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF1",0,"Pin1:((RES==;FRT>=60,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_HighFrameRate,0","MTF2",0,"Pin2:(!)"
Как следует из синтаксиса, фильтр типа носителя pin может быть при необходимости одним объявлением (!), которое подразумевает отсутствие поддерживаемого формата носителя (контакты без поддерживаемых типов мультимедиа будут скрыты для клиента).
Переходя к профилю записи видео, у нас нет ограничений на контакт предварительного просмотра, так как наша гипотетическая камера предоставляет предварительный просмотр только 30 кадров/с только типы мультимедиа, которые гарантированно будут параллельными в обоих сценариях записи видео и высокой частоты кадров.
; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","BlockedControls",0,"PHSEQ"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"
Но для закрепления захвата необходимо ограничить это до 30 кадров/с типов мультимедиа, так как мы не можем поддерживать более высокую частоту кадров для различных разрешений между операциями предварительного просмотра и захвата или фото.
; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","BlockedControls",0,"PHSEQ"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"
Это делается с помощью тега Frame Rate Equal of Less Than (FRT<=) и указания частоты кадров 30 кадров/с.
Pin1:((RES==;FRT<=30,1;SUT==ALL))
Выполняет синтаксический анализ:
Resolution : Ignore all resolution checks (implies all resolutions are allowed)
Frame rate : Equal or less than 30,1
Subtype : All
Для маркера Photo мы объявляем отсутствие поддержки последовательности фотографий, объявив BlockedControls с PHSEQ в качестве элемента управления, который будет запрещен.
; Declare the Video Recording Profile here.
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","BlockedControls",0,"PHSEQ"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF0",0,"Pin0:((RES==;FRT==;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF1",0,"Pin1:((RES==;FRT<=30,1;SUT==ALL))"
HKR,"Profiles\KSCAMERAPROFILE_VideoRecording,0","MTF2",0,"Pin2:((RES==;FRT==;SUT==ALL))"
Набор фильтров
В предыдущем разделе мы рассмотрели несколько наборов фильтров и объяснили, что представляют некоторые из этих строк схемы. На этом этапе необходимо описать синтаксис схемы набора фильтров для дальнейшего обсуждения.
Каждый набор фильтров состоит из определенного набора объявлений для разрешения, частоты кадров и подтипа. Это трио объявления в указанном порядке является обязательным для допустимого набора фильтров.
Фильтр типа закрепления может состоять из нескольких записей фильтра:
PinMediaTypeFilter : Pin#:[(!)]|(FilterSet0)(FilterSet1)...(FilterSetN)
FilterSet : [!](ResolutionFilter;FrameRateFilter;SubtypeFilter)
Если набор фильтров не соответствует этой схеме, все объявление профиля отклоняется.
Все строки схемы профиля не учитывают регистр.
Каждый фильтр должен быть разделен ";", а трио фильтр разрешения, фильтр частоты кадров и фильтр подтипов должны быть ограничены открытой или закрытой скобкой.
Еще один пример набора фильтров:
; Allow only 1080p@60fps for any media subtype.
Pin0:((RES==1920,1080;FRT==60,1;SUT==ALL))
; Allow either 1080p@60fps or 1080p@120fps for any subtype but nothing else.
Pin0:((RES==1920,1080;FRT==60,1;SUT==ALL))((RES==1920,1080;FRT==120,1;SUT==ALL))
Как показано во втором примере выше, для нескольких наборов фильтров на контакте сравнение выполняется с помощью логического ИЛИ двух наборов фильтров. Например, если тип носителя соответствует какму-либо из двух наборов фильтров, это разрешено.
Примечание. Чтобы упростить чтение объявления, набор фильтров можно описать в нескольких строках. Для этого у них должен быть один и тот же Pin# для группировки:
; Allow only 1080p@60fps or 1080p@120fps
Pin0:((RES==1920,1080;FRT==60,1;SUT==ALL))
Pin0:((RES==1920,1080;FRT==120,1;SUT==ALL))
Семантически идентичен описанному выше объявлению. Однако каждая строка должна иметь уникальную запись MTF#.
Disabled Pin
Фильтр разрешения
Как определено в терминах документа, фильтр разрешения определяет фильтрацию на основе атрибута MF_MT_FRAME_SIZE IMFMediaType.
Синтаксис фильтра разрешения:
Resolution : RES[==|<=|>=|!=]Width,Height
Атрибут фильтра разрешения
Атрибут фильтра разрешения использует строку RES. Эта строка не учитывает регистр.
Операторы сравнения фильтров разрешения
Ниже приведены поддерживаемые операторы.
Операторы сравнения | Описание |
---|---|
== | Разрешает, если разрешение равно объявленному разрешению. Если набор фильтров является набором фильтров исключений, этот тег будет запрещен, если разрешение равно объявленному разрешению. Примечание. Если в объявлении используется оператор == и значение фильтра пусто (например, RES==;), атрибут MF_MT_FRAME_SIZE игнорируется. |
<= | Разрешить, если разрешение равно или меньше объявленного разрешения. Сравнение разрешений выполняется на основе общего количества пикселей (произведение ширины *высота) и на основе пропорций. Если AAR объявлен в ограничении профиля, общее количество пикселей применяется ко всем пропорциям. В противном случае — только соответствующие пропорции. Если набор фильтров является набором фильтров исключений, этот тег будет запрещен, если разрешение равно или меньше объявленному разрешению. |
>= | Разрешить, если разрешение равно или больше объявленного разрешения. Сравнение разрешения выполняется на основе общего количества пикселей (произведение ширины * высота) и на основе пропорций. Если AAR объявлен в ограничении профиля, общее количество пикселей применяется ко всем пропорциям. В противном случае — только соответствующие пропорции. Если набор фильтров является набором фильтров исключений, этот тег будет запрещен, если разрешение равно или больше объявленного разрешения. |
!= | Разрешить, если разрешение НЕ равно объявленному разрешению. Если набор фильтров является набором фильтров исключений, этот тег будет запрещен, если разрешение НЕ равно объявленному разрешению. |
Значение фильтра разрешения
Значения ширины и высоты фильтра разрешения должны быть в десятичном формате, разделенном запятыми (",") без пробелов:
; 1080p only.
RES==1920,1080
В следующем примере происходит следующее:
; 1080p and any lower resolution.
RES<=1920,1080
Будет соответствовать разрешению 16:9, равному или меньше 1080p, только если тег AAR не объявлен в ограничении профиля. Однако если объявляется AAR, он соответствует всем разрешениям, произведение которых Ширина * Высота равно или меньше (1920 * 1080 = 2073600).
Пример:
Если AAR не объявлен, эта запись соответствует 720p, но не 1280x960.
Если объявлен AAR, эта запись соответствует 720p, 1280x960 и всем более низким разрешениям.
Если AAR не объявлен для обеспечения соответствия выборочного разрешения для пропорций 16:9 и 4:3, можно использовать несколько наборов фильтров:
; This will match any 16:9 resolution of 1080p or lower
; and match any 4:3 resolution of 800x600 or lower.
; Effectively skipping 1280x960.
((RES<=1920,1080;FRT==;SUT==ALL))((RES<=800,600;FRT==;SUT==ALL))
Чтобы соответствовать всем разрешениям, укажите значение , равное или больше 0,0.
; Match all resolutions.
RES>=0,0
Фильтр частоты кадров
Как определено в терминах документа, фильтр частоты кадров определяет способ фильтрации на основе атрибута MF_MT_FRAME_RATE IMFMediaType.
Синтаксис фильтра частоты кадров:
FrameRate : FRT[==|<=|>=|!=]Num,Denom
Атрибут фильтра частоты кадров
Атрибут фильтра частоты кадров использует строку FRT. Эта строка не учитывает регистр.
Операторы сравнения фильтров частоты кадров
Ниже приведены поддерживаемые теги частоты кадров:
Операторы сравнения | Описание |
---|---|
== | Разрешить, если частота кадров равна объявленной частоте кадров. Если набор фильтров является набором фильтров исключений, этот тег будет запрещен, если частота кадров равна объявленной частоте кадров. Примечание. Если в объявлении используется оператор == и значение фильтра пусто (например, FRT==;), атрибут MF_MT_FRAME_RATE игнорируется. |
<= | Разрешить, если частота кадров равна или меньше объявленной частоты кадров. Если набор фильтров является набором фильтров исключений, этот тег будет запрещен, если частота кадров равна или меньше объявленной частоте кадров. |
>= | Разрешить, если частота кадров равна или больше объявленной частоты кадров. Если набор фильтров является набором фильтров исключений, этот тег будет запрещен, если частота кадров равна или больше объявленной частоте кадров. |
!= | Разрешить, только если частота кадров НЕ равна объявленной частоте кадров. Если набор фильтров является набором фильтров исключений, этот тег будет запрещен, если частота кадров НЕ равна объявленной частоте кадров. |
; Allow 30fps.
FRT==30,1
; Allow 30fps or lower.
FRT<=30,1
; Allow 60fps or higher.
FRT>=60,1
; Match for all frame rate.
FRT>=0,0
FRT==; и FRT>=0,0 имеют незначительные семантические различия.
FRT==; : Ignore all frame rate checks for the Filter Set.
FRT>=0,0 : Match any frame rate.
Разница между FRT==; и FRT>=0,0 — первый имеет одинаковое значение как для набора фильтров включения, так и для набора фильтров исключений. Тогда как значение FRT>=0,0 будет меняться в зависимости от того, является ли это набором фильтров включения или набором фильтров исключений.
Описание набора фильтров исключений см. в разделе Набор фильтров.
Фильтр подтипов
Фильтр подтипов определяет способ фильтрации на основе атрибута MF_MT_SUBTYPE IMFMediaType.
Синтаксис фильтра подтипов:
Subtype : SUT[==|!=]SubtypeValue
SubtypeValue : <See Below>
Атрибут фильтра подтипа
Атрибут фильтра подтипа использует строку SUT. Эта строка не учитывает регистр.
Операторы сравнения фильтров подтипов
Поддерживаются следующие операторы сравнения:
Операторы сравнения | Описание |
---|---|
== | Разрешить, если подтип равен объявленному подтипу. Если набор фильтров является набором фильтров исключений, этот тег будет запрещен, если подтип равен объявленному подтипу. Примечание. Если в объявлении используется оператор == и значение фильтра пусто (например, FRT==;), атрибут MF_MT_SUBTYPE игнорируется. |
!= | Разрешить, если подтип НЕ равен объявленному подтипу. Если набор фильтров является набором фильтров исключений, этот тег будет запрещен, если подтип НЕ равен объявленному подтипу. |
Операторы Equal или Less Than (<=) и Equal или Больше (>=) не поддерживаются для фильтра подтипов. Если он объявлен, профиль является недопустимым и отклоняется конвейером.
Значение фильтра подтипа
Значение фильтра подтипа может быть шестнадцатеричным представлением значения FourCC, строковым объявлением GUID, если используется пользовательский тип носителя (также может использоваться известный GUID подтипа MFVideoFormat) или тег известного подтипа (см. список ниже).
; Match any media type which has NV12 subtype
SUT==0x3231564E
; Same as above…
SUT=={3231564E-0000-0010-8000-00AA00389B71}
; Still the same (and the recommended declaration).
SUT==NV12
; Allow any subtype except for NV12
SUT!=0x3231564E
; Another way to say the same thing
SUT!={3231564E-0000-0010-8000-00AA00389B71}
; Yet another (and recommended).
SUT!=NV12
; Valid syntax. Profile allow/disallow should ignore
; the subtype and only check against resolution and
; frame rate.
SUT==;
Значение 0/GUID_NULL и ALL имеет особое значение.
Это означает "Все четыре значения CC".
; Match all subtypes
SUT==0
; Another way to say the same thing
SUT=={00000000-0000-0000-0000-000000000000}
; Yet another (and recommended).
SUT==ALL
Семантически SUT==; и SUT==0 имеют несколько разных значений.
При использовании в фильтре включения они имеют тот же эффект: Разрешить любой подтип. Но при использовании в фильтре исключения SUT==0 означает исключение всех подтипов. Тем не менее, поскольку это имеет тот же эффект, что и пометка всего закрепления как отключенного (!), нет причин использовать SUT==0 в фильтре исключения.
Известные теги подтипов
Теги |
---|
RGB32 |
ARGB32 |
RGB24 |
L8 |
L16 |
D16 |
AI44 |
AYUV |
YUY2 |
YVYU |
YVU9 |
UYVY |
NV11 |
NV12 |
YV12 |
I420 |
IYUV |
Y210 |
Y216 |
Y410 |
Y416 |
Y41P |
Y41T |
Y42T |
P210 |
P216 |
P010 |
P016 |
Версия 210 |
Версия 216 |
V410 |
MP43 |
MP4S |
M4S2 |
MP4V |
WMV1 |
WMV2 |
WMV3 |
WVC1 |
MSS1 |
MSS2 |
MPG1 |
DVSL |
DVSD |
DVHD |
DV25 |
DV50 |
DVH1 |
DVC |
H264 |
H265 |
MJPG |
420O |
HEVC |
HEVS |
VP80 |
VP90 |
ORAW |
H263 |
VP10 |
AV01 |
JPEG |
Набор фильтров исключений
Все примеры набора фильтров на данный момент являются инклюзивными записями фильтра. Они семантически "если тип мультимедиа соответствует критериям, разрешите клиенту использовать тип мультимедиа".
Отсутствие в обсуждении эквивалентно "если тип мультимедиа соответствует критериям, запретите доступ к типу мультимедиа для клиента".
Для этого нам нужен набор фильтров исключений.
Если перед набором фильтров стоит "!":
; Allow everything except 1080p@60fps of any subtype.
Pin0:(!(RES==1920,1080;FRT==60,1;SUT==))
Это набор фильтров исключений. Набор фильтров исключений, если тип носителя совпадает, будет исключен из списка доступных типов носителей.
Объявление нескольких наборов фильтров приведет к тому, что проверки ограничений для каждого набора фильтров будут логически или друг с другом.
; Allow everything except 1080p@60fps or 1080p@120fps
Pin0:(!(RES==1920,1080;FRT==60,1;SUT==))(!(RES==1920,1080;FRT==120,1;SUT==))
Исключение и набор фильтров включения
Как показано ниже, набор фильтров может быть набором фильтров включения или набором фильтров исключений. Допускается смешивание различных наборов фильтров, но в зависимости от типа добавляемого набора фильтров значение фильтра типа носителя может измениться:
Если для фильтра типов мультимедиа закреплений объявляются только записи фильтра фильтра включения, любой тип мультимедиа, не соответствующий одной из записей фильтра, будет исключен из доступных типов мультимедиа.
Если для фильтра типа закрепления мультимедиа объявлены только записи фильтра исключений, любой тип мультимедиа, который не соответствует одной из записей фильтра, будет включен из доступных типов мультимедиа.
Если для фильтра типа носителя закреплений объявлены записи фильтра включения и исключения, включается любой тип мультимедиа, соответствующий набору фильтров включения, если он также не соответствует набору фильтров исключений. Набор фильтров исключений заменяет набор фильтров включения.
Чтобы проиллюстрировать этот пример, предположим, что для Pin0 доступны следующие типы носителей:
1920x1080@60fps, NV12
1920x1080@30fps, NV12
1280x720@60fps, NV12
1280x720@30fps, NV12
640x360@60fps, NV12
640x360@30fps, NV12
Если объявить только набор фильтров включения, выполните приведенные ниже действия.
; Allow all media types 720p and lower resolution whose frame
; rate is 30fps or lower. for example, no 60fps is allowed and no
; 1080p is allowed.
Pin0:((RES<=1280,720;FRT<=30,1;SUT==ALL))
Если мы объявляем только набор фильтров исключений, выполните приведенные ниже действия.
; Disallow 1080p resolutions or higher or any media types with
; 60fps or higher. Ignore Subtypes.
Pin0:(!(RES>=1920,1080;FRT>=60,1;SUT==))
Если объявить набор фильтров включения и исключения, выполните приведенные ниже действия.
; Allow all media types except for 640x360@60fps NV12.
Pin0:((RES<=1920,1080;FRT<=60,1;SUT==ALL))
Pin0:(!(RES==640,360;FRT==60,1;SUT==NV12))
Примечание. Из-за правила 2 в инструкции обработки фильтра последний пример "Разрешить все типы мультимедиа, кроме 640x360@60fps NV12" может быть для нашего примера Pin0:
; Allow all media types except for 640x360@60fps NV12.
Pin0:(!(RES==640,360;FRT==60,1;SUT==NV12))
Так как присутствует только один набор фильтров исключений, разрешены все типы мультимедиа, за исключением типов носителей, соответствующих набору фильтров исключений.
Чтобы проиллюстрировать записи фильтра включения и исключения, ознакомьтесь с еще несколькими примерами:
; Allow any media type that is 30fps.
Pin0:((RES==;FRT==30,1;SUT==ALL))
; Allow any media type that is NV12.
Pin0:((RES==;FRT==;SUT==0x3132564E))
; Allow any media type, except for 4K@60fps of any subtype.
Pin0:(!(RES==3840,2160;FRT==60,1;SUT==))
; Allow any media type less than equal to 4K resolution,
; except for YUY2 subtypes.
Pin0:((RES<=3840,2160;FRT>=0,0;SUT==ALL))
Pin0:(!(RES==;FRT==;SUT==YUY2))
; Allow any media type equal or less than 4K
; and equal or less than 60fps
Pin0:((RES<=3840,2160;FRT<=60,1;SUT==ALL))
; Allow any NV12 and YUY2 media types
Pin0:((RES==;FRT>=0,0;SUT==NV12))((RES==;FRT>=0,0;SUT==YUY2))
; Allow any except for MJPG and H264
Pin0:((RES==;FRT>=0,0;SUT!=MJPG))((RES==;FRT>=0,0;SUT!=H264))
; Allow any but exclude only 4K@60fps NV12 & 3840x2880@60fps NV12
Pin0:(!(RES==3840,2160;FRT==60,1;SUT==NV12))(!(RES==3840,2880;FRT==60,1;SUT==NV12))