Compartir a través de


Guía de implementación de cámara de clase de vídeo USB (UVC)

A partir de Windows 10, se proporciona un controlador usb de clase de vídeo USB (UVC) para dispositivos compatibles con la especificación de clase de vídeo USB (versiones 1.0 a 1.5). Este controlador admite cámaras de tipo de sensor y color. En este documento se describe cómo exponer determinadas funcionalidades de una cámara compatible con UVC a las aplicaciones a través del controlador de bandeja de entrada.

Terminología

Palabra clave Descripción
UVC Clase de vídeo USB
Controlador UVC USBVideo.sys controlador que se distribuye con el sistema operativo
IR Infrarrojos
Cámara de color Cámara que genera secuencias de color (por ejemplo, cámaras RGB o YUV)
Cámara del sensor Cámara que genera secuencias que no son de color (por ejemplo, cámaras IR o Profundidad)
BOS Almacén de objetos de dispositivo binario
MS OS 2.0 Descriptor Descriptor de funcionalidad del dispositivo BOS específico de la plataforma de Microsoft

Cámaras de sensor

Windows admite dos categorías de cámaras. Una es una cámara de color y la otra es una cámara de sensor que no es de color. Las cámaras RGB o YUV se clasifican como cámaras de color y cámaras que no son de color, como la escala de grises, las cámaras IR y Profundidad se clasifican como cámaras de sensor. El controlador UVC admite ambos tipos de cámaras. Se recomienda que el firmware de la cámara especifique un valor basado en el que el controlador UVC registraría la cámara en una o ambas categorías admitidas.

Una cámara que admita solo los tipos de formato de color deben registrarse en KSCATEGORY_VIDEO_CAMERA. Una cámara que admita tipos de formato ir o de solo profundidad debe registrarse en KSCATEGORY_SENSOR_CAMERA. Una cámara que admita tipos de formato de color y no de color debe registrarse en KSCATEGORY_VIDEO_CAMERA y KSCATEGORY_SENSOR_CAMERA. Esta categorización ayuda a las aplicaciones a seleccionar la cámara con la que quieren trabajar.

Una cámara UVC puede especificar su preferencia de categoría a través de atributos, SensorCameraMode y SkipCameraEnumeration, en su descriptor DE MS OS 2.0 de BOS detallado en las secciones siguientes.

El atributo SensorCameraMode toma un valor 1 o 2.

Un valor de 1 registrará el dispositivo en KSCATEGORY_SENSOR_CAMERA. Además de esto, especifique un valor de 1 para SkipCameraEnumeration para que la cámara esté disponible para las aplicaciones que solo buscan cámaras de sensor. Una cámara que expone solo los tipos de medios de cámara del sensor debe usar este valor.

Un valor de 2 para SensorCameraMode registrará el dispositivo en KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA. Esto hace que la cámara esté disponible para las aplicaciones que buscan cámaras de sensor y color. Una cámara que expone los tipos de medios de cámara de sensor y cámara de color debe usar este valor.

Se recomienda especificar el valor del Registro mencionado anteriormente mediante el descriptor BOS. Consulte la sección Ejemplo de dispositivo compuesto a continuación para ver un descriptor bos de ejemplo con un descriptor MS OS 2.0 específico de la plataforma.

Si no puede actualizar el firmware del dispositivo como se ha descrito anteriormente, puede usar un INF personalizado y especificar que la cámara debe registrarse como una cámara de sensor especificando un valor para SensorCameraMode y SkipCameraEnumeration de la siguiente manera:

Un archivo INF personalizado (basado en el controlador UVC de la bandeja de entrada) debe incluir las siguientes entradas AddReg:

SensorCameraMode: REG_DWORD: 1 (para registrarse como cámara del sensor)

SkipCameraEnumeration: REG_DWORD: 1 (hacer que solo esté disponible para las aplicaciones de IR)

Un ejemplo de la sección INF personalizada es el siguiente:

