1. 程式人生 > >H264編碼器7( h264 CBP詳解)

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得到的。