Guide d’implémentation de la caméra USB Video Class (UVC)

À compter de Windows 10, un pilote de classe vidéo USB (UVC) de boîte de réception est fourni pour les appareils conformes à la spécification usb Video Class (versions 1.0 à 1.5). Ce pilote prend en charge les caméras de type couleur et capteur. Ce document explique comment exposer certaines fonctionnalités d’une caméra compatible UVC aux applications via le pilote de boîte de réception.

Terminologie

Mot clé Description
UVC Classe vidéo USB
Pilote UVC USBVideo.sys pilote fourni avec le système d’exploitation
IR Infrarouge
Caméra couleur Caméra qui génère des flux de couleurs (par exemple, caméras RVB ou YUV)
Caméra du capteur Caméra qui génère des flux sans couleur (par exemple, ir ou caméras de profondeur)
BOS Magasin d’objets d’appareils binaires
Descripteur MS OS 2.0 Descripteur de capacité d’appareil BOS spécifique à la plateforme Microsoft

Caméras de capteur

Windows prend en charge deux catégories d’appareils photo. L’une est une caméra couleur et l’autre est une caméra de capteur sans couleur. Les caméras RVB ou YUV sont classées en tant que caméras couleur et les caméras non-couleur comme l’échelle de gris, les caméras IR et les caméras de profondeur sont classées comme des caméras de capteur. Le pilote UVC prend en charge les deux types de caméras. Nous recommandons que le microprogramme de l’appareil photo spécifie une valeur en fonction de laquelle le pilote UVC inscrireait la caméra dans une ou les deux catégories prises en charge.

Une caméra qui prend en charge les types de format couleur uniquement doit être inscrite sous KSCATEGORY_VIDEO_CAMERA. Une caméra qui prend en charge les types de format IR ou Profondeur uniquement doit être inscrite sous KSCATEGORY_SENSOR_CAMERA. Un appareil photo qui prend en charge les types de format couleur et non couleur doit être inscrit sous KSCATEGORY_VIDEO_CAMERA et KSCATEGORY_SENSOR_CAMERA. Cette catégorisation aide les applications à sélectionner la caméra avec laquelle elles souhaitent travailler.

Une caméra UVC peut spécifier sa préférence de catégorie par le biais d’attributs, SensorCameraMode et SkipCameraEnumeration, dans son descripteur BOS MS OS 2.0 détaillé dans les sections suivantes.

L’attribut SensorCameraMode prend la valeur 1 ou 2.

La valeur 1 inscrit l’appareil sous KSCATEGORY_SENSOR_CAMERA. En outre, spécifiez la valeur 1 pour SkipCameraEnumeration afin de rendre l’appareil photo disponible pour les applications qui recherchent uniquement des caméras de capteur. Une caméra qui expose uniquement les types de médias de caméra de capteur doit utiliser cette valeur.

La valeur 2 pour SensorCameraMode inscrit l’appareil sous KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA. Cela rend l’appareil photo disponible pour les applications qui recherchent des capteurs et des caméras couleur. Une caméra qui expose à la fois les types de caméra de capteur et de caméra couleur doit utiliser cette valeur.

Nous vous recommandons de spécifier la valeur de Registre mentionnée ci-dessus à l’aide du descripteur BOS. Reportez-vous à la section Exemple d’appareil composite ci-dessous pour obtenir un exemple de descripteur BOS avec un descripteur MS OS 2.0 spécifique à la plateforme.

Si vous ne pouvez pas mettre à jour le microprogramme de l’appareil comme décrit ci-dessus, vous pouvez utiliser un INF personnalisé et spécifier que votre caméra doit être inscrite en tant que caméra de capteur en spécifiant une valeur pour SensorCameraMode et SkipCameraEnumeration comme suit :

Un fichier INF personnalisé (basé sur le pilote UVC de boîte de réception) doit inclure les entrées AddReg suivantes :

SensorCameraMode : REG_DWORD : 1 (pour s’inscrire en tant que caméra de capteur)

SkipCameraEnumeration : REG_DWORD : 1 (rendre disponible uniquement pour les applications ir)

Voici un exemple de section INF personnalisée :

