Průvodce implementací kamery třídy USB (UVC)

Počínaje Windows 10 je k dispozici ovladač UVC (Inbox USB Video Class) pro zařízení kompatibilní se specifikací třídy USB Video Class (verze 1.0 až 1.5). Tento ovladač podporuje barevné kamery a kamery podle typu snímače. Tento dokument popisuje, jak zpřístupnit určité funkce fotoaparátu kompatibilního s UVC aplikacím prostřednictvím integrovaného ovladače.

Terminologie

Klíčové slovo Popis
UVC Třída videa USB
Ovladač UVC USBVideo.sys ovladač, který se dodává s operačním systémem
IR Infračervený
Barevná kamera Kamera, která vypíše barevné proudy (například RGB nebo YUV)
Senzorová kamera Kamera, která generuje nebarevné záznamy (například IR nebo hloubkové kamery)
BOS Binární úložiště objektů zařízení
Popisovač MS OS 2.0 Popisovač zařízení specifické pro platformu Microsoft BOS

Senzorové kamery

Windows podporuje dvě kategorie fotoaparátů. Jedna je barevná kamera a druhá je černobílá kamera. Kamery RGB nebo YUV jsou kategorizovány jako barevné kamery a nebarevné kamery, jako jsou šedé, ir a hloubkové kamery jsou zařazeny do kategorií jako senzorové kamery. Ovladač UVC podporuje oba typy fotoaparátů. Doporučujeme, aby firmware fotoaparátu určil hodnotu, na základě které by ovladač UVC registroval kameru v jedné nebo obou podporovaných kategoriích.

Fotoaparát, který podporuje pouze typy formátů barev, by se měl zaregistrovat v KSCATEGORY_VIDEO_CAMERA. Fotoaparát, který podporuje formáty IR nebo pouze hloubkový, by měl být zařazen do KSCATEGORY_SENSOR_CAMERA. Fotoaparát, který podporuje barevné i jiné typy formátů, by se měl zaregistrovat v KSCATEGORY_VIDEO_CAMERA a KSCATEGORY_SENSOR_CAMERA. Tato kategorizace pomáhá aplikacím vybrat kameru, se kterou chtějí pracovat.

Kamera UVC může určit preferenci kategorie prostřednictvím atributů SensorCameraMode a SkipCameraEnumeration ve svém BOS MS OS 2.0 popisovač, jak je podrobně vysvětleno v následujících částech.

Atribut SensorCameraMode přebírá hodnotu 1 nebo 2.

Hodnota 1 zaregistruje zařízení v KSCATEGORY_SENSOR_CAMERA. Kromě toho zadejte hodnotu 1 pro SkipCameraEnumeration , aby byla kamera k dispozici pro aplikace, které hledají pouze senzorové kamery. Tuto hodnotu by měla využívat kamera, která zaznamenává pouze typy médií snímacího zařízení.

Hodnota 2 pro SensorCameraMode zaregistruje zařízení v KSCATEGORY_SENSOR_CAMERA a KSCATEGORY_VIDEO_CAMERA. Díky tomu je fotoaparát dostupný pro aplikace, které hledají senzory a barevné kamery. Kamera, která zpracovává jak senzory, tak barevné typy médií, by měla používat tuto hodnotu.

Doporučujeme zadat výše uvedenou hodnotu registru pomocí popisovače BOS. Vizte část Příklad složeného zařízení níže pro ukázkový popisovač BOS se specifickým pro platformu MS OS 2.0 popisovačem.

Pokud nemůžete aktualizovat firmware zařízení, jak je popsáno výše, můžete použít vlastní inf a určit, že vaše kamera musí být registrována jako senzorová kamera zadáním hodnoty pro SensorCameraMode a SkipCameraEnumeration následujícím způsobem:

Vlastní soubor INF (založený na integrovaném UVC ovladači) musí obsahovat následující položky AddReg:

SensorCameraMode: REG_DWORD: 1 (pro registraci jako senzor kamery)

SkipCameraEnumeration: REG_DWORD: 1 (zpřístupnit ji jenom pro aplikace IR)

Příklad vlastní části INF je následující:

