Salta al contenuto
Note per Studenti Codifica video - stima del moto, MPEG e H.264

Codifica video - stima del moto, MPEG e H.264

In questa pagina 8

Un video HD non compresso a 50 Hz richiede 1,244 Gbit/s, un 4K oltre 5 Gbit/s (Audio, immagini e video digitali non compressi e spazi di coloreIl parlato (banda 200-3400 Hz) si digitalizza con $F_c=8$ kHz e 8 bit per campione: 64 kbit/s (PCM, pacchetti di 20 ms = 160 campioni = 160 byte). La musica (banda fino a 20 kHz) con $F_c=44{,}1$ kHz, 16 bit, 2 canali: 1,411 Mbit/s. Un'immagine a colori RGB ha 3 canali da 8 bit (24 bit per pixel); nello spazio YCbCr, ottenuto con una rotazione dello spazio colore, l'occhio è molto meno sensibile alla crominanza e si scartano 3 campioni su 4 di Cb e Cr (4:2:0), dimezzando i dati: $1{,}5\cdot H\cdot W$ campioni per immagine. Un video non compresso costa $H,W,1{,}5,b,f$ bit/s (1080p a 50 Hz: 1,244 Gbit/s, 4K: 5,3 Gbit/s): serve la compressione.Audio, immagini e video digitali non compressi e spazi di colore →). Nessuna rete e nessun disco può sostenerli: servono compressioni di centinaia di volte. Il grosso del risparmio viene dalla ridondanza temporale: due immagini consecutive di un video sono quasi uguali. Questa nota spiega come la si sfrutta (stima e compensazione del movimento), come si organizzano i fotogrammi (I, P, B e GOP), come è fatto un codificatore video ibrido, e quali sono gli standard. Gli esercizi sono in Esercizio - Stima del movimento, GOP e bit-rate del video (domande ed esercizi del corso).

1. Principi

La compressione video sfrutta due ridondanze.

