USB ビデオ クラス (UVC) カメラ実装ガイド

Windows 10 以降では、USB ビデオ クラス仕様 (バージョン 1.0 から 1.5) に準拠しているデバイス用の受信トレイ USB ビデオ クラス (UVC) ドライバーが提供されます。 このドライバーは、色とセンサーの種類のカメラをサポートしています。 このドキュメントでは、受信トレイ ドライバーを使用して、USB ビデオ クラス準拠のカメラの特定の機能をアプリケーションに公開する方法について説明します。

用語

キーワード 説明
UVC USB ビデオ クラス
UVC ドライバー OS に付属するUSBVideo.sys ドライバー
IR 赤外部
カラー カメラ カラー ストリームを出力するカメラ (RGB カメラや YUV カメラなど)
センサーカメラ 非カラー ストリームを出力するカメラ (IR や深度カメラなど)
BOS バイナリ デバイス オブジェクト ストア
MS OS 2.0 記述子 Microsoft プラットフォーム固有の BOS デバイス機能記述子

センサー カメラ

Windows では、カメラの 2 つのカテゴリがサポートされています。 1 つはカラー カメラで、もう 1 つは非カラー センサー カメラです。 RGB カメラまたは YUV カメラはカラー カメラとして分類され、グレースケール、IR、深度カメラなどの非カラー カメラはセンサー カメラとして分類されます。 UVC ドライバーは、両方の種類のカメラをサポートしています。 カメラ ファームウェアでは、UVC ドライバーがサポートされている 1 つまたは両方のカテゴリにカメラを登録するための値を指定することをお勧めします。

カラーのみのフォーマットタイプをサポートするカメラは、KSCATEGORY_VIDEO_CAMERAに登録する必要があります。 IR または深度のみの形式の種類をサポートするカメラは、KSCATEGORY_Standard Edition NSOR_CAMERAに登録する必要があります。 カラーフォーマットタイプと非カラーフォーマットタイプの両方をサポートするカメラは、KSCATEGORY_VIDEO_CAMERAとKSCATEGORY_SENSOR_CAMERAに登録する必要があります。 この分類は、アプリケーションが使用するカメラを選択するのに役立ちます。

UVC カメラは、次のセクションで詳しく説明する BOS MS OS 2.0 記述子で、属性 SensorCameraModeSkipCameraEnumeration を使用してそのカテゴリの基本設定を指定できます。

SensorCameraMode 属性は値 1 または 2 を受け取ります。

値 1 を指定すると、デバイスがKSCATEGORY_SENSOR_CAMERAに登録されます。 これに加えて、SkipCameraEnumeration に値 1 を指定して、センサー カメラのみを検索するアプリケーションでカメラを使用できるようにします。 センサー カメラメディアタイプのみを公開するカメラでは、この値を使用する必要があります。

SensorCameraMode の値が 2 の場合、デバイスは KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA に登録されます。 これにより、センサーとカラー カメラを探しているアプリケーションでカメラを使用できるようになります。 センサー カメラとカラー カメラメディアタイプの両方を公開するカメラでは、この値を使用する必要があります。

BOS 記述子を使用して、上記のメンションレジストリ値を指定することをお勧めします。 プラットフォーム固有の MS OS 2.0 記述子を持つサンプル BOS 記述子については、後述の複合デバイスの例セクションを参照してください。

上記のようにデバイス ファームウェアを更新できない場合は、カスタム INF を使用し、SensorCameraModeSkipCameraEnumeration の値を次のように指定して、カメラをセンサー カメラとして登録する必要があることを指定できます。

カスタム INF ファイル (受信トレイの UVC ドライバーに基づく) には、次の AddReg エントリを含める必要があります。

SensorCameraMode: REG_DWORD: 1 (センサー カメラとして登録する場合)

SkipCameraEnumeration: REG_DWORD: 1 (IR アプリケーションでのみ使用できるようにする)

カスタム INF セクションの例を次に示します。

