Carimbos de Data/Hora e Durações
Este tópico descreve como o Media Foundation Transforms deve lidar com carimbos de data/hora.
Um MFT deve definir um carimbo de data/hora e duração o mais preciso possível 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 não compactados se um carimbo de data/hora 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 dos exemplos de entrada devem ser preservados nos exemplos de saída o máximo possível.
- Os carimbos ou durações de saída podem não corresponder à entrada porque o MFT está retendo dados ou dividindo a saída em partes de tamanho diferente da entrada. Nesse caso, o MFT deve calcular o carimbo de data/hora de saída da amostra de entrada mais antiga que contém 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 de 1% muito curta do que uma duração que é 1% muito longa. Dito isso, não há razão para reduzir deliberadamente 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 exemplo de saída, somando as durações implícitas de toda a saída desde a última amostra de entrada carimbada.
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, convertido em unidades de 100 nanossegundos e arredondado para baixo.
A única vez em 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 hora de entrada anterior.
Decodificadores de áudio
Para decodificadores de áudio, a duração de cada exemplo 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 os carimbos de 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 hora de saída dos carimbos de hora de entrada, da seguinte maneira:
- Se cada buffer de entrada contiver um ou mais quadros compactados completos, sem quadros parciais, o carimbo de hora de saída será igual ao carimbo de 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 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á um exemplo de saída para cada quadro no exemplo de entrada. Todos os exemplos de saída serão carimbados 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 exemplo.
- 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 hora de saída.
Se o fluxo de entrada inicialmente contiver carimbos de data/hora, mas por algum motivo alternar 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 nenhuma lacuna.
Se o fluxo de entrada contiver carimbos de data/hora, mas houver lacunas nos horários, 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
Nota
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 dreno ou liberação, um misturador 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 dos exemplos iniciais a serem usados como uma 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 um exemplo for recebido em um fluxo de entrada opcional, ele também deverá ser levado em conta 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 considerar 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, da taxa de saída e dos 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 dreno ou liberação, um misturador 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 dos exemplos iniciais a serem usados 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 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 deverão ser preservados no formato de saída, se o formato tiver campos para carimbos de data/hora, a menos que informações de tempo melhores estejam disponíveis de outra fonte, como o próprio aplicativo.
Multiplexadores
Nota
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 multiplexer combina dois fluxos de áudio ou vídeo diferentes em um formato intercalado, como fluxo de transporte AVI ou MPEG-2. Um multiplexer deve seguir estas diretrizes:
O multiplexer deve seguir as convenções do formato de saída. Se o formato normalmente nã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 da primeira amostra de áudio que seria decodificada desse pacote. Ignore essa diretriz se ela estiver 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 de carimbo de data/hora específicas 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 tenham relação com os carimbos de data/hora de entrada e um deslocamento preciso para o carimbo de hora de entrada não puder ser calculado, os próprios horários do formato deverão 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 não compactados devem ter carimbos de data/hora válidos e durações, se possível, calculados do carimbo de 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, apenas 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 tenha um quadro de entrada descompactado, aplique o efeito e o copie para a saída. Ele nunca retém quaisquer quadros ou buffers de qualquer entrada. 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 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.
O exemplo de saída 2 combina os 10 ms retidos anteriormente com 40 ms de amostra 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). É dada uma duração de 50ms.
Da mesma forma, a próxima amostra tem um carimbo de data/hora de 110ms (70ms + 40ms) com duração de 50 ms.
O próximo cálculo é mais interessante. O carimbo de data/hora implícito da hora e duração da saída anterior seria de 160 ms (carimbo de data/hora 110 ms + duração de 50 ms). No entanto, o carimbo de hora de saída deve ser calculado a partir do carimbo de data/hora de entrada da amostra de entrada mais antiga que sobrepõe a amostra 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 primeiro. A amostra sobreposta mais antiga é a amostra 3 (carimbo de data/hora = 121). Adicionando os 40ms que já foram processados desse exemplo, o resultado é 161.
Tópicos relacionados
-
escrevendo um MFT personalizado