Compartir a través de


Controles extendidos de cámara

Los controles extendidos usan el mecanismo KSPROPERTY para exponer controles de cámara a la aplicación.

La siguiente lista de controles extendidos estandarizados (definidos por Media Foundation) habilita características adicionales de la cámara de Windows:

Algunos de los controles se exponen a las aplicaciones como controles asincrónicos y otros se exponen como controles sincrónicos.

Controles sincrónicos

Para estos controles, la canalización de captura emite una estructura de control de cámara KSPROPERTY y espera que el controlador devuelva la solicitud de forma sincrónica.

Controles asincrónicos

Para estos controles, la canalización de captura emite una KSPROPERTY, habilita un KSEVENT asociado a esa propiedad y espera al evento para que se señale. El controlador debe completar KSPROPERTY de forma sincrónica y usarlo como desencadenador para iniciar la operación asincrónica. Tras la finalización de la operación asincrónica, el controlador debe indicar el KSEVENT asociado en el que la canalización de captura está esperando. La canalización de captura notifica a la aplicación la finalización de la operación cuando recibe la señal.

Si se puede cancelar un control asincrónico, debe especificar la marca KSCAMERA_EXTENDEDPROP_FLAG_CANCELOPERATION en el control. Si no se puede cancelar el control, la operación del control no debe superar los 5 ms.

Estos controles extendidos forman parte del siguiente conjunto de propiedades KS definido en 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);

Metadatos

Para recuperar metadatos, el componente de modo de usuario (DevProxy) debe consultar el controlador para el requisito del búfer de metadatos. Una vez que el componente del modo de usuario tiene esta información, asigna el búfer de metadatos adecuado para que el controlador rellene y vuelva al componente del modo de usuario.

El cliente usa el identificador de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA definido en la enumeración KSPROPERTY_CAMERACONTROL_EXTENDED_PROPERTY para consultar los requisitos del búfer de metadatos, como el tamaño de metadatos requerido, los requisitos de alineación de memoria y el tipo de asignación de memoria deseado, para la asignación del búfer de metadatos.

Una vez que el componente del modo de usuario ha obtenido los requisitos de búfer de metadatos del controlador, asigna el búfer de metadatos de tamaño adecuado con la alineación de memoria deseada del grupo de memoria deseado. Este búfer de metadatos, junto con el búfer de fotogramas real, se enviará al controlador para completar y, a continuación, se devolverá al componente del modo de usuario cuando se rellene. En escenarios de captura múltiple, se asigna un búfer de metadatos correspondiente y se entrega al controlador de cámara para cada búfer de fotogramas asignado.

La estructura KSSTREAM_METADATA_INFO , junto con la marca siguiente, se usa para enviar el búfer de metadatos al controlador.

#define KSSTREAM_HEADER_OPTIONSF_METADATA           0x00001000

Una vez que el búfer (metadatos + trama) se pone en cola al controlador, DevProxy envía una estructura estándar de KSSTREAM_HEADER, seguida por una estructura de KS_FRAME_INFO y luego una estructura de KSSTREAM_METADATA_INFO. DevProxy enmascarará adicionalmente KSSTREAM_HEADER.OptionFlags con KSSTREAM_HEADER_OPTIONSF_METADATA antes de pasar el búfer al controlador.

Si el controlador no admite metadatos o si no se implementa KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA , se producirá un error en el control de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA . En este caso, DevProxy no asignará un búfer de metadatos y la carga que se pasa al controlador desde DevProxy no contendrá la estructura KSSTREAM_METADATA_INFO .

Si el controlador admite metadatos y el cliente no quiere ningún metadato, DevProxy no asignará ningún búfer de metadatos ni pasará KSSTREAM_METADATA_INFO al enviar el búfer al controlador. Este comportamiento reduce la asignación de memoria de metadatos innecesaria si una aplicación no quiere metadatos en un pin determinado.

Las estructuras siguientes describen el diseño de los elementos de metadatos que va a rellenar el controlador de cámara en el búfer de metadatos.

La lista siguiente contiene el diseño de un elemento de metadatos. Debe estar alineado con 8 bytes.

Los metadatos de confirmación de la foto se identifican mediante MetadataId_PhotoConfirmation. Cuando está presente, indica que el marco de vista previa asociado es un marco de confirmación de fotos. Los metadatos de confirmación de fotos se analizan mediante DevProxy.