[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

SensorCameraMode 属性と SkipCameraEnumeration 属性がファームウェアまたは INF で指定されていない場合、カメラはカラー カメラとして登録され、カラー カメラ対応アプリケーションにのみ表示されます。

IR ストリーム

Windows 受信トレイ USB ビデオ クラス (UVC) ドライバーは、YUV 形式でシーンをキャプチャし、非圧縮 YUV または圧縮された MJPEG フレームとして USB 経由でピクセル データを送信するカメラをサポートします。

WDK ksmedia.h ヘッダー ファイルで定義されているように、ストリーム ビデオフォーマット記述子では、次のフォーマットタイプ GUID を指定する必要があります。

説明
KSDATAFORMAT_SUBTYPE_L8_IR 非圧縮の 8 ビット luma プレーン。 この型はMFVideoFormat_L8にマップされます。
KSDATAFORMAT_SUBTYPE_L16_IR 非圧縮の 16 ビット luma プレーン。 この型はMFVideoFormat_L16にマップされます。
KSDATAFORMAT_SUBTYPE_MJPG_IR 圧縮された MJPEG フレーム。 Media Foundation はこれを NV12 非圧縮フレームに変換し、luma プレーンのみを使用します。

フレーム記述子の guidFormat フィールドにこれらの形式の種類の GUID を指定すると、Media Foundation キャプチャ パイプラインは、ストリームを IR ストリームとしてマークします。 Media Foundation FrameReader API で記述されたアプリケーションは、IR ストリームを使用できます。 IR ストリームのパイプラインでは、IR フレームのスケーリングや変換はサポートされていません。

IR 形式の種類を公開するストリームでは、RGB 形式または深度形式の種類を公開することはできません。

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

Note

IR ストリームは、DShow の通常のキャプチャ ストリームとして表示されます。

深度ストリーム

Windows 受信トレイ USB ビデオ クラス ドライバーは、深度ストリームを生成するカメラをサポートしています。 これらのカメラは、シーンの深度情報 (飛行時間など) をキャプチャし、深度マップを非圧縮 YUV フレームとして USB 経由で送信します。 WDK ksmedia.h ヘッダー ファイルで定義されているように、ストリーム ビデオフォーマット記述子では、次のフォーマットタイプ GUID を指定する必要があります。

説明
KSDATAFORMAT_SUBTYPE_D16 16 ビット深度マップ値。 この型は、MFVideoFormat_D16と同じです。 数値の単位はミリメートルです。

形式の種類 GUID がフレーム記述子の guidFormat メンバーで指定されている場合、Media Foundation キャプチャ パイプラインはストリームを深度ストリームとしてマークします。 FrameReader API で記述されたアプリケーションは、深度ストリームを使用できます。 深度ストリームのパイプラインでは、深度フレームのスケーリングや変換はサポートされていません。

深度形式の種類を公開するストリームでは、RGB 形式または 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;

Note

深度ストリームは、DShow の通常のキャプチャ ストリームとして表示されます。

カメラのグループ化

Windows では、アプリケーションが関連するカメラを操作できるように、コンテナー ID に基づくカメラのグループ化がサポートされています。 たとえば、同じ物理デバイスに存在する IR カメラとカラー カメラを、関連するカメラとして OS に公開できます。 これにより、Windows Hello などのアプリケーションでは、関連するカメラがシナリオに使用されます。

カメラ機能間の関係は、ファームウェアのカメラの BOS 記述子で指定できます。 UVC ドライバーはこの情報を利用し、これらのカメラ機能を関連として公開します。 これにより、OS カメラ スタックは、それらをカメラの関連グループとしてアプリケーションに公開します。

カメラ ファームウェアでは、UVC-FSSensorGroupID を指定する必要があります。これは、中かっこを含む文字列形式の GUID です。 同じ UVC-FSSensorGroupID を持つカメラがグループ化されます。

ファームウェアで UVC-FSSensorGroupName (Unicode 文字列) を指定することで、センサー グループに名前を付けることができます。

UVC-FSSensorGroupIDUVC-FSSensorGroupName を指定する BOS の例については、後述の「複合デバイスの例」セクションを参照してください。

上記のようにデバイスファームウェアを更新できない場合は、カスタム INF を使用し、センサー グループ ID と名前を次のように指定して、カメラがセンサー グループの一部であることを指定できます。 カスタム INF ファイル (受信トレイの UVC ドライバーに基づく) には、次の AddReg エントリを含める必要があります。

FSSensorGroupID: REG_SZ: "{your sensor group ID GUID}"

FSSensorGroupName: REG_SZ: "センサー グループのフレンドリ名"

カスタム 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,, FSSensorGroupID,0x00000000,%FSSensorGroupID%
HKR,, FSSensorGroupName,0x00000000,%FSSensorGroupName%

Note

センサー グループは、DShow キャプチャ パイプラインではサポートされていません。

メソッド 2 またはメソッド 3 静止キャプチャ サポート

UVC 仕様では、ビデオ ストリーミング インターフェイスが方法 1/2/3 タイプの静止画像キャプチャをサポートするかどうかを指定するメカニズムが提供されます。 OS がデバイスの方法 2/3 の静止画像キャプチャのサポートを利用できるようにするには、UVC ドライバーを使用して、デバイス ファームウェアで BOS 記述子の値を指定できます。

メソッド 2/3 の静止画像キャプチャを有効にするために指定する値は、UVC-EnableDependentStillPinCapture という名前の DWORD です。 BOS 記述子を使用してその値を指定します。 次の複合デバイス例は、BOS 記述子の例を使用して静止画像キャプチャを有効にする方法を示しています。

上記のようにデバイスのファームウェアを更新できない場合は、カスタム INF を使用して、カメラがメソッド 2 または方法 3 で静止キャプチャ メソッドをサポートすることを指定できます。

カスタム UVC ドライバーまたは受信トレイ UVC ドライバーに基づくカスタム INF ファイルには、次の AddReg エントリが含まれている必要があります。

EnableDependentStillPinCapture: REG_DWORD: 0x0 (無効) から0x1 (有効)

このエントリが有効 (0x1) に設定されている場合、キャプチャ パイプラインは、静止画像キャプチャに方法 2 を利用します (ファームウェアが UVC 1.5 仕様で指定されている方法 2/3 のサポートもアドバタイズすると仮定)。

カスタム 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,,EnableDependentStillPinCapture,0x00010001,0x00000001

デバイス MFT チェーニング

デバイス MFT は、Windows でカメラ機能を拡張するために、IHV および OEM に推奨されるユーザー モード プラグイン メカニズムです。

Windows 10 バージョン 1703 以前、カメラ パイプラインは 1 つの DMFT 拡張プラグインのみをサポートしていました。

Windows 10 バージョン 1703 以降、Windows カメラ パイプラインは、最大 2 つの DMFT を持つオプションの DMFT チェーンをサポートします。

Windows 11 バージョン 22H2 以降、Windows カメラ パイプラインは、最大 4 つの DMFT を持つオプションの DMFT チェーンをサポートします。

これにより、OEM と IHV は、カメラ ストリームの後処理の形式で付加価値を提供する柔軟性が向上します。 たとえば、デバイスは PDMFT を IHV DMFT および OEM DMFT とともに使用できます。

次の図は、DMFT のチェーンを含むアーキテクチャを示しています。

DMFT chain.

カメラ ドライバーから DevProxy へのサンプル フローをキャプチャし、DMFT チェーンを通過します。 チェーン内のすべての DMFT にはサンプルを処理する機会があります。 DMFT がサンプルを処理したくない場合は、サンプルを次の DMFT に渡すパス スルーとして機能できます。

KsProperty などの制御の場合、呼び出しはアップストリームに進みます。チェーン内の最後の DMFT が最初に呼び出しを受け取り、そこで呼び出しを処理するか、チェーン内の前の DMFT に渡すことができます。

エラーは DMFT から DTM に伝達され、その後アプリケーションに伝達されます。 IHV/OEM DMFT の場合、DMFT のいずれかがインスタンス化に失敗すると、DTM の致命的なエラーになります。

DMFT の要件:

  • DMFT の入力ピンの数は、前の DMFT の出力ピンの数と一致する必要があります。そうしないと、初期化中に DTM が失敗します。 ただし、同じ DMFT の入力ピンと出力ピンの数を一致させる必要はありません。

  • DMFT は、インターフェイス (IMFDeviceTransform、IMFShutdown、IMFRealTimeClientEx、IKsControl、IMFMediaEventGenerator) をサポートする必要があります。MFT0 が構成されているか、チェーン内の次の DMFT で IMFTransform のサポートが必要な場合は、IMFTransform をサポートする必要があります。

  • フレーム サーバーを使用しない 64 ビット システムでは、32 ビット DMFT と 64 ビット DMFT の両方を登録する必要があります。 USB カメラが任意のシステムに接続される可能性があることを考えると、「外部」(または非受信トレイ) の USB カメラの場合、USB カメラ ベンダーは 32 ビット DMFT と 64 ビット DMFT の両方を提供する必要があります。

DMFT チェーンの構成

カメラ デバイスは、オプションで受信トレイ USBVideo.INF のセクションを使用するカスタム INF ファイルを使用して、DLL 内の DMFT COM オブジェクトを提供できます。

カスタム .INF ファイルの「Interface AddReg」セクションで、次のレジストリ エントリを追加して DMFT CLSID を指定します。

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

次のサンプル INF 設定に示すように (%Dmft0.CLSID% と % Dmft1.CLSID% を DMFT に使用している実際の CLSID 文字列に置き換えます)、Windows 10 バージョン 1703 では、最大 2 つの CLSID が許可されます。最初の CLSID は DevProxy に最も近く、最後の CLSID はチェーンの最後の DMFT です。

プラットフォーム DMFT CLSID は {3D096DDE-8971-4AD5-98F9-C74F56492630} です。

CameraDeviceMftCLSIDChainの設定例です。

  • IHV/OEM DMFT またはプラットフォーム DMFT なし

    • CameraDeviceMftCLSIDChain = "" (またはこのレジストリ エントリを指定する必要はありません)
  • IHV/OEM DMFT

    • CameraDeviceMftCLSIDChain = %Dmft.CLSID%
  • プラットホーム DMFT <-> IHV/OEM DMFT

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

    • 以下は、プラットフォーム DMFT を使用した USB カメラとチェーン内の DMFT (GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7}) の結果レジストリ キーのスクリーン ショットです。