[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

Si los atributos SensorCameraMode y SkipCameraEnumeration no se especifican en el firmware o inf, la cámara se registra como una cámara de color y solo será visible para las aplicaciones compatibles con la cámara de color.

Flujo de IR

El controlador de la clase de vídeo USB (UVC) de la bandeja de entrada de Windows admite cámaras que capturan la escena en formato YUV y transmiten los datos de píxeles a través de USB como YUV sin comprimir o como fotogramas MJPEG comprimidos.

Los SIGUIENTES GUID de tipo de formato deben especificarse en el descriptor de formato de vídeo de secuencia, tal y como se define en el archivo de encabezado ksmedia.h de WDK:

Tipo Descripción
KSDATAFORMAT_SUBTYPE_L8_IR Plano luma de 8 bits sin comprimir. Este tipo se asigna a MFVideoFormat_L8.
KSDATAFORMAT_SUBTYPE_L16_IR Plano luma de 16 bits sin comprimir. Este tipo se asigna a MFVideoFormat_L16.
KSDATAFORMAT_SUBTYPE_MJPG_IR Marcos MJPEG comprimidos. Media Foundation convierte esto en fotogramas sin comprimir NV12 y usa solo el plano luma.

Cuando se especifican estos GUID de tipo de formato en el campo guidFormat del descriptor de fotogramas, la canalización de captura de Media Foundation marca la secuencia como secuencia de IR. Las aplicaciones escritas con la API FrameReader de Media Foundation podrán consumir la secuencia de IR. La canalización de flujos de IR no admite el escalado ni las conversiones de los fotogramas de IR.

Una secuencia que expone tipos de formato IR no debe exponer tipos de formato RGB o 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;

Nota

Las secuencias de IR se mostrarán como secuencias de captura normales en DShow.

Flujo de profundidad

El controlador Usb Video Class de la bandeja de entrada de Windows admite cámaras que producen secuencias de profundidad. Estas cámaras capturan la información de profundidad (por ejemplo, el tiempo de vuelo) de la escena y transmiten el mapa de profundidad como fotogramas YUV sin comprimir a través de USB. El siguiente GUID de tipo de formato debe especificarse en el descriptor de formato de vídeo de secuencia, tal y como se define en el archivo de encabezado ksmedia.h de WDK:

Tipo Descripción
KSDATAFORMAT_SUBTYPE_D16 Valores de mapa de profundidad de 16 bits. Este tipo es idéntico a MFVideoFormat_D16. Los valores están en milímetros.

Cuando se especifica el GUID de tipo de formato en el miembro guidFormat del descriptor de fotogramas, la canalización de captura de Media Foundation marca la secuencia como secuencia de profundidad. Las aplicaciones escritas con FrameReader API podrán consumir el flujo de profundidad. La canalización no admite el escalado ni las conversiones de los fotogramas de profundidad para las secuencias de profundidad.

Una secuencia que expone los tipos de formato Depth no debe exponer tipos de formato RGB o 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;

Nota

Las secuencias de profundidad se muestran como secuencias de captura normales en DShow.

Agrupación de cámaras

Windows admite la agrupación de cámaras en función de su identificador de contenedor para ayudar a las aplicaciones a trabajar con cámaras relacionadas. Por ejemplo, una cámara IR y una cámara color presentes en el mismo dispositivo físico se pueden exponer al sistema operativo como cámaras relacionadas. Esto hace que las aplicaciones como Windows Hello usen las cámaras relacionadas para sus escenarios.

La relación entre las funciones de cámara podría especificarse en el descriptor bos de la cámara en el firmware. El controlador UVC usará esta información y expondrá estas funciones de cámara como relacionadas. Esto hace que la pila de cámaras del sistema operativo las exponga como un grupo relacionado de cámaras a las aplicaciones.

El firmware de la cámara debe especificar un UVC-FSSensorGroupID, que es un GUID en forma de cadena con el paréntesis curso. Las cámaras que tienen el mismo UVC-FSSensorGroupID se agruparán.

El grupo de sensores se puede asignar un nombre especificando UVC-FSSensorGroupName, una cadena Unicode, en el firmware.

Consulte la sección Ejemplo de dispositivo compuesto a continuación para obtener un ejemplo ilustrativo de BOS que especifica UVC-FSSensorGroupID y UVC-FSSensorGroupName.

Si no puede actualizar el firmware del dispositivo como se ha descrito anteriormente, puede usar un INF personalizado y especificar que la cámara forma parte de un grupo de sensores especificando un identificador de grupo de sensores y un nombre como se indica a continuación. El archivo INF personalizado (basado en el controlador UVC de la bandeja de entrada) debe incluir las siguientes entradas AddReg:

FSSensorGroupID: REG_SZ: "{el GUID del identificador del grupo de sensores}"

FSSensorGroupName: REG_SZ: "nombre descriptivo del grupo de sensores"

Un ejemplo para la sección INF personalizada sería el siguiente:

[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%

Nota

Los grupos de sensores no se admiten en la canalización de captura de DShow.

El método 2 o el método 3 siguen admitiendo la captura

La especificación UVC proporciona un mecanismo para especificar si la interfaz de streaming de vídeo admite la captura de imágenes de tipo 1/2/3 del método. Para que el sistema operativo aproveche la compatibilidad con la captura de imágenes del método 2/3 del dispositivo, a través del controlador UVC, el firmware del dispositivo podría especificar un valor en el descriptor de BOS.

El valor que se va a especificar para habilitar la captura de imágenes de tipo Method 2/3 es un DWORD denominado UVC-EnableDependentStillPinCapture. Especifique su valor mediante el descriptor BOS. El dispositivo compuesto de ejemplo siguiente muestra cómo habilitar la captura de imágenes fijas con un descriptor de BOS de ejemplo.

Si no puede actualizar el firmware del dispositivo como se ha descrito anteriormente, puede usar un INF personalizado para especificar que la cámara admita el método de captura método 2 o método 3.

El archivo INF personalizado (basado en el controlador UVC personalizado o en el controlador UVC de bandeja de entrada) debe incluir la siguiente entrada AddReg:

EnableDependentStillPinCapture: REG_DWORD: 0x0 (deshabilitado) en 0x1 (habilitado)

Cuando esta entrada se establece en Habilitado (0x1), la canalización de captura aprovecha el método 2/3 para la captura de imágenes fijas (suponiendo que el firmware también anuncia la compatibilidad con el método 2/3 según lo especificado por la especificación UVC).

Un ejemplo de la sección INF personalizada es el siguiente:

[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

Encadenamiento de MFT de dispositivos

Device MFT es el mecanismo de complemento de modo de usuario recomendado para IHV y OEM para ampliar la funcionalidad de cámara en Windows.

Antes de Windows 10, versión 1703, la canalización de cámara solo admitía un complemento de extensión DMFT.

A partir de Windows 10, versión 1703, la canalización de cámara de Windows admite una cadena opcional de DMFT con un máximo de dos DMFT.

A partir de Windows 11, versión 22H2, la canalización de cámara de Windows admite una cadena opcional de DMFT con un máximo de cuatro DMFT.

Esto proporciona una mayor flexibilidad para que los OEM y los IHD proporcionen un valor añadido en forma de secuencias de cámara de procesamiento posterior. Por ejemplo, un dispositivo podría usar PDMFT junto con un IHV DMFT y un DMFT OEM.

En la ilustración siguiente se muestra la arquitectura que implica una cadena de DMFT.

Cadena DMFT.

Capture el flujo de muestras del controlador de cámara a DevProxy y, a continuación, pase por las cadenas DMFT. Cada DMFT de la cadena tiene la oportunidad de procesar la muestra. Si el DMFT no desea procesar el ejemplo, puede actuar como paso a través simplemente pasar la muestra a la siguiente DMFT.

En el caso de los controles como KsProperty, la llamada va en sentido ascendente: la última DMFT de la cadena obtiene primero la llamada, la llamada se puede controlar allí o pasarse a DMFT anterior en la cadena.

Los errores se propagan de DMFT a DTM y, a continuación, a las aplicaciones. En el caso de dmfts de IHV/OEM, si alguna de las dmft no puede crear instancias, será un error grave para DTM.

Requisitos de DMFT:

  • El recuento de patillas de entrada de DMFT debe coincidir con el recuento de patillas de salida de DMFT anterior; de lo contrario, DTM produciría un error durante la inicialización. Sin embargo, no es necesario que coincidan los recuentos de patillas de entrada y salida del mismo DMFT.

  • DMFT necesita apoyar interfaces - IMFDeviceTransform, IMFShutdown, IMFRealTimeClientEx, IKsControl y IMFMediaEventGenerator; Es posible que sea necesario admitir IMFTransform si hay MFT0 configurado o la siguiente DMFT de la cadena requiere compatibilidad con IMFTransform.

  • En sistemas de 64 bits que no usan Frame Server, se deben registrar dmFT de 32 y 64 bits. Dado que una cámara USB podría conectarse a un sistema arbitrario, para cámaras USB "externas" (o no en la bandeja de entrada), el proveedor de la cámara USB debe suministrar DMFTs de 32 y 64 bits.

Configuración de la cadena DMFT

Un dispositivo de cámara puede proporcionar opcionalmente un objeto COM DMFT en un archivo DLL mediante un archivo INF personalizado que usa secciones de la bandeja de entrada USBVideo.INF.

En el personalizado . La sección "Interface AddReg" del archivo INF especifica los CLSID de DMFT agregando la siguiente entrada del Registro:

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

Como se muestra en la configuración de INF de ejemplo siguiente (reemplace %Dmft0.CLSID% y % Dmft1.CLSID% por las cadenas CLSID reales que usa para las DMFT), hay un máximo de 2 CLSID permitidos en Windows 10, versión 1703 y la primera es más cercana a DevProxy y la última es la última DMFT en la cadena.

El CLSID de DMFT de plataforma es {3D096DDE-8971-4AD5-98F9-C74F56492630}.

Algunos ejemplos de configuración cameraDeviceMftCLSIDChain :

  • No hay DMFT de IHV/OEM ni DMFT de plataforma

    • CameraDeviceMftCLSIDChain = "" (o no es necesario especificar esta entrada del Registro)
  • IHV/OEM DMFT

    • CameraDeviceMftCLSIDChain = %Dmft.CLSID%
  • DMFT <de plataforma:> IHV/OEM DMFT

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

    • Esta es una captura de pantalla de la clave del Registro de resultados para una cámara USB con la DMFT de plataforma y una DMFT (con GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7}) en la cadena.

Cadena DMFT del editor del Registro.

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

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

Nota

CameraDeviceMftCLSIDChain puede tener un máximo de 2 DE CLSID.

Si CameraDeviceMftCLSIDChain está configurado, DTM omite la configuración de CameraDeviceMftCLSID heredada.

Si CameraDeviceMftCLSIDChain no está configurado y el CameraDeviceMftCLSID heredado está configurado, la cadena tendría el aspecto (si su cámara USB y compatible con Platform DMFT y Platform DMFT está habilitado) DevProxy <–> Platform DMFT <–> OEM/IHV DMFT o (si la cámara no es compatible con Platform DMFT o Platform DMFT está deshabilitada) DevProxy <-> OEM/IHV DMFT.

Ejemplo de configuración del archivo 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 del dispositivo de plataforma

A partir de Windows 10, versión 1703, Windows proporciona un dispositivo de bandeja de entrada MFT para cámaras UVC conocidas como Platform DMFT (PDMFT) de forma opcional. Esta DMFT permite que los IMV y los OEM aprovechen los algoritmos de procesamiento posteriores proporcionados por Windows.

Características compatibles con Platform DMFT Versión de Windows
Habilita la región de interés (ROI) basada en caras para ajustes 3A en cámaras USB compatibles con ROI. Windows 10, versión 1703

Nota

Si la cámara no admite el ROI basado en UVC 1.5, el PDMFT no se cargará aunque el dispositivo opte por usar PDMFT.

Una cámara UVC podría optar por usar DMFT de plataforma mediante la especificación del descriptor EnablePlatformDmft a través de BOS.

El valor que se va a especificar para habilitar Platform DMFT es un DWORD por el nombre UVC-EnablePlatformDmft y especifica su valor mediante el descriptor BOS. En la sección Ejemplo de dispositivo compuesto siguiente se muestra cómo habilitar Platform DMFT con un descriptor de BOS de ejemplo.

Si no puede actualizar el firmware del dispositivo como se ha descrito anteriormente, puede usar un archivo INF personalizado para habilitar Platform DMFT para el dispositivo.

El archivo INF personalizado (basado en el controlador UVC personalizado o en el controlador UVC de bandeja de entrada) debe incluir la siguiente entrada AddReg:

EnablePlatformDmft: REG_DWORD: 0x0 (deshabilitado) en 0x1 (habilitado)

Cuando esta entrada se establece en Habilitado (0x1), la canalización de captura usa dmft de la bandeja de entrada para el dispositivo. A continuación se muestra un ejemplo de esta sección INF personalizada:

[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

En Windows 10, versión 1703, si un dispositivo opta por usar PDMFT, todas las características compatibles con PDMFT están habilitadas (en función de las funcionalidades del dispositivo). No se admite la configuración granular de las características de PDMFT.

Nota

Las coordenadas de ROI basadas en caras se calculan en relación con el campo de vista de la imagen transmitida al PDMFT. Si el campo de vista se ha modificado debido al uso de un control como Zoom, Pan o Inclinación oVentana digital, la cámara es responsable de asignar las coordenadas proporcionadas de nuevo al campo de vista completo del sensor, teniendo en cuenta la ventana actual de zoom o panorámica.

Perfil de autenticación facial a través de descriptores de SO ms

Windows 10 RS5 ahora aplica un requisito de Face Auth Profile V2 para cualquier cámara que admita Windows Hello. En el caso de los sistemas basados en MIPI con pila de controladores de cámara personalizada, esta compatibilidad se puede publicar a través de un INF (o un INF de extensión) o a través de un complemento de modo de usuario (Device MFT).

Sin embargo, para los dispositivos de vídeo USB, no se permite una restricción con cámaras basadas en UVC para Windows 10 19H1, no se permiten controladores de cámara personalizados. Todas las cámaras basadas en UVC deben usar el controlador USB Video Class de la bandeja de entrada y todas las extensiones de proveedor deben implementarse en forma de dispositivo MFT.

Para muchos OEM/OEM, el enfoque preferido para los módulos de cámara es implementar gran parte de la funcionalidad dentro del firmware del módulo, es decir, a través de descriptores de sistema operativo de Microsoft.

Se admiten las siguientes cámaras para publicar el perfil de autenticación facial a través de los descriptores de MSOS (también denominados descriptores de BOS):

  • Solo la cámara RGB que se va a usar en el grupo de sensores con una cámara IR independiente.

  • Solo la cámara ir que se va a usar en un grupo de sensores con una cámara RGB independiente.

  • Cámara RGB+IR con patillas IR y RGB independientes.

Nota

Si el firmware de la cámara no puede cumplir uno de los tres requisitos detallados anteriormente, el ODM/OEM debe usar un INF de extensión para declarar el perfil de cámara V2.

Ejemplo de diseño del descriptor del sistema operativo de Microsoft

A continuación se incluyen ejemplos para las especificaciones siguientes:

  • Especificación de descriptores extendidos del sistema operativo de Microsoft 1.0

  • Especificación de descriptores de Microsoft OS 2.0

Especificación del descriptor extendido 1.0 de Microsoft OS

El descriptor del sistema operativo de propiedades extendidas tiene dos componentes

  • Una sección de encabezado de longitud fija
  • Una o varias secciones de propiedades personalizadas de longitud variable, que siguen la sección de encabezado

Sección de encabezado de descriptor de Microsoft OS 1.0

La sección Encabezado describe una única propiedad personalizada (Perfil de autenticación de Face).

Offset Campo Tamaño (bytes) Valor Descripción
0 dwLength 4 <>
4 bcdVersion 2 0x0100 Versión 1.0
6 Windex 2 0x0005 Descriptor de so de propiedad extendida
8 wCount 2 0x0001 Una propiedad personalizada

Sección de propiedades personalizadas del descriptor de Microsoft OS 1.0

Offset Campo Tamaño (bytes) Valor Descripción
0 dwSize 4 0x00000036 (54) Tamaño total (en bytes) para esta propiedad.
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) Tamaño (en bytes) del nombre de propiedad.
10 bPropertyName 36 UVC-CPV2FaceAuth Cadena "UVC-CPV2FaceAuth" en Unicode.
46 dwPropertyDataLength 4 0x00000004 4 bytes para los datos de propiedad (sizeof(DWORD)).
50 bPropertyData 4 Consulte esquema de datos a continuación. Consulte Esquema de datos a continuación.
Esquema de carga

La carga de datos UVC-CPV2FaceAuth es un entero de 32 bits sin signo. El orden alto de 16 bits representa el índice basado en 0 de la lista de tipos multimedia expuestos por el pin RGB. El orden bajo de 16 bits representa el índice basado en 0 de la lista de tipos multimedia expuestos por el pin de IR.

Por ejemplo, una cámara de tipo 3 que expone los siguientes tipos de medios, en el orden declarado desde el pin RGB:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

Y el siguiente tipo de medio para IR:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Un valor de carga de 0x00010000 dará lugar a que se publique el siguiente perfil de autenticación facial:

Pin0:(RES==1280,720; FRT==30,1; SUT==MJPG) // Segundo tipo de medio (0x0001)
Pin1:(RES==480,480; FRT==30,1; SUT==L8) // Primer tipo de medio (0x0000)

Nota

En el momento de redactar este documento, Windows Hello tiene un requisito mínimo de 480x480@7.5fps para la secuencia RGB y 340x340@15fps para la secuencia de IR. Los IHV/OEM son necesarios para seleccionar tipos de medios que cumplan este requisito al habilitar el perfil de autenticación facial.

Ejemplo de cámara de tipo 1

Para una cámara de tipo 1, ya que no hay ningún pin IR (con la expectativa de que una cámara de tipo 1 se emparejará con una cámara de tipo 2 en la máquina de un grupo de sensores), solo se publica el índice de tipo de medio RGB. Para el índice de tipo de medio de IR, el valor de 16 bits de orden bajo de la carga debe establecerse en 0xFFFF.

Por ejemplo, si una cámara de tipo 1 expone la siguiente lista de tipos de medios:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

Para publicar CPV2FaceAuth mediante MJPG, 1280x720@30fps tipo de medio, la carga debe establecerse en 0x0001FFFF.

Ejemplo de cámara de tipo 2

Para una cámara de tipo 2, el orden alto de 16 bits debe establecerse en 0xFFFF, con el orden bajo de 16 bits que indica el tipo de medio IR que se va a usar.

Por ejemplo, para una cámara de tipo 2 con los siguientes tipos de medios:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Si se usa el primer tipo de medio para Face Auth, el valor debe ser: 0xFFFF0000.

Especificación del descriptor extendido 2.0 de Microsoft OS

El descriptor extendido de MSOS 2.0 se puede usar para definir los valores del Registro para agregar compatibilidad con el perfil de autenticación facial. Esto se hace mediante el Descriptor de propiedad del Registro de Microsoft OS 2.0.

Para la entrada del Registro de UVC-CPV2FaceAuth, a continuación se muestra un conjunto de descriptores de MSOS 2.0 de ejemplo:

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)
}