[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

Pokud atributy SensorCameraMode a SkipCameraEnumeration nejsou zadané ve firmwaru nebo inf, fotoaparát se zaregistruje jako barevná kamera a bude viditelný pouze pro aplikace podporující barevné kamery.

IR stream

Integrovaný ovladač pro USB Video Class (UVC) podporuje kamery, které zachycují scénu ve formátu YUV a přenášejí pixelová data přes USB jako nekomprimované YUV nebo komprimované snímky ve formátu MJPEG.

V popisovači formátu videa streamu by měly být zadány následující identifikátory GUID formátu streamování, jak je definováno v hlavičkovém souboru WDK ksmedia.h.

Typ Popis
KSDATAFORMAT_SUBTYPE_L8_IR Nekomprimovaná 8bitová rovina luma. Tento typ se mapuje na MFVideoFormat_L8.
KSDATAFORMAT_SUBTYPE_L16_IR Nekomprimovaná 16bitová rovina luma. Tento typ se mapuje na MFVideoFormat_L16.
KSDATAFORMAT_SUBTYPE_MJPG_IR Komprimované rámce MJPEG. Media Foundation to převede na nekomprimované snímky NV12 a používá pouze rovinu luma.

Pokud jsou tyto identifikátory GUID typu formátu zadané v poli guidFormat popisovače rámce, kanál zachycení Media Foundation označí datový proud jako datový proud IR. Aplikace napsané pomocí rozhraní API Media Foundation FrameReader budou moct využívat stream IR. Kanál pro datové proudy IR nepodporuje žádné škálování ani převody rámců IR.

Datový proud, který zveřejňuje typy formátů IR, nesmí zveřejnit typy formátu RGB ani hloubky.

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

Poznámka:

Streamy IR se zobrazí jako běžné zachytávací proudy v DShow.

Hloubkové proudy

Ovladač usb třídy videa ve složce Doručená pošta systému Windows podporuje kamery, které vytvářejí datové proudy Hloubky. Tyto kamery zachycují podrobné informace (například čas letu) scény a přenášejí hloubkovou mapu jako nekomprimované snímky YUV přes USB. V popisovači formátu videa streamu by měl být zadán následující identifikátor GUID typu formátu, jak je definováno v hlavičkovém souboru WDK ksmedia.h.

Typ Popis
KSDATAFORMAT_SUBTYPE_D16 16bitové hodnoty mapy hloubky Tento typ je shodný s MFVideoFormat_D16. Hodnoty jsou v milimetrech.

Pokud je identifikátor GUID typu formátu zadán v členu guidFormat popisovače rámce, kanál zachycení Media Foundation označí datový proud jako hloubkový proud. Aplikace napsané pomocí rozhraní FrameReader API budou moct využívat hloubkový proud. Kanál nepodporuje žádné škálování ani převody hloubkových snímků pro hloubkové proudy.

Datový proud, který zveřejňuje typy formátu hloubky, nesmí zveřejnit typy formátů RGB ani 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;

Poznámka:

Hloubkové proudy se zobrazují jako běžné zachytávací proudy v DShow.

Seskupování kamer

Systém Windows podporuje seskupování kamer na základě jejich ID kontejneru, aby aplikace mohly pracovat s příbuznými kamerami. Například kamera IR a barevná kamera, které jsou přítomné na stejném fyzickém zařízení, mohou být vystaveny operačnímu systému jako související kamery. Díky tomu aplikace, jako je Windows Hello, používají související kamery pro své scénáře.

Vztah mezi funkcemi fotoaparátu lze zadat v popisovači BOS fotoaparátu ve firmwaru. Ovladač UVC použije tyto informace a zpřístupní tyto funkce fotoaparátu jako související. Díky tomu kamerový zásobník OS zpřístupňuje je aplikacím jako skupinu souvisejících kamer.

Firmware fotoaparátu musí zadat UVC-FSSensorGroupID, což je GUID ve formě řetězce se složenými závorkami. Kamery, které mají stejné UVC-FSSensorGroupID , se seskupí dohromady.

Skupinu snímačů lze pojmenovat zadáním UVC-FSSensorGroupName, řetězce Unicode ve firmwaru.

V níže uvedené části Příklad složeného zařízení najdete ilustrativní příklad BOS, který určuje UVC-FSSensorGroupID a UVC-FSSensorGroupName.

Pokud nemůžete aktualizovat firmware zařízení, jak je popsáno výše, můžete použít vlastní INF a určit, že vaše kamera je součástí skupiny snímačů zadáním ID a názvu skupiny snímačů následujícím způsobem. Vlastní soubor INF (založený na standardním ovladači UVC) musí obsahovat následující položky AddReg:

FSSensorGroupID: REG_SZ: {your sensor group ID GUID}

FSSensorGroupName: REG_SZ: "Popisný název skupiny snímačů"

Příklad vlastního oddílu INF by byl následující:

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

Poznámka:

Skupiny senzorů nejsou podporovány v kanálu zachycení DShow.

Metoda 2 nebo Metoda 3 stále zachycuje podporu.

Specifikace UVC poskytuje mechanismus, který určuje, zda rozhraní streamování videa podporuje metody typu 1/2/3 pro zachytávání statických obrázků. Aby operační systém mohl využít podporu zachycení statických snímků pomocí metod 2/3 zařízení prostřednictvím UVC ovladače, může firmware zařízení specifikovat hodnotu v popisovači BOS.

Hodnota, která se má zadat pro povolení zachytávání imagí metody 2/3, je DWORD s názvem UVC-EnableDependentStillPinCapture. Zadejte jeho hodnotu pomocí popisovače BOS. Níže uvedené ukázkové složené zařízení znázorňuje umožnění zachycení obrázků pomocí příkladového popisovače BOS.

Pokud nemůžete aktualizovat firmware zařízení, jak je popsáno výše, můžete pomocí vlastní INF určit, že vaše kamera podporuje metodu pořizování statických snímků 2 nebo 3.

Vlastní soubor INF (založený na vlastním ovladači UVC nebo ovladači doručené pošty UVC) musí obsahovat následující položku AddReg:

EnableDependentStillPinCapture: REG_DWORD: z 0x0 (zakázáno) na 0x1 (povoleno)

Pokud je tato položka nastavena na Povoleno (0x1), zpracování zachycení obrazu využívá metodu 2/3 pro zachycení statických snímků (za předpokladu, že firmware také oznamuje podporu metody 2/3 podle specifikace UVC).

Příklad vlastního oddílu INF je následující:

[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

Řetězení MFT zařízení

Device MFT je doporučený mechanismus plug-in modulu uživatelského režimu pro nezávislé výrobce hardwaru (IHVs) a výrobce originálních zařízení (OEMs) pro rozšíření funkcí fotoaparátu ve Windows.

Před Windows 10 verze 1703 podporoval kanál kamery pouze jeden modul plug-in rozšíření DMFT.

Od Windows 10 verze 1703 podporuje kanál kamery Windows volitelný řetězec DMFT s maximálně dvěma DMFT.

Ve Windows 11, verze 22H2, kamerový řetězec Windows podporuje volitelný řetězec DMFT s maximálně čtyřmi DMFT.

To poskytuje OEMům a IHVům větší flexibilitu při poskytování přidané hodnoty prostřednictvím zpracování datových proudů kamer. Například zařízení může používat PDMFT spolu s IHV DMFT a OEM DMFT.

Následující obrázek znázorňuje architekturu s řetězcem DMFT.

DMFT řetězec.

Proud vzorků plyne z ovladače fotoaparátu do DevProxy a pak prochází řetězci DMFT. Každá DMFT v řetězci má šanci zpracovat vzorek. Pokud DMFT nechce ukázku zpracovat, může fungovat jako mezičlánek a prostě předat ukázku dalšímu DMFT.

U ovládacích prvků, jako je KsProperty, volání postupuje proti proudu – poslední DMFT v řetězci přijme volání jako první, volání tam může být zpracováno nebo předáno předchozímu DMFT v řetězci.

Chyby se rozšíří z DMFT do DTM a pak do aplikací. V případě DMFT IHV/OEM, pokud se některé z DMFT nepodaří instancovat, bude to závažná chyba pro DTM.

Požadavky na DMFT:

  • Počet vstupních kolíků DMFT se musí shodovat s počtem výstupních kolíků předchozího DMFT, jinak by DTM při inicializaci selhal. Počet vstupních a výstupních kolíků stejného DMFT se ale nemusí shodovat.

  • DMFT musí podporovat rozhraní - MMFDeviceTransform, MMFShutdown, MMFRealTimeClientEx, IKsControl a MMFMediaEventGenerator; MMFTransform může být potřeba podporovat, pokud je v řetězci nakonfigurované MFT0 nebo další DMFT vyžaduje podporu MMFTransform.

  • V 64bitových systémech, které nepoužívají Frame Server, musí být zaregistrované 32bitové i 64bitové DMFT. Vzhledem k tomu, že se USB kamera může připojit do libovolného systému, by měl dodavatel externích (nebo neinboxových) USB kamer dodat jak 32bitové, tak 64bitové DMFT.

Konfigurace řetězu DMFT

Zařízení fotoaparátu může volitelně poskytnout COM objekt DMFT v knihovně DLL pomocí vlastního souboru INF, který používá oddíly přednastaveného souboru USBVideo.INF.

Ve vlastním souboru .INF v části "Interface AddReg" zadejte CLSID pro DMFT přidáním následující položky do registru:

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

Jak je znázorněno v níže uvedeném ukázkovém nastavení INF (nahraďte %Dmft0.CLSID% a % Dmft1.CLSID% skutečnými řetězci CLSID, které používáte pro DMFT), ve Windows 10 verze 1703 jsou povolené maximálně 2 identifikátory CLSID a první z nich je nejblíže DevProxy a poslední z nich je poslední DMFT v řetězu.

DMFT CLSID platformy je {3D096DDE-8971-4AD5-98F9-C74F56492630}.

Příklad nastavení CameraDeviceMftCLSIDChain :

  • Žádný IHV/OEM DMFT nebo Platform DMFT

    • CameraDeviceMftCLSIDChain = "" (nebo není nutné zadat tuto položku registru)
  • IHV/OEM DMFT

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

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

    • Tady je snímek obrazovky s výsledným klíčem registru pro USB kameru s platformou DMFT a DMFT (s GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7}) v řetězci.

Řetězec DMFT editoru registru.

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

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

Poznámka:

CameraDeviceMftCLSIDChain může mít maximálně 2 identifikátory CLSID.

Pokud je nakonfigurovaná funkce CameraDeviceMftCLSIDChain , přeskočí DTM starší nastavení CameraDeviceMftCLSID.

Pokud CameraDeviceMftCLSIDChain není nakonfigurován a starší verze CameraDeviceMftCLSID je nakonfigurována, bude řetězec vypadat takto (pokud je kamera USB a podporována platformou DMFT a DMFT platforma je povolena) DevProxy <–> Platform DMFT <–> OEM/IHV DMFT nebo (pokud fotoaparát není podporován platformou DMFT nebo DMFT platforma je zakázána) DevProxy <–> OEM/IHV DMFT.

Příklad nastavení souboru INF:

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

MFT zařízení platformy

Počínaje systémem Windows 10, verzí 1703, poskytuje Windows integrované zařízení MFT pro kamery UVC, známé jako Platform DMFT (PDMFT), na základě volby. Toto DMFT umožňuje nezávislým výrobcům hardwaru (IHV) a výrobcům originálních zařízení (OEM) využívat výhod algoritmů pro postprocessing poskytovaných systémem Windows.

Funkce podporované platformou DMFT Vydání Windows
Umožňuje oblast zájmu založenou na obličeji (ROI) pro 3A úpravy v USB kamerách podporujících ROI. Windows 10 verze 1703

Poznámka:

Pokud fotoaparát nepodporuje UVC 1.5 založené ROI, PDMFT se nenačte, i když bylo zařízení nastaveno, aby používalo PDMFT.

Kamera UVC se může přihlásit k použití DMFT platformy zadáním EnablePlatformDmft prostřednictvím deskriptoru BOS.

Hodnota, kterou chcete zadat pro povolení DMFT platformy, je DWORD podle názvu UVC-EnablePlatformDmft a zadejte jeho hodnotu pomocí deskriptoru BOS. Část Příklad složeného zařízení níže ilustruje, jak povolit Platform DMFT pomocí ukázkového popisovače BOS.

Pokud nemůžete aktualizovat firmware zařízení, jak je popsáno výše, můžete k povolení DMFT platformy pro zařízení použít vlastní soubor INF.

Vlastní soubor INF (založený na vlastním ovladači UVC nebo ovladači doručené pošty UVC) musí obsahovat následující položku AddReg:

EnablePlatformDmft: REG_DWORD: 0x0 (zakázáno) na 0x1 (povoleno)

Pokud je tato položka nastavena na Povoleno (0x1), kanál zachycení používá pro zařízení DMFT platformy doručené pošty. Následuje příklad této vlastní části INF:

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

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

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

Pokud se zařízení ve Windows 10 verze 1703 rozhodne používat PDMFT, jsou povolené všechny funkce podporované pdmFT (na základě možností zařízení). Podrobná konfigurace funkcí PDMFT není podporována.

Poznámka:

Souřadnice ROI založené na rozpoznávání tváře se počítají vzhledem k poli zobrazení obrázku přenášeného do PDMFT. Pokud bylo pole zobrazení změněno z důvodu použití ovládacího prvku, jako je lupa, posun nebo naklonění nebo digitální okno, je fotoaparát zodpovědný za mapování zadaných souřadnic zpět do úplného pole zobrazení senzoru vzhledem k aktuálnímu okně lupy/posunu.

Profil ověřování tváře prostřednictvím popisovačů MS OS

Windows 10 RS5 teď vynucuje požadavek profilu ověřování tváře V2 pro jakoukoli kameru s podporou Windows Hello. U systémů založených na MIPI se specifickým zásobníkem ovladačů fotoaparátu lze tuto podporu publikovat buď prostřednictvím INF (nebo rozšíření INF), nebo prostřednictvím zásuvného modulu v uživatelském režimu (Device MFT).

U zařízení USB Video ale omezení s fotoaparáty založenými na UVC je, že pro Windows 10 19H1 nejsou povolené vlastní ovladače fotoaparátu. Všechny kamery založené na UVC musí používat vestavěný ovladač USB Video Class a všechna rozšíření dodavatelů musí být implementována ve formě MFT zařízení.

U mnoha modulů OEM/ODM je upřednostňovaným přístupem pro moduly fotoaparátu implementovat většinu funkcí ve firmwaru modulu, tj. prostřednictvím popisovačů operačního systému Microsoft.

Pro publikování profilu rozpoznávání tváře prostřednictvím popisovačů MSOS (označovaných také jako popisovače BOS) jsou podporovány následující kamery:

  • Kamera RGB, která se má používat ve skupině snímačů s oddělenou infračervenou kamerou.

  • Jen IR kamera, která se má použít ve skupině senzorů se samostatnou RGB kamerou.

  • Kamera RGB+IR s oddělenými kolíky IR a RGB.

Poznámka:

Pokud firmware fotoaparátu nemůže splňovat jeden ze tří požadavků popsaných výše, musí ODM/OEM použít rozšíření INF k deklaraci profilu fotoaparátu V2.

Příklad rozložení popisovače operačního systému Microsoft OS

Příklady jsou uvedeny níže pro následující specifikace:

  • Specifikace rozšířených popisovačů operačního systému Microsoft 1.0

  • Specifikace popisovačů Microsoft OS 2.0

Specifikace rozšířeného popisovače Microsoft OS 1.0

Popisovač rozšířených vlastností operačního systému má dvě komponenty.

  • Oddíl záhlaví s pevnou délkou
  • Jedna nebo více oddílů vlastních vlastností s proměnnou délkou, které následují za oddílem záhlaví

Oddíl záhlaví popisovače Microsoft OS 1.0

Oddíl záhlaví popisuje jednu vlastní vlastnost (profil ověřování tváře).

Offset Obor Velikost (bajty) Hodnota Popis
0 dwLength 4 <>
4 bcdVersion 2 0x0100 Verze 1.0
6 wIndex 2 0x0005 Popisovač rozšířené vlastnosti operačního systému
8 wCount 2 0x0001 Jedna vlastní vlastnost

Oddíl uživatelské vlastnosti deskriptoru Microsoft OS 1.0

Offset Obor Velikost (bajty) Hodnota Popis
0 dwSize 4 0x00000036 (54) Celková velikost (v bajtech) pro tuto vlastnost.
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) Velikost (v bajtech) názvu vlastnosti
10 bPropertyName 36 UVC-CPV2FaceAuth Řetězec UVC-CPV2FaceAuth v kódu Unicode
46 dwPropertyDataLength 4 0x00000004 4 bajty pro data vlastností (sizeof(DWORD)).
50 bPropertyData 4 Viz schéma dat níže Viz schéma dat níže.
Schéma datové části

