H264--H264編碼--4

----------------------------------

編碼器輸出格式

----------------------------------

總的來說H264的碼流的打包方式有兩種,一種爲annex-b byte stream format的格式,這個是絕大部分編碼器的默認輸出格式,就是每個幀的開頭的3~4個字節是H264的start_code,0x00000001或者0x000001。
另一種是原始的NAL打包格式,就是開始的若干字節(1,2,4字節)是NAL的長度,而不是start_code,此時必須藉助某個全局的數據來獲得編碼器的profile,level,PPS,SPS等信息纔可以解碼。

@之前還疑惑過PPS 和SPS是哪裏來的,答案是編碼器給出的。

------------------------------

編碼數據流分析

------------------------------

首先明確一下,NAL數據流的組成:開始碼+NAL頭(forbidden_bit+nal_ref+nal_type)+RBSP

下面對一段H264編碼數據流進行分析。

00 00 00 01 67 42 00 1E 99 A0 B1 31 00 00 00 01

H264的數據流分爲兩種,一種是NAL UNIT stream(RTP),一種是 bits stream,

兩者可以互相轉換。我們分析的這個是 bit stream,根據AnnexB

00 00 00 01 67 42 00 1E 99 A0 B1 31 是 一個NAL,在兩個00 00 00 01之間

0110 0111 0100 0010 0000 0000 0001 1110 1001 1001 1010 0000 1011 0001 0011 0001

forbidden_zero_bit(1)= 0//網絡傳輸正確

nal_ref_idc(2)= 11//參考值爲3

nal_unit_type(5) = 0 0111:seq_parameter_set_rbsp( )//7,序列參數集

說明這個NALU的RBSP裏裝的是SPS數據 ,所以 processSPS

profile_idc(8):42:0100 0010

constraint_set0_flag(1):0

constraint_set1_flag(1):0

constraint_set2_flag(1):0

constraint_set3_flag(1):0

reserved_zero_4bits(4):0

level_idc(8):1E

seq_parameter_set_id(UE(V)):

ue(v): unsigned integer Exp-Golomb-coded syntax element with the left bit first. The parsing process for this descriptor is specified in subclause9.1

uvlC: 1001:根據Table9.1 , value= 0,只佔1bit.

根據profile_idc忽略掉一部分。