[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 les attributs SensorCameraMode et SkipCameraEnumeration ne sont pas spécifiés dans le microprogramme ou l’INF, l’appareil photo est enregistré en tant qu’appareil photo couleur et n’est visible que pour les applications prenant en charge la caméra couleur.

Flux IR

Le pilote DE classe vidéo USB (UVC) de la boîte de réception Windows prend en charge les caméras qui capturent la scène au format YUV et transmettent les données de pixels via USB en tant que trames YUV non compressées ou MJPEG compressées.

Les GUID de type de format suivants doivent être spécifiés dans le descripteur de format vidéo de flux, comme défini dans le fichier d’en-tête WDK ksmedia.h :

Type Description
KSDATAFORMAT_SUBTYPE_L8_IR Plan luma 8 bits non compressé. Ce type est mappé à MFVideoFormat_L8.
KSDATAFORMAT_SUBTYPE_L16_IR Plan luma 16 bits non compressé. Ce type est mappé à MFVideoFormat_L16.
KSDATAFORMAT_SUBTYPE_MJPG_IR Images MJPEG compressées. Media Foundation convertit cela en trames non compressées NV12 et utilise uniquement le plan luma.

Lorsque ces GUID de type de format sont spécifiés dans le champ guidFormat du descripteur de frame, le pipeline de capture Media Foundation marque le flux en tant que flux IR. Les applications écrites avec l’API Media Foundation FrameReader pourront utiliser le flux ir. Aucune mise à l’échelle ou conversion des trames IR n’est prise en charge par le pipeline pour les flux ir.

Un flux exposant des types de format IR ne doit pas exposer les types de format RVB ou 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;

Notes

Les flux IR s’affichent en tant que flux de capture standard dans DShow.

Flux de profondeur

Le pilote de classe vidéo USB de la boîte de réception Windows prend en charge les caméras qui produisent des flux de profondeur. Ces caméras capturent les informations de profondeur (par exemple, l’heure de vol) de la scène et transmettent la carte de profondeur sous forme d’images YUV non compressées via USB. Le GUID de type de format suivant doit être spécifié dans le descripteur de format vidéo de flux, comme défini dans le fichier d’en-tête ksmedia.h WDK :

Type Description
KSDATAFORMAT_SUBTYPE_D16 Valeurs de carte de profondeur 16 bits. Ce type est identique à MFVideoFormat_D16. Les valeurs sont en millimètres.

Lorsque le type de format GUID est spécifié dans le membre guidFormat du descripteur de frame, le pipeline de capture Media Foundation marque le flux comme flux de profondeur. Les applications écrites avec l’API FrameReader pourront consommer le flux de profondeur. Aucune mise à l’échelle ou conversion des trames de profondeur n’est prise en charge par le pipeline pour les flux de profondeur.

Un flux exposant des types de format Depth ne doit pas exposer les types de format RVB ou 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;

Notes

Les flux de profondeur s’affichent en tant que flux de capture standard dans DShow.

Regroupement de caméras

Windows prend en charge le regroupement des caméras en fonction de leur ID de conteneur pour aider les applications à travailler avec des caméras associées. Par exemple, une caméra IR et une caméra couleur présentes sur le même appareil physique peuvent être exposées au système d’exploitation en tant que caméras associées. Cela permet à des applications telles que Windows Hello d’utiliser les caméras associées pour leurs scénarios.

La relation entre les fonctions de la caméra peut être spécifiée dans le descripteur BOS de l’appareil photo dans le microprogramme. Le pilote UVC utilisera ces informations et exposera ces fonctions de caméra comme connexes. Cela permet à la pile de caméras du système d’exploitation de les exposer en tant que groupe de caméras connexes aux applications.

Le microprogramme de l’appareil photo doit spécifier un UVC-FSSensorGroupID, qui est un GUID sous forme de chaîne avec la parenthèse bouclée. Les caméras qui ont le même UVC-FSSensorGroupID seront regroupées.

Vous pouvez attribuer un nom au groupe de capteurs en spécifiant UVC-FSSensorGroupName, une chaîne Unicode, dans le microprogramme.

Reportez-vous à la section Exemple d’appareil composite ci-dessous pour obtenir un exemple d’exemple BOS qui spécifie UVC-FSSensorGroupID et UVC-FSSensorGroupName.

Si vous ne pouvez pas mettre à jour le microprogramme de l’appareil comme décrit ci-dessus, vous pouvez utiliser un INF personnalisé et spécifier que votre appareil photo fait partie d’un groupe de capteurs en spécifiant un ID et un nom de groupe de capteurs comme suit. Le fichier INF personnalisé (basé sur le pilote UVC de boîte de réception) doit inclure les entrées AddReg suivantes :

FSSensorGroupID : REG_SZ : « {GUID d’ID de votre groupe de capteurs} »

FSSensorGroupName : REG_SZ : « nom convivial de votre groupe de capteurs »

Voici un exemple pour la section INF personnalisée :

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

Notes

Les groupes de capteurs ne sont pas pris en charge dans le pipeline de capture DShow.

Prise en charge de la méthode 2 ou de la méthode 3

La spécification UVC fournit un mécanisme permettant de spécifier si l’interface de streaming vidéo prend en charge la capture d’images fixes de type méthode 1/2/3. Pour que le système d’exploitation tire parti de la prise en charge de la capture d’images fixes de la méthode 2/3 de l’appareil, via le pilote UVC, le microprogramme du périphérique peut spécifier une valeur dans le descripteur BOS.

La valeur à spécifier pour activer la capture d’images fixes de la méthode 2/3 est un DWORD nommé UVC-EnableDependentStillPinCapture. Spécifiez sa valeur à l’aide du descripteur BOS. L’exemple d’appareil composite ci-dessous illustre l’activation de la capture d’images fixes avec un exemple de descripteur BOS.

Si vous ne pouvez pas mettre à jour le microprogramme de l’appareil comme décrit ci-dessus, vous pouvez utiliser un INF personnalisé pour spécifier que votre appareil photo prend toujours en charge la méthode de capture 2 ou la méthode 3.

Le fichier INF personnalisé (basé sur le pilote UVC personnalisé ou le pilote UVC de boîte de réception) doit inclure l’entrée AddReg suivante :

EnableDependentStillPinCapture : REG_DWORD : 0x0 (Désactivé) à 0x1 (Activé)

Lorsque cette entrée est définie sur Activé (0x1), le pipeline de capture utilise la méthode 2/3 pour la capture d’images fixes (en supposant que le microprogramme publie également la prise en charge de la méthode 2/3, comme spécifié par les spécifications UVC).

Voici un exemple pour la section INF personnalisée :

[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

Chaînage MFT d’appareil

Device MFT est le mécanisme de plug-in en mode utilisateur recommandé pour les IVS et les oem afin d’étendre la fonctionnalité de caméra sur Windows.

Avant Windows 10 version 1703, le pipeline de caméra ne supportait qu’un seul plug-in d’extension DMFT.

À compter de Windows 10, version 1703, le pipeline de caméras Windows prend en charge une chaîne facultative de DMFTs avec un maximum de deux DMFT.

À compter de Windows 11, version 22H2, le pipeline de caméras Windows prend en charge une chaîne facultative de DMFTs avec un maximum de quatre DMFT.

Cela offre une plus grande flexibilité aux fabricants OEM et aux IVS pour fournir une valeur ajoutée sous la forme de flux de caméra de post-traitement. Par exemple, un appareil peut utiliser PDMFT avec un DMFT IHV et un DMFT OEM.

La figure suivante illustre l’architecture impliquant une chaîne de DMFT.

Chaîne DMFT.

Capturez le flux d’exemples du pilote de caméra vers DevProxy, puis passez par les chaînes DMFT. Chaque DMFT de la chaîne a la possibilité de traiter l’échantillon. Si le DMFT ne souhaite pas traiter l’exemple, il peut agir en tant que pass-through simplement passer l’exemple à DMFT suivant.

Pour les contrôles tels que KsProperty, l’appel est amont : le dernier DMFT de la chaîne obtient d’abord l’appel, l’appel peut y être géré ou passé à DMFT précédent dans la chaîne.

Les erreurs sont propagées de DMFT à DTM, puis aux applications. Pour les DMFT IHV/OEM, si l’un des DMFT ne parvient pas à instancier, il s’agit d’une erreur irrécupérable pour DTM.

Configuration requise pour les DMFT :

  • Le nombre de broches d’entrée du DMFT doit correspondre au nombre de broches de sortie du DMFT précédent, sinon DTM échouerait lors de l’initialisation. Toutefois, les nombres de broches d’entrée et de sortie du même DMFT n’ont pas besoin de correspondre.

  • DMFT doit prendre en charge les interfaces : IMFDeviceTransform, IMFShutdown, IMFRealTimeClientEx, IKsControl et IMFMediaEventGenerator ; IMFTransform peut avoir besoin d’être pris en charge s’il existe MFT0 configuré ou si le DMFT suivant dans la chaîne nécessite la prise en charge de IMFTransform.

  • Sur les systèmes 64 bits qui n’utilisent pas Frame Server, les DMFT 32 bits et 64 bits doivent être inscrits. Étant donné qu’une caméra USB peut être branchée à un système arbitraire, pour les caméras USB « externes » (ou hors boîte de réception), le fournisseur de caméras USB doit fournir des DMFT 32 bits et 64 bits.

Configuration de la chaîne DMFT

Un appareil photo peut éventuellement fournir un objet COM DMFT dans une DLL à l’aide d’un fichier INF personnalisé qui utilise des sections de la boîte de réception USBVideo.INF.

Dans le personnalisé. Dans la section « Interface AddReg » du fichier INF, spécifiez les CLSID DMFT en ajoutant l’entrée de Registre suivante :

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

Comme indiqué dans les exemples de paramètres INF ci-dessous (remplacez %Dmft0.CLSID% et % Dmft1.CLSID% par les chaînes CLSID réelles que vous utilisez pour vos DMFT), il y a un maximum de 2 CLSID autorisés dans Windows 10, version 1703, et le premier est le plus proche de DevProxy et le dernier est le dernier DMFT dans la chaîne.

Le CLSID DMFT de plateforme est {3D096DDE-8971-4AD5-98F9-C74F56492630}.

Voici quelques exemples de paramètres CameraDeviceMftCLSIDChain :

  • Aucun DMFT IHV/OEM ou DMFT de plateforme

    • CameraDeviceMftCLSIDChain = «  » (ou pas besoin de spécifier cette entrée de Registre)
  • IHV/OEM DMFT

    • CameraDeviceMftCLSIDChain = %Dmft.CLSID%
  • Platform DMFT <-> IHV/OEM DMFT

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

    • Voici une capture d’écran de la clé de Registre des résultats pour une caméra USB avec le DMFT de plateforme et un DMFT (avec le GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7}) dans la chaîne.

Chaîne DMFT de l’éditeur de Registre.

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

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

Notes

CameraDeviceMftCLSIDChain peut avoir un maximum de 2 CLSID.

Si CameraDeviceMftCLSIDChain est configuré, les paramètres hérités de CameraDeviceMftCLSID sont ignorés par DTM.

Si CameraDeviceMftCLSIDChain n’est pas configuré et que l’ancien CameraDeviceMftCLSID est configuré, la chaîne se présente comme suit (si sa caméra USB et prise en charge par platform DMFT et Platform DMFT est activée) DevProxy <–> Platform DMFT <–> OEM/IHV DMFT ou (si la caméra n’est pas prise en charge par platform DMFT ou Platform DMFT est désactivée) DevProxy <-> OEM/IHV DMFT.

Exemples de paramètres de fichier 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 de l’appareil de plateforme

À compter de Windows 10, version 1703, Windows fournit une boîte de réception MFT pour les caméras UVC appelées Platform DMFT (PDMFT) sur une base d’adhésion. Ce DMFT permet aux IMV et aux fabricants OEM de tirer parti des algorithmes de post-traitement fournis par Windows.

Fonctionnalités prises en charge par Platform DMFT Windows Release
Active la région d’intérêt basée sur les visages pour les ajustements 3A dans les caméras USB compatibles ROI. Windows 10 version 1703

Notes

Si la caméra ne prend pas en charge le retour sur investissement basé sur UVC 1.5, le PDMFT ne se charge pas même si l’appareil a choisi d’utiliser PDMFT.

Une caméra UVC peut choisir d’utiliser la plateforme DMFT en spécifiant EnablePlatformDmft via le descripteur BOS.

La valeur à spécifier pour activer Platform DMFT est un DWORD de nom UVC-EnablePlatformDmft et spécifiez sa valeur à l’aide du descripteur BOS. La section Exemple d’appareil composite ci-dessous illustre l’activation de Platform DMFT avec un exemple de descripteur BOS.

Si vous ne pouvez pas mettre à jour le microprogramme de l’appareil comme décrit ci-dessus, vous pouvez utiliser un fichier INF personnalisé pour activer Platform DMFT pour l’appareil.

Le fichier INF personnalisé (basé sur le pilote UVC personnalisé ou le pilote UVC de boîte de réception) doit inclure l’entrée AddReg suivante :

EnablePlatformDmft : REG_DWORD : 0x0 (désactivé) sur 0x1 (activé)

Lorsque cette entrée est définie sur Activé (0x1), le pipeline de capture utilise la boîte de réception Platform DMFT pour l’appareil. Voici un exemple de cette section INF personnalisée :

[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

Dans Windows 10 version 1703, si un appareil accepte d’utiliser PDMFT, toutes les fonctionnalités prises en charge par le PDMFT sont activées (en fonction des fonctionnalités de l’appareil). La configuration granulaire des fonctionnalités PDMFT n’est pas prise en charge.

Notes

Les coordonnées de retour sur investissement basées sur les visages sont calculées par rapport au champ de vision de l’image transmise dans le PDMFT. Si le champ de vue a été modifié en raison de l’utilisation d’un contrôle tel que Zoom, Panoramique, Inclinaison ouFenêtre numérique, l’appareil photo est chargé de mapper les coordonnées fournies au champ de vue complet du capteur, compte tenu de la fenêtre de zoom/panoramique actuelle.

Profil d’authentification des visages via les descripteurs MS OS

Windows 10 RS5 applique désormais une exigence de profil d’authentification des visages V2 pour toute caméra avec prise en charge Windows Hello. Pour les systèmes basés sur MIPI avec pile de pilotes de caméra personnalisée, cette prise en charge peut être publiée via un INF (ou un INF d’extension) ou via un plug-in en mode utilisateur (MFT d’appareil).

Toutefois, pour les périphériques VIDÉO USB, une contrainte avec les caméras UVC est que pour Windows 10 19H1, les pilotes de caméra personnalisés ne sont pas autorisés. Toutes les caméras UVC doivent utiliser le pilote de classe vidéo USB de boîte de réception et toutes les extensions de fournisseur doivent être implémentées sous la forme d’un appareil MFT.

Pour de nombreux FABRICANTS OEM/ODM, l’approche recommandée pour les modules d’appareil photo consiste à implémenter une grande partie des fonctionnalités dans le microprogramme du module, c’est-à-dire via les descripteurs de système d’exploitation Microsoft.

Les caméras suivantes sont prises en charge pour la publication du profil d’authentification des visages via les descripteurs MSOS (également appelés descripteurs BOS) :

  • Caméra RVB uniquement à utiliser dans le groupe de capteurs avec une caméra IR distincte.

  • Caméra IR uniquement à utiliser dans un groupe de capteurs avec une caméra RVB distincte.

  • Caméra RVB+IR avec des broches IR et RVB distinctes.

Notes

Si le microprogramme de l’appareil photo ne peut pas répondre à l’une des trois exigences détaillées ci-dessus, l’ODM/OEM doit utiliser une extension INF pour déclarer le profil d’appareil photo V2.

Exemple de disposition du descripteur de système d’exploitation Microsoft

Des exemples sont inclus ci-dessous pour les spécifications suivantes :

  • Spécification des descripteurs étendus du système d’exploitation Microsoft 1.0

  • Spécification des descripteurs Microsoft OS 2.0

Spécification du descripteur étendu du système d’exploitation Microsoft 1.0

Le descripteur de système d’exploitation des propriétés étendues comporte deux composants

  • Section d’en-tête de longueur fixe
  • Une ou plusieurs sections de propriétés personnalisées de longueur variable, qui suivent la section d’en-tête

Section d’en-tête de descripteur de système d’exploitation Microsoft 1.0

La section En-tête décrit une propriété personnalisée unique (Profil d’authentification visage).

Offset Champ Taille (en octets) Valeur Description
0 dwLength 4 <>
4 bcdVersion 2 0x0100 Version 1.0
6 Windex 2 0x0005 Descripteur de système d’exploitation de propriété étendue
8 wCount 2 0x0001 Une propriété personnalisée

Section Descripteur personnalisé microsoft OS 1.0

Offset Champ Taille (en octets) Valeur Description
0 dwSize 4 0x00000036 (54) Taille totale (en octets) de cette propriété.
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) Taille (en octets) du nom de la propriété.
10 bPropertyName 36 UVC-CPV2FaceAuth Chaîne « UVC-CPV2FaceAuth » dans Unicode.
46 dwPropertyDataLength 4 0x00000004 4 octets pour les données de propriété (sizeof(DWORD)).
50 bPropertyData 4 Consultez Schéma de données ci-dessous Consultez Schéma de données ci-dessous.
Schéma de la charge utile

La charge utile de données UVC-CPV2FaceAuth est un entier non signé 32 bits. L’ordre élevé 16 bits représente l’index de base 0 de la liste de types de média exposée par la broche RVB. L’ordre inférieur 16 bits représente l’index de base 0 de la liste de types de média exposée par la broche IR.

Par exemple, une caméra de type 3 qui expose les types de médias suivants, dans l’ordre déclaré à partir de la broche RVB :

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

Et le type de média suivant pour IR :

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Une valeur de charge utile de 0x00010000 entraîne la publication du profil d’authentification visage suivant :

Pin0 :(RES==1280,720 ; FRT==30,1 ; SUT==MJPG) // Deuxième type de média (0x0001)
Pin1 :(RES===480,480 ; FRT==30,1 ; SUT==L8) // Premier type de média (0x0000)

Notes

Au moment de la rédaction de cet article, Windows Hello a une exigence minimale de 480x480@7,5 ips pour le flux RVB et 340x340@15fps pour le flux IR. Les IHV/OEM sont nécessaires pour sélectionner les types de médias qui répondent à cette exigence lors de l’activation du profil d’authentification faciale.

Exemple de caméra de type 1

Pour une caméra de type 1, étant donné qu’il n’existe aucune broche IR (avec l’attente qu’une caméra de type 1 sera jumelée à une caméra de type 2 sur l’ordinateur dans un groupe de capteurs), seul l’index de type multimédia RVB est publié. Pour l’index de type de média IR, la valeur 16 bits d’ordre inférieur de la charge utile doit être définie sur 0xFFFF.

Par exemple, si une caméra de type 1 a exposé la liste suivante des types de médias :

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

Pour publier le CPV2FaceAuth à l’aide du MJPG, 1280x720@30fps type de média, la charge utile doit être définie sur 0x0001FFFF.

Exemple de caméra de type 2

Pour une caméra de type 2, l’ordre élevé 16 bits doit être défini sur 0xFFFF, l’ordre inférieur 16 bits indiquant le type de média IR à utiliser.

Par exemple, pour une caméra de type 2 avec les types de médias suivants :

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Si le premier type de média est utilisé pour Face Auth, la valeur doit être : 0xFFFF0000.

Spécification du descripteur étendu du système d’exploitation Microsoft 2.0

Le descripteur étendu MSOS 2.0 peut être utilisé pour définir les valeurs de Registre afin d’ajouter la prise en charge du profil d’authentification faciale. Pour ce faire, utilisez le descripteur de propriétés du Registre microsoft OS 2.0.

Pour l’entrée de Registre UVC-CPV2FaceAuth, voici un exemple de jeu de descripteur 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)
}