Datová část UVC-CPV2FaceAuth je 32bitové celé číslo bez znaménka. Vyšších 16 bitů představuje index 0 seznamu typů médií vystaveného RGB pinem. 16bitový index nižšího řádu představuje seznam typů médií s indexováním od 0 zpřístupněný IR pinem.

Například fotoaparát Typu 3, který zveřejňuje následující typy médií v pořadí deklarované z špendlíku RGB:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

A následující typ médií pro infračervené prostředí:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Hodnota datové části 0x00010000 způsobí publikování následujícího profilu ověřování obličeje:

Pin0:(RES==1280;720; FRT==30,1; SUT==MJPG) // Druhý typ média (0x0001)
Pin1:(RES==480,480; FRT==30,1; SUT==L8) // První typ média (0x0000)

Poznámka:

V době psaní tohoto článku má Windows Hello minimální požadavek na 480x480@7.5fps pro datový proud RGB a 340x340@15fps pro datový proud IR. IHV/OEM musí vybrat typy médií, které splňují tento požadavek při povolování profilu ověřování obličeje.

Ukázka kamery typu 1

Pro fotoaparát typu 1, protože neexistuje žádný IR vstup (předpokládá se, že se kamera Typu 1 spáruje s kamerou Typu 2 na zařízení ve skupině senzorů), je publikován pouze index typu média RGB. U indexu typu média IR musí být hodnota 16bitové části datového paketu s nižším pořadím nastavena na 0xFFFF.

