Руководство по реализации камеры usb Video Class (UVC)

Начиная с Windows 10, для устройств, соответствующих спецификации КЛАССА ВИДЕО USB (версии 1.0–1.5), предоставляется драйвер для входящих видеоклассов (UVC). Этот драйвер поддерживает цветные камеры и камеры типа датчика. В этом документе описывается, как предоставить приложениям определенные возможности камеры, совместимой с UVC, с помощью драйвера папки "Входящие".

Терминология

Ключевое слово Описание
UVC Класс USB Video
Драйвер UVC драйвер USBVideo.sys, поставляемый с ОС
IR Инфракрасная связь
Камера для цветной съёмки Камера, которая выводит цветовые потоки (например, RGB или YUV-камеры);
Камера датчика Камера, которая выводит нецветные потоки (например, камеры IR или Depth).
BOS Хранилище двоичных объектов устройств
Дескриптор MS OS 2.0 Дескриптор возможностей устройства BOS для конкретной платформы Майкрософт

Камеры датчика

Windows поддерживает две категории камер. Одна из них является цветовой камерой, а другая — камерой, не являющейся датчиком цвета. Камеры RGB или YUV классифицируются как цветные камеры, а нецветные камеры, такие как серая шкала, камеры IR и Глубины классифицируются как камеры датчика. Драйвер UVC поддерживает оба типа камер. Рекомендуется указать значение встроенного ПО камеры, в зависимости от которого драйвер UVC будет регистрировать камеру в одной или обеих поддерживаемых категориях.

Камера, поддерживающая только цветные типы форматов, должна быть зарегистрирована в KSCATEGORY_VIDEO_CAMERA. Камера, поддерживающая типы форматов ir или Depth, должна быть зарегистрирована в KSCATEGORY_SENSOR_CAMERA. Камера, поддерживающая как цветные, так и другие типы форматов, должна быть зарегистрирована в разделе KSCATEGORY_VIDEO_CAMERA и KSCATEGORY_SENSOR_CAMERA. Эта классификация помогает приложениям выбрать камеру, с которой они хотят работать.

Камера UVC может указать предпочтительный параметр категории с помощью атрибутов SensorCameraMode и SkipCameraEnumeration в дескрипторе BOS MS OS 2.0 , подробно описанном в следующих разделах.

Атрибут SensorCameraMode принимает значение 1 или 2.

Значение 1 зарегистрирует устройство в KSCATEGORY_SENSOR_CAMERA. Кроме того, укажите значение 1 для SkipCameraEnumeration , чтобы сделать камеру доступной для приложений, которые ищут только камеры датчика. Камера, которая предоставляет только типы мультимедиа камеры датчика, должна использовать это значение.

Значение 2 для SensorCameraMode зарегистрирует устройство в KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA. Это делает камеру доступной для приложений, которые ищут датчики и цветные камеры. Это значение следует использовать в камере, которая предоставляет как камеру датчика, так и тип мультимедиа цветной камеры.

Мы рекомендуем указать указанное выше значение реестра с помощью дескриптора BOS. Пример дескриптора BOS с дескриптором MS OS 2.0 см. в разделе Пример составного устройства ниже.

Если вам не удается обновить встроенное ПО устройства, как описано выше, можно использовать настраиваемый INF-файл и указать, что камера должна быть зарегистрирована как камера датчика, указав значения для SensorCameraMode и SkipCameraEnumeration следующим образом:

Пользовательский INF-файл (на основе драйвера UVC для папки "Входящие") должен содержать следующие записи AddReg:

SensorCameraMode: REG_DWORD: 1 (для регистрации в качестве камеры датчика)

SkipCameraEnumeration: REG_DWORD: 1 (сделать его доступным только для приложений IR)

Ниже приведен пример настраиваемого раздела INF.

[USBVideo.NT.HW]
AddReg=USBVideo.HW.AddReg

[USBVideo.HW.AddReg]
HKR,, SensorCameraMode, 0x00010001,1      ; places the value under device HW
                                          ; Registry key

HKR,, SkipCameraEnumeration, 0x00010001,1 ; This makes the camera available
                                          ; only for application looking for
                                          ; IR cameras

Если атрибуты SensorCameraMode и SkipCameraEnumeration не указаны во встроенном ПО или INF, камера регистрируется как цветная камера и будет видна только для приложений, поддерживающих цветную камеру.

Поток IR

Драйвер UVC для windows inbox поддерживает камеры, которые захватывают сцену в формате YUV и передают пиксельные данные по USB как несжатые yuv или сжатые кадры MJPEG.

В дескрипторе формата потокового видео необходимо указать идентификаторы GUID следующего типа формата, как определено в файле заголовка WDK ksmedia.h:

Тип Описание
KSDATAFORMAT_SUBTYPE_L8_IR 8-разрядная плоскость luma без сжатия. Этот тип сопоставляется с MFVideoFormat_L8.
KSDATAFORMAT_SUBTYPE_L16_IR 16-разрядная плоскость luma без сжатия. Этот тип сопоставляется с MFVideoFormat_L16.
KSDATAFORMAT_SUBTYPE_MJPG_IR Сжатые кадры MJPEG. Media Foundation преобразует его в несжатые кадры NV12 и использует только плоскость luma.

Если идентификаторы GUID этих типов формата указаны в поле guidFormat дескриптора кадра, конвейер захвата Media Foundation помечает поток как поток IR. Приложения, написанные с помощью API FrameReader Media Foundation, смогут использовать поток IR. Конвейер для потоков IR не поддерживает масштабирование или преобразование кадров IR.

Поток, предоставляющий типы форматов IR, не должен предоставлять типы форматов RGB или Depth.

// Example Format Descriptor for UVC 1.1 frame based format

