Partilhar via


Notificação do obturador/interruptor de privacidade

Alguns fabricantes de câmeras podem querer incluir obturadores físicos ou kill switches que podem bloquear a câmera usando um controle físico que não pode ser substituído pelo software. Esses recursos não são incentivados devido ao risco de ativação inadvertida e consequente confusão do cliente, mas se implementados, eles devem seguir as orientações descritas em Obturadores de privacidade da câmera e kill switches, inclusive para relatar o estado do obturador / interruptor.

Quando um obturador é fechado ou um interruptor de segurança está ativo, a câmara continua totalmente funcional para o Windows e para aplicações que utilizem as APIs de câmara existentes. No entanto, a imagem ou fluxo de vídeo será preto ou escuro (ou substituído por uma imagem estática, como uma foto do dispositivo com uma seta a apontar para a localização do controlo físico). Isso levanta possíveis problemas onde os aplicativos que estão acessando a câmera não estão cientes de que a câmera está ocluída, e os usuários finais que ativaram involuntariamente o controle físico podem ficar confusos sobre por que sua câmera não está funcionando como esperado.

Para resolver essas preocupações, as câmeras que implementam obturadores ou kill switches devem implementar um mecanismo para detetar o estado do obturador / switch e relatá-lo ao sistema operacional. Este tópico fornece orientação para OEMs e ODMs que implementarão esse mecanismo de relatório e também descreve os controles e estruturas que os desenvolvedores de drivers de câmera usarão para publicar o estado do obturador/switch no sistema operacional.

Além do recurso de notificação do obturador/interruptor de privacidade, o sistema operativo implementa a deteção de oclusão da câmera frontal, quando uma câmera frontal (FFC) é coberta pela tampa do dispositivo ao ser definida a ação de fechamento do interruptor da tampa como "Não fazer nada", por exemplo, o computador não entrará em modo de repouso nem se desligará quando a tampa estiver fechada. Um exemplo de cenário poderia ser um laptop ligado a uma docking station com ecrãs externos em uso enquanto a tampa do laptop está fechada. Pode haver alguns fatores de forma do dispositivo onde esse comportamento não é desejado, portanto, um mecanismo para desativar a deteção de oclusão da tampa do dispositivo é definido abaixo.

Visão geral da arquitetura

O controle KSPROPERTY_CAMERACONTROL_PRIVACY é usado quando o sistema operacional está consultando o estado atual de um driver de câmera. Ele só deve ser usado como uma propriedade Get. Os desenvolvedores de drivers não devem oferecer suporte à propriedade KSPROPERTY_CAMERACONTROL_PRIVACY control set em seus drivers.

Observação

As câmeras que implementam obturadores de privacidade ou kill switches devem estar em conformidade com os requisitos descritos em Obturadores de privacidade da câmera e kill switches.

No driver de classe de vídeo USB (UVC), o controle KSPROPERTY_CAMERACONTROL_PRIVACY é mapeado para a propriedade CT_PRIVACY_CONTROL definida na especificação de classe UVC v1.5.

Diagrama ilustrando a arquitetura de notificação do obturador de privacidade

Além do uso do controle KSPROPERTY existente, KSPROPERTY_CAMERACONTROL_PRIVACY, um novo fluxo de chamada KSEVENT é introduzido para que o driver da câmera possa sinalizar quando o estado do obturador/interruptor de privacidade da câmera for alterado se houver clientes se registrando para esse KSEVENT.

O KSEVENT é emitido usando o mesmo set GUID e Id que o KSPROPERTY está usando.

Para esclarecer o que é mostrado no diagrama acima, o sistema operacional está esperando que o driver AVS implemente mecanismo, se o desenvolvedor do driver optar por suportar esse recurso, para obter e ouvir as mudanças de estado que o sensor do obturador está gerando. O sistema operativo consulta o estado pelo método get de KSPROPERTY e emite um evento KSEVENT de espera que o controlador sinalizará quando o estado do obturador for alterado. A mudança de estado do obturador/interruptor não deve impedir o funcionamento da câmara, por exemplo, para causar uma situação de erro.