Cuando se agrega UVC-CPV2FaceAuth entrada del Registro, los dispositivos no necesitan publicar la entrada del Registro EnableDshowRedirection, como se describe en Guía de implementación de Puente DShow para dispositivos UVC.

Sin embargo, si el proveedor del dispositivo debe admitir versiones anteriores de Windows o debe habilitar la descompresión de MJPEG en Frame Server, se debe agregar la entrada del Registro EnableDshowRedirection.

Generación de grupos de sensores

Cuando los OEM crean sistemas con cámaras de tipo 1 y tipo 2 para proporcionar secuencias RGB e IR para Windows Hello compatibilidad, los OEM deben declarar las dos cámaras para formar parte de un grupo de sensores sintetizado.

Para ello, se declara una etiqueta FSSensorGroupId y FSSensorGroupName en una extensión INF que se va a crear en la propiedad de interfaz del dispositivo para cada cámara.

Sin embargo, si no se proporciona extension INF, los OEM pueden usar los mismos descriptores de MSOS para publicar los valores FSSensorGroupId y FSSensorGroupName. La bandeja de entrada Windows 10 controlador de clase de vídeo USB tomará automáticamente cualquier descriptor de MSOS cuyo nombre de carga se haya precedido con "UVC-" y migrará la etiqueta al almacén de propiedades de la interfaz del dispositivo (quitando el prefijo "UVC-").

