컨텍스트 적응형 가변 길이 코딩
Context-adaptive variable-length coding컨텍스트 적응형 가변 길이 코딩(CAVLC)은 H.264/MPEG-4 AVC 비디오 인코딩에 사용되는 엔트로피 코딩의 한 형태다. 그것은 거의 모든 엔트로피 코더와 마찬가지로 본질적으로 무손실 압축 기술이다. H.264/MPEG-4 AVC에서는 잔차, 지그재그 순서, 변환 계수 블록을 인코딩하는 데 사용된다. 문맥 기반 적응형 바이너리 산술 부호화(CABAC)에 대한 대안이다. CAVLC는 데이터를 상당히 효과적으로 압축하지는 않지만 CABAC보다 디코딩하는 데 상당히 적은 처리량을 요구한다. CAVLC는 기준선 및 확장 프로파일에서 지원되지 않는 CABAC와는 달리 모든 H.264 프로파일에서 지원된다.
CAVLC는 4×4 (및 2×2) 블록의 변환 계수를 순서에 따라 나머지 지그재그 블록을 인코딩하는 데 사용된다. CAVLC는 정량화된 4×4 블록의 몇 가지 특성을 활용하도록 설계되었다.
- 예측, 변환, 정량화 후 블럭은 일반적으로 희박하다(대부분 0을 포함한다).
- 지그재그 스캔 후 0이 아닌 가장 높은 계수는 +/- 1. CAVLC는 콤팩트한 방식으로 고주파수 +/-1 계수의 수를 신호한다.
- 인접 블록의 0이 아닌 계수 수는 상관 관계가 있다. 계수 개수는 조회 표를 사용하여 인코딩된다. 조회 테이블의 선택은 인접 블록의 0이 아닌 계수 개수에 따라 달라진다.
- 0이 아닌 계수의 수준(규모)은 재주문된 배열(DC 계수 근처)의 시작 부분에서 더 높고 더 높은 주파수 쪽으로 더 낮은 경향이 있다. CAVLC는 최근 코드화된 레벨 크기에 따라 "레벨" 파라미터에 대한 VLC 조회 테이블의 선택을 조정하여 이를 활용한다.
코드화된 요소
인코딩 및 전송이 필요한 파라미터는 다음 표를 포함한다.
매개변수 | 설명 |
---|---|
매크로블록형 | 코드화된 각 매크로 블록에 대한 예측 방법 |
코드화된 블록 패턴 | 매크로 블록 내에 코드화된 계수를 포함하는 블럭을 나타냄 |
Quantizer 매개 변수 참조 프레임 | 이전 QP 값에서 델타 값으로 전송됨 |
기준프레임지수 | 상호 예측을 위한 기준 프레임 식별 |
모션 벡터 | 예측 모션 벡터와의 차이(mvd)로 전송됨 |
잔차자료 | 각 4×4 또는 2×2 블록에 대한 계수 데이터 |
CAVLC 예제
요소 | 가치 | 코드 |
---|---|---|
coeff_properties | TotalCoeffs=5, T1s=3 | 0000100 |
T1 기호(4) | + | 0 |
T1 기호(3) | - | 1 |
T1 기호(2) | - | 1 |
레벨(1) | +1 (Level_VLC0 사용) | 1 |
레벨(0) | +3(Level_VLC1 사용) | 0010 |
토탈제로스 | 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 | 코드 필요 없음. 마지막 계수 |
코드 | 요소 | 가치 | 출력 배열 |
---|---|---|---|
0000100 | coeff_properties | 총 Coeffs=5, T1s=3 | 비어 있음 |
0 | T1 기호 | + | 1 |
1 | T1 기호 | - | −1, 1 |
1 | T1 기호 | - | −1, −1, 1 |
1 | 레벨 | +1 | 1, −1, −1, 1 |
0010 | 레벨 | +3 | 3, 1, −1, −1, 1 |
111 | 토탈제로스 | 3 | 3, 1, −1, −1, 1 |
10 | 전에 실행하다. | 1 | 3, 1, −1, −1, 0, 1 |
1 | 전에 실행하다. | 0 | 3, 1, −1, −1, 0, 1 |
1 | 전에 실행하다. | 0 | 3, 1, −1, −1, 0, 1 |
01 | 전에 실행하다. | 1 | 3, 0, 1, −1, −1, 0, 1 |
다음의 모든 예에서 Num-VLC0 표를 coeff_token 인코딩에 사용한다고 가정한다.
![4x4CAVLC.svg](http://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/4x4CAVLC.svg/191px-4x4CAVLC.svg.png)
0, 3, 0, 1, -1, -1, 0, 0… TotalCoeffs = 5 (최대 주파수[4]에서 최저 주파수[0]로 색인화됨)
TotalZeros = 3
T1s = 3(사실상 후행은 4개가 있지만 3개만 "특수 케이스"로 인코딩할 수 있음)
인코딩:
이 블록의 전송 비트스트림은 00001000111001011101101101101101이다.
디코딩: 출력 배열이 아래와 같이 디코딩된 값에서 "빌트업"된다. 각 단계에서 출력 배열에 추가된 값은 밑줄이 그어져 있다.
디코더가 두 개의 0을 삽입했지만, TotalZeros는 3과 같으므로 다른 1 0이 가장 낮은 계수 앞에 삽입되어 최종 출력 배열이 0, 3, 0, 1, -1, 0, 1이 된다.
참고 항목
외부 링크