typedef struct _VIDEO_FORMAT_FRAME
{
    UCHAR bLength;
    UCHAR bDescriptorType;
    UCHAR bDescriptorSubtype;
    UCHAR bFormatIndex;
    UCHAR bNumFrameDescriptors;
    GUID  guidFormat;  // this field should contain the IR subtype GUID
    UCHAR bBitsPerPixel;
    UCHAR bDefaultFrameIndex;
    UCHAR bAspectRatioX;
    UCHAR bAspectRatioY;
    UCHAR bmInterlaceFlags;
    UCHAR bCopyProtect;
    UCHAR bVariableSize;
} VIDEO_FORMAT_FRAME, *PVIDEO_FORMAT_FRAME;

Примечание

Потоки IR будут отображаться как обычные потоки захвата в DShow.

Поток глубины

Драйвер usb-класса видеофайла Windows для папки "Входящие" поддерживает камеры, создающие потоки глубины. Эти камеры захватывают информацию о глубине (например, время полета) сцены и передают карту глубины в виде несжатых кадров YUV через USB. В дескрипторе формата потокового видео необходимо указать следующий guid типа формата, как определено в файле заголовка WDK ksmedia.h:

Тип Описание
KSDATAFORMAT_SUBTYPE_D16 Значения 16-разрядной карты глубины. Этот тип идентичен MFVideoFormat_D16. Значения в миллиметрах.

Если guid типа формата указан в элементе guidFormat дескриптора кадра, конвейер захвата Media Foundation помечает поток как поток глубины. Приложения, написанные с помощью API FrameReader, смогут использовать поток глубины. Конвейер для потоков глубины не поддерживает масштабирование или преобразование кадров глубины.

Поток, предоставляющий типы форматов Depth, не должен предоставлять типы форматов RGB или IR.

// Example Format Descriptor for UVC 1.1 frame based format
typedef struct _VIDEO_FORMAT_FRAME
{
    UCHAR bLength;
    UCHAR bDescriptorType;
    UCHAR bDescriptorSubtype;
    UCHAR bFormatIndex;
    UCHAR bNumFrameDescriptors;
    GUID guidFormat; // this field should contain the IR subtype GUID
    UCHAR bBitsPerPixel;
    UCHAR bDefaultFrameIndex;
    UCHAR bAspectRatioX;
    UCHAR bAspectRatioY;
    UCHAR bmInterlaceFlags;
    UCHAR bCopyProtect;
    UCHAR bVariableSize;
} VIDEO_FORMAT_FRAME, *PVIDEO_FORMAT_FRAME;

Примечание

Потоки глубины отображаются как обычные потоки захвата в DShow.

Группирование камер

Windows поддерживает группирование камер на основе идентификатора контейнера, чтобы помочь приложениям работать со связанными камерами. Например, камера IR и цветная камера, присутствующие на одном физическом устройстве, могут быть доступны операционной системе как связанные камеры. Это позволяет приложениям, таким как Windows Hello использовать связанные камеры для своих сценариев.

Связь между функциями камеры можно указать в дескрипторе BOS камеры во встроенном ПО. Драйвер UVC будет использовать эти сведения и предоставлять эти функции камеры как связанные. Это делает стек камер ОС предоставлять их в виде связанной группы камер для приложений.

Встроенное ПО камеры должно указать UVC-FSSensorGroupID, который представляет собой GUID в строковой форме с фигурной скобкой. Камеры с одинаковым UVC-FSSensorGroupID будут сгруппированы.

Группе датчиков можно присвоить имя, указав UVC-FSSensorGroupName, строку Юникода, во встроенном ПО.

В разделе Пример составного устройства ниже приведен иллюстративный пример BOS, в котором указаны UVC-FSSensorGroupID и UVC-FSSensorGroupName.

Если не удается обновить встроенное ПО устройства, как описано выше, можно использовать настраиваемый INF-файл и указать, что ваша камера входит в группу датчиков, указав идентификатор и имя группы датчиков, как показано ниже. Пользовательский INF-файл (на основе драйвера UVC для папки "Входящие") должен содержать следующие записи AddReg:

FSSensorGroupID: REG_SZ: "{идентификатор идентификатора группы датчиков}"

FSSensorGroupName: REG_SZ: "понятное имя группы датчиков"

Пример настраиваемого раздела INF может быть следующим:

