分析一段H264視頻數據
Posted on 2007-05-31 09:42 vcommon 閱讀(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 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_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,根據Table?9?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 to?0 */ | 0 | u(4) |
???? level_idc | 0 | u(8) |
???? seq_parameter_set_id | 0 | ue(v) |
???? if( profile_idc?= =?100?| |?profile_idc?= =?110?| | | ? | ? |
???????? 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, | 0 | ? |
?????????????????????? else | ? | ? |
?????????????????????????? scaling_list( ScalingList8x8[ i?–?6 ], 64, | 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 | ? |
} | ? | ? |
?
?
Table?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 | 2, 3, 4 |
2 | Coded slice data partition A | 2 |
3 | Coded slice data partition B | 3 |
4 | Coded slice data partition C | 4 |
5 | Coded slice of an IDR picture | 2, 3 |
6 | Supplemental enhancement information (SEI) | 5 |
7 | Sequence parameter set | 0 |
8 | Picture parameter set | 1 |
9 | Access unit delimiter | 6 |
10 | End of sequence | 7 |
11 | End of stream | 8 |
12 | Filler data | 9 |
13 | Sequence parameter set extension | 10 |
14..18 | Reserved | ? |
19 | Coded slice of an auxiliary coded picture without partitioning | 2, 3, 4 |
20..23 | Reserved | ? |
24..31 | Unspecified | ? |
?
?
?
?
byte_stream_nal_unit(?NumBytesInNALunit?) { | C | Descriptor |
???? while( next_bits(?24?)?!=?0x000001 && | ? | ? |
???????? 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( ) && | ? | ? |
???????? 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_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, | 1 | ? |
?????????????????????? else | ? | ? |
?????????????????????????? scaling_list( ScalingList8x8[ i?–?6 ], 64, | 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 ) )?| | | ? | ? |
???????? 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_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?| | | ? | ? |
????????????? 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?| |? | ? | ? |
???????? 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?| | | ? | ? |
????????????????? 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?| | | ? | ? |
????????????????? 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?] = | ? | ? |
????????????? } | ? | ? |
???????? 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 ) | ? | ? |
?????????????????????????? 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 )?&&? | ? | ? |
????????????????? 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++ | ? | ? |
?????????? } | ? | ? |
?????? 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 ] | ? | ? |
?????? } | ? | ? |
??? } | ? | ? |
} |