Pokud například fotoaparát typu 1 odhalil následující seznam typů médií:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

Pokud chcete zveřejnit CPV2FaceAuth v mediálním typu MJPG, 1280x720@30fps, datová část musí být nastavena na 0x0001FFFF.

Ukázka kamery typu 2

U fotoaparátu typu 2 musí být horních 16 bitů nastaveno na 0xFFFF a dolní 16 bity označují typ IR média, který se má použít.

Například pro fotoaparát typu 2 s následujícími typy médií:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Pokud se pro ověřování tváře používá první typ média, hodnota musí být: 0xFFFF0000.

Specifikace rozšířeného popisovače Microsoft OS verze 2.0

Rozšířené popisovače MSOS 2.0 lze použít k definování hodnot registru pro přidání podpory profilu ověřování tváře. To se provádí pomocí popisovače vlastností registru Microsoft OS 2.0.

Pro položku registru UVC-CPV2FaceAuth se zobrazí ukázková sada popisovače MSOS 2.0:

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

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

Když přidáte položku registru UVC-CPV2FaceAuth, zařízení nemusí publikovat položku registru EnableDshowRedirection, jak je popsáno v pokynech k implementaci mostu DShow pro zařízení UVC.

Pokud ale dodavatel zařízení musí podporovat starší verze Windows nebo musí povolit dekompresi MJPEG v rámci Frame Serveru, musí být přidána položka registru EnableDshowRedirection.

