Carimbos de Data/Hora e Durações
Este tópico descreve como as Transformações do Media Foundation devem lidar com carimbos de data/hora.
Um MFT deve definir o mais preciso possível um carimbo de data/hora e duração em todos os exemplos de saída. Para um 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 do exemplo de entrada para o exemplo 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. Todos os MFTs devem observar as seguintes regras básicas:
- Um MFT deve tentar colocar um carimbo de data/hora e duração em todos os exemplos de saída de áudio ou vídeo descompactados se um carimbo de data/hora ou duração preciso for fornecido nos exemplos 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 nos exemplos de saída o máximo possível.
- Os carimbos de data/hora de saída ou durações podem não corresponder à entrada porque o 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 do exemplo de entrada mais antigo que contém os dados usados para criar o exemplo de saída. Para calcular o carimbo de data/hora de saída, adicione o carimbo de data/hora de entrada do exemplo de entrada apropriado à duração dos dados que já foram transformados desse exemplo. O segundo exemplo no final desta seção ilustra essa ideia.
- Se os exemplos de entrada tiverem duração, essa duração deverá ser preservada. Se um exemplo de entrada não tiver duração, o MFT deverá calcular uma duração, se possível, do tamanho do buffer de saída ou da taxa de dados fornecida pelo tipo de mídia.
- As durações calculadas devem ser truncadas (arredondadas para baixo), não arredondadas para o incremento mais próximo. O pipeline tem margem de atraso suficiente para lidar com durações ligeiramente imprecisas, mas é mais fácil para o pipeline lidar com uma duração 1% muito curta do que uma duração de 1% muito longa. Dito isso, não há razão para deliberadamente encurtar as durações, além de arredondar.
Decodificadores
Um decodificador converte pacotes compactados em dados descompactados. Como a saída está descompactada, os decodificadores têm uma obrigação especial de corrigir os carimbos de data/hora e as durações. Alguns formatos compactados, principalmente MPEG-2, não têm carimbos de data/hora em todos os pacotes de entrada e geralmente não têm duração em nenhum pacote. Para esses formatos, o decodificador é responsável por colocar um carimbo de data/hora válido e duração em cada amostra de saída, somando as durações implícitas de toda a saída desde o último exemplo de entrada com carimbo de data/hora.
Para vídeo, se a duração não estiver disponível no formato compactado, o decodificador deverá calcular a duração como o inverso da taxa de quadros, convertido em unidades de 100 nanossegundos e arredondado para baixo.
Para áudio, se a duração não estiver disponível no formato compactado, o decodificador deverá calcular a duração como o inverso da taxa de amostra de áudio multiplicada pelo número de amostras no buffer de saída, convertida em unidades de 100 nanossegundos e arredondada para baixo.
A única vez que uma transformação deve gerar um exemplo sem um carimbo de data/hora é se o MFT nunca recebeu um carimbo de data/hora em uma amostra de entrada ou se não há como calcular um carimbo de data/hora de saída preciso do carimbo de data/hora de entrada anterior.
Decodificadores 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 os exemplos de entrada contêm carimbos de data/hora.
Se os exemplos de entrada contiverem carimbos de data/hora, o decodificador calculará os carimbos de data/hora de saída 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 decodificador Dolby Digital (AC-3) tem uma latência de 256 exemplos de PCM. Por exemplo, na taxa de amostragem de 48 kHz, a latência é de 5,33 milissegundos (msec). Portanto, se o carimbo de data/hora de entrada for 1000 msec, o carimbo de data/hora de saída será 1000 – 5,33 = 994,66 msec. Se o buffer de entrada incluir mais de um quadro compactado inteiro, o decodificador produzirá uma amostra de saída para cada quadro no exemplo de entrada. Todos os exemplos de saída terão o carimbo de data/hora corretamente, 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 supor 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 adequadamente.
Se os exemplos 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 com base no número de amostras de saída no buffer e na taxa de amostragem.
- Os carimbos de data/hora subsequentes são calculados com base no 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/hora de saída.
Se o fluxo de entrada inicialmente contiver carimbos de data/hora, mas por algum motivo mudar para nenhum carimbo de data/hora, o decodificador deverá 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 dá suporte a MFTs com mais de uma entrada. Há suporte para MFTs de várias entradas no Windows 7.
Um mixer usa várias entradas e as mistura em uma saída. Se os fluxos de entrada não estiverem completamente bloqueados por taxa ou forem ligeiramente deslocados no tempo uns dos outros, poderá haver ambiguidade sobre qual tempo definir na saída. Aqui estão algumas diretrizes, dependendo do tipo de mídia:
Áudio. Na inicialização ou imediatamente após um esvaziamento ou liberação, um mixer de áudio deve aguardar para produzir amostras de saída até receber 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 a serem usadas como uma linha de base para os carimbos de data/hora de saída. Os outros fluxos devem ser preenchidos com silêncio para compensar qualquer discrepância de tempo. Se um exemplo for recebido em um fluxo de entrada opcional, ele também deverá ser fatorado no cálculo. Desse ponto em diante, o MFT deve se esforçar para produzir uma cadeia contínua e ininterrupta de carimbos de data/hora de saída. Em geral, o MFT não deve tentar levar em conta um fluxo descompasso em relação a outro. Em vez disso, ele deve calcular os carimbos de data/hora de saída do carimbo de data/hora da linha de base, a taxa de saída e os tamanhos do buffer. Quando ocorre outro dreno ou liberação, o MFT deve redefinir seus carimbos de data/hora de linha de base.
Vídeo. Na inicialização ou imediatamente após um esvaziamento ou liberação, um mixer de vídeo deve aguardar para produzir amostras de saída até receber 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 a serem usadas como uma linha de base para os carimbos de data/hora de saída. Em geral, ele deve se esforçar para manter carimbos de data/hora 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 descompactado em pacotes compactados. Um codificador deve seguir estas diretrizes:
O codificador deve seguir as convenções do formato de saída. Se o formato normalmente não marca o carimbo de data/hora de cada amostra, como no MPEG-2, nem todo exemplo de saída precisa 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 sejam uma disponível de outra fonte, como o próprio aplicativo.
Multiplexadores
Observação
No Windows Vista, o pipeline do Media Foundation não dá suporte a MFTs com mais de uma entrada. Há suporte para MFTs de várias entradas 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 marca o carimbo de data/hora de cada amostra, como no MPEG-2, nem todo exemplo de saída precisa 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 comece nesse pacote ou a hora do primeiro exemplo de áudio que seria decodificado desse pacote. Ignore essa diretriz se entrar em conflito com as convenções do formato de saída.
Demultiplexers
Um demultiplexer 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 podem ser usadas para calcular carimbos de data/hora de saída precisos com base nos carimbos de data/hora de entrada, essas informações deverão ser usadas. No entanto, se o formato contiver horários em uma base completamente diferente que não têm relação com os carimbos de data/hora de entrada e um deslocamento preciso para o carimbo de data/hora de entrada não pode ser calculado, os próprios horários do formato devem ser ignorados.
Se o formato não tiver informações de carimbo de data/hora utilizáveis, o demultiplexer deverá seguir estas regras:
Os fluxos de saída descompactados 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 apenas no primeiro exemplo de saída derivado de uma amostra de entrada com um carimbo de data/hora. Se o exemplo de entrada não tiver um carimbo de data/hora, nenhum exemplo de saída derivado desse exemplo de entrada deverá ter um carimbo de data/hora. Se o exemplo de entrada for dividido em vários exemplos de saída, somente o primeiro exemplo 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 use um quadro de entrada descompactado, aplique o efeito e o copie para a saída. Ele nunca retém nenhuma entrada de quadros ou buffers. Esse MFT simplesmente copia o carimbo de data/hora e a duração do exemplo de entrada para o exemplo de saída, se eles estiverem disponíveis, e não faz nenhum cálculo de tempo.
Exemplo 2. Suponha que um efeito de áudio transforme todos menos 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 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 gera os primeiros 40 ms de exemplo 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.
O exemplo de saída 2 combina os 10 ms retidos anteriormente com 40 ms de exemplo de entrada 2. Este exemplo 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 desse exemplo, 40ms). Ele recebe 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 50 ms.
O próximo cálculo é mais interessante. O carimbo de data/hora implícito do tempo de saída anterior e duração seria de 160 ms (carimbo de data/hora 110 ms + duração de 50 ms). No entanto, o carimbo de data/hora de saída deve ser calculado a partir do carimbo de data/hora de entrada do exemplo de entrada mais antigo que sobrepõe o exemplo de saída no tempo, além do comprimento de todos os dados já processados desse exemplo. O exemplo de entrada sobreposto mais próximo é o exemplo 4 (carimbo de data/hora = 171), mas este não é o mais antigo. O exemplo mais antigo sobreposto é o exemplo 3 (carimbo de data/hora = 121). Adicionando os 40ms que já foram processados a partir desse exemplo, o resultado é 161.
Tópicos relacionados