Compartilhar via


Notificação do obturador/comutador de privacidade

Alguns fabricantes de câmeras podem querer incluir obturadores físicos ou interruptores de morte 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 confusão resultante para o cliente, mas, se implementados, eles devem seguir as diretrizes descritas em Janelas de Privacidade da Câmera e Comutadores de Desligamento, incluindo relatar o estado do obturador/comutador.

Quando um obturador é fechado ou um interruptor de segurança está ativo, a câmera continua funcional no Windows e em aplicativos que utilizam APIs de câmera existentes, mas 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 apontando para o local do controle físico). Isso levanta questões potenciais em que os aplicativos que estão acessando a câmera não estão cientes de que a câmera está obstruída, e os usuários finais que ativaram o controle físico sem querer 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 comutadores de desligamento devem implementar um mecanismo para detectar o estado do obturador/comutador e denunciá-lo ao sistema operacional. Este tópico fornece diretrizes para OEMs e ODMs que implementarão esse mecanismo de relatório e também descreve os controles e estruturas que os desenvolvedores do driver de câmera usarão para publicar o estado do obturador/comutador no sistema operacional.

Além do recurso de notificação do obturador/comutador de privacidade, o sistema operacional implementa a detecção de bloqueio da câmera, onde uma câmera frontal é bloqueada pela tampa do dispositivo quando a ação de fechamento do comutador de tampa está definida como "Não Fazer Nada", por exemplo, um computador não entrará em modo de espera ou desligará quando a tampa for fechada. Um cenário de exemplo pode ser um laptop encaixado com monitores externos em uso enquanto a tampa do laptop está fechada. Pode haver alguns fatores de forma de dispositivo em que esse comportamento não é desejado, portanto, um mecanismo para recusar a detecçã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 driver não devem suportar a propriedade de controle KSPROPERTY_CAMERACONTROL_PRIVACY 'Set' em seus drivers.

Observação

Câmeras que utilizam obturadores de privacidade ou interruptores de desligamento devem estar em conformidade com os requisitos descritos em Obturadores de privacidade da câmera e interruptores de desligamento.

No driver da Classe de Vídeo USB (UVC), o controle KSPROPERTY_CAMERACONTROL_PRIVACY é mapeado para a propriedade CT_PRIVACY_CONTROL definida na Especificação da 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/comutador de privacidade da câmera for alterado se houver clientes se registrando para esse KSEVENT.

O KSEVENT é emitido usando o mesmo GUID de conjunto e ID que o KSPROPERTY está usando.

Para esclarecer o que é mostrado no diagrama acima, o sistema operacional espera que o driver da AVS implemente o mecanismo, se o desenvolvedor do driver optar por dar suporte a esse recurso, para obter e ouvir as alterações de estado que o sensor do obturador está gerando. O sistema operacional consulta o estado por meio do método KSPROPERTY get e emite um evento KSEVENT de espera que o driver sinalizará quando o estado do obturador for alterado. A alteração de estado do obturador/comutador não deve impedir que a câmera funcione, por exemplo, para causar uma situação de erro.

NOTA: Se o driver AVS der suporte a esse recurso, mas o hardware subjacente não, o driver da AVS retornará um erro sem suporte quando o sistema operacional emitir o registro KSEVENT .

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

Algumas câmeras detectam o estado do obturador usando um algoritmo de análise de pixel executado no firmware ISP (Processador de Sinal de Imagem). Isso impõe uma limitação nas câmeras, pois elas devem estar transmitindo ativamente para detectar e relatar o estado do obturador. Consulte detecção e relatório do estado do obturador para mais detalhes sobre quando e como a câmera deve reportar seu estado de 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 a Classe CameraOcclusionInfo para obter mais detalhes.

KSPROPERTY

Tabela resumo de uso (KSPROPERTY)

Obter Set Target Tipo de descritor de propriedade Tipo de valor de propriedade
Yes Não Filtro KSPROPERTY_CAMERACONTROL_S longo

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

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

  • Um valor de 1 indica que o sensor da câmera é impedido de capturar imagens de vídeo

A estrutura de KSPROPERTY_CAMERA_CONTROL_S deve ser preenchida da seguinte maneira:

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
Valor Inicializar em 0
Flags Ignorado, definido como 0
recursos Ignorado, definido como 0

KSEVENT

Tabela resumo de uso (KSEVENT)

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

A estrutura KSEVENT deve ser preenchida da seguinte maneira:

Membro da estrutura Valor
Set Deve ser PROPSETID_VIDCAP_CAMERACONTROL
Id Deve ser KSPROPERTY_CAMERACONTROL_PRIVACY
Flags KSEVENT_TYPE_ENABLE

A estrutura KSEVENTDATA deve ser preenchida da seguinte maneira:

Membro da estrutura Valor
NotificationType Deve ser KSEVENTF_EVENT_HANDLE

Recusar a detecção de oclusão da tampa do dispositivo

Para recusar a detecçã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 do 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 MS OS se não houver nenhum arquivo INF, por exemplo, uma câmera USB usando o driver inbox UVC.

Exemplo de INF AddProperty

[OptOutLidOcclusionSampleAddPropertySection]

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

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

Consulte também

KSPROPERTY_CAMERACONTROL_PRIVACY

KSPROPERTY_CAMERA_CONTROL_S

KSPROPERTY

KSEVENT

KSEVENTDATA

PROPSETID_VIDCAP_CAMERACONTROL