Уведомление о закрытии/переключении конфиденциальности
Некоторые производители камер могут захотеть включить физические ставни или выключатели, которые могут блокировать камеру с помощью физического элемента управления, который не может быть переопределен программным обеспечением. Эти функции не поощряются из-за риска случайной активации и, как следствие, путаницы клиентов, но если они реализованы, они должны следовать указаниям, описанным в разделе Камеры конфиденциальности затворов и выключения переключателей, в том числе сообщать о состоянии затвора или переключателя.
При закрытии затвора или активном переключателе отключения камера по-прежнему полностью работает в Windows и приложениях с помощью существующих API камеры, но изображение или видеопоток будет черным или темным (или заменен статическим изображением, например изображением устройства со стрелкой, указывающей на расположение физического элемента управления). Это создает потенциальные проблемы, из-за которых приложения, обращающиеся к камере, не знают, что камера не включена, и конечные пользователи, которые непреднамеренно активировали физическое управление, могут быть смущены по поводу того, почему их камера не работает должным образом.
Для решения этих проблем камеры, реализующие затворы или выключатели, должны реализовать механизм для обнаружения состояния затвора или переключателя и сообщать о нем операционной системе. В этом разделе содержатся рекомендации для изготовителей оборудования и ODM, которые будут реализовывать этот механизм отчетности, а также описываются элементы управления и структуры, которые разработчики драйверов камер будут использовать для публикации состояния затвора или переключения в ОС.
В дополнение к функции уведомления о закрытии/переключении конфиденциальности ОПЕРАЦИОННая система реализует обнаружение окклюзии камеры, когда передняя камера (FFC) закрывается крышкой устройства, если для действия закрытия переключателя крышки задано значение "Ничего не делать", например компьютер не переходит в спящий режим или не отключается при закрытии крышки. Примером сценария может быть закрепленный ноутбук с внешними мониторами, используемыми при закрытии крышки ноутбука. В некоторых форм-факторах устройства такое поведение не требуется, поэтому ниже описан механизм отказа от обнаружения окклюзии крышки устройства.
Общие сведения об архитектуре
Элемент управления KSPROPERTY_CAMERACONTROL_PRIVACY используется, когда ОС запрашивает текущее состояние из драйвера камеры. Его следует использовать только в качестве свойства Get. Разработчики драйверов не должны поддерживать свойство Set KSPROPERTY_CAMERACONTROL_PRIVACY в своих драйверах.
Примечание
Камеры, реализующие затворы конфиденциальности или переключатели блокировки, должны соответствовать требованиям, описанным в разделе О конфиденциальности камеры и выключатели.
В драйвере USB Video Class (UVC) элемент управления KSPROPERTY_CAMERACONTROL_PRIVACY сопоставляется со свойством CT_PRIVACY_CONTROL , определенным в спецификации класса UVC версии 1.5.
В дополнение к использованию существующего элемента управления KSPROPERTY, KSPROPERTY_CAMERACONTROL_PRIVACY, добавлен новый поток вызовов KSEVENT, чтобы драйвер камеры может сигнализировать при изменении состояния конфиденциальности затвора/переключателя камеры, если для этого KSEVENT регистрируются клиенты.
KSEVENT выдается с использованием того же идентификатора GUID и идентификатора Set, что и KSPROPERTY.
Чтобы уточнить, что показано на приведенной выше схеме, ОС ожидает, что драйвер AVS реализует механизм, если разработчик драйвера решит поддерживать эту функцию, чтобы получать и прослушивать изменения состояния, создаваемые датчиком затвора. ОС запрашивает состояние с помощью метода получения KSPROPERTY и выдает ожидающий KSEVENT , который драйвер будет сигнализировать при изменении состояния затвора. Изменение состояния затвора или переключателя не должно препятствовать работе камеры, например, чтобы вызвать ошибку.
ПРИМЕЧАНИЕ: Если драйвер AVS поддерживает эту функцию, а базовое оборудование — нет, драйвер AVS возвращает ошибку "Не поддерживается", когда ОС выдает регистрацию KSEVENT .
Методы зондирования и отчетности
Некоторые камеры чувствуют состояние затвора с помощью алгоритма анализа пикселей, работающего в встроенном ПО обработчика сигналов изображений (ISP). Это накладывает ограничения на те камеры, которые камера должна быть активно потоковой, чтобы чувствовать и сообщать о состоянии затвора. Дополнительные сведения о том, когда и как камера должна сообщать о состоянии затвора или переключателя, см. в статье Отслеживание состояния затвора и отчеты о нем.
Аналогичным образом разработчики приложений, использующие сигнал окклюзии камеры, не должны использовать сообщаемое состояние затвора, если только камера не выполняет активную потоковую передачу. Дополнительные сведения см. в разделе Класс CameraOcclusionInfo .
KSPROPERTY
Сводная таблица использования (KSPROPERTY)
Get | Set | Целевой объект | Тип дескриптора свойства | Тип значения свойства |
---|---|---|---|---|
Да | Нет | Фильтр | 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 |
Flags | Игнорируется, задано значение 0 |
Capabilities | Игнорируется, задано значение 0 |
KSEVENT
Сводная таблица использования (KSEVENT)
Get | Set | Целевой объект | Тип дескриптора события | Тип значения события |
---|---|---|---|---|
Нет | Да | Фильтр | KSEVENT | KSEVENTDATA |
Структура KSEVENT должна быть заполнена следующим образом:
Элемент структуры | Значение |
---|---|
Set | Должен быть PROPSETID_VIDCAP_CAMERACONTROL |
Id | Должен быть KSPROPERTY_CAMERACONTROL_PRIVACY |
Flags | KSEVENT_TYPE_ENABLE |
Структура KSEVENTDATA должна быть заполнена следующим образом:
Элемент структуры | Значение |
---|---|
NotificationType | Должен быть KSEVENTF_EVENT_HANDLE |
Отказ от обнаружения окклюзии крышки устройства
Чтобы отказаться от обнаружения окклюзии крышки устройства, изготовители оборудования могут определить следующий ключ свойства устройства:
DEVPROPKEY
DEVPROPGUID = {3AB8560B-EFCF-43C1-A7EC-130E46857AF4}
DEVPROPID = 2
DEVPROPTYPE = DEVPROP_TYPE_UINT32
PropertyBuffer = (ULONG) 1
PropertyBufferSize = sizeof(ULONG)
Примечание
Задание значения PropertyBuffer равным 0 аналогично определению ключа свойства устройства вообще.
Ключ свойства устройства можно предоставить либо в INF-файле драйвера с помощью AddProperty , либо с помощью дескриптора ОС MS, если INF-файл отсутствует, например USB-камера с драйвером камеры для папки "Входящие" UVC.
Пример INF AddProperty
[OptOutLidOcclusionSampleAddPropertySection]
{3AB8560B-EFCF-43C1-A7EC-130E46857AF4},2,7,,1
Пример дескриптора ОС MS
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)
};