Registry editor DMFT chain.

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

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

Note

CameraDeviceMftCLSIDChainは、最大 2 つの CLSID を持つことができます。

カメラ CameraDeviceMftCLSIDChain が構成されている場合、レガシ CameraDeviceMftCLSID 設定は DTM によってスキップされます。

CameraDeviceMftCLSIDChain が構成されておらず、レガシ CameraDeviceMftCLSID が構成されている場合、チェーンは(USB カメラがプラットフォーム DMFT でサポートされており、プラットフォーム DMFT が有効になっている場合)DevProxy <–>プラットフォーム DMFT <–> OEM/IHV DMFT、または (カメラがプラットフォーム DMFT でサポートされていない場合、またはプラットフォーム DMFT が無効になっている場合) DevProxy <-> OEM/IHV DMFT のようになります。

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

Windows 10 バージョン 1703 以降、Windows はオプトインベースでプラットフォーム DMFT (PDMFT) と呼ばれる UVC カメラ用の受信トレイ デバイス MFT を提供します。 この DMFT を使用すると、IHV と OEM は、Windows で提供される後処理アルゴリズムを利用できます。

プラットフォーム DMFT によってサポートされている機能 Windows リリース
ROI 対応 USB カメラの 3A 調整に対して、顔ベースの関心領域 (ROI) を有効にします。 Windows 10 Version 1703

