Subsections


Il codec usato in questo lavoro

L'obiettivo perseguito nel progetto di questo codec [2] è stato quello di realizzare un algoritmo di codifica e decodifica video accessibile alla platea più ampia ed eterogenea possibile di utenti. Questo significa che l'algoritmo deve risentire il meno possibile delle eventuali limitazioni che caratterizzano il singolo utente, sia in termini di capacità del canale che di potenza di calcolo.

Deve essere permesso l'accesso tanto sui canali a banda larga quali ad esempio le reti ATM o le reti locali, quanto sulle reti a banda più limitata come ad esempio le reti geografiche. Questo è reso possibile dall'implementazione di tecniche di codifica scalabile; realizzando un bit-stream embedded, infatti ogni utente potrà scegliere i livelli da ricevere in accordo con la capacità della propria rete di accesso.

Si desidera inoltre rendere possibile in tempo reale tanto la decodifica che la codifica anche su terminali con limitata potenza di calcolo. L'algoritmo quindi è simmetrico, ed una particolare attenzione è stata posta nello scegliere tecniche di codifica che avessero un bassa complessità computazionale.

La scalabilità in risoluzione spaziale

Per realizzare una codifica scalabile in risoluzione spaziale è stata scelta la tecnica della codifica piramidale laplaciana.

Tramite un serie di filtraggi e decimazioni ci si riconduce ad una sequenza di immagini delle dimensioni di 180×144 pixel, questa viene codificata e trasmessa, e rappresenta quello che chiameremo livello base. Tale livello viene quindi decodificato (in modo da ottenere la stessa sequenza che si ha in ricezione) e sovracampionato ottenendo in questo modo una sequenza di immagini delle dimensioni di 360×288 pixel. Queste immagini vengono confrontate con quelle della sequenza originale e viene codificata e trasmessa la differenza tra le due sequenze, ottenendo in questo modo il livello enhanced. In questo modo, in ricezione sarà possibile scegliere ad esempio di ricevere il solo livello base, oppure si potrà ricevere anche il livello enhanced, nel qual caso la sequenza di livello base andrà decodificata sovracampionata e sommata alla sequenza di livello enhanced decodificata. In aggiunta è possibile ottenere in ricezione immagini delle dimensioni di 720×576 pixel, semplicemente sovracampionando e interpolando le immagini di livello enhanced. In figura [*] sono mostrati gli schemi di principio per la codifica e la decodifica.

Figure: Scalabilità in risoluzione spaziale
[Codifica.] \resizebox*{12cm}{!}{\includegraphics{immagini/CAP1/CodScaSpaz2.eps}}

[Decodifica] \resizebox*{12cm}{!}{\includegraphics{immagini/CAP1/DecodScaSpaz2.eps}}

Riassumendo, in ricezione sono disponibili le tre seguenti risoluzioni spaziali:

180 x 144
Si ottiene ricevendo il solo livello base.
360 x 288
Si ottiene ricevendo i livelli base ed enhanced, le immagini di livello base decodificate e sovracampionate vanno sommate alla sequenza di livello enhanced decodificata.
720 x 576
Si ottiene semplicemente sovracampionando la sequenza decodificata di livello enhanced. In questo caso quindi non è richiesto nessun ulteriore impiego di banda rispetto al livello enhanced.

La scalabilità in risoluzione temporale

É chiaro che quante più frame al secondo trasmettiamo tanto più fluida sarà la sequenza, ma allo stesso tempo tanto maggiore sarà il tasso trasmissivo. Inoltre al crescere del frame rate devono crescere di pari passo le prestazioni del codificatore e del decodificatore, infatti se ad esempio il frame rate è di 10 frame/s avremo a disposizione per la codifica/decodifica della singola frame 1/10 = 0, 1 secondi mentre se il frame rate è di 25 frame/s avremo a disposizione 1/25 = 0, 04 secondi.

Per garantire la scalabilità temporale si ricorre ad una suddivisione delle frame in 3 livelli temporali. Nel primo livello viene trasmessa una frame ogni 4 quattro, quindi possiamo dire che vengono trasmesse tutte le frame con indice 4*n con n intero. Nel secondo livello temporale invece viene ancora trasmessa una frame ogni quattro, ma in questo caso si trasmettono le frame con indice 4*n + 2, infine nel terzo livello temporale vengono trasmesse le frame con indice 4*n + 1 e 4*n + 3, quindi una ogni due. In figura [*] è mostrata la suddivisione in flussi temporali.

Figure: Scalabilità in risoluzione temporale.
\resizebox*{12cm}{!}{\includegraphics{immagini/CAP1/ScaTemp.eps}}

Combinando questi livelli temporali è possibile ottenere 3 diversi frame rate.

Per la codifica interframe si è optato per il conditional replenishment (CR); ne viene usata la versione unidirezionale nel caso delle frame del flusso 4*n, mentre per le frame degli altri due flussi viene usato il CR bidirezionale. Le frecce in figura [*] indicano appunto le dipendenze per il CR. Ciò evidenzia anche che l'unico flusso indipendente (che cioè può essere decodificato senza ricevere i restanti flussi) è il primo, mentre il secondo flusso richiede il primo, e il terzo li richiede entrambi.

A causa di queste dipendenze, l'ordine con il quale vengono codificate le frame è diverso da quello con il quale vengono acquisite, infatti all'uscita del codificatore avremo una sequenza di questo tipo: 0 4 2 1 3 8 6 5 7 12... . Questo introduce dei piccoli ritardi sia in fase di codifica che di decodifica, in quanto è necessario riordinare le frame.