log2_max_frame_num_minus4(ue(v): 001 1001,len = 5,value= 5

pic_order_cnt_type(ue(v)):01 1010,len = 3,value = 2

根據pic_order_cnt_type忽略幾個參數

num_ref_frames(ue):010,len = 3,value = 1

0000 1011 0001 0011 0001

gaps_in_frame_num_value_allowed_flag(1) = 0

pic_width_in_mbs_minus1(ue):000 1011 ,len = 7,value = 10;

pic_height_in_map_units_minus1(ue):0001 001,len = 7,value = 8

frame_mbs_only_flag(1) = 1

忽略1

direct_8x8_inference_flag(1):0

忽略

vui_parameters_present_flag(1):0

忽略

NALU結束

68 CE 38 80 00 00 00 01

0110 1000

forbidden_zero_bit(1)= 0

nal_ref_idc(2)= 11

nal_unit_type(5) =01000:pic_parameter_set_rbsp( ),7.3.2.2//8圖像參數集

1100

pic_parameter_set_id (ue)=0

seq_parameter_set_id(ue)=0

entropy_coding_mode_flag(1) :0, 重要的flag,0表示編碼Exp-Golomb coded and CAVLC,1表示CABAC

pic_order_present_flag(1):0

1110

num_slice_groups_minus1(ue):0

忽略

num_ref_idx_l0_active_minus1(ue):0

num_ref_idx_l1_active_minus1(ue):0

weighted_pred_flag(1);0

0011 1000 1000 0000

weighted_bipred_idc(2):00

pic_init_qp_minus26 /* relative to 26 */(se):0

pic_init_qs_minus26 /* relative to 26 */(se):0

chroma_qp_index_offset(se):0

deblocking_filter_control_present_flag(1);0

constrained_intra_pred_flag(1):0

redundant_pic_cnt_present_flag(1):0

忽略

NALU結束

65 88 80 21 71 27 1B 88…….3888*16 byte

65:0110 0101

forbidden_zero_bit(1)= 0

nal_ref_idc(2)= 11

nal_unit_type(5) =0 0101:slice_layer_without_partitioning_rbsp( )//IDR幀

Slice

Slice_Header:

first_mb_in_slice(ue):0

slice_type(ue):000 1000 = 7

pic_parameter_set_id(ue) = 0

80 21:000 0000 0010 0001

frame_num(u(v): frame_num is used as an identifier for pictures and shall be represented by log2_max_frame_num_minus4 + 4 bits,9 bits = 0

忽略

if( nal_unit_type = = 5 ) //IDR frame

idr_pic_id(u(e)):0

忽略N多

ref_pic_list_reordering( ) 見7。3。3。1忽略,Islice,SI slice,B slice

nal_ref_idc =11 所以dec_ref_pic_marking( )

nal_unit_type = 5,所以

no_output_of_prior_pics_flag(1):0

long_term_reference_flag(1):0

忽略

。。71 27

001 0111 0001 0010 0111

slice_qp_delta(se(v):001 01,4:-2

忽略

slice_data( ):7.3.4

對I-Slice:忽略N多

進入if( moreDataFlag ) { if( MbaffFrameFlag && ( CurrMbAddr % 2 = = 0 | | ( CurrMbAddr % 2 = = 1 && prevMbSkipped ) ) )mb_field_decoding_flag

macroblock_layer( )}

mb_field_decoding_flag忽略

macroblock_layer( )

mb_type(ue(v):0

mb_pred( mb_type )

prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ](1bit,對babac是ae(v)):1

1 27:0001 0010 0111

prev_intra4x4_pred_mode_flag[ 1 ] : 0001,0,001

0010 0111

prev_intra4x4_pred_mode_flag[ 2 ] : 0010,0,010

prev_intra4x4_pred_mode_flag[ 3] : 0111,0,111

……16個

1b 88 00 3e cf.

intra_chroma_pred_mode(ue(v)) :最後的一個1bit:0

接下來是macroblock_layer的coded_block_pattern和run level,既係數

c0 06 ad a0 18

1100 0000 0000 0110 1010 0000 0001 1000

coded_block_pattern(me(v):0,根據T= 47,0x2f

mb_qp_delta(se(v):):0 len =1

residual( )見7.3.5.3

residual_block( LumaLevel[ i8x8 * 4 + i4x4 ], 16 )

coeff_token(ce(v): 00 0000 0000 0110 1

nc = 0(left block and top block 相關的):

len: { // 0702

{ 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,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},

},

{

{ 2, 6, 6, 7, 8, 8, 9,11,11,12,12,12,13,13,13,14,14},

{ 0, 2, 5, 6, 6, 7, 8, 9,11,11,12,12,13,13,14,14,14},

{ 0, 0, 3, 6, 6, 7, 8, 9,11,11,12,12,13,13,13,14,14},

{ 0, 0, 0, 4, 4, 5, 6, 6, 7, 9,11,11,12,13,13,13,14},

},

{

{ 4, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9,10,10,10,10},

{ 0, 4, 5, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9,10,10,10},

{ 0, 0, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,10},

{ 0, 0, 0, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 9,10,10,10},

},

code:

{ 1, 5, 7, 7, 7, 7,15,11, 8,15,11,15,11,15,11, 7,4},

{ 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},

},

{

{ 3,11, 7, 7, 7, 4, 7,15,11,15,11, 8,15,11, 7, 9,7},

{ 0, 2, 7,10, 6, 6, 6, 6,14,10,14,10,14,10,11, 8,6},

{ 0, 0, 3, 9, 5, 5, 5, 5,13, 9,13, 9,13, 9, 6,10,5},

{ 0, 0, 0, 5, 4, 6, 8, 4, 4, 4,12, 8,12,12, 8, 1,4},

},

{

{15,15,11, 8,15,11, 9, 8,15,11,15,11, 8,13, 9, 5,1},

{ 0,14,15,12,10, 8,14,10,14,14,10,14,10, 7,12, 8,4},

{ 0, 0,13,14,11, 9,13, 9,13,10,13, 9,13, 9,11, 7,3},

{ 0, 0, 0,12,11,10, 9, 8,13,12,12,12, 8,12,10, 6,2},

},

根據表查的:

code = 13,len = 15,i= 12,j=2

所以numcoeff = 12,numtrailingones = 2

010 0000 0001 1000: totalzeros:根據numcoeff

int lentab[TOTRUN_NUM][16] =

{

{ 1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},

{ 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}, numcoeff開始

{ 3,3,1,2},

{ 2,2,1},

{ 1,1},

};

int codtab[TOTRUN_NUM][16] =

{

{1,3,2,3,2,3,2,3,2,3,2,3,2,3,2,1},

{7,6,5,4,3,5,4,3,2,3,2,3,2,1,0},

{5,7,6,5,4,3,4,3,2,3,2,1,1,0},

{3,7,5,4,6,5,4,3,3,2,2,1,0},

{5,4,3,7,6,5,4,3,2,1,1,0},

{1,1,7,6,5,4,3,2,1,1,0},

{1,1,5,4,3,3,2,1,1,0},

{1,1,1,3,3,2,2,1,0},

{1,0,1,3,2,1,1,1,},

{1,0,1,3,2,1,1,},

{0,1,1,2,1,3},

{0,1,1,1,1}, numcoeff開始

{0,1,1,1},

{0,1,1},

{0,1},

};

Code = 1,len = 2,i=2,j = 0, totzeros = 2

Read run: 0 0000 0001 1000根據totzeros = 2

int lentab[TOTRUN_NUM][16] =

{

{1,1},

{1,2,2},

{2,2,2,2},

{2,2,2,3,3},

{2,2,3,3,3,3},

{2,3,3,3,3,3,3},

{3,3,3,3,3,3,3,4,5,6,7,8,9,10,11},

};

int codtab[TOTRUN_NUM][16] =

{

{1,0},

{1,1,0},

{3,2,1,0},

{3,2,1,1,0},

{3,2,3,2,1,0},

{3,0,1,3,2,5,4},

{7,6,5,4,3,2,1,1,1,1,1,1,1,1,1},

Code = 1,len =1,I = 0,j = 0

0.1.1 Slice data syntax

slice_data( ) {

C

Descriptor

if( entropy_coding_mode_flag )

while( !byte_aligned( ) )

cabac_alignment_one_bit

2

f(1)

CurrMbAddr = first_mb_in_slice * ( 1 + MbaffFrameFlag )

moreDataFlag = 1

prevMbSkipped = 0

do {

if( slice_type != I && slice_type != SI )

if( !entropy_coding_mode_flag ) {

mb_skip_run

2

ue(v)

prevMbSkipped = ( mb_skip_run > 0 )

for( i=0; i<mb_skip_run; i++ )

CurrMbAddr = NextMbAddress( CurrMbAddr )

moreDataFlag = more_rbsp_data( )

} else {

mb_skip_flag

2

ae(v)

moreDataFlag = !mb_skip_flag

}

if( moreDataFlag ) {

if( MbaffFrameFlag && ( CurrMbAddr % 2 = = 0 | |

( CurrMbAddr % 2 = = 1 && prevMbSkipped ) ) )

mb_field_decoding_flag

2

u(1) | ae(v)

macroblock_layer( )

2 | 3 | 4

}

if( !entropy_coding_mode_flag )

moreDataFlag = more_rbsp_data( )

else {

if( slice_type != I && slice_type != SI )

prevMbSkipped = mb_skip_flag

if( MbaffFrameFlag && CurrMbAddr % 2 = = 0 )

moreDataFlag = 1

else {

end_of_slice_flag

2

ae(v)

moreDataFlag = !end_of_slice_flag

}

}

CurrMbAddr = NextMbAddress( CurrMbAddr )

} while( moreDataFlag )

}

se(v) : CABAC正式介紹。根據Table 9 5 – coeff_token mapping to TotalCoeff( coeff_token ) and TrailingOnes( coeff_token )。

chroma_format_idc 無

Table9‑1 – Bit strings with “prefix” and “suffix” bits and assignment to codeNum ranges (informative)

Bit string form

Range of codeNum

1

0

0 1 x0

1-2

0 0 1 x1 x0

3-6

0 0 0 1 x2 x1 x0

7-14

0 0 0 0 1 x3 x2 x1 x0

15-30

0 0 0 0 0 1 x4 x3 x2 x1 x0

31-62

0.1.1.1 Slice layer without partitioning RBSP syntax

slice_layer_without_partitioning_rbsp( ) {

C

Descriptor

slice_header( )

2

slice_data( ) /* all categories of slice_data( ) syntax */

2 | 3 | 4

rbsp_slice_trailing_bits( )

2

}

0.1.1.2 Sequence parameter set RBSP syntax

seq_parameter_set_rbsp( ) {

C

Descriptor

profile_idc

0

u(8)

constraint_set0_flag

0

u(1)

constraint_set1_flag

0

u(1)

constraint_set2_flag

0

u(1)

constraint_set3_flag

0

u(1)

reserved_zero_4bits /* equal to 0 */

0

u(4)

level_idc

0

u(8)

seq_parameter_set_id

0

ue(v)

if( profile_idc = = 100 | | profile_idc = = 110 | |
profile_idc = = 122 | | profile_idc = = 144 ) {

chroma_format_idc

0

ue(v)

if( chroma_format_idc = = 3 )

residual_colour_transform_flag

0

u(1)

bit_depth_luma_minus8

0

ue(v)

bit_depth_chroma_minus8

0

ue(v)

qpprime_y_zero_transform_bypass_flag

0

u(1)

seq_scaling_matrix_present_flag

0

u(1)

if( seq_scaling_matrix_present_flag )

for( i = 0; i < 8; i++ ) {

seq_scaling_list_present_flag[ i]

0

u(1)

if( seq_scaling_list_present_flag[ i ] )

if( i < 6 )

scaling_list( ScalingList4x4[ i ], 16,
UseDefaultScalingMatrix4x4Flag[ i ])

0

else

scaling_list( ScalingList8x8[ i – 6 ], 64,
UseDefaultScalingMatrix8x8Flag[ i – 6 ] )

0

}

}

log2_max_frame_num_minus4

0

ue(v)

pic_order_cnt_type

0

ue(v)

if( pic_order_cnt_type = = 0 )

log2_max_pic_order_cnt_lsb_minus4

0

ue(v)

else if( pic_order_cnt_type = = 1 ) {

delta_pic_order_always_zero_flag

0

u(1)

offset_for_non_ref_pic

0

se(v)

offset_for_top_to_bottom_field

0

se(v)

num_ref_frames_in_pic_order_cnt_cycle

0

ue(v)

for( i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++ )

offset_for_ref_frame[ i ]

0

se(v)

}

num_ref_frames

0

ue(v)

gaps_in_frame_num_value_allowed_flag

0

u(1)

pic_width_in_mbs_minus1

0

ue(v)

pic_height_in_map_units_minus1

0

ue(v)

frame_mbs_only_flag

0

u(1)

if( !frame_mbs_only_flag )

mb_adaptive_frame_field_flag

0

u(1)

direct_8x8_inference_flag

0

u(1)

frame_cropping_flag

0

u(1)

if( frame_cropping_flag ) {

frame_crop_left_offset

0

ue(v)

frame_crop_right_offset

0

ue(v)

frame_crop_top_offset

0

ue(v)

frame_crop_bottom_offset

0

ue(v)

}

vui_parameters_present_flag

0

u(1)

if( vui_parameters_present_flag )

vui_parameters( )

0

rbsp_trailing_bits( )

0

}

Table7‑1 – NAL unit type codes

nal_unit_type

Content of NAL unit and RBSP syntax structure

C

0

Unspecified

1

Coded slice of a non-IDR picture
slice_layer_without_partitioning_rbsp( )

2, 3, 4

2

Coded slice data partition A
slice_data_partition_a_layer_rbsp( )

2

3

Coded slice data partition B
slice_data_partition_b_layer_rbsp( )

3

4

Coded slice data partition C
slice_data_partition_c_layer_rbsp( )

4

5

Coded slice of an IDR picture
slice_layer_without_partitioning_rbsp( )

2, 3

6

Supplemental enhancement information (SEI)
sei_rbsp( )

5

7

Sequence parameter set
seq_parameter_set_rbsp( )

0

8

Picture parameter set
pic_parameter_set_rbsp( )

1

9

Access unit delimiter
access_unit_delimiter_rbsp( )

6

10

End of sequence
end_of_seq_rbsp( )

7

11

End of stream
end_of_stream_rbsp( )

8

12

Filler data
filler_data_rbsp( )

9

13

Sequence parameter set extension
seq_parameter_set_extension_rbsp( )

10

14..18

Reserved

19

Coded slice of an auxiliary coded picture without partitioning
slice_layer_without_partitioning_rbsp( )

2, 3, 4

20..23

Reserved

24..31

Unspecified

byte_stream_nal_unit( NumBytesInNALunit ) {

C

Descriptor

while( next_bits( 24 ) != 0x000001 &&
next_bits( 32 ) != 0x00000001 )

leading_zero_8bits /* equal to 0x00 */

f(8)

if( next_bits( 24 ) != 0x000001 )

zero_byte /* equal to 0x00 */

f(8)

start_code_prefix_one_3bytes /* equal to 0x000001 */

f(24)

nal_unit( NumBytesInNALunit)

while( more_data_in_byte_stream( ) &&
next_bits( 24 ) != 0x000001 &&
next_bits( 32 ) != 0x00000001 )

trailing_zero_8bits /* equal to 0x00 */

f(8)

}

0.1.1.3 Picture parameter set RBSP syntax

pic_parameter_set_rbsp( ) {

C

Descriptor

pic_parameter_set_id

1

ue(v)

seq_parameter_set_id

1

ue(v)

entropy_coding_mode_flag

1

u(1)

pic_order_present_flag

1

u(1)

num_slice_groups_minus1

1

ue(v)

if( num_slice_groups_minus1 > 0 ) {

slice_group_map_type

1

ue(v)

if( slice_group_map_type = = 0 )

for( iGroup = 0; iGroup <= num_slice_groups_minus1; iGroup++ )

run_length_minus1[ iGroup ]

1

ue(v)

else if( slice_group_map_type = = 2 )

for( iGroup = 0; iGroup < num_slice_groups_minus1; iGroup++ ) {

top_left[ iGroup ]

1

ue(v)

bottom_right[ iGroup ]

1

ue(v)

}

else if( slice_group_map_type = = 3 | |
slice_group_map_type = = 4 | |
slice_group_map_type = = 5 ) {

slice_group_change_direction_flag

1

u(1)

slice_group_change_rate_minus1

1

ue(v)

} else if( slice_group_map_type = = 6 ) {

pic_size_in_map_units_minus1

1

ue(v)

for( i = 0; i <= pic_size_in_map_units_minus1; i++ )

slice_group_id[ i ]

1

u(v)

}

}

num_ref_idx_l0_active_minus1

1

ue(v)

num_ref_idx_l1_active_minus1

1

ue(v)

weighted_pred_flag

1

u(1)

weighted_bipred_idc

1

u(2)

pic_init_qp_minus26 /* relative to 26 */

1

se(v)

pic_init_qs_minus26 /* relative to 26 */

1

se(v)

chroma_qp_index_offset

1

se(v)

deblocking_filter_control_present_flag

1

u(1)

constrained_intra_pred_flag

1

u(1)

redundant_pic_cnt_present_flag

1

u(1)

if( more_rbsp_data( ) ) {

transform_8x8_mode_flag

1

u(1)

pic_scaling_matrix_present_flag

1

u(1)

if( pic_scaling_matrix_present_flag )

for( i = 0; i < 6 + 2* transform_8x8_mode_flag; i++ ) {

pic_scaling_list_present_flag[ i]

1

u(1)

if( pic_scaling_list_present_flag[ i ] )

if( i < 6 )

scaling_list( ScalingList4x4[ i ], 16,
UseDefaultScalingMatrix4x4Flag[ i ] )

1

else

scaling_list( ScalingList8x8[ i – 6 ], 64,
UseDefaultScalingMatrix8x8Flag[ i – 6 ] )

1

}

second_chroma_qp_index_offset

1

se(v)

}

rbsp_trailing_bits( )

1

}

0.1.2 Slice header syntax

slice_header( ) {

C

Descriptor

first_mb_in_slice

2

ue(v)

slice_type

2

ue(v)

pic_parameter_set_id

2

ue(v)

frame_num

2

u(v)

if( !frame_mbs_only_flag ) {

field_pic_flag

2

u(1)

if( field_pic_flag )

bottom_field_flag

2

u(1)

}

if( nal_unit_type = = 5 )

idr_pic_id

2

ue(v)

if( pic_order_cnt_type = = 0 ) {

pic_order_cnt_lsb

2

u(v)

if( pic_order_present_flag && !field_pic_flag )

delta_pic_order_cnt_bottom

2

se(v)

}

if( pic_order_cnt_type = = 1 && !delta_pic_order_always_zero_flag ) {

delta_pic_order_cnt[ 0 ]

2

se(v)

if( pic_order_present_flag && !field_pic_flag )

delta_pic_order_cnt[ 1 ]

2

se(v)

}

if( redundant_pic_cnt_present_flag )

redundant_pic_cnt

2

ue(v)

if( slice_type = = B )

direct_spatial_mv_pred_flag

2

u(1)

if( slice_type = = P | | slice_type = = SP | | slice_type = = B ) {

num_ref_idx_active_override_flag

2

u(1)

if( num_ref_idx_active_override_flag ) {

num_ref_idx_l0_active_minus1

2

ue(v)

if( slice_type = = B )

num_ref_idx_l1_active_minus1

2

ue(v)

}

}

ref_pic_list_reordering( )

2

if( ( weighted_pred_flag && ( slice_type = = P | | slice_type = = SP ) ) | |
( weighted_bipred_idc = = 1 && slice_type = = B ) )

pred_weight_table( )

2

if( nal_ref_idc != 0 )

dec_ref_pic_marking( )

2

if( entropy_coding_mode_flag && slice_type != I && slice_type != SI )

cabac_init_idc

2

ue(v)

slice_qp_delta

2

se(v)

if( slice_type = = SP | | slice_type = = SI ) {

if( slice_type = = SP )

sp_for_switch_flag

2

u(1)

slice_qs_delta

2

se(v)

}

if( deblocking_filter_control_present_flag ) {

disable_deblocking_filter_idc

2

ue(v)

if( disable_deblocking_filter_idc != 1 ) {

slice_alpha_c0_offset_div2

2

se(v)

slice_beta_offset_div2

2

se(v)

}

}

if( num_slice_groups_minus1 > 0 &&
slice_group_map_type >= 3 && slice_group_map_type <= 5)

slice_group_change_cycle

2

u(v)

}

0.1.3 Slice data syntax

slice_data( ) {

C

Descriptor

if( entropy_coding_mode_flag )

while( !byte_aligned( ) )

cabac_alignment_one_bit

2

f(1)

CurrMbAddr = first_mb_in_slice * ( 1 + MbaffFrameFlag )

moreDataFlag = 1

prevMbSkipped = 0

do {

if( slice_type != I && slice_type != SI )

if( !entropy_coding_mode_flag ) {

mb_skip_run

2

ue(v)

prevMbSkipped = ( mb_skip_run > 0 )

for( i=0; i<mb_skip_run; i++ )

CurrMbAddr = NextMbAddress( CurrMbAddr )

moreDataFlag = more_rbsp_data( )

} else {

mb_skip_flag

2

ae(v)

moreDataFlag = !mb_skip_flag

}

if( moreDataFlag ) {

if( MbaffFrameFlag && ( CurrMbAddr % 2 = = 0 | |

( CurrMbAddr % 2 = = 1 && prevMbSkipped ) ) )

mb_field_decoding_flag

2

u(1) | ae(v)

macroblock_layer( )

2 | 3 | 4

}

if( !entropy_coding_mode_flag )

moreDataFlag = more_rbsp_data( )

else {

if( slice_type != I && slice_type != SI )

prevMbSkipped = mb_skip_flag

if( MbaffFrameFlag && CurrMbAddr % 2 = = 0 )

moreDataFlag = 1

else {

end_of_slice_flag

2

ae(v)

moreDataFlag = !end_of_slice_flag

}

}

CurrMbAddr = NextMbAddress( CurrMbAddr )

} while( moreDataFlag )

}

The variable MbaffFrameFlag is derived as follows.

MbaffFrameFlag = ( mb_adaptive_frame_field_flag && !field_pic_flag ) (7-22)

0.1.4 Macroblock layer syntax

macroblock_layer( ) {

C

Descriptor

mb_type

2

ue(v) | ae(v)

if( mb_type = = I_PCM ) {

while( !byte_aligned( ) )

pcm_alignment_zero_bit

2

f(1)

for( i = 0; i < 256; i++ )

pcm_sample_luma[ i ]

2

u(v)

for( i = 0; i < 2 * MbWidthC * MbHeightC; i++ )

pcm_sample_chroma[ i ]

2

u(v)

} else {

noSubMbPartSizeLessThan8x8Flag = 1

if( mb_type != I_NxN &&

MbPartPredMode( mb_type, 0 ) != Intra_16x16 &&

NumMbPart( mb_type ) = = 4 ) {

sub_mb_pred( mb_type )

2

for( mbPartIdx = 0; mbPartIdx < 4; mbPartIdx++ )

if( sub_mb_type[ mbPartIdx ] != B_Direct_8x8 ) {

if( NumSubMbPart( sub_mb_type[ mbPartIdx ] ) > 1 )

noSubMbPartSizeLessThan8x8Flag = 0

} else if( !direct_8x8_inference_flag )

noSubMbPartSizeLessThan8x8Flag = 0

} else {

if( transform_8x8_mode_flag && mb_type = = I_NxN )

transform_size_8x8_flag

2

u(1) | ae(v)

mb_pred( mb_type )

2

}

if( MbPartPredMode( mb_type, 0 ) != Intra_16x16 ) {

coded_block_pattern

2

me(v) | ae(v)

if( CodedBlockPatternLuma > 0 &&

transform_8x8_mode_flag && mb_type != I_NxN &&

noSubMbPartSizeLessThan8x8Flag &&

( mb_type != B_Direct_16x16 | | direct_8x8_inference_flag ) )

transform_size_8x8_flag

2

u(1) | ae(v)

}

if( CodedBlockPatternLuma > 0 | | CodedBlockPatternChroma > 0 | |
MbPartPredMode( mb_type, 0 ) = = Intra_16x16 ) {

mb_qp_delta

2

se(v) | ae(v)

residual( )

3 | 4

}

}

}

0.1.4.1 Macroblock prediction syntax

mb_pred( mb_type ) {

C

Descriptor

if( MbPartPredMode( mb_type, 0 ) = = Intra_4x4 | |
MbPartPredMode( mb_type, 0 ) = = Intra_8x8 | |
MbPartPredMode( mb_type, 0 ) = = Intra_16x16 ) {

if( MbPartPredMode( mb_type, 0 ) = = Intra_4x4 )

for( luma4x4BlkIdx=0; luma4x4BlkIdx<16; luma4x4BlkIdx++ ) {

prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ]

2

u(1) | ae(v)

if( !prev_intra4x4_pred_mode_flag[ luma4x4BlkIdx ] )

rem_intra4x4_pred_mode[ luma4x4BlkIdx ]

2

u(3) | ae(v)

}

if( MbPartPredMode( mb_type, 0 ) = = Intra_8x8 )

for( luma8x8BlkIdx=0; luma8x8BlkIdx<4; luma8x8BlkIdx++ ) {

prev_intra8x8_pred_mode_flag[ luma8x8BlkIdx ]

2

u(1) | ae(v)

if( !prev_intra8x8_pred_mode_flag[ luma8x8BlkIdx ] )

rem_intra8x8_pred_mode[ luma8x8BlkIdx ]

2

u(3) | ae(v)

}

if( chroma_format_idc != 0 )

intra_chroma_pred_mode

2

ue(v) | ae(v)

} else if( MbPartPredMode( mb_type, 0 ) != Direct ) {

for( mbPartIdx = 0; mbPartIdx < NumMbPart( mb_type ); mbPartIdx++)

if( ( num_ref_idx_l0_active_minus1 > 0 | |
mb_field_decoding_flag ) &&
MbPartPredMode( mb_type, mbPartIdx ) != Pred_L1 )

ref_idx_l0[ mbPartIdx ]

2

te(v) | ae(v)

for( mbPartIdx = 0; mbPartIdx < NumMbPart( mb_type ); mbPartIdx++)

if( ( num_ref_idx_l1_active_minus1 > 0 | |
mb_field_decoding_flag ) &&
MbPartPredMode( mb_type, mbPartIdx ) != Pred_L0 )

ref_idx_l1[ mbPartIdx ]

2

te(v) | ae(v)

for( mbPartIdx = 0; mbPartIdx < NumMbPart( mb_type ); mbPartIdx++)

if( MbPartPredMode ( mb_type, mbPartIdx ) != Pred_L1 )

for( compIdx = 0; compIdx < 2; compIdx++ )

mvd_l0[ mbPartIdx ][ 0 ][ compIdx]

2

se(v) | ae(v)

for( mbPartIdx = 0; mbPartIdx < NumMbPart( mb_type ); mbPartIdx++)

if( MbPartPredMode( mb_type, mbPartIdx ) != Pred_L0 )

for( compIdx = 0; compIdx < 2; compIdx++ )

mvd_l1[ mbPartIdx ][ 0 ][ compIdx]

2

se(v) | ae(v)

}

}

0.1.4.2 Residual data syntax

residual( ) {

C

Descriptor

if( !entropy_coding_mode_flag )

residual_block = residual_block_cavlc

else

residual_block = residual_block_cabac

if( MbPartPredMode( mb_type, 0 ) = = Intra_16x16 )

residual_block( Intra16x16DCLevel, 16 )

3

for( i8x8 = 0; i8x8 < 4; i8x8++ ) /* each luma 8x8 block */

if( !transform_size_8x8_flag | | !entropy_coding_mode_flag )

for( i4x4 = 0; i4x4 < 4; i4x4++ ) { /* each 4x4 sub-block of block */

if( CodedBlockPatternLuma & ( 1 << i8x8 ) )

if( MbPartPredMode( mb_type, 0 ) = = Intra_16x16 )

residual_block( Intra16x16ACLevel[ i8x8 * 4 + i4x4 ], 15 )

3

else

residual_block( LumaLevel[ i8x8 * 4 + i4x4 ], 16 )

3 | 4

else if( MbPartPredMode( mb_type, 0 ) = = Intra_16x16 )

for( i = 0; i < 15; i++ )

Intra16x16ACLevel[ i8x8 * 4 + i4x4 ][ i ] = 0

else

for( i = 0; i < 16; i++ )

LumaLevel[ i8x8 * 4 + i4x4 ][ i ] = 0

if( !entropy_coding_mode_flag && transform_size_8x8_flag )

for( i = 0; i < 16; i++ )

LumaLevel8x8[ i8x8 ][ 4 * i + i4x4 ] =
LumaLevel[ i8x8 * 4 + i4x4 ][ i ]

}

else if( CodedBlockPatternLuma & ( 1 << i8x8 ) )

residual_block( LumaLevel8x8[ i8x8 ], 64 )

3 | 4

else

for( i = 0; i < 64; i++ )

LumaLevel8x8[ i8x8 ][ i ] = 0

if( chroma_format_idc != 0 ) {

NumC8x8 = 4 / ( SubWidthC * SubHeightC )

for( iCbCr = 0; iCbCr < 2; iCbCr++ )

if( CodedBlockPatternChroma & 3 ) /* chroma DC residual present */

residual_block( ChromaDCLevel[ iCbCr ], 4 * NumC8x8 )

3 | 4

else

for( i = 0; i < 4 * NumC8x8; i++ )

ChromaDCLevel[ iCbCr ][ i ] = 0

for( iCbCr = 0; iCbCr < 2; iCbCr++ )

for( i8x8 = 0; i8x8 < NumC8x8; i8x8++ )

for( i4x4 = 0; i4x4 < 4; i4x4++ )

if( CodedBlockPatternChroma & 2 )
/* chroma AC residual present */

residual_block( ChromaACLevel[ iCbCr ][ i8x8*4+i4x4 ], 15)

3 | 4

else

for( i = 0; i < 15; i++ )

ChromaACLevel[ iCbCr ][ i8x8*4+i4x4 ][ i ] = 0

}

residual_block_cavlc( coeffLevel, maxNumCoeff ) {

C

Descriptor

for( i = 0; i < maxNumCoeff; i++ )

coeffLevel[ i ] = 0

coeff_token

3 | 4

ce(v)

if( TotalCoeff( coeff_token ) > 0 ) {

if( TotalCoeff( coeff_token ) > 10 && TrailingOnes( coeff_token ) < 3 )

suffixLength = 1

else

suffixLength = 0

for( i = 0; i < TotalCoeff( coeff_token ); i++ )

if( i < TrailingOnes( coeff_token ) ) {

trailing_ones_sign_flag

3 | 4

u(1)

level[ i ] = 1 – 2 * trailing_ones_sign_flag

} else {

level_prefix

3 | 4

ce(v)

levelCode = ( Min( 15, level_prefix ) << suffixLength )

if( suffixLength > 0 | | level_prefix >= 14 ) {

level_suffix

3 | 4

u(v)

levelCode += level_suffix

}

if( level_prefix > = 15 && suffixLength = = 0 )

levelCode += 15

if( level_prefix > = 16 )

levelCode += ( 1 << ( level_prefix – 3 ) ) – 4096

if( i = = TrailingOnes( coeff_token ) &&
TrailingOnes( coeff_token ) < 3 )

levelCode += 2

if( levelCode % 2 = = 0 )

level[ i ] = ( levelCode + 2 ) >> 1

else

level[ i ] = ( –levelCode – 1 ) >> 1

if( suffixLength = = 0 )

suffixLength = 1

if( Abs( level[ i ] ) > ( 3 << ( suffixLength – 1 ) ) &&
suffixLength < 6 )

suffixLength++

}

if( TotalCoeff( coeff_token ) < maxNumCoeff ) {

total_zeros

3 | 4

ce(v)

zerosLeft = total_zeros

} else

zerosLeft = 0

for( i = 0; i < TotalCoeff( coeff_token ) – 1; i++ ) {

if( zerosLeft > 0 ) {

run_before

3 | 4

ce(v)

run[ i ] = run_before

} else

run[ i ] = 0

zerosLeft = zerosLeft – run[ i ]

}

run[ TotalCoeff( coeff_token ) – 1 ] = zerosLeft

coeffNum = ‑1

for( i = TotalCoeff( coeff_token ) – 1; i >= 0; i-- ) {

coeffNum += run[ i ] + 1

coeffLevel[ coeffNum ] = level[ i ]

}

}

}

發佈了3 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章