プライバシー シャッター/スイッチ通知
一部のカメラメーカーは、ソフトウェアでオーバーライドできない物理的なコントロールを使用してカメラをブロックできる物理的なシャッターやキルスイッチを含めたい場合があります。 これらの機能は、不注意によるアクティブ化のリスクや顧客の混乱のリスクのために推奨されませんが、実装されている場合は、シャッター/スイッチの状態を報告するなど、カメラ プライバシー シャッターとキル スイッチに関するページに記載されているガイダンスに従う必要があります。
シャッターが閉じているか、キル スイッチがアクティブな場合、カメラは Windows や既存のカメラ API を使用するアプリケーションで引き続き完全に機能しますが、画像またはビデオ ストリームは黒または暗くなります (または、物理的なコントロールの場所を指す矢印が付いたデバイスの画像などの静的な画像に置き換えられます)。 これにより、カメラにアクセスしているアプリケーションがカメラが隠されていることを認識せず、物理コントロールを誤ってアクティブ化したエンド ユーザーが、カメラが期待どおりに動作しない理由について混乱する可能性という潜在的な問題が発生します。
これらの問題に対処するには、シャッターまたはキル スイッチを実装するカメラに、シャッター/スイッチの状態を検出してオペレーティング システムに報告するメカニズムを実装する必要があります。 このトピックでは、このレポート メカニズムを実装する OEM と ODM に関するガイダンスを提供します。また、カメラ ドライバー開発者がシャッター/スイッチの状態を OS に公開するために使用するコントロールと構造についても説明します。
プライバシーシャッター/スイッチ通知機能に加えて、OS は、カバーを閉じたときの切り替え操作が「何もしない」に設定されている場合に、前面カメラ (FFC) がデバイスのカバーに遮られることを検出するカメラ オクルージョン検出機能を実装しています。たとえば、コンピューターはカバーが閉じられてもスリープ状態にならず、電源もオフになりません。 たとえば、ノート PC のカバーが閉じられているときに、外部モニターが使用されている接続されたノート PC が考えられます。 この動作が望まれていないデバイス フォーム ファクターが存在する可能性があるため、デバイス カバーのオクルージョン検出をオプトアウトするメカニズムを以下に定義します。
アーキテクチャの概要
KSPROPERTY_CAMERACONTROL_PRIVACY コントロールは、OS がカメラ ドライバーから現在の状態を照会するときに使用されます。 Get プロパティとしてのみ使用する必要があります。 ドライバー開発者は、ドライバーの KSPROPERTY_CAMERACONTROL_PRIVACY コントロール Set プロパティをサポートする必要はありません。
Note
プライバシーシャッターやキルスイッチを実装しているカメラは、カメラのプライバシーシャッターとキルスイッチに記載されている要件に準拠している必要があります。
USB Video Class (UVC) ドライバでは、KSPROPERTY_CAMERACONTROL_PRIVACYコントロールは、UVC v1.5 Class Specificationで定義されている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 Class を参照してください。
KSPROPERTY
使用状況の概要テーブル (KSPROPERTY)
Get | Set | 移行先 | プロパティ記述子の種類 | プロパティ値の種類 |
---|---|---|---|---|
はい | いいえ | フィルター | KSPROPERTY_CAMERACONTROL_S | LONG |
プロパティ値 (操作データ) は、プライバシー モードを有効にするか無効にするかを指定する LONG です。
値 0 は、カメラ センサーがビデオ画像をキャプチャできることを示します
値 1 は、カメラ センサーがビデオ 画像をキャプチャできないようにすることを示します
KSPROPERTY_CAMERA_CONTROL_S構造体は、次のように入力する必要があります。
構造体のメンバー | Value |
---|---|
KSPROPERTY.Set | PROPSETID_VIDCAP_CAMERACONTROL である必要があります |
KSPROPERTY.Id | KSPROPERTY_CAMERACONTROL_PRIVACY である必要があります |
KSPROPERTY.Flags | KSPROPERTY_TYPE_GET である必要があります |
Value | 0 に初期化する |
フラグ | 無視、0 に設定 |
Capabilities | 無視、0 に設定 |
KSEVENT
使用状況の概要テーブル (KSEVENT)
Get | Set | 移行先 | イベント記述子の型 | イベント値の型 |
---|---|---|---|---|
いいえ | はい | Assert | KSEVENT | KSEVENTDATA |
KSEVENT 構造体は、次のように入力する必要があります。
構造体のメンバー | Value |
---|---|
Set | PROPSETID_VIDCAP_CAMERACONTROL である必要があります |
Id | KSPROPERTY_CAMERACONTROL_PRIVACY である必要があります |
フラグ | KSEVENT_TYPE_ENABLE |
KSEVENTDATA 構造体は、次のように入力する必要があります。
構造体のメンバー | Value |
---|---|
NotificationType | KSEVENTF_EVENT_HANDLE である必要があります |
デバイス カバーのオクルージョン検出のオプトアウト
デバイス カバーのオクルージョン検出をオプトアウトするために、OEM は次のデバイス プロパティ キーを定義できます。
DEVPROPKEY
DEVPROPGUID = {3AB8560B-EFCF-43C1-A7EC-130E46857AF4}
DEVPROPID = 2
DEVPROPTYPE = DEVPROP_TYPE_UINT32
PropertyBuffer = (ULONG) 1
PropertyBufferSize = sizeof(ULONG)
Note
PropertyBuffer 値を 0 に設定することは、デバイス プロパティ キーをまったく定義しない場合と同じです。
デバイス プロパティ キーは、AddProperty を使用してドライバー INF ファイル内で提供することも、UVC 受信トレイ カメラ ドライバーを使用する USB カメラなどの INF ファイルがない場合は MS OS 記述子を使用して提供することもできます。
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)
};