H.264---CABAC---第三步----確定上下文索引
阿新 • • 發佈:2018-12-12
在前面初始化的時候就出現了上下文這個概念,那麼上下文所指的是什麼?
以JM中的上下文結構體為例
1 2 3 4 5 6 7 |
//! struct for context management struct
bi_context_type
{
unsigned
long
count;
byte state;
//uint16 state; // index into state-table CP
unsigned
char
MPS;
// Least Probable Symbol 0/1 CP
};
|
上下文包含兩個變數:MPS、pStateIdx(count只是用於計數)。在CABAC編碼的過程中會碰到需要修改這兩個值的情況(如上面的狀態變換),這些修改都是以上下文為單位的。
語法元素在經過二值化後形成二進位制串,二進位制串中不同binIdx位置上的MPS(出現頻率高的符號)可能會有所不同,並且概率也可能會不同,因此需要用一個概念來表示特定語法元素的二進位制串中特定binIdx的MPS與pStateIdx,上下文就是這樣的概念。
在h.264標準中,用一個上下文索引ctxIdx來代表上下文,ctxIdx的取值為0~1023,就是說h.264的上下文一共有1024個。
ctxIdx的計算方式分為兩種:
如果語法元素為coded_block_flag、significant_coeff_flag、last_significant_coeff_flag、coeff_abs_level_minus1,即殘差係數部分的語法元素,則
ctxIdx = ctxIdxOffset + BlockCatOffset(ctxBlockCat) + ctxIdxInc(ctxBlockCat)
否則
ctxIdx = ctxIdxOffset + ctxIdxInc
其中的變數有
- ctxIdxOffset 每個語法元素都有一個ctxIdxOffset,甚至一些語法元素在二值化後分為前後綴會,這種語法元素可能會有兩個ctxIdxOffset,如下表格部分摘自h.264標準9.3.2的第一個表格
Syntax Element | ctxIdxOffset |
mb_type (SI slices only) |
prefix: 0 suffix: 3 |
mb_type (I slices only) | 3 |
mb_skip_flag (P,SP slices only) |
11 |
mb_type (P, SP slices only) |
prefix: 14 suffix: 17 |
sub_mb_type[] (P, SP slices only) |
21 |
… | … |
- ctxIdxInc 在特定的語法元素二值化後,會形成以binIdx為索引的二進位制串,儘管是同一個二進位制串,但是不同的binIdx上的上下文(MPS,pStateIdx)可能會有所不同,ctxIdxInc就是在這種情況下產生的一個值,它用於劃分二進位制串上不同的上下文。如下面一項表格摘自h.264標準9.3.3.1的第一個表格
ctxIdxOffset b0 b1 b2 b3 b4 b5 >=b6 40 0,1,2 3 4 5 6 6 6 binIdx b0 b1 b2 b3 b4 b5 >=b6 ctxIdx 40,41,42 43 44 45 46 46 46 -
BlockCatOffset(ctxBlockCat) 其中ctxBlockCat的範圍為0~13,分別代表不同殘差塊型別,如下表
Block description maxNumCoeff ctxBlockCat block of luma DC transform coefficient levels 16 0 block of luma AC transform coefficient levels 15 1 block of 16 luma transform coefficient levels 16 2 block of chroma DC transform coefficient levels when ChromaArrayType is equal to 1 or 2 4*2/4*4 3 block of chroma AC transform coefficient levels when ChromaArrayType is equal to 1 or 2 15 4 block of 64 luma transform coefficient levels 64 5 block of Cb DC transform coefficient levels when ChromaArrayType is equal to 3 16 6 block of Cb AC transform coefficient levels when ChromaArrayType is equal to 3 15 7 block of 16 Cb transform coefficient levels when ChromaArrayType is equal to 3 16 8 block of 64 Cb transform coefficient levels when ChromaArrayType is equal to 3 64 9 block of Cr DC transform coefficient levels when ChromaArrayType is equal to 3 16 10 block of Cr AC transform coefficient levels when ChromaArrayType is equal to 3 15 11 block of 16 Cr transform coefficient levels when ChromaArrayType is equal to 3 16 12 block of 64 Cr transform coefficient levels when ChromaArrayType is equal to 3 64 13 在殘差係數部分,上下文是會根據不同的殘差塊型別做出不同選擇的,BlockCatOffset就代表了不同的殘差塊型別的索引偏移,具體偏移值可以檢視標準中的相關表格。