Los metadatos personalizados se identifican mediante un MetadataId que comienza desde MetadataId_Custom_Start. El elemento de metadatos personalizado puede contener un bloque de metadatos que puede incluir un estado de enfoque y/o caras detectadas para el pin de vista previa, los metadatos EXIF y/o los metadatos del OEM para un pin de imagen. El formato exacto del blob personalizado viene determinado por el OEM que implementa el controlador y MFT0. MFT0 es responsable de analizar el blob personalizado y adjuntar cada elemento de metadatos como un atributo agrupado en el contenedor de atributos MFSampleExtension_CaptureMetadata en un formato legible por la canalización de captura de MF o WinRT.

Los siguientes IMFAttributes se definen en mfapi.h. Estas son necesarias para la canalización de captura MF o WinRT. Tenga en cuenta que MFT0 no establece ningún atributo IMF para la confirmación de la foto, ya que el marco de la confirmación de la foto no pasará más allá de DevProxy.

Atributo (GUID) Tipo de dato
MF_CAPTURE_METADATA_FOCUSSTATE UINT32
MF_CAPTURE_METADATA_FACEROIS Masa amorfa
MF_CAPTURE_METADATA_FRAME_RAWSTREAM IUnknown

Los MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttributes se crean y adjuntan a MFSampleExtension_CaptureMetadata por el DevProxy, que contiene un puntero a la interfaz IMFMediaBuffer asociada al búfer de metadatos sin procesar (KSSTREAM_METADATA_INFO.Datos).

Cuando el MFT0 recibe un IMFSample, obtiene el búfer de metadatos sin procesar de la MF_CAPTURE_METADATA_FRAME_RAWSTREAM y analiza los elementos de metadatos personalizados adicionales, como el estado de enfoque, y los convierte en correspondientes IMFAttributes definidos anteriormente y los asocia al contenedor de atributos MFSampleExtension_CaptureMetadata . Los siguientes IMFAttributes deben ser transportados por la tubería MF y cualquier MFT proporcionado por terceros:

Nombre Tipo
MFSampleExtension_CaptureMetadata IUnknown (IMFAttributes)
MFSampleExtension_EOS UINT32 (Booleano)
MFSampleExtension_PhotoThumbnail IUnknown (IMFMediaBuffer)
MFSampleExtension_PhotoThumbnailMediaType IUnknown (IMFMediaType)

Para acceder al búfer de metadatos sin procesar, MFT0 hace lo siguiente:

  1. Invoca GetUnknown en MFSampleExtension_CaptureMetadata desde la interfaz IMFSample para obtener la interfaz IMFAttributes para la bolsa de atributos.

  2. Llama a GetUnknown en MF_CAPTURE_METADATA_FRAME_RAWSTREAM desde la interfaz IMFAttributes obtenida en el paso anterior para obtener la interfaz IMFMediaBuffer.

  3. Llama a Lock para obtener el búfer de metadatos sin procesar asociado a IMFMediaBuffer.

Para agregar los elementos IMFAttribute necesarios al contenedor de atributos MFSampleExtension_CaptureMetadata , el MFT0 hace lo siguiente:

  1. Llama GetUnknown en MFSampleExtension_CaptureMetadata desde la interfaz IMFSample para obtener la interfaz IMFAttributes para la bolsa de atributos.

  2. Llama SetUINT32, SetBlob o SetUnknown en MF_CAPTURE_METADATA_XXX de la interfaz IMFAttributes obtenida del paso anterior en función del GUID y del tipo de datos especificado en la tabla anterior.

Atributos de metadatos obligatorios

La lista completa de atributos de metadatos disponibles se puede encontrar en Capture Stats Metadata Attributes (Atributos de metadatos de captura de estadísticas)

Prioridad de foco

El identificador de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY es el único control asociado a la DDI de prioridad de enfoque.

Estado de foco

El identificador de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSSTATE es el único control asociado al DDI de estado de enfoque.

Región extendida de interés ROI

Los siguientes identificadores de propiedad son los controles que están asociados con la DDI ROI:

Confirmación de la foto

El identificador de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOCONFIRMATION es el único control asociado a la DDI de confirmación de fotos.

Submodo de secuencia de fotos

El identificador de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOMODE es el único control asociado a la DDI de secuencia de fotos.

Codificador JPEG EXIF y HW