[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface

[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg

[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,, FSSensorGroupID,0x00000000,%FSSensorGroupID%
HKR,, FSSensorGroupName,0x00000000,%FSSensorGroupName%

Примечание

Группы датчиков не поддерживаются в конвейере записи DShow.

Метод 2 или метод 3 по-прежнему поддерживают захват

Спецификация UVC предоставляет механизм, позволяющий указать, поддерживает ли интерфейс потоковой передачи видео запись изображения типа 1/2/3. Чтобы операционная система могла воспользоваться преимуществами поддержки метода 2/3 устройства по-прежнему захвата изображений, с помощью драйвера UVC встроенное ПО устройства может указать значение в дескрипторе BOS.

Значение, указываемое для включения записи образа методом 2/3, — это DWORD с именем UVC-EnableDependentStillPinCapture. Укажите его значение с помощью дескриптора BOS. Пример составного устройства ниже демонстрирует включение захвата неподвижного образа с помощью дескриптора BOS.

Если не удается обновить встроенное ПО устройства, как описано выше, можно использовать настраиваемый INF-файл, чтобы указать, что камера поддерживает метод 2 или метод 3 по-прежнему захвата.

Пользовательский INF-файл (на основе пользовательского драйвера UVC или драйвера UVC для папки "Входящие") должен содержать следующую запись AddReg:

EnableDependentStillPinCapture: REG_DWORD: 0x0 (отключено) для 0x1 (включено)

Если для этой записи задано значение Включено (0x1), конвейер захвата использует метод 2/3 для захвата неподвижного образа (при условии, что встроенное ПО также объявляет поддержку метода 2/3, как указано в спецификации UVC).

Пример настраиваемого раздела INF выглядит следующим образом:

[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface

[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg

[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnableDependentStillPinCapture,0x00010001,0x00000001

Цепочка MFT устройства

MFT устройства — это рекомендуемый механизм подключаемого модуля пользовательского режима для IHV и изготовителей оборудования для расширения функциональности камеры в Windows.

До Windows 10 версии 1703 конвейер камеры поддерживал только один подключаемый модуль расширения DMFT.

Начиная с Windows 10 версии 1703, конвейер камеры Windows поддерживает необязательную цепочку DMFT с максимальным количеством двух dmFT.

Начиная с Windows 11 версии 22H2, конвейер камеры Windows поддерживает необязательную цепочку dmft с четырьмя dmft.

Это обеспечивает большую гибкость для изготовителей оборудования и IHV для предоставления добавленной стоимости в виде потоков камеры постобработки. Например, устройство может использовать PDMFT вместе с DMFT IHV и OEM DMFT.

На следующем рисунке показана архитектура, включающая цепочку dmft.

Цепочка DMFT.

Примеры захвата передаются от драйвера камеры к DevProxy, а затем проходят через цепочки DMFT. Каждый DMFT в цепочке имеет возможность обработать образец. Если DMFT не хочет обрабатывать образец, он может действовать как сквозной просто передать пример в следующий DMFT.

Для таких элементов управления, как KsProperty, вызов идет вышестоящий — последний DMFT в цепочке получает вызов первым, вызов может быть обработан там или передан в предыдущий DMFT в цепочке.

Ошибки распространяются из DMFT в DTM, а затем в приложения. Если для DMFT IHV или OEM не удается создать экземпляр DMFT, это будет неустранимая ошибка для DTM.

Требования к DMFT:

  • Число входных контактов DMFT должно совпадать с числом выходных контактов предыдущего DMFT, в противном случае DTM завершится ошибкой во время инициализации. Однако количество входных и выходных контактов одного и того же DMFT не обязательно совпадает.

  • DMFT требует поддержки интерфейсов — IMFDeviceTransform, IMFShutdown, IMFRealTimeClientEx, IKsControl и IMFMediaEventGenerator; Возможно, потребуется поддержка IMFTransform, если настроен MFT0 или для следующего DMFT в цепочке требуется поддержка IMFTransform.

  • В 64-разрядных системах, которые не используют Frame Server, необходимо зарегистрировать как 32-разрядные, так и 64-разрядные DMFT. Учитывая, что USB-камера может быть подключена к произвольной системе, для "внешних" (или не входящих) USB-камер поставщик usb-камер должен предоставлять как 32-разрядные, так и 64-разрядные DMFT.

Настройка цепочки DMFT

Устройство камеры может дополнительно предоставить COM-объект DMFT в библиотеке DLL с помощью настраиваемого INF-файла, в котором используются разделы папки "Входящие" USBVideo.INF.

В пользовательском . В разделе "Interface AddReg" INF-файла укажите идентификаторы CLSID DMFT, добавив следующую запись реестра:

CameraDeviceMftCLSIDChain (REG_MULTI_SZ) %Dmft0.CLSID%,%Dmft.CLSID%,%Dmft2.CLSID%

Как показано в примере параметров INF ниже (замените %Dmft0.CLSID% и % Dmft1.CLSID% фактическими строками CLSID, которые вы используете для dmFT), в Windows 10 версии 1703 разрешено не более 2 ИДЕНТИФИКАТОРов CLSID, а первая из них ближе всего к DevProxy, а последняя является последней DMFT в цепочке.

Платформа DMFT CLSID — {3D096DDE-8971-4AD5-98F9-C74F56492630}.

Пример параметров CameraDeviceMftCLSIDChain :

  • Без IHV/OEM DMFT или DMFT платформы

    • CameraDeviceMftCLSIDChain = "" (или нет необходимости указывать эту запись реестра)
  • IHV/OEM DMFT

    • CameraDeviceMftCLSIDChain = %Dmft.CLSID%
  • DMFT <платформы —> IHV/OEM DMFT

    • CameraDeviceMftCLSIDChain = "{3D096DDE-8971-4AD5-98F9-C74F56492630}",%Dmft.CLSID%

    • Ниже приведен снимок экрана: раздел реестра результатов для USB-камеры с dmft platform и DMFT (с GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7}) в цепочке.

Цепочка DMFT редактора реестра.

  • IHV/OEM DMFT0 <—> IHV/OEM DMFT1

    • CameraDeviceMftCLSIDChain = %Dmft0.CLSID%,%Dmft1.CLSID%,

Примечание

CameraDeviceMftCLSIDChain может иметь не более 2 идентификаторов CLSID.

Если параметр CameraDeviceMftCLSIDChain настроен, устаревшие параметры CameraDeviceMftCLSID пропускаются DTM.

Если CameraDeviceMftCLSIDChain не настроена и настроен устаревший CameraDeviceMftCLSID, то цепочка будет выглядеть так: (если ее USB-камера поддерживается платформой DMFT и платформа DMFT включена) DevProxy <–> Platform DMFT <–> OEM/IHV DMFT или (если камера не поддерживается платформой DMFT или платформа DMFT отключена) DevProxy <-> OEM/IHV DMFT.

Пример параметров INF-файла:

[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnablePlatformDmft,0x00010001,0x00000001
HKR,,DisablePlatformDmftFeatures,0x00010001,0x00000001
HKR,,CameraDeviceMftCLSIDChain, 0x00010000,%Dmft0.CLSID%,%Dmft1.CLSID%

MFT-устройство платформы

Начиная с Windows 10 версии 1703, Windows предоставляет почтовый MFT-адрес устройства для камер UVC, известный как PLATFORM DMFT (PDMFT) на основе согласия. Этот DMFT позволяет IHV и изготовителям оборудования использовать предоставляемые Windows алгоритмы постобработки.

Функции, поддерживаемые DMFT-платформой Выпуск Windows
Включает распознавание лиц в интересующем регионе (ROI) для корректировки 3A в USB-камерах с поддержкой рентабельности инвестиций. Windows 10 версии 1703

Примечание

Если камера не поддерживает рентабельность инвестиций на основе UVC 1.5, PDMFT не будет загружаться, даже если устройство согласилось использовать PDMFT.

Камера UVC может согласиться на использование DMFT платформы, указав EnablePlatformDmft через дескриптор BOS.

Значение, указываемое для включения DMFT платформы, представляет собой DWORD с именем UVC-EnablePlatformDmft и укажите его значение с помощью дескриптора BOS. В разделе Пример составного устройства ниже показано включение DMFT платформы с примером дескриптора BOS.

Если не удается обновить встроенное ПО устройства, как описано выше, можно использовать пользовательский INF-файл, чтобы включить dmft платформы для устройства.

Пользовательский INF-файл (на основе пользовательского драйвера UVC или драйвера UVC для папки "Входящие") должен содержать следующую запись AddReg:

EnablePlatformDmft: REG_DWORD: 0x0 (отключено) на 0x1 (включено)

Если для этой записи задано значение Включено (0x1), конвейер записи использует DMFT платформы для папки "Входящие" для устройства. Ниже приведен пример этого настраиваемого раздела INF:

[USBVideo.NT.Interfaces]
AddInterface=%KSCATEGORY_CAPTURE%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_RENDER_EXT%,GLOBAL,USBVideo.Interface
AddInterface=%KSCATEGORY_VIDEO_CAMERA%,GLOBAL,USBVideo.Interface

[USBVideo.Interface]
AddReg=USBVideo.Interface.AddReg

[USBVideo.Interface.AddReg]
HKR,,CLSID,,%ProxyVCap.CLSID%
HKR,,FriendlyName,,%USBVideo.DeviceDesc%
HKR,,RTCFlags,0x00010001,0x00000010
HKR,,EnablePlatformDmft,0x00010001,0x00000001

В Windows 10 версии 1703, если устройство согласилось использовать PDMFT, все функции, поддерживаемые PDMFT, включаются (в зависимости от возможностей устройства). Детализированная конфигурация функций PDMFT не поддерживается.

Примечание

Координаты рентабельности инвестиций на основе лиц вычисляются относительно поля зрения изображения, передаваемого в PDMFT. Если поле зрения было изменено из-за использования таких элементов управления, как Масштаб, Панорама, Наклон или Цифровое окно, камера отвечает за сопоставление предоставленных координат обратно в полное поле зрения датчика, учитывая текущее окно масштабирования или панорамирования.

Профиль проверки подлинности лиц с помощью дескрипторов ОС MS

Windows 10 RS5 теперь применяет требование профиля проверки подлинности лиц версии 2 для любой камеры с поддержкой Windows Hello. Для систем на основе MIPI с пользовательским стеком драйверов камеры эта поддержка может быть опубликована через INF (или расширение INF) или через подключаемый модуль пользовательского режима (MFT устройства).

Однако для видеоустройств USB ограничение камер на основе UVC заключается в том, что для Windows 10 19H1 пользовательские драйверы камер не допускаются. Все камеры на основе UVC должны использовать драйвер класса "Входящие" USB Video Class, а все расширения поставщика должны быть реализованы в виде MFT устройства.

Для многих OEM/ODM предпочтительным подходом к модулям камеры является реализация большей части функциональных возможностей встроенного ПО модуля, то есть с помощью дескрипторов ОС Майкрософт.

Для публикации профиля проверки подлинности лиц с помощью дескрипторов MSOS (также называемых дескрипторами BOS) поддерживаются следующие камеры:

  • Только rgb-камера, используемая в группе датчиков с отдельной камерой IR.

  • Камера только ir, используемая в группе датчиков с отдельной RGB-камерой.

  • Камера RGB+IR с отдельными контактами IR и RGB.

Примечание

Если встроенное ПО камеры не соответствует одному из трех требований, описанных выше, ODM/OEM должны использовать расширение INF для объявления профиля камеры версии 2.

Пример макета дескриптора ОС Майкрософт

Ниже приведены примеры для следующих спецификаций:

  • Спецификация расширенных дескрипторов ОС Майкрософт 1.0

  • Спецификация дескрипторов MICROSOFT OS 2.0

Спецификация расширенного дескриптора ОС Майкрософт 1.0

Дескриптор ОС расширенных свойств имеет два компонента

  • Раздел заголовка фиксированной длины
  • Один или несколько разделов настраиваемых свойств переменной длины, которые следуют за разделом заголовка

Раздел заголовка дескриптора Microsoft OS 1.0

Раздел заголовков описывает одно настраиваемое свойство (профиль проверки подлинности лиц).

Offset Поле Размер (в байтах) Значение Описание
0 dwLength 4 <>
4 bcdVersion 2 0x0100 Версия 1.0
6 wIndex 2 0x0005 Дескриптор ОС расширенного свойства
8 wCount 2 0x0001 Одно настраиваемое свойство

Раздел настраиваемого свойства дескриптора Microsoft OS 1.0

Offset Поле Размер (в байтах) Значение Описание
0 dwSize 4 0x00000036 (54) Общий размер (в байтах) для этого свойства.
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) Размер (в байтах) имени свойства.
10 bPropertyName 36 UVC-CPV2FaceAuth Строка UVC-CPV2FaceAuth в Юникоде.
46 dwPropertyDataLength 4 0x00000004 4 байта для данных свойства (sizeof(DWORD)).
50 bPropertyData 4 См. схему данных ниже См. схему данных ниже.
Схема полезных данных

Полезные данные UVC-CPV2FaceAuth — это 32-разрядное целое число без знака. 16-разрядный индекс высокого порядка представляет индекс на основе 0 списка типов мультимедиа, предоставляемого контактом RGB. 16-разрядная версия нижнего порядка представляет индекс на основе 0 списка типов мультимедиа, предоставляемого контактом IR.

Например, камера типа 3, которая предоставляет следующие типы мультимедиа в порядке, объявленном из контакта RGB:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

И следующий тип носителя для IR:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Значение полезных данных 0x00010000 приведет к публикации следующего профиля проверки подлинности лиц:

Pin0:(RES==1280;720; FRT==30,1; SUT==MJPG) // Второй тип носителя (0x0001)
Pin1:(RES==480;480; FRT==30,1; SUT==L8) // Первый тип носителя (0x0000)

Примечание

На момент написания этой статьи Windows Hello имеет минимальное требование 480x480@7,5 кадров/с для потока RGB и 340x340@15fps для потока IR. При включении профиля проверки подлинности лиц IHV/OEM должны выбирать типы носителей, удовлетворяющие этому требованию.

Пример камеры типа 1

Так как для камеры типа 1 нет контакта IR (с расчетом, что камера типа 1 будет связана с камерой типа 2 на компьютере в группе датчиков), публикуется только индекс типа мультимедиа RGB. Для индекса типа носителя IR 16-разрядное значение полезных данных в нижнем порядке должно иметь значение 0xFFFF.

Например, если камера типа 1 предоставляет следующий список типов мультимедиа:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

Чтобы опубликовать CPV2FaceAuth с помощью MJPG, 1280x720@30fps тип носителя, необходимо задать для полезных данных значение 0x0001FFFF.

Пример камеры типа 2

Для камеры типа 2 для 16-разрядной камеры высокого порядка должно быть задано значение 0xFFFF, а 16-разрядное значение нижнего порядка указывает тип носителя IR, который будет использоваться.

Например, для камеры типа 2 со следующими типами мультимедиа:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Если для проверки подлинности лиц используется первый тип носителя, значение должно быть следующим: 0xFFFF0000.

Спецификация расширенного дескриптора ОС Майкрософт 2.0

Расширенный дескриптор MSOS 2.0 можно использовать для определения значений реестра для добавления поддержки профиля проверки подлинности лиц. Для этого используется дескриптор свойств реестра Microsoft OS 2.0.

Для записи реестра UVC-CPV2FaceAuth ниже показан пример набора дескрипторов MSOS 2.0:

UCHAR Example2_MSOS20DescriptorSet_UVCFaceAuthForFutureWindows[0x3C] =
{
    //
    // Microsoft OS 2.0 Descriptor Set Header
    //
    0x0A, 0x00,               // wLength - 10 bytes
    0x00, 0x00,               // MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00, 0x0?, 0x06,   // dwWindowsVersion – 0x060?0000 for future Windows version
    0x3C, 0x00,               // wTotalLength – 60 bytes

    //
    // Microsoft OS 2.0 Registry Value Feature Descriptor
    //
    0x32, 0x00,               // wLength - 50 bytes
    0x04, 0x00,               // wDescriptorType – 4 for Registry Property
    0x04, 0x00,               // wPropertyDataType - 4 for REG_DWORD_LITTLE_ENDIAN
    0x30, 0x00,               // wPropertyNameLength – 36 bytes
    0x55, 0x00, 0x56, 0x00,   // Property Name - "UVC-CPV2FaceAuth"
    0x43, 0x00, 0x2D, 0x00,
    0x43, 0x00, 0x50, 0x00,
    0x56, 0x00, 0x32, 0x00,
    0x46, 0x00, 0x61, 0x00,
    0x63, 0x00, 0x65, 0x00,
    0x41, 0x00, 0x75, 0x00,
    0x74, 0x00, 0x68, 0x00,
    0x00, 0x00, 0x00, 0x00,
    0x04, 0x00,               // wPropertyDataLength – 4 bytes
    0x00, 0x00, 0x01, 0x00    // PropertyData – 0x00010000 (see Payload Schema)
}

При добавлении UVC-CPV2FaceAuth записи реестра устройствам не нужно публиковать запись реестра EnableDshowRedirection, как описано в руководстве по реализации моста DShow для устройств UVC.

Однако если поставщик устройства должен поддерживать более старые версии Windows и (или) необходимо включить распаковку MJPEG на сервере Frame Server, необходимо добавить запись реестра EnableDshowRedirection.

Создание группы датчиков

Когда изготовители оборудования создают системы, использующие камеры типа 1 и 2, чтобы обеспечить потоки RGB и IR для поддержки Windows Hello, изготовители оборудования должны объявить две камеры как часть синтезируемой группы датчиков.

Это делается путем объявления тегов FSSensorGroupId и FSSensorGroupName в inf расширения, которые будут созданы в свойстве интерфейса устройства для каждой камеры.

Однако если параметр Extension INF не указан, ODM могут использовать одни и те же дескрипторы MSOS для публикации значений FSSensorGroupId и FSSensorGroupName. Драйвер класса "Входящие" Windows 10 USB Video Будет автоматически принимать любой дескриптор MSOS, имя полезных данных которого имеет префикс "UVC-", и перенести тег в хранилище свойств интерфейса устройства (удалив префикс "UVC-").

Таким образом, камера типов 1 и 2, которая публикует следующие данные, позволит ОС синтезировать камеры в группу датчиков с несколькими устройствами для использования с Windows Hello:

UVC-FSSensorGroupId
UVC-FSSensorGroupName

Полезными данными для каждого тега должна быть строка Юникода. Полезные данные UVC-FSSensorGroupId должны быть строкой GUID в следующем формате:

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXX}

Значение GUID должно совпадать между камерами типа 1 и 2, а обе камеры должны быть добавлены в одно физическое шасси. Для встроенных камер физическим корпусом является сам компьютер. Для внешних камер модули камер типа 1 и 2 должны быть встроены в одно физическое устройство, подключенное к компьютеру.

Категории пользовательского интерфейса устройства для групп датчиков

Начиная с 19H1, Windows предоставляет механизм расширения, указанный IHV/OEM, чтобы разрешить публикацию синтезированных групп датчиков в любой пользовательской или предопределенной категории. Создание группы датчиков определяется IHV или OEM-производителями, предоставляющими ключ идентификатора группы датчиков в пользовательской INF::

FSSensorGroupId: {Пользовательский GUID}
FSSensorGroupName: <понятное имя, используемое для группы датчиков>

В дополнение к двум приведенным выше записям AddReg в INF для пользовательских категорий определяется новая запись AddReg:

FSSensorGroupCategoryList: {GUID}; {GUID};...; {GUID}

Несколько категорий определяются с помощью точки с запятой (;) списка GUID с разделителями.

Каждое устройство, объявляющее соответствующий FSSensorGroupId, должно объявлять тот же FSSensorGroupCategoryList. Если список не совпадает, все списки игнорируются, а группа датчиков по умолчанию публикуется в KSCATEGORY_SENSOR_GROUP, как если бы пользовательские категории не были определены.

Поворот камеры

См. раздел Ориентация устройства камеры.

Кэш элементов управления UVC

См. раздел Кэш элементов управления UVC.

Дескриптор BOS и MS OS 2.0

Камера, совместимая с UVC, может указывать значения конфигурации конкретного устройства Windows в дескрипторе BOS возможностей платформы во встроенном ПО с помощью дескрипторов Microsoft OS 2.0. Сведения о том, как указать допустимый дескриптор BOS, который передает конфигурацию устройства в ОС, см. в документации по дескриптору MS OS 2.0.

Заголовок набора дескрипторов Microsoft OS 2.0

Offset Поле Размер (в байтах) Описание
0 wLength 2 Длина этого заголовка в байтах должна быть 10.
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 4 Версия Windows.
8 wTotalLength 2 Размер всего набора дескрипторов MS OS 2.0, включая этот размер заголовка.

Дескриптор свойств реестра Microsoft OS 2.0

Offset Поле Размер (в байтах) Описание
0 wLength 2 Длина этого дескриптора в байтах
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 0x04 (REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 Длина имени свойства.
8 PropertyName Переменная Имя свойства реестра.
8+M wPropertyDataLength 2 Длина данных свойства.
10+M PropertyData Переменная Данные свойств

Если во встроенном ПО указан допустимый дескриптор MS OS 2.0, стек USB копирует значения конфигурации в раздел реестра HW устройства, показанный ниже:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\<Device ID>\<Instance ID>\Device Parameters

Драйвер UVC считывает значения конфигурации из раздела реестра HW устройства и настраивает устройство в ОС соответствующим образом. Например, если встроенное ПО указывает устройство, которое будет зарегистрировано в качестве камеры датчика с помощью значения конфигурации, драйвер UVC регистрирует устройство только в этой категории.

Настройка устройств UVC с помощью дескриптора BOS платформы — это механизм, который был включен в Windows 10 версии 1703, чтобы помочь поставщикам устройств UVC настроить устройство без использования INF-файла в ОС Windows.

Настройка устройств UVC с помощью пользовательской INF по-прежнему поддерживается и имеет приоритет над механизмом на основе дескриптора BOS. При указании свойств устройства с помощью INF не нужно добавлять префикс "UVC-". Этот префикс необходим только для свойств устройства, указанных с помощью дескриптора BOS и зависящих от экземпляра интерфейса. Если вашему устройству требуются подключаемые модули пользовательского режима, такие как DMFT, необходимо предоставить INF для установки DMFT. Его нельзя настроить с помощью встроенного ПО.

Поддерживаемые в настоящее время значения конфигурации с помощью дескриптора BOS

Имя конфигурации Тип Описание
SensorCameraMode REG_DWORD Зарегистрируйте камеру в определенной категории.
UVC-FSSensorGroupID, UVC-FSSensorGroupName REG_SZ Группирование камер с одинаковыми UVC-FSSensorGroupID
UVC-EnableDependentStillPinCapture REG_DWORD Включение метода записи 2/3
UVC-EnablePlatformDmft REG_DWORD Включение DMFT платформы

Когда драйвер UVC видит значения реестра с префиксом "UVC-", он заполняет раздел реестра экземпляра интерфейса категории устройства теми же значениями без префикса. Драйвер делает это для любой переменной, указанной в встроенном ПО, а не только для перечисленных выше.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{e5323777-f976-4f5b-9b55-b94699c46e44}\<Device Symbolic Link>\Device Parameters

Чтобы ОС использовала дескрипторы bos Platform Device Capability и MS OS 2.0, дескриптор устройства должен указать версию bcdUSB, 0x0210 или выше.

Пример составного устройства

В этом разделе представлены дескриптор BOS и дескриптор MS OS 2.0 для примера составного устройства с двумя функциями камеры. Одна функция является цветовой камерой UVC, а вторая — камерой UVC IR.

Ниже приведены примеры дескрипторов.

  1. Зарегистрируйте функцию цветовой камеры в разделе KSCATEGORY_VIDEO_CAMERA

  2. Зарегистрируйте функцию камеры IR в KSCATEGORY_SENSOR_CAMERA

  3. Включение функции цветной камеры для захвата изображения

  4. Связывает цвет и функции камеры IR как группу

При перечислении устройства стек USB извлекает дескриптор BOS с устройства. После дескриптора BOS используется возможность устройства для конкретной платформы.

#include <usbspec.h>

const BYTE USBVideoBOSDescriptor[0x21] =
{
    /* BOS Descriptor */
    0x05,                       // Descriptor size
    USB_BOS_DESCRIPTOR_TYPE,    // Device descriptor type BOS
    0x21, 0x00,                 // Length 0x21 (33) this and all sub descriptors
    0x01,                       // Number of device capability descriptors

    /* Platform Device Capability Descriptor */
    0x1C,                                   // 28 bytes bLength
    USB_DEVICE_CAPABILITY_DESCRIPTOR_TYPE,  // Platform Descriptor type
    USB_DEVICE_CAPABILITY_PLATFORM,         // bDevCapabilityType PLATFORM
    0,                                      // bReserved
    0xDF, 0x60, 0xDD, 0xD8,                 // PlatformCapabilityUUID
    0x89, 0x45,                             // MS OS2.0 Descriptor
    0xC7, 0x4C,                             // D8DD60DF-4589-4CC7-9CD2-659D9E648A9F
    0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F,
                                            // CapabilityData
    0x00, 0x00, 0x00, 0x0A,                 // dwWindowsVersion for Windows 10 and later
    0xC8, 0x02,                             // wLength 0x2C8 (712)
    0x01,                                   // bMS_VendorCode - any value. e.g. 0x01
    0x00                                    // bAltEnumCmd 0
};

Дескриптор возможностей платформы BOS указывает:

  1. ИДЕНТИФИКАТОР GUID возможностей платформы дескриптора MS OS 2.0

  2. Код элемента управления поставщиком bMS_VendorCode (здесь он имеет значение 1. Для получения дескриптора MS OS 2.0 может потребоваться любое значение, предпочитаемое поставщиком.

  3. Этот дескриптор BOS применим для версий ОС Windows 10 и более поздних версий.

После просмотра дескриптора BOS USB-стек выполнит запрос на управление для конкретного поставщика, чтобы получить дескриптор MS OS 2.0.

Формат запроса элемента управления для получения дескриптора поставщика MS OS 2.0:

bmRequestType BRequest wValue WIndex wLength Данные
1100 0000B bMS_VendorCode 0x00 0x07 Длина Возвращен большой двоичный объект набора дескриптора MS OS 2.0

bmRequestType

  • Направление передачи данных — устройство к узлу

  • Тип — поставщик

  • Получатель — устройство

bRequest

Значение bMS_VendorCode , возвращаемое в информационной структуре набора дескрипторов.

wValue

Задайте значение 0x00.

wIndex

0x7 для MS_OS_20_DESCRIPTOR_INDEX.

wLength

Длина набора дескрипторов MS OS 2.0, возвращаемая в дескрипторе BOS. 0x25C (604) в этом примере.

Ожидается, что устройство вернет дескриптор MS OS 2.0, как указано в usbVideoMSOS20DescriptorSet.

UsbVideoMSOS20DescriptorSet описывает функции color и IR. Он задает следующие значения дескриптора MS OS 2.0:

  1. Задать заголовок

  2. Заголовок подмножества конфигурации

  3. Заголовок подмножества функции "Цветная камера"

  4. Дескриптор компонента значения реестра для идентификатора группы датчиков

  5. Дескриптор функции значения реестра для имени группы датчиков

  6. Дескриптор функции значения реестра для включения захвата неподвижного образа

  7. Дескриптор функции значения реестра для включения DMFT платформы

  8. Заголовок подмножества функции камеры IR

  9. Дескриптор компонента значения реестра для идентификатора группы датчиков

  10. Дескриптор функции значения реестра для имени группы датчиков

  11. Дескриптор функции значения реестра для регистрации камеры в качестве камеры датчика

Встроенное ПО будет иметь обработчик для запроса поставщика, который вернет следующий дескриптор MS OS 2.0 для мнимого устройства, описанного в начале этого раздела.

UCHAR USBVideoMSOS20DescriptorSet[0x2C8] =
{
    /* Microsoft OS 2.0 Descriptor Set Header */
    0x0A, 0x00,             // wLength of MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00,             // wDescriptorType == MSOS20_SET_HEADER_DESCRIPTOR
    0x00, 0x00, 0x00, 0x0A, // dwWindowsVersion – 0x10000000 for Windows 10
    0xC8, 0x02,             // wTotalLength - Total length 0x2C8 (712)

    /* Microsoft OS 2.0 Configuration Subset Header */
    0x08, 0x00,             // wLength of MSOS20_SUBSET_HEADER_CONFIGURATION
    0x01, 0x00,             // wDescriptorType == MSOS20_SUBSET_HEADER_CONFIGURATION
    0x00,                   // bConfigurationValue set to the first configuration
    0x00,                   // bReserved set to 0.
    0xBE, 0x02,             // wTotalLength - Total length 0x2BE (702)

    /****************Color Camera Function******************/

    /* Microsoft OS 2.0 Function Subset Header */
    0x08, 0x00,             // wLength of MSOS20_SUBSET_HEADER_FUNCTION
    0x02, 0x00,             // wDescriptorType == MSOS20_SUBSET_HEADER_FUNCTION
    0x00,                   // bFirstInterface field of the first IAD
    0x00,                   // bReserved set to 0.
    0x6E, 0x01,             // wSubsetLength - Length 0x16E (366)

    /****************Register the Color Camera in a sensor group******************/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x80, 0x00,             // wLength 0x80 (128) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x28, 0x00,             // wPropertyNameLength – 0x28 (40) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupID"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'I', 0x00,
    'D', 0x00, 0x00, 0x00,
    0x4E, 0x00,             // wPropertyDataLength – 0x4E (78) bytes
                            // FSSensorGroupID GUID in string format:
                            // "{20C94C5C-F402-4F1F-B324-0C1CF0257870}"
    '{', 0x00, '2', 0x00,   // This is just an example GUID.
    '0', 0x00, 'C', 0x00,   // You need to generate and use your
    '9', 0x00, '4', 0x00,   // own GUID for the sensor group ID
    'C', 0x00, '5', 0x00,
    'C', 0x00, '-', 0x00,
    'F', 0x00, '4', 0x00,
    '0', 0x00, '2', 0x00,
    '-', 0x00, '4', 0x00,
    'F', 0x00, '1', 0x00,
    'F', 0x00, '-', 0x00,
    'B', 0x00, '3', 0x00,
    '2', 0x00, '4', 0x00,
    '-', 0x00, '0', 0x00,
    'C', 0x00, '1', 0x00,
    'C', 0x00, 'F', 0x00,
    '0', 0x00, '2', 0x00,
    '5', 0x00, '7', 0x00,
    '8', 0x00, '7', 0x00,
    '0', 0x00, '}', 0x00,
    0x00, 0x00,

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x56, 0x00,             // wLength 0x56 (86) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x2C, 0x00,             // wPropertyNameLength – 0x2C (44) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupName"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'N', 0x00,
    'a', 0x00, 'm', 0x00,
    'e', 0x00, 0x00, 0x00,
    0x20, 0x00,             // wPropertyDataLength – 0x20 (32) bytes
                            // FSSensorGroupName "YourCameraGroup"
    'Y', 0x00, 'o', 0x00,
    'u', 0x00, 'r', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 0x00, 0x00,

    /****************Enable Still Image Capture for Color Camera************/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x54, 0x00,             // wLength 0x54 (84) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x46, 0x00,             // wPropertyNameLength – 0x46 (70) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-EnableDependentStillPinCapture"
    'C', 0x00, '-', 0x00,
    'E', 0x00, 'n', 0x00,
    'a', 0x00, 'b', 0x00,
    'l', 0x00, 'e', 0x00,
    'D', 0x00, 'e', 0x00,
    'p', 0x00, 'e', 0x00,
    'n', 0x00, 'd', 0x00,
    'e', 0x00, 'n', 0x00,
    't', 0x00, 'S', 0x00,
    't', 0x00, 'i', 0x00,
    'l', 0x00, 'l', 0x00,
    'P', 0x00, 'i', 0x00,
    'n', 0x00, 'C', 0x00,
    'a', 0x00, 'p', 0x00,
    't', 0x00, 'u', 0x00,
    'r', 0x00, 'e', 0x00,
    0x00, 0x00,
    0x04, 0x00,              // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00,   // Enable still pin capture using Method 2 or Method 3

    /****************Enable Platform DMFT for ROI-capable USB Camera************/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x3C, 0x00,             // wLength 0x3C (60) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x2E, 0x00,             // wPropertyNameLength – 0x2E (46) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-EnablePlatformDmft"
    'C', 0x00, '-', 0x00,
    'E', 0x00, 'n', 0x00,
    'a', 0x00, 'b', 0x00,
    'l', 0x00, 'e', 0x00,
    'P', 0x00, 'l', 0x00,
    'a', 0x00, 't', 0x00,
    'f', 0x00, 'o', 0x00,
    'r', 0x00, 'm', 0x00,
    'D', 0x00, 'm', 0x00,
    'f', 0x00, 't', 0x00,
    0x00, 0x00,
    0x04, 0x00,              // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00,  // Enable Platform DMFT

    /****************IR Camera Function*********************************************/

    /* Microsoft OS 2.0 Function Subset Header */
    0x08, 0x00,             // wLength of MSOS20_SUBSET_HEADER_FUNCTION
    0x02, 0x00,             // wDescriptorType == MSOS20_SUBSET_HEADER_FUNCTION
    0x01,                   // bFirstInterface set of the second function
    0x00,                   // bReserved set to 0.
    0x48, 0x01,             // wSubsetLength - Length 0x148 (328)

    /********Register the IR Camera to the same sensor group as the Color Camera*****/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x80, 0x00,             // wLength 0x80 (128) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x28, 0x00,             // wPropertyNameLength – 0x28 (40) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupID"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'I', 0x00,
    'D', 0x00, 0x00, 0x00,
    0x4E, 0x00,             // wPropertyDataLength – 78 bytes
                            // FSSensorGroupID GUID in string format:
                            // "{20C94C5C-F402-4F1F-B324-0C1CF0257870}"
    '{', 0x00, '2', 0x00,
    '0', 0x00, 'C', 0x00,
    '9', 0x00, '4', 0x00,
    'C', 0x00, '5', 0x00,
    'C', 0x00, '-', 0x00,
    'F', 0x00, '4', 0x00,
    '0', 0x00, '2', 0x00,
    '-', 0x00, '4', 0x00,
    'F', 0x00, '1', 0x00,
    'F', 0x00, '-', 0x00,
    'B', 0x00, '3', 0x00,
    '2', 0x00, '4', 0x00,
    '-', 0x00, '0', 0x00,
    'C', 0x00, '1', 0x00,
    'C', 0x00, 'F', 0x00,
    '0', 0x00, '2', 0x00,
    '5', 0x00, '7', 0x00,
    '8', 0x00, '7', 0x00,
    '0', 0x00, '}', 0x00,
    0x00, 0x00,

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x56, 0x00,             // wLength 0x56 (86) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x01, 0x00,             // wPropertyDataType - REG_SZ
    0x2C, 0x00,             // wPropertyNameLength – 0x2C (44) bytes
    'U', 0x00, 'V', 0x00,   // Property Name - "UVC-FSSensorGroupName"
    'C', 0x00, '-', 0x00,
    'F', 0x00, 'S', 0x00,
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 'N', 0x00,
    'a', 0x00, 'm', 0x00,
    'e', 0x00, 0x00, 0x00,
    0x20, 0x00,             // wPropertyDataLength – 32 bytes
                            // FSSensorGroupName "YourCameraGroup"
    'Y', 0x00, 'o', 0x00,
    'u', 0x00, 'r', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'G', 0x00, 'r', 0x00,
    'o', 0x00, 'u', 0x00,
    'p', 0x00, 0x00, 0x00,

    /****************Make IR camera visible to applications*********************/

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x30, 0x00,             // wLength 0x30 (48) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x22, 0x00,             // wPropertyNameLength – 0x22 (34) bytes
    'S', 0x00, 'e', 0x00,
    'n', 0x00, 's', 0x00,
    'o', 0x00, 'r', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'M', 0x00, 'o', 0x00,
    'd', 0x00, 'e', 0x00,
    0x00, 0x00,
    0x04, 0x00,              // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00, // This exposes the camera to OS as an IR only camera
                            // i.e. KSCATEGORY_SENSOR_CAMERA

    /* Microsoft OS 2.0 Registry Value Feature Descriptor */
    0x3A, 0x00,             // wLength 0x3A (58) in bytes of this descriptor
    0x04, 0x00,             // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
    0x04, 0x00,             // wPropertyDataType - REG_DWORD
    0x2C, 0x00,             // wPropertyNameLength – 0x2C (44) bytes
    'S', 0x00, 'k', 0x00,
    'i', 0x00, 'p', 0x00,
    'C', 0x00, 'a', 0x00,
    'm', 0x00, 'e', 0x00,
    'r', 0x00, 'a', 0x00,
    'E', 0x00, 'n', 0x00,
    'u', 0x00, 'm', 0x00,
    'e', 0x00, 'r', 0x00,
    'a', 0x00, 't', 0x00,
    'i', 0x00, 'o', 0x00,
    'n', 0x00, 0x00, 0x00,
    0x04, 0x00,             // wPropertyDataLength – 4 bytes
    0x01, 0x00, 0x00, 0x00  // This exposes the camera to applications looking for IR only cameras
};