在畢書CAVLC共六個表,其中表1.3和1.4是一個表.
對應JM86有五個函數:
writeSyntaxElement_NumCoeffTrailingOnes裏有lentab[3][4][17] codtab[3][4][17] 對應1.1表
writeSyntaxElement_NumCoeffTrailingOnesChromaDC裏有lentab[4][5] codtab[4][5] 對應1.1
writeSyntaxElement_TotalZeros裏有lentab[TOTRUN_NUM][16] codtab[TOTRUN_NUM][16]對應1.3 1.4表
writeSyntaxElement_TotalZerosChromaDC裏有lentab[3][4] codtab[3][4]對應1.5
writeSyntaxElement_Run裏有lentab[TOTRUN_NUM][16] codtab[TOTRUN_NUM][16]對應1.6
lentab[3][4][17]對應碼錶的長度:如下分析
{ 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},//對應trailingones=0,totalcoeff=1---16的長度值
{ 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
{ 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
{ 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16},//對應trailingones=3totalcoeff=1---16的長度值
如此類推...
codtab[3][4][17]對應碼錶的實際碼值:如下分析
{ 1, 5, 7, 7, 7, 7,15,11, 8,15,11,15,11,15,11, 7,4}, //對應trailingones=0,totalcoeff=1---16的碼值
{ 0, 1, 4, 6, 6, 6, 6,14,10,14,10,14,10, 1,14,10,6},
{ 0, 0, 1, 5, 5, 5, 5, 5,13, 9,13, 9,13, 9,13, 9,5},
{ 0, 0, 0, 3, 3, 4, 4, 4, 4, 4,12,12, 8,12, 8,12,8},//對應trailingones=3totalcoeff=1---16的碼值
如此類推...
writeSyntaxElement_NumCoeffTrailingOnesChromaDC裏有lentab[4][5] codtab[4][5] 對應1.1 表nc=-1的情況.
同理可推:
int lentab[TOTRUN_NUM][16] =
{ 1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9}, //對應totalcoeff=1,total_zer0=0---15
{ 3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},
{ 4,3,3,3,4,4,3,3,4,5,5,6,5,6},
{ 5,3,4,4,3,3,3,4,3,4,5,5,5},
{ 4,4,4,3,3,3,3,3,4,5,4,5},
{ 6,5,3,3,3,3,3,3,4,3,6},
{ 6,5,3,3,3,2,3,4,3,6},
{ 6,4,5,3,2,2,3,3,6},
{ 6,6,4,2,2,3,2,5},
{ 5,5,3,2,2,2,4},
{ 4,4,3,3,1,3},
{ 4,4,2,1,3},
{ 3,3,1,2},
{ 2,2,1},
{ 1,1}, //對應totalcoeff=15 ,total_zero=0-1
表1.2很有規律,沒必要在這裏說了.
理解的關鍵是分別看作碼字的長度和碼字代表的實際值!