Controles de câmera estendidos

Os controles estendidos usam o mecanismo KSPROPERTY para expor controles de câmera ao aplicativo.

A seguinte lista de controles estendidos padronizados (definidos pelo Media Foundation) permite recursos adicionais de câmera do Windows:

Alguns dos controles são expostos a aplicativos como controles assíncronos e outros são expostos como controles síncronos.

Controles síncronos

Para esses controles, o pipeline de captura emite uma estrutura de controle de câmera KSPROPERTY e espera que o driver retorne a solicitação de forma síncrona.

Controles assíncronos

Para esses controles, o pipeline de captura emite um KSPROPERTY, habilita um KSEVENT associado a essa propriedade e aguarda o evento ser sinalizado. O driver deve concluir o KSPROPERTY de forma síncrona e usá-lo como um gatilho para iniciar a operação assíncrona. Após a conclusão da operação assíncrona, o driver deve sinalizar o KSEVENT associado no qual o pipeline de captura está aguardando. O pipeline de captura notifica o aplicativo sobre a conclusão da operação quando ele recebe o sinal.

Se um controle assíncrono puder ser cancelado, ele deverá especificar o sinalizador KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION no controle . Se o controle não puder ser cancelado, a operação do controle não deverá exceder 5 ms.

Esses controles estendidos fazem parte do seguinte conjunto de propriedades KS definido em ksmedia.h:

#define STATIC_KSPROPERTYSETID_ExtendedCameraControl \
     0x1CB79112, 0xC0D2, 0x4213, 0x9C, 0xA6, 0xCD, 0x4F, 0xDB, 0x92, 0x79, 0x72
DEFINE_GUIDSTRUCT("1CB79112-C0D2-4213-9CA6-CD4FDB927972", KSPROPERTYSETID_ExtendedCameraControl);
#define KSPROPERTYSETID_ExtendedCameraControl DEFINE_GUIDNAMED(KSPROPERTYSETID_ExtendedCameraControl);

Metadados

Para recuperar metadados, o componente de modo de usuário (DevProxy) deve consultar o driver quanto ao requisito de buffer de metadados. Depois que o componente do modo de usuário tiver essas informações, ele alocará o buffer de metadados apropriado para o driver preencher e retornar ao componente do modo de usuário.

A ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA definida na enumeração KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY é usada pelo cliente para consultar os requisitos de buffer de metadados, como tamanho de metadados necessário, requisitos de alinhamento de memória e tipo de alocação de memória desejado, para alocação de buffer de metadados.

Depois que o componente do modo de usuário tiver obtido os requisitos de buffer de metadados do driver, ele alocará o buffer de metadados de tamanho apropriado com o alinhamento de memória desejado do pool de memória desejado. Esse buffer de metadados, juntamente com o buffer de quadro real, será enviado ao driver para atender e, em seguida, retornado ao componente de modo de usuário quando preenchido. Para cenários de várias imagens, um buffer de metadados correspondente é alocado e entregue ao driver da câmera para cada buffer de quadro alocado.

A estrutura KSSTREAM_METADATA_INFO , juntamente com o sinalizador a seguir, é usada para enviar o buffer de metadados para o driver.

#define KSSTREAM_HEADER_OPTIONSF_METADATA           0x00001000

Depois que o buffer (metadados + quadro) é enfileirado no driver, o DevProxy envia uma estrutura de KSSTREAM_HEADER padrão, seguida por uma estrutura KS_FRAME_INFO e seguida por uma estrutura KSSTREAM_METADATA_INFO . DevProxy mascarará ainda mais KSSTREAM_HEADER. OptionFlags com KSSTREAM_HEADER_OPTIONSF_METADATA antes de passar o buffer para baixo para o driver.

Se o driver não der suporte a metadados ou se KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA não for implementado, o controle de propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA falhará. Nesse caso, DevProxy não alocará um buffer de metadados e a carga que é passada para o driver de DevProxy não conterá a estrutura KSSTREAM_METADATA_INFO .

Se o driver der suporte a metadados e o cliente não quiser metadados, o DevProxy não alocará o buffer de metadados nem passará KSSTREAM_METADATA_INFO ao enviar o buffer para o driver. Esse comportamento reduz a alocação desnecessária de memória de metadados se um aplicativo não quiser metadados em um determinado pino.

As estruturas a seguir descrevem o layout dos itens de metadados a serem preenchidos pelo driver da câmera no buffer de metadados.

