USB 視訊類別 (UVC) 相機實作指南
從 Windows 10 開始,系統會為符合 USB 視訊類別規格的裝置提供收件匣 USB 視訊類別 (UVC) 驅動程式, (1.0 到 1.5 版) 。 此驅動程式支援色彩和感測器類型相機。 本檔概述如何透過收件匣驅動程式向應用程式公開符合UVC規範相機的特定功能。
術語
關鍵字 | 描述 |
---|---|
UVC | USB 視訊類別 |
UVC 驅動程式 | USBVideo.sys 操作系統隨附的驅動程式 |
IR | 紅外線 |
彩色相機 | 輸出色彩串流 (的相機,例如 RGB 或 YUV 相機) |
感測器相機 | (輸出非色彩數據流的相機,例如 IR 或深度相機) |
BOS | 二進位裝置物件存放區 |
MS OS 2.0 描述項 | Microsoft 平臺特定的 BOS 裝置功能描述元 |
感測器相機
Windows 支援兩種相機類別。 其中一個是色彩相機,另一個是非色彩感測器相機。 RGB 或 YUV 相機會分類為色彩相機,以及灰階、IR 和深度相機等非色彩相機分類為感測器相機。 UVC 驅動程式支援這兩種類型的相機。 我們建議相機韌體指定一個值,根據UVC驅動程式會在一或兩個支援的類別下註冊相機。
支援僅限色彩格式類型的相機應該在 KSCATEGORY_VIDEO_CAMERA 下註冊。 支援 IR 或僅限深度格式類型的相機應該在 KSCATEGORY_SENSOR_CAMERA 下註冊。 支援色彩和非色彩格式類型的相機應該在KSCATEGORY_VIDEO_CAMERA和KSCATEGORY_SENSOR_CAMERA下註冊。 此分類可協助應用程式選取他們想要使用的相機。
UVC 相機可以透過屬性 、SensorCameraMode 和 SkipCameraEnumeration,在其 BOS MS OS 2.0 描述元 中詳述於下列各節中指定其類別喜好設定。
SensorCameraMode 屬性會接受值 1 或 2。
值為 1 會在 KSCATEGORY_SENSOR_CAMERA 下註冊裝置。 此外,請針對 SkipCameraEnumeration 指定1的值,讓相機可供只尋找感測器相機的應用程式使用。 只公開感測器相機媒體類型的相機應該使用此值。
SensorCameraMode 的值為 2,將會在 [KSCATEGORY_SENSOR_CAMERA & KSCATEGORY_VIDEO_CAMERA] 下註冊裝置。 這讓相機可供尋找感測器和色彩相機的應用程式使用。 公開感測器相機和色彩相機媒體類型的相機應該使用此值。
建議您使用 BOS 描述元來指定上述登錄值。 請參閱下面的 範例複合裝置 一節,以取得具有平臺特定 MS OS 2.0 描述元的範例 BOS 描述元。
如果您如前所述無法更新裝置韌體,您可以使用自定義 INF,並指定您的相機必須註冊為感測器相機,方法是指定 SensorCameraMode 和 SkipCameraEnumeration 的值,如下所示:
根據收件匣 UVC 驅動程式) 的自訂 INF 檔案 (必須包含下列 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
如果未在韌體或 INF 中指定 SensorCameraMode 和 SkipCameraEnumeration 屬性,則相機會註冊為色彩相機,而且只會對色彩相機感知應用程序顯示。
IR 數據流
Windows 收件匣 USB 視訊類別 (UVC) 驅動程式支持相機,以 YUV 格式擷取場景,並以未壓縮的 YUV 或壓縮的 MJPEG 畫面形式透過 USB 傳輸圖元數據。
資料流視訊格式描述元中應指定下列格式類型 GUID,如 WDK ksmedia.h 頭檔中所定義:
類型 | Description |
---|---|
KSDATAFORMAT_SUBTYPE_L8_IR | 未壓縮的8位luma平面。 此類型會對應至 MFVideoFormat_L8。 |
KSDATAFORMAT_SUBTYPE_L16_IR | 未壓縮的16位luma平面。 此類型會對應至 MFVideoFormat_L16。 |
KSDATAFORMAT_SUBTYPE_MJPG_IR | 壓縮的 MJPEG 框架。 媒體基礎會將這轉換成 NV12 未壓縮的畫面格,並且只使用 luma 平面。 |
當這些格式類型 GUID 指定於框架描述元的 guidFormat 字段中時,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;
注意
IR 數據流會顯示為 DShow 中的一般擷取數據流。
深度數據流
Windows 收件匣 USB 視訊類別驅動程式支援產生深度數據流的相機。 這些相機會擷取 (例如,場景的飛行時間) ,並透過USB將深度地圖傳輸為未壓縮的YUV畫面。 資料流視訊格式描述元中應指定下列格式類型 GUID,如 WDK ksmedia.h 頭檔中所定義:
類型 | Description |
---|---|
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;
注意
深度數據流會顯示為 DShow 中的一般擷取數據流。
群組相機
Windows 支援根據其容器標識碼分組相機,協助應用程式使用相關的相機。 例如,IR 相機和相同實體裝置上的色彩相機可以公開給 OS 做為相關相機。 這可讓 Windows Hello 這類應用程式在其案例中使用相關的相機。
相機函式之間的關聯可以在相機的 BOS 描述元的韌體中指定。 UVC 驅動程式會利用這項資訊,並以相關方式公開這些相機功能。 這可讓OS相機堆疊將它們公開為應用程式的相關相機群組。
相機韌體必須指定 UVC-FSSensorGroupID,這是具有大括號的字串格式 GUID。 具有相同 UVC-FSSensorGroupID 的相機將會群組在一起。
感測器群組可以在韌體中指定 UVC-FSSensorGroupName、Unicode字串來指定名稱。
請參閱下面的範例複合裝置一節,以取得指定 UVC-FSSensorGroupID 和 UVC-FSSensorGroupName的示範範例 BOS。
如果您如前所述無法更新裝置韌體,您可以使用自定義 INF,並指定相機是感測器群組的一部分,方法是指定感測器群組標識符和名稱,如下所示。 根據收件匣 UVC 驅動程式) 自訂 INF 檔案 (必須包含下列 AddReg 專案:
FSSensorGroupID:REG_SZ:“{您的感測器群組標識符 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%
注意
DShow 擷取管線不支援感測器群組。
方法 2 或方法 3 仍然擷取支援
UVC 規格確實提供機制,以指定視訊串流介面是否支援方法 1/2/3 類型仍擷取影像。 若要讓OS利用裝置的方法 2/3 仍可擷取映像支援,透過UVC驅動程式,裝置韌體可以在BOS描述元中指定值。
要指定啟用方法 2/3 的值為 DWORD,名為 UVC-EnableDependentStillPinCapture。 使用 BOS 描述元指定其值。 下列 範例複合裝置 說明使用範例 BOS 描述元啟用仍然影像擷取。
如果您無法如上所述更新裝置韌體,您可以使用自定義 INF 來指定您的相機支援方法 2 或方法 3 仍擷取方法。
根據自訂 UVC 驅動程式或收件匣 UVC 驅動程式 (自定義 INF 檔案) 必須包含下列 AddReg 專案:
EnableDependentStillPinCapture: REG_DWORD: 0x0 (Disabled) 0x1 (Enabled)
當這個項目設定為 Enabled (0x1) 時,擷取管線會利用方法 2/3 作為仍然影像擷取 (假設韌體也會公告 UVC 規格所指定之方法 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 是 IHD 和 OEM 的建議使用者模式外掛程式機制,可擴充 Windows 上的相機功能。
在 Windows 10 1703 版之前,相機管線僅支援一個 DMFT 擴充功能外掛程式。
從 1703 版 Windows 10 開始,Windows 相機管線支援最多兩個 DMFT 的選擇性 DMFT 鏈結。
從 22H2 版 Windows 11 開始,Windows 相機管線支援最多四個 DMFT 的選擇性 DMFT 鏈結。
這可為 OEM 和 IHD 提供更大的彈性,以後置處理相機串流的形式提供增值。 例如,裝置可以使用 PDMFT 以及 IHV DMFT 和 OEM DMFT。
下圖說明涉及 DMFT 鏈結的架構。
擷取範例會從相機驅動程式流向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。
在不使用 Frame Server 的 64 位系統上,必須註冊 32 位和 64 位 DMFT。 假設USB相機可能會插入任意系統,例如「外部」 (或非收件匣) USB相機,USB相機廠商應該同時提供32位和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,而第一個字符串最接近 DevProxy,最後一個字符串則是鏈結中最後一個 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%
以下是 USB 相機的結果登錄機螢幕快照,其中具有平臺 DMFT 和 GUID {D671BE6C-FDB8-424F-81D7-03F5B1CE2CC7}) 鏈結中的 DM (FT。
IHV/OEM DMFT0 <-> IHV/OEM DMFT1
- CameraDeviceMftCLSIDChain = %Dmft0.CLSID%%Dmft1.CLSID%
注意
CameraDeviceMftCLSIDChain 最多可以有 2 個 CLID。
如果已設定 CameraDeviceMftCLSIDChain,DTM 會略過舊版 CameraDeviceMftCLSID 設定。
如果未設定 CameraDeviceMftCLSIDChain,且已設定舊版 CameraDeviceMftCLSID, 接著,如果平臺 DMFT 和 Platform DMFT 所支援的 USB 相機和平臺 DMFT 已啟用,則鏈結看起來會像 () DevProxy –> Platform DMFT <–> OEM/IHV DMFT 或 (如果 Platform DMFT 或 Platform 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
從 1703 版 Windows 10 開始,Windows 會提供適用於 UVC 相機的收件匣裝置 MFT,稱為平臺 DMFT (PDMFT) 。 此 DMFT 可讓 IHV 和 OEM 利用 Windows 提供的後置處理演算法。
Platform DMFT 支援的功能 | Windows 版本 |
---|---|
針對支援ROI的USB相機中的3A調整,啟用臉部相關區域 (ROI) 。 | Windows 10 (版本 1703) |
注意
如果相機不支援以UVC 1.5為基礎的ROI,則即使裝置選擇使用 PDMFT,PDMFT 也不會載入。
UVC 相機可以透過 BOS 描述元指定 EnablePlatformDmft 來選擇使用平臺 DMFT。
要指定以啟用 Platform DMFT 的值是名稱為 UVC-EnablePlatformDmft 的 DWORD,並使用 BOS 描述元指定其值。 下列 範例複合裝置 一節說明如何啟用平臺 DMFT,並包含範例 BOS 描述元。
如果您無法如上所述更新裝置韌體,您可以使用自定義 INF 檔案來啟用裝置的平臺 DMFT。
根據自訂 UVC 驅動程式或收件匣 UVC 驅動程式 (自定義 INF 檔案) 必須包含下列 AddReg 專案:
EnablePlatformDmft: REG_DWORD: 0x0 (Disabled) 0x1 (Enabled)
當這個項目設定為 [已啟用] (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 中,如果裝置選擇使用 PDM (FT,則會根據裝置功能) 啟用 PDMFT 支援的所有功能。 不支援 PDMFT 功能的細微設定。
注意
臉部型 ROI 座標是相對於傳輸至 PDMFT 之影像的檢視字段計算。 如果因為使用 Zoom、Pan 或 Tilt 或Digital Window 之類的控件而修改了檢視欄位,則相機會負責將提供的座標對應回感測器的完整檢視字段,考慮目前的縮放/移動瀏覽視窗。
透過 MS OS 描述元的臉部驗證配置檔
Windows 10 RS5 現在會針對支援 Windows Hello 的任何相機強制執行臉部驗證配置檔 V2 需求。 針對具有自定義相機驅動程式堆疊的 MIPI 型系統,此支援可以透過 INF (或擴充功能 INF) 或透過使用者模式外掛程式 (Device MFT) 發佈。
不過,針對 USB 視訊裝置,以 UVC 為基礎的相機條件約束是針對 Windows 10 19H1,不允許自定義相機驅動程式。 所有UVC型相機都必須使用收件匣USB視訊類別驅動程式,而且任何廠商擴充功能都必須以裝置MFT的形式實作。
對於許多 OEM/ODM,相機模組的慣用方法是實作模組韌體內的大部分功能,也就是透過 Microsoft OS 描述元。
透過 MSOS 描述元 (也稱為 BOS 描述元) ,支援下列相機發佈臉部驗證配置檔:
只有 RGB 相機才能用於具有個別 IR 相機的感測器群組中。
只有 IR 相機才能用於具有個別 RGB 相機的感測器群組中。
具有個別 IR 和 RGB 針腳的 RGB+IR 相機。
注意
如果相機韌體不符合上述三個需求之一,ODM/OEM 必須使用擴充功能 INF 來宣告相機配置檔 V2。
範例 Microsoft OS 描述元版面配置
下列規格包含下列範例:
Microsoft OS 擴充描述項規格 1.0
Microsoft OS 2.0 描述項規格
Microsoft OS 擴充描述元 1.0 規格
擴充屬性OS描述元有兩個元件
- 固定長度標頭區段
- 一或多個可變長度自定義屬性區段,其遵循標頭區段
Microsoft OS 1.0 描述項標頭區段
標頭區段描述臉部驗證配置檔) (單一自定義屬性。
Offset | 欄位 | 大小 (位元組) | 值 | 描述 |
---|---|---|---|---|
0 | dwLength | 4 | <> | |
4 | bcdVersion | 2 | 0x0100 | 版本 1.0 |
6 | wIndex | 2 | 0x0005 | 擴充屬性OS描述項 |
8 | wCount | 2 | 0x0001 | 一個自定義屬性 |
Microsoft OS 1.0 描述項自定義屬性區段
Offset | 欄位 | 大小 (位元組) | 值 | 描述 |
---|---|---|---|---|
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 | 屬性數據 (sizeof (DWORD) ) 的 4 個字節。 |
50 | bPropertyData | 4 | 請參閱下方的數據架構 | 請參閱下方的數據架構。 |
承載結構描述
UVC-CPV2FaceAuth 數據承載是32位無符號整數。 高階 16 位代表 RGB 針腳所公開之媒體類型清單的 0 索引。 低順序 16 位代表 IR 針腳所公開之媒體類型清單的 0 型索引。
例如,以從 RGB 針腳宣告的順序公開下列媒體類型的類型 3 相機:
YUY2,640x480@30fps
MJPG,1280x720@30fps
MJPG,800x600@30fps
MJPG,1920x1080@30fps
IR 的下列媒體類型:
L8、480x480@30fps
L8,480x480@15fps
L8、480x480@10fps
0x00010000的承載值會導致發佈下列臉部驗證配置檔:
Pin0: (RES==1280,720;FRT==30,1;SUT==MJPG) - 第二個媒體類型 (0x0001)
Pin1: (RES==480,480;FRT==30,1;SUT==L8) - 第一個媒體類型 (0x0000)
注意
在撰寫本文時,Windows Hello RGB 數據流480x480@7.5fps 的最低需求,以及 IR 數據流的340x340@15fps。 啟用臉部驗證配置檔時,需要 IHV/OEM 才能選取符合此需求的媒體類型。
類型 1 相機範例
對於類型 1 相機,由於沒有 IR 針腳 (,因此預期類型 1 相機會與感測器群組) 電腦上的 Type 2 Camera 配對,因此只會發佈 RGB 媒體類型索引。 針對 IR 媒體類型索引,承載的低順序 16 位值必須設定為0xFFFF。
例如,如果類型 1 相機公開了下列媒體類型清單:
YUY2,640x480@30fps
MJPG,1280x720@30fps
MJPG,800x600@30fps
MJPG,1920x1080@30fps
若要使用 MJPG 發佈 CPV2FaceAuth,1280x720@30fps媒體類型,承載必須設定為 0x0001FFFF。
類型 2 相機範例
對於類型 2 相機,高階 16 位必須設定為 0xFFFF,低階 16 位表示要使用的 IR 媒體類型。
例如,針對具有下列媒體類型的類型 2 相機:
L8、480x480@30fps
L8,480x480@15fps
L8、480x480@10fps
如果第一個媒體類型用於臉部驗證,此值必須是:0xFFFF0000。
Microsoft OS 擴充描述元 2.0 規格
MSOS 擴充描述元 2.0 可用來定義登錄值,以新增臉部驗證配置檔支援。 這是使用 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 登錄專案時,裝置不需要發佈 EnableDshowRedirection 登錄專案,如 UVC 裝置的 DShow Bridge 實作指引中所述。
不過,如果裝置廠商必須支援舊版的 Windows 和/或需要在 Frame Server 內啟用 MJPEG 解壓縮,則必須新增 EnableDshowRedirection 登錄專案。
感測器群組產生
當 OEM 使用類型 1 和類型 2 相機來建置系統,以提供 RGB 和 IR 串流給 Windows Hello 支援時,OEM 必須將這兩部相機宣告為合成感測器群組的一部分。
做法是在延伸模組 INF 中宣告 FSSensorGroupId 和 FSSensorGroupName 標籤,以在每個相機的裝置介面屬性下建立。
不過,如果未提供擴充功能 INF,ODM 可能會使用相同的 MSOS 描述元來發佈 FSSensorGroupId 和 FSSensorGroupName 值。 收件匣 Windows 10 USB 視訊類別驅動程式會自動採用承載名稱前面加上 “UVC-” 的任何 MSOS 描述元,並將標記移轉至裝置介面屬性存放區, (移除 “UVC-” 前置詞) 。
因此,發佈下列專案的 Type 1 和 Type 2 Camera 可讓 OS 將相機合成為多裝置感測器群組,以便與 Windows Hello 搭配使用:
UVC-FSSensorGroupId
UVC-FSSensorGroupName
每個標記的承載必須是 Unicode 字串。 UVC-FSSensorGroupId 承載必須是下列格式的 GUID 字串:
{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX}
在類型 1 和類型 2 相機之間,GUID 的值必須相同,而且兩部相機都必須新增至相同的實體底座。 針對內建相機,實體底座是計算機本身。 針對外部相機,類型 1 和類型 2 相機模組都必須內建到連線到電腦的相同實體裝置中。
感測器群組的自定義裝置介面類別
從 19H1 開始,Windows 提供 IHV/OEM 指定的擴充機制,以允許將合成感測器群組發佈至任何自定義或預先定義的類別。 產生感測器群組是由 IHV/OEM 所定義,提供自定義 INF 中的感測器群組識別碼金鑰:
FSSensorGroupId: {Custom GUID}
FSSensorGroupName: <用於感測器群組的易記名稱>
除了 INF 中的兩個上述 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 特定裝置組態值。 請參閱 MS OS 2.0 描述元上的檔,以瞭解如何指定有效的 BOS 描述元,以將裝置設定傳達給 OS。
Microsoft OS 2.0 描述項集標頭
Offset | 欄位 | 大小 (位元組) | 描述 |
---|---|---|---|
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 Registry 屬性描述項
Offset | 欄位 | 大小 (位元組) | 描述 |
---|---|---|---|
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 | 變數 | 屬性數據 |
在韌體中指定有效的 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 10 版本 1703 中啟用的機制,可協助 UVC 裝置廠商設定裝置,而不需要 Windows OS 上的 INF 檔案。
仍支援透過自定義 INF 設定 UVC 裝置,且其優先順序高於以 BOS 描述項為基礎的機制。 透過 INF 指定裝置屬性時,您不需要新增前置詞 「UVC-」。 只有透過 BOS 描述元指定的裝置屬性,以及每個介面實例特定的裝置屬性,才需要此前置詞。 如果您的裝置需要 DMFT 之類的使用者模式外掛程式,則需要提供 INF 來安裝 DMFT。 無法使用韌體來設定。
目前透過 BOS 描述元支援的組態值
組態名稱 | 類型 | Description |
---|---|---|
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 描述項,裝置描述元必須指定要0x0210或更新版本的 bcdUSB 版本。
複合裝置範例
本節提供 BOS 描述元和 MS OS 2.0 描述元,以取得具有兩個相機功能的複合裝置範例。 其中一個函式是UVC色彩相機,第二個函式是UVC IR相機。
範例描述項如下所示:
在 KSCATEGORY_VIDEO_CAMERA 下註冊色彩相機函式
在 KSCATEGORY_SENSOR_CAMERA 下註冊 IR 相機函式
啟用色彩相機函式仍擷取影像
將色彩和 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 平臺功能描述元指定:
MS OS 2.0 描述元平臺功能 GUID
廠商控制項程式代碼bMS_VendorCode (设定为 1。廠商可能需要任何值,) 擷取 MS OS 2.0 描述元。
此 BOS 描述元適用於作業系統版本 Windows 10 和更新版本。
在看到 BOS 描述元之後,USB 堆疊會發出廠商特定的控制要求,以擷取 MS OS 2.0 描述元。
擷取 MS OS 2.0 廠商特定描述元的控制項要求格式:
bmRequestType | BRequest | wValue | WIndex | wLength | 資料 |
---|---|---|---|---|---|
1100 0000B | bMS_VendorCode | 0x00 | 0x07 | 長度 | 傳回的 MS OS 2.0 描述元集 Blob |
bmRequestType
數據傳輸方向 – 裝置到主機
類型 – 廠商
收件者 - 裝置
bRequest
描述項集合信息結構中傳回 的bMS_VendorCode 值。
wValue
設定為 0x00。
wIndex
MS_OS_20_DESCRIPTOR_INDEX的 0x7。
wLength
MS OS 2.0 描述元集的長度,如 BOS 描述元中所傳回。 在此範例中,0x25C (604) 。
裝置預期會傳回 MS OS 2.0 描述項,例如 USBVideoMSOS20DescriptorSet 中指定的描述元。
USBVideoMSOS20DescriptorSet 描述色彩和 IR 函式。 它會指定下列 MS OS 2.0 描述項目值:
設定標頭
設定子集標頭
色彩相機函式子集標頭
感測器群組標識碼的登錄值功能描述元
感測器組名的登錄值功能描述元
啟用仍然映像擷取的登錄值功能描述元
啟用平臺 DMFT 的登錄值功能描述元
IR 數位相機函式子集標頭
感測器群組標識碼的登錄值功能描述元
感測器組名的登錄值功能描述元
登錄值功能描述元,用於將相機註冊為感測器相機
韌體將會有廠商要求的處理程式,此要求會針對本節開頭所述的虛構裝置傳回下列 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
};