Note

カメラが UVC 1.5 ベースの ROI をサポートしていない場合、デバイスが PDMFT の使用をオプトインした場合でも、PDMFT は読み込まれません。

UVC カメラでは、BOS 記述子を介して EnablePlatformDmft を指定することで、プラットフォーム DMFT の使用をオプトインできます。

プラットフォーム DMFT を有効にするために指定する値は、名前が UVC-EnablePlatformDmft の DWORD であり、BOS 記述子を使用してその値を指定します。 以下の「複合デバイスの例」セクションでは、BOS 記述子の例を使用してプラットフォーム DMFT を有効にする方法を示します。

上記のようにデバイスファームウェアを更新できない場合は、カスタム INF ファイルを使用してデバイスのプラットフォーム DMFT を有効にすることができます。

カスタム UVC ドライバーまたは受信トレイ UVC ドライバーに基づくカスタム INF ファイルには、次の AddReg エントリが含まれている必要があります。

EnablePlatformDmft: REG_DWORD: 0x0 (無効) から0x1 (有効)

このエントリが有効 (0x1) に設定されている場合、キャプチャ パイプラインはデバイスの受信トレイ プラットフォーム DMFT を使用します。 次のスクリーンショットは、カスタム 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

Windows 10 バージョン 1703 では、デバイスが PDMFT の使用をオプトインした場合、PDMFT でサポートされているすべての機能が有効になります (デバイスの機能に基づく)。 PDMFT 機能の詳細な構成はサポートされていません。

