Freigeben über


Usb Video Class (UVC)-Kameraimplementierungshandbuch

Ab Windows 10 wird für Geräte, die mit der USB-Videoklassenspezifikation (Version 1.0 bis 1.5) konform sind, ein USB Video Class-Treiber (USB Video Class) bereitgestellt. Dieser Treiber unterstützt Farb- und Sensorkameras. In diesem Dokument wird beschrieben, wie bestimmte Funktionen einer UVC-kompatiblen Kamera für die Anwendungen über den Posteingangstreiber verfügbar gemacht werden.

Begriff

Stichwort BESCHREIBUNG
UVC USB-Videoklasse
UVC-Treiber USBVideo.sys Treiber, der im Lieferumfang des Betriebssystems enthalten ist
IR Infrarot
Farbkamera Die Kamera, die Farbströme ausgibt (z. B. RGB- oder YUV-Kameras)
Sensorkamera Die Kamera, die Nicht-Farbdatenströme ausgibt (z. B. IR- oder Tiefenkameras)
BOS Objektspeicher für binäre Geräte
MS OS 2.0-Deskriptor Microsoft-plattformspezifische BOS-Gerätefunktionsdeskriptor

Sensorkameras

Windows unterstützt zwei Kategorien von Kameras. Eine ist eine Farbkamera und die andere ist eine Nicht-Farbsensorkamera. RGB- oder YUV-Kameras werden als Farbkameras kategorisiert, und Nicht-Farbkameras wie Graustufen-, IR- und Tiefenkameras werden als Sensorkameras kategorisiert. Der UVC-Treiber unterstützt beide Kameratypen. Es wird empfohlen, dass die Kamerafirmware einen Wert angibt, basierend auf dem der UVC-Treiber die Kamera unter einer oder beiden unterstützten Kategorien registriert.

Eine Kamera, die nur Farbformattypen unterstützt, sollte unter KSCATEGORY_VIDEO_CAMERA registriert werden. Eine Kamera, die IR- oder Tiefenformattypen unterstützt, sollte unter KSCATEGORY_SENSOR_CAMERA registriert werden. Eine Kamera, die sowohl Farb- als auch Nichtfarbformattypen unterstützt, sollte unter KSCATEGORY_VIDEO_CAMERA und KSCATEGORY_SENSOR_CAMERA registriert werden. Diese Kategorisierung hilft Anwendungen bei der Auswahl der Kamera, mit der sie arbeiten möchten.

Eine UVC-Kamera kann ihre Kategoriepräferenz über die Attribute SensorCameraMode und SkipCameraEnumeration im BOS MS OS 2.0-Deskriptor angeben, der in den folgenden Abschnitten beschrieben wird.

Das Attribut SensorCameraMode nimmt den Wert 1 oder 2 an.

Der Wert 1 registriert das Gerät unter KSCATEGORY_SENSOR_CAMERA. Geben Sie darüber hinaus den Wert 1 für SkipCameraEnumeration an, um die Kamera für Anwendungen verfügbar zu machen, die nur nach Sensorkameras suchen. Eine Kamera, die nur Sensorkameramedientypen verfügbar macht, sollte diesen Wert verwenden.

Der Wert 2 für SensorCameraMode registriert das Gerät unter KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA. Dadurch ist die Kamera für Anwendungen verfügbar, die nach Sensor- und Farbkameras suchen. Eine Kamera, die sowohl Sensorkamera- als auch Farbkameramedientypen verfügbar macht, sollte diesen Wert verwenden.

Es wird empfohlen, den oben genannten Registrierungswert mithilfe des BOS-Deskriptors anzugeben. Im Abschnitt Beispiel für zusammengesetzte Geräte finden Sie einen BEISPIEL-BOS-Deskriptor mit einem plattformspezifischen MS OS 2.0-Deskriptor.

Wenn Sie die Gerätefirmware nicht wie oben beschrieben aktualisieren können, können Sie einen benutzerdefinierten INF verwenden und angeben, dass Ihre Kamera als Sensorkamera registriert werden muss, indem Sie einen Wert für SensorCameraMode und SkipCameraEnumeration wie folgt angeben:

Eine benutzerdefinierte INF-Datei (basierend auf dem UVC-Treiber des Posteingangs) muss die folgenden AddReg-Einträge enthalten:

SensorCameraMode: REG_DWORD: 1 (zur Registrierung als Sensorkamera)

SkipCameraEnumeration: REG_DWORD: 1 (nur für IR-Anwendungen verfügbar machen)

Ein Beispiel für den benutzerdefinierten INF-Abschnitt ist wie folgt:

