Condividi tramite


Guida all'implementazione della fotocamera USB Video Class (UVC)

A partire da Windows 10, viene fornito un driver USB Video Class integrato per i dispositivi conformi alla specifica USB Video Class (versioni da 1.0 a 1.5). Questo driver supporta fotocamere a colori e di tipo sensore. Questo documento illustra come esporre determinate funzionalità di una fotocamera conforme a UVC alle applicazioni tramite il driver posta in arrivo.

Terminologia

Parola chiave Descrizione
UVC Classe video USB
Driver UVC USBVideo.sys driver fornito con il sistema operativo
IR Infrarossi
Fotocamera a colori Fotocamera che restituisce flussi di colore (ad esempio, fotocamere RGB o YUV)
Fotocamera del sensore Fotocamera che restituisce flussi non di colore (ad esempio, fotocamere ir o di profondità)
BOS Archivio oggetti del dispositivo binario
Descrittore MS OS 2.0 Descrittore di funzionalità del dispositivo BOS specifico della piattaforma Microsoft

Fotocamere dei sensori

Windows supporta due categorie di fotocamere. Uno è una fotocamera a colori e l'altro è una fotocamera del sensore non a colori. Le fotocamere RGB o YUV sono classificate come fotocamere a colori e fotocamere non a colori come la scala grigia, le fotocamere IR e Depth sono classificate come fotocamere del sensore. Il driver UVC supporta entrambi i tipi di fotocamere. È consigliabile specificare un valore in base al quale il driver UVC registra la fotocamera in una o entrambe le categorie supportate.

Una fotocamera che supporta solo i tipi di formato colore deve essere registrata in KSCATEGORY_VIDEO_CAMERA. Una fotocamera che supporta i tipi di formato IR o Depth-only deve essere registrata sotto KSCATEGORY_SENSOR_CAMERA. Una fotocamera che supporta tipi di formato a colori e in bianco e nero deve essere registrata in KSCATEGORY_VIDEO_CAMERA e KSCATEGORY_SENSOR_CAMERA. Questa categorizzazione consente alle applicazioni di selezionare la fotocamera da usare.

Una fotocamera UVC può specificare la preferenza di categoria tramite attributi, SensorCameraMode e SkipCameraEnumeration, nel descrittore BOS MS OS 2.0 dettagliato nelle sezioni seguenti.

L'attributo SensorCameraMode accetta un valore 1 o 2.

Il valore 1 registrerà il dispositivo in KSCATEGORY_SENSOR_CAMERA. Oltre a questo, specificare il valore 1 per SkipCameraEnumeration per rendere la fotocamera disponibile per le applicazioni che cercano solo fotocamere del sensore. Una fotocamera che espone solo i tipi di supporto di una fotocamera con sensore dovrebbe usare questo valore.

Il valore 2 per SensorCameraMode registrerà il dispositivo in KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA. In questo modo la fotocamera è disponibile per le applicazioni che cercano sensori e fotocamere a colori. Una fotocamera che espone sia la fotocamera del sensore che i tipi di supporti della fotocamera a colori devono usare questo valore.

È consigliabile specificare il valore del Registro di sistema indicato in precedenza usando il descrittore BOS. Vedere la sezione Esempio di dispositivo composito seguente per un descrittore BOS di esempio con un descrittore MS OS 2.0 specifico della piattaforma.

Se non è possibile aggiornare il firmware del dispositivo come descritto in precedenza, è possibile usare un INF personalizzato e specificare che la fotocamera deve essere registrata come fotocamera del sensore specificando un valore per SensorCameraMode e SkipCameraEnumeration come indicato di seguito:

Un file INF personalizzato (basato sul driver UVC in arrivo) deve includere le voci AddReg seguenti:

SensorCameraMode: REG_DWORD: 1 (per la registrazione come fotocamera del sensore)

SkipCameraEnumeration: REG_DWORD: 1 (renderlo disponibile solo per le applicazioni ir)

Di seguito è riportato un esempio della sezione INF personalizzata:

[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

Se gli attributi SensorCameraMode e SkipCameraEnumeration non sono specificati nel firmware o nell'INF, la fotocamera viene registrata come fotocamera a colori e sarà visibile solo per le applicazioni con riconoscimento della fotocamera a colori.

Flusso IR

Il driver della classe video USB (UVC) di Windows supporta le telecamere che acquisiscono l'immagine in formato YUV e trasmettono i dati dei pixel tramite USB come YUV non compressi o come fotogrammi MJPEG compressi.

I GUID di formato seguenti devono essere specificati nel descrittore di formato video del flusso, come definito nel file di intestazione WDK ksmedia.h:

TIPO Descrizione
KSDATAFORMAT_SUBTYPE_L8_IR Piano luma a 8 bit non compresso. Questo tipo corrisponde a MFVideoFormat_L8.
KSDATAFORMAT_SUBTYPE_L16_IR Piano luma a 16 bit non compresso. Questo tipo corrisponde a MFVideoFormat_L16.
KSDATAFORMAT_SUBTYPE_MJPG_IR Frame MJPEG compressi. Media Foundation lo converte in fotogrammi non compressi NV12 e usa solo il piano luma.

Quando questi GUID di tipo di formato vengono specificati nel campo guidFormat del descrittore di frame, la pipeline di acquisizione di Media Foundation contrassegna il flusso come flusso IR. Le applicazioni che utilizzano l'API Media Foundation FrameReader potranno utilizzare il flusso IR. Nessun ridimensionamento o conversione dei fotogrammi IR è supportato dalla pipeline per i flussi IR.

Un flusso che espone tipi di formato IR non deve esporre tipi di 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;

Annotazioni

I flussi IR verranno visualizzati come flussi di acquisizione regolari in DirectShow.

Flusso di profondità

Il driver USB Video Class di Windows supporta fotocamere che producono flussi di profondità. Queste fotocamere acquisiscono le informazioni di profondità (ad esempio, tempo di volo) della scena e trasmettono la mappa di profondità come fotogrammi YUV non compressi su USB. Nel descrittore di formato video di streaming, deve essere specificato il seguente tipo GUID di formato, come definito nell'header ksmedia.h del WDK.

TIPO Descrizione
KSDATAFORMAT_SUBTYPE_D16 Valori della mappa di profondità a 16 bit. Questo tipo è identico a MFVideoFormat_D16. I valori sono in millimetri.

Quando nel membro guidFormat del descrittore di frame è specificato il GUID del tipo di formato, la pipeline di acquisizione di Media Foundation etichetta il flusso come flusso di profondità. Le applicazioni scritte con l'API FrameReader saranno in grado di usare lo stream di profondità. Nessun ridimensionamento o conversione dei fotogrammi di profondità è supportato dalla pipeline per i flussi di profondità.

Un flusso che espone tipi di formato Depth non deve esporre tipi di 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;

Annotazioni

I flussi di profondità vengono visualizzati come flussi di acquisizione regolari in DShow.

Raggruppamento di fotocamere

Windows supporta il raggruppamento di fotocamere in base al relativo ID contenitore per facilitare l'uso delle applicazioni con fotocamere correlate. Ad esempio, una fotocamera ir e una fotocamera a colori presenti nello stesso dispositivo fisico possono essere esposte al sistema operativo come fotocamere correlate. In questo modo, le applicazioni come Windows Hello usano le fotocamere correlate per i relativi scenari.

La relazione tra le funzioni della fotocamera può essere specificata nel descrittore BOS della fotocamera nel firmware. Il driver UVC userà queste informazioni ed esporrà queste funzioni della fotocamera come correlate. In questo modo lo stack di fotocamere del sistema operativo li espone come gruppo correlato di fotocamere alle applicazioni.

Il firmware della fotocamera deve specificare un UVC-FSSensorGroupID, che è un GUID in formato stringa con le parentesi graffe. Le fotocamere con lo stesso UVC-FSSensorGroupID verranno raggruppate.

Al gruppo di sensori può essere assegnato un nome specificando UVC-FSSensorGroupName, una stringa Unicode, nel firmware.

Fare riferimento alla sezione Esempio di dispositivo composito seguente per un esempio illustrativo BOS che specifica UVC-FSSensorGroupID e UVC-FSSensorGroupName.

Se non è possibile aggiornare il firmware del dispositivo come descritto in precedenza, è possibile usare un INF personalizzato e specificare che la fotocamera fa parte di un gruppo di sensori specificando un ID e un nome del gruppo di sensori come indicato di seguito. Il file INF personalizzato (basato sul driver UVC in arrivo) deve includere le voci AddReg seguenti:

FSSensorGroupID: REG_SZ: "{GUID ID gruppo di sensori}"

FSSensorGroupName: REG_SZ: "nome descrittivo del gruppo di sensori"

Un esempio per la sezione INF personalizzata sarà il seguente:

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

Annotazioni

I gruppi di sensori non sono supportati nella pipeline di acquisizione DShow.

Il metodo 2 o il metodo 3 ancora catturano il supporto

La specifica UVC fornisce un meccanismo per specificare se l'interfaccia di streaming video supporta l'acquisizione di immagini fisse tramite i metodi 1/2/3. Per consentire al sistema operativo di sfruttare il supporto dell'acquisizione di immagini fisse del metodo 2/3 del dispositivo tramite il driver UVC, il firmware del dispositivo potrebbe specificare un valore nel descrittore BOS.

Il valore da specificare per consentire l'acquisizione di immagini fisse Metodo 2/3 è una DWORD denominata UVC-EnableDependentStillPinCapture. Specificare il relativo valore usando il descrittore BOS. Il dispositivo composito di esempio seguente mostra come abilitare l'acquisizione di immagini fisse con un descrittore BOS di esempio.

Se non è possibile aggiornare il firmware del dispositivo come descritto in precedenza, è possibile usare un INF personalizzato per specificare che la fotocamera supporta ancora il metodo 2 o il metodo 3.

Il file INF personalizzato (basato sul driver UVC personalizzato o sul driver UVC in arrivo) deve includere la voce AddReg seguente:

EnableDependentStillPinCapture: REG_DWORD: 0x0 (disabilitato) a 0x1 (abilitato)

Quando questa voce è impostata su Abilitato (0x1), la pipeline di acquisizione utilizza il Metodo 2/3 per l'acquisizione di immagini statiche, presupponendo che il firmware supporti anche il Metodo 2/3 come specificato dalla UVC.

Un esempio per la sezione INF personalizzata è il seguente:

[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

Concatenamento MFT del dispositivo

Device MFT è il meccanismo di plug-in in modalità utente consigliato per essere utilizzato dagli IHVs e dagli OEM per estendere la funzionalità della fotocamera su Windows.

Prima di Windows 10, versione 1703, la pipeline della fotocamera supportava un solo plug-in di estensione DMFT.

A partire da Windows 10, versione 1703, la pipeline della fotocamera di Windows supporta una catena facoltativa di DMFT (Digital Media Format Transform) con un massimo di due DMFT.

A partire da Windows 11, versione 22H2, la pipeline della fotocamera di Windows supporta una catena opzionale di DMFT, con un massimo di quattro DMFT.

Ciò garantisce maggiore flessibilità per gli OEM e gli IHD per fornire un componente aggiuntivo di valore sotto forma di flussi di fotocamera post-elaborazione. Ad esempio, un dispositivo può usare PDMFT insieme a un DMFT IHV e a un DMFT OEM.

La figura seguente illustra l'architettura che include una catena di DMFT.

Catena DMFT.

Acquisire i flussi di campioni dal driver della fotocamera a DevProxy, quindi passare attraverso le catene DMFT. Ogni DMFT nella catena ha la possibilità di elaborare l'esempio. Se la DMFT non vuole elaborare il campione, può fungere da pass-through per passare il campione alla DMFT successiva.

Per i controlli come KsProperty, la chiamata viene instradata verso monte: l'ultimo DMFT nella catena (a monte) riceve la richiesta, che può essere gestita lì o passata al DMFT precedente nella catena.

Gli errori vengono propagati da DMFT a DTM e quindi alle applicazioni. Per le DMFT IHV/OEM, se una delle DMFT non riesce a istanziare, si verifica un errore irreversibile per DTM.

Requisiti per DMFT

  • Il numero di pin di input del DMFT deve corrispondere al numero di pin di output di DMFT precedente. In caso contrario, DTM avrà esito negativo durante l'inizializzazione. Tuttavia, i conteggi dei pin di input e output dello stesso DMFT non devono corrispondere.

  • DMFT deve supportare le interfacce - IMFDeviceTransform, IMFShutdown, IMFRealTimeClientEx, IKsControl e IMFMediaEventGenerator; IMFTransform potrebbe dover essere supportato se è configurato MFT0 o il successivo DMFT nella catena richiede il supporto IMFTransform.

  • Nei sistemi a 64 bit che non usano Frame Server, è necessario registrare sia DMFT a 32 bit che a 64 bit. Dato che una fotocamera USB potrebbe essere collegata a un sistema arbitrario, per le fotocamere USB "esterne" (o non in arrivo), il fornitore della fotocamera USB deve fornire DMFT a 32 bit e a 64 bit.

Configurazione della catena DMFT

Un dispositivo fotocamera può facoltativamente fornire un oggetto COM DMFT in una DLL usando un file INF personalizzato che usa sezioni della posta in arrivo USBVideo.INF.

** Nella sezione "Interface AddReg" del file INF personalizzato, specificare i CLSID del DMFT aggiungendo la seguente voce del Registro di sistema:

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

Come illustrato nelle impostazioni INF di esempio seguenti (sostituire i %Dmft0.CLSID% e % Dmft1.CLSID% con le stringhe CLSID effettive in uso per i DMFT), sono consentiti al massimo 2 CLSID in Windows 10, versione 1703 e il primo è più vicino a DevProxy e l'ultimo è l'ultimo DMFT nella catena.

Platform DMFT CLSID è {3D096DDE-8971-4AD5-98F9-C74F56492630}.

Alcune impostazioni cameraDeviceMftCLSIDChain di esempio:

  • Nessun DMFT IHV/OEM o DMFT della piattaforma

    • CameraDeviceMftCLSIDChain = "" (o non è necessario specificare questa voce del Registro di sistema)
  • IHV/OEM DMFT

    • CameraDeviceMftCLSIDChain = %DmftCLSID%
  • DMFT <della piattaforma -> DMFT IHV/OEM

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

    • Ecco uno screenshot della chiave del registro di sistema dei risultati per una fotocamera USB con Platform DMFT e DMFT (con GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7}) nella catena.

Catena DMFT dell'editor del Registro di sistema.

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

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

Annotazioni

CameraDeviceMftCLSIDChain può avere un massimo di 2 CLSID.

Se CameraDeviceMftCLSIDChain è configurato, le impostazioni legacy CameraDeviceMftCLSID vengono ignorate da DTM.

Se CameraDeviceMftCLSIDChain non è configurato e il legacy CameraDeviceMftCLSID è configurato, la catena sarà simile a (se la fotocamera USB è supportata da Platform DMFT e Platform DMFT è abilitata) DevProxy < – > Platform DMFT < – > OEM/IHV DMFT oppure (se la fotocamera non è supportata da Platform DMFT o Platform DMFT è disabilitata) DevProxy < – > OEM/IHV DMFT.

Impostazioni di file INF di esempio:

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

Dispositivo della piattaforma MFT

A partire da Windows 10, versione 1703, Windows fornisce una casella di posta in arrivo MFT per fotocamere UVC note come PLATFORM DMFT (PDMFT) in base al consenso esplicito. Questo DMFT consente agli IHD e agli OEM di sfruttare gli algoritmi di post-elaborazione forniti da Windows.

Funzionalità supportate da Platform DMFT Rilascio di Windows
Abilita l'area di interesse basata sul viso per le regolazioni 3A nelle fotocamere USB compatibili con ROI. Windows 10, versione 1703

Annotazioni

Se la fotocamera non supporta il ROI basato su UVC 1.5, il PDMFT non verrà caricato anche se il dispositivo ha scelto di usare PDMFT.

Una fotocamera UVC potrebbe acconsentire esplicitamente all'uso della piattaforma DMFT specificando il descrittore EnablePlatformDmft tramite BOS.

Il valore da specificare per abilitare Platform DMFT è un DWORD per nome UVC-EnablePlatformDmft e specificarne il valore usando il descrittore BOS. La sezione Esempio di dispositivo composito seguente illustra l'abilitazione di Platform DMFT con un descrittore BOS di esempio.

Se non è possibile aggiornare il firmware del dispositivo come descritto in precedenza, è possibile usare un file INF personalizzato per abilitare Platform DMFT per il dispositivo.

Il file INF personalizzato (basato sul driver UVC personalizzato o sul driver UVC in arrivo) deve includere la voce AddReg seguente:

EnablePlatformDmft: REG_DWORD: 0x0 (Disabilitato) per 0x1 (Abilitato)

Quando questa voce è impostata su Attivato (0x1), la pipeline di acquisizione usa il DMFT della piattaforma di posta in arrivo per il dispositivo. Di seguito è riportato un esempio di questa sezione INF personalizzata:

[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

In Windows 10 versione 1703, se un dispositivo sceglie di usare PDMFT, tutte le funzionalità supportate da PDMFT sono abilitate (in base alle funzionalità del dispositivo). La configurazione granulare delle funzionalità PDMFT non è supportata.

Annotazioni

Le coordinate ROI basate sul viso vengono calcolate in relazione al campo di visualizzazione dell'immagine trasmessa in PDMFT. Se il campo visivo è stato modificato a causa dell'uso di un controllo come Zoom, Panoramica o Inclinazione, o di una Finestra Digitale, la fotocamera è responsabile di mappare le coordinate fornite al campo visivo completo del sensore, considerando la finestra corrente di zoom/panoramica.

Profilo di autenticazione del viso tramite descrittori del sistema operativo MS

Windows 10 RS5 applica ora un requisito di Face Auth Profile V2 per qualsiasi fotocamera con supporto di Windows Hello. Per i sistemi basati su MIPI con stack driver della fotocamera personalizzato, questo supporto può essere pubblicato tramite un INF (o un INF di estensione) o tramite un plug-in in modalità utente (Device MFT).

Tuttavia, per i dispositivi USB Video, un vincolo con fotocamere basate su UVC è che per Windows 10 19H1, i driver di fotocamera personalizzati non sono consentiti. Tutte le fotocamere basate su UVC devono usare il driver di classe video USB nativo e tutte le estensioni del fornitore devono essere implementate sotto forma di dispositivo MFT.

Per molti OEM/ODM, l'approccio preferito per i moduli della fotocamera consiste nell'implementare gran parte delle funzionalità all'interno del firmware del modulo, ovvero tramite descrittori del sistema operativo Microsoft.

Le fotocamere seguenti sono supportate per la pubblicazione del profilo di autenticazione viso tramite i descrittori MSOS (detti anche descrittori BOS):

  • Fotocamera solo RGB per l'uso nel gruppo di sensori con una fotocamera IR separata.

  • Fotocamera solo IR da usare in un gruppo di sensori con una fotocamera RGB separata.

  • Fotocamera RGB+IR con pin IR e RGB separati.

Annotazioni

Se il firmware della fotocamera non può soddisfare uno dei tre requisiti descritti in precedenza, ODM/OEM deve usare un'estensione INF per dichiarare il profilo della fotocamera V2.

Layout del descrittore di sistema operativo Microsoft di esempio

Di seguito sono riportati esempi per le specifiche seguenti:

  • Specifica dei descrittori estesi del sistema operativo Microsoft 1.0

  • Specifica dei descrittori di Microsoft OS 2.0

Specifica del descrittore esteso del sistema operativo Microsoft 1.0

Il descrittore del sistema operativo delle proprietà estese ha due componenti

  • Sezione intestazione a lunghezza fissa
  • Una o più sezioni di proprietà personalizzate a lunghezza variabile, che seguono la sezione di intestazione

Sezione Intestazione del descrittore di Microsoft OS 1.0

La sezione Header descrive una singola proprietà personalizzata (Face Auth Profile).

Offset Campo Dimensioni (byte) Valore Descrizione
0 dwLength 4 <>
4 bcdVersion 2 0x0100 Versione 1.0
6 wIndex 2 0x0005 Descrittore della proprietà estesa del sistema operativo
8 wCount 2 0x0001 Una proprietà personalizzata

Sezione delle proprietà personalizzate del descrittore di Microsoft OS 1.0

Offset Campo Dimensioni (byte) Valore Descrizione
0 dwSize 4 0x00000036 (54) Dimensioni totali (in byte) per questa proprietà.
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) Dimensioni (in byte) del nome della proprietà.
10 bPropertyName 36 UVC-CPV2FaceAuth Stringa "UVC-CPV2FaceAuth" in Unicode.
46 dwPropertyDataLength 4 0x00000004 4 byte per i dati delle proprietà (sizeof(DWORD)).
50 bPropertyData 4 Vedere Schema dei dati di seguito Vedere Schema dei dati di seguito.
Schema del Payload

Il payload dei dati UVC-CPV2FaceAuth è un intero senza segno a 32 bit. L'ordine elevato a 16 bit rappresenta l'indice in base 0 dell'elenco dei tipi di supporti esposto dal pin RGB. La parte bassa a 16 bit rappresenta l'indice a base 0 dell'elenco dei tipi di media esposto dal pin IR.

Ad esempio, una fotocamera di tipo 3 che espone i tipi di supporto seguenti, nell'ordine dichiarato dal pin RGB:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

E il tipo di media seguente per IR:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Un valore di payload di 0x00010000 comporterà la pubblicazione del seguente profilo di autenticazione viso:

Pin0:(RES==1280,720; FRT==30,1; SUT==MJPG) // Secondo tipo di supporto (0x0001)
Pin1:(RES==480,480; FRT==30,1; SUT==L8) // Primo tipo di supporto (0x0000)

Annotazioni

Al momento della stesura di questo articolo, Windows Hello ha un requisito minimo di 480x480@7.5fps per il flusso RGB e 340x340@15fps per il flusso ir. IHV/OEM sono tenuti a selezionare i tipi di supporto che soddisfano questo requisito quando si abilita il profilo di autenticazione facciale.

Esempio di fotocamera di tipo 1

Per una fotocamera di tipo 1, poiché non c'è un pin IR (con l'aspettativa che una fotocamera di tipo 1 verrà abbinata a una fotocamera di tipo 2 nel computer in un gruppo di sensori), viene pubblicato solo l'indice del tipo di supporto RGB. Per l'indice del tipo di media IR, il valore a 16 bit basso del payload deve essere impostato su 0xFFFF.