La canalización no es necesaria para procesar ni modificar ningún dato EXIF para el codificador JPEG de HW; por lo tanto, el formato de datos EXIF es proporcionado por el controlador, MFT0, y el codificador OEM HW JPEG. Los socios de OEM pueden definir cualquier GUID de atributo personalizado y tipo de variante para el atributo EXIF y adjuntarlo al contenedor de atributos MFSampleExtension_CaptureMetaData para que los componentes OEM lo utilicen. Si hay disponible un codificador JPEG HW, el componente receptor de fotos de canalización cargará el codificador JPEG de HW y establecerá los datos EXIF contenidos en el contenedor de atributos de MFSampleExtension_CaptureMetaData en el codificador JPEG de HW como una opción de codificador EXIF mediante el método IPropertyBag2::Write .

El contenedor de propiedades de opción del codificador contiene una matriz de estructuras de PROPBAG2 que especifican las propiedades de la opción de codificación disponibles. La opción del codificador EXIF establecida en el codificador JPEG de HW se identifica mediante la siguiente propiedad en el contenedor de propiedades de opción del codificador:

Nombre de propiedad VARTYPE Importancia Códecs aplicables
SampleMetaData VT_UNKNOWN Puntero a una interfaz IMFAttributes para el contenedor de atributos MFSampleExtension_CaptureMetaData, que incluye un subatributo OEM con los datos EXIF. JPEG

El contenedor de atributos MFSampleExtension_CaptureMetaData debe contener solo cualquier subatributo EXIF definido por OEM que el codificador JPEG MFT0 y HW puedan leer y manejar para contener los datos EXIF. Para pasar datos EXIF del controlador al codificador JPEG de HW, el controlador y MFT0 deben hacer lo siguiente:

  1. El controlador proporciona metadatos EXIF personalizados en el búfer de metadatos proporcionado por la canalización. Esto se adjunta a MFSampleExtension_CaptureMetadata como un MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttribute by DevProxy cuando se devuelve la muestra a DevProxy.

  2. Cuando el MFT0 recibe un IMFSample, obtiene el búfer de metadatos sin procesar de MF_CAPTURE_METADATA_FRAME_RAWSTREAM, analiza el elemento de metadatos EXIF personalizado, lo convierte en un IMFAttribute definido por el OEM y lo asocia al contenedor de atributos MFSampleExtension_CaptureMetadata.

Para pasar datos EXIF desde el MFT0 al codificador JPEG de HW, el sumidero de imágenes de la canalización hace lo siguiente:

  1. Llama a GetUnknown en MFSampleExtension_CaptureMetadata desde IMFSample para obtener la interfaz IMFAttributes para el contenedor de atributos al recibir IMFSample.

  2. Llama a IPropertyBag2::Write para establecer la propiedad de opción del codificador, identificada por SampleMetadata, en el codificador JPEG de HW. La propiedad de opción del codificador contiene la interfaz IMFAttributes obtenida del paso anterior. Esta interfaz contiene todos los atributos secundarios personalizados, incluido el sub atributo EXIF de OEM, y los atributos secundarios estandarizados de la sección Metadatos descritos anteriormente en este tema.

Para recuperar los datos EXIF para su posterior procesamiento, el codificador JPEG de HW hace lo siguiente:

  1. Llama a IPropertyBag2::Read para recuperar el valor de la propiedad identificada por el nombre SampleMetadata y de tipo VT_UNKNOWN. Cuando se devuelve, VARIANT.punkVal recibe la interfaz IMFAttributes para MFSampleExtension_CaptureMetadata.

  2. Llama a GetBlob o GetUnknown sobre el subatributo OEM EXIF de la interfaz obtenida en el paso anterior para obtener un blob de datos EXIF según el GUID y el tipo de datos del subatributo OEM EXIF.

Miniatura

MFT0 no es necesario para generar ninguna miniatura para el controlador de cámara. Se espera que la aplicación de cámara genere su propia miniatura. La miniatura podría generarse a partir de la imagen de confirmación de la foto, el codificador JPEG de HW o redimensionar una imagen completa. Esto es para los desarrolladores de aplicaciones. Para mantener la compatibilidad de api y aplicaciones con aplicaciones de Windows 8.1, el controlador de cámara no debe implementar el control KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL .

ISO entero

El identificador de la propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED es el único control asociado con el ISO DDI de tipo entero.

Enfoque avanzado

El identificador de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE es el único control asociado al entero ISO DDI.

Flash

El identificador de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_FLASHMODE es el único control asociado a la DDI flash.

Zoom

El identificador de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_ZOOM es el único control asociado a la DDI de zoom.

Modo de escena

El identificador de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE es el único control asociado con el modo de escena DDI.