Partilhar via


Carimbos de data/hora e durações

Este tópico descreve como o Media Foundation Transforms deve lidar com carimbos de data/hora.

Uma MFT deve definir um carimbo de data/hora e uma duração tão precisos quanto possível em todas as amostras de saída. Para uma MFT simples que usa um buffer de entrada e o processa completamente em um buffer de saída, o MFT deve apenas copiar o carimbo de data/hora e a duração diretamente da amostra de entrada para a amostra de saída. No entanto, muitas transformações são mais complexas do que isso e podem exigir cálculos mais complexos do tempo de saída. Todas as MFT devem observar as seguintes regras básicas:

  • Uma MFT deve tentar colocar um carimbo de data/hora e duração em todas as amostras de saída de vídeo ou áudio não compactadas se um carimbo de data/hora ou duração preciso for dado nas amostras de entrada ou puder ser calculado. A interpolação pode ser necessária para alguns carimbos de data/hora de saída, especialmente para decodificadores.
  • Os carimbos de data/hora e as durações das amostras de entrada devem ser preservados nas amostras de saída, tanto quanto possível.
  • Os carimbos de data/hora ou durações de saída podem não corresponder à entrada porque a MFT está retendo dados ou dividindo a saída em partes de tamanhos diferentes da entrada. Nesse caso, o MFT deve calcular o carimbo de data/hora de saída a partir da amostra de entrada mais antiga que contém dados usados para criar a amostra de saída. Para calcular o carimbo de data/hora de saída, adicione o carimbo de data/hora de entrada da amostra de entrada apropriada à duração dos dados que já foram transformados a partir dessa amostra. O segundo exemplo no final desta secção ilustra esta ideia.
  • Se as amostras de entrada tiverem duração, essa duração deve ser preservada. Se uma amostra de entrada não tiver duração, a MFT deve calcular uma duração, se possível, a partir do tamanho do buffer de saída ou da taxa de dados dada pelo tipo de mídia.
  • As durações calculadas devem ser truncadas (arredondadas para baixo) e não arredondadas para o incremento mais próximo. O pipeline tem folga suficiente para lidar com durações que são ligeiramente imprecisas, mas é mais fácil para o pipeline lidar com uma duração que é 1% muito curta do que uma duração que é 1% muito longa. Dito isto, não há qualquer razão para encurtar deliberadamente as durações, a não ser através de arredondamentos.

Descodificadores

Um descodificador converte pacotes comprimidos em dados não comprimidos. Como a saída é descompactada, os decodificadores têm uma obrigação especial de corrigir os carimbos de data/hora e as durações. Alguns formatos comprimidos, mais notavelmente MPEG-2, não têm carimbos de data/hora em todos os pacotes de entrada e muitas vezes não têm duração em nenhum pacote. Para esses formatos, o decodificador é responsável por colocar um carimbo de data/hora e duração válidos em cada amostra de saída, somando as durações implícitas de toda a saída desde a última amostra de entrada com carimbo de data/hora.

Para vídeo, se a duração não estiver disponível no formato comprimido, o descodificador deve calcular a duração como o inverso da taxa de fotogramas, convertida para unidades de 100 nanossegundos e arredondada para baixo.

Para áudio, se a duração não estiver disponível no formato comprimido, o descodificador deve calcular a duração como o inverso da taxa de amostragem de áudio multiplicada pelo número de amostras na memória intermédia de saída, convertida em unidades de 100 nanossegundos e arredondada para baixo.

A única hora em que uma transformação deve produzir uma amostra sem um carimbo de data/hora é se a MFT nunca recebeu um carimbo de data/hora em uma amostra de entrada ou se não houver como calcular um carimbo de data/hora de saída preciso do carimbo de data/hora de entrada anterior.

Descodificadores de áudio

Para decodificadores de áudio, a duração de cada amostra de saída é calculada a partir da taxa de amostragem de áudio e do número de amostras de PCM por canal no buffer de saída.

A maneira correta de calcular carimbos de data/hora de saída depende se as amostras de entrada contêm carimbos de data/hora.

