营口市法院院长:分析一段H264视频数据 - vc - IT博客网

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 17:31:39
分析一段H264视频数据
Posted on 2007-05-31 09:42vcommon 阅读(1968)评论(8)  编辑 收藏引用
分析
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 0111:seq_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 syntaxelement with the left bit first. The parsing process for thisdescriptor 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_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
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,根据,= 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; iCurrMbAddr = 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


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
}
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 ) {
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
}
7?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)
}
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
}
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)
}
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; iCurrMbAddr = 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)
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
}
}
}
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)
}
}
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 ]
}
}
}
Feedback
# re: 分析一段H264视频数据[未登录]  回复  更多评论
2007-08-17 10:15 by
谢谢你了 很感谢
# re: 分析一段H264视频数据  回复  更多评论
2007-10-12 15:22 by
刚开始接触,了解的不多,请问:为什么某些地方要忽略,并且忽略的位数是如何知道的?希望能介绍的详细点
# re: 分析一段H264视频数据[未登录]  回复  更多评论
2007-10-12 17:36 by
忽略是一般是根据Slice data syntax等详细的语法来的,忽略的位数参考语法,文法,都在标准里边,很多很多的表.
# re: 分析一段H264视频数据  回复  更多评论
2007-10-24 14:33 by
seq_parameter_set_id(UE(V)):
ue(v): unsigned integer Exp-Golomb-coded syntax element with theleft bit first. The parsing process for this descriptor is specified insubclause 9.1
uvlC: 1001:根据Table9.1 , value= 0,只占1bit.
根据profile_idc忽略掉一部分。
log2_max_frame_num_minus4(ue(v): 001 1001,len = 5,value= 5
这里是怎么分析的呢,对于ue(v)文档好像说是从当前位开始读,直到第一个非0位停止。可是我分析来,不是很明白,楼主帮忙解一下,谢谢
# re: 分析一段H264视频数据  回复  更多评论
2007-11-18 16:55 byliyali
读过你的分析。很好。有个问题:
PES包长最长64K,打包成很多TS.TS包长固定为188字节.计数器最大16个。16*184<64k.那么接收端如何才能正确恢复pes包?
# re: 分析一段H264视频数据[未登录]  回复  更多评论
2007-11-19 15:13 by
TS包的计数器是循环的,只是表明连续的TS包不是重复或者错误的,对于重建pes包是根据PES的Packet头来实现,和TS层没有关系.
# re: 分析一段H264视频数据  回复  更多评论
2007-11-27 11:57 by
@vcommon
谢谢你的TS包的计数器解答。
# re: 分析一段H264视频数据  回复  更多评论
2008-04-09 16:00 by
@lala
楼主的value指的应该就是codeNum吧
log2_max_frame_num_minus4(ue(v): 001 1001,len = 5,value= 5
参照9.1节,先计算一下leadingZeroBits = 2,此时一共读了3个bit;当前指针指向1001
001 ^1001
|
pos
然后再读2bit(结果值为2), codeNum = 2^leadingZeroBits -1+ 2 = 5
不知我说的对否?