Note

顔ベースの ROI 座標は、PDMFT に送信される画像の視野に対して計算されます。 ズーム、パン、ティルトDigital Window などのコントロールが原因でビューのフィールドが変更された場合、カメラは、現在のズーム/パン ウィンドウを考慮して、指定された 3A ROI 座標をセンサーの完全な視野にマッピングする役割を担います。

MS OS 記述子を使用した Face 認証プロファイル

Windows 10 RS5 では、Windows Hello をサポートするすべてのカメラに対して Face 認証プロファイル V2 要件が適用されるようになりました。 カスタム カメラ ドライバー スタックを備えた MIPI ベースのシステムの場合、このサポートは INF (または拡張 INF) またはユーザー モード プラグイン (デバイス MFT) を介して発行できます。

ただし、USB ビデオ デバイスの場合、UVC ベースのカメラでは、Windows 10 19H1 ではカスタム カメラ ドライバーが許可されないという制約があります。 すべての UVC ベースのカメラは受信トレイ USB ビデオ クラス ドライバーを使用する必要があり、ベンダーの拡張機能はデバイス MFT の形式で実装する必要があります。

多くの OEM/ODM の場合、カメラ モジュールの推奨されるアプローチは、モジュールのファームウェア内、つまり Microsoft OS 記述子を介して機能の多くを実装することです。

次のカメラは、MSOS 記述子 (BOS 記述子とも呼ばれます) を介して Face 認証プロファイルを発行するためにサポートされています。

  • 別の IR カメラを使用してセンサー グループで使用する RGB のみカメラ。

  • 別の RGB カメラを使用してセンサー グループで使用する IR のみカメラ。

  • 個別の IR ピンと RGB ピンを備えた RGB + IR カメラ。

Note

カメラ ファームウェアが上記の 3 つの要件のいずれかを満たすことができない場合、ODM/OEM は拡張 INF を使用してプロファイル V2 カメラ宣言する必要があります。

Microsoft OS 記述子レイアウトの例

次の仕様の例を以下に示します。

  • Microsoft OS 拡張記述子仕様 1.0

  • Microsoft OS 2.0 記述子仕様

Microsoft OS 拡張記述子 1.0 仕様

拡張プロパティ OS 記述子には、2 つのコンポーネントがあります。

  • 固定長のヘッダー セクション
  • ヘッダー セクションの後に続く 1 つ以上の可変長のカスタム プロパティ セクション

Microsoft OS 1.0 記述子ヘッダー セクション

ヘッダー セクションには、単一のカスタム プロパティ (Face 認証プロファイル) が記述されています。

オフセット フィールド サイズ (バイト) Value アクリルアミド
0 dwLength 4 <>
4 bcdVersion 2 0x0100 バージョン 1.0
6 wIndex 2 0x0005 拡張プロパティ OS 記述子
8 wCount 2 0x0001 1 つのカスタム プロパティ

Microsoft OS 1.0 記述子 カスタム プロパティ セクション

オフセット フィールド サイズ (バイト) Value アクリルアミド
0 dwSize 4 0x00000036 (54) このプロパティの合計サイズ (バイト単位)。
4 dwPropertyDataType 4 0x00000004 REG_DWORD_LITTLE_ENDIAN
8 wPropertyNameLength 2 0x00000024 (36) プロパティ名のサイズ (バイト単位)。
10 bPropertyName 36 UVC-CPV2FaceAuth Unicode の "UVC-CPV2FaceAuth" 文字列。
46 dwPropertyDataLength 4 0x00000004 プロパティ データの場合は 4 バイト (sizeof(DWORD))です。
50 bPropertyData 4 以下のデータ スキーマを参照してください 以下のデータ スキーマを参照してください。
ペイロード スキーマ

UVC-CPV2FaceAuth データ ペイロードは、32 ビット符号なし整数です。 上位 16 ビットは、RGB ピンによって公開されるメディア タイプ リストの 0 ベースのインデックスを表します。 下位 16 ビットは、IR ピンによって公開されるメディア タイプ リストの 0 ベースのインデックスを表します。

