Timestamp e durate
In questo argomento viene descritto come le trasformazioni di Media Foundation devono gestire i timestamp.This topic describes how Media Foundation Transforms should handle timestamps.
Un MFT deve impostare il timestamp e la durata più accurati possibile in tutti gli esempi di output. Per un semplice MFT che accetta un buffer di input e lo elabora completamente in un buffer di output, MFT deve semplicemente 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 MFP devono rispettare le regole di base seguenti:
- Un MFT deve provare a inserire un timestamp e una durata in tutti i campioni di output audio o video non compressi se viene specificato un timestamp o una durata accurati sui campioni 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 o le durate di output potrebbero non corrispondere all'input perché MFT mantiene i dati o suddivide l'output in parti di dimensioni diverse rispetto all'input. In tal caso, MFT deve calcolare il timestamp di output del primo esempio di input che contiene i 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 campione. Il secondo esempio alla fine di questa sezione illustra questa idea.
- Se gli esempi di input hanno una durata, tale durata deve essere mantenuta. Se un campione 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 che la pipeline gestisca una durata di 1% troppo breve di una durata pari a 1% troppo lunga. Detto questo, non c'è motivo di abbreviare deliberatamente le durate, ad eccezione dell'arrotondamento.
Decoder
Un decodificatore converte i pacchetti compressi in dati non compressi. Poiché l'output non è compresso, i decodificatori hanno un obbligo speciale di ottenere i timestamp e le durate corretti. Alcuni formati compressi, in particolare MPEG-2, non hanno 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 per ogni campione di output, sommando le durate implicite di tutto l'output dall'ultimo esempio di input timestamp.
Per il video, se la durata non è disponibile nel formato compresso, il decodificatore deve calcolare la durata come inversa della frequenza dei fotogrammi, convertita in unità di 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, convertito in unità di 100 nanosecondi e arrotondato verso il basso.
L'unica volta che una trasformazione deve restituire un campione senza timestamp è se MFT non ha mai ricevuto un timestamp su un campione 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 è uguale al timestamp di input, meno la latenza nota del decodificatore. Ad esempio, un decodificatore Dolby Digital (AC-3) ha una latenza di 256 campioni 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ù di un intero frame compresso, il decodificatore produrrà un campione di output per ogni fotogramma 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 frame parziali. Ad esempio, un buffer può contenere parte di un frame del 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 fotogramma 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 timestamp del primo output su zero.
- La durata del campione viene calcolata dal numero di campioni di output nel buffer e dalla frequenza di campionamento.
- I timestamp successivi vengono calcolati dal timestamp e dalla durata precedenti: timestamp corrente + durata corrente = timestamp successivo. Non dovrebbero esserci lacune nei timestamp di output.
Se inizialmente il flusso di input contiene 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 vi sono lacune nei tempi, il decodificatore propaga semplicemente queste lacune. In altre parole, il decodificatore non deve tentare di correggere timestamp incoerenti nel flusso di input.
Miscelatori
Nota
In Windows Vista la pipeline di Media Foundation non supporta le MFP con più di un input. Le MFP con più input sono supportate in Windows 7.
Un mixer accetta più input e li combina in un unico output. Se i flussi di input non sono completamente bloccati dalla frequenza o sono leggermente scostati l'uno dall'altro, può verificarsi un'ambiguità circa il tempo da impostare sull'output. Ecco alcune linee guida, a seconda del tipo di supporto:
Audio. All'avvio o immediatamente dopo uno svuotamento o uno scaricamento, 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 meno recente degli esempi iniziali da usare come baseline per i timestamp di output. Gli altri flussi devono essere riempiti con silenzio per risolvere eventuali discrepanze temporali. Se un campione viene ricevuto in un flusso di input facoltativo, deve anche essere inserito nel calcolo. Da questo punto in poi, il MFT dovrebbe cercare di produrre una catena continua e senza interruzioni di timestamp di output. In generale, il MFT non deve cercare di tenere conto di un flusso che deriva rispetto a un altro. È invece necessario calcolare i timestamp di output dal timestamp di base, dalla frequenza di output e dalle dimensioni del buffer. Quando si verifica un altro svuotamento o scaricamento, il MFT deve reimpostare i timestamp di base.
Video. All'avvio o immediatamente dopo uno svuotamento o uno scaricamento, 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 meno recente degli esempi iniziali da usare come baseline per i timestamp di output. In generale, deve cercare di mantenere timestamp di output continui e regolari e durate fisse, anche se l'input non è normale, se necessario ripetendo i fotogrammi di input.
Encoder
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 campione, come in MPEG-2, non tutti gli esempi di output devono avere un timestamp e una durata.
I timestamp di input devono essere mantenuti nel formato di output, se il formato contiene campi per i timestamp, a meno che le informazioni sull'ora migliori non siano disponibili da un'altra origine, ad esempio l'applicazione stessa.
Multiplexer
Nota
In Windows Vista la pipeline di Media Foundation non supporta le MFP con più di un input. Le MFP con più input sono supportate in Windows 7.
Un multiplexer combina due flussi audio o video diversi in un unico 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 campione, 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 verrebbe inserita in qualsiasi fotogramma che inizia in tale pacchetto o l'ora del primo campione audio che verrebbe decodificato da tale pacchetto. Ignorare questa linea guida se è in conflitto con le convenzioni del formato di output.
Demultiplexer
Un demultiplexer suddivide 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 utilizzate per calcolare indicatori temporali di output accurati in base ai timestamp di input, tali informazioni devono essere utilizzate. Tuttavia, se il formato contiene tempi in una base completamente diversa che non ha alcuna relazione con i timestamp di input e non è possibile calcolare un offset accurato al timestamp di input, i tempi del formato devono essere ignorati.
Se il formato non dispone di informazioni sul timestamp utilizzabili, il demultiplexer deve seguire queste regole:
Se possibile, i flussi di output non compressi devono avere timestamp e durate validi, 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ù campioni 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 acquisisca sempre un frame di input non compresso, applichi 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 disponibili e non esegue calcoli temporali.
Esempio 2. Si supponga che un effetto audio trasformi tutti i dati tranne 10 millisecondi (ms) di ogni buffer di input, salvando i 10 ms aggiuntivi da combinare con il buffer successivo. Ottiene un flusso di campioni con una durata di 50 ms. I tempi di input vengono visualizzati nella tabella seguente.
Campione | Tempo di input | Durata dell'input | Ora 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 di 1 ms 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 input campione 1 come esempio di output 1, con un timestamp di 20 ms e una durata di 40 ms.
L'esempio di output 2 combina i 10 ms precedentemente mantenuti con 40 ms di esempio di input 2. In questo esempio viene fornito un timestamp di 60 ms (timestamp dell'esempio di input precedente, 20 ms, più la durata dei dati già elaborati da tale campione, 40 ms). Viene data una durata di 50 ms.
Analogamente, il campione successivo ha un timestamp di 110 ms (70 ms + 40 ms) con una durata di 50 ms.
Il calcolo successivo è più interessante. Il timestamp implicito dell'ora e della durata dell'output precedente sarebbe 160 ms (timestamp 110 ms + durata 50 ms). Tuttavia, il timestamp di output dovrebbe essere calcolato dal timestamp di input del primo esempio di input che si sovrappone al campione di output nel tempo, più la lunghezza di tutti i dati già elaborati da tale campione. Il campione di input sovrapposto più vicino è il campione 4 (timestamp = 171), ma questo non è il primo. Il campione sovrapposto meno recente è 3 (timestamp = 121). Aggiungendo i 40 ms già elaborati da tale esempio, il risultato è 161.
Argomenti correlati
-
scrittura di un MFT personalizzato