MICROSOFT 擴充至 USB 視訊類別 1.5 規格
概觀
1.1 摘要
USB 視訊類別規格的 Microsoft 延伸模組可啟用新的控件,以及以標準格式攜帶定義完善的框架元數據的功能。
1.2 架構決策
ISOCH 和 BULK 端點可以使用 USB 視訊類別 (UVC) 畫面元數據支援。 不過,在 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裝置可能不支援在USB視訊類別規格網站上下載的UVC 1.5類別specification.pdf第2節2.4.2.4.2.4(仍然影像擷取)中所述的方法 2。
在 Windows 10 版本 1607 和更早版本中,即使裝置根據 UVC 1.5 規格公告支援它,擷取管線也不會使用方法 2。
在 Windows 10 版本 1703 中,使用此方法的裝置必須使用相機驅動程式的自定義 INF 檔案,但指定硬體需要自定義 INF,才能啟用方法 2 仍會擷取影像)。
注意:相機驅動程式可以以 Windows USBVIDEO.SYS為基礎,也可以以自定義驅動程式二進位檔為基礎。
根據自訂 UVC 驅動程式或收件匣 UVC 驅動程式的自訂 INF 檔案應該包含下列 AddReg 專案:
EnableDependentStillPinCapture: REG_DWORD: 0x0 (Disabled) 至 0x1 (Enabled)
當這個項目設定為 Enabled (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 會裝載下列小節中定義的新控件。 除非明確為該控件指定覆寫定義,否則下列要求定義會套用至所有這些控件。 如需 D3、D4、GET_INFO 等的定義,請參閱 UVC 1.5 類別specification.pdf 。
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 | NA |
MSXU_CONTROL_FOCUS | 0x01 | D0 |
MSXU_CONTROL_EXPOSURE | 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_CONTROL_METADATA | 0x09 | D8 |
MSXU_CONTROL_IR_TORCH | 0x0A | D9 |
MSXU_CONTROL_DIGITALWINDOW | 0X0B | D10 |
MSXU_CONTROL_DIGITALWINDOW_CONFIG | 0X0C | D11 |
MSXU_CONTROL_VIDEO_HDR | 0X0D | D12 |
MSXU_CONTROL_FRAMERATE_THROTTLE | 0x0E | D13 |
MSXU_CONTROL_FIELDOFVIEW2_CONFIG | 0x0F | D14 |
MSXU_CONTROL_FIELDOFVIEW2 | 0x10 | D15 |
2.2.2.1 可取消的控件
您可以使用 Autoupdate 功能在這裡定義可取消的控制件。
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) 所指定的設定,則控制變更中斷承載應該將 bit bmOperationFlags:D0 設定為 0 ,如果因為SET_CUR(NORMAL) 要求之後提出的SET_CUR(CANCEL) 要求而未套用設定,則設定為 1(例如,聚合尚未發生)。
2.2.2.2 焦點控制件
此控制項可讓主機軟體指定相機的焦點設定。 這是全域控件,會影響與影片控制介面相關聯之所有視訊串流介面上的所有端點。
此控件應作為可取消的控件運作(如需GET_INFO要求需求和SET_CUR要求的功能行為,請參閱第 2.2.2.1 節)。
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),但不應報告為 AutoUpdate 控件(例如,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 補償控制
此控制項可讓主機軟體指定相機的 EV 補償設定。 這是全域控件,會影響與影片控制介面相關聯之所有視訊串流介面上的所有端點。
GET_INFO要求應將此控件報告為異步控件(例如,D4 位應設定為 1),但不應報告為 AutoUpdate 控件(例如,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 節中的定義,但應該在 D0、D1、D2、D3 和 D4 位之間設定一個和一個位。 此外,GET_DEF要求應將 dwValue 設定為 0。
2.2.2.5 白平衡控件
此控制項可讓主機軟體指定相機的白平衡設定。 這是全域控件,會影響與影片控制介面相關聯之所有視訊串流介面上的所有端點。
GET_INFO要求應將此控件報告為異步控件(例如,D4 位應設定為 1),但不應報告為 AutoUpdate 控件(例如,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。 如果串流介面也打算以一般用途使用(例如,在臉部驗證目的之外),則該串流介面的 D0 應設定為 1(除了 D1/D2)。
針對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 數據。 在產生 IR 數據的串流介面中,讓我們假設串流介面0x03和0x0b都能夠 D1,但串流介面0x03也能夠 D0。 在此範例中,臉部驗證控件只適用於編號為 0x03 和 0x0b的串流介面,因此只有這些介面會出現在要求中。
GET_MAX要求的輸出應如下:
GET_DEF要求的輸出應如下:
SET_CUR將串流介面上的設定0x03變更為 D1 的要求如下:
上述SET_CUR要求之後GET_CUR要求的輸出應如下所示:
2.2.2.7 相機 Extrinsics 控件
此控件可讓主機軟體取得與視訊控制介面相關聯之視訊串流介面上端點的相機外切數據。 因此,針對每個端點取得的數據會顯示為對應數據流屬性存放區上的屬性MFStreamExtension_相機 Extrinsics(使用 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_Pinhole相機 Intrinsics(使用 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要求所報告的相同值。
當收到SET_CUR要求時 ,dwValue 設定為 0 時,相機不得產生任何元數據。 當收到 SET_CUR要求時,dwValue 設定為與GET_MAX要求所報告的值相同時,相機可以產生元數據,而且這類元數據的大小不能超過 任何畫面的 dwValue 。
如果韌體不支援SET_CUR要求,則適用下列專案:
GET_MIN,GET_DEF要求應將欄位 dwValue 報告為GET_MAX要求所報告的相同值。
GET_RES要求應報告欄位 dwValue 設定為 0。
相機可以產生元數據,而且這類元數據的總大小不能超過 dwValue - 如GET_MAX要求所報告 - 比任何畫面的 UsbVideoHeader 元數據承載大小少 1024 位元組。
UsbVideoHeader 元數據承載是 sizeof(KSCAMERA_METADATA_ITEMHEADER) + sizeof(KSTREAM_UVC_METADATA) 或 24 個字節。
產生的元數據應符合第 2.2.3 節中所述的 Microsoft 標準格式元數據。
2.2.2.10 IR 火炬控制
此控件為 IR LED 硬體提供彈性的方法,可報告其可控制的程度,並提供控制它的能力。 這是一種全域控件,可藉由調整連接到相機的 IR 燈,影響與視訊控制介面相關聯之所有視訊串流介面上所有端點的全域控件。
此控件會由相機驅動程式對應至 KSPROPERTY_CAMERACONTROL_EXTENDED_IRTORCHMODE 。
適用下列專案:
GET_LEN要求應回報值為8。
GET_INFO要求應回報值為 3。 這個值表示支援GET_CUR和SET_CUR的同步控件。
GET_MIN要求應報告欄位 dwMode 設定為 0,而 dwValue 設定為指出最小功率的值。 電源等級 0 可能表示 OFF,但最低操作電源等級不需要 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 火炬會使用要求的作業模式,將照明設定為比例的強度。
IR Torch 必須針對每個畫面發出 MF_CAPTURE_METADATA_FRAME_ILLUMINATION 屬性。 它可透過裝置 MFT 或 從相機的元數據承載中包含MetadataId_FrameIllumination 屬性來提供此功能。 請參閱 2.2.3.4.4 一節。
此元數據的唯一用途是指出框架是否亮起。 這是 KSPROPERTY_CAMERACONTROL_EXTENDED_FACEAUTH_MODE DDI 和 2.2.6 一節中定義的MSXU_FACE_AUTHENTICATION_CONTROL所需的相同元數據。
2.2.2.11 數字視窗控件
數字視窗會指定相機串流時相機的檢視和縮放欄位。 此控件可能是 Pan、Tilt 和 Zoom 的替代專案。 此控件僅適用於相機主動串流時。
此控制項可供所有類型的相機使用,且與串流媒體類型無關。
此控制件可讓主機軟體查詢和控制與相機相關聯的數字視窗。
這是全域控件,會影響與影片控制介面相關聯之所有視訊串流介面上的所有端點。 它會調整 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 set,其中已設定位 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 數字窗口組態控件
數字視窗設定 Caps 控制項會指定相機的縮放限制,指定所有可用解析度。 解析度與媒體類型無關,因此兩種媒體類型廣告相同的顯示解析度會合併成一項功能。
由於控制端點的大小限制,此控件最多可以描述 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(ON/OFF)、3(ON/OFF/Auto)]。 此控件必須支援 ON (1)。
GET_MIN和GET_RES要求應報告 0。
SET_CUR要求應將模式設定為 OFF (0)、ON (1) 或 AUTO (2)。
2.2.2.14 幀速率節流控制
此控制項可讓主機軟體指定相機是否支援 Framerate 節流。
此控件僅適用於相機主動串流時。 若要主動串流,表示預覽或記錄釘選必須位於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 |
位移 | 欄位 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | dwMode | 4 | 旗標 | D0: 0 (OFF) 或 1 (ON) D1-D31:保留並設定為 0 |
4 | scaleFactorPercentage | 4 | 數字 | 此值應該在 Min 和 Max 的範圍內,而且應該設定為 [步驟] 值的倍數。 例如:如果 Min = 5、Max = 100 和 Step = 5,且應用程式決定將幀速率降低為原始值的 80%,則此成員值應設定為 80。 藉由適當地設定此值,應用程式可以確定新的幀速率永遠不會超過原始值,也不會移至零,但原始幀速率是可能的。 |
8 | min | 4 | 數字 | 最小值應等於租用時一個步驟大小,或應該是步驟大小的倍數(例如:步驟1、步驟2 等)。 最小值無法設定為 0。 |
12 | max | 4 | 數字 | Max 必須設定為 100,這表示幀速率不會有任何變更。 |
16 | 步 | 4 | 數字 | 步驟應該是 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、Min 設定為預設值最小值、最大值設定為 100,並將步驟設定為預設步驟值。 製造商應該定義 min 和 step 的值,但應遵循上表中所述的指導方針。
GET_ MAX 要求應公告對可用作業模式的支援,並將報告值 1 [ ON |OFF ]。 此控件必須同時支援 ON 和 OFF。 最小值、最大值、步驟和 scaleFactorPercentage 可以設定為預設值。
GET_MIN和GET_RES要求應報告 0。
SET_CUR要求應將模式設定為 OFF(0),ON(1)。 如果 dwMode 設定為 ON,則 scaleFactorPercentage 應該生效。 針對 OFF 和 ON 案例,scaleFactorPercentage 必須有效,如上表所述。
2.2.2.15 檢視 2 組態控件的欄位
View 2 元件的欄位會將支援的對角線檢視度值欄位指定為值的陣列。 所有支援的值都必須在理論最小值和最大值、1 度 - 360 度的範圍內。
如果裝置想要支持連續的檢視字段值,它必須報告所有支援的值。 例如,如果裝置想要從85度 - 60度支援對角線檢視欄位,且步驟大小為1的60度,則此控件必須報告值數組[85, 84, 83, 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 是唯一的檢視欄位值數目。 |
位移 | 欄位 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | dwDefaultFieldOfView | 4 | 數字 | 默認對角線檢視欄位必須是 FieldOfViewValues 陣列中報告的其中一個值。 |
4 | FieldOfViewValues[0] | 4 | 數字 | 第一個檢視欄位值,這必須是最寬的FoV (檢視欄位) 值。 |
4 + 4*(計數-1) | FieldOfViewValues [Count -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要求。
View 值的欄位必須依遞減順序排列,例如,最寬的檢視欄位是第一個,最窄的是最後一個。
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 |
位移 | 欄位 | 大小 | 值 | 描述 |
---|---|---|---|---|
0 | dwValue | 4 | 數字 | 以度為單位的對角線檢視域值。 |
適用下列專案:
GET_LEN要求應回報值為 4。
GET_INFO要求應報告 3。 這個值表示支援GET_CUR和SET_CUR的同步控件。
GET_MIN要求應報告欄位 dwValue 設定為最低支援的檢視欄位值。
GET_RES要求應報告欄位 dwValue set 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 中,使用相機驅動程式的自定義 INF 支援 UVC 的自定義元數據(注意:相機驅動程式可以根據 Windows USBVIDEO.SYS,但指定的硬體需要自定義 INF 才能通過元數據)。 如果 MetadataBufferSizeInKB<PinIndex>
登錄專案存在且非零,則該釘選支援自定義元數據,且值表示用於元數據的緩衝區大小。 欄位 <PinIndex>
會指出視訊釘選索引的 0 型索引。
在 Windows 10 版本 1703 中,數位相機驅動程式可以包含下列 AddReg 專案,以發出 Microsoft 標準格式元數據的支持訊號:
StandardFormatMetadata<PinIndex>
: REG_DWORD: 0x0 (NotSupported) 至 0x1 (支援)
DevProxy 會讀取此登錄機碼,並通知 UVC 驅動程式元數據是標準格式,方法是在 KSSTREAM_METADATA_INFO 結構的 Flags 字段中設定旗標KSSTREAM_METADATA_INFO_FLAG_STANDARDFORMAT。
2.2.3.1 Microsoft Standard 格式元數據
Microsoft 標準格式元數據是下列結構的一或多個實例:
typedef struct tagKSCAMERA_METADATA_ITEMHEADER {
ULONG MetadataId;
ULONG Size; // Size of this header + metadata payload following
} KSCAMERA_METADATA_ITEMHEADER, *PKSCAMERA_METADATA_ITEMHEADER;
MetadataId 欄位會由下列列舉定義的標識碼填入,其中包含定義完善的標識碼和自定義標識元(identifiers >= 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 視訊類別驅動程式框架型承載規格所定義:
Payload 標頭
以下是 Frame 型格式之承載標頭格式的描述。
HLE (標頭長度) 欄位
標頭長度欄位元段會指定標頭的長度,以位元組為單位。
位欄位標頭欄位
FID:框架識別碼
- 此位會在每個畫面開始界限上切換,並維持框架其餘部分的常數。
EOF:框架結尾
- 此位表示視訊畫面的結尾,並設定在屬於框架的最後一個視訊範例中。 此位的使用是一種優化,可減少框架傳輸完成時的延遲,而且是選擇性的。
PTS:簡報時間戳
- 設定時,這個位表示 PTS 欄位是否存在。
SCR:來源時鐘參考
- 設定時,這個位會指出 SCR 欄位是否存在。
RES:保留。
- 請將 設為 0。
STI:仍然影像
- 設定時,這個位會將視訊範例識別為屬於靜止影像。
ERR:錯誤位
- 設定時,這個位表示裝置串流發生錯誤。
EOH:標頭結尾
- 當設定時,這個位表示 BFH 字段的結尾。
PTS:簡報時間戳,大小:4 位元組,值:數位
- 當 PTS 位在 BFH[0] 欄位中設定時,就會顯示 PTS 欄位。 請參閱視訊裝置的USB裝置類別定義中的 一節2.4.3.3
>。
SCR:來源時鐘參考,大小:6 個字節,值:數位
- 當 BFH[0] 字段中設定 SCR 位時,會出現 SCR 欄位。 請參閱視訊裝置的 USB 裝置類別定義中的第 2.4.3.3 節影片和仍然影像承載標頭。
現有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 補償步驟(必須設定其中一個KSCAMERA_EXTENDEDPROP_EVCOMP_XXX步驟旗標),用來傳達 EV 補償值。 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。
WhiteBalance 字段包含擷取框架時套用至感測器的白色平衡,這是 Kelvin 中的值。 這會顯示為對應 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 位的 numerator 值,以及較低 32 位中的分母值。 這會顯示為對應 MF 範例上的屬性MF_CAPTURE_METADATA_SENSORFRAMERATE。
2.2.3.4.2 MetadataId_相機 Extrinsics
此標識子的元數據格式牽涉到標準KSCAMERA_METADATA_ITEMHEADER後面接著位元組數位承載。 承載應該對齊 MF 相機 Extrinsics 結構,後面接著零個或多個 MF 相機 Extrinsic_CalibratedTransform 結構。 承載必須對齊 8 位元組,而且所有未使用的位元組都必須在承載結尾發生,且設定為 0。
2.2.3.4.3 MetadataId_相機 Intrinsics
此標識子的元數據格式牽涉到標準KSCAMERA_METADATA_ITEMHEADER後面接著位元組數位承載。 承載應對齊 MFPinhole 相機 Intrinsics 結構。 承載必須對齊 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.2.9 節中所定義的元數據控制項所報告。