Por lo tanto, una cámara de tipo 1 y tipo 2 que publique lo siguiente permitirá al sistema operativo sintetizar las cámaras en un grupo de sensores de varios dispositivos para su uso con Windows Hello:

UVC-FSSensorGroupId
UVC-FSSensorGroupName

La carga de cada etiqueta debe ser una cadena Unicode. La carga UVC-FSSensorGroupId debe ser una cadena GUID con el siguiente formato:

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

El valor del GUID debe ser el mismo entre las cámaras tipo 1 y tipo 2 y ambas cámaras deben agregarse al mismo chasis físico. Para cámaras integradas, el chasis físico es el propio ordenador. En el caso de las cámaras externas, los módulos Type 1 y Type 2 Camera deben estar integrados en el mismo dispositivo físico conectado al equipo.

Categorías de interfaz de dispositivo personalizadas para grupos de sensores

A partir de 19H1, Windows proporciona un mecanismo de extensión especificado por IHV/OEM para permitir la publicación de grupos de sensores sintetizados en cualquier categoría personalizada o predefinida. La generación de un grupo de sensores se define mediante IHV/OEMs que proporcionan una clave de identificador de grupo de sensores en el INF personalizado:

FSSensorGroupId: {GUID personalizado}
FSSensorGroupName: <nombre descriptivo usado para el grupo de sensores>

