La codificación de longitud variable adaptativa al contexto ( CAVLC ) es una forma de codificación de entropía utilizada en la codificación de video H.264 / MPEG-4 AVC . Es una técnica de compresión inherentemente sin pérdidas , como casi todos los codificadores de entropía. En H.264 / MPEG-4 AVC, se utiliza para codificar bloques de coeficientes de transformación residuales, en orden de zig-zag. Es una alternativa a la codificación aritmética binaria adaptativa basada en el contexto (CABAC). CAVLC requiere considerablemente menos procesamiento para decodificar que CABAC, aunque no comprime los datos con tanta eficacia. CAVLC es compatible con todos los perfiles H.264, a diferencia de CABAC, que no es compatible con los perfiles Baseline y Extended.
CAVLC se utiliza para codificar bloques de coeficientes de transformación de 4 × 4 (y 2 × 2) ordenados en zig-zag residuales. CAVLC está diseñado para aprovechar varias características de los bloques 4 × 4 cuantificados:
- Después de la predicción, la transformación y la cuantificación, los bloques suelen ser escasos (contienen en su mayoría ceros).
- Los coeficientes más altos distintos de cero después de la exploración en zig-zag suelen ser secuencias de +/− 1. CAVLC señala el número de coeficientes +/− 1 de alta frecuencia de forma compacta.
- El número de coeficientes distintos de cero en bloques vecinos está correlacionado. El número de coeficientes se codifica mediante una tabla de consulta; la elección de la tabla de consulta depende del número de coeficientes distintos de cero en los bloques vecinos.
- El nivel (magnitud) de los coeficientes distintos de cero tiende a ser más alto al comienzo de la matriz reordenada (cerca del coeficiente de CC) y más bajo hacia las frecuencias más altas. CAVLC aprovecha esto adaptando la elección de la tabla de consulta de VLC para el parámetro de "nivel" en función de las magnitudes de nivel codificadas recientemente.
Elementos codificados
Los parámetros que deben codificarse y transmitirse incluyen la siguiente tabla:
Parámetros | Descripción |
---|---|
Tipo de macrobloque | Método de predicción para cada macrobloque codificado |
Patrón de bloque codificado | Indica qué bloques dentro de un macrobloque contienen coeficientes codificados |
Marco de referencia de parámetros del cuantificador | Transmitido como un valor delta del valor anterior de QP |
Índice de marco de referencia | Identificar los marcos de referencia para la predicción inter |
Vector de movimiento | Transmitido como una diferencia (mvd) del vector de movimiento predicho |
Datos residuales | Datos de coeficiente para cada bloque de 4 × 4 o 2 × 2 |
Ejemplos de CAVLC
Elemento | Valor | Código |
---|---|---|
coeff_token | TotalCoeffs = 5, T1s = 3 | 0000100 |
Signo T1 (4) | + | 0 |
Signo T1 (3) | - | 1 |
Signo T1 (2) | - | 1 |
Nivel 1) | +1 (use Level_VLC0) | 1 |
Nivel (0) | +3 (use Level_VLC1) | 0010 |
TotalZeros | 3 | 111 |
run_before (4) | ZerosLeft = 3; run_before = 1 | 10 |
run_before (3) | ZerosLeft = 2; run_before = 0 | 1 |
run_before (2) | ZerosLeft = 2; run_before = 0 | 1 |
run_before (1) | ZerosLeft = 2; run_before = 1 | 01 |
run_before (0) | ZerosLeft = 1; run_before = 1 | No se requiere código; último coeficiente. |
Código | Elemento | Valor | Matriz de salida |
---|---|---|---|
0000100 | coeff_token | Coeficientes totales = 5, T1s = 3 | Vacío |
0 | Signo T1 | + | 1 |
1 | Signo T1 | - | −1 , 1 |
1 | Signo T1 | - | −1 , −1, 1 |
1 | Nivel | +1 | 1 , −1, −1, 1 |
0010 | Nivel | +3 | 3 , 1, −1, −1, 1 |
111 | TotalZeros | 3 | 3, 1, −1, −1, 1 |
10 | run_before | 1 | 3, 1, −1, −1, 0 , 1 |
1 | run_before | 0 | 3, 1, −1, −1, 0, 1 |
1 | run_before | 0 | 3, 1, −1, −1, 0, 1 |
01 | run_before | 1 | 3, 0 , 1, −1, −1, 0, 1 |
En todos los ejemplos siguientes, asumimos que la tabla Num-VLC0 se usa para codificar coeff_token.
0, 3, 0, 1, −1, −1, 0, 1, 0… TotalCoeffs = 5 (indexado desde la frecuencia más alta [4] a la frecuencia más baja [0])
TotalZeros = 3
T1s = 3 (de hecho, hay 4 finales, pero solo 3 se pueden codificar como un "caso especial")
Codificación:
El flujo de bits transmitido para este bloque es 000010001110010111101101.
Decodificación: La matriz de salida se "construye" a partir de los valores decodificados como se muestra a continuación. Los valores agregados a la matriz de salida en cada etapa están subrayados.
El decodificador ha insertado dos ceros; sin embargo, TotalZeros es igual a 3 y, por lo tanto, se inserta otro 1 cero antes del coeficiente más bajo, lo que hace que la matriz de salida final: 0, 3, 0, 1, −1, −1, 0, 1