1 概覽
1.1 總結
在 USB 視訊類別規格中,Microsoft 的擴充功能能夠啟用新的控制項,並具備以標準格式攜帶明確定義的影像中繼資料的能力。
1.2 架構決策
USB 視訊類別 (UVC) 畫面中繼資料支援適用於 ISOCH 和 BULK 端點。 不過,在 BULK 端點的情況下,中繼資料大小限制為 240 位元組 (因為所有視訊畫面資料都會在 BULK 端點上的單一視訊畫面封包中傳輸)。
UVC 中繼資料支援僅適用於以框架為基礎的承載。
UVC 中繼資料支援只能透過媒體基礎架構(MF)擷取流程取得。
UVC 中繼資料需要用戶自行選擇加入。 每個需要中繼資料支援的 IHV/OEM 都必須透過客製化 INF 檔案來啟用。
UVC 中繼資料僅支援系統配置的記憶體。 不支援 VRAM 或 DX 表面。
2 架構概述
2.1 說明
2.2.1 透過 INF 探索功能
2.2.1.1 靜態影像擷取 – 方法 2
某些現有的 UVC 裝置可能不支援 UVC 1.5 類別 specification.pdf 第 2.4.2.4 節 (靜態影像擷取) 中所述的方法 2,可在 USB 視訊類別規格 網站上下載。
在 Windows 10 版本 1607 和更早的版本中,即使裝置根據 UVC 1.5 規格顯示其支援方法 2,擷取管線仍然不會使用該方法。
在 Windows 10 版本 1703 中,使用此方法的裝置必須針對相機驅動程式使用自定義 INF 檔案,但指定的硬體需要自定義 INF,才能啟用方法 2 靜止影像擷取) 。
附註: 相機驅動程式可以以 Windows USBVIDEO.SYS為基礎,也可以以自訂驅動程式二進位檔為基礎。
以自定義 UVC 驅動程式或內建 UVC 驅動程式為基礎的自定義 INF 檔案應該包含下列 AddReg 項目:
EnableDependentStillPinCapture:REG_DWORD:0x0 (已停用) 至 0x1 (已啟用)
當此項目設定為啟用 (0x1) 時,擷取流程會使用方法 2 進行靜態影像擷取,假設韌體也支援 UVC 1.5 規格所指定的方法 2。
自定義 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
2.2.2 擴展單元控制
Microsoft 對 USB 視訊類別規格 的擴充功能,以啟用新的控制項,是透過 GUID MS_CAMERA_CONTROL_XU 所識別的擴充單位來完成,稱為 Microsoft-XU。
// {0F3F95DC-2632-4C4E-92C9-A04782F43BC8}
DEFINE_GUID(MS_CAMERA_CONTROL_XU,
0xf3f95dc, 0x2632, 0x4c4e, 0x92, 0xc9, 0xa0, 0x47, 0x82, 0xf4, 0x3b, 0xc8);
裝置韌體所實作的 Microsoft-XU 包含下列小節中定義的新控制項。 下列要求定義適用於所有這些控制項,除非已明確為該控制項指定覆寫定義。 請參閱 UVC 1.5 Class specification.pdf 以瞭解 D3、D4、GET_INFO 等的定義。
GET_INFO要求應該報告沒有自動更新和非同步功能的控制項 (例如,D3 和 D4 位應設定為 0) 。
GET_LEN要求應報告此控制項的有效負載長度上限 (wLength) 。
GET_RES要求應報告 qwValue/dwValue 的解析度 (步長大小) 。 所有其他欄位應設定為 0。
GET_MIN要求應該報告 qwValue/dwValue 支援的最小值。 所有其他欄位應設定為 0。
GET_MAX要求應該報告 qwValue/dwValue 支援的最大值。 此外,所有支援的旗標都應該在 bmControlFlags 中設定為 1。 所有其他欄位應設定為 0。
GET_DEF和GET_CUR要求應分別報告欄位 qwValue/dwValue 和 bmControlFlags 的預設和目前設定。 所有其他欄位應設定為 0。
主機在設定所有欄位後發出SET_CUR請求。
以下表格將 Microsoft-XU 的控制選擇器對應到它們各自的值,以及擴充單元描述符中的 bmControls 欄位的位元位置:
| 控制選擇器 | 價值觀 | 位位置 (bmControls 欄位) |
|---|---|---|
| MSXU_CONTROL_UNDEFINED | 0x00 | 無 |
| MSXU_CONTROL_FOCUS | 0x01 | D0 |
| MSXU 控制曝光 | 0x02 | D1 |
| MSXU_CONTROL_EVCOMPENSATION | 0x03 | D2 |
| MSXU_CONTROL_WHITEBALANCE | 0x04 | D3 |
| 保留供日後使用 | 0x05 | D4 |
| MSXU_CONTROL_FACE_AUTHENTICATION | 0x06 | D5 |
| MSXU_CONTROL_CAMERA_EXTRINSICS | 0x07 | D6 |
| MSXU_CONTROL_CAMERA_INTRINSICS | 0x08 | D7 |
| MSXU控制元資料 | 0x09 | D8 |
| MSXU_CONTROL_IR_紅外線手電筒 | 0x0A | D9 |
| MSXU_CONTROL_DIGITALWINDOW | 0X0B | D10 |
| MSXU_CONTROL_DIGITALWINDOW_CONFIG | 0X0C | D11 |
| MSXU控制視訊HDR | 0X0D | D12 |
| MSXU_CONTROL_FRAMERATE_THROTTLE | 0x0E | D13 |
| MSXU_CONTROL_FIELDOFVIEW2_CONFIG | 0x0F | D14 |
| MSXU_CONTROL_FIELDOFVIEW2 | 0x10 | D15 |
2.2.2.1 可取消控制
此處會使用自動更新功能來定義可取消控制項。
GET_INFO要求應該將這類控制項報告為自動更新控制項 (例如,D3 位應設定為 1) ,但不會報告為非同步控制項 (例如,D4 位應設定為 0) 。
針對這類控制,可以發出SET_CUR要求來設定新值 (SET_CUR (NORMAL) 要求,其中 bmOperationFlags:D0 位元設為 0) ,或取消先前的 SET_CUR (NORMAL) 要求 (SET_CUR (CANCEL) 要求,其中 bmOperationFlags:D0 位元設為 1) 。 即使硬體未設定或收斂至所要求的新設定,裝置在收到要求後,應該立即完成 SET_CUR 要求。 針對每個 SET_CUR(NORMAL)要求,裝置會在套用新設定或 SET_CUR(CANCEL)要求到達時,針對此控制項產生對應的控制改變中斷;在此中斷到達之前,SET_CUR(NORMAL)要求會被視為處於進行中狀態。 當 SET_CUR(NORMAL) 請求正在進行時,此特定控件的其他 SET_CUR(NORMAL) 請求將導致失敗。 SET_CUR(CANCEL)請求應始終成功。 如果沒有什麼要取消的,那麼設備就什麼都不做。
如果套用了 SET_CUR(NORMAL) 所指定的設定(例如,已經發生收斂),控制變更中斷承載應將位元 bmOperationFlags:D0 設定為 0;如果因為在 SET_CUR(NORMAL) 要求後出現 SET_CUR(CANCEL) 要求而未能套用設定(例如,收斂尚未發生),則將其設定為 1。
2.2.2.2 對焦控制
此控制項允許主機軟體指定相機的對焦設定。 這是全域控制項,會影響與視訊控制介面相關聯之所有視訊串流介面上的所有端點。
此控制項應作為可取消的控制項運作(請參閱第 2.2.2.1 節,以了解 GET_INFO 請求的要求和 SET_CUR 請求的功能行為)。
GET_MAX需求:此控件應公告在 bmControlFlags 中,對位 D0、D1、D2、D8 和 D18 的支援。
GET_DEF需求: bmControlFlags 的預設值應該是 D0 和 D18 設定為 1,並將 dwValue 設定為 0。
對於GET_CUR/SET_CUR要求,下列限制適用於欄位 bmControlFlags:
在D0、D1和D8位中,只能設置一個位;如果設定了 D2 位,則設定的它們都無效。
在 D16、D17、D18、D19 和 D20 中,只能設置一個位,設置的都無效。
D1 與目前定義的所有其他位 (D0、D2、D8、D16、D17、D18、D19 和 D20) 不相容。
D2 與 D1 和 D8 不相容。
如果未設定 D0,則 D2 與 D16、D17、D18、D19 和 D20 不相容。
2.2.2.3 曝光控制
此控制項允許主機軟體指定相機的曝光設定。 這是全域控制項,會影響與視訊控制介面相關聯之所有視訊串流介面上的所有端點。
GET_INFO要求應將此控件報告為非同步控件 (例如,D4 位應設定為 1) ,但不會報告為自動更新控件 (例如,D3 位應設定為 0) 。
GET_MAX需求:此控件應公告 bmControlFlags 中位 D0、D1 和 D2 的支援。
GET_DEF需求: bmControlFlags 的預設值應該是 D0 設定為 1,並將 qwValue 設定為 0。
對於GET_CUR/SET_CUR要求,下列限制適用於欄位 bmControlFlags:
- 在D0、D1和D2位元中,至少應設置一個位元。
- D1 與 D0 和 D2 不相容。
2.2.2.4 電動車補償控制
此控制允許主機軟體指定相機的 EV 補償設定。 這是全域控制項,會影響與視訊控制介面相關聯之所有視訊串流介面上的所有端點。
GET_INFO要求應將此控件報告為非同步控件 (例如,D4 位應設定為 1) ,但不會報告為自動更新控件 (例如,D3 位應設定為 0) 。
GET_RES要求應該透過在bmControlFlags中設定對應的位元,來報告所有支援的解析度(步階大小)。 所有其他欄位應設定為 0。
GET_MIN和GET_MAX要求應報告 dwValue 的最小和最大支援值。 位 D4 (表示步長為 1) 應該是 bmControlFlags 中設定的唯一位。 所有其他欄位應設定為 0。
GET_DEF、GET_CUR SET_CUR要求必須遵循第 2.2.2.1 節中的定義,但應該在欄位 bmControlFlags 的 D0、D1、D2、D3 和 D4 位之間設定一個且只有一個位。 此外,GET_DEF要求應將 dwValue 設定為 0。
2.2.2.5 白平衡控制
此控制允許主機軟體指定相機的白平衡設定。 這是全域控制項,會影響與視訊控制介面相關聯之所有視訊串流介面上的所有端點。
GET_INFO要求應將此控件報告為非同步控件 (例如,D4 位應設定為 1) ,但不會報告為自動更新控件 (例如,D3 位應設定為 0) 。
GET_RES、GET_MIN GET_MAX要求必須遵循第 2.2.2.1 節中的定義,但必須將 dwValueFormat 設定為 1。
GET_MAX需求:此控件應公告 bmControlFlags 中位 D0、D1 和 D2 的支援。
GET_DEF需求: bmControlFlags 的預設值應該是 D0 設定為 1,並將 dwValueFormat 和 dwValue 設定為 0。
對於GET_CUR/SET_CUR要求,下列限制適用於欄位 bmControlFlags:
- 在D0、D1和D2位中,至少應設定一個位。
- D1 與 D0 和 D2 不相容。
2.2.2.6 人臉認證控制
此控制項可讓主機軟體指定相機是否支援用於臉部驗證的串流模式。 支援此控制項表示相機能夠進行臉部驗證。 否則不支援此控制項。
此控制項僅適用於可產生 Infra-Red (IR) 資料的相機,而且僅適用於指定的串流介面 (這是與視訊控制介面相關聯之所有視訊串流介面的子集) 。
GET_RES和GET_MIN要求應報告欄位 bNumEntries 設定為 0,因此沒有其他欄位。
針對 GET_MAX 要求,在 bmControlFlags 欄位中將位元設為 1 表示該串流介面支援此對應模式。 GET_MAX要求輸出應該列出所有且僅能使用 D1 或 D2 的串流介面 (例如,如果串流介面能夠 D1 或 D2,則會列出它;否則,不會列出) 。 此外,不得宣傳任何串流介面同時支援 D1 和 D2。 如果串流介面也旨在以一般用途方式使用 (例如,在臉部驗證的目的之外) ,則除了 D1/D2 之外,該串流介面的 D0 也應該設定為 1。
對於 GET_DEF / GET_CUR / SET_CUR 要求,bmControlFlags 欄位上設定為 1 的位表示已為該串流介面選擇對應的模式。 在這些要求中,應該為特定串流介面設定一個且只有一個位 (D0、D1 和 D2) 。 針對傳回預設選擇的 GET_DEF 要求 (實作特定) ,如果串流介面也打算以一般用途方式使用 (例如,在臉部驗證的用途之外) ,則預設會在該串流介面上將 D0 設定為 1;否則,預設情況下,D1 或 D2(但不能同時設定兩者)應設定為 1。 GET_DEF/GET_CUR要求輸出應包含要求輸出中列出的所有串流介面GET_MAX相關資訊,不過,SET_CUR要求只能包含要求輸出中列出GET_MAX串流介面的子集。
範例:
假設攝影機有四個視訊串流介面,編號分別為 0x03、0x05、0x08 和 0x0b,其中視訊串流介面0x05產生 RGB 數據,其餘三個視訊串流介面產生紅外資料。 在產生 IR 資料的串流介面中,假設串流介面 0x03 和 0x0b 都能夠支援 D1,但串流介面 0x03 也能夠支援 D0。 在此範例中,臉部驗證控制僅適用於編號為0x03和0x0b的串流介面,因此只有這些介面會出現在要求中。
GET_MAX請求的輸出應如下:
GET_DEF請求的輸出應如下:
將串流介面0x03設定變更為 D1 的SET_CUR要求如下:
上述SET_CUR請求之後GET_CUR請求的輸出應如下所示:
2.2.2.7 相機外部控制
此控制項可讓主機軟體取得與視訊控制介面相關聯的視訊串流介面上端點的攝影機外部資料。 因此,從每個端點獲得的資料會顯示為對應資料流的屬性存儲區中的屬性 MFStreamExtension_CameraExtrinsics (可使用 IMFDeviceTransform::GetOutputStreamAttributes 呼叫來獲取)。
GET_RES、GET_MIN、GET_MAX、GET_CUR要求應報告欄位 bNumEntries 設定為 0,因此沒有其他欄位。
GET_DEF請求應列出具有可用外部資訊的所有端點。
範例:
假設攝影機有三個視訊串流介面,編號分別為 0x03、0x05 和 0x08,其中視訊串流介面除了支援所有視訊串流介面支援的視訊擷取外,0x05支援使用方法 2 進行靜態影像擷取。 在這些串流介面中,假設串流介面0x05,0x08具有可用的外部資訊,而串流介面0x03沒有可用的外部資訊。
在此範例中,GET_DEF要求的輸出應如下:
2.2.2.8 相機內部控制
此控制項可讓主機軟體取得與視訊控制介面相關聯之視訊串流介面上端點的相機內建資料。 因此,針對每個端點取得的資料,會顯示為對應串流的屬性存放位置上的屬性 MFStreamExtension_PinholeCameraIntrinsics(透過呼叫 IMFDeviceTransform::GetOutputStreamAttributes 取得)。
GET_RES、GET_MIN、GET_MAX、GET_CUR要求應報告欄位 bNumEntries 設定為 0,因此沒有其他欄位。
GET_DEF請求應列出具有可用內在資訊的所有端點。
範例:
假設攝影機有三個視訊串流介面,編號分別為 0x03、0x05 和 0x08,其中視訊串流介面除了支援所有視訊串流介面支援的視訊擷取外,0x05支援使用方法 2 進行靜態影像擷取。 在這些串流介面中,假設串流介面0x05且0x08具有可用的內建資訊,而串流介面0x03沒有可用的內建資訊。
在此範例中,GET_DEF要求的輸出應如下:
2.2.2.9 元資料控制
此控制項可讓主機軟體查詢和控制相機產生的中繼資料。 這是全域控制項,會影響與視訊控制介面相關聯之所有視訊串流介面上的所有端點。
此控制項會由相機驅動程式對應至 KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA 。
如果韌體支援SET_CUR要求,則適用下列規定:
GET_MIN,GET_DEF請求應該報告欄位 dwValue 設定為 0。
GET_RES 請求應將欄位 dwValue 報告為與 GET_MAX 請求報告的值相同。
當收到 dwValue 設定為 0 的SET_CUR要求時,相機不會產生任何中繼資料。 當收到 SET_CUR 要求,其中 dwValue 設定為與 GET_MAX 要求所報告的值相同時,相機可以產生中繼資料,且任何畫面中該中繼資料的大小不能超過 dwValue 。
如果韌體不支援SET_CUR要求,則適用下列規定:
GET_MIN 和 GET_DEF 的要求應將欄位 dwValue 報告為與 GET_MAX 要求報告的值相同。
GET_RES要求應報告欄位 dwValue 設定為 0。
相機可以產生中繼資料,而這類中繼資料的總大小不能超過(根據GET_MAX請求報告的)dwValue 乘以 1024 位元組,再減去任何畫面中 UsbVideoHeader中繼資料承載的大小。
UsbVideoHeader 中繼資料負載是 sizeof(KSCAMERA_METADATA_ITEMHEADER)加上 sizeof(KSTREAM_UVC_METADATA),或總共 24 個位元組。
產生的中繼資料應符合第 2.2.3 節所述的 Microsoft 標準格式中繼資料。
2.2.2.10 紅外線燈控制
這種控制為紅外 LED 硬件提供了一種靈活的方法來報告它可以控制的程度並提供控制它的能力。 這是一個全域控制項,透過調整連接到相機的紅外線燈的電源,影響與視訊控制介面相關聯的所有視訊串流介面上的所有端點。
此控制項會由相機驅動程式對應至 KSPROPERTY_CAMERACONTROL_EXTENDED_IRTORCHMODE 。
以下適用:
GET_LEN請求應報告值 8。
GET_INFO請求應報告值 3。 此值表示支援GET_CUR和SET_CUR的同步控制項。
GET_MIN要求應該報告欄位 dwMode 設定為 0,並將 dwValue 設定為指出最小功率的值。 功率等級 0 可能表示關閉,但最低操作功率等級不需要為 0。
GET_RES要求應報告欄位 dwMode 設定為 0,並將 dwValue 設定為小於或等於 GET_MAX (dwValue) – GET_MIN (dwValue) 的數字,讓 GET_MAX (dwValue) – GET_MIN (dwValue) 可平均被該值整除。 dwValue 可能不是零 (0) 。
GET_MAX要求須報告欄位dwMode的設置,並且設定位D[0-2]以識別此控件的功能。 dwMode 必須設定位 D0,表示支援 OFF,而且必須至少有一個其他位集,以支援作用中狀態。 dwValue 必須設定為指出正常電源的值。
GET_DEF要求應報告欄位 dwMode 設定為系統在串流開始之前應該處於的預設模式。 dwMode 必須設定為 2 (ON) 或 4 (交替) 。 dwValue 應該設定為通常用於 FaceAuth 控制項的電源層級。 dwValue 是由製造商所定義。
GET_CUR要求應該報告欄位 dwMode 設定為目前的作業模式,並將 dwValue 設定為目前的照明。
當收到SET_CUR請求時,紅外線火炬會使用請求的操作模式將照明設置為按比例調整的強度。
IR 手電筒必須為每個幀發出 MF_CAPTURE_METADATA_FRAME_ILLUMINATION 屬性。 它可以透過裝置 MFT 或在相機的中繼資料承載中包含 MetadataId_FrameIllumination 屬性來提供這項功能。 參見第 2.2.3.4.4 節。
此元資料的唯一目的是指示框架是否被照亮。 這與 KSPROPERTY_CAMERACONTROL_EXTENDED_FACEAUTH_MODE DDI 所需的中繼資料相同,以及第 2.2.2.6 節中定義的 MSXU_FACE_AUTHENTICATION_CONTROL 。
2.2.2.11 數位視窗控制
Digital Window 在相機串流時指定相機的視野和縮放。 此控制項是平移、傾斜和縮放的潛在替代品。 此控件僅適用於相機主動串流時。
此控制項適用於所有類型的相機,且與串流的媒體類型無關。
此控制項可讓主機軟體查詢和控制與攝影機關聯的數位視窗。
這是全域控制項,會影響與視訊控制介面相關聯之所有視訊串流介面上的所有端點。 它調整 ISP 使用的像素數據來源。 這包括方法 2 和方法 3 仍然捕獲針腳。
此控制項會由收件匣相機驅動程式對應至 KSPROPERTY_CAMERACONTROL_EXTENDED_DIGITALWINDOW 。
以下適用:
GET_LEN請求應報告值 16。
GET_INFO請求應報告值 3。 此值表示支援GET_CUR和SET_CUR的同步控制項。
GET_MIN要求應報告欄位 dwMode 設定為 0、 OriginX 和 OriginY 設定為 0.0,以及 WindowSize 設定為 1.0。 此要求目前未使用。
GET_RES要求應報告欄位 dwMode 設定為 0、 OriginX 和 OriginY 設定為 0.0,以及 WindowSize 設定為 1.0。 此要求目前未使用。
GET_MAX要求應該回報欄位dwMode的設定,並將位元 D0 設定,以識別此控制項的功能。 值 0 表示僅支援手動模式。 值 1 表示支援自動臉部取景模式。 這些欄位的其餘部分未使用,但是,我們建議將 OriginX 和 OriginY 設定為 0.0,並將 WindowSize 設定為 1.0。
GET_DEF要求應報告欄位 dwMode 設定為 0、 OriginX 和 OriginY 設定為 0.0,以及 WindowSize 設定為 1.0。 這始終是預設視窗。
GET_CUR要求應報告欄位 dwMode 設定為目前的作業模式,而 OriginX、 OriginY 和 WindowSize 會描述目前的數位視窗。
當收到SET_CUR請求時,相機會調整其視野以匹配所選的操作模式和數位視窗。
如果選取自動臉部取景模式,相機會選取一個視窗,該視窗完全包含場景中的主要臉部,並忽略傳入的 OriginX、 OriginY 和 WindowSize 。 如果找不到人臉,則使用預設視窗。
數位視窗的任何變更都必須反映在每個樣本的中繼數據中。
數位視窗的變更可能不會立即生效,但控件應該立即回應。 數位視窗的變更必須在生效後立即在框架的中繼資料承載中報告。
2.2.2.12 數位視窗配置控制
Digital Window 配置上限控制項指定相機在所有可用分辨率下的縮放界限。 解析度與媒體類型無關,因此公告相同顯示解析度的兩種媒體類型會合併為一項功能。
由於控制端點的大小限制,此控制項最多可以描述 1820 個唯一解析度。
如果此控制項也存在,則此控制項必須一律可用來報告數位視窗控制項的功能。
此控制項會由收件匣相機驅動程式對應至 KSPROPERTY_CAMERACONTROL_EXTENDED_DIGITALWINDOW_CONFIGCAPS 。
以下適用:
GET_LEN請求應報告有效載荷的整個大小。 有效載荷大小必須是 36 的倍數,因為每個解析度定義的長度為 36 個位元組。
"GET_INFO" 請求應該報告值為 1。 此值表示僅支援GET_CUR的同步控制項。
GET_CUR請求應報告一系列能力。 能力結構的欄位如上所述。
GET_MIN、GET_MAX、GET_RES和GET_DEF請求未使用,但應傳回與GET_CUR相同的值。
不支援SET_CUR要求。
2.2.2.13 視訊HDR控制
此控制項可讓主機軟體指定相機是否支援視訊 HDR。 支援此控制項表示相機能夠盡最大努力執行視訊 HDR。 如果相機不支援視訊 HDR,則不得實作此控制項。
此控制項會由相機驅動程式對應至 KSPROPERTY_CAMERACONTROL_EXTENDED_VIDEOHDR 。
以下適用:
GET_LEN要求應報告承載的整個大小 (例如 4 個位元組) 。
GET_INFO請求應報告值 3. 此值表示支援GET_CUR、SET_CUR的同步控制項。
GET_CUR要求應報告欄位 dwMode 設定為目前的作業模式。
GET_DEF 應該將 dwMode 設定為 OFF (0) 。
GET_MAX請求應顯示對可用的操作模式的支援:[1(開/關)、3(開/關/自動)]。 此控制項必須支援 ON (1)。
GET_MIN和GET_RES請求應報告 0。
SET_CUR要求應將模式設定為 OFF (0)、ON (1) 或 AUTO (2)。
2.2.2.14 幀率限制控制
此控制項允許主機軟體指定相機是否支援幀率限制。
此控件僅適用於相機主動串流時。 若要主動串流,表示預覽或記錄釘選必須位於KSSTATE_RUN中,且能夠傳遞畫面。 如果數據流不在作用中,則此控件應該傳回STATUS_INVALID_DEVICE_STATE。
即使這是過濾範圍控制項,幀率控制也不應該影響相片插針或無 RGB 資料流程,例如 IR/深度。 此外,當幀速率節流生效時,也應該相應地調整取樣時間長度。
此控制項會由相機驅動程式對應至 KSPROPERTY_CAMERACONTROL_EXTENDED_FRAMERATE_THROTTLE 。
| 控制選擇器 | MSXU_CONTROL_FRAMERATE_THROTTLE |
|---|---|
| 強制要求 | GET_INFO、GET_LEN、GET_RES、GET_MIN、GET_MAX、GET_DEF、GET_CUR、SET_CUR |
| 選擇性要求 | |
| wLength | 20 |
| Offset | 領域 | 大小 | 價值觀 | 說明 |
|---|---|---|---|---|
| 0 | dw模式 | 4 | 標誌 | D0:0 (關閉) 或 1 (開啟) D1-D31:保留並設定為 0 |
| 4 | scaleFactor百分比 | 4 | 數目 | 此值應在最小值和最大值的範圍內,並且應設置為步長值的倍數。 例如:如果最小值 = 5、最大值 = 100 且步驟 = 5,且如果應用程式決定將畫面速率降低至原始值的 80%,則此成員值應該設定為 80。 藉由適當地設定此值,應用程式可以確保新的影格速率永遠不會超過原始值,也不會變成零,但原始影格速率是可能的。 |
| 8 | min | 4 | 數目 | 最小值應等於至少一個步長,或者應該是步長的倍數(例如:步驟1、步驟2 等)。 最小值無法設定為 0。 |
| 12 | 最大 | 4 | 數目 | 最大值必須設定為 100,這表示幀速率沒有變化。 |
| 16 | 步 | 4 | 數目 | Step 應該是 Max 的嚴格因數,例如 {Max % Step == 0}。 範例:1、2、4、5 等。 |
以下適用:
GET_LEN要求應報告有效負載的完整大小(例如,20位元組)。
GET_INFO請求應報告值 3. 此值表示支援GET_CUR、SET_CUR的同步控制項。
GET_CUR要求應該報告欄位 dwMode 設定為目前的作業模式,並將 scaleFactorPercentage 設定為目前的 scaleFactor 值。 最小值、最大值和步長應報告上表所述的值。
GET_DEF 應該將 dwMode 設定為 OFF (0)、scaleFactorPercentage=100、最小值設定為預設最小值、最大值設定為 100,以及步驟設定為預設步驟值。 min 和 step 的值應由製造商定義,但應遵循上表中提到的指南。
GET_ MAX 請求應宣傳對可用操作模式的支持,並將報告值 1 [ ON |關閉]。 此控制項必須同時支援 ON 和 OFF。 Min、max、step 和 scaleFactorPercentage 可以設定為預設值。
GET_MIN和GET_RES請求應報告 0。
SET_CUR請求應將模式設定為 OFF(0)、ON(1)。 如果 dwMode 設定為 ON,則 scaleFactorPercentage 應該會生效。 對於 OFF 和 ON 案例,scaleFactorPercentage 必須有效,如上表所述。
2.2.2.15 視場 2 配置控制
視野 2 配置控制項將支援的對角線視野度數值指定為值陣列。 所有支援的值必須在理論最小值和最大值範圍內,1 度 - 360 度。
如果裝置想要支援連續的視野值,則需要報告所有支援的值。 例如,如果裝置想要支援 85 度 - 60 度的對角線視野,步長為 1,則此控制項必須報告值陣列 [85, 84, 83, 82, ..., 62, 61, 60]。
此控制項必須可用,以便在 [視野 2] 控制項存在時報告功能。
這是同步濾波器電平控制。
此控制項會由相機驅動程式對應至 KSPROPERTY_CAMERACONTROL_EXTENDED_ FIELDOFVIEW2_CONFIGCAPS 。
| 控制選擇器 | MSXU_CONTROL_FIELDOFVIEW2_CONFIG |
|---|---|
| 強制請求 | GET_INFO、GET_LEN、GET_RES、GET_MIN、GET_MAX、GET_DEF、GET_CUR |
| 選擇性要求 | |
| wLength | 4 位元組 + 計數 乘以 4 位元組,其中 Count 是唯一檢視欄位值的數目。 |
| Offset | 領域 | 大小 | 價值觀 | 說明 |
|---|---|---|---|---|
| 0 | dwDefaultFieldOfView | 4 | 數目 | 預設對角線 Field of View 必須是 FieldOfViewValues 陣列中報告的其中一個值。 |
| 4 | 檢視值欄位[0] | 4 | 數目 | 第一個視野值,這必須是最寬的 FoV (視野) 值。 |
| … | … | … | … | … |
| 4 + 4*(計數-1) | FieldOfViewValues [計數 -1] | 4 | 數目 | 最後一個視野值,這必須是最窄的 FoV 值。 |
以下適用:
GET_LEN請求應報告有效載荷的整個大小。
GET_INFO請求應報告數字1。 此值表示僅支援GET_CUR的同步控制項。
GET_CUR要求應以遞減順序報告包含預設 FoV 和支援 FoV 值陣列的資料。 結構的欄位如上定義。
GET_DEF 請求應報告與 GET_CUR 指令相同的資訊。
GET_MIN,GET_MAX和GET_RES請求未使用,但應傳回與GET_CUR相同的值。
不支援SET_CUR要求。
視野值必須以遞減順序排列,例如,最寬的視野在前,最窄的在後。
2.2.2.16 視角 2 控制
此控制項會指定相機在串流時使用的基本視野。 此控制項可以在串流之前或期間套用。
此控制項適用於所有類型的相機,且與串流的媒體類型無關。
此控制允許宿主軟體查詢和控制與攝影機鏡頭的視野相關的範圍。
這是全域控制項,會影響與視訊控制介面相關聯之所有視訊串流介面上的所有端點。 它調整 ISP(圖像信號處理器)使用的像素(或傳感器)數據源。 這包括方法 2 和方法 3 仍然捕獲針腳。
這是同步濾波器電平控制。
此控制項會由相機驅動程式對應至 KSPROPERTY_CAMERACONTROL_EXTENDED_ FIELDOFVIEW2 。
| 控制選擇器 | MSXU_CONTROL_FIELDOFVIEW2 |
|---|---|
| 強制要求 | GET_INFO、GET_LEN、GET_RES、GET_MIN、GET_MAX、GET_DEF、GET_CUR、SET_CUR |
| 選擇性要求 | |
| wLength | 4 |
| Offset | 領域 | 大小 | 價值觀 | 說明 |
|---|---|---|---|---|
| 0 | dwValue | 4 | 數目 | 對角線視野值(以度為單位)。 |
以下適用:
GET_LEN請求應報告值 4。
GET_INFO 請求應報告 3。 此值表示支援GET_CUR和SET_CUR的同步控制項。
GET_MIN要求應報告欄位 dwValue 設定為支援的最小檢視欄位值。
GET_RES request 必須報告字段 dwValue 設置為 0。 此要求目前未使用。
GET_MAX 要求應報告欄位 dwValue 設定為支援的最大視野值。
GET_DEF要求應報告欄位 dwValue 設定為預設的檢視欄位值。
GET_CUR要求應報告欄位dwValue設定為當前視場值。
收到SET_CUR要求時,相機會將其視野設定為符合指定的 dwValue。
如果相機實作CT_ZOOM_RELATIVE_CONTROL和/或CT_ZOOM_ABSOLUTE_CONTROL,則呼叫MSXU_CONTROL_FIELDOFVIEW2 SET_CUR時,這些控制項應該重設為預設值。
如果相機實作MSXU_CONTROL_DIGITALWINDOW,則當設定新的視野值時,它應反映視窗變更。 反之亦然,視野應反映透過數位視窗所做的更改。 詳情請參閱 KSPROPERTY_CAMERACONTROL_EXTENDED_ FIELDOFVIEW2 。
2.2.3 元資料
標準格式框架中繼資料的設計是以 Windows 10 的 UVC 自訂中繼資料設計為基礎。 在 Windows 10 中,UVC 支援自訂中繼資料,這是透過為相機驅動程式使用自訂的 INF 文件來實現的(注意:相機驅動程式可以基於 Windows USBVIDEO.SYS,但特定硬體需要自訂 INF 才能接收中繼資料)。 如果 MetadataBufferSizeInKB<PinIndex> 註冊項存在且非零,則該針腳支援自訂中繼資料,且該值表示用於中繼資料的緩衝區大小。 此 <PinIndex> 欄位指出視訊針腳索引的從 0 開始的索引。
在 Windows 10 版本 1703 中,相機驅動程式可以包含下列 AddReg 項目,以表示對 Microsoft 標準格式中繼資料支援的支援:
StandardFormatMetadata<PinIndex>:REG_DWORD:0x0("NotSupported")至 0x1("Supported")
DevProxy 會讀取此登錄機碼,並通知 UVC 驅動程式中繼資料是標準格式,方法是在 KSSTREAM_METADATA_INFO 結構的 Flags 欄位中設定旗標 KSSTREAM_METADATA_INFO_FLAG_STANDARDFORMAT。
2.2.3.1 Microsoft 標準格式中繼資料
Microsoft 標準格式中繼資料是下列結構的一或多個實例:
typedef struct tagKSCAMERA_METADATA_ITEMHEADER {
ULONG MetadataId;
ULONG Size; // Size of this header + metadata payload following
} KSCAMERA_METADATA_ITEMHEADER, *PKSCAMERA_METADATA_ITEMHEADER;
MetadataId 欄位會填入下列列舉定義中的識別碼,其中包含定義良好的識別碼和自訂識別碼 (識別碼 >= MetadataId_Custom_Start)。
typedef enum {
MetadataId_Standard_Start = 1,
MetadataId_PhotoConfirmation = MetadataId_Standard_Start,
MetadataId_UsbVideoHeader,
MetadataId_CaptureStats,
MetadataId_CameraExtrinsics,
MetadataId_CameraIntrinsics,
MetadataId_FrameIllumination,
MetadataId_Standard_End = MetadataId_FrameIllumination,
MetadataId_Custom_Start = 0x80000000,
} KSCAMERA_MetadataId;
「大小」欄位會設定為sizeof(KSCAMERA_METADATA_ITEMHEADER) + sizeof(中繼資料有效負載)。
2.2.3.2 韌體從 USB 視訊幀封包產生的標準格式中繼資料
在通過 UVC 傳輸基於畫面的視訊時,影像畫面會被打包成一系列的資料封包,每個封包前面都有一個 UVC 負載標頭。 每個 UVC 承載標頭都是由 USB 視訊類別驅動程式框架型承載規格所定義:
承載標頭
以下是以框架為基礎格式的承載標頭格式的說明。
HLE (標頭長度) 欄位
標頭長度欄位指定標頭的長度 (以位元組為單位)。
位元欄位標頭欄位
FID:幀識別碼
- 此位元在每個影格起始邊界時會切換,並在影格的其他部分保持不變。
EOF:幀結束
- 此位置指示視訊影格的結尾,並設定在屬於影格的最後一個視訊樣本中。 使用此位是減少幀傳輸完成延遲的最佳化,並且是選擇性的。
PTS:演示時間戳記
- 設定此位時,表示存在 PTS 欄位。
SCR:源時鐘基準
- 設定時,此位表示存在 SCR 欄位。
RES:保留。
- 設定為 0。
STI:靜態影像
- 設定此位時,會將視訊範例識別為屬於靜止影像。
ERR:錯誤位元
- 設定此位時,表示裝置串流中發生錯誤。
EOH:頁首結束
- 設定時,此位表示 BFH 欄位的結尾。
PTS:簡報時間戳記,大小:4 位元組,值:數字
- 當在BFH[0]欄位中設定PTS位時,PTS欄位就會出現。 請參閱 視訊裝置規格的 USB 裝置類別定義 中的第 2.4.3.3 節「視訊和靜態影像承載標頭」。
SCR:源時鐘參考,大小:6 位元組,值:數字
- 當 BFH[0] 欄位中的 SCR 位被設定時,SCR 欄位就會存在。 請參閱第 2.4.3.3 節視訊和靜態影像承載標頭,其位於USB 視訊裝置的裝置類別定義規範中。
現有 UVC 驅動程式中的 HLE 欄位會固定為 2 個位元組 (沒有 PTS/SCR) 或最多 12 個位元組 (PTS/SCR 存在) 。 不過,HLE 欄位是位元組大小的欄位,最多可以指定 255 個位元組的標頭資料。 如果 PTS/SCR 兩者都存在,且 HLE 大於 12 個位元組,在 INF 條目 StandardFormatMetadata<PinIndex> 設定時,承載標頭的前 12 個位元組之後的任何其他數據都被視為視訊畫面特定的標準中繼數據。
畫面的標準格式中繼資料 (由韌體產生) 是透過串連在代表該畫面的視訊畫面封包中找到的部分 Blob 來取得。
2.2.3.3 提供給使用者模式元件的元資料緩衝區
提供給用戶模式元件的中繼資料緩衝區會包含一個UVC時間戳記的中繼資料項目(由UVC驅動程式生成),接著是韌體生成的中繼資料項目,其配置如下:
2.2.3.4 標準元資料識別碼的元資料格式
韌體可以選擇是否產生對應至識別碼的中繼資料。 如果韌體選擇產生對應至識別碼的中繼資料,則該識別碼的中繼資料應該存在於韌體發出的所有畫面上。
2.2.3.4.1 MetadataId_CaptureStats
此識別碼的中繼資料格式由下列結構定義:
typedef struct tagKSCAMERA_METADATA_CAPTURESTATS {
KSCAMERA_METADATA_ITEMHEADER Header;
ULONG Flags;
ULONG Reserved;
ULONGLONG ExposureTime;
ULONGLONG ExposureCompensationFlags;
LONG ExposureCompensationValue;
ULONG IsoSpeed;
ULONG FocusState;
ULONG LensPosition; // a.k.a Focus
ULONG WhiteBalance;
ULONG Flash;
ULONG FlashPower;
ULONG ZoomFactor;
ULONGLONG SceneMode;
ULONGLONG SensorFramerate;
} KSCAMERA_METADATA_CAPTURESTATS, *PKSCAMERA_METADATA_CAPTURESTATS;
旗標 欄位 指示結構中哪些後面的欄位已填入且具有有效的資料。 旗標欄位不應在各影格間有所變化。 目前,已定義下列旗標:
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_EXPOSURETIME 0x00000001
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_EXPOSURECOMPENSATION 0x00000002
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_ISOSPEED 0x00000004
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_FOCUSSTATE 0x00000008
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_LENSPOSITION 0x00000010
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_WHITEBALANCE 0x00000020
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_FLASH 0x00000040
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_FLASHPOWER 0x00000080
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_ZOOMFACTOR 0x00000100
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_SCENEMODE 0x00000200
#define KSCAMERA_METADATA_CAPTURESTATS_FLAG_SENSORFRAMERATE 0x00000400
保留欄位會保留給未來使用,且應設定為 0。
ExposureTime 欄位包含擷取畫面時套用至感應器的曝光時間 (以 100 ns 為單位)。 這會在對應的 MF 樣本上顯示為屬性MF_CAPTURE_METADATA_EXPOSURE_TIME。
ExposureCompensationFlags 欄位包含用來傳達 EV 補償值的 EV 補償步驟(必須只設定一個 KSCAMERA_EXTENDEDPROP_EVCOMP_XXX 步驟旗標)。 ExposureCompensationValue 欄位包含 EV 補償值,以擷取畫面時套用至感應器的步驟為單位。 這些會顯示為對應的 MF 樣本上的屬性 MF_CAPTURE_METADATA_EXPOSURE_COMPENSATION。
IsoSpeed 欄位包含擷取畫面時套用至感應器的 ISO 感光度值。 這是無單位的。 這會在對應的 MF 樣本上顯示為屬性MF_CAPTURE_METADATA_ISO_SPEED。
FocusState 欄位包含目前的焦點狀態,可採用列舉KSCAMERA_EXTENDEDPROP_FOCUSSTATE中定義的其中一個值。 這會在對應的 MF 樣本上顯示為屬性MF_CAPTURE_METADATA_FOCUSSTATE。
LensPosition 欄位包含擷取畫面時的邏輯鏡頭位置,這是無單位的。 這是可以從 GET 呼叫中的 KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUS 查詢到的相同值。 這會在對應的 MF 樣本上顯示為屬性 MF_CAPTURE_METADATA_LENS_POSITION。
白平衡欄位包含擷取畫面時套用至感光元件的白平衡,這是以開爾文為單位的值。 這會在對應的 MF 樣本上顯示為屬性MF_CAPTURE_METADATA_WHITEBALANCE。
Flash 欄位包含一個布林值,其中 1 表示閃光開啟,0 表示在擷取畫面時關閉閃光。 這會在對應的 MF 範例上顯示為屬性MF_CAPTURE_METADATA_FLASH。
FlashPower 欄位包含套用至所擷取畫面的閃光燈功率,該值在 [0, 100] 範圍內。 如果驅動程式不支援快閃記憶體的可調式電源,則應該省略此欄位。 這會在對應的 MF 樣本上顯示為屬性MF_CAPTURE_METADATA_FLASH_POWER。
ZoomFactor 欄位包含套用至擷取畫面的 Q16 格式縮放值。 這會在對應的 MF 樣本上顯示為屬性MF_CAPTURE_METADATA_ZOOMFACTOR。
SceneMode 欄位包含套用至擷取畫面的場景模式,這是 64 位KSCAMERA_EXTENDEDPROP_SCENEMODE_XXX旗標。 這會在對應的 MF 樣本上顯示為屬性MF_CAPTURE_METADATA_SCENE_MODE。
SensorFramerate 欄位包含擷取影格時測量的感測器讀出速率 (以赫茲為單位),其中包含上 32 位元的分子值和下 32 位元的分母值。 這會在對應的 MF 樣本上顯示為屬性 MF_CAPTURE_METADATA_SENSORFRAMERATE。
2.2.3.4.2 MetadataId_CameraExtrinsics
此識別碼的中繼資料格式涉及標準KSCAMERA_METADATA_ITEMHEADER後面接著位元組陣列承載。 承載應該對齊 MFCameraExtrinsics 結構,後面接著零個或多個 MFCameraExtrinsic_CalibratedTransform 結構。 承載必須以 8 位元組對齊,且所有未使用的位元組都應出現在承載結尾,並設定為 0。
2.2.3.4.3 MetadataId_CameraIntrinsics
此識別碼的中繼資料格式由標準的 KSCAMERA_METADATA_ITEMHEADER 開始,其後接著位元組陣列的承載資料。 承載應該與 MFPinholeCameraIntrinsics 結構對齊。 承載必須以 8 位元組對齊,且所有未使用的位元組都應出現在承載結尾,並設定為 0。
2.2.3.4.4 MetadataId_FrameIllumination
此識別碼的中繼資料格式由下列結構定義:
typedef struct tagKSCAMERA_METADATA_FRAMEILLUMINATION {
KSCAMERA_METADATA_ITEMHEADER Header;
ULONG Flags;
ULONG Reserved;
} KSCAMERA_METADATA_FRAMEILLUMINATION, *PKSCAMERA_METADATA_FRAMEILLUMINATION;
標誌 欄位指出有關捕捉框架的資訊。 目前,已定義下列旗標:
#define KSCAMERA_METADATA_FRAMEILLUMINATION_FLAG_ON 0x00000001
如果在照明開啟時捕獲畫面,則應設定標誌 KSCAMERA_METADATA_FRAMEILLUMINATION_FLAG_ON。 否則,不得設置此標誌。
保留欄位保留供將來使用,應設為 0。
範例:
例如,指示照明已開啟的KSCAMERA_METADATA_FRAMEILLUMINATION結構如下所示:
KSCAMERA_METADATA_FRAMEILLUMINATION.Header.MetadataId = MetadataId_FrameIllumination;
KSCAMERA_METADATA_FRAMEILLUMINATION.Header.Size = 16; // 4 ULONG variables in total inside the structure
KSCAMERA_METADATA_FRAMEILLUMINATION.Flags = KSCAMERA_METADATA_FRAMEILLUMINATION_FLAG_ON;
KSCAMERA_METADATA_FRAMEILLUMINATION.Reserved = 0;
2.2.3.4.5 MetadataId_USBVideoHeader
此識別碼的中繼資料格式由通用KSCAMERA_METADATA_ITEMHEADER定義,後面接著KSSTREAM_UVC_METADATA結構:
typedef struct
{
ULONG PresentationTimeStamp;
ULONG SourceClockReference;
union
{
struct
{
USHORT Counter : 11;
USHORT Reserved : 5;
};
USHORT SCRToken;
};
USHORT Reserved0;
ULONG Reserved1;
} KSSTREAM_UVC_METADATATYPE_TIMESTAMP, *PKSSTREAM_UVC_METADATATYPE_TIMESTAMP;
typedef struct {
KSSTREAM_UVC_METADATATYPE_TIMESTAMP StartOfFrameTimestamp;
KSSTREAM_UVC_METADATATYPE_TIMESTAMP EndOfFrameTimestamp;
} KSSTREAM_UVC_METADATA, *PKSSTREAM_UVC_METADATA;
StartOfFrameTimestamp 和 EndOfFrameTimestamp 欄位代表時間戳記,這些時間戳記包含在相機發出的第一個和最後一個 UVC 承載的 UVC 標頭中,用來構建此幀。
此承載不應由裝置傳送。
此中繼資料承載是唯一的,因為它是 USB 視訊類別驅動程式從符合 UVC 規範承載標頭取得的資訊直接產生的唯一中繼資料承載。
此載荷會附加到每個畫面的中繼資料緩衝區的前面。
如果裝置支援標準化的中繼資料,它必須在其緩衝區需求中包含儲存此資料負載所需的記憶體空間,這一點如第 2.2.2.9 節所定義的中繼資料控制元件報告的那樣。