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

A partire da Windows 10, viene fornito un driver USB Video Class (UVC) in arrivo per i dispositivi conformi alla specifica della classe video USB (da 1.0 a 1.5). Questo driver supporta fotocamere di tipo colore e 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, ir o fotocamere di profondità)
BOS Archivio oggetti dispositivo binario
Descrittore di 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 telecamere. È consigliabile che il firmware della fotocamera specifichi un valore in base al quale il driver UVC registrerebbe 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 tipi di formato ir o di sola profondità deve essere registrata in KSCATEGORY_SENSOR_CAMERA. Una fotocamera che supporta tipi di formato sia di colore che non di colore 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 le preferenze di categoria tramite attributi, SensorCameraMode e SkipCameraEnumeration, nel descrittore BOS MS OS 2.0 descritto 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 supporti della fotocamera del sensore deve 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 i tipi di supporti della fotocamera del sensore e della fotocamera a colori deve 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 del runtime di integrazione

Il driver USB inbox USB (UVC) supporta fotocamere che acquisiscono la scena in formato YUV e trasmettono i dati 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 di 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 esegue il mapping a MFVideoFormat_L8.
KSDATAFORMAT_SUBTYPE_L16_IR Piano luma a 16 bit non compresso. Questo tipo esegue il mapping 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 di runtime di integrazione. Le applicazioni scritte con l'API Media Foundation FrameReader potranno usare il flusso di runtime di integrazione. Nessuna scalabilità o conversione dei fotogrammi del runtime di integrazione è supportata 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;

Nota

I flussi ir verranno visualizzati come flussi di acquisizione regolari in DShow.

Flusso di profondità

Il driver Usb Video Class di Windows inbox supporta fotocamere che producono flussi depth. Queste fotocamere acquisiscono le informazioni di profondità (ad esempio, il tempo di volo) della scena e trasmettono la mappa di profondità come fotogrammi YUV non compressi tramite USB. Il GUID di formato seguente deve essere specificato nel descrittore del formato video di flusso, come definito nel file di intestazione WDK ksmedia.h:

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 il GUID del tipo di formato viene specificato nel membro guidFormat del descrittore di frame, la pipeline di acquisizione di Media Foundation contrassegna il flusso come flusso di profondità. Le applicazioni scritte con l'API FrameReader potranno usare il flusso di profondità. Nessun ridimensionamento o conversione dei frame 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;

Nota

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

Raggruppamento di fotocamere

Windows supporta il raggruppamento di fotocamere in base all'ID contenitore per consentire alle applicazioni di lavorare con fotocamere correlate. Ad esempio, una fotocamera ir e una fotocamera Color presente nello stesso dispositivo fisico possono essere esposti 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, ovvero un GUID in formato stringa con la parentesi curvi. 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 gruppo di sensori e un nome come indicato di seguito. Il file INF personalizzato (basato sul driver UVC della posta 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 è 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%

Nota

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

Il metodo 2 o il metodo 3 supporta ancora l'acquisizione

La specifica UVC fornisce un meccanismo per specificare se l'interfaccia di streaming video supporta l'acquisizione di immagini di tipo 1/2/3 del metodo. Per sfruttare il supporto dell'acquisizione delle immagini 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 abilitare l'acquisizione dell'immagine del metodo 2/3 è una DWORD denominata UVC-EnableDependentStillPinCapture. Specificare il valore usando il descrittore BOS. Il dispositivo composito di esempio seguente illustra l'abilitazione dell'acquisizione di immagini ancora 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) per 0x1 (abilitato)

Quando questa voce è impostata su Abilitato (0x1), la pipeline di acquisizione sfrutta il metodo 2/3 per l'acquisizione di immagini ancora (presupponendo che il firmware annuncia anche il supporto per il metodo 2/3 come specificato dalla specifica 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 modalità utente consigliato per IHD e OEM per estendere la funzionalità della fotocamera in 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 con un massimo di due DMFT.

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

Ciò garantisce una maggiore flessibilità per gli OEM e gli IHD per fornire un valore aggiuntivo sotto forma di flussi della fotocamera di 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 coinvolge 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 dmft non vuole elaborare l'esempio, può fungere da pass-through solo passando l'esempio alla dmft successiva.

Per i controlli come KsProperty, la chiamata passa a monte: l'ultimo DMFT nella catena riceve la chiamata, la chiamata può essere gestita lì o passata alla dmft precedente nella catena.

