Kontextanpassad kodning med variabel längd
Kontextadaptiv kodning med variabel längd ( CAVLC ) är en form av entropikodning som används i H.264/MPEG-4 AVC- videokodning. Det är en i sig förlustfri komprimeringsteknik , som nästan alla entropikodare. I H.264/MPEG-4 AVC används den för att koda kvarvarande block av transformskoefficienter i sicksackordning. Det är ett alternativ till kontextbaserad adaptiv binär aritmetisk kodning (CABAC). CAVLC kräver betydligt mindre bearbetning att avkoda än CABAC, även om det inte komprimerar data lika effektivt. CAVLC stöds i alla H.264-profiler, till skillnad från CABAC som inte stöds i Baseline- och Extended-profiler.
CAVLC används för att koda kvarvarande, sicksackordnade 4×4 (och 2×2) block av transformationskoefficienter. CAVLC är utformad för att dra fördel av flera egenskaper hos kvantiserade 4×4-block:
- Efter förutsägelse, transformation och kvantisering är blocken vanligtvis glesa (innehåller mestadels nollor).
- De högsta koefficienterna som inte är noll efter sicksackavsökning är ofta sekvenser av +/− 1. CAVLC signalerar antalet högfrekventa +/−1 koefficienter på ett kompakt sätt.
- Antalet koefficienter som inte är noll i angränsande block är korrelerat. Antalet koefficienter kodas med hjälp av en uppslagstabell; valet av uppslagstabell beror på antalet icke-nollkoefficienter i angränsande block.
- Nivån (magnitud) av koefficienter som inte är noll tenderar att vara högre i början av den omordnade matrisen (nära DC-koefficienten) och lägre mot de högre frekvenserna. CAVLC drar fördel av detta genom att anpassa valet av VLC-uppslagstabell för parametern "nivå" beroende på nyligen kodade nivåstorlekar.
Kodade element
Parametrar som måste kodas och överföras inkluderar följande tabell:
Parametrar | Beskrivning |
---|---|
Typ av makroblock | Prediktionsmetod för varje kodat makroblock |
Kodat blockmönster | Indikerar vilka block inom ett makroblock som innehåller kodade koefficienter |
Kvantiseringsparameterreferensram | Sänds som ett deltavärde från föregående värde på QP |
Referensramindex | Identifiera referensram(ar) för interprediktion |
Rörelsevektor | Sänds som en skillnad (mvd) från förutsagd rörelsevektor |
Återstående data | Koefficientdata för varje 4×4 eller 2×2 block |
CAVLC exempel
Element | Värde | Koda |
---|---|---|
coeff_token | TotalCoeffs=5, T1s=3 | 0000100 |
T1 tecken (4) | + | 0 |
T1 tecken (3) | - | 1 |
T1 tecken (2) | - | 1 |
Nivå 1) | +1 (använd Level_VLC0) | 1 |
Nivå (0) | +3 (använd Level_VLC1) | 0010 |
TotalZeros | 3 | 111 |
köra_före(4) | ZerosLeft=3; run_before=1 | 10 |
köra_före(3) | ZerosLeft=2; run_before=0 | 1 |
köra_före(2) | ZerosLeft=2; run_before=0 | 1 |
köra_före(1) | ZerosLeft=2; run_before=1 | 01 |
run_before(0) | ZerosLeft=1; run_before=1 | Ingen kod krävs; sista koefficienten. |
Koda | Element | Värde | Utdatamatris |
---|---|---|---|
0000100 | coeff_token | Totala koeffs=5, T1s=3 | Tömma |
0 | T1 tecken | + | 1 |
1 | T1 tecken | - | −1 , 1 |
1 | T1 tecken | - | −1 , −1, 1 |
1 | Nivå | +1 | 1 , −1, −1, 1 |
0010 | Nivå | +3 | 3 , 1, −1, −1, 1 |
111 | TotalZeros | 3 | 3, 1, −1, −1, 1 |
10 | köra_före | 1 | 0 3, 1, −1, −1, , 1 |
1 | köra_före | 0 | 3, 1, −1, −1, 0, 1 |
1 | köra_före | 0 | 3, 1, −1, −1, 0, 1 |
01 | köra_före | 1 | 0 3, , 1, −1, −1, 0, 1 |
I alla följande exempel antar vi att tabellen Num-VLC0 används för att koda coeff_token.
0, 3, 0, 1, −1, −1, 0, 1, 0... TotalCoeffs = 5 (indexerat från högsta frekvens [4] till lägsta frekvens [0])
TotalZeros = 3
T1s = 3 (det finns faktiskt fyra efterföljande men endast 3 kan kodas som ett "specialfall")
Kodning:
Den överförda bitströmmen för detta block är 000010001110010111101101.
Avkodning: Utdatamatrisen är "uppbyggd" från de avkodade värdena som visas nedan. Värden som läggs till utgångsmatrisen i varje steg är understrukna.
Avkodaren har satt in två nollor; dock är TotalZeros lika med 3 och därför infogas ytterligare 1 nolla före den lägsta koefficienten, vilket gör den slutliga utmatningen: 0, 3, 0, 1, −1, −1, 0, 1
Se även
externa länkar