Además de las dos entradas AddReg anteriores en INF, se define una nueva entrada AddReg para categorías personalizadas:

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

Varias categorías se definen mediante un punto y coma (;) lista guid delimitada.

Cada dispositivo que declara un FSSensorGroupId coincidente debe declarar el mismo FSSensorGroupCategoryList. Si la lista no coincide, todas las listas se omiten y el grupo de sensores se publica de forma predeterminada en KSCATEGORY_SENSOR_GROUP como si no se definiesen categorías personalizadas.

Rotación de cámara

Consulta Orientación del dispositivo de cámara

Caché de control UVC

Consulte Caché de controles UVC.

DESCRIPTOR BOS y MS OS 2.0

La cámara compatible con UVC puede especificar valores de configuración de dispositivos específicos de Windows en un descriptor BOS de funcionalidad de plataforma en su firmware mediante descriptores de Microsoft OS 2.0. Consulte la documentación sobre el descriptor de MS OS 2.0 para comprender cómo especificar un descriptor DE BOS válido que transmita la configuración del dispositivo al sistema operativo.

Encabezado del conjunto de descriptores de Microsoft OS 2.0

Offset Campo Tamaño (bytes) Descripción
0 wLength 2 La longitud en bytes de este encabezado debe ser 10.
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 4 Versión de Windows.
8 wTotalLength 2 Tamaño del conjunto completo de descriptores de MS OS 2.0, incluido este tamaño de encabezado.

