Share via


Timestamp e durata

In questo argomento viene descritto il modo in cui le trasformazioni di Media Foundation devono gestire i timestamp.

Un MFT deve impostare come accurato un timestamp e una durata il più possibile su tutti gli esempi di output. Per un MFT semplice che accetta un buffer di input e lo elabora completamente in un buffer di output, il MFT deve copiare il timestamp e la durata direttamente dall'esempio di input all'esempio di output. Tuttavia, molte trasformazioni sono più complesse di questa e possono richiedere calcoli più complessi del tempo di output. Tutte le schede multifunzione devono osservare le regole di base seguenti:

  • Un MFT deve provare a inserire un timestamp e una durata su tutti gli esempi di output video o audio non compressi se viene assegnato un timestamp o una durata accurati sugli esempi di input o può essere calcolato. L'interpolazione può essere necessaria per alcuni timestamp di output, in particolare per i decodificatori.
  • I timestamp e le durate degli esempi di input devono essere mantenuti nei campioni di output il più possibile.
  • I timestamp di output o le durate potrebbero non corrispondere all'input perché MFT mantiene i dati o interrompe l'output in parti di dimensioni diverse rispetto all'input. In tal caso, il MFT deve calcolare il timestamp di output dal primo esempio di input che contiene dati usati per creare l'esempio di output. Per calcolare il timestamp di output, aggiungere il timestamp di input dell'esempio di input appropriato alla durata dei dati già trasformati da tale esempio. Il secondo esempio alla fine di questa sezione illustra questa idea.
  • Se gli esempi di input hanno durata, tale durata deve essere mantenuta. Se un esempio di input non ha durata, il MFT deve calcolare una durata se possibile dalle dimensioni del buffer di output o dalla frequenza dei dati specificata dal tipo di supporto.
  • Le durate calcolate devono essere troncate (arrotondate verso il basso), non arrotondate all'incremento più vicino. La pipeline ha un margine di flessibilità sufficiente per gestire le durate leggermente imprecise, ma è più facile gestire una durata troppo breve rispetto a una durata troppo breve rispetto a una durata troppo lunga del 1%. Detto questo, non c'è motivo di ridurre intenzionalmente le durate, diversamente dal arrotondamento.

Decoder

Un decodificatore converte i pacchetti compressi in dati non compressi. Poiché l'output non è compresso, i decodificatori hanno un obbligo speciale per ottenere i timestamp e le durate corrette. Alcuni formati compressi, in particolare MPEG-2, non dispongono di timestamp su tutti i pacchetti di input e spesso non hanno durata su alcun pacchetto. Per questi formati, il decodificatore è responsabile dell'inserimento di un timestamp e della durata validi su ogni esempio di output, sommando le durate implicite di tutti gli output dall'ultimo esempio di input timestamp.

Per il video, se la durata non è disponibile nel formato compresso, il decodificatore deve calcolare la durata inversa della frequenza dei fotogrammi, convertita in unità a 100 nanosecondi e arrotondata verso il basso.

Per l'audio, se la durata non è disponibile nel formato compresso, il decodificatore deve calcolare la durata inversa della frequenza di campionamento audio moltiplicata per il numero di campioni nel buffer di output, convertita in 100-nanosecondi e arrotondata verso il basso.

L'unica volta che una trasformazione deve restituire un esempio senza un timestamp è se MFT non ha mai ricevuto un timestamp in un esempio di input o se non è possibile calcolare un timestamp di output accurato dal timestamp di input precedente.

Decodificatori audio

Per i decodificatori audio, la durata di ogni campione di output viene calcolata dalla frequenza di campionamento audio e dal numero di campioni PCM per canale nel buffer di output.

Il modo corretto per calcolare i timestamp di output dipende dal fatto che gli esempi di input contengano timestamp.