Lorsque UVC-CPV2FaceAuth entrée de registre est ajoutée, les appareils n’ont pas besoin de publier l’entrée de registre EnableDshowRedirection, comme décrit dans les instructions d’implémentation de DShow Bridge pour les appareils UVC.

Toutefois, si le fournisseur de l’appareil doit prendre en charge les versions antérieures de Windows et/ou doit activer la décompression MJPEG dans Frame Server, l’entrée de Registre EnableDshowRedirection doit être ajoutée.

Génération de groupes de capteurs

Lorsque les fabricants OEM créent des systèmes utilisant des caméras de type 1 et de type 2 pour fournir des flux RVB et IR pour Windows Hello prise en charge, les fabricants OEM doivent déclarer que les deux caméras font partie d’un groupe de capteurs synthétisé.

Pour ce faire, déclarez une balise FSSensorGroupId et FSSensorGroupName dans un INF d’extension à créer sous la propriété d’interface de l’appareil pour chaque caméra.

Toutefois, si l’extension INF n’est pas fournie, les ODM peuvent utiliser les mêmes descripteurs MSOS pour publier les valeurs FSSensorGroupId et FSSensorGroupName. La boîte de réception Windows 10 pilote de classe vidéo USB accepte automatiquement tout descripteur MSOS dont le nom de la charge utile a été préfixé par « UVC- » et migre l’étiquette vers le magasin de propriétés de l’interface de périphérique (en supprimant le préfixe « UVC- »).

