Dal lato decoder, si ha overflow del buffer quando il decodificatore non rimuove abbastanza dati, e underflow quando vengono rimossi troppi dati.
Lo standard MPEG definisce un modello ideale di decodificatore, detto Video Buffering Verifier (VBV) da utilizzarsi per limitare il bitrate istantaneo del codificatore, in modo che il bitrate medio sia tale da non far incorrere nell'overflow o underflow del buffer del decoder. In questo modello di decodificatore, si sfruttano quattro parametri facenti parte del bitstream della sequenza video. Essi sono:
Quando il bitrate è fisso, il parametro bit_rate nell'header della sequenza video contiene il bitrate nominale del flusso dati, in unità di 400bit/s. Il bitrate nominale,
, è dato da :
| (2.37) |
| (2.38) |
Picture_rate è un parametro su quattro bit nell'header della sequenza video, e determina il ritmo a cui le immagini decodificate devono essere disponibili per la visualizzazione, e, di conseguenza, il ritmo a cui le immagini compresse devono essere rimosse dal buffer per essere decodificate.
Il parametro vbv_buffer_size stabilisce un limite inferiore alla grandezza del buffer necessario al decoder per poter operare con successo, espresso in unità di 2048 byte. Quindi, la dimensione del buffer in bit è data da:
| (2.39) |
Nel caso del Constrained Parameter Bitstream, vbv_buffer_size deve essere minore o uguale a 20, il che indica un buffer minore o uguale a 40kByte. Il parametro fornisce anche un limite superiore al codificatore, definendo il numero massimo di bit che possono essere immagazzinati nel VBV.
Poiché encoder e decoder possono avere clock e bitrate leggermente differenti, il decoder deve potersi sincronizzare periodicamente con l'encoder attraverso i dati ricevuti. Questo viene fatto tramite il parametro vbv_delay, che dice al decoder esattamente quando rimuovere una data immagine dal buffer e decodificarla.
Dato un certo bitrate effettivo
, un picture rate
, e una dimensione del buffer vbv_buffer_size, l'overflow e l'underflow sono controllati da vbv_delay, che definisce il tempo tra la ricezione del primo bit di dati della prima immagine nel buffer, e l'inizio della decodifica di quell'immagine. Di conseguenza, viene stabilita l'occupazione del buffer del decoder all'inizio della decodifica di ogni immagine.
Il valore di vbv_delay è calcolato tramite
| (2.40) |
Poiché il vbv_delay è calcolato tramite il clock dell'encoder e il suo bitrate, esso è una misura della quantità di dati presenti nel buffer, cioè rappresenta l'occupazione (occupancy) del buffer.
vbv_delay può essere usato per correggere eventuali discrepanze tra la temporizzazione dell'encoder e del decoder all'inizio della fase di decodifica di ogni immagine. Le specifiche MPEG non stabliscono come questo possa essere fatto, lasciando la decisione all'implementatore. Se la sincronizzazione non può essere stabilita, si deve fornire un meccanismo per poter scartare un'immagine e ripetere quella precedente.
La figura
mostra un grafico dell'occupazione del buffer del decoder in funzione del tempo, a partire da un buffer vuoto. L'ordinata è l'occupazione del buffer, e l'ascissa è il tempo, in unità di ``encoder picture intervals''. Le barre verticali indicano la rimozione istantanea dell'immagine: la parte bianca rappresenta i dati compressi e la parte nera rappresenta l'intestazione dell'immagine (picture header). I tratti obliqui indicano il riempimento del buffer a ritmo costante.
Il lungo ritardo tra la ricezione del primo dato e l'inzio della decodifica è necessario per caricare la maggior parte dei dati delle prime due immagini, in questo caso una I e una P. Senza questo ritardo si avrebbe un ``buffer underflow''. Dopo essere stato quasi svuotato dalla rimozione delle prime due immagini, il buffer si riempie gradualmente. All'inizio della prima immagine del successivo GOP, che sarà ancora di tipo I, l'occupazione del buffer è circa la stessa che si aveva all'inizio della decodifica.
Se il buffer è grande in confronto al numero di bit necessari per codificare le immagini I, che sono quelle che occupano la maggior quantità di spazio, significa che si ha abbastanza elasticità da tollerare una grande variabilità nel numero di bit per immagine. Se il buffer è piccolo rispetto al valore di picco di bit per immagine, bisigna imporre un limite al bitrate.
Ad alti bitrate, le immagini I potrebbero stare appena nel buffer. Sotto queste condizioni il range di quantizer_scale che non producono overflow o underflow è abbastanza ristretto: è allora importante usare più di 5 bit di precisione per quantizer_scale, altrimenti, con solo 5 bit, un cambiamento da 2 a 1 approssimativamente raddoppia il bitrate.
A bitrate molto bassi, l'underflow diventa molto probabile. Un basso bitrate generalmente non è sostenibile se la quantizzazione variabile è l'unico metodo per ridurre il bitrate: addizionali riduzioni di dati sono necessarie, a partire dall' eliminazione dei coefficienti della DCT.
Se il bitrate è particolarmente basso, scartare le immagini (ripetendo un'altra immagine adiacente) può rivelarsi necessario. La ripetizione di immagini non è prevista dalla sintassi MPEG, ma non è neanche proibita.