H264編碼器7( h264 CBP詳解)
來自:https://blog.csdn.net/leibniz_zsu/article/details/4325324
Coded_block_pattern,即CBP,指亮度和色度分量的各小塊的殘差的編碼方案。
CBP詳解
cbp一共6bit,高2bit表示cbpc(2:cb、cr中至少一個4x4塊的AC係數不全為0;1:cb、cr中至少一個2x2的DC係數不全為0;0:所有色度係數全0)
低4bit分別表示4個8x8亮度塊,其中從最低一位開始的4位分別對應00,10,01,11位置的8*8亮度塊。如果某位為1,表示該對應8*8塊的4個4*4塊中至少有一個的係數不全為0。
ICBPTAB[0] = 0 (00 0000)表示既沒有亮度係數,也沒有色差係數
ICBPTAB[1] = 16 (01 0000)表示沒有亮度係數,有色差直流係數(沒有交流係數)
ICBPTAB[2] = 32 (10 0000)表示沒有亮度係數,有色差交流係數(可能含有直流係數)
ICBPTAB[3] = 15 (00 1111)表示有亮度係數,沒有色差係數
ICBPTAB[4] = 31 (01 1111)表示有亮度係數,有色差直流係數(沒有交流係數)
ICBPTAB[5] = 47 (10 1111)表示有亮度係數,有色差交流係數(可能含有直流係數)
來自:https://blog.csdn.net/feixiaku/article/details/8849126
以下是我的理解:
cbp用於表示當前巨集塊是否存在非零值
在x264中,
對於luma
由i_cbp_luma的第i位(i= 0、1、2、3)位表示一個MB中第i行4x4子塊是否有非零值
若存在非零值,則將相應位置1
對於chroma
由i_cbp_chroma表示
0x00表示:全為零
0x01表示:DC引數不為零
0x02表示:有不為零的引數
在獲得i_cbp_luma和i_cbp_chroma後,會把他們儲存在cbp陣列中,用
h->mb.cbp[h->mb.i_mb_xy] = (i_cbp_dc << 8) | (h->mb.i_cbp_chroma << 4) | h->mb.i_cbp_luma;
實現,也就是說
cbp的高8位放的是i_cbp_dc,低8位中高4位放的i_cbp_chroma,低4位放的i_cbp_luma
之後會根據cbp進行其它操作~
這隻對於X264,JM就不是很清楚了~
=====================================================================
利用CBP判斷要不要SKIP,裡面還關係到向量預測
=====================================================================
cbp一共6bit,高2bit表示cbpc(2:cb、cr中至少一個4x4塊的AC係數不全為0;1:cb、cr中至少一個2x2的DC係數不全為0;0:所有色度係數全0)
低4bit分別表示4個8x8亮度塊,其中從最低一位開始的4位分別對應00,10,01,11位置的8*8亮度塊。如果某位為1,表示該對應8*8塊的4個4*4塊中至少有一個的係數不全為0。
ICBPTAB[0] = 0 (00 0000)表示既沒有亮度係數,也沒有色差係數
ICBPTAB[1] = 16 (01 0000)表示沒有亮度係數,有色差直流係數(沒有交流係數)
ICBPTAB[2] = 32 (10 0000)表示沒有亮度係數,有色差交流係數(可能含有直流係數)
ICBPTAB[3] = 15 (00 1111)表示有亮度係數,沒有色差係數
ICBPTAB[4] = 31 (01 1111)表示有亮度係數,有色差直流係數(沒有交流係數)
ICBPTAB[5] = 47 (10 1111)表示有亮度係數,有色差交流係數(可能含有直流係數)
=======================================================================
關於CBP(回憶一下,“ CAVLC是用於亮度和色度殘差資料的編碼。”,所以,變換量化後求的cpb值對熵編碼非常有用。)
·DC 直流係數 AC交流係數
dc指變換後處於(0,0)位置的係數。其它為ac。
(電工學中,AC——Alternating Current交流; DC——Direct Current直流)
當使用幀內16*16時,型別名稱由如下的結構組成:I_16*16_x_y_z。
其中,x對應於表中“幀內預測模式”欄位的值,y對應於“色度CBP”欄位的值,對應於“亮度CBP”欄位的值。
Coded_block_pattern,即CBP,指亮度和色度分量的各小塊的殘差的編碼方案。
所謂的殘差方案包括:
(1) 所有殘差(包括DC、AC)都編碼。
(2) 只對DC係數編碼。
(3) 所有殘差(包括DC、AC)都不編碼。
對於非幀內16*16的巨集塊型別:
CodedBlockPatternLuma = coded_block_pattern % 16
CodedBlockPatternChroma = coded_block_pattern / 16
對於幀內16*16的巨集塊型別,CodedBlockPatternLuma和CodedBlockPatternChroma 的值不是由本句法元素給出,而是通過mb_type得到的。