たとえば、RGB ピンから宣言された順序で、次のメディアの種類を公開する Type 3 カメラ。

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

IR のメディアの種類は次のとおりです。

  • L8、480x480@30fps

  • L8、480x480@15fps

  • L8、480x480@10fps

0x00010000のペイロード値により、次の Face 認証プロファイルが発行されます。

Pin0:(RES==1280,720;FRT==30,1;SUT==MJPG) // 2 番目のメディアの種類 (0x0001)
Pin1:(RES==480,480;FRT==30,1;SUT==L8) // 最初のメディアの種類 (0x0000)

Note

この執筆時点では、Windows Hello には RGB ストリームと IR ストリームの340x340@15fpsに対して 480x480@7.5fps の最小要件があります。 IHV/OEM は、Face 認証プロファイルを有効にするときに、この要件を満たすメディアの種類を選択する必要があります。

タイプ 1 カメラ サンプル

Type 1 カメラの場合、IR ピンがないため (Type 1 カメラがセンサー グループ内のコンピューター上の Type 2 カメラとペアリングされることを期待して)、RGB メディアタイプインデックスのみが公開されます。 IR メディア の種類のインデックスの場合、ペイロードの下位 16 ビット値を 0xFFFF に設定する必要があります。

たとえば、種類 1 カメラ次のメディアの種類の一覧が公開されている場合です。

  • YUY2, 640x480@30fps

  • MJPG, 1280x720@30fps

  • MJPG, 800x600@30fps

  • MJPG, 1920x1080@30fps

メディアの種類1280x720@30fps MJPG を使用して CPV2FaceAuth を発行するには、ペイロードを 0x0001FFFF に設定する必要があります。

タイプ 2 カメラ サンプル

タイプ 2 カメラの場合、上位 16 ビットを 0xFFFF に設定し、下位 16 ビットは使用する IR メディアの種類を示す必要があります。

たとえば、種類 2 のカメラで、次のメディアの種類があります。

  • L8、480x480@30fps

  • L8、480x480@15fps

  • L8、480x480@10fps

Face 認証に最初のメディアの種類を使用する場合、値は 0xFFFF0000 である必要があります。

Microsoft OS 拡張記述子 2.0 仕様

MSOS 拡張記述子 2.0 を使用して、Face認証プロファイルサポートを追加するためのレジストリ値を定義できます。 これは、Microsoft OS 2.0 レジストリ プロパティ記述子 を使用して行われます。

UVC-CPV2FaceAuth レジストリ エントリの場合、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)
}

UVC-CPV2FaceAuth レジストリ エントリが追加されると、UVC デバイスの DShow ブリッジ実装ガイダンスで説明されているように、デバイスは EnableDshowRedirection レジストリ エントリを発行する必要はありません。

ただし、デバイス ベンダーが以前のバージョンの Windows をサポートする必要がある場合や、フレーム サーバー内で MJPEG 展開を有効にする必要がある場合は、EnableDshowRedirection レジストリ エントリを追加する必要があります。

センサグループの生成

OEM が Windows Hello サポート用の RGB ストリームと IR ストリームの両方を提供するために Type 1 と Type 2 のカメラを使用してシステムを構築する場合、OEM は、2 つのカメラを合成センサー グループの一部として宣言する必要があります。

これを行うには、各カメラのデバイス インターフェイス プロパティの下に作成する拡張 INF で FSSensorGroupId タグと FSSensorGroupName タグを宣言します。

ただし、拡張機能 INF が指定されていない場合、ODM は同じ MSOS 記述子を使用して FSSensorGroupId と FSSensorGroupName の値を発行できます。 受信トレイ Windows 10 USB ビデオ クラス ドライバーは、ペイロード名のプレフィックスが "UVC-" になっている MSOS 記述子を自動的に取得し、タグをデバイス インターフェイス プロパティ ストアに移行します ("UVC-" プレフィックスを削除します)。

そのため、次を公開する Type 1 と Type 2 のカメラを使用すると、OS は Windows Hello で使用するためにカメラをマルチデバイス センサー グループに合成できます。

UVC-FSSensorGroupId
UVC-FSSensorGroupName

各タグのペイロードは Unicode 文字列である必要があります。 UVC-FSSensorGroupId ペイロードは、次の形式の GUID 文字列である必要があります。

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