OBSERVAÇÃO: Se o driver AVS suportar esse recurso, mas o hardware subjacente não, o driver AVS retornará o erro de não suportado quando o sistema operativo efetuar o registo de KSEVENT.

Métodos de deteção e relatório

Algumas câmeras detetam o estado do obturador usando um algoritmo de análise de pixel em execução no firmware do processador de sinal de imagem (ISP). Isso impõe uma limitação às câmaras, dado que a câmara deve estar a transmitir ativamente para detetar e relatar o estado do obturador. Consulte Deteção e relatório do estado do obturador para obter mais detalhes sobre quando e como a câmara deve comunicar o estado do obturador/comutador.

Da mesma forma, os desenvolvedores de aplicativos que utilizam o sinal de oclusão da câmera não devem utilizar o estado do obturador relatado, a menos que a câmera esteja transmitindo ativamente. Consulte CameraOcclusionInfo Class para obter mais detalhes.

KSPROPRIEDADE

Tabela de resumo de uso (KSPROPERTY)

Obter Configurar Target Tipo de descritor de propriedade Tipo de valor da propriedade
Yes Não Filtro KSPROPERTY_CAMERACONTROL_S LONGO

O valor da propriedade (dados da operação) é um LONG que especifica se o modo de privacidade está ativado ou desativado:

  • Um valor 0 indica que o sensor da câmera pode capturar imagens de vídeo

  • Um valor de 1 indica que o sensor da câmara está impedido de capturar imagens de vídeo

A estrutura KSPROPERTY_CAMERA_CONTROL_S deve ser preenchida da seguinte forma:

Membro da estrutura Valor
KSPROPERTY.Set Deve ser PROPSETID_VIDCAP_CAMERACONTROL
KSPROPERTY.Id Deve ser KSPROPERTY_CAMERACONTROL_PRIVACY
KSPROPERTY.Flags Deve ser KSPROPERTY_TYPE_GET
Value Inicializar a 0
Bandeiras Ignorado, definido como 0
Capacidades Ignorado, definido como 0

KSEVENT

Tabela de resumo de uso (KSEVENT)

Obter Configurar Target Tipo de descritor de evento Tipo de valor do evento
Não Yes Filtro KSEVENT KSEVENTDATA

A estrutura do KSEVENT deve ser preenchida da seguinte forma:

Membro da estrutura Valor
Configurar Deve ser PROPSETID_VIDCAP_CAMERACONTROL
ID Deve ser KSPROPERTY_CAMERACONTROL_PRIVACY
Bandeiras KSEVENT_TYPE_ENABLE

A estrutura KSEVENTDATA deve ser preenchida da seguinte forma:

Membro da estrutura Valor
Tipo de notificação Deve ser KSEVENTF_EVENT_HANDLE

Desativar a deteção de oclusão da tampa do dispositivo

Para desativar a deteção de oclusão da tampa do dispositivo, os OEMs podem definir a seguinte chave de propriedade do dispositivo:

DEVPROPKEY

    DEVPROPGUID = {3AB8560B-EFCF-43C1-A7EC-130E46857AF4}

    DEVPROPID = 2

DEVPROPTYPE = DEVPROP_TYPE_UINT32

PropertyBuffer = (ULONG) 1

PropertyBufferSize = sizeof(ULONG)

Observação

Definir o valor PropertyBuffer como 0 é o mesmo que não definir a Chave de Propriedade do Dispositivo.

A chave de propriedade do dispositivo pode ser fornecida em um arquivo INF do driver usando AddProperty ou usando um descritor do MS OS se não houver nenhum arquivo INF, por exemplo, uma câmera USB usando o driver da câmera da caixa de entrada UVC.

Exemplo de INF AddProperty

[OptOutLidOcclusionSampleAddPropertySection]

{3AB8560B-EFCF-43C1-A7EC-130E46857AF4},2,7,,1

Exemplo de descritor do 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)
};

Ver também

KSPROPERTY_CAMERACONTROL_PRIVACY

KSPROPERTY_CAMERA_CONTROL_S

KSPROPERTY

KSEVENT

KSEVENTDATA

PROPSETID_VIDCAP_CAMERACONTROL