Se gli esempi di input contengono timestamp, il decodificatore calcola i timestamp di output dai timestamp di input, come indicato di seguito:

  • Se ogni buffer di input contiene uno o più fotogrammi compressi completi, senza fotogrammi parziali, il timestamp di output equivale al timestamp di input, meno la latenza nota del decodificatore. Ad esempio, un decodificatore Dolby Digital (AC-3) ha una latenza di 256 esempi DI PCM. Ad esempio, con frequenza di campionamento a 48 kHz, la latenza è di 5,33 millisecondi (msec). Pertanto, se il timestamp di input è 1000 msec, il timestamp di output è 1000 - 5.33 = 994.66 msec. Se il buffer di input include più fotogrammi compressi, il decodificatore produrrà un campione di output per ogni frame nell'esempio di input. Tutti gli esempi di output verranno contrassegnati correttamente in modo che non vi siano lacune.
  • A seconda del formato di trasporto, un buffer di input potrebbe contenere fotogrammi parziali. Ad esempio, un buffer potrebbe contenere parte di un frame dal buffer di input precedente, seguito da uno o più fotogrammi completi, seguito dall'inizio del frame successivo. In questo caso, è in genere corretto presupporre che il timestamp di input corrisponda al primo frame che inizia all'interno del buffer. Ovvero, un frame parziale avviato nel buffer precedente non è incluso nel timestamp per il buffer corrente. Calcolare di conseguenza il timestamp di output.

Se gli esempi di input non contengono timestamp:

  • Il decodificatore deve generare i propri timestamp, impostando il primo timestamp di output su zero.
  • La durata dell'esempio viene calcolata dal numero di campioni di output nel buffer e dalla frequenza di esempio.
  • I timestamp successivi vengono calcolati dal timestamp e dalla durata precedenti: timestamp corrente + durata corrente = timestamp successivo. Non ci devono essere lacune nei timestamp di output.

Se il flusso di input contiene inizialmente timestamp, ma per qualche motivo passa a nessun timestamp, il decodificatore deve continuare a generare i propri timestamp di output, in modo che siano continui e non vi sia alcun divario.

Se il flusso di input contiene timestamp, ma ci sono lacune nei tempi, il decodificatore si propaga semplicemente in queste lacune. In altre parole, il decodificatore non deve tentare di correggere i timestamp incoerenti nel flusso di input.

Miscelatori

Nota

In Windows Vista, la pipeline di Media Foundation non supporta le reti multifunzione con più input. Le mft di input multipli sono supportate in Windows 7.

 

Un mixer accetta più input e li combina in un output. Se i flussi di input non sono completamente bloccati a frequenza o sono leggermente offset tra loro, è possibile che si verifichino ambiguità sul tempo da impostare sull'output. Ecco alcune linee guida, a seconda del tipo di supporto:

  • Audio. All'avvio o immediatamente dopo uno scarico o uno scarico, un mixer audio deve attendere di produrre campioni di output fino a quando non ha ricevuto un esempio di input su tutti i flussi di input necessari. A questo punto, deve scegliere il timestamp più recente degli esempi iniziali da usare come baseline per i timestamp di output. Gli altri flussi devono essere riempiti con il silenzio per creare qualsiasi discrepanza temporale. Se un esempio viene ricevuto in un flusso di input facoltativo, deve essere incluso anche nel calcolo. Da questo punto, il MFT deve cercare di produrre una catena continua e senza interruzioni di timestamp di output. In generale, il MFT non deve provare a tenere conto di una deriva di flusso rispetto a un'altra. Deve invece calcolare i timestamp di output dal timestamp di base, la frequenza di output e le dimensioni del buffer. Quando si verifica un altro scarico o scaricamento, il MFT deve reimpostare i relativi timestamp di base.

  • Video. All'avvio o immediatamente dopo uno scarico o uno scarico, un mixer video deve attendere di produrre campioni di output fino a quando non ha ricevuto un esempio di input su tutti i flussi di input necessari. A questo punto, deve scegliere il timestamp più recente degli esempi iniziali da usare come baseline per i timestamp di output. In generale, deve cercare di mantenere i timestamp di output continui e regolari e le durate fisse, anche se l'input non è regolare, se necessario ripetendo i fotogrammi di input.

Codificatori

Un codificatore converte audio o video non compresso in pacchetti compressi. Un codificatore deve seguire queste linee guida:

  • Il codificatore deve seguire le convenzioni del formato di output. Se il formato non viene in genere timestamp ogni esempio, come in MPEG-2, non tutti gli esempi di output devono avere un timestamp e una durata.

  • I timestamp di input devono essere conservati nel formato di output, se il formato contiene campi per i timestamp, a meno che non siano disponibili informazioni temporali migliori da un'altra origine, ad esempio l'applicazione stessa.