Generování skupiny senzorů

Když OEM vytváří systémy pomocí fotoaparátů Typu 1 a Type 2, aby poskytovaly podporu RGB i IR pro podporu Windows Hello, musí OEM deklarovat obě kamery, které jsou součástí syntetizované skupiny senzorů.

To se provádí deklarováním značky FSSensorGroupId a FSSensorGroupName v souboru INF rozšíření, který se vytvoří v rámci vlastnosti rozhraní zařízení pro každou jednotlivou kameru.

Pokud však není k dispozici rozšíření INF, mohou ODMs použít stejné popisovače MSOS k publikování hodnot FSSensorGroupId a FSSensorGroupName. Ovladač inbox Windows 10 USB Video Class automaticky převezme jakýkoli popisovač MSOS, jehož název datové části má předponu "UVC-" a migruje značku do úložiště vlastností rozhraní zařízení (odebere předponu UVC-).

Takže fotoaparát Typu 1 a Typ 2, který publikuje následující, umožní operačnímu systému syntetizovat fotoaparáty do skupiny snímačů s více zařízeními pro použití s Windows Hello:

UVC-FSSensorGroupId
UVC-FSSensorGroupName

Datová část pro každou značku musí být řetězec Unicode. Datová část UVC-FSSensorGroupId musí být řetězec GUID v následujícím formátu:

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