Gli errori vengono propagati da DMFT a DTM e quindi alle applicazioni. Per i DMFT IHV/OEM, se una qualsiasi dmft non riesce a creare un'istanza, si tratta di un errore irreversibile per DTM.

Requisiti per IMFT:

  • Il numero di pin di input del DMFT deve corrispondere al conteggio dei pin di output del DMFT precedente. In caso contrario, DTM non riuscirà 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 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 sia DMFT a 32 bit che 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 tastiera USBVideo.INF.

Nell'oggetto personalizzato. La sezione "Interface AddReg" del file INF specificare i CLSID DMFT aggiungendo la voce del Registro di sistema seguente:

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

Come illustrato nelle impostazioni INF di esempio riportate di seguito (sostituire %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}.

Alcuni esempi di impostazioni CameraDeviceMftCLSIDChain :

  • Nessun DMFT IHV/OEM o DMFT della piattaforma

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

    • CameraDeviceMftCLSIDChain = %Dmft.CLSID%
  • 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%,

Nota

CameraDeviceMftCLSIDChain può avere un massimo di 2 CLSID.

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

Se CameraDeviceMftCLSIDChain non è configurato e la legacy CameraDeviceMftCLSID è configurata, la catena avrà un aspetto simile (se la fotocamera USB e supportata da Platform DMFT e Platform DMFT è abilitata) DevProxy <-> Platform DMFT -> OEM/IHV DMFT o (se la fotocamera non è supportata dalla piattaforma DMFT o piattaforma DMFT è disabilitata) DevProxy <-> OEM/IHV DMFT<.

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

MFT del dispositivo della piattaforma

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 Versione di Windows
Abilita l'area di interesse basata sul viso per le regolazioni 3A nelle fotocamere USB che supportano il ROI. Windows 10 versione 1703

Nota

Se la fotocamera non supporta il ROI basato su UVC 1.5, 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 enablePlatformDmft tramite il descrittore 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 Abilitato (0x1), la pipeline di acquisizione usa la dmft piattaforma posta in arrivo per il dispositivo. Di seguito viene illustrato 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.

Nota

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

Profilo di autenticazione viso tramite descrittori del sistema operativo MS

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

Tuttavia, per i dispositivi VIDEO USB, 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 USB Video Class in arrivo 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):

  • Rgb solo fotocamera da usare nel gruppo di sensori con una fotocamera IR separata.

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

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

Nota

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

Layout descrittore del 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 delle proprietà personalizzate a lunghezza variabile, che seguono la sezione dell'intestazione

Sezione Intestazione 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 del sistema operativo della proprietà estesa
8 wCount 2 0x0001 Una proprietà personalizzata

Sezione Proprietà personalizzata 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 supporto esposto dal pin RGB. L'ordine basso a 16 bit rappresenta l'indice in base 0 dell'elenco dei tipi di supporto esposto dal pin del runtime di integrazione.

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

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

E il tipo di supporto seguente per il runtime di integrazione:

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

Nota

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. Gli OEM/IHV sono necessari per selezionare i tipi di supporti che soddisfano questo requisito quando si abilita il profilo di autenticazione viso.

Esempio di fotocamera di tipo 1

Per una fotocamera di tipo 1, poiché non è presente alcun 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 supporto ir, il valore a 16 bit inferiore 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 MJPG, 1280x720@30fps tipo di supporto, 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 basso a 16 bit che indica il tipo di supporto ir da usare.

Ad esempio, per una fotocamera di tipo 2 con i tipi di supporti 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.

Specifica 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 Microsoft OS 2.0.

Per la voce del Registro di sistema UVC-CPV2FaceAuth, di seguito viene illustrato 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 UVC-CPV2FaceAuth voce del Registro di sistema, i dispositivi non devono pubblicare la voce del Registro di sistema EnableDshowRedirection come descritto in Linee guida per l'implementazione di DShow Bridge per i dispositivi UVC.

Tuttavia, se il fornitore di dispositivi deve supportare 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 di sensori

Quando i sistemi di compilazione di OEMs usano le fotocamere Type 1 e Type 2 per fornire flussi RGB e IR per Windows Hello supporto, le macchine virtuali devono dichiarare le due fotocamere come parte di un gruppo di sensori sintetizzato.

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