Ainsi, une caméra de type 1 et de type 2 qui publie les éléments suivants permet au système d’exploitation de synthétiser les caméras dans un groupe de capteurs multi-appareils à utiliser avec Windows Hello :

UVC-FSSensorGroupId
UVC-FSSensorGroupName

La charge utile de chaque balise doit être une chaîne Unicode. La charge utile UVC-FSSensorGroupId doit être une chaîne GUID au format suivant :

{XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXXXX}

La valeur du GUID doit être la même entre les caméras de type 1 et de type 2, et les deux caméras doivent être ajoutées au même châssis physique. Pour les caméras intégrées, le châssis physique est l’ordinateur lui-même. Pour les caméras externes, les modules Caméra de type 1 et de type 2 doivent être intégrés au même appareil physique connecté à l’ordinateur.

Catégories d’interface d’appareil personnalisées pour les groupes de capteurs

À compter de 19H1, Windows fournit un mécanisme d’extension spécifié par IHV/OEM pour permettre la publication de groupes de capteurs synthétisés dans n’importe quelle catégorie personnalisée ou prédéfinie. La génération d’un groupe de capteurs est définie par IHV/OEM fournissant une clé d’ID de groupe de capteurs dans l’INF personnalisé :

FSSensorGroupId : {GUID personnalisé}
FSSensorGroupName : <nom convivial utilisé pour le groupe de capteurs>

