---
title: "TVID: Codec Video"
date: 2021-11-24 14:00
categories: [Image S9, TVID]
tags: [Image, S9, TVID]
math: true
---
Lien de la [note Hackmd](https://hackmd.io/@lemasymasa/SyJcKtGuK)
# Que faire ?
Identifier les repetitions
- Spatiales
- Temporelles
![](https://i.imgur.com/R0kOUcz.png)
Optimiser leur codage de rouce
Dessiner le moins possible
![](https://i.imgur.com/IyHuuC5.gif)
> 2x les memes dessins pour chaque oeil
:::success
On va decimer ce qui n'est pas important
:::
- Spatialement ?
- Temporellement ?
Detruire selectivement:
- En fonction de l'application: TV, DVD/BD, streaming
- Compromis qualite <=> debit
Compression entropique (compromis qualite)
- Huffman (CAVLC)
- Arithmetique (CABAC)
# Codec Image
## JPEG
:::info
Le veteran: Join Photographic Experts Group (1992)
:::
- Limitations de la vision humaine
- HF
- Chroma
- Decoupage en blocs $8\times 8$
- Transformation DCT
- Quantification des coefficients
- Lecture Zig-Zag
- Huffman
:::info
- Decoupage en blocs $8\times 8$
- Transformation DCT
- Quantification des coefficients
![](https://i.imgur.com/dbpjLD2.png)
:::
### Exemple
![](https://i.imgur.com/NPagM5d.png)
![](https://i.imgur.com/BXdTX1i.png)
Bloc DCT
![](https://i.imgur.com/WEWBaza.png)
Parcours Zig zag
![](https://i.imgur.com/gIJVe9j.png)
- Codage RLE: paires {Valeur, Nombre}
- $79; 0; -2; \{-1;3\}; \{0;2\}; -1;$ EOB
- Image animee:
- Motion JPEG
- DV
# Codec Video
## MPEG-1
> Le pere fondateur
- Motion Pictures Experts Group (1993)
- Base sur JPEDG et H.261 (NetMeeting, PSX FMV)
> CF. JDG *les jeux FMVs*
- Support:
- Stockage numerique: VCD
- Reseaux fiables
- En pratique
- $352\times 240$ ("NTSC") / $352\times288$ ("PAL")
- 30 i/s
- YUV $4:2:0$ MPEG-1
- $1, 5 Mbs$
![](https://i.imgur.com/x8OoEYx.png)
## Blocs, Macroblocs
- Bloc: matrice de pixels $8\times 8$
- Aggregation en macroblocs
- MB-Luma: 4 blocs $\times 8=16\times 16$
- MB-Chroma: $1$ bloc U $8\times 8$ + 1 bloc V $8\times 8$
- => 1Mb complet = 4 blocs de Luma + 2 blocs Chroma
![](https://i.imgur.com/p9mH2uV.png)
## Slices
- Suite de macroblcos
- Sans recouvrement
- => Partition de l'image
![](https://i.imgur.com/vcv0TWV.png)
![](https://i.imgur.com/E3KmhGN.png)
- Multiusage
- Facteur de quantification individuel
- Synchronisation (*start* codes)
## Pictures
- Suite de slices
- *Start code*
- Prediction full / half pel
- Types: I, B, P, D
# "Intra": I
- Quasi-JPEG
- Reference: elle-meme
- Quantification par defaut ("intra") surchargeable
- Macroblocs intra, codage
- DC: DPCM
- AC: Huffman
## Difference entre images
![](https://i.imgur.com/jmp45Yb.png)
> Le lapin apparait d'une image a l'autres
Image 1
- Traitement par blocs
- Recherche de mouvement
- Calcul des residus
![](https://i.imgur.com/zlGBbMf.png)
![](https://i.imgur.com/0rvtArT.png)
Image 2
- Vecteurs de mouvement (pixel, demi-pixel)
- balle
- Residus
- Lapins
- Yeux
- Quantification nonintra
- *uniforme*
## Exemple: Big Buck Bunny
![](https://i.imgur.com/LyKm3VJ.png)
## Vecteurs de mouvements
![](https://i.imgur.com/6c07Dmh.png)
# Prediction IP
On a des images qui dependent les unes des autres
![](https://i.imgur.com/aJ2oLqW.png)
Avantages:
- Debit(P) < Debit(i)
- Aucune latence
Inconvenients:
- Decoder une P => conserver la I et les P precedents
- Prediction + quantification => $\color{red}{\text{propagation d'erreur}}$
## Prediction IBP
![](https://i.imgur.com/dWRk3P5.png)
Avantages
- Debit(B) << Debit(P)
- "Lisse les erreurs" entre I et P
- B bidirectionnelle => moyenne des reconstructions
Inconvenients:
- Decoder une B: garder les I et P apparentees $\color{red}{\Rightarrow RAM}$
- Ordre de decodage $\neq$ ordre affichage
- $\Rightarrow$ Latence
- Zapper: besoin d'intercaler des $I$ frequemment
- $\Rightarrow$ "Group Of Pictures"
![](https://i.imgur.com/hasDw2t.png)
- Suite d'image avec au moins une $I$
- Parametres:
- $M$: distance entre une $I$ et une $P$
- $N$: distance entre deux $I$
## Ordre affichage vs decodage
- DO: Display Order - CO: Coding Order
- A cause des B, $CO\neq DO$
- Supposons ces images en DO:
![](https://i.imgur.com/96dBVdH.png)
- L'ordre des GOP correspondant est (en CO):
![](https://i.imgur.com/bfgvjT3.png)
![](https://i.imgur.com/iuCBJeh.png)
## Sequence Header
- Resolution
- PAR
- Frame rate
## En resume
![](https://i.imgur.com/ZG4NWwc.png)
### Encodeur MPEG-1
![](https://i.imgur.com/lUH47ho.png)
# Convoyer du son et de la video en meme temps
## MPEG Program stream
- Fichier composite contenat:
- 1+ flux audio elementaire
- 1+ flux video elementaire
## MPEG PES
:::info
Packetized Elementary Stream
:::
![](https://i.imgur.com/QdhRn5f.png)
PES:
![](https://i.imgur.com/cDyVntx.png)
- Flux elementaire decoupe
- Stream ID
- $\color{red}{PTS/DTS}$
- CRC
## MPEG Program Stream
- Sequence:
- Pack header
- System Clock Reference
- = Horloge createur PS (pour synchro PTS)
- Pack: Suite de PES
![](https://i.imgur.com/YEy7K5m.png)
- Convient pour un support fiable (VCD, DVD)
- Pas adapte a la diffusion de chaines de TV (broadcast)
- Peu resistant au BER
- Une seule base de temps (SCR)
# MPEG-2: Le premier codec video
- Objectif: polyvalence applicative
- Broadcast DTV SD, HD (DVB, ATSC)
- Home video (DVD, PVR)
- Videoconf
- Differences avec MPEG-1
- Profils et niveaux (7)
- Entrelacement
- Scalabilite (pseudo-HLS)
- Plusieurs vues
## Profils et niveaux MPEG-2
![](https://i.imgur.com/4RPvPBw.png)
- SDTV, DVD, MP@ML
- SDTV Studio: HP@ML
- HDTV: MP@H14
## Entrelacement MPEG-2
- Frame entrelacee
![](https://i.imgur.com/3YjL9wj.png)
- \+ Topness bit
- Field individuels
![](https://i.imgur.com/pZRyeDL.png)
> C'etait bizarre et ca fait chier
![](https://i.imgur.com/RLUs5N6.png)
- Ordre arbitraire
- Peu commode
## Codecs et applications
![](https://i.imgur.com/GVXtmqb.png)
# Convoyer plusieurs chaines: MPEG-2 Transport Stream
- Decoupage PES en paquets de 188 bits
- Multiplexage pour broadcast
- Packet IDentifier (PID)
- Program Specific Information (PSI)
- Program Allocation Table (PAT)
- Program Management Table (PMT)
- Horloge: Program Clock Reference (PCR)
## MPEG-2 TS
:::info
Transport Stream
:::
- Decoupage PES en paquets de 188 bits
- Multiplexage pour broadcast
- Packet Identifier (PID)
- Program Specific Information (PSI)
- Program Allocation Table (PAT)
- Program Management Table (PMT)
- Horloge: Program Clock Reference (PCR)
![](https://i.imgur.com/jZtY9E9.png)
![](https://i.imgur.com/a6bduYn.png)
## Demultiplexage MPEG2-TS
- PSI (PAT + PMTs) repetes regulierement
- Choix d'une chaine
- Choix d'un PID de PMT and la PAT
- Recuperation de la PMT correspondante
- Filtrage des PIDs decrits dans la PMT
- Assemblage PES correspondants
- Extraction ES + PT
- PTS : TS Image
## PCR
- Distinguer PCR de PTS
- PTS: TS image
- Cadence d'affichage des images
- PCR: "heure de l'encodeur"
- Synchronise le decodeur (STC) avec l'encodeur
- En longevite (Heures)
- Indispensable pour du streaming realtime (DVB-S/C/T)
- Comparable a SCR pour un MPEG-PS (CVD, DVD)
## Streaming
- Streaming implique:
- Producteur
- Consommateur
- Fifos
- Realtime implique:
- Flux tendu
- Fifo limitees (faible buffering)
- Synchronisation producteur et consommateur
## STC VS PCR *FIGHT*
Pas de synchro STC $\leftrightarrow$ PCR ?
- STC $\gt$ PCR
- Decodeur consomme **plus vite** que prevu
- Que se passe-t-il ?
- Drainage des FIFOs A/V
- $\Rightarrow$ Video: saccades / ralentissements
- $\Rightarrow$ Audio: micro-silences / repetitions
- STC $\lt$ PCR
- Decodeur consomme **plus lentement** que prevu
- Que se passe-t-il ?
- Buffering limite $\Rightarrow$ blocage impossible
- $\Rightarrow$ Depassement des FIFOs
- $\Rightarrow$ Perte de paquets
- $\Rightarrow$ Flux elementaires discontinus
- $\Rightarrow$ Audio: blips, squeals, silences
- $\Rightarrow$ Video: mosaiques, prediction surrealistes
## Synchronisation STC PCR
- Besoin d'asservir STC a PCR
- **VCXO: Voltage COntrol Xtal Oscillator**
- Mesurer diff = STC - PCR
- Asservir les cloks A/V correspondantes
- Audio:
- Reguler la vitess du decodeur
- Controle du remplissage de la fifo de samples
- Video
- Reguler la vitesse du decodeur
- Controle de la vitesse de production des pixels pour l'affichage
- $\color{orange}{\text{Variations Pixel Clock de sortie}}$
- $\color{orange}{\text{Tolerance en analogique ("effet de volant")}}$
- $\color{red}{\text{TOUCHY en HDMI !}}$
# H.264 Le champion
## Objectifs
:::info
Reprendre les applications de MPEG-2
:::
Couvrir tous les nouveaux usages:
- Disques optiques avances (BD, HD-DVD)
- Streaming actif (VOD, VCONF)
- Enregistreurs embarques
- Stereoscopie
## Nouveautes
:::success
Nouveau protocole: Network Abstraction Layer
:::
- Limite les repetitions
- S'adapte aux moyens de transmission
:::success
Nouveaux outils d'analyse d'image
:::
- Macroblocs plus fins
- Predictions plus elaborees
- Filtrage a l'encodage des MV
:::success
Nouveaux compresseurs entropiques
:::
- CABAC:
- Codage arithmetique binaire
- Intervalles adaptatifs par modeles statistiques
![](https://i.imgur.com/sO7vQ5W.png)
- CAVLC
- VLC type Huffman
- Dictionnaire adapatatif par rapport aux blocs voisins
## Historique
- 1998: Initiative VCEG H26L
- 2001: MPEG + VCEG = Joint Video Team
- 2003: Finalisation premiere ebauche
- 2005: Fidelity Range Extension
- $4:2:2$
- $4:4:4$
- bit depth > 8
- 2007: Scalable Video Coding
- 2009: Multiview Video Coding
## Arithmetique
- Integer DCT
- Calculs entiers
- Plus simples (que MPEG-2)
- Entierements specifies
- $\Rightarrow$ Reconstruction exacte
## NAL
:::info
Network Abstrasction Layer
:::
- NAL: Objets semantiques du flux video
- VCL: Video Coding Layer
- NAL VCL: images, macroblocs, MVs, coefficients IDCT
- NAL Non-VCL: parametres, metas
- Changent rarement
- Decouplage NAL vs mode d'envoi:
- Byte-Stream : signalisation par *start codes* (~MPEG-2)
- Packer-Transport
- Pour reseaux (RTP)
- Le protocole sous-jacent *sait* quel NAL il envoie/recoit
### Exemples
Quelques NAL
- IDR: Instant Decoder Refresh (VCL)
- Contient seulement une nouvelle image
- synchronisation du decodeur avec parsing minimal
- Besoin prealable de metas non-VCL
- SPS: Sequence Parameter Set (non-VCL)
- Profil, niveau, resolution, cadence
- ~ MEPG-2 Sequence Header
- PPS: Picture Parameter Set
- Codage entropique, mode de prediction, groupe et ordre des slices, filtrage de blocs
## En resume
![](https://i.imgur.com/TBlrTbs.png)
## ASO
:::info
Arbitrary Slice Order
:::
- Les slices peuvent etre envoyees dans le desordre
- + non continument dans le temps
- Avantages
- Limite l'impact
## FMO
:::info
Flexible Macroblock Ordering
:::
- Partition des MB par motifs
- Type 0: Interlaced: Lignes
- Type 1: Dispersed
- En sequnces
- Type 3: Foreground: par zones (ROI)
- Explicitement par l'encodage
![](https://i.imgur.com/fRFinIK.png)
### Avantages
- Forme de segmentation
- Adaptation a la nature du contenu
- $\color{green}{\text{Resout des cas difficiles}}$
- $\color{green}{\text{Dispersion des impacts BER}}$
### Inconvenients
- Pas dans tous les profils
## Prediction Inter
Partitions de MB et sous-MB
![](https://i.imgur.com/7xXYXMx.png)
References multiples:
- 16 en theorie
- 5 a 6 en pratique
- $\color{green}{\Rightarrow\text{Moins de residus}}$
- Ponderations possibles (fdes)
![](https://i.imgur.com/yUqPHdW.png)
Motion Vectors au quart de pixel pres:
![](https://i.imgur.com/aztl4hs.png)
## Prediction Intra
- Prediction spatiale:
- INTRA $4\times 4$
- 9 directions de recherche
- Pour sous-blocs $4\times 4$
![](https://i.imgur.com/R7h92Ws.png)
- INTRA $16\times 16$
- Pour regions plus lisses / BF
![](https://i.imgur.com/mclaQUh.png)
## Filtrage in-loop
![](https://i.imgur.com/Kr1VvK5.png)
:::info
In-loop deblocking filter
:::
- Filtrage frontieres Luma $8\times 8$ ou $4\times 4$
- (resp. Chroma % sampling mode)
- $\color{red}{\text{Pendant l'encodage des MV}}$
- $\color{red}{\text{Obligatoire}}$
- Filtrage depend de la structure du bloc:
- Plusieurs references ? F++
- Frontieres intra et/ou inter ? F++
- Frontieres de MB ? F++!!
- Contours ? F--
### Avantages
- Encodeur et decodeur fournissent la meme image (pas un post)
- Meilleurs MV
- $\color{green}{\Rightarrow \text{Residus --}}$
- $\color{green}{\text{Qualite perceptuelle +++}}$
![](https://i.imgur.com/4XBfeWe.png)
:::warning
PSNR identique ?!
:::
### Inconvenients
- $\color{red}{\text{Complexite}}$
- En baisse vu le benefice
## PAFF
:::info
Picture Adaptative Frame/Field
:::
Frame Mode (MPEG-2)
![](https://i.imgur.com/Pw0MmU7.png)
Field mode: l'un sous l'autre
![](https://i.imgur.com/WHY9pQy.png)
## MBAFF
:::info
Macro Block Adaptative..
:::
Paire de MBs: $16\times 32$
- Mode frame: $32$ lignes progressives
- Mode field: $2\times 16$ lignes entrelacees
![](https://i.imgur.com/MQlYNl3.png)
:::danger
Entrelance par parties
:::
### Avantages
- Integrite spatiale maximum
- Prediction MV TOP BOT possible pour une paire de MBs en mode field
- $\color{green}{\text{Precision}++}$
- Pas de MV TOP BOT pour une paire de MBs en mode frame
- $\color{green}{\text{Frugalite}++(16\%)}$
- Indices de mouvement
- $\color{green}{\text{Desentrelacement}++}$ (c)
# H. 265 / HVEC
![](https://i.imgur.com/TV9GWoE.png)
## Objectifs
:::info
Ceux de H. 264
:::
- Debit /= 2
- Scalabilite des calculs
- Simplification
- Parallalisation
- 4K, 8K, 120 i/s
- Free Viewpoint (VR)
![](https://i.imgur.com/mGJqJEl.png)
- 10/12 bpc (HDR)
- Simule la sensation d'eblouissement
![](https://i.imgur.com/WXwGPgD.png)
![](https://i.imgur.com/tLDWAkC.png)
## Historique
- 2007-2009: Rivalites MPEG - VCEG
- Rivalites MPEG - VCEG
- MPEG HPC : mauvais resultats
- Union JVT VC
- 2010:
- Janvier: Appel a propositions
- Avril: tests, Nommage HEVC
- Octobre: Premiere ebauche
- 2013:
- Janvier: Ebauche finale
- Avril: Standard ITU
- 2014:
- Avril: Ebauche V2
- MV-HEVC, Rext, Scalability
- Octobre: V2 approuvee
- 2015:
- Janvier: Publication officielle
- Avril: V3 approuvee
- Puis definition Screen Contents: ACT, AMVR, IntraBC, Palette
- 2016:
- Juin: V4 refusee
- Decembre: V4 approuvee (Extension Screen Contents)
## Principes
:::info
Decouplage enCodage Prediction Transformation
:::
- CTU: Coding Tree Unit
- "Macrobloc" haut niveau
- $16\times 16$, $32\times 32$, $64\times 64$
## CU
:::info
Partition carree d'une CTU
:::
![](https://i.imgur.com/kE5OEt8.png)
## PU
:::info
Partition de la CU
:::
:::danger
Uniquement la prediction
:::
![](https://i.imgur.com/jPrBX2g.png)
Intra:
- CU == PU
- Sauf au dernier
## TU
:::info
Transformation Unit
:::
- Parition de la CU
:::danger
Uniquement les residus
:::
- Independante de la partition PU
![](https://i.imgur.com/jPFMqB8.png)
Ressemble a ...
:::danger
Une TU peut couvrir plusieurs PU
![](https://i.imgur.com/JFwYpF7.png)
:::
:::success
Ou une partie de PU
![](https://i.imgur.com/kSAvUyC.png)
:::
:::info
Ou plusieurs parties de PU
:::
## Outils
- 33 Modes de prediction intra
- 9 pour H.264
- **Most Probable Modes**
- Indexation dynamique
- $\color{green}{\text{Moins de prefixe (2b vs 5b)}}$
![](https://i.imgur.com/Lz5vc4b.png)
- IDCT:
- $4\times4$, $16\times 16$, etc.
- ~IDST $4\times 4 possible$
## Slices et Tiles
- Slices
- Comme H.264
- Headers individuels
- $\color{green}{\text{Limitations de l'erreur}}$
- $\color{red}{\text{Jonctions imparfaites}}$
![](https://i.imgur.com/Fre9WlI.png)
- Tiles
- Partition rectangulaire de l'image
- Header/sequence
- $\color{green}{\text{Decodage parallelisable}}$
- $\color{green}{\text{ROI/VCONF}}$
![](https://i.imgur.com/aESkYjt.png)
- Slices in Tiles, Tiles in slices: Video Split
![](https://i.imgur.com/vk6KdUq.png)
- Wavefront parallel processing
- Slices divisees en lignes de CTU
- Pipeline multithreadable
- $\color{green}{\text{Efficace}}$
- $\color{red}{\text{Intensif}}$
![](https://i.imgur.com/r1UvHc9.png)
:::danger
Strategie de parallelisation
:::
## Filtrage
- Deblocking Filter
- Plus simple que H.264
- Grille $8\times 8$
- $\color{green}{\text{Parallelisable}}$
- SAO: Sample Adaptative Offset
- Filtre non-lineaire post-DBF
- Reduit les distorsions locales
- Categorie des samples selon voisinage
- Moyenne, contour, min, max
- LUT / index d'offset
:::success
Reduction des effets d'aplats (banding)
:::
![](https://i.imgur.com/OKpgLtz.png)
## SAO
Original:
![](https://i.imgur.com/oxMttpq.png)
$\color{red}{\text{SANS}}$
![](https://i.imgur.com/aGp2P38.png)
$\color{green}{\text{AVEC}}$
![](https://i.imgur.com/x7fXQhW.png)
# Epilogue
## Autres CODECS
- MPEG/VCEG/JVT: Versatile Video Codec
- ITU Universite Industriels
- Evolution de H.265
- Debit $\sim 40\%$
- Finalise 07/2020
- Encodeurs dispo (09/2021)
- Licences, royalties... comme HEVC
- Alliance for Open Media: AV1
- Amazon, Google, Samsung, ARM
- Temps d'encodage >>> VVC
- S'ameliore avec ML (Google)
- En deploiement:
- Netflix: depuis 2018
- Android TV 10: obligatoire
- Twitch: 2022
## Evolution du marche
- Changer de code $\Rightarrow$ \$
- Nouveau HW + SW
- Nouvelle conso (W)
- Nouvelles box utilisateur
- Bandes passantes plus importantes
- Fibre, 4G, 5G, 802.11ax
- $\Rightarrow$ taux de compression en second plan (cf H.264)
- Nouveau
- Netflix, Hulu, Amazon, Apple TV...
- Veulent le code "magique"
- Pour toutes les box
- Dont la licence est **la moins chere** (cf AV1)
## Evolution du streaming
- Trivia
- $60\%$ du trafic internet
- $\color{green}{\text{Netflix}: \sim\$ 2.25 B / an}$
- 2018: +50\%, 2019: + 59\%, 2020: +47\%
- **300 MT** $CO_2$/an (~Espagne)
- $1\%$ des emissions $CO_2$ mondiales
- Questions financieres et sociales evidentes