Descriptor de propiedad del Registro de Microsoft OS 2.0

Offset Campo Tamaño (bytes) Descripción
0 wLength 2 Longitud en bytes de este descriptor
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 0x04 (REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 Longitud del nombre de la propiedad.
8 PropertyName Variable Nombre de la propiedad del Registro.
8+M wPropertyDataLength 2 Longitud de los datos de propiedad.
10+M PropertyData Variable Datos de propiedad

Cuando se especifica un descriptor de MS OS 2.0 válido en el firmware, la pila USB copia los valores de configuración en la clave del Registro HW del dispositivo que se muestra a continuación:

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

El controlador UVC lee los valores de configuración de la clave del Registro HW del dispositivo y configura el dispositivo en el sistema operativo en consecuencia. Por ejemplo, si el firmware especifica el dispositivo que se va a registrar como una cámara de sensor mediante un valor de configuración, el controlador UVC registra el dispositivo justo debajo de esa categoría.

La configuración de dispositivos UVC a través del descriptor bos de plataforma es un mecanismo que se ha habilitado en Windows 10, versión 1703, para ayudar a los proveedores de dispositivos UVC a configurar el dispositivo sin necesidad de un archivo INF en el sistema operativo Windows.

La configuración de dispositivos UVC a través de INF personalizado sigue siendo compatible y tiene prioridad sobre el mecanismo basado en descriptores DE BOS. Al especificar las propiedades del dispositivo a través de INF, no es necesario agregar el prefijo "UVC-". Este prefijo solo es necesario para las propiedades del dispositivo que se especifican a través del descriptor DE BOS y que son específicas de cada instancia de interfaz. Si el dispositivo necesita complementos de modo de usuario como DMFT, debe proporcionar un INF para instalar dmft. No se puede configurar mediante firmware.

Valores de configuración admitidos actualmente a través del descriptor de BOS

Nombre de la configuración Tipo Descripción
SensorCameraMode REG_DWORD Registre la cámara en una categoría específica.
UVC-FSSensorGroupID, UVC-FSSensorGroupName REG_SZ Agrupar cámaras con la misma UVC-FSSensorGroupID
UVC-EnableDependentStillPinCapture REG_DWORD Para habilitar el método de captura todavía 2/3
UVC-EnablePlatformDmft REG_DWORD Para habilitar Platform DMFT

Cuando el controlador UVC ve los valores del Registro con el prefijo "UVC-", rellena la clave del Registro de la instancia de la interfaz de categoría del dispositivo, con los mismos valores sin el prefijo. El controlador lo hace para cualquier variable especificada por el firmware, no solo las indicadas anteriormente.

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

Para que el sistema operativo use la funcionalidad del dispositivo de la plataforma BOS y los descriptores de MS OS 2.0, el descriptor de dispositivo debe especificar la versión bcdUSB que se va a 0x0210 o superior.

Dispositivo compuesto de ejemplo

En esta sección se proporciona un descriptor de BOS y un descriptor ms OS 2.0 para un dispositivo compuesto de ejemplo con dos funciones de cámara. Una función es una cámara de color UVC y la segunda función es una cámara UVC IR.

Los descriptores de ejemplo son los siguientes:

  1. Registre la función de cámara de color en KSCATEGORY_VIDEO_CAMERA

  2. Registre la función de cámara ir en KSCATEGORY_SENSOR_CAMERA

  3. Habilitación de la función de cámara de color captura de imagen

  4. Asocia las funciones de color y cámara IR como un grupo

Tras la enumeración del dispositivo, la pila USB recupera el descriptor BOS del dispositivo. Después del descriptor bos es una funcionalidad específica del dispositivo de la plataforma.

#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
};

