Acerca de las MFT

Las transformaciones de Media Foundation (MFT) proporcionan un modelo genérico para procesar datos multimedia. Las MFT se usan para descodificadores, codificadores y procesadores de señal digitales (DSP). En resumen, todo lo que se encuentra en la canalización de medios entre el origen multimedia y el receptor de medios es un MFT.

Para la mayoría de las aplicaciones, los detalles del procesamiento de datos MFT están ocultos por capas superiores de la arquitectura de Media Foundation. Muchas aplicaciones de Media Foundation nunca realizarán una llamada directa a un MFT. Sin embargo, es posible hospedar una MFT directamente en la aplicación.

Las MFT son una evolución del modelo de transformación que se introdujo por primera vez con Objetos multimedia (DPO) de DirectX. De hecho, es relativamente fácil crear una transformación que admita ambos modelos. En comparación con las DMV, los comportamientos necesarios de las MFT se especifican con más claridad, lo que facilita la escritura de una implementación correcta. Además, las MFT pueden admitir el procesamiento de vídeo acelerado por hardware.

En este tema se proporciona una breve introducción al modelo de procesamiento de MFT, centrándose en el diseño general en lugar de llamadas a métodos específicas. Para obtener una descripción paso a paso más detallada, consulte Modelo de procesamiento de MFT básico.

Secuencias

Una MFT tiene flujos de entrada y flujos de salida. Los flujos de entrada reciben datos y los flujos de salida generan datos. Por ejemplo, un descodificador tiene un flujo de entrada, que recibe los datos codificados y un flujo de salida, que genera los datos descodificados.

Las secuencias de un MFT no se representan como objetos COM distintos. En su lugar, cada secuencia tiene un identificador de flujo designado y los métodos de la interfaz IMFTransform toman identificadores de flujo como parámetros de entrada.

Algunas MFT tienen un número fijo de secuencias. Por ejemplo, los descodificadores y codificadores normalmente tienen exactamente una entrada y una salida. Otras MFT tienen un número dinámico de secuencias. Si un MFT admite flujos dinámicos, el cliente puede agregar nuevos flujos de entrada. El cliente no puede agregar flujos de salida, pero MFT podría agregar o quitar flujos de salida durante el procesamiento. Por ejemplo, los multiplexores normalmente permiten al cliente agregar flujos de entrada y tener una salida para la secuencia multiplexada. Los demultiplexadores son los inversos, con una entrada, pero un número dinámico de secuencias de salida, en función del contenido del flujo de entrada. En la ilustración siguiente se muestra la diferencia entre multiplexador y demultiplexer.

diagrama que muestra un codificador o descodificador (1 entrada, 1 salida), un multiplexador (2 entradas, 1 salida) y un demultiplexador (1 entrada, 2 salidas)

Tipos de medios

Cuando se crea por primera vez una MFT, ninguna de las secuencias tiene un formato establecido. Para que MFT pueda procesar datos, el cliente debe establecer los formatos de las secuencias. Por ejemplo, con un descodificador, el formato de entrada es el formato de compresión usado en el archivo de origen original y el formato de salida es un formato sin comprimir, como audio PCM o vídeo RGB. Los formatos de secuencia se describen mediante tipos de medios.

Dependiendo del estado interno de MFT, puede proporcionar una lista de posibles tipos de medios para cada secuencia. Puede usar esta lista como sugerencia al establecer los tipos de medios. Establecer el tipo de medio en una secuencia puede cambiar la lista de tipos posibles para otra secuencia. Por ejemplo, un descodificador normalmente no puede proporcionar ningún tipo de salida hasta que el cliente establezca el tipo de entrada. El tipo de entrada contiene la información que el descodificador necesita para devolver una lista de posibles tipos de salida.

Para establecer el tipo de medio en una secuencia, llame a IMFTransform::SetInputType o IMFTransform::SetOutputType. Para obtener la lista de posibles tipos de medios para una secuencia, llame a IMFTransform::GetInputAvailableType o IMFTransform::GetOutputAvailableType.

Procesamiento de datos

Una vez que el cliente establece los tipos de medios en las secuencias, MFT está listo para procesar los datos. Para que esto suceda, el cliente alterna entre proporcionar datos de entrada a MFT y obtener datos de salida de MFT:

El método ProcessInput toma un puntero a un ejemplo multimedia asignado por el cliente. El ejemplo multimedia contiene uno o varios búferes y cada búfer contiene datos de entrada para que el MFT se procese.

El método ProcessOutput admite dos modelos de asignación diferentes: MFT asigna los búferes de salida o el cliente asigna los búferes de salida. Algunos MFT admiten ambos modelos de asignación, pero no es necesario para que un MFT admita ambos. Por ejemplo, un MFT podría requerir que el cliente asigne los búferes de salida. El método IMFTransform::GetOutputStreamInfo devuelve información sobre un flujo de salida, incluido el modelo de asignación que admite el MFT.

Las MFT están diseñadas para almacenar en búfer los datos lo más pequeños posible, con el fin de minimizar la latencia en la canalización. Por lo tanto, en un momento dado, el MFT puede indicar una de las siguientes condiciones:

  • MFT requiere más datos de entrada. En este estado, el MFT no puede generar resultados hasta que el cliente llame a ProcessInput al menos una vez.
  • El MFT no aceptará más entradas hasta que el cliente llame a ProcessOutput al menos una vez.

Por ejemplo, supongamos que usa un descodificador de vídeo para descodificar una secuencia de vídeo que contiene una combinación de fotogramas clave y fotogramas delta. Inicialmente, el MFT requiere alguna entrada para poder descodificar cualquier fotograma. El cliente llama a ProcessInput para entregar el primer fotograma. Supongamos que el primer fotograma es un marco delta (que se muestra en el diagrama siguiente como "P" para el marco predicho). El descodificador se mantiene en este marco, pero no puede generar ninguna salida hasta que obtenga el siguiente fotograma clave.

diagrama que muestra el mft que necesita entrada, apuntando a un marco predicho

El cliente continúa llamando a ProcessInput y finalmente alcanza el siguiente fotograma clave (que se muestra en el diagrama siguiente como "I" para el marco dentro del código). Ahora el descodificador tiene suficientes marcos para empezar a descodificar. En este momento deja de aceptar la entrada y el cliente debe llamar a ProcessOutput para obtener los fotogramas descodificados.

diagrama que muestra un mft que no acepta la entrada, apuntando a un marco dentro del código y tres fotogramas predichos

El enfoque más sencillo para el cliente es simplemente alternar llamadas a ProcessInput y ProcessOutput. En el tema Modelo de procesamiento básico de MFT se describe un algoritmo más sofisticado.

Transformaciones de Media Foundation