隱私權快門/切換通知
某些相機製造商可能會想要包含實體快門或終止開關,以使用無法由軟體覆寫的實體控件來封鎖相機。 由於不小心啟用和造成客戶混淆的風險,因此不建議使用這些功能,但如果實作,則必須遵循 相機隱私權快門和終止開關中所述的指引,包括報告快門/開關的狀態。
當關閉或終止開關處於作用中狀態時,相機會繼續使用現有的相機 API 對 Windows 和應用程式完全正常運作,但影像或視訊串流會是黑色或深色 (或取代為靜態影像,例如裝置的圖片,其箭號指向實體控件的位置) 。 這會引發可能的問題:存取相機的應用程式不知道相機已遮蔽,而不小心啟用實體控件的使用者可能會混淆其相機未如預期般運作的原因。
若要解決這些疑慮,實作快門或終止開關的相機必須實作機制來偵測快門/開關的狀態,並將其回報給操作系統。 本主題提供將實作此報告機制之 OEM 和 ODM 的指引,也說明數位相機驅動程式開發人員將用來將快門/切換狀態發佈至 OS 的控件和結構。
除了隱私權快門/切換通知功能之外,OS 還會實作相機遮蔽偵測,例如,當蓋子 關閉動作 設定為 [不執行任何動作] 時,裝置會遮蔽 FFC (FFC) 的相機遮蔽。例如,當蓋子關閉時,計算機將不會進入睡眠或關閉電源。 範例案例可能是停駐膝上型計算機,並在膝上型電腦關閉時使用外部監視器。 可能會有一些裝置尺寸規格不想要此行為,因此,以下定義退出裝置 liclusion 偵測的機制。
架構概觀
當操作系統從相機驅動程序查詢目前狀態時,會使用 KSPROPERTY_CAMERACONTROL_PRIVACY 控件。 它應該只做為 Get 屬性使用。 驅動程式開發人員不得在其驅動程式中支援 KSPROPERTY_CAMERACONTROL_PRIVACY 控件 Set 屬性。
注意
實作隱私權快門或終止開關的相機必須符合 相機隱私權快門和終止開關中所述的需求。
在 USB 視訊類別 (UVC) 驅動程式中,KSPROPERTY_CAMERACONTROL_PRIVACY控件會對應至 UVC v1.5 類別規格中定義的 CT_PRIVACY_CONTROL 属性。
除了使用現有的 KSPROPERTY 控件 ,KSPROPERTY_CAMERACONTROL_PRIVACY引進新的 KSEVENT 呼叫流程,因此如果有用戶端註冊該 KSEVENT,數位相機驅動程式可以在相機的隱私權快門/切換狀態變更時發出訊號。
KSEVENT 是使用與 KSPROPERTY 相同的 Set GUID 和 Id 發出。
為了釐清上圖所示的內容,OS 預期 AVS 驅動程式會實作機制,如果驅動程式開發人員選擇支援這項功能,以取得和接聽快門感測器正在產生的狀態變更。 OS 會透過 KSPROPERTY get 方法查詢狀態,並發出等候 KSEVENT ,讓驅動程式在快門狀態變更時發出訊號。 快門/切換狀態變更不得防止相機運作,例如,造成錯誤狀況。
注意: 如果 AVS 驅動程式支援此功能,但基礎硬體沒有,當 OS 發出 KSEVENT 註冊時,AVS 驅動程式應該傳回不支援的錯誤。
感測器和報告方法
有些相機使用影像訊號處理器中執行的圖元分析演算法來感知快門狀態, (ISP) 韌體。 這會對相機強制限制,相機必須主動串流以感知並報告快門狀態。 如需相機何時及如何報告其快門/切換狀態的詳細資訊,請參閱 快門狀態檢測和報告 。
同樣地,除非相機主動串流,否則使用相機遮蔽訊號的應用程式開發人員不得利用回報的快門狀態。 如需詳細資訊,請參閱 CameraOcclusionInfo 類別 。
KSPROPERTY
使用量摘要數據表 (KSPROPERTY)
Get | 設定 | 目標 | 屬性描述項類型 | 屬性值類型 |
---|---|---|---|---|
是 | No | 篩選 | KSPROPERTY_CAMERACONTROL_S | LONG |
(作業數據) 屬性值是 LONG,指定是否啟用或停用隱私權模式:
值為 0 表示相機感測器可以擷取視訊影像
值為 1 表示相機感測器無法擷取視訊影像
KSPROPERTY_CAMERA_CONTROL_S 結構必須填滿,如下所示:
結構成員 | 值 |
---|---|
KSPROPERTY。設置 | 必須是 PROPSETID_VIDCAP_CAMERACONTROL |
KSPROPERTY.Id | 必須是 KSPROPERTY_CAMERACONTROL_PRIVACY |
KSPROPERTY。標誌 | 必須是 KSPROPERTY_TYPE_GET |
值 | 初始化為 0 |
旗標 | 忽略,設定為 0 |
Capabilities | 忽略,設定為 0 |
KSEVENT
使用摘要數據表 (KSEVENT)
Get | 設定 | 目標 | 事件描述項類型 | 事件值類型 |
---|---|---|---|---|
No | Yes | 篩選 | KSEVENT | KSEVENTDATA |
KSEVENT 結構必須填滿,如下所示:
結構成員 | 值 |
---|---|
設定 | 必須是 PROPSETID_VIDCAP_CAMERACONTROL |
Id | 必須是 KSPROPERTY_CAMERACONTROL_PRIVACY |
旗標 | KSEVENT_TYPE_ENABLE |
KSEVENTDATA 結構必須填入,如下所示:
結構成員 | 值 |
---|---|
NotificationType | 必須是 KSEVENTF_EVENT_HANDLE |
退出退出裝置 liclusion 偵測
若要退出宣告裝置 liclusion 偵測,OEM 可以定義下列裝置屬性密鑰:
DEVPROPKEY
DEVPROPGUID = {3AB8560B-EFCF-43C1-A7EC-130E46857AF4}
DEVPROPID = 2
DEVPROPTYPE = DEVPROP_TYPE_UINT32
PropertyBuffer = (ULONG) 1
PropertyBufferSize = sizeof(ULONG)
注意
將 PropertyBuffer 值設定為 0,與完全未定義裝置屬性密鑰相同。
您可以使用 AddProperty ,或使用 MS OS 描述元在驅動程式 INF 檔案中提供 Device Property Key,例如,使用 UVC 收件匣相機相機驅動程式的 USB 相機。
INF AddProperty 範例
[OptOutLidOcclusionSampleAddPropertySection]
{3AB8560B-EFCF-43C1-A7EC-130E46857AF4},2,7,,1
MS OS 描述項範例
UCHAR Example2_MSOS20DescriptorSet_UVCDevicePropertyKeyForLidOcclusionOptOut[0x76] =
{
//
// Microsoft OS 2.0 Descriptor Set Header
//
0x0A, 0x00, // wLength of MSOS20_SET_HEADER_DESCRIPTOR (10 bytes)
0x00, 0x00, // wDescriptorType MSOS20_SET_HEADER_DESCRIPTOR
0x00, 0x00, 0x00, 0x0A, // dwWindowsVersion – 0x10000000 for Windows 10
0x76, 0x00, // wTotalLength – 0x76(118) bytes
//
// Microsoft OS 2.0 Registry Value Feature Descriptor
//
0x6C, 0x00, // wLength - 0x6C(108) bytes
0x04, 0x00, // wDescriptorType – MSOS20_FEATURE_REG_PROPERTY
0x04, 0x00, // wPropertyDataType - 4 for REG_DWORD_LITTLE_ENDIAN
0x5E, 0x00, // wPropertyNameLength – 0x5E(94) bytes
'D', 0x00, 'K', 0x00, // Property Name – DKEY-{3AB8560B-EFCF-43C1-A7EC-130E46857AF4},2
'E', 0x00, 'Y', 0x00,
'-', 0x00, '{', 0x00,
'3', 0x00, 'A', 0x00,
'B', 0x00, '8', 0x00,
'5', 0x00, '6', 0x00,
'0', 0x00, 'B', 0x00,
'-', 0x00, 'E', 0x00,
'F', 0x00, 'C', 0x00,
'F', 0x00, '-', 0x00,
'4', 0x00, '3', 0x00,
'C', 0x00, '1', 0x00,
'-', 0x00, 'A', 0x00,
'7', 0x00, 'E', 0x00,
'C', 0x00, '-', 0x00,
'1', 0x00, '3', 0x00,
'0', 0x00, 'E', 0x00,
'4', 0x00, '6', 0x00,
'8', 0x00, '5', 0x00,
'7', 0x00, 'A', 0x00,
'F', 0x00, '4', 0x00,
'}', 0x00, ',', 0x00,
'2', 0x00, 0x00, 0x00,
0x00, 0x00,
0x04, 0x00, // wPropertyDataLength – 4 bytes
0x01, 0x00, 0x00, 0x00 // PropertyData – 0x00000001 (1)
};