Compartir a través de


Tipos de medios DMO

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Un tipo de medio describe el formato asociado a una secuencia de datos multimedia. En este artículo se describe cómo las DPO controlan los tipos de medios. Está pensado principalmente para desarrolladores que escriben sus propias DPO personalizadas.

Los tipos de medios se definen mediante la estructura DMO_MEDIA_TYPE . Esta estructura incluye la siguiente información:

  • El tipo principal es un identificador único global (GUID) que define una categoría amplia, como audio o vídeo.
  • El subtipo es un GUID que define aspectos más específicos del tipo. Por ejemplo, dentro del vídeo, los subtipos incluyen RGB de 16 bits, RGB de 24 bits, UYVY, vídeo codificado en DV, etc.
  • El bloque de formato es una estructura secundaria que especifica completamente el formato. El diseño del bloque de formato depende del tipo de datos. Por ejemplo, el audio PCM usa la estructura WAVEFORMATEX . Video usa otras estructuras, como VIDEOINFOHEADER y VIDEOINFOHEADER2. El diseño del bloque de formato se identifica mediante un GUID de tipo de formato. Por ejemplo, FORMAT_WaveFormatEx especifica una estructura WAVEFORMATEX .

Cuando se crea por primera vez un DMO, las secuencias no tienen un tipo de medio. Para que DMO pueda procesar cualquier dato, el cliente debe establecer un tipo de medio para cada secuencia. Este proceso se describe desde la perspectiva del cliente en Establecer tipos de medios en un DMO.

Tipos de medios en el Registro

Un DMO puede agregar una lista de tipos de medios que admite en el Registro mediante una llamada a la función DMORegister . Una aplicación puede usar esta información para buscar DPO que coincidan con un formato determinado. La información del Registro no está pensada para ser completa. Normalmente, incluiría solo los tipos principales que admite DMO. La entrada del Registro tiene claves independientes para los tipos de entrada y salida, pero no distingue entre secuencias individuales.

La función DMORegister usa la estructura DMO_PARTIAL_MEDIATYPE para describir los tipos de medios. Esta estructura contiene un subconjunto de la información que se encuentra en la estructura DMO_MEDIA_TYPE , es decir, el tipo principal y el subtipo. No incluye un bloque de formato, ya que el bloque de formato normalmente contiene información demasiado granular para incluir en el registro, como el alto y el ancho de una imagen de vídeo.

Tipos de medios preferidos

Una vez que la aplicación ha creado un DMO, puede consultar el DMO para los tipos de medios que admite. Para cada secuencia, DMO crea una lista de tipos de medios (posiblemente vacíos), clasificados en orden de preferencia. Los métodos IMediaObject::GetInputType e IMediaObject::GetOutputType enumeran los tipos preferidos. Los tipos preferidos de una secuencia pueden cambiar dinámicamente cuando la aplicación establece tipos de medios en otras secuencias. Por ejemplo, la lista de tipos de salida preferidos podría cambiar después de establecer el tipo de entrada, o viceversa. Sin embargo, el DMO no es necesario para actualizar dinámicamente sus tipos preferidos. La aplicación no puede suponer que todos los tipos que recibe son válidos. Por este motivo, los métodos IMediaObject::SetInputType e IMediaObject::SetOutputType admiten una marca para probar un tipo específico.

Los métodos GetInputType y GetOutputType devuelven una estructura DMO_MEDIA_TYPE . El DMO puede dejar en blanco parte de la información de esta estructura para indicar un intervalo de tipos. El tipo principal o subtipo puede ser GUID_NULL y el bloque de formato puede estar vacío (cero bytes). Si el bloque de formato está vacío, el tipo de formato debe ser GUID_NULL.

Después de que la aplicación establezca todos los tipos de entrada de un DMO, el DMO normalmente debe devolver al menos un tipo completo para cada flujo de salida. Un tipo de salida completo facilita las pruebas y las aplicaciones pueden usarla como valor predeterminado razonable. La aplicación de prueba DMO se basa en este comportamiento. (Consulte Uso de la aplicación DMOTest).

Establecer los tipos de medios

Las aplicaciones usan los métodos SetInputType y SetOutputType para probar, establecer o borrar tipos en una secuencia especificada. La aplicación debe especificar completamente el tipo. El DMO comprueba si puede aceptar el tipo propuesto. La respuesta puede depender de los tipos que se han establecido en otros flujos. La marca DMO_SET_TYPEF_CLEAR borra el tipo de una secuencia, por lo que la aplicación puede "volver a salir" e intentar otra combinación.

Escenarios de ejemplo

En los ejemplos siguientes se describen algunos escenarios típicos para ilustrar los puntos realizados en las secciones anteriores.

  • Descodificadores de vídeo. En un descodificador de vídeo típico, el tipo de entrada determina parcialmente el tipo de salida. Por ejemplo, normalmente ambas secuencias deben tener la misma velocidad de fotogramas y dimensiones de imagen. Una opción no es definir ningún tipo de salida preferido hasta que se establezca el tipo de entrada. Otra opción es enumerar un conjunto de tipos incompletos, omitiendo el bloque de formato. Use el subtipo para indicar los tipos no comprimidos admitidos, como RGB de 16 bits, RGB de 24 bits, etc. Además, los descodificadores de vídeo normalmente no admiten establecer el tipo de salida antes del tipo de entrada. El escenario habitual es descodificar desde un formato de entrada conocido, por lo que esta limitación es razonable.
  • Descodificadores de audio. Un descodificador de audio puede admitir un conjunto limitado y fijo de formatos de salida. En ese caso, puede crear una lista de formatos de salida preferidos antes de que se conozca el formato de entrada.
  • Compresores. En la mayoría de los casos, un compresor de vídeo no puede especificar completamente sus formatos de salida preferidos hasta que la aplicación establezca el formato de entrada y viceversa. En su lugar, DMO debe devolver un tipo incompleto sin ningún bloque de formato. Para la compresión de audio y vídeo, la aplicación normalmente debe establecer varios parámetros de salida, como la velocidad de bits. Sin embargo, una vez establecido el tipo de entrada, el compresor debe devolver al menos un tipo de salida completo, por los motivos mencionados anteriormente.

Escritura de un DMO