Il codificatore calcola una predizione del blocco di pixel corrente e invia al decodificatore: (1) tutti i parametri necessari a fare la stessa predizione (per esempio vettori di movimento) e (2) una versione compressa dell'errore di predizione, cioè della differenza tra il blocco da comprimere e la sua predizione. Il codificatore deve tenere una copia dell'immagine decodificata (Decoded Frame Buffer, DFB): così la predizione è ripetibile identica nel decodificatore (se il codificatore predicesse dall'originale, e il decodificatore dalla versione già degradata, le due predizioni divergerebbero).

È importante limitare l'estensione delle tecniche predittive: per limitare la propagazione degli errori, per permettere l'accesso casuale al video (iniziare a guardare da un punto qualunque) e per limitare la complessità del codificatore. Per questo ci sono i tipi di immagine I, P, B, organizzati in una struttura periodica detta GOP (group of pictures).

I parametri di progetto di un codificatore sono: la modalità di predizione temporale (parametri della stima del movimento), la struttura del GOP, la strategia di mode selection (come si decide di codificare ogni blocco, tra le molte alternative). Come per le immagini, le prestazioni si misurano con tasso, qualità (PSNR e altre metriche, Qualità del servizio (QoS) e qualità dell'esperienza (QoE)La QoS (ITU-T E.800) è l'insieme delle caratteristiche di un servizio di telecomunicazioni che ne determinano la capacità di soddisfare l'utente: si misura con throughput, ritardo, jitter, perdite, disponibilità e affidabilità. La QoE è la qualità percepita dall'utente ("grado di gradimento o fastidio"): dipende da applicazione (A), risorse (R), contesto (C), utente (U) e richiede una QoS adeguata. Si misura con metriche soggettive (test con osservatori: MOS medio da 1 a 5 secondo ACR, DCR, confronto a coppie; si stimano media, deviazione standard, errore standard $SE=\frac s{\sqrt N}$ e intervallo di confidenza $\pm1{,}96,SE$) e oggettive (full/reduced/no reference): MSE, PSNR (anche YCbCr con pesi $\frac34,\frac18,\frac18$), metriche di Bjontegaard (BD-PSNR, BD-rate) per confrontare codec, SSIM (similarità strutturale), VMAF (machine learning, Netflix). Nessuna cattura gli stalli e le variazioni di qualità dello streaming.Qualità del servizio (QoS) e qualità dell'esperienza (QoE) →), complessità, ritardo (serve accumulare dati prima di codificare?) e robustezza agli errori nel bitstream.

2. Predizione temporale: stima e compensazione del movimento

Un semplice modello del video: ogni nuova immagine è il risultato del movimento di oggetti e camera. Allora l'immagine corrente si può predire "spostando" opportunamente gli oggetti dell'immagine precedente; l'errore di predizione (immagine vera meno predizione) è tipicamente un segnale molto sparso, quindi si codifica bene.

  • Stima del movimento (ME): associare a ogni pixel (in pratica a ogni blocco) p=(x,y)\mathbf p=(x,y) dell'immagine corrente fnf_n un vettore di movimento v(x,y)\mathbf v(x,y) che punta verso un pixel dell'immagine di riferimento fn−Nf_{n-N}. Idealmente rappresenta la proiezione sul piano d'immagine del moto 3D degli oggetti.
  • Compensazione del movimento (MC): creare la predizione f^n(p)=fn−N(p+v(p))\hat f_n(\mathbf p)=f_{n-N}(\mathbf p+\mathbf v(\mathbf p)).

2.1 Block-matching

Si indica con Bk(p)B_k^{(\mathbf p)} il blocco di pixel centrato in p\mathbf p nella kk-esima immagine (consideriamo immagini in grigi): un vettore di Rn\mathbb R^n, con n=N⋅Mn=N\cdot M pixel. Si cerca nell'immagine di riferimento hh un blocco Bh(p+v)B_h^{(\mathbf p+\mathbf v)} che gli somigli, traslato di v\mathbf v. La dissimilarità d(v)=d(Bk(p),Bh(p+v))d(\mathbf v)=d\bigl(B_k^{(\mathbf p)},B_h^{(\mathbf p+\mathbf v)}\bigr) si può misurare con

  • SAD (sum of absolute differences): ∑∣ai−bi∣\sum|a_i-b_i|;
  • SSD (sum of squared differences): ∑(ai−bi)2\sum(a_i-b_i)^2.

Si usa tipicamente la SAD: molto più rapida e con qualità vicina all'MSE. Il vettore stimato ottimizza un compromesso tra dissimilarità e costo di codifica R(v)R(\mathbf v) del vettore: v∗=arg⁡min⁡v∈W d(Bk(p),Bh(p+v))+λ R(v)\boxed{\mathbf v^*=\arg\min_{\mathbf v\in\mathcal W}\ d\bigl(B_k^{(\mathbf p)},B_h^{(\mathbf p+\mathbf v)}\bigr)+\lambda\,R(\mathbf v)} dove W\mathcal W è l'insieme dei vettori candidati (finestra di ricerca). Il termine λR(v)\lambda R(\mathbf v) si chiama regolarizzazione: λ\lambda regola il compromesso tra qualità della predizione e costo di codifica dei vettori. Non è facile determinare il λ\lambda ottimale a priori; ci sono euristiche efficaci.

La stima del movimento serve a trovare il miglior predittore del blocco corrente, non a individuare il movimento fisico degli oggetti (spesso coincidono, non sempre). L'errore e=Bk(p)−Bh(p+v∗)e=B_k^{(\mathbf p)}-B_h^{(\mathbf p+\mathbf v^*)} si codifica con un metodo "simile a JPEG" ed è in genere più sparso del blocco originale. Se non si trova un buon predittore (per esempio un oggetto "nuovo") conviene non usare la predizione temporale per quel blocco.

2.2 Parametri di progetto

  • Forma e dimensione dei blocchi. Blocchi piccoli seguono più fedelmente il movimento ma implicano più vettori, quindi più bit e più calcolo.
  • Finestra di ricerca W\mathcal W (spesso identificata dal raggio di ricerca). Più grande è, più predittori possibili: qualità maggiore, costo maggiore.
  • Funzione di dissimilarità (SAD o SSD).
  • Strategia di ricerca: full search (si provano tutti i vettori della finestra) oppure strategie intelligenti che riducono la complessità con impatto minimo sulla qualità: per esempio la three-step search (9 punti per passo, uno al centro e 8 sui bordi; a ogni passo il lato dell'area di ricerca si dimezza; per una finestra 14×1414\times14 si fanno circa 25 confronti invece di 196: una riduzione dell'87%) o la ricerca esagonale.

Effetto della dimensione del blocco (immagine CIF 352×288352\times288; il "tasso" è il numero totale di bit per i vettori dell'immagine, il tempo è relativo al caso 16×1616\times16):

Blocco PSNR del predittore Tasso (bit) Tempo Blocchi per immagine Bit per vettore
8×88\times8 26,53 dB 7938 3,5x 1584 5,0
16×1616\times16 24,51 dB 1668 1x 396 4,2
32×3232\times32 22,52 dB 368 0,38x 99 3,7

Passare da 16×1616\times16 a 8×88\times8 quadruplica i blocchi (e i vettori): il tasso totale cresce di circa 4,8 volte anche se ogni vettore costa un po' meno bit, la qualità della predizione cresce di 2 dB e il tempo di calcolo di 3,5 volte.

2.3 Regolarizzazione e codifica dei vettori: esempi delle demo

Sulla sequenza "flower" (blocchi 16×1616\times16, SAD, raggio di ricerca 8):

  • senza regolarizzazione: PSNR del predittore 23,0123{,}01 dB, vettori codificati con Exp-Golomb e predizione spaziale: 19261926 bit, 4,864{,}86 bit/vettore, 0,0190{,}019 bit/pixel; l'errore di predizione è molto sparso (istogramma concentrato intorno a zero; varianza dei blocchi molto minore di quella dei blocchi dell'immagine);
  • con regolarizzazione λ=100\lambda=100: PSNR 22,9522{,}95 dB (perde 0,06 dB), costo 15661566 bit, 3,953{,}95 bit/vettore, 0,0150{,}015 bit/pixel; il tempo sale da 113 ms a 461 ms. La regolarizzazione riduce nettamente il costo dei vettori (perché favorisce vettori simili ai vicini, quindi più prevedibili) con impatto minimo sulla qualità;
  • con blocchi 8×88\times8 (regolarizzato): PSNR 24,5824{,}58 dB, ma 52005200 bit (4 volte i vettori, anche se 3,283{,}28 bit/vettore); tempo 879 ms.

Sulla sequenza "akiyo" (quasi statica, blocchi 8×88\times8): PSNR del predittore 42,3342{,}33 dB, quasi tutti i vettori sono nulli. Exp-Golomb costa 32263226 bit (2,042{,}04 bit/vettore), ma un codificatore aritmetico raggiungerebbe l'entropia: 267267 bit (0,170{,}17 bit/vettore). Lezione: Exp-Golomb (e anche Huffman) è inefficace quando la maggior parte dei simboli è lo stesso (entropia molto bassa, Codifica lossless - entropia, Huffman e codifiche a dizionarioLa codifica lossless rappresenta i simboli di una sorgente con parole di codice a lunghezza variabile in modo invertibile; si usano codici a prefisso (istantanei). L'entropia $H(X)=\sum p_i\log_2\frac1{p_i}$ è il limite: $H(X)\le\mathcal L^*<H(X)+1$ (Shannon), con uguaglianza se le probabilità sono potenze di 1/2. Il codice di Huffman è ottimo ma lascia fino a 1 bit di overhead per simbolo; raggruppando $K$ simboli (codifica a blocchi) si tende al tasso entropico $\mathcal H(X)\le H(X)$, ma la complessità cresce come $M^K$; la codifica aritmetica ($\mathcal L<H+2$ per messaggio) ha complessità lineare. Altre tecniche: dizionario (LZ, DEFLATE di ZIP e PNG, ANS in Zstandard), Exp-Golomb e categoria/ampiezza (usati in JPEG e nei codec video) per interi con probabilità decrescente col modulo, codifica predittiva (si codifica l'errore di predizione, che ha entropia molto più bassa).Codifica lossless - entropia, Huffman e codifiche a dizionario →).

2.4 Bit-rate dei vettori di movimento

Il costo dei vettori in bit al secondo si calcola in quattro passi: pixel per immagine; blocchi per immagine =pixellato2=\frac{\text{pixel}}{\text{lato}^2}; bit per immagine =bit/vettore×blocchi=\text{bit/vettore}\times\text{blocchi}; bit/s =bit per immagine×fps=\text{bit per immagine}\times\text{fps}.

Esempio. Video HD 1920×10801920\times1080 a 30 fps con block-matching. Blocchi 32×3232\times32 e 22 bit/vettore: pixel =2 073 600=2\,073\,600; blocchi =2 073 6001024=2025=\frac{2\,073\,600}{1024}=2025; bit/immagine =2⋅2025=4050=2\cdot2025=4050; bit/s =4050⋅30=121 500=4050\cdot30=121\,500 bit/s =121,5=121{,}5 kbit/s. Blocchi 16×1616\times16 e 2,52{,}5 bit/vettore: 81008100 blocchi, 20 25020\,250 bit/immagine, 607,5607{,}5 kbit/s. (I blocchi più piccoli costano, in totale, 55 volte di più: 4 volte i vettori, ognuno un po' più caro.)

3. Tipi di immagine e GOP

  • Frame I (intra coded): niente predizione temporale (eventualmente la predizione spaziale dalla stessa immagine). Vantaggi: bassa complessità (nessuna stima del movimento), punto di accesso in decodifica, limite alla propagazione degli errori. Svantaggio: a parità di qualità richiedono molti più bit di P e B.
  • Frame P (predictive): ogni blocco è predetto da un singolo blocco di un'immagine di riferimento (per esempio l'ancora precedente), oppure si può usare la predizione spaziale (modo intra). Molto più compresse delle I. Complessità elevata (stima del movimento).
  • Frame B (bi-prediction): ogni blocco può essere predetto da due blocchi (tipicamente una immagine passata e una futura), da uno solo, o con predizione spaziale. Perché due riferimenti: aumenta la probabilità di trovare un buon predittore. Conseguenza: l'ordine di codifica non coincide con l'ordine di visualizzazione. Compressione ancora più spinta ma grande complessità (due stime del movimento).

Le I e le P sono le ancore (anchor frames, AF). Un GOP comincia sempre con una I:

  • NN: distanza tra due I (lunghezza del GOP);
  • MM: distanza tra due ancore.

Esempio (N=6N=6, M=3M=3). Ordine di visualizzazione: I0 B1 B2 P3 B4 B5 P6…I_0\ B_1\ B_2\ P_3\ B_4\ B_5\ P_6\dots I due BB tra I0I_0 e P3P_3 si predicono da I0I_0 e P3P_3, quindi P3P_3 va codificato prima di B1,B2B_1,B_2: ordine di codifica I0 P3 B1 B2 P6 B4 B5I_0\ P_3\ B_1\ B_2\ P_6\ B_4\ B_5. Il decodificatore deve riordinare prima di mostrare: un ritardo in più.

Rate-distortion dei tipi di frame. Dopo aggiustamenti, i fotogrammi I sono circa 3-5 volte più grandi dei P e 10-20 volte dei B. La qualità (PSNR) dipende dal contenuto, ma quella delle I è tipicamente forzata alta perché servono a predire tutto il GOP.

4. Il codificatore video ibrido

Tutti i codificatori video ibridi seguono lo stesso schema, con differenze nell'implementazione dei moduli. Si lavora per blocchi di pixel (le unità di codifica negli standard recenti), e il tipo di ogni frame è fissato dalla struttura del GOP.

Codifica intra. Il primo blocco passa in un codificatore "tipo JPEG" (DCT, quantizzazione QQ, codifica a lunghezza variabile VLC, per esempio Huffman); il bitstream esce attraverso un buffer di canale; è anche decodificato (quantizzazione inversa e DCT inversa) e il blocco ricostruito va nel DFB. Il secondo blocco è codificato in modo predittivo usando il DFB: la predizione può essere semplice (il valor medio, come in JPEG) o sofisticata (direzioni diverse) e richiedere parametri; l'errore di predizione è codificato come in JPEG, poi decodificato e sommato al predittore: esattamente le operazioni che farà il decodificatore, e il risultato va nel DFB. Si prosegue fino a codificare l'intera frame in modo intra; poi la frame decodificata nel DFB serve da base per la predizione temporale.

Codifica inter. Il primo blocco della frame successiva è confrontato con la frame nel DFB con la ME: si produce il vettore di movimento (codificato e usato dalla MC per produrre il predittore); l'errore di predizione è codificato, poi decodificato e sommato al predittore per ottenere il blocco decodificato nel DFB. Un modulo di controllo decide per ogni blocco tra intra e inter.

Buffer di canale. Permette di adattare il tasso di codifica a quello di trasmissione o scrittura modificando la quantizzazione (controllo di tasso).

Il decodificatore ibrido esegue le operazioni inverse: per ogni blocco decodifica il modo e i parametri (vettori, tipo di predizione spaziale), decodifica l'errore (come JPEG) e lo somma al predittore calcolato come al codificatore. Non fa stima del movimento né decisione del modo: richiede molte meno operazioni del codificatore (asimmetria utile per la distribuzione di video).

4.1 Scelta del modo di codifica

Ogni unità di codifica può essere codificata in più modi (intra o inter, e negli standard recenti varie sottovarianti di entrambi, anche con partizioni più piccole della coding unit). Nel caso semplice intra/inter, per ogni modo mm si fa una pre-codifica calcolando il numero di bit RmR_m e la distorsione DmD_m, e si sceglie m∗=arg⁡min⁡m∈{INTRA,INTER}Dm+λRm.m^*=\arg\min_{m\in\{\text{INTRA},\text{INTER}\}}D_m+\lambda R_m. Questa strategia equivale a risolvere il problema vincolato "minimizzare la distorsione con un vincolo sul bit-rate totale". Per λ\lambda si usano euristiche che lo legano al bit-rate obiettivo.

5. Bit-rate di un GOP e playout buffer

Per un GOP formato da una frame Intra di BintraB_{\text{intra}} bit e NN frame P di Binter=αBintraB_{\text{inter}}=\alpha B_{\text{intra}} bit (0<α<10<\alpha<1), con ff fotogrammi al secondo, i bit per GOP sono BGOP=Bintra(1+αN)B_{\text{GOP}}=B_{\text{intra}}(1+\alpha N) e la sua durata è TGOP=N+1fT_{\text{GOP}}=\frac{N+1}f. Il tasso medio di codifica è quindi RC=BGOPTGOP=f Bintra 1+αN1+N.\boxed{R_C=\frac{B_{\text{GOP}}}{T_{\text{GOP}}}=f\,B_{\text{intra}}\,\frac{1+\alpha N}{1+N}}. Per N=0N=0 (tutte intra) RC=fBintra≡RIntraR_C=fB_{\text{intra}}\equiv R_{\text{Intra}}; per N→∞N\to\infty (quasi solo P) RC→fαBintra=fBinter≡RInterR_C\to f\alpha B_{\text{intra}}=fB_{\text{inter}}\equiv R_{\text{Inter}}. La funzione 1+αN1+N\frac{1+\alpha N}{1+N} è strettamente decrescente: aumentare NN riduce il tasso.

Con un throughput SS di rete costante, durante la riproduzione il buffer del client varia con pendenza Bplayout′(t)=SRC−1B'_{\text{playout}}(t)=\frac S{R_C}-1 (Streaming adattativo e DASHPer non stallare serve $R_C\le S$ (tasso di codifica non superiore al throughput), ma $R_C$ si controlla e $S$ no. Se $S<R_C$ la latenza cresce, i buffer dei router si riempiono e si perdono pacchetti; né il drop brutale né il transcoding in rete sono praticabili, la scalabilità (SVC) è parziale. La soluzione dominante è lo streaming adattativo (ABR) tirato dal client su HTTP: il video è diviso in $N$ segmenti da $T_S$ secondi, ciascuno in $K$ livelli di bit-rate $R_C(k)$ descritti nell'MPD; il client sceglie il livello $q(n)$ di ogni segmento con $T_D=\frac{T_SR_C(q)}{S_n}$. Il playout buffer $B(t)$ (in secondi di video) segue $B'=\frac S{R_C}$ durante lo stallo e $B'=\frac S{R_C}-1$ durante la riproduzione; si parte dopo $L$ segmenti e dopo uno stallo si riprende con $M$ nuovi segmenti. La QoE si modella con $J=\sum_n\lambda_1k_n-\lambda_2\lvert k_n-k_{n-1}\rvert-\phi(\Delta_n)-\lambda_3T_{ST}$. Gli algoritmi ABR sono basati su throughput, buffer o ibridi; MPEG-DASH standardizza MPD e segmenti, non il client.Streaming adattativo e DASH →): si riempie se RC<SR_C<S, si svuota se RC>SR_C>S, resta costante se RC=SR_C=S. La condizione RC≤SR_C\le S si traduce, riordinando, in f Bintra−S≤(S−fαBintra) N.f\,B_{\text{intra}}-S\le(S-f\alpha B_{\text{intra}})\,N.

  • Se S≤RInterS\le R_{\text{Inter}}: il membro destro è ≤0\le0 e il sinistro è positivo, quindi mai soddisfatta (il throughput non basta nemmeno per le sole P).
  • Se S≥RIntraS\ge R_{\text{Intra}}: soddisfatta per ogni NN (il throughput basta anche per tutte intra).
  • Se RInter<S<RIntraR_{\text{Inter}}<S<R_{\text{Intra}}: S−RInter>0S-R_{\text{Inter}}>0 e la condizione diventa N≥RIntra−SS−RInterN\ge\dfrac{R_{\text{Intra}}-S}{S-R_{\text{Inter}}}.

Esempio. Bintra=400B_{\text{intra}}=400 kbit, α=110\alpha=\frac1{10} (Binter=40B_{\text{inter}}=40 kbit), f=25f=25 fps, S=2S=2 Mbit/s. RIntra=400⋅25=10R_{\text{Intra}}=400\cdot25=10 Mbit/s, RInter=1R_{\text{Inter}}=1 Mbit/s: siamo nel terzo caso, N≥10−22−1=8N\ge\frac{10-2}{2-1}=8. Per N=8N=8 il buffer resta costante (RC=10⋅1+0,89=2R_C=10\cdot\frac{1+0{,}8}{9}=2); per N≥9N\ge9 si riempie; per N≤7N\le7 si svuota. Il minimo throughput che permette la trasmissione al variare di NN è inf⁡NRC=RInter=1\inf_NR_C=R_{\text{Inter}}=1 Mbit/s (con NN abbastanza grande).

Grafico interattivo: Tasso di codifica medio R_C in funzione di N per Bintra = 400 kbit, alfa = 1/10, 25 fps: scende da 10 Mbit/s (tutte intra) verso 1 Mbit/s. Con S = 2 Mbit/s il buffer non si svuota solo per N >= 8

Un altro effetto: una frame I è molto grande, quindi per trasmetterla serve più tempo di una frame normale: con più link in serie la sola trasmissione di una I da 400 kbit su un link da 2 Mbit/s dura 400 0002⋅106=0,2\frac{400\,000}{2\cdot10^6}=0{,}2 s per link, 2 s su 10 link in serie.

6. Codifica video scalabile

Nella codifica scalabile il bitstream ha struttura gerarchica: il livello base permette di decodificare una versione a qualità ridotta a un bit-rate piccolo RBR_B; uno o più livelli di enhancement ripristinano la qualità, con bit-rate addizionale RER_E. La scalabilità può essere temporale (frame rate: per esempio base solo frame I a 10 fps, enhancement 1 con I e P a 40 fps, enhancement 2 con I, P e B a 120 fps), spaziale (risoluzione) o di qualità.

Confronto con la codifica non scalabile (simulcast). Per tre livelli di qualità senza scalabilità si codifica tre volte, con tre file di bit-rate R1,R2,R3R_1,R_2,R_3. Con la scalabilità c'è un solo file con RS=RB+RE1+RE2R_S=R_B+R_{E_1}+R_{E_2}. Tipicamente RB≈R1R_B\approx R_1, RB+RE1≈1,05⋅R2R_B+R_{E_1}\approx1{,}05\cdot R_2, RB+RE1+RE2≈1,10⋅R3R_B+R_{E_1}+R_{E_2}\approx1{,}10\cdot R_3: ogni livello di scalabilità penalizza di circa il 5-10% (altre slide dicono fino al 15%) di bit-rate a parità di qualità.

Vantaggi: meno spazio di memorizzazione sul server e miglior uso delle risorse di rete (carico sui link in media minore). Svantaggi: richiede l'aggiornamento dei router, che devono inoltrare i pacchetti di ogni livello (base, enhancement) solo dove serve (tecnologia a gruppi multicast multipli). Oggi si usa molto in WebRTC per le videoconferenze di gruppo, meno nello streaming VoD (che preferisce DASH, Streaming adattativo e DASHPer non stallare serve $R_C\le S$ (tasso di codifica non superiore al throughput), ma $R_C$ si controlla e $S$ no. Se $S<R_C$ la latenza cresce, i buffer dei router si riempiono e si perdono pacchetti; né il drop brutale né il transcoding in rete sono praticabili, la scalabilità (SVC) è parziale. La soluzione dominante è lo streaming adattativo (ABR) tirato dal client su HTTP: il video è diviso in $N$ segmenti da $T_S$ secondi, ciascuno in $K$ livelli di bit-rate $R_C(k)$ descritti nell'MPD; il client sceglie il livello $q(n)$ di ogni segmento con $T_D=\frac{T_SR_C(q)}{S_n}$. Il playout buffer $B(t)$ (in secondi di video) segue $B'=\frac S{R_C}$ durante lo stallo e $B'=\frac S{R_C}-1$ durante la riproduzione; si parte dopo $L$ segmenti e dopo uno stallo si riprende con $M$ nuovi segmenti. La QoE si modella con $J=\sum_n\lambda_1k_n-\lambda_2\lvert k_n-k_{n-1}\rvert-\phi(\Delta_n)-\lambda_3T_{ST}$. Gli algoritmi ABR sono basati su throughput, buffer o ibridi; MPEG-DASH standardizza MPD e segmenti, non il client.Streaming adattativo e DASH →).

7. Standard principali

  • MPEG-2 (primi anni '90): il primo standard video con grande diffusione (DVD, canali digitali satellitari). Codec ibrido con frame I, P e B. Niente predizione spaziale: le intra sono codificate in modo molto simile a JPEG. Obsoleto ma con nicchie (DVD, TV non HD, videosorveglianza). Risoluzioni fino a 1920×10801920\times1080, fino a 60 fps, fino a 80 Mbit/s; YCbCr con o senza sottocampionamento; 8 bit per campione; strumenti di codifica scalabile.
  • H.264/AVC (2003): ancora molto diffuso. Rispetto a MPEG-2: predizione spaziale nell'intra, forma e dimensione variabile dei blocchi per la stima del movimento, trasformata simile alla DCT ma con coefficienti interi (rapidità e ripetibilità), filtro di de-blocking (toglie gli artefatti a blocchi a basso bit-rate), codifica lossless ottimizzata. Tasso più che dimezzato a parità di qualità.
  • H.265/HEVC (2013): alberi quaternari di codifica, intra migliorata e altro; resta ibrido. Tasso circa dimezzato rispetto a H.264. Licensing poco efficace.
  • H.266/VVC (2021): ibrido con molti miglioramenti; complessità aumentata di un ordine di grandezza; tasso circa dimezzato rispetto a HEVC (a qualità percepita la riduzione è ancora maggiore, 40-50% rispetto a HEVC).
  • VP9 e AV1: ibridi open-source con caratteristiche simili rispettivamente a H.264 e H.265.

Le prestazioni si confrontano con le curve tasso-distorsione (PSNR in funzione del tasso): per esempio HEVC a 500 kbit/s raggiunge una qualità per cui MPEG-2 avrebbe bisogno di quasi 5 volte il bit-rate.

Codec Bit-rate PSNR Tempo di codifica Velocità vs real time
MPEG-2 2,02 Mbit/s 40,30 dB 2,56 s 11,7x
H.264 1,90 Mbit/s 45,43 dB 10,89 s 2,75x
H.265 1,90 Mbit/s 46,26 dB 30,04 s 1,00x
AV1 2,02 Mbit/s 47,40 dB 89,03 s 0,33x

(Codifica con ffmpeg su PC di un video sintetico 720p di 30 s.) Si vede il compromesso: più efficienza (più dB a pari bit-rate) costa molta più complessità e tempo di codifica; AV1 è sotto il tempo reale.

Diffusione (stime delle slide per il 2026). TV digitale terrestre: HEVC circa 57%, AVC circa 35%, MPEG-2 sotto 10% (cicli di aggiornamento lunghi per la compatibilità con i ricevitori; DVB-T2 impone HEVC). Piattaforme di streaming: AV1 circa 35-40% (risparmio di banda, royalty-free), AVC circa 30% (retrocompatibilità), HEVC circa 25% (4K HDR su Apple e TV). Comunicazioni real-time: AVC circa 50% (accelerazione hardware), VP9 25%, VP8 15%, AV1 10% (in crescita). Priorità del real-time: bassa latenza e resilienza ai pacchetti persi.

Domande d'esame

1. Il principio della stima del movimento per block-matching è: (a) trovare blocchi corrispondenti in due immagini e interpretarne la distanza come spostamento, (b) trovare feature corrispondenti, (c) stimare il movimento globale della camera? Traccia: (a); non si cerca il movimento fisico ma il miglior predittore, con costo d+λR(v)d+\lambda R(\mathbf v).

2. Che cosa fa la regolarizzazione nella stima del movimento? Traccia: aggiunge λR(v)\lambda R(\mathbf v) al costo, quindi peggiora (di poco) l'errore di predizione ma migliora il costo di codifica dei vettori, tende a produrre vettori piccoli e regolari (bassa entropia).

3. Un GOP I+9P con BP=0,2 BIB_P=0{,}2\,B_I, BI=300B_I=300 kbit, 30 fps, throughput 2 Mbit/s: il buffer di riproduzione si riempie o si svuota? Traccia: bit per GOP =300+9⋅60=840=300+9\cdot60=840 kbit; il GOP dura 10 frame =13=\frac13 s, quindi 3 GOP al secondo e RC=840⋅3=2520R_C=840\cdot3=2520 kbit/s =2,52=2{,}52 Mbit/s >S>S: il buffer si svuota.

Versione ripasso

Idea. Un video non compresso costa 36 Mbit/s (CIF) fino a decine di Gbit/s (8K). Si sfrutta la ridondanza spaziale (parte "tipo JPEG") e soprattutto temporale (immagini consecutive simili, basta una predizione). Si invia: parametri di predizione + errore di predizione compresso. Il codificatore tiene il DFB (immagini decodificate) per ripetere la stessa predizione del decodificatore. Predizione limitata per propagazione degli errori, accesso casuale, complessità ⇒\Rightarrow tipi I, P, B e GOP.

Stima del movimento (block-matching). Per ogni blocco Bk(p)B_k^{(\mathbf p)} si cerca Bh(p+v)B_h^{(\mathbf p+\mathbf v)} nell'immagine di riferimento. Dissimilarità SAD (∑∣ai−bi∣\sum|a_i-b_i|, rapida) o SSD. v∗=arg⁡min⁡v∈Wd+λR(v)\mathbf v^*=\arg\min_{\mathbf v\in\mathcal W}d+\lambda R(\mathbf v); λ\lambda regola qualità della predizione contro costo dei vettori (regolarizzazione). Compensazione: f^n(p)=fn−N(p+v)\hat f_n(\mathbf p)=f_{n-N}(\mathbf p+\mathbf v). Si cerca il miglior predittore, non il moto fisico; se non c'è un buon predittore: intra. Errore codificato come in JPEG.

  • Parametri: dimensione del blocco (piccoli: più vettori, bit e calcolo), finestra di ricerca, funzione dd, strategia (full search, three-step: 9 punti per passo, 25 confronti su 196 =−87%=-87\%; esagonale).
  • CIF: 8×88\times8 PSNR 26,53, 7938 bit, 3,5x; 16×1616\times16 24,51, 1668 bit, 1x; 32×3232\times32 22,52, 368 bit, 0,38x (blocchi 1584, 396, 99).
  • Demo: senza regolarizzazione 1926 bit (4,86 bit/vettore, PSNR 23,01); con λ=100\lambda=100 1566 bit (3,95 bit/vettore, PSNR 22,95, tempo ×4\times4); 8×88\times8 regolarizzato 5200 bit. "akiyo": quasi tutti vettori nulli, Exp-Golomb 3226 bit contro entropia 267 bit.
  • Bit-rate dei vettori: blocchi =pixellato2=\frac{\text{pixel}}{\text{lato}^2}; bit/s =bit/vettore×blocchi×fps=\text{bit/vettore}\times\text{blocchi}\times\text{fps}. Esempio HD 30 fps: 32×3232\times32, 2 bit: 2025⋅2⋅30=121,52025\cdot2\cdot30=121{,}5 kbit/s; 16×1616\times16, 2,5 bit: 607,5 kbit/s.

Frame. I: solo intra; bassa complessità, accesso casuale, ferma gli errori; molti bit. P: un riferimento; compressa. B: due riferimenti (passato e futuro), compressione massima, doppia ME, ordine di codifica ≠\ne visualizzazione (I0B1B2P3→I_0B_1B_2P_3\to codifica I0P3B1B2I_0P_3B_1B_2). GOP: NN = distanza tra I, MM = distanza tra ancore (I e P). Dimensioni: I circa 3-5 volte P, 10-20 volte B.

Codificatore ibrido. Intra: DCT, QQ, VLC, buffer di canale; decodifica interna (Q−1Q^{-1}, IDCT) verso il DFB; predizione spaziale (anche il valor medio). Inter: ME + MC dal DFB, errore codificato; controllo intra/inter per blocco. Buffer di canale: controllo del tasso via quantizzazione. Decodificatore: decodifica modo e parametri, errore, somma al predittore; niente ME né decisione di modo: molto più semplice. Scelta del modo: m∗=arg⁡min⁡mDm+λRmm^*=\arg\min_mD_m+\lambda R_m (equivale alla minimizzazione di DD con vincolo sul tasso).

GOP I+NNP. BGOP=BI(1+αN)B_{\text{GOP}}=B_I(1+\alpha N), TGOP=N+1fT_{\text{GOP}}=\frac{N+1}f, RC=fBI1+αN1+NR_C=fB_I\frac{1+\alpha N}{1+N} (decrescente in NN): N=0→RIntra=fBIN=0\to R_{\text{Intra}}=fB_I; N→∞→RInter=fαBIN\to\infty\to R_{\text{Inter}}=f\alpha B_I. Buffer: B′=SRC−1B'=\frac S{R_C}-1 (si riempie se RC<SR_C<S). Condizione RC≤SR_C\le S: mai se S≤RInterS\le R_{\text{Inter}}; sempre se S≥RIntraS\ge R_{\text{Intra}}; altrimenti N≥RIntra−SS−RInterN\ge\frac{R_{\text{Intra}}-S}{S-R_{\text{Inter}}}. Esempio BI=400B_I=400 kbit, α=0,1\alpha=0{,}1, 25 fps, S=2S=2 Mbit/s: RIntra=10R_{\text{Intra}}=10, RInter=1R_{\text{Inter}}=1, N≥8N\ge8 (N=8N=8: costante; N≥9N\ge9: si riempie); minimo throughput =RInter=1=R_{\text{Inter}}=1 Mbit/s. Esempio GOP I+9P, α=0,2\alpha=0{,}2, BI=300B_I=300 kbit, 30 fps: 840 kbit/GOP, 3 GOP/s, RC=2,52R_C=2{,}52 Mbit/s.

Scalabile. Livello base (RBR_B) + enhancement (RER_E); un solo file RS=RB+RE1+RE2R_S=R_B+R_{E_1}+R_{E_2} contro simulcast; penalità 5-10% (fino a 15%) per livello; meno memoria e carico sui link, ma router da aggiornare (multicast multipli). Usata in WebRTC.

Standard. MPEG-2 (anni '90, DVD, solo intra tipo JPEG, fino a 80 Mbit/s). H.264/AVC (2003): intra spaziale, blocchi variabili, trasformata intera, de-blocking; tasso più che dimezzato. HEVC (2013): alberi quaternari, tasso ≈12\approx\frac12. VVC (2021): complessità ×10\times10, tasso ≈12\approx\frac12 di HEVC. VP9, AV1: open source (simili a H.264 e H.265). Esempio 720p: MPEG-2 2,02 Mbit/s 40,30 dB; H.264 1,90 Mbit/s 45,43 dB; H.265 1,90 46,26; AV1 2,02 47,40 (tempi 2,56, 10,89, 30,04, 89,03 s). Diffusione 2026 (stime): TV HEVC 57%; streaming AV1 35-40%; real-time AVC 50%.

Errori tipici: confondere NN ed MM; dimenticare che le B si codificano dopo le P future; dire che il decodificatore fa la stima del movimento; scambiare RCR_C per il bit-rate dell'intero video invece del tasso medio del GOP; confrontare RCR_C con SS senza considerare le I; credere che la ME trovi il movimento fisico.

Collegamenti: Compressione di immagini - DCT e standard JPEGPer comprimere con perdita non basta quantizzare i pixel (non sono sparsi): si applica una trasformata lineare ortogonale che concentra l'energia in pochi coefficienti, si quantizzano i coefficienti e si codificano senza perdita. Le trasformate ortogonali conservano l'MSE ($\frac1N|\mathbf x-\tilde{\mathbf x}|^2=\frac1N|\mathbf y-\tilde{\mathbf y}|^2$). JPEG baseline: si sottrae 128, si divide in blocchi $8\times8$, DCT 2D ($Y=AXA^T$), quantizzazione uniforme con tabella (passi piccoli a bassa frequenza, scalata da un fattore di qualità $Q$), zig-zag scan, DC codificato in modo differenziale con categoria/ampiezza, AC con coppie (run, categoria) e simbolo EOB, codici di Huffman non standardizzati scritti nel file. Esempio completo: un blocco da 512 bit diventa 49 bit (0,766 bit/pixel).Compressione di immagini - DCT e standard JPEG →, Streaming adattativo e DASHPer non stallare serve $R_C\le S$ (tasso di codifica non superiore al throughput), ma $R_C$ si controlla e $S$ no. Se $S<R_C$ la latenza cresce, i buffer dei router si riempiono e si perdono pacchetti; né il drop brutale né il transcoding in rete sono praticabili, la scalabilità (SVC) è parziale. La soluzione dominante è lo streaming adattativo (ABR) tirato dal client su HTTP: il video è diviso in $N$ segmenti da $T_S$ secondi, ciascuno in $K$ livelli di bit-rate $R_C(k)$ descritti nell'MPD; il client sceglie il livello $q(n)$ di ogni segmento con $T_D=\frac{T_SR_C(q)}{S_n}$. Il playout buffer $B(t)$ (in secondi di video) segue $B'=\frac S{R_C}$ durante lo stallo e $B'=\frac S{R_C}-1$ durante la riproduzione; si parte dopo $L$ segmenti e dopo uno stallo si riprende con $M$ nuovi segmenti. La QoE si modella con $J=\sum_n\lambda_1k_n-\lambda_2\lvert k_n-k_{n-1}\rvert-\phi(\Delta_n)-\lambda_3T_{ST}$. Gli algoritmi ABR sono basati su throughput, buffer o ibridi; MPEG-DASH standardizza MPD e segmenti, non il client.Streaming adattativo e DASH →, Esercizio - Stima del movimento, GOP e bit-rate del video (domande ed esercizi del corso).

Domande tipiche.

  • Principio del block-matching: per ogni blocco si cerca il blocco più simile nel riferimento; il vettore è lo spostamento; si cerca il miglior predittore, non il moto fisico.
  • Regolarizzazione: aggiunge λR(v)\lambda R(\mathbf v); peggiora un po' la predizione ma riduce il costo dei vettori (vettori regolari, entropia minore).
  • GOP I+9P con BI=300B_I=300 kbit, P=0,2BIP=0{,}2B_I, 30 fps: 840 kbit per GOP, RC=2,52R_C=2{,}52 Mbit/s >S=2>S=2 Mbit/s: il buffer si svuota.
  • Frame B: due riferimenti, ordine di codifica diverso da quello di visualizzazione, massima compressione e massima complessità.

Esercizi su questo argomento

Teoria collegata