Compartir a través de


Marcas de tiempo y duraciones

En este tema se describe cómo las transformaciones de Media Foundation deben controlar las marcas de tiempo.

Un MFT debe establecer una marca de tiempo y una duración lo más precisa posible en todas las muestras de salida. Para un MFT simple que toma un búfer de entrada y lo procesa completamente en un búfer de salida, MFT solo debe copiar la marca de tiempo y la duración directamente desde la muestra de entrada al ejemplo de salida. Sin embargo, muchas transformaciones son más complejas que esta y pueden requerir cálculos más complejos del tiempo de salida. Todas las MFT deben observar las siguientes reglas básicas:

  • Un MFT debe intentar poner una marca de tiempo y una duración en todas las muestras de salida de audio o vídeo sin comprimir si se proporciona una marca de tiempo precisa o una duración en las muestras de entrada o se puede calcular. La interpolación puede ser necesaria para algunas marcas de tiempo de salida, especialmente para los descodificadores.
  • Las marcas de tiempo y las duraciones de las muestras de entrada deben conservarse en las muestras de salida tanto como sea posible.
  • Es posible que las marcas de tiempo o duraciones de salida no coincidan con la entrada porque MFT está reteniendo los datos o dividiendo la salida en partes de tamaño diferente a la entrada. En ese caso, el MFT debe calcular la marca de tiempo de salida del ejemplo de entrada más antiguo que contiene los datos usados para crear el ejemplo de salida. Para calcular la marca de tiempo de salida, agregue la marca de tiempo de entrada del ejemplo de entrada adecuado a la duración de los datos que ya se han transformado de ese ejemplo. El segundo ejemplo al final de esta sección ilustra esta idea.
  • Si las muestras de entrada tienen duración, se debe conservar esa duración. Si una muestra de entrada no tiene duración, MFT debe calcular una duración si es posible a partir del tamaño del búfer de salida o la velocidad de datos dada por el tipo de medio.
  • Las duraciones calculadas deben truncarse (redondear hacia abajo), no redondear al incremento más cercano. La canalización tiene suficiente margen de demora para controlar las duraciones que son ligeramente inexactas, pero es más fácil que la canalización controle una duración que sea un 1 % demasiado corta que una duración que sea demasiado larga. Dicho esto, no hay ninguna razón para acortar deliberadamente las duraciones, aparte del redondeo.

Decodificadores

Un descodificador convierte los paquetes comprimidos en datos sin comprimir. Dado que la salida no está comprimida, los descodificadores tienen una obligación especial de obtener las marcas de tiempo y las duraciones correctas. Algunos formatos comprimidos, especialmente MPEG-2, no tienen marcas de tiempo en todos los paquetes de entrada y, a menudo, no tienen duración en ningún paquete. Para estos formatos, el descodificador es responsable de colocar una marca de tiempo y una duración válidas en cada muestra de salida sumando las duraciones implícitas de toda la salida desde la última muestra de entrada con marca de tiempo.

En el caso del vídeo, si la duración no está disponible en el formato comprimido, el descodificador debe calcular la duración como inversa de la velocidad de fotogramas, convertida en unidades de 100 nanosegundos y redondeado hacia abajo.

En el caso del audio, si la duración no está disponible en el formato comprimido, el descodificador debe calcular la duración como inversa de la frecuencia de muestreo de audio multiplicada por el número de muestras del búfer de salida, convertidas en unidades de 100 nanosegundos y redondeadas hacia abajo.

La única vez que una transformación debe generar una muestra sin una marca de tiempo es si el MFT nunca ha recibido una marca de tiempo en una muestra de entrada, o si no hay ninguna manera de calcular una marca de tiempo de salida precisa a partir de la marca de tiempo de entrada anterior.

Descodificadores de audio

En el caso de los descodificadores de audio, la duración de cada muestra de salida se calcula a partir de la frecuencia de muestreo de audio y el número de muestras de PCM por canal en el búfer de salida.

La manera correcta de calcular las marcas de tiempo de salida depende de si las muestras de entrada contienen marcas de tiempo.