[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

Wenn die Attribute SensorCameraMode und SkipCameraEnumeration in der Firmware oder im INF nicht angegeben sind, wird die Kamera als Farbkamera registriert und ist nur für farbkamerafähige Anwendungen sichtbar.

IR-Stream

Der Windows-Posteingang USB Video Class (UVC)-Treiber unterstützt Kameras, die die Szene im YUV-Format erfassen und die Pixeldaten über USB als unkomprimierte YUV oder als komprimierte MJPEG-Frames übertragen.

Die folgenden Formattyp-GUIDs sollten im Streamvideoformatdeskriptor angegeben werden, wie in der WDK ksmedia.h-Headerdatei definiert:

Typ BESCHREIBUNG
KSDATAFORMAT_SUBTYPE_L8_IR Unkomprimierte 8-Bit-Lumaebene. Dieser Typ wird MFVideoFormat_L8 zugeordnet.
KSDATAFORMAT_SUBTYPE_L16_IR Unkomprimierte 16-Bit-Lumaebene. Dieser Typ wird MFVideoFormat_L16 zugeordnet.
KSDATAFORMAT_SUBTYPE_MJPG_IR Komprimierte MJPEG-Frames. Media Foundation konvertiert diese in nicht komprimierte NV12-Frames und verwendet nur die luma-Ebene.

Wenn diese Formattyp-GUIDs im Feld guidFormat des Framedeskriptors angegeben werden, markiert die Media Foundation-Erfassungspipeline den Stream als IR-Stream. Anwendungen, die mit der FrameReader-API von Media Foundation geschrieben wurden, können den IR-Stream nutzen. Von der Pipeline für IR-Datenströme werden keine Skalierung oder Konvertierungen der IR-Frames unterstützt.

Ein Stream, der IR-Formattypen verfügbar macht, darf keine RGB- oder Tiefenformattypen verfügbar machen.

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

Hinweis

IR-Streams werden als reguläre Aufzeichnungsdatenströme in DShow angezeigt.

Tiefenstream

Der USB-Videoklassentreiber für den Windows-Posteingang unterstützt Kameras, die Tiefendatenströme erzeugen. Diese Kameras erfassen die Tiefeninformationen (z. B. Flugzeit) der Szene und übertragen die Tiefenkarte als unkomprimierte YUV-Frames über USB. Die folgende Formattyp-GUID sollte im Streamvideoformatdeskriptor angegeben werden, wie in der WDK ksmedia.h-Headerdatei definiert:

Typ BESCHREIBUNG
KSDATAFORMAT_SUBTYPE_D16 16-Bit-Tiefenkartenwerte. Dieser Typ ist mit MFVideoFormat_D16 identisch. Die Werte sind in Millimetern.

Wenn der Formattyp GUID im guidFormat-Member des Framedeskriptors angegeben wird, markiert die Media Foundation-Aufnahmepipeline den Stream als Tiefenstream. Anwendungen, die mit der FrameReader-API geschrieben wurden, können den Tiefenstream nutzen. Die Pipeline unterstützt keine Skalierung oder Konvertierungen der Tiefenframes für Tiefenstreams.

Ein Stream, der Tiefenformattypen verfügbar macht, darf keine RGB- oder IR-Formattypen verfügbar machen.

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

Hinweis

Tiefenstreams werden in DShow als reguläre Aufzeichnungsstreams angezeigt.

Gruppieren von Kameras

Windows unterstützt die Gruppierung von Kameras basierend auf ihrer Container-ID, um Anwendungen bei der Arbeit mit zugehörigen Kameras zu unterstützen. Beispielsweise können eine IR-Kamera und eine Farbkamera, die auf demselben physischen Gerät vorhanden sind, dem Betriebssystem wie verwandte Kameras ausgesetzt werden. Dies führt dazu, dass Anwendungen wie Windows Hello die zugehörigen Kameras für ihre Szenarien verwenden.

Die Beziehung zwischen den Kamerafunktionen kann im BOS-Deskriptor der Kamera in der Firmware angegeben werden. Der UVC-Treiber nutzt diese Informationen und macht diese Kamerafunktionen entsprechend verfügbar. Dadurch macht der Kamerastapel des Betriebssystems sie als verwandte Kameragruppe für die Anwendungen verfügbar.

Die Kamerafirmware muss eine UVC-FSSensorGroupID angeben, bei der es sich um eine GUID in Zeichenfolgenform mit der geschweiften Klammer handelt. Die Kameras mit derselben UVC-FSSensorGroupID werden gruppiert.

Die Sensorgruppe kann einen Namen erhalten, indem Sie UVC-FSSensorGroupName, eine Unicode-Zeichenfolge, in der Firmware angeben.

Im Abschnitt Beispiel für zusammengesetzte Geräte finden Sie unten eine veranschauliche Bos, die UVC-FSSensorGroupID und UVC-FSSensorGroupName angibt.

Wenn Sie die Gerätefirmware nicht wie oben beschrieben aktualisieren können, können Sie einen benutzerdefinierten INF verwenden und angeben, dass Ihre Kamera Teil einer Sensorgruppe ist, indem Sie wie folgt eine Sensorgruppen-ID und einen Namen angeben. Die benutzerdefinierte INF-Datei (basierend auf dem UVC-Treiber des Posteingangs) muss die folgenden AddReg-Einträge enthalten:

FSSensorGroupID: REG_SZ: "{Ihre Sensorgruppen-ID GUID}"

FSSensorGroupName: REG_SZ: "Anzeigename Ihrer Sensorgruppe"

Ein Beispiel für den benutzerdefinierten INF-Abschnitt wäre wie folgt:

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

Hinweis

Sensorgruppen werden in der DShow-Erfassungspipeline nicht unterstützt.

Unterstützung für Methode 2 oder Methode 3

Die UVC-Spezifikation bietet einen Mechanismus, um anzugeben, ob die Videostreamingschnittstelle die Standbilderfassung vom Typ Methode 1/2/3 unterstützt. Damit das Betriebssystem die Unterstützung für die Standbilderfassung nach Methode 2/3 des Geräts nutzen kann, könnte die Gerätefirmware über den UVC-Treiber einen Wert im BOS-Deskriptor angeben.

Der Wert, der angegeben werden soll, um die Standbilderfassung von Methode 2/3 zu aktivieren, ist ein DWORD mit dem Namen UVC-EnableDependentStillPinCapture. Geben Sie den Wert mithilfe des BOS-Deskriptors an. Das nachstehende zusammengesetzte Beispielgerät veranschaulicht die Aktivierung der Standbilderfassung mit einem BOS-Beispieldeskriptor.

Wenn Sie die Gerätefirmware nicht wie oben beschrieben aktualisieren können, können Sie eine benutzerdefinierte INF verwenden, um anzugeben, dass Ihre Kamera Methode 2 oder Methode 3 still capture-Methode unterstützt.

Die benutzerdefinierte INF-Datei (basierend auf einem benutzerdefinierten UVC-Treiber oder einem UVC-Posteingangstreiber) muss den folgenden AddReg-Eintrag enthalten:

EnableDependentStillPinCapture: REG_DWORD: 0x0 (deaktiviert) zum 0x1 (aktiviert)

Wenn dieser Eintrag auf Aktiviert (0x1) festgelegt ist, nutzt die Erfassungspipeline Methode 2/3 für die Standbilderfassung (vorausgesetzt, die Firmware kündigt auch Unterstützung für Methode 2/3 an, wie durch uvc-Spezifikation angegeben).

Ein Beispiel für den benutzerdefinierten INF-Abschnitt ist wie folgt:

[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

MFT-Verkettung von Geräten

Device MFT ist der empfohlene Benutzermodus-Plug-In-Mechanismus für IHVs und OEMs, um die Kamerafunktionalität unter Windows zu erweitern.

Vor Windows 10 Version 1703 unterstützte die Kamerapipeline nur ein DMFT-Erweiterungs-Plug-In.

Ab Windows 10 Version 1703 unterstützt die Windows-Kamerapipeline eine optionale Kette von DMFTs mit maximal zwei DMFTs.

Ab Windows 11 Version 22H2 unterstützt die Windows-Kamerapipeline eine optionale Kette von DMFTs mit maximal vier DMFTs.

Dies bietet oeMs und IHVs eine größere Flexibilität, um Mehrwert in Form von Nachbearbeitungskamerastreams zu bieten. Beispielsweise könnte ein Gerät PDMFT zusammen mit einer IHV-DMFT und einer OEM-DMFT verwenden.

Die folgende Abbildung veranschaulicht die Architektur, die eine Kette von DMFTs umfasst.

DMFT-Kette.

Erfassen Sie den Fluss von Beispielen vom Kameratreiber zu DevProxy, und durchlaufen Sie dann die DMFT-Ketten. Jede DMFT in der Kette hat die Möglichkeit, das Beispiel zu verarbeiten. Wenn das DMFT das Beispiel nicht verarbeiten möchte, kann es als Passthrough fungieren, einfach das Beispiel an das nächste DMFT übergeben.

Bei Steuerelementen wie KsProperty geht der Aufruf Upstream – der letzte DMFT in der Kette erhält zuerst den Aufruf, der Anruf kann dort verarbeitet oder an das vorherige DMFT in der Kette übergeben werden.

Fehler werden von DMFT an DTM und dann an Anwendungen weitergegeben. Bei IHV/OEM-DMFTs ist dies ein schwerwiegender Fehler für DTM, wenn eine der DMFT nicht instanziiert werden kann.

Anforderungen für DMFTs:

  • Die Anzahl der Eingabe-Pins des DMFT muss mit der Anzahl der Ausgabepins des vorherigen DMFT übereinstimmen, andernfalls schlägt DTM während der Initialisierung fehl. Die Anzahl der Eingabe- und Ausgabe-Pins derselben DMFT muss jedoch nicht übereinstimmen.

  • DMFT muss Schnittstellen unterstützen: IMFDeviceTransform, IMFShutdown, IMFRealTimeClientEx, IKsControl und IMFMediaEventGenerator; MÖGLICHERWEISE muss IMFTransform unterstützt werden, wenn MFT0 konfiguriert ist oder die nächste DMFT in der Kette IMFTransform-Unterstützung erfordert.

  • Auf 64-Bit-Systemen, die Frame Server nicht verwenden, müssen sowohl 32-Bit- als auch 64-Bit-DMFTs registriert werden. Da eine USB-Kamera möglicherweise an ein beliebiges System angeschlossen wird, sollte der HERSTELLER der USB-Kamera sowohl 32-Bit- als auch 64-Bit-DMFTs für "externe" (oder nicht posteingangsfähige) USB-Kameras bereitstellen.

Konfigurieren der DMFT-Kette

Ein Kameragerät kann optional ein DMFT-COM-Objekt in einer DLL mithilfe einer benutzerdefinierten INF-Datei bereitstellen, die Abschnitte des Posteingangs USBVideo.INF verwendet.

Im benutzerdefinierten . Geben Sie im Abschnitt "Interface AddReg" der INF-Datei die DMFT-CLSIDs an, indem Sie den folgenden Registrierungseintrag hinzufügen:

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

Wie in den folgenden INF-Beispieleinstellungen gezeigt (ersetzen Sie %Dmft0.CLSID% und % Dmft1.CLSID% durch die tatsächlichen CLSID-Zeichenfolgen, die Sie für Ihre DMFTs verwenden), sind maximal 2 CLSIDs in Windows 10, Version 1703, zulässig, und die erste ist DevProxy am nächsten, und die letzte ist die letzte DMFT in der Kette.

Plattform-DMFT CLSID ist {3D096DDE-8971-4AD5-98F9-C74F56492630}.

Einige Beispieleinstellungen für CameraDeviceMftCLSIDChain :

  • Keine IHV/OEM-DMFT oder Plattform-DMFT

    • CameraDeviceMftCLSIDChain = "" (oder es ist nicht erforderlich, diesen Registrierungseintrag anzugeben)
  • IHV/OEM-DMFT

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

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

    • Hier ist ein Screenshot des Ergebnisregistrierungsschlüssels für eine USB-Kamera mit der Plattform-DMFT und einer DMFT (mit der GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7}) in der Kette.

DMFT-Kette des Registrierungs-Editors.

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

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

Hinweis

Die CameraDeviceMftCLSIDChain kann maximal 2 CLSIDs enthalten.

Wenn CameraDeviceMftCLSIDChain konfiguriert ist, werden die älteren CameraDeviceMftCLSID-Einstellungen von DTM übersprungen.

Wenn CameraDeviceMftCLSIDChain nicht konfiguriert ist und die Legacy-CameraDeviceMftCLSID konfiguriert ist, sieht die Kette wie folgt aus (wenn die USB-Kamera und unterstützt von Platform DMFT und Platform DMFT aktiviert ist) DevProxy <–> Platform DMFT <–> OEM/IHV DMFT oder (wenn die Kamera nicht von Platform DMFT unterstützt wird oder Plattform-DMFT deaktiviert ist) DevProxy <–> OEM/IHV DMFT.

Beispieleinstellungen für INF-Dateien:

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

Plattformgerät MFT

Ab Windows 10 Version 1703 stellt Windows einen Posteingang Device MFT für UVC-Kameras bereit, der als Plattform-DMFT (PDMFT) bezeichnet wird. Mit dieser DMFT können IHVs und OEMs die von Windows bereitgestellten Nachverarbeitungsalgorithmen nutzen.

Von Plattform-DMFT unterstützte Features Windows-Version
Ermöglicht die gesichtsbasierte Region von Interesse (Roi) für 3A-Anpassungen in ROI-fähigen USB-Kameras. Windows 10, Version 1703

Hinweis

Wenn die Kamera keinen UVC 1.5-basierten ROI unterstützt, wird die PDMFT auch dann nicht geladen, wenn sich das Gerät für die Verwendung von PDMFT entschieden hat.

Eine UVC-Kamera kann sich für die Verwendung der Plattform-DMFT entscheiden, indem sie den Deskriptor EnablePlatformDmft über BOS angibt.

Der wert, der angegeben werden soll, um Platform DMFT zu aktivieren, ist ein DWORD mit dem Namen UVC-EnablePlatformDmft , und geben Den Wert mithilfe des BOS-Deskriptors an. Im Abschnitt Beispiel für zusammengesetztes Gerät unten wird die Aktivierung von Plattform-DMFT mit einem BEISPIEL-BOS-Deskriptor veranschaulicht.

Wenn Sie die Gerätefirmware nicht wie oben beschrieben aktualisieren können, können Sie eine benutzerdefinierte INF-Datei verwenden, um Plattform-DMFT für das Gerät zu aktivieren.

Die benutzerdefinierte INF-Datei (basierend auf einem benutzerdefinierten UVC-Treiber oder einem UVC-Posteingangstreiber) muss den folgenden AddReg-Eintrag enthalten:

EnablePlatformDmft: REG_DWORD: 0x0 (deaktiviert) für 0x1 (aktiviert)

Wenn dieser Eintrag auf Aktiviert (0x1) festgelegt ist, verwendet die Erfassungspipeline die Posteingangsplattform-DMFT für das Gerät. Im Folgenden finden Sie ein Beispiel für diesen benutzerdefinierten INF-Abschnitt:

[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

Wenn in Windows 10, Version 1703, ein Gerät PDMFT verwendet, werden alle Features aktiviert, die von PDMFT unterstützt werden (basierend auf den Gerätefunktionen). Die präzise Konfiguration von PDMFT-Features wird nicht unterstützt.

Hinweis

Gesichtsbasierte ROI-Koordinaten werden relativ zum Sichtfeld des Bilds berechnet, das in das PDMFT übertragen wird. Wenn das Sichtfeld aufgrund der Verwendung eines Steuerelements wie Zoom, Schwenken, Neigen oder Digitalfenster geändert wurde, ist die Kamera für die Zuordnung der bereitgestellten Koordinaten zum vollständigen Sichtfeld des Sensors verantwortlich, wobei das aktuelle Zoom-/Schwenkfenster berücksichtigt wird.

Gesichtsauthentifizierungsprofil über MS OS-Deskriptoren

Windows 10 RS5 erzwingt jetzt eine Anforderung des Gesichtsauthentifizierungsprofils V2 für jede Kamera mit Windows Hello-Unterstützung. Für MIPI-basierte Systeme mit benutzerdefiniertem Kameratreiberstapel kann diese Unterstützung entweder über ein INF (oder eine Erweiterungs-INF) oder über ein Benutzermodus-Plug-In (Device MFT) veröffentlicht werden.

Für USB-Videogeräte ist eine Einschränkung für UVC-basierte Kameras jedoch, dass für Windows 10 19H1 benutzerdefinierte Kameratreiber nicht zulässig sind. Alle UVC-basierten Kameras müssen den Usb Video Class-Treiber für den Posteingang verwenden, und alle Anbietererweiterungen müssen in Form eines Geräte-MFT implementiert werden.

Für viele OEM/ODMs besteht der bevorzugte Ansatz für Kameramodule darin, einen Großteil der Funktionalität in der Firmware des Moduls zu implementieren, d. h. über Microsoft-Betriebssystemdeskriptoren.

Die folgenden Kameras werden für die Veröffentlichung des Gesichtsauthentifizierungsprofils über die MSOS-Deskriptoren (auch BOS-Deskriptoren genannt) unterstützt:

  • Nur RGB-Kamera, die in der Sensorgruppe mit einer separaten IR-Kamera verwendet werden soll.

  • Nur IR-Kamera, die in einer Sensorgruppe mit einer separaten RGB-Kamera verwendet werden soll.

  • RGB+IR-Kamera mit separaten IR- und RGB-Pins.

Hinweis

Wenn die Kamerafirmware eine der drei oben beschriebenen Anforderungen nicht erfüllen kann, muss der ODM/OEM ein Erweiterungs-INF verwenden, um das Kameraprofil V2 zu deklarieren.

Beispiellayout für Microsoft-Betriebssystemdeskriptor

Nachfolgend finden Sie Beispiele für die folgenden Spezifikationen:

  • Spezifikation 1.0 für erweiterte Microsoft-Betriebssystemdeskriptoren

  • Microsoft OS 2.0-Deskriptorenspezifikation

Microsoft OS Extended Descriptor 1.0 Specification

Der Betriebssystemdeskriptor für erweiterte Eigenschaften verfügt über zwei Komponenten.

  • Kopfzeilenabschnitt mit fester Länge
  • Ein oder mehrere benutzerdefinierte Eigenschaftenabschnitte mit variabler Länge, die dem Headerabschnitt folgen

Microsoft OS 1.0-Deskriptorheaderabschnitt

Der Headerabschnitt beschreibt eine einzelne benutzerdefinierte Eigenschaft (Face Auth Profile).

Offset Feld Größe (Byte) Wert BESCHREIBUNG
0 dwLength 4 <>
4 bcdVersion 2 0x0100 Version 1.0
6 Windex 2 0x0005 Betriebssystemdeskriptor für erweiterte Eigenschaften
8 wCount 2 0x0001 Eine benutzerdefinierte Eigenschaft

Abschnitt "Benutzerdefinierte Eigenschaft" für Microsoft OS 1.0-Deskriptor

Offset Feld Größe (Byte) Wert BESCHREIBUNG
0 dwSize 4 0x00000036 (54) Gesamtgröße (in Bytes) für diese Eigenschaft.
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) Größe (in Bytes) des Eigenschaftsnamens.
10 bPropertyName 36 UVC-CPV2FaceAuth Zeichenfolge "UVC-CPV2FaceAuth" in Unicode.
46 dwPropertyDataLength 4 0x00000004 4 Bytes für Eigenschaftsdaten (sizeof(DWORD)).
50 bPropertyData 4 Siehe Datenschema unten Siehe Datenschema unten.
Nutzlastschema

Die UVC-CPV2FaceAuth Datennutzlast ist eine 32-Bit-Ganzzahl ohne Vorzeichen. Der hohe 16-Bit-Wert stellt den 0-basierten Index der Medientypliste dar, die vom RGB-Pin verfügbar gemacht wird. Die 16-Bit-Version in niedriger Reihenfolge stellt den 0-basierten Index der Medientypliste dar, die vom IR-Pin verfügbar gemacht wird.

Beispielsweise eine Kamera vom Typ 3, die die folgenden Medientypen in der vom RGB-Pin deklarierten Reihenfolge verfügbar macht:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

Und der folgende Medientyp für IR:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Ein Nutzlastwert von 0x00010000 führt dazu, dass das folgende Gesichtsauthentifizierungsprofil veröffentlicht wird:

Pin0:(RES==1280,720; FRT ==30,1; SUT==MJPG) // Zweiter Medientyp (0x0001)
Pin1:(RES==480.480; FRT ==30,1; SUT==L8) // Erster Medientyp (0x0000)

Hinweis

Zum Zeitpunkt dieses Schreibens hat Windows Hello eine Mindestanforderung von 480x480@7,5fps für den RGB-Stream und 340x340@15fps für den IR-Stream. IHV/OEMs sind erforderlich, um Medientypen auszuwählen, die diese Anforderung erfüllen, wenn das Gesichtsauthentifizierungsprofil aktiviert wird.

Typ 1 Kamerabeispiel

Da bei einer Kamera vom Typ 1 kein IR-Pin vorhanden ist (mit der Erwartung, dass eine Typ-1-Kamera mit einer Typ-2-Kamera auf dem Computer in einer Sensorgruppe gekoppelt wird), wird nur der RGB-Medientypindex veröffentlicht. Für den IR-Medientypindex muss der niedrige 16-Bit-Wert der Nutzlast auf 0xFFFF festgelegt werden.

Wenn beispielsweise eine Kamera vom Typ 1 die folgende Liste der Medientypen verfügbar macht:

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

Um CPV2FaceAuth mit dem MJPG 1280x720@30fps Medientyp zu veröffentlichen, muss die Nutzlast auf 0x0001FFFF festgelegt werden.

Typ 2 Kamerabeispiel

Bei einer Kamera vom Typ 2 muss die hohe 16-Bit-Version auf 0xFFFF festgelegt werden, wobei die 16-Bit-Version in niedriger Reihenfolge den zu verwendenden IR-Medientyp angibt.

Beispielsweise für eine Kamera vom Typ 2 mit den folgenden Medientypen:

  • L8, 480x480@30fps

  • L8, 480x480@15fps

  • L8, 480x480@10fps

Wenn der erste Medientyp für die Gesichtserkennung verwendet wird, muss der Wert folgendes sein: 0xFFFF0000.

Microsoft OS Extended Descriptor 2.0 Specification

MSOS Extended Descriptor 2.0 kann verwendet werden, um die Registrierungswerte zu definieren, um die Unterstützung von Gesichtsauthentifizierungsprofilen hinzuzufügen. Dies geschieht mithilfe des Microsoft OS 2.0-Registrierungseigenschaftsdeskriptors.

Für den UVC-CPV2FaceAuth Registrierungseintrags wird im Folgenden ein MSOS 2.0-Beispieldeskriptorsatz gezeigt:

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

Wenn UVC-CPV2FaceAuth Registrierungseintrag hinzugefügt wird, müssen Geräte den Registrierungseintrag EnableDshowRedirection nicht veröffentlichen, wie in DShow Bridge-Implementierungsanleitung für UVC-Geräte beschrieben.

Wenn der Gerätehersteller jedoch ältere Versionen von Windows unterstützen und/oder die MJPEG-Dekomprimierung innerhalb des Frameservers aktivieren muss, muss der Registrierungseintrag EnableDshowRedirection hinzugefügt werden.

Sensorgruppengenerierung

Wenn OEMs Systeme mit Typ-1- und Typ-2-Kameras erstellen, um sowohl RGB- als auch IR-Streams für Windows Hello Unterstützung bereitzustellen, müssen OEMs die beiden Kameras als Teil einer synthetisierten Sensorgruppe deklarieren.

Dies erfolgt durch Deklarieren der Tags FSSensorGroupId und FSSensorGroupName in einem Erweiterungs-INF, das unter der Geräteschnittstelleneigenschaft für jede Kamera erstellt werden soll.

Wenn die Erweiterung INF jedoch nicht bereitgestellt wird, können ODMs dieselben MSOS-Deskriptoren verwenden, um die Werte FSSensorGroupId und FSSensorGroupName zu veröffentlichen. Der Posteingang Windows 10 USB-Videoklassentreibers nimmt automatisch jeden MSOS-Deskriptor an, dessen Nutzlastname mit dem Präfix "UVC-" versehen wurde, und migriert das Tag in den Eigenschaftenspeicher der Geräteschnittstelle (wobei das Präfix "UVC-" entfernt wird).

Eine Kamera vom Typ 1 und Typ 2, die Folgendes veröffentlicht, ermöglicht es dem Betriebssystem, die Kameras in eine Sensorgruppe mit mehreren Geräten für die Verwendung mit Windows Hello zu synthetisieren:

UVC-FSSensorGroupId
UVC-FSSensorGroupName

Die Nutzlast für jedes Tag muss eine Unicode-Zeichenfolge sein. Die UVC-FSSensorGroupId Nutzlast muss eine GUID-Zeichenfolge im folgenden Format sein:

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX}

