Partilhar via


Controlos alargados da câmara

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

A lista a seguir de controles estendidos padronizados (definidos pelo Media Foundation) habilitam recursos adicionais da 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 que o evento seja sinalizado. O driver deve completar 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á à espera. A linha de captura notifica a aplicação sobre a conclusão da operação quando recebe o sinal.

Se um controle assíncrono pode ser cancelado, ele deve especificar o sinalizador KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION no controle. Se o controlo não puder ser anulado, o funcionamento do controlo não deve 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 para o requisito de buffer de metadados. Uma vez que o componente de modo de usuário tem essas informações, ele aloca o buffer de metadados apropriado para o driver preencher e retornar ao componente de modo de usuário.

O ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA definido na enumeração KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY é usado pelo cliente para consultar os requisitos de buffer de metadados, tais como o tamanho necessário dos metadados, requisitos de alinhamento de memória e tipo de alocação de memória pretendido, para alocação de buffer de metadados.

Uma vez que o componente de modo de usuário tenha obtido os requisitos de buffer de metadados do driver, ele aloca 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 quadros real, será enviado ao driver para ser preenchido e, em seguida, retornado ao componente de modo de usuário quando preenchido. Para cenários de captura múltipla, um buffer de metadados correspondente é alocado e entregue ao driver da câmera para cada buffer de quadros 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

Uma vez que o buffer (metadados + quadro) é colocado na fila do driver, o DevProxy envia uma estrutura padrão KSSTREAM_HEADER, seguida por uma estrutura KS_FRAME_INFO e, posteriormente, por uma estrutura KSSTREAM_METADATA_INFO. DevProxy mascarará ainda mais KSSTREAM_HEADER.OptionFlags com KSSTREAM_HEADER_OPTIONSF_METADATA antes de passar o buffer para o driver.

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

Se o driver oferecer suporte a metadados e o cliente não quiser nenhum metadado, 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 da foto são identificados pela MetadataId_PhotoConfirmation. Quando presente, indica que o quadro de pré-visualização associado é um quadro de confirmação de fotografia. 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 personalizados pode conter um blob de metadados que pode ser um estado de foco e/ou faces detetadas para o pino de visualização, EXIF e/ou os metadados OEM para um pino de imagem. O formato exato do blob personalizado é determinado pelo OEM que implementa o driver e MFT0. O MFT0 é responsável por interpretar o blob personalizado e anexar cada item de metadados como um atributo agrupado sob o grupo de atributos MFSampleExtension_CaptureMetadata em um formato legível pelo pipeline de captura MF e/ou pelo WinRT.

Os seguintes IMFAttributes são definidos em mfapi.h. Eles são exigidos pelo pipeline de captura MF e/ou WinRT. Observe que o MFT0 não define nenhum IMFAttributes para confirmação de foto, pois o quadro de confirmação de foto não passará além do 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 o estado de foco, e os converte em IMFAttributes correspondentes definidos acima e os anexa ao pacote de atributos MFSampleExtension_CaptureMetadata . Os seguintes IMFAttributes devem ser transportados pelo pipeline MF e quaisquer MFTs fornecidos por terceiros:

Nome Tipo
MFSampleExtension_CaptureMetadata IUnknown (IMFAttributes)
MFSampleExtension_EOS UINT32 (Booleano)
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 pacote de atributos.

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

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

Para adicionar os IMFAttributes necessários ao pacote 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 pacote de atributos.

  2. Chama SetUINT32, SetBlob ou SetUnknown em MF_CAPTURE_METADATA_XXX a partir da interface IMFAttributes obtida na 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 Capture Stats Metadata Attributes

Foco prioritário

O identificador da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY é o único controlo associado ao DDI de prioridade de foco.

Estado de foco

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

Região de Interesse (ROI) estendida

Os seguintes IDs de propriedades são os controlos associados ao DDI de ROI:

Foto de confirmação

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

Submodo de sequência de fotos

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

Codificador EXIF e HW JPEG

O pipeline não precisa processar ou alterar quaisquer dados EXIF para o codificador JPEG de HW; portanto, o formato dos dados EXIF é fornecido pelo driver, MFT0 e codificador OEM JPEG de HW. Os parceiros OEM podem definir qualquer GUID de atributo personalizado e tipo de variante para o atributo EXIF e anexá-lo ao MFSampleExtension_CaptureMetaData conjunto de atributos para utilização pelos componentes OEM. Se um codificador HW JPEG estiver disponível, o componente de descarte de fotografias do pipeline carregará o codificador HW JPEG e configurará os dados EXIF contidos no conjunto de atributos MFSampleExtension_CaptureMetaData no codificador HW JPEG como uma opção de codificação EXIF usando o método IPropertyBag2::Write.

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

Nome da propriedade VARTYPE Valor Codecs aplicáveis
SampleMetaData VT_UNKNOWN Ponteiro para uma interface IMFAttributes para a bolsa de atributos MFSampleExtension_CaptureMetaData que inclui um subatributo OEM contendo os dados EXIF. JPEG

O conjunto de atributos MFSampleExtension_CaptureMetaData pode conter apenas subatributos EXIF definidos pelo OEM que o codificador MFT0 e o codificador HW JPEG consigam ler para processar os dados EXIF. Para passar dados EXIF do driver para o codificador HW JPEG, o driver e MFT0 devem fazer o seguinte:

  1. O driver fornece metadados EXIF personalizados no buffer de metadados fornecido pelo pipeline. Isso é anexado ao MFSampleExtension_CaptureMetadata como um IMFAttribute MF_CAPTURE_METADATA_FRAME_RAWSTREAM por DevProxy quando o exemplo é retornado de volta para DevProxy.

  2. Quando o MFT0 recebe um IMFSample, ele obtém o buffer de metadados brutos do 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 MFSampleExtension_CaptureMetadata pacote de atributos.

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

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

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

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

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

  2. Chama GetBlob ou GetUnknown no subatributo OEM EXIF da interface obtida na etapa anterior para obter o blob de dados EXIF com base no GUID e no tipo de dados do subatributo OEM EXIF.

Miniatura

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

ISO inteiro

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

Foco avançado

O ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE é o único controlo associado ao ISO DDI inteiro.

Flash

O ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE é o único controle associado ao DDI flash.

Zoom

O ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM é o único controle associado ao DDI de zoom.

Modo Cena

O ID da propriedade KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE é o único controle associado ao modo de cena DDI.