Ad esempio, se una fotocamera di tipo 1 ha esposto l'elenco seguente di tipi di supporti:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

Per pubblicare CPV2FaceAuth usando il tipo di supporto MJPG, 1280x720@30fps, il payload deve essere impostato su 0x0001FFFF.

Esempio di fotocamera di tipo 2

Per una fotocamera di tipo 2, l'ordine elevato a 16 bit deve essere impostato su 0xFFFF, con l'ordine minimo a 16 bit che indica il tipo di media IR da usare.

Ad esempio, per una fotocamera di tipo 2 con i tipi di supporto seguenti:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Se il primo tipo di supporto viene usato per Face Auth, il valore deve essere: 0xFFFF0000.

Specifiche del Descrittore Esteso del Sistema Operativo Microsoft 2.0

Il descrittore esteso MSOS 2.0 può essere usato per definire i valori del Registro di sistema per aggiungere il supporto del profilo di autenticazione viso. Questa operazione viene eseguita usando il descrittore di proprietà del Registro di sistema di Sistema operativo Microsoft 2.0.

Per la voce del Registro di sistema UVC-CPV2FaceAuth, di seguito è mostrato un set di descrittori MSOS 2.0 di esempio.

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

Quando viene aggiunta la voce del Registro di sistema UVC-CPV2FaceAuth, non è necessario che i dispositivi pubblichino la voce del Registro di sistema EnableDshowRedirection come descritto in DShow Bridge implementation guidance for UVC devices (Linee guida per l'implementazione di DShow Bridge per i dispositivi UVC).

Tuttavia, se il fornitore del dispositivo deve supportare le versioni precedenti di Windows e/o deve abilitare la decompressione MJPEG all'interno del server frame, è necessario aggiungere la voce del Registro di sistema EnableDshowRedirection.

Generazione del gruppo sensori

Quando gli OEM compilano sistemi che usano fotocamere di tipo 1 e type 2 per fornire flussi RGB e IR per il supporto di Windows Hello, gli OEM devono dichiarare che le due fotocamere fanno parte di un gruppo di sensori sintetizzato.

Questa operazione viene eseguita dichiarando un tag FSSensorGroupId e FSSensorGroupName in un INF di estensione da creare nella proprietà dell'interfaccia del dispositivo per ogni fotocamera.

Tuttavia, se l'estensione INF non è specificata, gli ODM possono usare gli stessi descrittori MSOS per pubblicare i valori FSSensorGroupId e FSSensorGroupName. Il driver della classe video USB di Windows 10 gestirà automaticamente qualsiasi descrittore MSOS il cui nome del payload sia stato preceduto da "UVC-" e migrerà il tag nell'archivio delle proprietà dell'interfaccia del dispositivo (rimuovendo il prefisso "UVC-").

Quindi, una fotocamera di tipo 1 e type 2 che pubblica quanto segue consentirà al sistema operativo di sintetizzare le fotocamere in un gruppo di sensori multi-dispositivo da usare con Windows Hello:

UVC-FSSensorGroupId
UVC-FSSensorGroupName

Il payload per ogni tag deve essere una stringa Unicode. Il payload UVC-FSSensorGroupId deve essere una stringa GUID nel formato seguente:

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

Il valore del GUID deve essere lo stesso tra le fotocamere di tipo 1 e di tipo 2 e entrambe le fotocamere devono essere aggiunte allo stesso chassis fisico. Per le fotocamere incorporate, lo chassis fisico è il computer stesso. Per le fotocamere esterne, sia i moduli Di tipo 1 che Type 2 Camera devono essere integrati nello stesso dispositivo fisico connesso al computer.

Categorie di interfacce di dispositivo personalizzate per i gruppi di sensori

A partire dalla versione 19H1, Windows fornisce un meccanismo di estensione specificato IHV/OEM per consentire la pubblicazione di gruppi di sensori sintetizzati in qualsiasi categoria personalizzata o predefinita. La generazione di un gruppo di sensori è definita dagli OEM/IHV che forniscono una chiave ID gruppo di sensori nel codice INF personalizzato:

FSSensorGroupId: {GUID personalizzato}
FSSensorGroupName: <nome descrittivo usato per il gruppo di sensori>

Oltre alle due voci AddReg precedenti in INF, viene definita una nuova voce AddReg per le categorie personalizzate:

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

Più categorie vengono definite usando un elenco GUID delimitato da un punto e virgola (;).

Ogni dispositivo che dichiara un FSSensorGroupId corrispondente deve dichiarare lo stesso FSSensorGroupCategoryList. Se l'elenco non corrisponde, tutti gli elenchi vengono ignorati e il gruppo di sensori viene pubblicato per impostazione predefinita in KSCATEGORY_SENSOR_GROUP come se non fosse stata definita alcuna categoria personalizzata.

Rotazione della fotocamera

Vedi Orientamento del dispositivo della fotocamera

Cache dei controlli UVC

Vedere Cache dei controlli UVC

Descrittore BOS e MS OS 2.0

La fotocamera conforme a UVC può specificare i valori di configurazione del dispositivo specifici per Windows in un descrittore BOS delle funzionalità della piattaforma nel suo firmware usando i Descrittori di Microsoft OS 2.0. Per informazioni su come specificare un descrittore BOS valido che comunica la configurazione del dispositivo al sistema operativo, vedere la documentazione sul descrittore MS OS 2.0.

Header del Set di Descrittori Microsoft OS 2.0

Offset Campo Dimensioni (byte) Descrizione
0 wLength 2 La lunghezza in byte di questa intestazione deve essere 10.
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 4 Versione di Windows.
8 wTotalLength 2 Dimensioni dell'intero set di descrittori MS OS 2.0, incluse queste dimensioni dell'intestazione.

Descrittore delle proprietà del Registro di sistema di Microsoft OS 2.0

Offset Campo Dimensioni (byte) Descrizione
0 wLength 2 Lunghezza in byte di questo descrittore
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 0x04 (REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 Lunghezza del nome della proprietà.
8 PropertyName Variabile Nome della proprietà del Registro di sistema.
8+M wPropertyDataLength 2 Lunghezza dei dati di proprietà.
Oltre 10 milioni PropertyData Variabile Dati delle proprietà

Quando nel firmware è specificato un descrittore MS OS 2.0 valido, lo stack USB copia i valori di configurazione nella chiave del Registro di sistema HW del dispositivo, mostrata di seguito:

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

Il driver UVC legge i valori di configurazione dalla chiave del Registro di sistema HW del dispositivo e configura il dispositivo nel sistema operativo di conseguenza. Ad esempio, se il firmware specifica il dispositivo da registrare come fotocamera del sensore usando un valore di configurazione, il driver UVC registra il dispositivo appena sotto tale categoria.

La configurazione dei dispositivi UVC tramite il descrittore BOS della piattaforma è un meccanismo abilitato in Windows 10 versione 1703 per aiutare i fornitori di dispositivi UVC a configurare il dispositivo senza la necessità di un file INF nel sistema operativo Windows.

La configurazione dei dispositivi UVC tramite INF personalizzato è ancora supportata e ha la precedenza sul meccanismo basato sul descrittore BOS. Quando si specificano le proprietà del dispositivo tramite INF, non è necessario aggiungere il prefisso "UVC-". Questo prefisso è necessario solo per le proprietà del dispositivo specificate tramite il descrittore BOS e che sono specifiche per ogni istanza di interfaccia. Se il dispositivo necessita di plug-in in modalità utente come DMFT, è necessario fornire un INF per l'installazione di DMFT. Non può essere configurato usando il firmware.

Valori di configurazione attualmente supportati tramite il descrittore BOS

Nome della configurazione TIPO Descrizione
SensorCameraMode REG_DWORD Registrare la fotocamera in una categoria specifica.
UVC-FSSensorGroupID, UVC-FSSensorGroupName REG_SZ Raggruppare fotocamere con la stessa UVC-FSSensorGroupID
UVC-EnableDependentStillPinCapture REG_DWORD Per abilitare l'acquisizione di immagini statiche Metodo 2/3
UVC-EnablePlatformDmft REG_DWORD Per abilitare la piattaforma DMFT

Quando il driver UVC rileva i valori del registro con il prefisso "UVC-", popola la chiave del registro dell'istanza dell'interfaccia di categoria del dispositivo con gli stessi valori senza il prefisso. Il driver esegue questa operazione per qualsiasi variabile specificata dal firmware, non solo per quelle elencate in precedenza.

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

Affinché il sistema operativo usi la funzionalità del dispositivo BOS Platform e i descrittori MS OS 2.0, il descrittore di dispositivo deve specificare la versione bcdUSB da 0x0210 o versione successiva.

Esempio di dispositivo composito

Questa sezione fornisce un descrittore BOS e un descrittore MS OS 2.0 per un dispositivo composito di esempio con due funzioni della fotocamera. Una funzione è una fotocamera a colori UVC e la seconda funzione è una fotocamera IR UVC.

I descrittori di esempio sono i seguenti:

  1. Registrare la funzione della fotocamera a colori in KSCATEGORY_VIDEO_CAMERA

  2. Registrare la funzione della fotocamera IR nella KSCATEGORY_SENSOR_CAMERA

  3. Abilita la funzione fotocamera a colori per la cattura di immagini fisse

  4. Associa le funzioni della fotocamera a colori e della fotocamera a infrarossi come gruppo

Dopo l'enumerazione del dispositivo, lo stack USB recupera il descrittore BOS dal dispositivo. Il descrittore BOS è una funzionalità del dispositivo specifica della piattaforma.

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

Il descrittore di funzionalità della piattaforma BOS specifica:

  1. GUID di funzionalità della piattaforma del descrittore MS OS 2.0

  2. Un codice di controllo fornitore bMS_VendorCode (qui è impostato su 1. Può richiedere qualsiasi valore che il fornitore preferisce) per recuperare il descrittore MS OS 2.0.

  3. Questo descrittore BOS è applicabile per la versione del sistema operativo Windows 10 e versioni successive.

Dopo aver visualizzato il descrittore BOS, lo stack USB emetterà la richiesta di controllo specifica del fornitore per recuperare il descrittore MS OS 2.0.

Formato della richiesta di controllo per recuperare il descrittore specifico del fornitore MS OS 2.0:

bmRequestType BRequest wValue WIndex wLength Dati
1100 0000B bMS_VendorCode 0x00 0x07 Durata Blob set di descrittori del sistema operativo MS 2.0 restituito

bmRequestType

  • Direzione trasferimento dati - Da dispositivo a host

  • Tipo - Fornitore

  • Destinatario - Dispositivo

bRequest

Valore bMS_VendorCode restituito nella struttura delle informazioni del set di descrittori.

wValue

Impostare su 0x00.

wIndex

0x7 per MS_OS_20_DESCRIPTOR_INDEX.

wLength

Lunghezza del set di descrittore MS OS 2.0, come restituito nel descrittore BOS. 0x25C (604) in questo esempio.

Il dispositivo dovrebbe restituire il descrittore MS OS 2.0 come quello specificato in USBVideoMSOS20DescriptorSet.

USBVideoMSOS20DescriptorSet descrive le funzioni color e IR. Specifica i valori del descrittore MS OS 2.0 seguenti:

  1. Imposta intestazione

  2. Intestazione del subset di configurazione

  3. Intestazione del sottoinsieme di funzioni della fotocamera a colori

  4. Descrittore della funzionalità del valore di registro per l'identificativo del gruppo di sensori

  5. Descrittore della funzionalità del valore di registro per il nome del gruppo di sensori

  6. Descrittore della funzionalità del valore del Registro per abilitare l'acquisizione di immagini statiche

  7. Descrittore delle funzioni del valore del Registro di sistema per l'abilitazione di Platform DMFT

  8. Intestazione subset della funzione fotocamera IR

  9. Descrittore della funzionalità valore del Registro di sistema per l'ID gruppo di sensori

  10. Descrittore delle funzionalità del valore del Registro di sistema per il nome del gruppo di sensori

  11. Descrittore del valore di funzionalità del Registro di sistema per la registrazione della fotocamera come fotocamera sensore

Il firmware avrà un gestore per la richiesta fornitore che restituirà il descrittore MS OS 2.0 seguente per il dispositivo immaginario descritto all'inizio di questa sezione.

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