En plus des deux entrées AddReg ci-dessus dans l’INF, une nouvelle entrée AddReg est définie pour les catégories personnalisées :

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

Plusieurs catégories sont définies à l’aide d’un point-virgule (;) liste GUID délimitée.

Chaque appareil déclarant un FSSensorGroupId correspondant doit déclarer le même FSSensorGroupCategoryList. Si la liste ne correspond pas, toutes les listes sont ignorées et le groupe de capteurs est publié par défaut dans KSCATEGORY_SENSOR_GROUP comme si aucune catégorie personnalisée n’avait été définie.

Rotation de la caméra

Voir Orientation de l’appareil photo

Cache de contrôle UVC

Consultez Cache de contrôle UVC

Descripteur BOS et MS OS 2.0

La caméra compatible UVC peut spécifier des valeurs de configuration d’appareil spécifiques à Windows dans un descripteur BOS de capacité de plateforme dans son microprogramme à l’aide des descripteurs Microsoft OS 2.0. Reportez-vous à la documentation sur le descripteur MS OS 2.0 pour comprendre comment spécifier un descripteur BOS valide qui transmet la configuration de l’appareil au système d’exploitation.

En-tête du jeu de descripteur Microsoft OS 2.0

Offset Champ Taille (en octets) Description
0 wLength 2 La longueur en octets de cet en-tête doit être de 10.
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 4 Version de Windows.
8 wTotalLength 2 Taille de l’ensemble du descripteur MS OS 2.0, y compris cette taille d’en-tête.