El descriptor de funcionalidad de la plataforma BOS especifica:

  1. GUID de funcionalidad de la plataforma de descriptores de MS OS 2.0

  2. Un código de control de proveedor bMS_VendorCode (aquí está establecido en 1. Puede tomar cualquier valor que prefiera el proveedor) para recuperar el descriptor de MS OS 2.0.

  3. Este descriptor de BOS es aplicable a la versión del sistema operativo Windows 10 y versiones posteriores.

Después de ver el descriptor de BOS, la pila USB emitirá la solicitud de control específica del proveedor para recuperar el descriptor de MS OS 2.0.

Formato de la solicitud de control para recuperar el descriptor específico del proveedor de MS OS 2.0:

bmRequestType BRequest wValue Windex wLength data
1100 0000B bMS_VendorCode 0x00 0x07 Length Blob de conjunto de descriptores de MS OS 2.0 devuelto

bmRequestType

  • Dirección de transferencia de datos: dispositivo a host

  • Tipo: proveedor

  • Destinatario: dispositivo

bRequest

Valor bMS_VendorCode devuelto en la estructura de información del conjunto de descriptores.

wValue

Establezca en 0x00.

Windex

0x7 para MS_OS_20_DESCRIPTOR_INDEX.

wLength

Longitud del conjunto de descriptores de MS OS 2.0, tal y como se devuelve en el descriptor de BOS. 0x25C (604) en este ejemplo.

Se espera que el dispositivo devuelva el descriptor MS OS 2.0 como el especificado en USBVideoMSOS20DescriptorSet.

USBVideoMSOS20DescriptorSet describe las funciones de color e IR. Especifica los siguientes valores descriptores de MS OS 2.0:

  1. Establecer encabezado

  2. Encabezado de subconjunto de configuración

  3. Encabezado de subconjunto de función de cámara de color

  4. Descriptor de características de valor del Registro para el identificador del grupo de sensores

  5. Descriptor de características de valor del Registro para el nombre del grupo de sensores

  6. Descriptor de característica de valor del Registro para habilitar la captura de imágenes fijas

  7. Descriptor de características de valor del Registro para habilitar la dmft de plataforma

  8. Encabezado de subconjunto de función de cámara ir

  9. Descriptor de características de valor del Registro para el identificador del grupo de sensores

  10. Descriptor de características de valor del Registro para el nombre del grupo de sensores

  11. Descriptor de característica de valor del Registro para registrar la cámara como una cámara de sensor

El firmware tendrá un controlador para la solicitud del proveedor que devolverá el siguiente descriptor de MS OS 2.0 para el dispositivo imaginario descrito al principio de esta sección.

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
};