Si los ejemplos de entrada contienen marcas de tiempo, el descodificador calcula las marcas de tiempo de salida a partir de las marcas de tiempo de entrada, como se indica a continuación:

  • Si cada búfer de entrada contiene uno o varios fotogramas comprimidos completos, sin fotogramas parciales, la marca de tiempo de salida es igual a la marca de tiempo de entrada, menos la latencia conocida del descodificador. Por ejemplo, un descodificador Dolby Digital (AC-3) tiene una latencia de 256 muestras de PCM. Por ejemplo, a una velocidad de muestreo de 48 kHz, la latencia es de 5,33 milisegundos (msec). Por lo tanto, si la marca de tiempo de entrada es de 1000 msec, la marca de tiempo de salida es de 1000 a 5,33 = 994,66 msec. Si el búfer de entrada incluye más de un fotograma comprimido completo, el descodificador generará una muestra de salida para cada fotograma de la muestra de entrada. Todas las muestras de salida se marcarán correctamente de forma que no haya espacios.
  • Según el formato de transporte, un búfer de entrada puede contener fotogramas parciales. Por ejemplo, un búfer podría contener parte de un marco del búfer de entrada anterior, seguido de uno o varios fotogramas completos, seguido del inicio del siguiente fotograma. En este caso, generalmente es correcto suponer que la marca de tiempo de entrada corresponde al primer fotograma que se inicia dentro del búfer. (Es decir, un marco parcial que se inició en el búfer anterior no se incluye en la marca de tiempo del búfer actual). Calcule la marca de tiempo de salida en consecuencia.

Si los ejemplos de entrada no contienen marcas de tiempo:

  • El descodificador debe generar sus propias marcas de tiempo, estableciendo la primera marca de tiempo de salida en cero.
  • La duración de la muestra se calcula a partir del número de muestras de salida en el búfer y la frecuencia de muestreo.
  • Las marcas de tiempo posteriores se calculan a partir de la marca de tiempo y la duración anteriores: marca de tiempo actual + duración actual = marca de tiempo siguiente. No debe haber huecos en las marcas de tiempo de salida.

Si el flujo de entrada contiene inicialmente marcas de tiempo, pero por algún motivo cambia a ninguna marca de tiempo, el descodificador debe seguir generando sus propias marcas de tiempo de salida, de modo que sean continuas y no haya ninguna brecha.

Si el flujo de entrada contiene marcas de tiempo, pero hay huecos en las horas, el descodificador simplemente propagará estas brechas. En otras palabras, el descodificador no debe intentar corregir marcas de tiempo incoherentes en el flujo de entrada.

Mezcladores

Nota:

En Windows Vista, la canalización de Media Foundation no admite MFP con más de una entrada. Las MFP de varias entradas se admiten en Windows 7.

 

Un mezclador toma varias entradas y las mezcla en una salida. Si las secuencias de entrada no están completamente bloqueadas por velocidad o se desplazan ligeramente en el tiempo entre sí, puede haber ambigüedad sobre el tiempo que se debe establecer en la salida. Estas son algunas directrices, según el tipo de medio:

  • Audio. En el inicio o inmediatamente después de un purgado o vaciado, un mezclador de audio debe esperar para generar muestras de salida hasta que haya recibido una muestra de entrada en todos los flujos de entrada necesarios. En ese momento, debe elegir la marca de tiempo más antigua de las muestras iniciales que se van a usar como línea base para las marcas de tiempo de salida. Las demás secuencias deben rellenarse con silencio para compensar cualquier discrepancia de tiempo. Si se recibe un ejemplo en un flujo de entrada opcional, también se debe tener en cuenta en el cálculo. A partir de ese momento, el MFT debe esforzarse por producir una cadena continua y sin problemas de marcas de tiempo de salida. En general, el MFT no debe intentar tener en cuenta el desfase de una secuencia en relación con otra. En su lugar, debe calcular las marcas de tiempo de salida a partir de la marca de tiempo de línea base, la velocidad de salida y los tamaños del búfer. Cuando se produce otro drenaje o vaciado, el MFT debe restablecer sus marcas de tiempo de línea base.

  • Video. En el inicio o inmediatamente después de una purga o vaciado, un mezclador de vídeo debe esperar a generar muestras de salida hasta que haya recibido una muestra de entrada en todos los flujos de entrada necesarios. En ese momento, debe elegir la marca de tiempo más antigua de las muestras iniciales que se van a usar como línea base para las marcas de tiempo de salida. En general, debe esforzarse por mantener marcas de tiempo de salida continuas y normales y duraciones fijas, incluso si la entrada no es tan normal, si es necesario repitiendo fotogramas de entrada.

Codificadores

Un codificador convierte audio o vídeo sin comprimir en paquetes comprimidos. Un codificador debe seguir estas instrucciones:

  • El codificador debe seguir las convenciones del formato de salida. Si el formato no suele marcar cada muestra, como en MPEG-2, no todas las muestras de salida deben tener una marca de tiempo y una duración.

  • Las marcas de tiempo de entrada deben conservarse en el formato de salida, si el formato tiene campos para marcas de tiempo, a menos que una mejor información de tiempo esté disponible desde otro origen, como la propia aplicación.

Multiplexores

Nota