Der Wert der GUID muss zwischen den Kameras Typ 1 und Typ 2 identisch sein, und beide Kameras müssen demselben physischen Gehäuse hinzugefügt werden. Bei eingebauten Kameras ist das physische Gehäuse der Computer selbst. Bei externen Kameras müssen sowohl die Kameramodule Typ 1 als auch Typ 2 in dasselbe physische Gerät integriert sein, das mit dem Computer verbunden ist.

Benutzerdefinierte Geräteschnittstellenkategorien für Sensorgruppen

Ab 19H1 stellt Windows einen von IHV/OEM angegebenen Erweiterungsmechanismus bereit, um die Veröffentlichung synthetisierter Sensorgruppen in einer beliebigen benutzerdefinierten oder vordefinierten Kategorie zu ermöglichen. Die Generierung einer Sensorgruppe wird von IHV/OEMs definiert, die einen Sensorgruppen-ID-Schlüssel im benutzerdefinierten INF bereitstellen:

FSSensorGroupId: {Benutzerdefinierte GUID}
FSSensorGroupName: <Anzeigename, der für die Sensorgruppe verwendet wird>

Zusätzlich zu den beiden oben genannten AddReg-Einträgen im INF wird ein neuer AddReg-Eintrag für benutzerdefinierte Kategorien definiert:

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

