关于CAVLC相关码表在JM程序实现的理解

 

在毕书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很有规律,没必要在这里说了.

理解的关键是分别看作码字的长度和码字代表的实际值!

你可能感兴趣的:(关于CAVLC相关码表在JM程序实现的理解)