Se as amostras de entrada contiverem carimbos de data/hora, o decodificador calculará os carimbos de data/hora de saída a partir dos carimbos de data/hora de entrada, da seguinte maneira:

  • Se cada buffer de entrada contiver um ou mais quadros compactados completos, sem quadros parciais, o carimbo de data/hora de saída será igual ao carimbo de data/hora de entrada, menos a latência conhecida do decodificador. Por exemplo, um descodificador Dolby Digital (AC-3) tem uma latência de 256 amostras PCM. Por exemplo, a uma taxa de amostragem de 48 kHz, a latência é de 5,33 milissegundos (mseg). Portanto, se o carimbo de data/hora de entrada for 1000 mseg, o carimbo de data/hora de saída será 1000 – 5,33 = 994,66 mseg. Se o buffer de entrada incluir mais de um quadro compactado inteiro, o decodificador produzirá uma amostra de saída para cada quadro na amostra de entrada. Todas as amostras de saída serão marcadas corretamente com a data/hora, de modo que não haja lacunas.
  • Dependendo do formato de transporte, um buffer de entrada pode conter quadros parciais. Por exemplo, um buffer pode conter parte de um quadro do buffer de entrada anterior, seguido por um ou mais quadros completos, seguido pelo início do próximo quadro. Nesse caso, geralmente é correto assumir que o carimbo de data/hora de entrada corresponde ao primeiro quadro que começa dentro do buffer. (Ou seja, um quadro parcial iniciado no buffer anterior não está incluído no carimbo de data/hora do buffer atual.) Calcule o carimbo de data/hora de saída de acordo.

Se as amostras de entrada não contiverem carimbos de data/hora:

  • O decodificador deve gerar seus próprios carimbos de data/hora, definindo o primeiro carimbo de data/hora de saída como zero.
  • A duração da amostra é calculada a partir do número de amostras de saída no tampão e da taxa de amostragem.
  • Os carimbos de data/hora subsequentes são calculados a partir do carimbo de data/hora e duração anteriores: carimbo de data/hora atual + duração atual = carimbo de data/hora seguinte. Não deve haver lacunas nos carimbos de data e hora de saída.

Se o fluxo de entrada inicialmente contém carimbos de data/hora, mas por algum motivo muda para nenhum carimbo de data/hora, o decodificador deve continuar a gerar seus próprios carimbos de data/hora de saída, de modo que eles sejam contínuos e não haja lacuna.

Se o fluxo de entrada contiver carimbos de data/hora, mas houver lacunas nos tempos, o decodificador simplesmente propagará essas lacunas. Em outras palavras, o decodificador não deve tentar corrigir carimbos de data/hora inconsistentes no fluxo de entrada.

Misturadores

Observação

No Windows Vista, o pipeline do Media Foundation não oferece suporte a MFTs com mais de uma entrada. MFTs de entrada múltipla são suportadas no Windows 7.

 

Um misturador pega várias entradas e as mistura em uma saída. Se os fluxos de entrada não estiverem completamente bloqueados ou forem ligeiramente deslocados no tempo uns dos outros, pode haver ambiguidade sobre qual hora definir na saída. Aqui estão algumas diretrizes, dependendo do tipo de mídia:

  • Áudio. Na inicialização ou imediatamente após um dreno ou descarga, um mixer de áudio deve esperar para produzir amostras de saída até que tenha recebido uma amostra de entrada em todos os fluxos de entrada necessários. Nesse ponto, ele deve escolher o carimbo de data/hora mais antigo das amostras iniciais para usar como linha de base para os carimbos de data/hora de saída. Os outros fluxos devem ser acolchoados com silêncio para compensar qualquer discrepância de tempo. Se uma amostra for recebida em um fluxo de entrada opcional, ela também deve ser levada em conta no cálculo. A partir desse ponto, o MFT deve esforçar-se por produzir uma cadeia contínua e ininterrupta de carimbos de data/hora de saída. Em geral, o MFT não deve tentar dar conta de um fluxo à deriva em relação a outro. Em vez disso, ele deve calcular os carimbos de data/hora de saída a partir do carimbo de data/hora da linha de base, da taxa de saída e dos tamanhos do buffer. Quando ocorre outro dreno ou descarga, o MFT deve redefinir seus carimbos de data/hora de linha de base.

  • Vídeo. Na inicialização ou imediatamente após um dreno ou descarga, um misturador de vídeo deve esperar para produzir amostras de saída até que tenha recebido uma amostra de entrada em todos os fluxos de entrada necessários. Nesse ponto, ele deve escolher o carimbo de data/hora mais antigo das amostras iniciais para usar como linha de base para os carimbos de data/hora de saída. Em geral, ele deve se esforçar para manter carimbos de tempo de saída contínuos e regulares e durações fixas, mesmo que a entrada não seja tão regular, se necessário, repetindo quadros de entrada.

Codificadores

Um codificador converte áudio ou vídeo não comprimido em pacotes comprimidos. Um codificador deve seguir estas diretrizes:

  • O codificador deve seguir as convenções do formato de saída. Se o formato normalmente não carimba a hora de todas as amostras, como no MPEG-2, nem todas as amostras de saída precisam ter um carimbo de data/hora e uma duração.

  • Os carimbos de data/hora de entrada devem ser preservados no formato de saída, se o formato tiver campos para carimbos de data/hora, a menos que melhores informações de hora estejam disponíveis de outra fonte, como o próprio aplicativo.

Multiplexadores

Observação