Mehrere Kategorien werden mithilfe eines Semikolons (;) durch Trennzeichen getrennte GUID-Liste definiert.

Jedes Gerät, das eine übereinstimmende FSSensorGroupId deklariert, muss dieselbe FSSensorGroupCategoryList deklarieren. Wenn die Liste nicht übereinstimmt, werden alle Listen ignoriert, und die Sensorgruppe wird standardmäßig in KSCATEGORY_SENSOR_GROUP veröffentlicht, als ob keine benutzerdefinierten Kategorien definiert wären.

Kameradrehung

Weitere Informationen finden Sie unter Kamerageräteausrichtung.

UVC-Kontrollcache

Siehe UVC Control Cache

BOS- und MS OS 2.0-Deskriptor

UVC-konforme Kamera kann Windows-spezifische Gerätekonfigurationswerte in einem BOS-Deskriptor der Plattformfunktion in ihrer Firmware mithilfe von Microsoft OS 2.0-Deskriptoren angeben. In der Dokumentation zum MS OS 2.0-Deskriptor erfahren Sie, wie Sie einen gültigen BOS-Deskriptor angeben, der die Gerätekonfiguration an das Betriebssystem übermittelt.

Microsoft OS 2.0-Deskriptor-Set-Header

Offset Feld Größe (Byte) BESCHREIBUNG
0 wLength 2 Die Länge dieses Headers in Byte muss 10 sein.
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 4 Windows-Version.
8 wTotalLength 2 Die Größe des gesamten MS OS 2.0-Deskriptorsatzes einschließlich dieser Headergröße.