Tuttavia, se l'estensione INF non è specificata, gli ODMs possono usare gli stessi descrittori MSOS per pubblicare i valori FSSensorGroupId e FSSensorGroupName. La posta in arrivo Windows 10 driver della classe video USB accetta automaticamente qualsiasi descrittore MSOS il cui nome payload è stato preceduto da "UVC-" e eseguirà la migrazione del tag nell'archivio delle proprietà dell'interfaccia del dispositivo (rimuovendo il prefisso "UVC-".

Quindi, una fotocamera type 1 e type 2 che pubblica le seguenti consente 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 Type 1 e Type 2 e entrambe le fotocamere devono essere aggiunte allo stesso chassis fisico. Per le fotocamere predefinite, lo chassis fisico è il computer stesso. Per le fotocamere esterne, sia i moduli Type 1 che Type 2 Camera devono essere incorporati nello stesso dispositivo fisico connesso al computer.

Categorie di interfacce dispositivo personalizzate per i gruppi di sensori

A partire dal 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 da IHV/OEMs che fornisce una chiave ID gruppo di sensori nell'INF personalizzata:

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 punto e virgola (;) elenco GUID delimitato.

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 siano state definite categorie personalizzate.

Rotazione della fotocamera

Vedere Orientamento del dispositivo 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 di Windows in un descrittore BOS della piattaforma nel firmware usando i descrittori di Microsoft OS 2.0. Fare riferimento alla documentazione del descrittore MS OS 2.0 per comprendere come specificare un descrittore BOS valido che trasmette la configurazione del dispositivo al sistema operativo.

Intestazione set di descrittori del sistema operativo Microsoft 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 descrittore del sistema operativo MS 2.0, incluse queste dimensioni dell'intestazione.

Descrittore della 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 delle proprietà.
10+M PropertyData Variabile Dati delle proprietà

Quando nel firmware viene 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 mostra 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 che il dispositivo deve essere registrato 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 consentire ai fornitori di dispositivi UVC di configurare il dispositivo senza la necessità di un file INF nel sistema operativo Windows.

La configurazione dei dispositivi UVC tramite INF personalizzati è ancora supportata e che 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 per ogni istanza di interfaccia specifica. Se il dispositivo necessita di plug-in in modalità utente come DMFT, è necessario fornire un INF per l'installazione del DMFT. Non può essere configurato usando il firmware.

Valori di configurazione attualmente supportati tramite descrittore BOS

Nome configurazione Tipo Descrizione
SensorCameraMode REG_DWORD Registrare la fotocamera in una categoria specifica.
UVC-FSSensorGroupID, UVC-FSSensorGroupName REG_SZ Raggruppare le fotocamere con la stessa UVC-FSSensorGroupID
UVC-EnableDependentStillPinCapture REG_DWORD Per abilitare ancora il metodo di acquisizione 2/3
UVC-EnablePlatformDmft REG_DWORD Per abilitare Platform DMFT

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

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 del dispositivo deve specificare la versione bcdUSB da 0x0210 o successiva.

Dispositivo composito di esempio

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 in KSCATEGORY_SENSOR_CAMERA

  3. Abilitare la funzione fotocamera a colori ancora acquisizione di immagini

  4. Associa le funzioni di fotocamera color e IR come gruppo

Dopo l'enumerazione del dispositivo, lo stack USB recupera il descrittore BOS dal dispositivo. Seguendo 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 della piattaforma BOS specifica:

  1. GUID della piattaforma di descrittore MS OS 2.0

  2. Un codice di controllo del fornitore bMS_VendorCode (di seguito è impostato su 1. Può richiedere qualsiasi valore preferito dal fornitore) 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 Length BLOB set di descrittori del sistema operativo MS 2.0 restituito

bmRequestType

  • Direzione trasferimento dati - Dispositivo da ospitare

  • 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 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 di descrittore MS OS 2.0 seguenti:

  1. Imposta intestazione

  2. Intestazione subset di configurazione

  3. Intestazione sottoinsieme funzione fotocamera colore

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

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

  6. Descrittore delle funzionalità valore del Registro di sistema per abilitare l'acquisizione di immagini ancora

  7. Descrittore funzionalità valore del Registro di sistema per abilitare Platform DMFT

  8. Intestazione subset della funzione fotocamera IR

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

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

  11. Descrittore di funzionalità del Registro di sistema per la registrazione della fotocamera come fotocamera del 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
};