Hodnota identifikátoru GUID musí být stejná mezi fotoaparáty Typu 1 a Type 2 a obě kamery musí být přidány do stejné fyzické skříně. Pro vestavěné kamery je fyzická skříň sama o sobě počítač. U externích fotoaparátů musí být oba moduly Typu 1 a Type 2 Camera integrované do stejného fyzického zařízení připojeného k počítači.

Vlastní kategorie rozhraní zařízení pro skupiny senzorů

Od verze 19H1 poskytuje Systém Windows mechanismus rozšíření určený pro IHV/OEM, který umožňuje publikování syntetizovaných skupin senzorů do jakékoli vlastní nebo předdefinované kategorie. Generování skupiny snímačů je definováno tím, že IHV/OEMs poskytují klíč ID skupiny snímačů ve vlastním INF souboru.

FSSensorGroupId: {Custom GUID}
FSSensorGroupName: <Popisný název používaný pro skupinu senzorů>

Kromě dvou výše uvedených položek AddReg v INF je pro vlastní kategorie definována nová položka AddReg:

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

Více kategorií je definováno pomocí seznamu GUID odděleného středníkem (;).

Každé zařízení deklarující odpovídající FSSensorGroupId musí deklarovat stejné FSSensorGroupCategoryList. Pokud se seznam neshoduje, všechny seznamy se ignorují a skupina senzorů se ve výchozím nastavení publikuje do KSCATEGORY_SENSOR_GROUP, jako by nebyly definovány žádné vlastní kategorie.

