關於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很有規律,沒必要在這裏說了.

理解的關鍵是分別看作碼字的長度和碼字代表的實際值!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章