分析一段H264视频数据

分析一段H264视频数据

Posted on 2007-05-31 09:42 vcommon 阅读(1968) 评论(8) 编辑收藏 引用 <!-- <rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:description rdf:about="http://www.cnitblog.com/vcommon/archive/2007/05/31/27842.html" dc:identifier="http://www.cnitblog.com/vcommon/archive/2007/05/31/27842.html" dc:title="分析一段h264视频数据" trackback:ping="http://www.cnitblog.com/vcommon/services/trackbacks/27842.aspx" /> </rdf:rdf> -->

分析

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,根据Annex B

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

nal_unit_type(5= 0 0111seq_parameter_set_rbsp()

所以 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 subclause 9.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_framesue):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=01000pic_parameter_set_rbsp(),7.3.2.2

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 to26 */(se):0

pic_init_qs_minus26/* relative to26 */(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(50 0101slice_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_deltasev):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_modeue(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,根据Table9?4,= 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 无

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 to0 */

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 to0x00 */

f(8)

start_code_prefix_one_3bytes/* equal to0x000001 */

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 to26 */

1

se(v)

pic_init_qs_minus26/* relative to26 */

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 ]

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值