La scalabilità in precisione

Con la scalabilità in precisione (anche detta scalabilità in SNR) è possibile agire sul trade-off esistente tra qualità della ricostruzione e tasso trasmissivo. Per poterne illustrare il funzionamento è necessario scendere più in dettaglio nella descrizione delle tecniche di codifica.

Come algoritmo di compressione si è optato per la quantizzazione vettoriale tabellare con struttura gerarchica. La quantizzazione vettoriale tabellare consente la codifica semplicemente accedendo ad una tabella, in questa tabella si entra con il blocco di pixel da quantizzare e si ricava l'indice della codeword che quantizza quel blocco. La creazione della tabella viene fatta off-line una volta per tutte, e permette ad esempio di utilizzare metriche anche sofisticate (tenendo conto ad esempio della percezione visiva) nella valutazione della distorsione. Tuttavia non è pensabile utilizzare un'unica tabella, perché questa dovrebbe avere dimensioni estremamente grandi, per questo motivo si organizza una gerarchia di tabelle più piccole.

Per ottenere la scalabilità in precisione si ricorre alla tecnica chiamata TSVQ (Tree Structured Vector Quantization), in pratica le parole codice sono organizzate in una struttura ad albero, è possibile quindi utilizzare un prefisso qualunque degli indici completi, riducendo in questo modo il tasso (ma anche la qualità ovviamente).

Il codec in dettaglio

Nei paragrafi precedenti sono state introdotte per sommi capi le tecniche utilizzate in questo codec, in questo paragrafo verrà invece mostrato più in dettaglio il suo funzionamento, analizzando gli schemi di codifica e decodifica intra/inter-frame.

In tabella [*] viene illustrato il significato dei simboli usati negli schemi.


Table: I simboli usati negli schemi di codifica e decodifica.
Simbolo Significato
Y Immagine originaria a 360×288 pixel
Z Immane filtrata e decimata, 180×144 pixel
A Indici delle parole codice ottenute dalla VQ di Z
Z' Versione ricostruita di Z a valle della VQ
Y' Versione sovracampionata di Z
W Errore di predizione da trasmettere per il livello enhanced
W' Versione ricostruita di W a valle della VQ
Y'' Versione di Y ricostruita in ricezione
U Versione sovracampionata di Y''
B Indici delle parole codice ottenute dalla VQ di W
EA Errore di predizione su A
TA Soglia di decisione del CR su A
A'' Frame base di riferimento
B'' Frame enhanced di riferimento


Invece in figura [*] vengono mostrati gli schemi del codificatore e del decodificatore intraframe.

Figure: Schemi per la codifica/decodifica intraframe.
[Codificatore] \resizebox*{12cm}{!}{\includegraphics{immagini/CAP1/CoderIntra.eps}}

[Deocidificatore] \resizebox*{10cm}{!}{\includegraphics{immagini/CAP1/DecoderIntra.eps}}

Come vediamo otteniamo due flussi codificati, quello dei vettori A corrisponde agli indici delle codeword che codificano le immagini di livello di base, mentre i vettori di tipo B contengono gli indici delle codeword che codificano il livello enhanced (differenza tra l'immagine di livello base sovracampionata e quella originale a 360×288 pixel).

La quantizzazione vettoriale opera su blocchi di 2×4 pixel (ogni pixel è rappresentato da un byte) e produce indici da 1 byte (codebook da 256 codeword), per cui per la codifica intra il rapporto di compressione è pari ad 8.

Nel caso della codifica interframe si usa la tecnica del conditional replenishment (CR), con una particolarità, la tecnica viene applicata agli indici (vettori tipo A) e non alle frame vere e proprie. Questo permette di ridurre notevolmente i calcoli in quanto tali vettori hanno dimensioni molto minori rispetto alle frame (bisogna dividere le dimensioni delle frame per il rapporto di compressione), inoltre per ridurre l'overhead dovuto ai bit che segnalano l'esito del CR, questo è applicato a blocchi di dimensioni 3×3 indici, cioè in definitiva, su macroblocchi di 6×12 pixel. Tuttavia è bene precisare che è possibile effettuare il CR sugli indici invece che sui pixel perché i codici sono stati progettati in modo che ad indici vicini corrispondano blocchi molto simili (anche se questo è vero solo localmente), quindi confrontare pixel non è molto diverso che confrontare indici.

In figura [*] sono mostrati il codificatore ed il decodificatore interframe nel caso di conditional replenishment unidirezionale (il caso bidirezionale è del tutto analogo).

Figure: Schemi per la codifica/decodifica interframe.
[Codificatore] \resizebox*{12cm}{!}{\includegraphics{immagini/CAP1/CoderInter.eps}}

[Decodificatore] \resizebox*{11cm}{!}{\includegraphics{immagini/CAP1/DecoderInter.eps}}

Come vediamo dallo schema del codificatore, i blocchi di indici vengono confrontati con quelli di riferimento, se l'energia della differenza supera una certa soglia il blocco viene trasmesso (insieme ad un bit di segnalazione pari ad 1), altrimenti viene trasmesso unicamente un bit di segnalazione pari a 0.

Per quanto riguarda il livello enhanced, solo i blocchi corrispondenti ai blocchi di indici per i quali il CR non ha avuto successo vengono trasmessi, in pratica si ipotizza di poter estendere anche a livello enhanced i risultati del CR effettuato a livello base. Questa scelta permette di avere una complessità computazionale molto ridotta, tuttavia probabilmente avere CR separati sui due livelli produrrebbe risultati di qualità migliore.

Debian User 2003-06-05