No Windows Vista, o pipeline do Media Foundation não oferece suporte a MFTs com mais de uma entrada. MFTs de entrada múltipla são suportadas no Windows 7.

 

Um multiplexador combina dois fluxos de áudio ou vídeo diferentes em um formato intercalado, como AVI ou MPEG-2 Transport Stream. Um multiplexador deve seguir estas diretrizes:

  • O multiplexador deve seguir as convenções do formato de saída. Se o formato normalmente não carimba a hora de todas as amostras, como no MPEG-2, nem todas as amostras de saída precisam ter um carimbo de data/hora e uma duração.

  • O carimbo de data/hora deve refletir a hora mais antiga que seria colocada em qualquer quadro que começasse nesse pacote ou a hora da primeira amostra de áudio que seria decodificada desse pacote. Ignore esta diretriz se ela entrar em conflito com as convenções do formato de saída.

Desmultiplexadores

Um desmultiplexador divide um formato intercalado, como AVI ou MPEG-2 Transport Stream, nos fluxos de áudio e vídeo subjacentes.

Se o formato contiver informações específicas de carimbo de data/hora que possam ser usadas para calcular carimbos de data/hora de saída precisos com base nos carimbos de data/hora de entrada, essas informações devem ser usadas. No entanto, se o formato contiver horas em uma base completamente diferente que não tenha relação com os carimbos de data/hora de entrada, e um deslocamento preciso para o carimbo de data/hora de entrada não puder ser calculado, os próprios tempos do formato devem ser ignorados.

Se o formato não tiver informações de carimbo de data/hora utilizáveis, o desmultiplexador deve seguir estas regras:

  • Os fluxos de saída não compactados devem ter carimbos de data/hora e durações válidos, se possível, calculados a partir do carimbo de data/hora de entrada anterior mais próximo.

  • Os fluxos de saída compactados devem ter carimbos de data/hora somente na primeira amostra de saída derivada de uma amostra de entrada com um carimbo de data/hora. Se a amostra de entrada não tiver um carimbo de data/hora, nenhuma amostra de saída derivada dessa amostra de entrada deverá ter um carimbo de data/hora. Se a amostra de entrada for dividida em várias amostras de saída, apenas a primeira amostra de saída deverá ter um carimbo de data/hora e o restante não deverá ter carimbos de data/hora.

Exemplos

Exemplo 1. Suponha que um efeito de vídeo sempre pegue um quadro de entrada não compactado, aplique o efeito e o copie para a saída. Ele nunca retém nenhum quadro ou buffer qualquer entrada. Este MFT simplesmente copia o carimbo de data/hora e a duração da amostra de entrada para a amostra de saída, se estiverem disponíveis, e não faz cálculos de tempo.

Exemplo 2. Suponha que um efeito de áudio transforme todos, exceto 10 milissegundos (ms) de cada buffer de entrada, salvando os 10 ms extras para combinar com o próximo buffer. Ele obtém um fluxo de amostras que todos têm uma duração de 50 ms. Os tempos de entrada são mostrados na tabela a seguir.

Amostra Tempo de entrada Duração da entrada Tempo de saída Duração da saída
1 20 50 20 40
2 70 50 60 50
3 121 50 110 50
4 171 50 161 50

 

Observe a discrepância de 1 ms entre a duração real da amostra 2 e a duração implícita com base no carimbo de data/hora seguinte (121 ? 70 = 51).

Como o MFT retém 10 ms, ele produz os primeiros 40 ms da amostra de entrada 1 como amostra de saída 1, com um carimbo de data/hora de 20 ms e uma duração de 40 ms.

A amostra de saída 2 combina os 10 ms anteriormente retidos com 40 ms da amostra de entrada 2. Esta amostra recebe um carimbo de data/hora de 60 ms (o carimbo de data/hora da amostra de entrada anterior, 20ms, mais a duração dos dados já processados dessa amostra, 40ms). É dada uma duração de 50ms.

Da mesma forma, a próxima amostra tem um carimbo de data/hora de 110ms (70ms + 40ms) com uma duração de 50ms.

O próximo cálculo é mais interessante. O carimbo de data/hora implícito da hora de saída anterior e duração seria de 160 ms (carimbo de data/hora 110 ms + duração 50 ms). No entanto, o carimbo de data/hora de saída deve ser calculado a partir do carimbo de data/hora de entrada da amostra de entrada mais antiga que se sobrepõe à amostra de saída no tempo, mais o comprimento de quaisquer dados já processados dessa amostra. A amostra de entrada sobreposta mais próxima é a amostra 4 (carimbo de data/hora = 171), mas esta não é a mais antiga. A primeira amostra sobreposta é a amostra 3 (carimbo de data/hora = 121). Somando os 40ms que já foram processados dessa amostra, o resultado é 161.

Escrevendo um MFT personalizado