Notificación de cambio o obturador de privacidad
Algunos fabricantes de cámaras pueden querer incluir obturadores físicos o interruptores de eliminación que pueden bloquear la cámara mediante un control físico no se puede invalidar por software. Estas características no se animan debido al riesgo de activación involuntaria y confusión resultante del cliente, pero si se implementan, deben seguir las instrucciones descritas en Obturadores de privacidad de la cámara y interruptores de eliminación, incluido para notificar el estado del obturador o conmutador.
Cuando un obturador está cerrado o un conmutador de eliminación está activo, la cámara sigue siendo totalmente funcional para Windows y las aplicaciones que usan las API de cámara existentes, pero la secuencia de imagen o vídeo será negra o oscura (o se reemplazará por una imagen estática, como una imagen del dispositivo con una flecha que apunte a la ubicación del control físico). Esto provoca posibles problemas en los que las aplicaciones que acceden a la cámara no son conscientes de que la cámara está ocluida, y los usuarios finales que activaron involuntariamente el control físico pueden confundirse sobre por qué su cámara no funciona según lo esperado.
Para solucionar estos problemas, las cámaras que implementan obturadores o interruptores de eliminación deben implementar un mecanismo para detectar el estado del obturador o conmutador y notificarlo al sistema operativo. En este tema se proporcionan instrucciones para los OEM y los OEM que implementarán este mecanismo de informes y también se describen los controles y estructuras que los desarrolladores de controladores de cámara usarán para publicar el estado del obturador o conmutador en el sistema operativo.
Además de la característica de notificación del obturador o conmutador de privacidad, el sistema operativo implementa la detección de oclusión de la cámara en la que el dispositivo oculta una cámara frontal (FFC) cuando la acción de cierre del conmutador de tapa está establecida en "No hacer nada", por ejemplo, un equipo no irá a suspensión o apagado cuando se cierre la tapa. Un escenario de ejemplo podría ser un portátil acoplado con monitores externos en uso mientras la tapa del portátil está cerrada. Puede haber algunos factores de forma de dispositivo en los que no se desee este comportamiento; por lo tanto, se define un mecanismo para no participar en la detección de oclusión de la tapa del dispositivo.
Introducción a la arquitectura
El control KSPROPERTY_CAMERACONTROL_PRIVACY se usa cuando el sistema operativo consulta el estado actual desde un controlador de cámara. Solo debe usarse como una propiedad Get. Los desarrolladores de controladores no deben admitir la propiedad Set de control KSPROPERTY_CAMERACONTROL_PRIVACY en sus controladores.
Nota
Las cámaras que implementan persianas de privacidad o interruptores de eliminación deben cumplir los requisitos descritos en Obturadores de privacidad de la cámara y interruptores de eliminación.
En el controlador USB Video Class (UVC), el control KSPROPERTY_CAMERACONTROL_PRIVACY se asigna a la propiedad CT_PRIVACY_CONTROL definida en la especificación de clase UVC v1.5.
Además del uso del control KSPROPERTY existente, KSPROPERTY_CAMERACONTROL_PRIVACY, se introduce un nuevo flujo de llamadas KSEVENT para que el controlador de cámara pueda indicar cuándo cambia el estado de cambio o obturación de privacidad de la cámara si hay clientes que se registran para ese KSEVENT.
El KSEVENT se emite mediante el mismo GUID de establecimiento e identificador que el KSPROPERTY está usando.
Para aclarar lo que se muestra en el diagrama anterior, el sistema operativo espera que el controlador AVS implemente el mecanismo, si el desarrollador del controlador decide admitir esta característica, para obtener y escuchar los cambios de estado que está generando el sensor de obturador. El sistema operativo consulta el estado a través del método get KSPROPERTY y emite un KSEVENT en espera que el controlador señale cuando cambie el estado del obturador. El cambio de estado del obturador o conmutador no debe impedir que la cámara funcione, por ejemplo, para provocar una situación de error.
NOTA: Si el controlador AVS admite esta característica, pero el hardware subyacente no lo hace, el controlador AVS no devolverá el error admitido cuando el sistema operativo emite el registro de KSEVENT .
Métodos de detección e informes
Algunas cámaras detectan el estado del obturador mediante un algoritmo de análisis de píxeles que se ejecuta en el firmware del procesador de señal de imagen (ISP). Esto impone una limitación en las cámaras que la cámara debe estar transmitiendo activamente para detectar e informar del estado del obturador. Consulta Detección de estado del obturador e informes para obtener más detalles sobre cuándo y cómo la cámara debe notificar su estado de obturación o conmutador.
Del mismo modo, los desarrolladores de aplicaciones que usan la señal de oclusión de la cámara no deben utilizar el estado de obturación notificado a menos que la cámara esté transmitiendo activamente. Consulte CameraOcclusionInfo (Clase) para obtener más detalles.
KSPROPERTY
Tabla de resumen de uso (KSPROPERTY)
Get | Establecimiento | Target | Tipo de descriptor de propiedad | Tipo de valor de propiedad |
---|---|---|---|---|
Sí | No | Filtrar | KSPROPERTY_CAMERACONTROL_S | LONG |
El valor de propiedad (datos de operación) es un LONG que especifica si el modo de privacidad está habilitado o deshabilitado:
Un valor de 0 indica que el sensor de cámara puede capturar imágenes de vídeo.
Un valor de 1 indica que se impide que el sensor de cámara capture imágenes de vídeo.
La estructura KSPROPERTY_CAMERA_CONTROL_S debe rellenarse de la siguiente manera:
Miembro de estructura | Valor |
---|---|
KSPROPERTY. Establecer | Debe ser PROPSETID_VIDCAP_CAMERACONTROL |
KSPROPERTY.Id | Debe ser KSPROPERTY_CAMERACONTROL_PRIVACY |
KSPROPERTY. Banderas | Debe ser KSPROPERTY_TYPE_GET |
Valor | Inicialización en 0 |
Marcas | Omitido, establecido en 0 |
Capabilities | Omitido, establecido en 0 |
KSEVENT
Tabla de resumen de uso (KSEVENT)
Get | Establecimiento | Target | Tipo de descriptor de evento | Tipo de valor de evento |
---|---|---|---|---|
No | Sí | Filtrar | KSEVENT | KSEVENTDATA |
La estructura KSEVENT debe rellenarse de la siguiente manera:
Miembro de estructura | Valor |
---|---|
Establecimiento | Debe ser PROPSETID_VIDCAP_CAMERACONTROL |
Id | Debe ser KSPROPERTY_CAMERACONTROL_PRIVACY |
Marcas | KSEVENT_TYPE_ENABLE |
La estructura KSEVENTDATA debe rellenarse de la siguiente manera:
Miembro de estructura | Valor |
---|---|
NotificationType | Debe ser KSEVENTF_EVENT_HANDLE |
No participar en la detección de oclusión de la tapa del dispositivo
Para no participar en la detección de oclusión de la tapa del dispositivo, los OEM pueden definir la siguiente clave de propiedad del dispositivo:
DEVPROPKEY
DEVPROPGUID = {3AB8560B-EFCF-43C1-A7EC-130E46857AF4}
DEVPROPID = 2
DEVPROPTYPE = DEVPROP_TYPE_UINT32
PropertyBuffer = (ULONG) 1
PropertyBufferSize = sizeof(ULONG)
Nota
Establecer el valor PropertyBuffer en 0 es el mismo que no definir la clave de propiedad del dispositivo en absoluto.
La clave de propiedad del dispositivo se puede proporcionar en un archivo INF del controlador mediante AddProperty o mediante un descriptor de SISTEMA operativo MS si no hay ningún archivo INF, por ejemplo, una cámara USB mediante el controlador de cámara de bandeja de entrada UVC.
Ejemplo de AddProperty de INF
[OptOutLidOcclusionSampleAddPropertySection]
{3AB8560B-EFCF-43C1-A7EC-130E46857AF4},2,7,,1
Ejemplo de descriptor de SO de 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)
};