Descripteur de propriété de Registre Microsoft OS 2.0

Offset Champ Taille (en octets) Description
0 wLength 2 Longueur en octets de ce descripteur
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 0x04 (REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 Longueur du nom de la propriété.
8 PropertyName Variable Nom de la propriété de Registre.
8+M wPropertyDataLength 2 Longueur des données de propriété.
10+M PropertyData Variable Données de propriété

Lorsqu’un descripteur MS OS 2.0 valide est spécifié dans le microprogramme, la pile USB copie les valeurs de configuration dans la clé de Registre HW de l’appareil ci-dessous :

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

Le pilote UVC lit les valeurs de configuration de la clé de Registre HW de l’appareil et configure l’appareil sur le système d’exploitation en conséquence. Par exemple, si le microprogramme spécifie l’appareil à inscrire en tant que caméra de capteur à l’aide d’une valeur de configuration, le pilote UVC inscrit l’appareil juste en dessous de cette catégorie.

La configuration des appareils UVC via le descripteur BOS de plateforme est un mécanisme activé dans Windows 10 version 1703 pour aider les fournisseurs d’appareils UVC à configurer l’appareil sans avoir besoin d’un fichier INF sur le système d’exploitation Windows.

La configuration des appareils UVC par le biais d’INF personnalisé est toujours prise en charge et est prioritaire sur le mécanisme basé sur le descripteur BOS. Lors de la spécification des propriétés d’appareil via INF, vous n’avez pas besoin d’ajouter le préfixe « UVC- ». Ce préfixe est nécessaire uniquement pour les propriétés d’appareil qui sont spécifiées via le descripteur BOS et qui sont par interface instance spécifiques. Si votre appareil a besoin de plug-ins en mode utilisateur comme DMFT, vous devez fournir un INF pour installer le DMFT. Il ne peut pas être configuré à l’aide du microprogramme.

Valeurs de configuration actuellement prises en charge via le descripteur BOS

Nom de la configuration Type Description
SensorCameraMode REG_DWORD Inscrivez l’appareil photo sous une catégorie spécifique.
UVC-FSSensorGroupID, UVC-FSSensorGroupName REG_SZ Regrouper des caméras avec le même UVC-FSSensorGroupID
UVC-EnableDependentStillPinCapture REG_DWORD Pour activer la méthode de capture 2/3
UVC-EnablePlatformDmft REG_DWORD Pour activer platform DMFT

Lorsque le pilote UVC voit les valeurs de Registre avec le préfixe « UVC- », il remplit l’interface de catégorie de l’appareil instance clé de Registre, avec les mêmes valeurs sans le préfixe. Le pilote effectue cette opération pour toutes les variables spécifiées par le microprogramme, pas seulement pour celles répertoriées ci-dessus.

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

Pour que le système d’exploitation utilise la fonctionnalité d’appareil de plateforme BOS et les descripteurs MS OS 2.0, le descripteur d’appareil doit spécifier la version bcdUSB à 0x0210 ou supérieure.

Exemple d’appareil composite

Cette section fournit un descripteur BOS et un descripteur MS OS 2.0 pour un exemple d’appareil composite avec deux fonctions de caméra. Une fonction est une caméra couleur UVC et la deuxième fonction est une caméra IR UVC.

Les exemples de descripteurs sont les suivants :

  1. Inscrire la fonction caméra couleur sous KSCATEGORY_VIDEO_CAMERA

  2. Inscrire la fonction de caméra IR sous KSCATEGORY_SENSOR_CAMERA

  3. Activer la fonction caméra couleur capture d’image fixe

  4. Associe les fonctions de couleur et de caméra IR en tant que groupe

Lors de l’énumération de l’appareil, la pile USB récupère le descripteur BOS de l’appareil. Suivant le descripteur BOS se trouve une fonctionnalité d’appareil spécifique à la plateforme.

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

Le descripteur de capacité de la plateforme BOS spécifie :

  1. GUID de la fonctionnalité de plateforme de descripteur MS OS 2.0

  2. Un code de contrôle fournisseur bMS_VendorCode (ici, il est défini sur 1. Il peut falloir n’importe quelle valeur que le fournisseur préfère) pour récupérer le descripteur MS OS 2.0.

  3. Ce descripteur BOS s’applique aux versions de système d’exploitation Windows 10 et ultérieures.

Après avoir vu le descripteur BOS, la pile USB émet la demande de contrôle spécifique au fournisseur pour récupérer le descripteur MS OS 2.0.

Format de la demande de contrôle pour récupérer le descripteur spécifique au fournisseur MS OS 2.0 :

bmRequestType BRequest wValue Windex wLength Données
1100 0000B bMS_VendorCode 0x00 0x07 Longueur Objet blob set de descripteur MS OS 2.0 retourné

bmRequestType

  • Sens du transfert des données – Appareil à hôte

  • Type : fournisseur

  • Destinataire - Appareil

bRequest

Valeur bMS_VendorCode retournée dans la structure d’informations du jeu de descripteur.

wValue

Définissez sur 0x00.

Windex

0x7 pour MS_OS_20_DESCRIPTOR_INDEX.

wLength

Longueur du jeu de descripteur MS OS 2.0, comme retourné dans le descripteur BOS. 0x25C (604) dans cet exemple.

L’appareil doit retourner le descripteur MS OS 2.0 comme celui spécifié dans USBVideoMSOS20DescriptorSet.

UsbVideoMSOS20DescriptorSet décrit les fonctions de couleur et d’ir. Il spécifie les valeurs suivantes du descripteur MS OS 2.0 :

  1. Définir l’en-tête

  2. En-tête de sous-ensemble de configuration

  3. En-tête de sous-ensemble de fonction de caméra couleur

  4. Descripteur de fonctionnalité de valeur de Registre pour l’ID de groupe de capteurs

  5. Descripteur de fonctionnalité de valeur de Registre pour le nom du groupe de capteurs

  6. Descripteur de fonctionnalité de valeur de Registre pour l’activation de la capture d’images fixes

  7. Descripteur de fonctionnalité de valeur de Registre pour l’activation de la plateforme DMFT

  8. En-tête de sous-ensemble de fonction de caméra IR

  9. Descripteur de fonctionnalité de valeur de Registre pour l’ID de groupe de capteurs

  10. Descripteur de fonctionnalité de valeur de Registre pour le nom du groupe de capteurs

  11. Descripteur de fonctionnalité de valeur de Registre pour l’inscription de l’appareil photo en tant que caméra de capteur

Le microprogramme aura un gestionnaire pour la demande du fournisseur qui retournera le descripteur MS OS 2.0 suivant pour l’appareil imaginaire décrit au début de cette section.

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