A lista abaixo contém o layout de um item de metadados. Isso deve estar alinhado a 8 bytes.

Os metadados de confirmação de foto são identificados por MetadataId_PhotoConfirmation. Quando presente, indica que o quadro de visualização associado é um quadro de confirmação de foto. Os metadados de confirmação de foto são analisados pelo DevProxy.

Os metadados personalizados são identificados por um MetadataId que começa a partir de MetadataId_Custom_Start. O item de metadados personalizado pode conter um blob de metadados que pode ser um estado de foco e/ou rostos detectados para o pino de visualização, EXIF e/ou os metadados OEM para um pin de imagem. O formato exato do blob personalizado é determinado pelo OEM que implementa o driver e o MFT0. O MFT0 é responsável por analisar o blob personalizado e anexar cada item de metadados como um atributo agrupado no recipiente de atributos MFSampleExtension_CaptureMetadata em um formato legível pelo pipeline de captura MF e/ou WinRT.

Os IMFAttributes a seguir são definidos em mfapi.h. Eles são exigidos pelo pipeline de captura de MF e/ou WinRT. Observe que o MFT0 não define imfAttributes para confirmação de foto, pois o quadro de confirmação de foto não fluirá além de DevProxy.

Atributo (GUID) Tipo de dados
MF_CAPTURE_METADATA_FOCUSSTATE UINT32
MF_CAPTURE_METADATA_FACEROIS Blob
MF_CAPTURE_METADATA_FRAME_RAWSTREAM IUnknown

Os MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttributes são criados e anexados a MFSampleExtension_CaptureMetadata pelo DevProxy, que contém um ponteiro para a interface IMFMediaBuffer associada ao buffer de metadados brutos (KSSTREAM_METADATA_INFO. Dados).

Quando o MFT0 recebe um IMFSample, ele obtém o buffer de metadados brutos do MF_CAPTURE_METADATA_FRAME_RAWSTREAM e analisa quaisquer itens de metadados personalizados adicionais, como estado de foco, e os converte em IMFAttributes correspondentes definidos acima e os anexa ao recipiente de atributos MFSampleExtension_CaptureMetadata . Os seguintes IMFAttributes devem ser transportados pelo pipeline do MF e por quaisquer MFTs fornecidos por terceiros:

Nome Tipo
MFSampleExtension_CaptureMetadata IUnknown (IMFAttributes)
MFSampleExtension_EOS UINT32 (booliano)
MFSampleExtension_PhotoThumbnail IUnknown (IMFMediaBuffer)
MFSampleExtension_PhotoThumbnailMediaType IUnknown (IMFMediaType)

Para acessar o buffer de metadados brutos, o MFT0 faz o seguinte:

  1. Chama GetUnknown em MFSampleExtension_CaptureMetadata da interface IMFSample para obter a interface IMFAttributes para o recipiente de atributos.

  2. Chama GetUnknown em MF_CAPTURE_METADATA_FRAME_RAWSTREAM da interface IMFAttributes obtida da etapa anterior para obter a interface IMFMediaBuffer.

  3. Chama Lock para obter o buffer de metadados bruto associado ao IMFMediaBuffer.

Para adicionar os IMFAttributes necessários ao recipiente de atributos MFSampleExtension_CaptureMetadata , o MFT0 faz o seguinte:

  1. Chama GetUnknown em MFSampleExtension_CaptureMetadata da interface IMFSample para obter a interface IMFAttributes para o recipiente de atributos.

  2. Chama SetUINT32, SetBlob ou SetUnknown em MF_CAPTURE_METADATA_XXX da interface IMFAttributes obtida da etapa anterior com base no GUID e no tipo de dados especificados na tabela acima.

Atributos de metadados obrigatórios

A lista completa de atributos de metadados disponíveis pode ser encontrada em Atributos de Metadados de Estatísticas de Captura

Prioridade de foco

A ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY é o único controle associado à DDI de prioridade de foco.

Estado de foco

A ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSSTATE é o único controle associado à DDI do estado de foco.

ROI de região estendida de interesse

As seguintes IDs de propriedade são os controles associados à DDI roi:

Confirmação de foto

A ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION é o único controle associado à DDI de confirmação de foto.

Submodelo da sequência de fotos

A ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE é o único controle associado à DDI da sequência de fotos.

Codificador JPEG EXIF e HW

