Visualizzare un filmato nel lettore multimediale (pc o dispositivo da tavolo); un gesto semplice, compiuto nel mondo migliaia di volte, che però cela una tecnologia evoluta nella compressione dei dati, operazione svolta da un software chiamato codec; in questo articolo vedremo quali sono le tecniche più utilizzate e scopriremo i vari modi di codifica del segnale video.
Una perdita intelligente
Le tecniche di compressione video non sono concettualmente differenti da tutti i vari sistemi di compressione dati che conosciamo (es. zip o jpg); praticamente consistono nell'eliminare o perlomeno semplificare la maggiore quantità possibile di informazioni senza provocare per questo una perdita di qualità delle immagini. Tutte queste operazioni prevedono in vario modo una certa perdita di informazione video, ma questa perdita è talmente sofisticata da fare in modo che i nostri occhi (e soprattutto il nostro cervello) non la percepiscano.
L'occhio vede e non vede
Tutto questo è possibile perchè l'occhio umano risulta più sensibile a determinate frequenze piuttosto che altreche; proprio le frequenze a cui l'occhio risulta meno sensibile sono quelle in cui agiscono i codec, che eliminano in toto o in parte le frequenze a cui l'occhio risulta meno sensibie. Le soluzioni adottate dagli standard Mpeg2, Mpeg4, VC-1 e H.264 si conformano tutte a questo genere di tecniche.
Modalità di funzionamento
a) Compressione di singole immagini DCT e quantizzazione (Mpeg2/4, VC-1, H.264) - un film è costituito da tante immagini singole (frame) visualizzate in sequenza; ad esempio,nello standard Pal ne vengono definite 25 al secondo. Il primo passo logico consiste pertanto nella compressione delle singole immagini, proprio come se si dovesse convertire una bitmap nel formato Jpeg.
Per eseguire questa operazione l'encoder suddivide un frame in blocchi di 8 x 8 pixel, distinti per luminosità e colore. La funzione Discrete Cosine Transformation (DCT) converte i valori di luminosità e colore di ciascun blocco nelle frequenze corrispondenti. I dettagli, che l'occhio quasi non percepisce, sono definiti dalle frequenze più elevate.
Per ridurre la quantità di dati interviene a questo punto la quantizzazione.
Utilizzando una matrice di quantizzazione, i valori di frequenza vengono convertiti in numeri interi e le frequenze più alte diventano dei valori 0, che possono essere compressi in modo efficace.
Più è elevato il fattore di quantizzazione, ovvero il fattore di moltiplicazione dei valori nella matrice di quantizzazione, maggiore risulta la compressione del film, anche se la qualità è destinata a peggiorare. La scelta ottimale del quantizzatore è un fattore decisivo se si vuole ottenere un risultato migliore.
b) Memorizzazione delle modifiche delle immagini Group of Pictures & Motion Estimation (Mpeg2/4, VC-1, H.264) - un encoder assembla i frame, da 12 a 13, in un insieme GOP (Group of Pictures). Analogamente al formato Jpeg, solo il primo elemento, che prende il nome di Intraframe (l-Frame), contiene tutte le informazioni sull'immagine; gli altri frame si chiamano P-Frame (Predicted Frame) e B-Frame (Bidirectional Frame) e riportano le modifiche rispetto al frame precedente e successivo; per questo motivo questi frame occupano poco spazio.
L'encoder stabilisce le modifiche mediante la funzione Motion Estimation (previsione di movimento). Per eseguire questa operazione, un frame viene suddiviso in macroblocchi da 16 x 16 pixel e si utilizzano vettori di movimento per descrivere le variazioni di posizione di un macroblocco da un frame all'altro. Un P-Frame fa sempre riferimento all'l-Frame che lo precede, mentre un B-Frame fa riferimento all'I-Frame o al P-Frame precedente e al P-Frame successivo.
Video Obiect Planes (AApeg4, VC-1, H.264) - i vettori di movimento della tecnica Mpeg4 possono anche seguire l'evoluzione di interi oggetti (Shape Coding). In questo modo è possibile descrivere con poche informazioni i movimenti rispetto a sfondi variabili di oggetti complessi costituiti da più macroblocchi. In analogia con il modello GOP, il formato Mpeg4 utilizza pertanto I-, P- e B-VOP. A differenza dei GOP di Mpeg2, gli oggetti VOP (Video Object Planes) non hanno una lunghezza fissa, ma vengono adattati alle condizioni della singola sequenza. In un film può pertanto capitare di avere un I-Frame solo dopo 250 frame e di iniziare in questo modo il VOP successivo. Quarter Pixel (AApeg4, VC-1, H.264) - in molte sequenze di film gli oggetti si muovono poco da frame a frame. Per rappresentare al meglio queste minime modifiche gli encoder Mpeg utilizzano la funzione Pixel-lnterpolation, che permette di descrivere anche vettori di movimento non basati su numeri interi, ossia relativi a interi pixel.
Con Mpeg2 la precisione è di mezzo pixel, mentre i codec Mpeg4 come DivX o XviD possono eseguire calcoli su quarti di pixel. La soluzione H.264 prevede una funzione Quarter Pixel Prediction integrata e fissa. Global Motion Compensation (Mpeg4) - si tratta di una funzione particolare di DivX e XviD, con la quale l'oggetto è definito tramite la funzione Shape Coding e riceve diverse marcature dette Warp Point. Già con due Warp Point l'encoder è in grado di riconoscere rotazioni e modifiche delle dimensioni, con tre Warp Point è possibile registrare le distorsioni prospettiche. In questo modo GMC può essere considerata una tecnica di compressione efficace per risolvere le funzioni di zoom e le oscillazioni della camera.
c) Come evitare gli artefatti e la formazione di blocchi
Grandezze dei blocchi flessibili (VC-1): a differenza di Mpeg2 e Mpeg4 che prevedono solo blocchi di dimensione fissa, l'encoder H.264 può lavorare anche con blocchi di dimensioni diverse, in modo da adattarsi al film che si sta elaborando.
Per ciò che riguarda gli I-Frame, la dimensione dei blocchi predefinita è di 4 x 4 pixel, dimensione che consente di elaborare in modo accurato variazioni locali dell'immagine.
I testi ad esempio sono fattori critici, ma in questo modo la tecnica H.264 evita per esempio la formazione di blocchi sui bordi dei testi inseriti. Nel caso di aree di grandi dimensioni con pochi dettagli, l'encoder utilizza una dimensione dei blocchi di 16 x 16 pixel. Nei P-Frame e nei B-Frame l'encoder utilizza dimensioni dei blocchi differenti, da 16 x 16 fino a 4 x 4, che vengono impiegate in modo flessibile. In questo modo si utilizzano rispettivamente vettori di movimento differenti (fino a 16 vettori per macroblocco) e si descrivono così le variazioni più accurate da immagine a immagine. Multi Frame Prediction (H.264)- un encoder H.264 può generare vettori di movimento da un numero qualsiasi di frame precedenti o successivi. Può inoltre elaborare i vettori a partire da B-Frame.
Questo effetto fa risparmiare circa il 12% di spazio, ma aumenta il tempo di elaborazione a causa del maggiore numero di frame di riferimento utilizzati. Filtro di Deblocking (H.264) - in tutti i processi di codifica basati sui blocchi, se il valore di bit rate è troppo basso vengono generati artefatti. L'encoder H.264 evita questo effetto utilizzando un filtro di Deblocking, che maschera abilmente gli artefatti con transizioni di colore e di luminosità, in modo che la nitidezza all'osservazione non venga degradata. Il valore di bit rate cala del 10% rispetto a una sequenza equivalente da un punto di vista qualitativo ma non filtrata. Il filtro di Deblocking è però l'elemento che consuma più risorse dell'encoder. Chi disattiva questo filtro può ottenere tempi di codifica più brevi anche del 40%. d) Compressione del file completo Entropy Coding (H.264) - nell'ultima fase delle operazioni tutti i valori calcolati per lo stream video sono compressi senza perdite a livello di bit, in un modo molto simile a quello della compressione per creare un archivio. A differenza degli encoder Mpeg2 e Mpeg4 che utilizzano per questa operazione il metodo Huffman, adottato anche per la compressione dei file Zip, l'encoder H.264 prevede due metodi nuovi: CAVLC (Context Adaptive Variable Length Coding) e CABAC (Context Adaptive Binary Arithmetic Coding). Il secondo è più impegnativo, ma in compenso ottiene risultati più efficaci di circa il 10-12%. Invece di utilizzare come in CAVLC tabelle di codice predefinite, il metodo CABAC crea proprie tabelle ed è così in grado di comprimere lo stream in modo ottimale.