next up previous
Next: Profili di controllo di Up: Lo standard MPEG Video Previous: Livelli

Controllo di flusso

In un sistema MPEG, sia il codificatore che il decodificatore possiedono un buffer, e il comportamento dei due buffer è simmetrico. Quello del decoder è riempito a burst quando le immagini vengono codificate, perché le immagini hanno differenti tassi di compressione, e svuotato a velocità costante quando i dati vengono trasmessi. Il buffer del decodificatore è riempito a velocità costante quando i dati vengono ricevuti e svuotato a burst quando i dati sono decodificati.

Figura: Buffer del codificatore e del decodificatore.

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:

bit_rate
picture_rate
vbv_buffer_size
vbv_delay

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, $R'$, è dato da :

\begin{displaymath}
R' = \textsf{bit\_rate} \times 400 \unit{bit/s}
\end{displaymath} (2.37)

e il parametro bit_rate è calcolato dal bitrate effettivo del codificatore, $R$, tramite la relazione:
\begin{displaymath}
bit\_rate = \bigg\lceil \frac{R}{400} \bigg\rceil
\end{displaymath} (2.38)

dove il simbolo $\lceil\rceil$ indica arrotondamento all'intero superiore.

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:

\begin{displaymath}
B=8 \times 2048 \times \textsf{vbv\_buffer\_size}
\end{displaymath} (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 $R$, un picture rate $P$, 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

\begin{displaymath}
\textsf{vbv\_delay} = \frac{90,000 \times B_{n}^{*}}{R}
\end{displaymath} (2.40)

dove $R$ è il bitrate effettivo dell'encoder, in bit/s, e $B_{n}^{*}$ è il numero di bit che si accumulano nel buffer prima che i dati dell'immagine compressa siano rimossi. vbv_delay è, quindi, il numero di periodi del clock di sistema (a 90MHz) che il VBV deve attendere prima di estrarre i dati dell'immagine dal buffer: si assume che l'estrazione dei dati sa istantanea.

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.

Figura: Occupazione del buffer del decodificatore.

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.



Subsections
next up previous
Next: Profili di controllo di Up: Lo standard MPEG Video Previous: Livelli
Marco Delaurenti
1999-06-25