Otočení kamery

Zobrazit orientaci zařízení fotoaparátu

Mezipaměť ovládacího prvku UVC

Viz Řídicí mezipaměť UVC

Popisovač BOS a MS OS 2.0

Kamera kompatibilní s UVC může specifikovat hodnoty konfigurace zařízení specifické pro Windows pomocí popisovačů Microsoft OS 2.0 v popisovači BOS schopností platformy ve svém firmwaru. V dokumentaci k popisovači MS OS 2.0 se dozvíte, jak určit platný popisovač BOS, který předává konfiguraci zařízení operačnímu systému.

Hlavička sady popisovačů Microsoft OS 2.0

Offset Obor Velikost (bajty) Popis
0 wDélka 2 Délka v bajtech této hlavičky musí být 10.
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 4 Verze systému Windows.
8 wCelkováDélka 2 Velikost celé sady popisovačů MS OS 2.0 včetně této velikosti záhlaví.

Popisovač vlastností registru Microsoft OS 2.0

Offset Obor Velikost (bajty) Popis
0 wDélka 2 Délka v bajtech tohoto popisovače
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 0x04 (REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 Délka názvu vlastnosti.
8 NázevVlastnosti Proměnná Název vlastnosti registru.
8+M wPropertyDataLength 2 Délka dat vlastnosti.
10+ milionů Údaje o nemovitosti Proměnná Data vlastností

Pokud je ve firmwaru zadán platný popisovač MS OS 2.0, USB zásobník řadiče zkopíruje konfigurační hodnoty do níže uvedeného klíče registru HW zařízení.

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

Ovladač UVC načte konfigurační hodnoty z klíče registru HW zařízení a odpovídajícím způsobem nakonfiguruje zařízení v operačním systému. Pokud například firmware určuje zařízení, které se má zaregistrovat jako kamera snímače pomocí konfigurační hodnoty, ovladač UVC zaregistruje zařízení přímo v této kategorii.

Konfigurace zařízení UVC prostřednictvím deskriptoru BOS platformy je mechanismus, který byl povolen ve Windows 10 verze 1703, který pomáhá dodavatelům zařízení UVC konfigurovat zařízení bez nutnosti souboru INF v operačním systému Windows.

Konfigurace zařízení UVC prostřednictvím vlastního INF se stále podporuje a má přednost před mechanismem založeným na deskriptoru BOS. Při zadávání vlastností zařízení prostřednictvím INF nemusíte přidávat předponu UVC-. Tato předpona je nutná pouze pro vlastnosti zařízení, které jsou zadány prostřednictvím popisovače BOS a které jsou specifické pro každou instanci rozhraní. Pokud vaše zařízení potřebuje pluginy v uživatelském režimu, jako je DMFT, je nutné dodat INF pro instalaci DMFT. Nejde ho nakonfigurovat pomocí firmwaru.

Aktuálně podporované hodnoty konfigurace prostřednictvím popisovače BOS

Název konfigurace Typ Popis
SensorCameraMode REG_DWORD Zaregistrujte kameru v konkrétní kategorii.
UVC-FSSensorGroupID, UVC-FSSensorGroupName REG_SZ Seskupte kamery se stejnými UVC-FSSensorGroupID
UVC-EnableDependentStillPinCapture REG_DWORD Povolení metody zachycení 2/3
UVC-EnablePlatformDmft REG_DWORD Povolit platformu DMFT

Když ovladač UVC zobrazí hodnoty registru s předponou UVC-, naplní klíč registru instance rozhraní kategorie zařízení stejnými hodnotami bez předpony. Ovladač to provede pro libovolnou proměnnou určenou firmwarem, nejen pro proměnné uvedené výše.

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

Aby operační systém mohl využít schopnosti zařízení BOS platformy a deskriptory MS OS 2.0, musí popisovač zařízení určit verzi bcdUSB, která musí být 0x0210 nebo vyšší.

Příklad složeného zařízení

Tato část obsahuje popisovač BOS a popisovač MS OS 2.0 pro příklad složeného zařízení se dvěma funkcemi fotoaparátu. Jedna funkce je barevná kamera UVC a druhou funkcí je kamera IR UVC.

Ukázkové popisovače jsou následující:

  1. Registrace funkce barevné kamery v KSCATEGORY_VIDEO_CAMERA

  2. Registrace funkce kamery IR v KSCATEGORY_SENSOR_CAMERA

  3. Povolit funkci barevné kamery pro snímání statických obrázků

  4. Spojuje funkce barevné a infračervené kamery do skupiny.

Při výčtu zařízení načte zásobník USB deskriptor BOS ze zařízení. Po popisovači BOS následuje schopnost zařízení specifická pro danou platformu.

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

Popisovač schopností platformy BOS určuje:

  1. GUID schopnosti platformy popisovače MS OS 2.0

  2. Kód ovládacího prvku dodavatele bMS_VendorCode (tady je nastavená hodnota 1. Může vzít jakoukoli hodnotu, kterou dodavatel preferuje) k načtení popisovače MS OS 2.0.

  3. Tento popisovač BOS se vztahuje na verzi operačního systému Windows 10 a novější.

Po zobrazení deskriptoru BOS vydá zásobník USB žádost o kontrolu konkrétního dodavatele, která načte popisovač MS OS 2.0.

Formát žádosti o ovládání pro načtení popisovače specifického pro výrobce MS OS 2.0:

bmRequestType BRequest wValue WIndex wDélka Údaje
1100 0000B bMS_VendorCode 0x00 0x07 Délka Vrácený blob sady popisovačů MS OS 2.0

bmRequestType

  • Směr přenosu dat – zařízení k hostiteli

  • Typ – Dodavatel

  • Příjemce – zařízení

bRequest

Hodnota bMS_VendorCode vrácená ve struktuře informací o sadě deskriptorů.

wValue

Nastavte na 0x00.

wIndex

0x7 pro MS_OS_20_DESCRIPTOR_INDEX.

wLength

Délka sady popisovače MS OS 2.0, jak je vráceno v popisovači BOS. 0x25C (604) v tomto příkladu.

Očekává se, že zařízení vrátí popisovač MS OS 2.0, jako je ten zadaný v sadě USBVideoMSOS20DescriptorSet.

Sada USBVideoMSOS20DescriptorSet popisuje barevné a IR funkce. Určuje následující hodnoty popisovače MS OS 2.0:

  1. Nastavit záhlaví

  2. Hlavička podmnožiny konfigurace

  3. Záhlaví podmnožiny funkcí barevné kamery

  4. Popisovač funkce hodnoty registru pro ID skupiny senzorů

  5. Popisovač funkce hodnoty registru pro název skupiny senzorů

  6. Popisovač funkce hodnoty registru pro povolení pořízení statického snímku

  7. Popisovač funkce hodnoty registru pro aktivaci platformy DMFT

  8. Záhlaví pro podmnožinu funkcí IR kamery

  9. Popisovač funkce hodnoty registru pro ID skupiny senzorů

  10. Popisovač funkce hodnoty registru pro název skupiny senzorů

  11. Popisovač vlastností hodnot registru pro registraci kamery jako senzorové kamery

Firmware bude mít obslužnou rutinu pro požadavek dodavatele, který vrátí následující popisovač MS OS 2.0 pro imaginární zařízení popsané na začátku této části.

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