在毕书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很有规律,没必要在这里说了.
理解的关键是分别看作码字的长度和码字代表的实际值!