GUID の値は、Type 1 と Type 2 のカメラの間で同じである必要があり、両方のカメラを同じ物理シャーシに追加する必要があります。 内蔵カメラの場合、物理シャーシはコンピューター自体です。 外部カメラの場合、Type 1 と Type 2 の両方のカメラ モジュールを、コンピューターに接続されている同じ物理デバイスに組み込む必要があります。

センサー グループのカスタム デバイス インターフェイス カテゴリ

19H1 以降、Windows では、合成されたセンサー グループをカスタムまたは定義済みのカテゴリに公開できるように、IHV/OEM で指定された拡張メカニズムが提供されています。 センサー グループの生成は、カスタム INF でセンサー グループ ID キーを提供する IHV/OEM によって定義されます。

FSSensorGroupId: {Custom GUID}
FSSensorGroupName: <センサー グループに使用されるフレンドリ名>

INF の上記の 2 つの AddReg エントリに加えて、カスタム カテゴリに対して新しい AddReg エントリが定義されています。

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

複数のカテゴリは、セミコロン (;)区切り GUID リスト) を使用して定義されます。

一致する FSSensorGroupId を宣言する各デバイスは、同じ FSSensorGroupCategoryList を宣言する必要があります。 リストが一致しない場合、すべてのリストは無視され、センサー グループは既定でカスタム カテゴリが定義されていないかのようにKSCATEGORY_SENSOR_GROUPに発行されます。

カメラ回転

カメラ デバイスの向きを参照

UVC コントロール キャッシュ

UVC コントロール キャッシュを参照

BOS および MS OS 2.0 記述子

UVC 準拠カメラでは、Microsoft OS 2.0 記述子を使用して、ファームウェアのプラットフォーム機能 BOS 記述子で Windows 固有のデバイス構成値を指定できます。 デバイス構成を OS に伝達する有効な BOS 記述子を指定する方法については、MS OS 2.0 記述子のドキュメントを参照してください。

Microsoft OS 2.0 記述子セット ヘッダー

オフセット フィールド サイズ (バイト) 説明
0 wLength 2 このヘッダーの長さ (バイト単位) は 10 である必要があります。
2 wDescriptorType 2 MSOS20_SET_HEADER_DESCRIPTOR
4 dwWindowsVersion 4 Windows バージョン。
8 wTotalLength 2 このヘッダー サイズを含む MS OS 2.0 記述子セット全体のサイズ。

Microsoft OS 2.0 レジストリ プロパティ記述子

オフセット フィールド サイズ (バイト) 説明
0 wLength 2 この記述子の長さ (バイト単位)
2 wDescriptorType 2 MS_OS_20_FEATURE_REG_PROPERTY
4 wPropertyDataType 2 0x04 (REG_DWORD_LITTLE_ENDIAN)
6 wPropertyNameLength 2 プロパティ名の長さ。
8 PropertyName 変数 レジストリ プロパティの名前。
8+M wPropertyDataLength 2 プロパティのデータの長さ。
10+M PropertyData 変数 Property Data

ファームウェアで有効な MS OS 2.0 記述子が指定されている場合、USB スタックは、次に示すデバイス HW レジストリ キーに構成値をコピーします。

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

UVC ドライバーは、デバイス HW レジストリ キーから構成値を読み取り、それに応じて OS 上のデバイスを構成します。 たとえば、ファームウェアが構成値を使用してセンサー カメラとして登録するデバイスを指定した場合、UVC ドライバーはそのカテゴリのすぐ下にデバイスを登録します。

プラットフォーム BOS 記述子を使用した UVC デバイスの構成は、Windows OS 上の INF ファイルを必要とせずに UVC デバイス ベンダーがデバイスを構成できるように、Windows 10 バージョン 1703 で有効にされたメカニズムです。

カスタム INF を使用した UVC デバイスの構成は引き続きサポートされており、BOS 記述子ベースのメカニズムよりも優先されます。 INF を使用してデバイスのプロパティを指定するときに、プレフィックス "UVC-" を追加する必要はありません。 このプレフィックスは、BOS 記述子を介して指定され、インターフェイス インスタンス固有のデバイス プロパティにのみ必要です。 デバイスに DMFT などのユーザー モード プラグインが必要な場合は、DMFT をインストールするための INF を指定する必要があります。 ファームウェアを使用して構成することはできません。

