Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Некоторые производители камер могут захотеть включить физические затворы или килл-свитчи, которые могут блокировать камеру с помощью физического управления, не поддающегося управлению программным обеспечением. Эти функции не рекомендованы из-за риска непреднамеренной активации и возникновения путаницы у клиентов, но если они реализованы, они должны следовать руководству, описанному в разделе затворы конфиденциальности камеры и выключатели аварийного отключения, включая отчёт о состоянии затвора или коммутатора.
При закрытой шторке или активированном аварийном выключателе камера продолжает полностью функционировать в Windows и приложениях через существующие API камеры, но изображение или видеопоток будут черными или темными (или заменяются статичным изображением, например, изображением устройства со стрелкой, указывающей на расположение физического элемента управления). Это приводит к потенциальным проблемам, когда приложения, обращающиеся к камере, не знают, что камера закрыта, и конечные пользователи, которые непреднамеренно активировали физическую кнопку, могут быть удивлены тем, почему их камера не работает как ожидалось.
Чтобы устранить эти проблемы, камеры, оснащённые затворами или выключателями, должны реализовать механизм для обнаружения состояния затвора или выключателя и сообщать о нём операционной системе. В этом разделе содержатся рекомендации по OEM и ODM, которые будут реализовывать этот механизм отчетности, а также описываются элементы управления и структуры, которые разработчики драйверов камеры будут использовать для публикации состояния затвора и переключателя в ОС.
Помимо функции уведомления о закрытии/переключении для обеспечения конфиденциальности, ОС реализует обнаружение окклюзии камеры, когда фронтальная камера (FFC) закрыта крышкой устройства и к переключателю закрытия крышки установлено значение "Do Nothing", например, компьютер не будет переходить в спящий режим или отключаться при закрытии крышки. Пример сценария может быть закрепленным ноутбуком с внешними мониторами, используемыми при закрытии крышки ноутбука. На некоторых устройствах это поведение может быть нежелательным, поэтому ниже определен механизм отказа от обнаружения закрытия крышки устройства.
Обзор архитектуры
Элемент управления KSPROPERTY_CAMERACONTROL_PRIVACY используется, когда операционная система запрашивает текущее состояние у драйвера камеры. Его следует использовать только в качестве свойства Get. Разработчики драйверов не должны поддерживать свойство управления KSPROPERTY_CAMERACONTROL_PRIVACY в своих драйверах.
Замечание
Камеры с затворами конфиденциальности или переключателями отключения должны соответствовать требованиям, описанным в затворах конфиденциальности и переключателях отключения камер.
В драйвере класса ВИДЕО USB (UVC) элемент управления KSPROPERTY_CAMERACONTROL_PRIVACY сопоставляется со свойством CT_PRIVACY_CONTROL , определенным в спецификации класса UVC версии 1.5.
Помимо использования существующего элемента управления KSPROPERTYKSPROPERTY_CAMERACONTROL_PRIVACY, введен новый поток вызовов KSEVENT, так что драйвер камеры может сигнализировать, когда состояние шторки/переключателя конфиденциальности камеры изменяется, если клиенты регистрируются для этого KSEVENT.
KSEVENT выдается с использованием того же набора GUID и Id, что и KSPROPERTY.
Чтобы уточнить, что показано на приведенной выше схеме, ОС ожидает, что драйвер AVS реализует механизм, если разработчик драйвера выбирает поддержку этой функции, чтобы получить и прослушивать изменения состояния, создаваемые датчиком затвора. ОС запрашивает состояние с помощью метода KSPROPERTY и инициирует ожидание события KSEVENT, которое драйвер будет сигнализировать при изменении состояния затвора. Изменение состояния затвора или переключателя не должно препятствовать функционированию камеры и приводить к ошибке.
ЗАМЕТКА: Если драйвер AVS поддерживает эту функцию, но базовое оборудование её не поддерживает, драйвер AVS должен возвращать ошибку "не поддерживается" при выдаче регистрацией KSEVENT операционной системой.
Методы распознавания и создания отчетов
Некоторые камеры чувствуют состояние затвора с помощью алгоритма анализа пикселей, работающего в встроенном ПО обработчика сигналов изображений (ISP). Это накладывает ограничение на те камеры, которые должны активно вести потоковую передачу, чтобы определить и сообщить о состоянии затвора. Для получения более детальной информации о том, когда и как камера должна сообщать о состоянии затвора или переключателя, см. раздел Определение и отчет состояния затвора.
Аналогичным образом разработчики приложений, использующие сигнал окклюзии камеры, не должны использовать сообщаемое состояние затвора, если камера не ведет активную трансляцию. Дополнительные сведения см. в классе CameraOcclusionInfo .
KSPROPERTY
Сводная таблица использования (KSPROPERTY)
| Get | Установить | Цель | Тип дескриптора свойства | Тип значения свойства |
|---|---|---|---|---|
| Да | нет | Фильтр | KSPROPERTY_CAMERACONTROL_S | ДЛИННЫЙ |
Значение свойства (данные операции) — это LONG, указывающее, включен или отключен режим конфиденциальности:
Значение 0 указывает на то, что датчик камеры может записывать изображения видео
Значение 1 указывает, что датчик камеры не может записывать видео изображения
Структура KSPROPERTY_CAMERA_CONTROL_S должна быть заполнена следующим образом:
| Элемент структуры | Ценность |
|---|---|
| KSPROPERTY.Set | Должен быть PROPSETID_VIDCAP_CAMERACONTROL |
| KSPROPERTY.Id | Должно быть KSPROPERTY_CAMERACONTROL_PRIVACY |
| KSPROPERTY Флаги | Должно быть KSPROPERTY_TYPE_GET |
| Ценность | Инициализация до 0 |
| Флаги | Игнорируется, установите на 0 |
| Возможности | Пропущено, установите значение 0 |
KSEVENT
Сводная таблица использования (KSEVENT)
| Get | Установить | Цель | Тип дескриптора события | Тип значения события |
|---|---|---|---|---|
| нет | Да | Фильтр | KSEVENT | KSEVENTDATA |
Структура KSEVENT должна быть заполнена следующим образом:
| Элемент структуры | Ценность |
|---|---|
| Установить | Должно быть PROPSETID_VIDCAP_CAMERACONTROL |
| Id | Должно быть KSPROPERTY_CAMERACONTROL_PRIVACY |
| Флаги | KSEVENT_TYPE_ENABLE |
Структура KSEVENTDATA должна быть заполнена следующим образом:
| Элемент структуры | Ценность |
|---|---|
| ТипУведомления | Должно быть 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 — это то же самое, что и неопределение ключа свойства устройства вовсе.
Ключ свойства устройства можно указать в 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)
};