Controles de cámara extendidos
Los controles extendidos usan el mecanismo KSPROPERTY para exponer los 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 a que se indique el evento. 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 el control no se puede cancelar, 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 conocer el requisito del búfer de metadatos. Una vez que el componente de modo de usuario tiene esta información, asigna el búfer de metadatos adecuado para que el controlador rellene y vuelva al componente de modo de usuario.
El cliente usa el KSPROPERTY_CAMERACONTROL_EXTENDED_METADATA identificador de propiedad que se define 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 de modo de usuario ha obtenido los requisitos del 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 que se complete y, a continuación, se devolverá al componente del modo de usuario cuando se rellene. En escenarios de múltiples capturas de pantalla, 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 y marco) se pone en cola en el controlador, DevProxy envía una estructura de KSSTREAM_HEADER estándar, seguida de una estructura de KS_FRAME_INFO y seguida de una estructura de KSSTREAM_METADATA_INFO . DevProxy enmascarará aún más 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 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.
Metadatos
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 blob de metadatos que puede ser un estado de foco o caras detectadas para el pin de vista previa, EXIF o los metadatos oem de 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 MF o WinRT.
Los siguientes IMFAttributes se definen en mfapi.h. Estos son necesarios para la canalización de captura MF o WinRT. Tenga en cuenta que MFT0 no establece ningún IMFAttributes para la confirmación de la foto, ya que el marco de confirmación de la foto no fluirá más allá de DevProxy.
Atributo (GUID) | Tipo de datos |
---|---|
MF_CAPTURE_METADATA_FOCUSSTATE | UINT32 |
MF_CAPTURE_METADATA_FACEROIS | Blob |
MF_CAPTURE_METADATA_FRAME_RAWSTREAM | IUnknown |
Los MF_CAPTURE_METADATA_FRAME_RAWSTREAM IMFAttributes se crean y adjuntan a MFSampleExtension_CaptureMetadata mediante 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 los correspondientes IMFAttributes definidos anteriormente y los adjunta al contenedor de atributos MFSampleExtension_CaptureMetadata . Los siguientes IMFAttributes deben ser llevados a cabo por la canalización MF y los MMP suministrados 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:
Llama a GetUnknown en MFSampleExtension_CaptureMetadata desde la interfaz IMFSample para obtener la interfaz IMFAttributes para el contenedor de atributos.
Llama a GetUnknown en MF_CAPTURE_METADATA_FRAME_RAWSTREAM desde la interfaz IMFAttributes obtenida del paso anterior para obtener la interfaz IMFMediaBuffer.
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:
Llama a GetUnknown en MFSampleExtension_CaptureMetadata desde la interfaz IMFSample para obtener la interfaz IMFAttributes para el contenedor de atributos.
Llama a SetUINT32, SetBlob o SetUnknown en MF_CAPTURE_METADATA_XXX desde la interfaz IMFAttributes obtenida del paso anterior en función del GUID y el 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 estadísticas de captura).
Prioridad de foco
El identificador de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSPRIORITY es el único control asociado a la DDI de prioridad de foco.
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 asociados a la DDI de 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.
Submodeo 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 desencapsular ningún dato EXIF para el codificador JPEG de HW; por lo tanto, el controlador, MFT0 y OEM HW JPEG proporcionan el formato de datos EXIF. Los asociados de OEM pueden definir cualquier GUID de atributo personalizado y tipo de variante para el atributo EXIF y adjuntarlo al contenedor de atributos de MFSampleExtension_CaptureMetaData para que los componentes oem los consuman. Si hay disponible un codificador JPEG de 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 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 | Valor | Códecs aplicables |
---|---|---|---|
SampleMetaData | VT_UNKNOWN | Puntero a una interfaz IMFAttributes para MFSampleExtension_CaptureMetaData contenedor de atributos que contiene un sub atributo OEM que contiene los datos EXIF. | JPEG |
El contenedor de atributos MFSampleExtension_CaptureMetaData solo puede contener cualquier sub atributo EXIF definido por OEM que el codificador MFT0 y HW JPEG pueda leer para contener los datos EXIF. Para pasar datos EXIF del controlador al codificador JPEG de HW, el controlador y MFT0 deben hacer lo siguiente:
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 la muestra se devuelve a DevProxy.
Cuando el MFT0 recibe un IMFSample, obtiene el búfer de metadatos sin procesar de MF_CAPTURE_METADATA_FRAME_RAWSTREAM y analiza el elemento de metadatos EXIF personalizado y lo convierte en un OEM definido IMFAttribute y lo adjunta al contenedor de atributos MFSampleExtension_CaptureMetadata .
Para pasar datos EXIF del codificador MFT0 al codificador JPEG de HW, el receptor de fotos de canalización hace lo siguiente:
Llama a GetUnknown en MFSampleExtension_CaptureMetadata desde IMFSample para obtener la interfaz IMFAttributes del contenedor de atributos cuando se recibe IMFSample.
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:
Llama a IPropertyBag2::Read para recuperar el valor de propiedad de la propiedad identificada por el nombre de la propiedad SampleMetadata y VT_UNKNOWN tipo. Cuando se devuelve, VARIANT.punkVal recibe la interfaz IMFAttributes para MFSampleExtension_CaptureMetadata.
Llama a GetBlob o GetUnknown en el sub atributo EXIF oem de la interfaz obtenida del paso anterior para obtener el blob de datos EXIF basado en el GUID y el tipo de datos del sub atributo EXIF de OEM.
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 HW o el cambio de tamaño completo de una imagen. Esto es para los desarrolladores de aplicaciones. Para mantener la compatibilidad de api y aplicaciones con Windows 8.1 aplicaciones, el controlador de cámara no debe implementar el control KSPROPERTY_CAMERACONTROL_EXTENDED_PHOTOTHUMBNAIL.
ISO entero
El identificador de propiedad de KSPROPERTY_CAMERACONTROL_EXTENDED_ISO_ADVANCED es el único control asociado al entero ISO DDI.
Enfoque avanzado
El identificador de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_FOCUSMODE es el único control asociado al entero ISO DDI.
Intermitente
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 al DDI de zoom.
Modo de escena
El identificador de propiedad KSPROPERTY_CAMERACONTROL_EXTENDED_SCENEMODE es el único control asociado al DDI del modo de escena.