En Windows Vista, la canalización de Media Foundation no admite MFP con más de una entrada. Las MFP de varias entradas se admiten en Windows 7.

 

Un multiplexador combina dos secuencias de audio o vídeo diferentes en un formato intercalado, como AVI o MPEG-2 Transport Stream. Un multiplexador debe seguir estas instrucciones:

  • El multiplexador debe seguir las convenciones del formato de salida. Si el formato no suele marcar cada muestra, como en MPEG-2, no todas las muestras de salida deben tener una marca de tiempo y una duración.

  • La marca de tiempo debe reflejar la hora más temprana que se colocaría en cualquier fotograma que comience en ese paquete, o la hora de la primera muestra de audio que se descodificaría de ese paquete. Omita esta guía si entra en conflicto con las convenciones del formato de salida.

Demultiplexores

Un demultiplexer divide un formato intercalado, como AVI o MPEG-2 Transport Stream, en las secuencias de audio y vídeo subyacentes.

Si el formato contiene información de marca de tiempo específica que se puede usar para calcular marcas de tiempo de salida precisas en función de las marcas de tiempo de entrada, se debe usar esa información. Sin embargo, si el formato contiene horas en una base completamente diferente que no tiene relación con las marcas de tiempo de entrada, y no se puede calcular un desplazamiento preciso a la marca de tiempo de entrada, se deben omitir las horas propias del formato.

Si el formato no tiene información de marca de tiempo utilizable, el demultiplexer debe seguir estas reglas:

  • Los flujos de salida sin comprimir deben tener marcas de tiempo y duraciones válidas si es posible, calculadas a partir de la marca de tiempo de entrada anterior más cercana.

  • Los flujos de salida comprimidos deben tener marcas de tiempo solo en la primera muestra de salida derivada de una muestra de entrada con una marca de tiempo. Si el ejemplo de entrada no tiene una marca de tiempo, ninguna muestra de salida derivada de esa muestra de entrada debe tener una marca de tiempo. Si el ejemplo de entrada se divide en varias muestras de salida, solo la primera muestra de salida debe tener una marca de tiempo y el resto no debe tener marcas de tiempo.

Ejemplos

Ejemplo 1. Supongamos que un efecto de vídeo siempre toma un marco de entrada sin comprimir, aplica el efecto y lo copia en la salida. Nunca retene los fotogramas ni almacena en búfer ninguna entrada. Este MFT simplemente copia la marca de tiempo y la duración del ejemplo de entrada en el ejemplo de salida, si están disponibles, y no realiza cálculos de tiempo en absoluto.

Ejemplo 2. Supongamos que un efecto de audio transforma todos los 10 milisegundos (ms) de cada búfer de entrada y guarda 10 ms adicionales para combinarlo con el siguiente búfer. Obtiene una secuencia de muestras que tienen una duración de 50 ms. Los tiempos de entrada se muestran en la tabla siguiente.

Ejemplo Hora de entrada Duración de entrada Tiempo de salida Duración de salida
1 20 50 20 40
2 70 50 60 50
3 121 50 110 50
4 171 50 161 50

 

Observe la discrepancia de 1 ms entre la duración real de la muestra 2 y la duración implícita en función de la próxima marca de tiempo (121 ? 70 = 51).

Dado que el MFT retiene 10 ms, genera los primeros 40 ms de la muestra de entrada 1 como muestra de salida 1, con una marca de tiempo de 20 ms y una duración de 40 ms.

El ejemplo de salida 2 combina los 10 ms previamente retenidos con 40 ms de muestra de entrada 2. Este ejemplo tiene una marca de tiempo de 60 ms (la marca de tiempo de la muestra de entrada anterior, 20 ms, además de la duración de los datos ya procesados de esa muestra, 40 ms). Se le da una duración de 50 ms.

Del mismo modo, la siguiente muestra tiene una marca de tiempo de 110 ms (70 ms + 40 ms) con una duración de 50 ms.

El siguiente cálculo es más interesante. La marca de tiempo implícita del tiempo de salida anterior y la duración serían de 160 ms (marca de tiempo 110 ms + duración 50 ms). Sin embargo, se supone que la marca de tiempo de salida se calcula a partir de la marca de tiempo de entrada del ejemplo de entrada más antiguo que se superpone al ejemplo de salida en el tiempo, además de la longitud de los datos ya procesados de ese ejemplo. La muestra de entrada superpuesta más cercana es la muestra 4 (marca de tiempo = 171), pero esta no es la más antigua. La muestra superpuesta más antigua es la muestra 3 (marca de tiempo = 121). Al agregar los 40 ms que ya se han procesado desde esa muestra, el resultado es 161.

Escritura de un MFT personalizado