BOS 記述子を介して現在サポートされている構成値

構成名 説明
SensorCameraMode REG_DWORD 特定のカテゴリにカメラを登録します。
UVC-FSSensorGroupID、UVC-FSSensorGroupName REG_SZ 同じ UVC-FSSensorGroupID を持つカメラをグループ化する
UVC-EnableDependentStillPinCapture REG_DWORD 静止キャプチャ メソッド 2/3を有効にするには
UVC-EnablePlatformDmft REG_DWORD プラットフォーム DMFT を有効にするには

UVC ドライバーは、プレフィックス "UVC-" を持つレジストリ値を確認すると、プレフィックスのない同じ値を使用して、デバイスのカテゴリ インターフェイス インスタンス レジストリ キーを設定します。 ドライバーは、上記の変数だけでなく、ファームウェアによって指定された任意の変数に対してこれを行います。

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

OS で BOS プラットフォーム デバイス機能と MS OS 2.0 記述子を使用するには、デバイス記述子で bcdUSB バージョンを0x0210以上に指定する必要があります。

複合デバイスの例

このセクションでは、2 つのカメラ機能を備えた複合デバイスの例に対して、BOS 記述子と MS OS 2.0 記述子を提供します。 1つの機能はUVCカラーカメラで、2つ目の機能はUVC IRカメラです。

サンプル記述子は次のとおりです。

  1. カラーカメラ機能をKSCATEGORY_VIDEO_CAMERAに登録する

  2. KSCATEGORY_STANDARD EDITION NSOR_CAMERAで IR カメラ機能を登録する

  3. カラーカメラ機能の静止画像キャプチャを有効にする

  4. 色と IR カメラの機能をグループとして関連付ける

デバイスの列挙時に、USB スタックはデバイスから BOS 記述子を取得します。 BOS 記述子の後には、プラットフォーム固有のデバイス機能があります。

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

BOS プラットフォーム機能記述子は、以下を指定します。

  1. MS OS 2.0 記述子プラットフォーム機能 GUID

  2. ベンダーコントロールコードbMS_VendorCode(ここでは1に設定されています。MS OS 2.0 記述子を取得するには、ベンダーが好む任意の値を使用できます。

  3. この BOS 記述子は、OS バージョン Windows 10 以降に適用できます。

BOS 記述子が表示された後、USB スタックはベンダー固有の制御要求を発行して MS OS 2.0 記述子を取得します。

MS OS 2.0 ベンダー固有の記述子を取得するための制御要求の形式:

bmRequestType BRequest wValue WIndex wLength データ​​
1100 0000B bMS_VendorCode 0x00 0x07 Length 返された MS OS 2.0 記述子セット BLOB

bmRequestType

  • データ転送の方向 - デバイスからホスト

  • 種類 – ベンダー

  • 受信者 - デバイス

bRequest

記述子セット情報構造体で返されるbMS_VendorCode値。

wValue

0x00 に設定されます。

wIndex

MS_OS_20_DESCRIPTOR_INDEXの0x7。

wLength

BOS 記述子で返される MS OS 2.0 記述子セットの長さ。 この例では0x25C (604) です。

デバイスは、USBVideoMSOS20DescriptorSet で指定された記述子と同様に、MS OS 2.0 記述子を返す必要があります。

USBVideoMSOS20DescriptorSet は、色と IR 関数について説明します。 次の MS OS 2.0 記述子値を指定します。

  1. Set Header

  2. 構成サブセット ヘッダー

  3. 色カメラ関数のサブセット ヘッダー

  4. センサー グループ ID のレジストリ値機能記述子

  5. センサー グループ名 ID のレジストリ値機能記述子

  6. 静止画像キャプチャを有効にするためのレジストリ値機能記述子

  7. プラットフォーム DMFT を有効にするためのレジストリ値機能記述子

  8. IR カメラ関数のサブセット ヘッダー

  9. センサー グループ ID のレジストリ値機能記述子

  10. センサー グループ名 ID のレジストリ値機能記述子

  11. カメラをセンサー カメラとして登録するためのレジストリ値機能記述子

ファームウェアには、このセクションの冒頭で説明した架空のデバイスの次の MS OS 2.0 記述子を返すベンダー要求のハンドラーがあります。

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