O pipeline não é necessário para processar ou deformar dados EXIF para o codificador JPEG do HW; portanto, o formato de dados EXIF é fornecido pelo driver, MFT0 e codificador JPEG OEM HW. Os parceiros do OEMs podem definir qualquer GUID de atributo personalizado e tipo variante para o atributo EXIF e anexá-lo ao recipiente de atributos MFSampleExtension_CaptureMetaData para que ele seja consumido pelos componentes OEM. Se um codificador JPEG HW estiver disponível, o componente do coletor de fotos do pipeline carregará o codificador JPEG do HW e definirá os dados EXIF mantidos no recipiente de atributos MFSampleExtension_CaptureMetaData no codificador JPEG do HW como uma opção de codificador EXIF usando o método IPropertyBag2::Write .

O recipiente de propriedades da opção do codificador contém uma matriz de estruturas PROPBAG2 que especificam as propriedades de opção de codificação disponíveis. A opção de codificador EXIF definida no codificador JPEG do HW é identificada pela seguinte propriedade no recipiente de propriedades da opção do codificador:

Nome da propriedade VARTYPE Valor Codecs aplicáveis
SampleMetaData VT_UNKNOWN Ponteiro para uma interface IMFAttributes para MFSampleExtension_CaptureMetaData recipiente de atributos que contém um sub atributo OEM que contém os dados EXIF. JPEG

O recipiente de atributos MFSampleExtension_CaptureMetaData só pode conter qualquer sub atributo EXIF definido pelo OEM que o codificador JPEG MFT0 e HW possa ler para armazenar os dados EXIF. Para passar dados EXIF do driver para o codificador JPEG do HW, o driver e o MFT0 devem fazer o seguinte:

  1. O driver fornece metadados EXIF personalizados no buffer de metadados fornecido pelo pipeline. Isso é anexado a MFSampleExtension_CaptureMetadata como um MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttribute by DevProxy quando a amostra é retornada de volta ao DevProxy.

  2. Quando o MFT0 recebe um IMFSample, ele obtém o buffer de metadados brutos de MF_CAPTURE_METADATA_FRAME_RAWSTREAM e analisa o item de metadados EXIF personalizado e o converte em um IMFAttribute definido pelo OEM e o anexa ao recipiente de atributos MFSampleExtension_CaptureMetadata .

Para passar dados EXIF do MFT0 para o codificador JPEG do HW, o coletor de fotos do pipeline faz o seguinte:

  1. Chama GetUnknown em MFSampleExtension_CaptureMetadata do IMFSample para obter a interface IMFAttributes para o recipiente de atributos quando IMFSample é recebido.

  2. Chama IPropertyBag2::Write para definir a propriedade de opção do codificador, identificada por SampleMetadata, para o codificador JPEG do HW. A propriedade de opção do codificador contém a interface IMFAttributes obtida da etapa anterior. Essa interface contém todos os subatribuidores personalizados, incluindo o subpropósitório OEM EXIF e os subatributos padronizados na seção Metadados discutida anteriormente neste tópico.

Para recuperar os dados EXIF para processamento adicional, o codificador JPEG do HW faz o seguinte:

  1. Chama IPropertyBag2::Read para recuperar o valor da propriedade para a propriedade identificada pelo nome da propriedade SampleMetadata e VT_UNKNOWN tipo. Quando retornado, VARIANT.punkVal recebe a interface IMFAttributes para MFSampleExtension_CaptureMetadata.

  2. Chama GetBlob ou GetUnknown no subatribuitório EXIF do OEM da interface obtida da etapa anterior para obter o blob de dados EXIF com base no GUID e no tipo de dados do sub atributo EXIF do OEM.

Thumbnail

O MFT0 não é necessário para produzir nenhuma miniatura para o driver da câmera. Espera-se que o aplicativo de câmera gere sua própria miniatura. A miniatura pode ser produzida a partir da imagem de confirmação de foto, do codificador JPEG do HW ou do redimensionamento de uma imagem de tamanho completo. Isso cabe aos desenvolvedores de aplicativos. Para manter a compatibilidade da API e do aplicativo com Windows 8.1 aplicativos, o driver da câmera não deve implementar o controle KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL.

ISO inteiro

A ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED é o único controle associado ao inteiro ISO DDI.

Foco avançado

A ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE é o único controle associado ao inteiro ISO DDI.

Piscando

A ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE é o único controle associado à DDI flash.

Zoom

A ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM é o único controle associado à DDI de zoom.

Modo de cena

A ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE é o único controle associado à DDI do modo de cena.