Multiplexer

Nota

In Windows Vista, la pipeline di Media Foundation non supporta le reti multifunzione con più input. Le mft di input multipli sono supportate in Windows 7.

 

Un multiplexer combina due flussi audio o video diversi in un formato interleaved, ad esempio AVI o MPEG-2 Transport Stream. Un multiplexer deve seguire queste linee guida:

  • Il multiplexer deve seguire le convenzioni del formato di output. Se il formato non viene in genere timestamp ogni esempio, come in MPEG-2, non tutti gli esempi di output devono avere un timestamp e una durata.

  • Il timestamp deve riflettere la prima volta che verrà inserita in qualsiasi frame che inizia in tale pacchetto o l'ora del primo esempio audio che verrà decodificato da tale pacchetto. Ignorare questa linea guida se è in conflitto con le convenzioni del formato di output.

Demultiplexers

Un demultiplexer divide un formato interleaved, ad esempio AVI o MPEG-2 Transport Stream, nei flussi audio e video sottostanti.

Se il formato contiene informazioni specifiche sul timestamp che possono essere usate per calcolare i timestamp di output accurati in base ai timestamp di input, tali informazioni devono essere usate. Tuttavia, se il formato contiene tempi in una base completamente diversa che non ha alcuna relazione con i timestamp di input e un offset accurato al timestamp di input non può essere calcolato, i tempi del formato devono essere ignorati.

Se il formato non dispone di informazioni sul timestamp utilizzabili, il demultiplexer deve seguire queste regole:

  • I flussi di output non compressi devono avere timestamp e durate validi, se possibile, calcolati dal timestamp di input precedente più vicino.

  • I flussi di output compressi devono avere timestamp solo sul primo esempio di output derivato da un esempio di input con un timestamp. Se l'esempio di input non ha un timestamp, nessun esempio di output derivato da tale esempio di input deve avere un timestamp. Se l'esempio di input è suddiviso in più esempi di output, solo il primo esempio di output deve avere un timestamp e il resto non deve avere timestamp.

Esempi

Esempio 1. Si supponga che un effetto video prenda sempre un frame di input non compresso, applica l'effetto e lo copia nell'output. Non contiene mai fotogrammi o buffer di alcun input. Questo MFT copia semplicemente il timestamp e la durata dall'esempio di input all'esempio di output, se sono disponibili e non esegue calcoli temporali.

Esempio 2. Si supponga che un effetto audio trasforma tutto ma 10 millisecondi (ms) di ogni buffer di input, salvando il valore aggiuntivo di 10 ms da combinare con il buffer successivo. Ottiene un flusso di campioni che hanno una durata di 50 ms. I tempi di input vengono visualizzati nella tabella seguente.

Esempio Tempo di input Durata dell'input Tempo di output Durata dell'output
1 20 50 20 40
2 70 50 60 50
3 121 50 110 50
4 171 50 161 50

 

Si noti la discrepanza tra la durata effettiva del campione 2 e la durata implicita in base al timestamp successivo (121 ? 70 = 51).

Poiché MFT contiene 10 ms, restituisce i primi 40 ms di esempio di input 1 come esempio di output 1, con un timestamp di 20 ms e una durata di 40 ms.

L'esempio di output 2 combina in precedenza 10 ms con 40 ms di esempio di input 2. Questo esempio viene fornito un timestamp di 60 ms (timestamp dell'esempio di input precedente, 20ms, più la durata dei dati già elaborati da tale esempio, 40ms). Viene data una durata di 50ms.

Analogamente, il successivo esempio ha un timestamp di 110ms (70ms + 40ms) con una durata di 50 ms.

Il calcolo successivo è più interessante. Il timestamp implicito dall'ora di output precedente e la durata sono 160 ms (timestamp 110 ms + durata 50 ms). Tuttavia, il timestamp di output dovrebbe essere calcolato dal timestamp di input dell'esempio di input più recente che sovrappone l'esempio di output in tempo, oltre alla lunghezza di tutti i dati già elaborati da tale esempio. L'esempio di input sovrapposto più vicino è il campione 4 (timestamp = 171), ma non è il primo. Il primo esempio sovrapposto è 3 (timestamp = 121). Aggiungendo i 40ms già elaborati da tale esempio, il risultato è 161.

Scrittura di un MFT personalizzato