개인 정보 셔터/스위치 알림
일부 카메라 제조업체는 소프트웨어로 재정의할 수 없는 물리적 컨트롤을 사용하여 카메라를 차단할 수 있는 물리적 셔터 또는 킬 스위치를 포함하려고 할 수 있습니다. 이러한 기능은 의도하지 않은 활성화 및 이로 인한 고객 혼란의 위험으로 인해 권장되지 않지만 구현되는 경우 셔터/스위치의 상태를 보고하는 것을 포함하여 카메라 개인 정보 보호 셔터 및 킬 스위치에 설명된 지침을 따라야 합니다.
셔터가 닫히거나 킬 스위치가 활성화된 경우 카메라는 기존 카메라 API를 사용하여 Windows 및 애플리케이션에 계속 완벽하게 작동하지만 이미지 또는 비디오 스트림은 검은색 또는 어둡게(또는 물리적 컨트롤의 위치를 가리키는 화살표가 있는 디바이스 그림과 같은 정적 이미지로 대체됨). 이렇게 하면 카메라에 액세스하는 애플리케이션이 카메라가 가려진 것을 인식하지 못하고 실수로 물리적 컨트롤을 활성화한 최종 사용자가 카메라가 예상대로 작동하지 않는 이유에 대해 혼동할 수 있는 잠재적인 문제가 발생합니다.
이러한 문제를 해결하려면 셔터 또는 킬 스위치를 구현하는 카메라는 셔터/스위치의 상태를 감지하고 운영 체제에 보고하는 메커니즘을 구현해야 합니다. 이 항목에서는 이 보고 메커니즘을 구현할 OEM 및 ODM에 대한 지침을 제공하고 카메라 드라이버 개발자가 OS에 셔터/스위치 상태를 게시하는 데 사용할 컨트롤과 구조에 대해서도 설명합니다.
개인 정보 보호 셔터/스위치 알림 기능 외에도 OS는 뚜껑 스위치 닫기 작업이 "Do Nothing"으로 설정된 경우 디바이스 덮개에 의해 FFC(전면 카메라)가 가려지는 카메라 폐색 감지를 구현합니다. 예를 들어 뚜껑이 닫히면 컴퓨터가 절전 모드로 전환되거나 전원이 꺼지지 않습니다. 예를 들어 노트북 덮개를 닫는 동안 외부 모니터가 사용 중인 도킹된 랩톱이 예제 시나리오일 수 있습니다. 이 동작을 원하지 않는 일부 디바이스 폼 팩터가 있을 수 있으므로 디바이스 뚜껑 폐색 검색을 옵트아웃하는 메커니즘이 아래에 정의되어 있습니다.
아키텍처 개요
KSPROPERTY_CAMERACONTROL_PRIVACY 컨트롤은 OS가 카메라 드라이버에서 현재 상태를 쿼리할 때 사용됩니다. Get 속성으로만 사용해야 합니다. 드라이버 개발자는 드라이버에서 KSPROPERTY_CAMERACONTROL_PRIVACY 컨트롤 Set 속성을 지원하지 않아야 합니다.
참고
개인 정보 보호 셔터 또는 킬 스위치를 구현하는 카메라는 카메라 개인 정보 보호 셔터 및 킬 스위치에 설명된 요구 사항을 준수해야 합니다.
USB UVC(비디오 클래스) 드라이버에서 KSPROPERTY_CAMERACONTROL_PRIVACY 컨트롤은 UVC v1.5 클래스 사양에 정의된 CT_PRIVACY_CONTROL 속성에 매핑됩니다.
KSPROPERTY_CAMERACONTROL_PRIVACY 기존 KSPROPERTY 컨트롤을 사용하는 것 외에도 새로운 KSEVENT 호출 흐름이 도입되어 카메라 드라이버가 해당 KSEVENT에 등록하는 클라이언트가 있는 경우 카메라의 개인 정보 보호 셔터/스위치 상태가 변경될 때 신호를 보낼 수 있습니다.
KSEVENT는 KSPROPERTY에서 사용하는 것과 동일한 GUID 및 ID 설정을 사용하여 발급됩니다.
위의 다이어그램에 표시된 내용을 명확히 하기 위해 OS는 드라이버 개발자가 이 기능을 지원하기로 선택한 경우 AVS 드라이버가 메커니즘을 구현하여 셔터 센서가 생성하는 상태 변경을 가져와서 수신 대기할 것으로 예상합니다. OS는 KSPROPERTY get 메서드를 통해 상태를 쿼리하고 셔터 상태가 변경될 때 드라이버가 신호를 보낼 대기 KSEVENT 를 실행합니다. 예를 들어 셔터/스위치 상태 변경으로 인해 카메라가 작동하여 오류가 발생하는 것을 방지해서는 안됩니다.
참고: AVS 드라이버가 이 기능을 지원하지만 기본 하드웨어가 지원하지 않는 경우 OS에서 KSEVENT 등록을 발급할 때 AVS 드라이버는 지원되지 않는 오류를 반환해야 합니다.
감지 및 보고 방법
일부 카메라는 ISP(Image Signal Processor) 펌웨어에서 실행되는 픽셀 분석 알고리즘을 사용하여 셔터 상태를 감지합니다. 이렇게 하면 셔터 상태를 감지하고 보고하기 위해 카메라가 적극적으로 스트리밍되어야 하는 카메라에 제한이 적용됩니다. 카메라가 셔터 /스위치 상태를 보고해야 하는 시기와 방법에 대한 자세한 내용은 셔터 상태 감지 및 보고를 참조하세요.
마찬가지로 카메라 폐색 신호를 활용하는 애플리케이션 개발자는 카메라가 적극적으로 스트리밍되지 않는 한 보고된 셔터 상태를 활용해서는 안 됩니다. 자세한 내용은 CameraOcclusionInfo 클래스 를 참조하세요.
KSPROPERTY
사용량 요약 테이블(KSPROPERTY)
가져오기 | 설정 | 대상 | 속성 설명자 형식 | 속성 값 형식 |
---|---|---|---|---|
Yes | 아니요 | 필터 | 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)
가져오기 | 설정 | 대상 | 이벤트 설명자 유형 | 이벤트 값 형식 |
---|---|---|---|---|
예 | 예 | 필터 | KSEVENT | KSEVENTDATA |
KSEVENT 구조체는 다음과 같이 채워야 합니다.
구조체 멤버 | 값 |
---|---|
설정 | PROPSETID_VIDCAP_CAMERACONTROL |
ID | KSPROPERTY_CAMERACONTROL_PRIVACY |
플래그 | KSEVENT_TYPE_ENABLE |
KSEVENTDATA 구조체는 다음과 같이 채워야 합니다.
구조체 멤버 | 값 |
---|---|
NotificationType | KSEVENTF_EVENT_HANDLE |
디바이스 뚜껑 폐색 검색 옵트아웃
디바이스 덮개 폐색 검색을 옵트아웃하기 위해 OEM은 다음 디바이스 속성 키를 정의할 수 있습니다.
DEVPROPKEY
DEVPROPGUID = {3AB8560B-EFCF-43C1-A7EC-130E46857AF4}
DEVPROPID = 2
DEVPROPTYPE = DEVPROP_TYPE_UINT32
PropertyBuffer = (ULONG) 1
PropertyBufferSize = sizeof(ULONG)
참고
PropertyBuffer 값을 0으로 설정하는 것은 디바이스 속성 키를 전혀 정의하지 않는 것과 같습니다.
디바이스 속성 키는 AddProperty 를 사용하거나 INF 파일이 없는 경우 MS OS 설명자를 사용하여 드라이버 INF 파일에서 제공할 수 있습니다(예: 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)
};