Microsoft OS 2.0 Registry Property Descriptor

Offset Feld Größe (Byte) BESCHREIBUNG
0 wLength 2 Länge dieses Deskriptors in Byte
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 0x04 (REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 Die Länge des Eigenschaftennamens.
8 PropertyName Variable Der Name der Registrierungseigenschaft.
8+M wPropertyDataLength 2 Die Länge der Eigenschaftendaten.
10+M PropertyData Variable Eigenschaftendaten

Wenn in der Firmware ein gültiger MS OS 2.0-Deskriptor angegeben ist, kopiert der USB-Stapel die Konfigurationswerte in den Registrierungsschlüssel des Geräts HW, wie unten dargestellt:

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

Der UVC-Treiber liest die Konfigurationswerte aus dem Geräte-HW-Registrierungsschlüssel und konfiguriert das Gerät entsprechend auf dem Betriebssystem. Wenn die Firmware beispielsweise das Gerät angibt, das als Sensorkamera mit einem Konfigurationswert registriert werden soll, registriert der UVC-Treiber das Gerät direkt unter dieser Kategorie.

Das Konfigurieren von UVC-Geräten über den PLATTFORM-BOS-Deskriptor ist ein Mechanismus, der in Windows 10, Version 1703, aktiviert wurde, um UVC-Gerätehersteller bei der Konfiguration des Geräts zu unterstützen, ohne dass eine INF-Datei unter Windows erforderlich ist.

Das Konfigurieren von UVC-Geräten über benutzerdefinierte INF wird weiterhin unterstützt und hat Vorrang vor bos-deskriptorbasiertem Mechanismus. Beim Angeben von Geräteeigenschaften über INF müssen Sie das Präfix "UVC-" nicht hinzufügen. Dieses Präfix wird nur für Geräteeigenschaften benötigt, die über den BOS-Deskriptor angegeben werden und die pro Schnittstelle instance spezifisch sind. Wenn Ihr Gerät Benutzermodus-Plug-Ins wie DMFT benötigt, müssen Sie ein INF für die Installation des DMFT bereitstellen. Es kann nicht mit Firmware konfiguriert werden.

Derzeit unterstützte Konfigurationswerte über BOS-Deskriptor

Konfigurationsname Typ BESCHREIBUNG
SensorCameraMode REG_DWORD Registrieren Sie die Kamera unter einer bestimmten Kategorie.
UVC-FSSensorGroupID, UVC-FSSensorGroupName REG_SZ Gruppieren von Kameras mit demselben UVC-FSSensorGroupID
UVC-EnableDependentStillPinCapture REG_DWORD So aktivieren Sie die Still Capture-Methode 2/3
UVC-EnablePlatformDmft REG_DWORD So aktivieren Sie Plattform-DMFT

Wenn der UVC-Treiber die Registrierungswerte mit dem Präfix "UVC-" sieht, füllt er die Kategorieschnittstelle des Geräts instance Registrierungsschlüssels mit den gleichen Werten ohne präfix. Der Treiber übernimmt dies für jede Variable, die von der Firmware angegeben wird, nicht nur für die oben aufgeführten Variablen.

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

Damit das Betriebssystem die Bos Platform Device Capability und MS OS 2.0-Deskriptoren nutzen kann, muss der Gerätedeskriptor angeben, dass die bcdUSB-Version 0x0210 oder höher sein soll.

Zusammengesetztes Beispielgerät

Dieser Abschnitt enthält einen BOS-Deskriptor und einen MS OS 2.0-Deskriptor für ein zusammengesetztes Beispielgerät mit zwei Kamerafunktionen. Eine Funktion ist eine UVC-Farbkamera und die zweite Funktion eine UVC IR-Kamera.

Die Beispieldeskriptoren sind wie folgt:

  1. Registrieren Sie die Farbkamerafunktion unter KSCATEGORY_VIDEO_CAMERA

  2. Registrieren Sie die IR-Kamerafunktion unter KSCATEGORY_SENSOR_CAMERA

  3. Aktivieren der Farbkamerafunktion Standbilderfassung

  4. Ordnet die Farb- und IR-Kamerafunktionen als Gruppe zu

Bei der Geräteaufzählung ruft der USB-Stapel den BOS-Deskriptor vom Gerät ab. Der BOS-Deskriptor folgt eine plattformspezifische Gerätefunktion.

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

Die Beschreibung der BOS-Plattformfunktion gibt Folgendes an:

  1. GUID der MS OS 2.0-Deskriptorplattformfunktion

  2. Ein Anbietersteuerungscode bMS_VendorCode (hier ist auf 1 festgelegt. Es kann einen beliebigen Wert des Anbieters erforderlich sein, um die MS OS 2.0-Deskriptor abzurufen.

  3. Dieser BOS-Deskriptor gilt für Betriebssystemversionen Windows 10 und höher.

Nachdem der BOS-Deskriptor angezeigt wurde, stellt der USB-Stapel die herstellerspezifische Steuerungsanforderung aus, um den MS OS 2.0-Deskriptor abzurufen.

Format der Steuerelementanforderung zum Abrufen des herstellerspezifischen MS OS 2.0-Deskriptors:

bmRequestType BRequest wValue Windex wLength Daten
1100 0000 B bMS_VendorCode 0x00 0x07 Länge Zurückgegebenes MS OS 2.0-Descriptor-Set-Blob

bmRequestType

  • Datenübertragungsrichtung – Gerät zum Host

  • Typ – Anbieter

  • Empfänger – Gerät

bRequest

Der bMS_VendorCode Wert, der in der Informationsstruktur des Deskriptorsatzes zurückgegeben wird.

wValue

Legen Sie auf 0x00 fest.

Windex

0x7 für MS_OS_20_DESCRIPTOR_INDEX.

wLength

Länge des MS OS 2.0-Deskriptorsatzes, wie im BOS-Deskriptor zurückgegeben. 0x25C (604) in diesem Beispiel.

Es wird erwartet, dass das Gerät den MS OS 2.0-Deskriptor zurückgibt, wie er in USBVideoMSOS20DescriptorSet angegeben ist.

Das USBVideoMSOS20DescriptorSet beschreibt die Farb- und IR-Funktionen. Es gibt die folgenden MS OS 2.0-Deskriptorwerte an:

  1. Header festlegen

  2. Configuration Subset Header

  3. Color Camera Function Subset Header

  4. Registrierungswert-Featuredeskriptor für sensorgruppen-ID

  5. Registrierungswert-Featuredeskriptor für Den Namen der Sensorgruppe

  6. Registrierungswert-Featuredeskriptor zum Aktivieren der Standbilderfassung

  7. Registrierungswert-Featuredeskriptor zum Aktivieren von Plattform-DMFT

  8. IR Camera Function Subset Header

  9. Registrierungswert-Featuredeskriptor für sensorgruppen-ID

  10. Registrierungswert-Featuredeskriptor für Den Namen der Sensorgruppe

  11. Registrierungswert-Featuredeskriptor zum Registrieren der Kamera als Sensorkamera

Die Firmware verfügt über einen Handler für die Anbieteranforderung, der den folgenden MS OS 2.0-Deskriptor für das am Anfang dieses Abschnitts beschriebene imaginäre Gerät zurückgibt.

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