SODB:最原始的編碼數據,沒有任何附加數據
RBSP:在 SODB 的基礎上加了rbsp_stop_ont_bit(bit 值為 1)并用 0 按字節補位對齊
EBSP:在 RBSP 的基礎上增加了防止偽起始碼字節(0X03)
?
SPS: sequence parameter sets
它指的是碼流對應的profile.
1.1 基線profile(Baseline profile)
???? 遵循基線profile的碼流應該遵循以下的約束:
???? a) 只有I和P切片存在
????? b) NAL單元流不應該有范圍在2到4的nal_unit_type值,包括2和4.
???? c) 序列參數集(sps)的frame_mbs_only_fag(之后介紹)應該等于1
???? d) 圖象參數值(psp)的weighted_pred_flag和weighted_bipred_idc都應該為0
???? e) 圖象參數值(psp)的entropy_coding_mode_flag應該等于0
????? f) 圖象參數值(psp)的num_slice_groups_minus1應該在0到7之間,包括0和7**psp部分參數含義在關于psp的文章中給出。
????? g) 對于基線profile對應的level度應該滿足.
?????? 符合基線profile的碼流的profile_idc被賦66.符合一定level的基線Baseline的解碼器應該可以解碼所有的profile_idc等于66的碼流或constrained_set0_flag(等會介紹)為1而且level_idc(在level部分介紹)少于或等于一個指定的level的碼流。
1.2 主profile(Main profile)
???? 符合主profile的碼流應該遵循以下的約束:
a) 只有I,P,B切片存在.
b) NAL單元流不包括nal_unit_type值范圍在2-4之內的值。包括2和4.
c) 不能允許有隨意順序的切片
d) 圖像參數集(psp)的num_slice_groups_minus1應該只為0
e) 圖像參數集(psp)的redundant_pic_cnt_present_flag應該只為0
f) 對于主profile所要求的level級需要達到。
????? 符合主profile的碼流的profile_idc應為77。符合指定level的主profile的解碼器應該可以解碼所有的profile_idc為77的或constrained_set1_flag值為1且level_idc值小于或等于指定level的碼流。
1.3 擴展profile(Extended profile)
符合擴展profile的碼流應該遵循以下的約束:
a) 序列參數集的direct_8x8_inference_flag值應該為1
b) 圖像參數集的entropy_coding_mode_flag值應該為0
c) 圖像參數集的num_slice_groups_minus1的值范圍為0到7,包括0和7
d) 對于擴展profile指定的level級應該被達到
?????? 符合指定level級的擴展profile的解碼器可以解碼所有的profile_idc值為88的或constrained_set2_flag值為1的,而且level_idc小于等于指定level級的碼流。
?????? 符合指定level級的擴展profile的解碼器可以解碼所有的profile_idc值為66的或constrained_set0_flag值為1的,而且level_idc小于等于指定level級的碼流。
當constrained_set0_flag值為1的時候,就說明碼流應該遵循基線profile(Baseline profile)的所有約束.constrained_set0_flag值為0時,說明碼流不一定要遵循基線profile的所有約束。
當constrained_set1_flag值為1的時候,就說明碼流應該遵循主profile(Main profile)的所有約束.constrained_set1_flag值為0時,說明碼流不一定要遵循主profile的所有約束。
當constrained_set2_flag值為1的時候,就說明碼流應該遵循擴展profile(Extended profile)的所有約束.constrained_set2_flag值為0時,說明碼流不一定要遵循擴展profile的所有約束。
注意:當constraint_set0_flag,constraint_set1_flag或constraint_set2_flag中不只一個值為1的話,那么碼流必須滿足所有相應指明的profile約束。
Reserved. Set to 0.
Reserved. Set to 0.
它指的是碼流對應的level級.
5.1 獨立于profile的level約束
讓fR是這樣一個變量:
a) 如果圖像n是一幀,fR設為1/172
b) 如果圖像n是一個場,fR設為1/(172*2)
任何profile下的指定的level都應該滿足如下約束:
a) 理論上可訪問單元n從CPB中的移除時間滿足這樣的約束:t(n)-t(n-1)要比Max(PicSizeInMbs,MaxMBPS,fR)值大或相等,MaxMBPS是說在level表中指出的對于圖像n的值,PicSizeInMbs是指在圖像n中的宏塊數。
b) 如果圖像n是一個輸出圖像而且它不是碼流的最后一個輸出圖象,從DPB中取出的連續的輸出圖象差滿足:Dt(n) >= Max(PicSizeInMbs, MaxMBPS, fR), MaxMBPS是指對于圖象n來說的相應的值。PicSizeInMbs指圖象n的宏塊。
c) 對于可訪問單元0的NumBytesInNALunit變量的總和少于或等于256*ChromaFormatFactor*(PicSizeInMbs+MaxMBPS*tr(0)-trn(0)/MinCR,MaxMBPS和MinCR是圖象0在level表中相應的值,PicSizeInMbs是圖象0的宏塊數量。
d) 對于可訪問單元n的NumBytesInNALunit值的總和是小于或等于256*ChromaFormatFactor*MaxMBPS*(tr(n)-trn(n-1))/MinCR,MaxMBPS和MinCR的值是圖像n在level級表中對應的值。
e) PicWidthInMbs * FrameHeightInMbs <= MaxFS, MaxFS是在level表中指定的值。
f) PicWidthInMbs <= Sqrt(MaxFS * 8)
g) FrameHeightInMbs <= Sqrt(MaxFS * 8)
h) max_dec_frame_buffering <=MaxDpbSize, MaxDpbSize等于Min(1024 * MaxDPB / (PicWidthInMbs * FrameHeightInMbs * 256 * ChromaFormatFactor,16),MaxDPB是對于1024字節單元的MaxDPB值,max_dec_frame_buffering也叫做DPB大小值。
i) 對于VCL HRD參數值,至少對于一個SchedSelIdx值來說,碼率BitRate[SchedSelIdx] <= 1000 * MaxBR且CpbSize[SchedSelIdx] <= 1000 * MaxCPB。MaxBR和MaxCPB是對于1000bits/s和1000位單元對應于level級表的值。碼流應該為0到cpb_cnt_minus1中的一個值,包括0和cpb_cnt_minus1.CpbSize[SchedSelIdx]也叫做CPB大小值。
j) 對于NAL HRD參數來說,BitRate[SchSelIdx] <= 1200 * MaxBR且CpbSize[SchedSelIdx] <= 1200 * MaxCPB,MaxBR和MaxCPB是在1200bits/s和1200位的單元值在極限level下的值。碼流應該滿足至少SchedSelIdx值從0到cpb_cnt_minus1中的一個值。
k) 在亮度幀采樣中,垂直運動向量元素范圍不能超過MaxVmvR,MaxVmvR值在level極限表中提供
l) 在亮度幀采樣單元中,水平運動向量范圍不能超過-2048到2047.75,包括-2048和2047.75。
m) 按解碼順序的兩個連續的宏愉的運動向量的數量不超過MaxMvsPer2Mb(對于當前宏塊的最后一個切片和下一個宏塊的第一個切片也適用),MaxMvsPer2Mb值在level極限表中提供.
n) 對于任何宏塊的macroblock_layer()的位數值都不能大于128 + 2048 * ChromaFormatFactor.依賴于entropy_coding_mode_flag值,macroblock_layer()的值由如下方式計算
如果entropy_coding_mode_flag值為0的話,macroblock_layer()的值由macroblock_layer()的對于一個macroblock的語法結構給出
其他情況下,對于一個宏塊的macroblock_layer()值是由read_bits(1)給出的.
5.2 與profile相關的level級
對于基線profile,主profile和擴展profile的相應的level級約束在H.264的文檔中有表可查。
seq_parameter_set_id指定了由圖像參數集指明的序列參數集。seq_parameter_set_id值應該是從0到31,包括0和31
注意:當可用的情況下,編碼器應該在sps值不同的情況下使用不同的seq_parameter_set_id值,而不是變化某一特定值的seq_parameter_set_id的參數集的語法結構中的值。
log2_max_frame_num_minus4指定了變量MaxFrameNum的值, MaxFrameNum = 2(log2_max_frame_num_minus4+4)
log2_max_frame_num_minus的值應該在0到12之間,包括0和12.
pic_order_cnt_type指定了解碼圖像順序的方法。pic_order_cnt_type的值是0,1,2。
pic_order_cnt_type在當一個編碼視頻序列有如下限定時不為2
a) 包含非參考幀的可訪問單元,并緊接著一個包含非參考可訪問單元
b) 兩個可訪問單元,它們分別包含兩個場中的一個,它們一塊兒組成了一個互補的非參考場對,被緊接著一個包括非參考圖像的可訪問單元。
c) 一個包含非參考場的可訪問單元,并緊接著一個包含另一個非參考圖像的可訪問單元,它們不組成互補的非參考場對。
log2_max_pic_order_cnt_lsb_minus4指出變量MaxPicOrderCntLsb的值,它是在解碼過程中使用到的圖像順序計算值:
MaxPicOrderCntLsb = 2(log2_max_pic_order_cnt_lsb_minus4+4)
log2_max_pic_order_cnt_lsb_minus4的值為包括0和12以及它們之間的值。
delta_pic_order_always_zero_flag等于1的時候表示當delta_pic_order_cnt[0]和delta_pic_order_cnt[1]在序列的切片頭中不存在,并被認為是0。
delta_pic_order_always_zero_flag值等于0時表示delta_pic_order_cnt[0]在序列的切片頭中存在而delta_pic_order_cnt[1]可能在序列的切片頭中存在。
offset_for_non_ref_pic被用來計算一個非參考圖像的圖像順序值。offset_for_non_ref_pic值取值范圍為(-2)^(31)到2^(31)-1,包括邊界值。
offset_for_top_to_bottom_field被用來計算一幀中的下場的圖像順序值。
offset_for_top_to_bottom_field值的取值范圍為(-2)^(31)到(2)^(31)-1,包括邊界值。
num_ref_frames_in_pic_order_cnt_cycle在解碼過程中被用來計算圖像順序值。
num_ref_frames_in_pic_order_cnt_cycle在0到255之間取值,包括邊界值。
[i]
offset_for_ref_frame[i]是一列num_ref_frames_in_pic_order_cnt_cycle中的一個元素,它被在解碼過程的解碼順序值中使用。
offset_for_ref_frame[i]的值為(-2)^31到(2)^(31)-1,包括邊界值。
num_ref_frames指定了長期的和短期的參考幀的最大總數目,互補的參考場對和在解碼過程。
gaps_in_frame_num_value_allowed_flag值指明了frame_num允許的值和解碼過程中的frame_num的差距值。
pic_width_in_mbs_minus1加1指明了對于每個解碼圖像中的寬度值。在宏塊單元中的圖像寬度的變量值為:
PicWidthInMbs = pic_width_in_mbs_minus1+1;
對于亮度元素來說圖像寬度變量的值:
PicWidthInSamplesL = PicWidthInMbs * 16;
對于色度元素來說圖像寬度變量的值:
PicWidthInSamplesC = PicWidthInMbs * 8;
pic_height_in_map_units_minus1指明了解碼幀或場中的一個切片組的高度。變量PicHeightInMapUnits的值和PicSizeInMapUnits:
PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1;
PicSizeInMapUnits = PicWidthInMbs * PicHeightInMapUnits
frame_mbs_only_flag等于0指明了視頻序列的編碼圖象可能是編碼場或編碼幀。frame_mbs_only_flag等于1指明了每個編碼視頻序列的編碼圖像都是只含幀宏塊的編碼幀。
依賴于frame_mbs_only_flag的值,pic_height_in_map_units_minus1如下定義:
如frame_mbs_only_flag等于0,pic_height_in_map_units_minus1就是宏塊單元的場高
如frame_mbs_only_flag等于1,pic_height_in_map_units_minus1就是宏塊單元的場寬
FrameHeightInMbs的值:
FrameheightInMbs = ( 2 - frame_mbs_only_flag ) * PicHeightInMapUnits
mb_adaptive_frame_field_flag等于0表明在一個圖像內不能切換使用幀和場宏塊。
mb_adaptive_frame_field_flag等于1表示在一幀中有可能使用場和幀的切換,當mb_adaptive_frame_field_flag沒有設定的時候,應該賦給0.
direct_8x8_inference_flag指明了在亮度運動向量生成B_Skip,B_Direct_16x16和B_Direct_8x8的方法。
當frame_mbs_only_flag為0時,direct_8x8_inference_flag應為1
frame_cropping_flag等于1表明在sps中下一個使用的幀剪切偏移量參數。frame_cropping_flag等于0表明幀剪切偏移量不存在。
指明了在一個窗中一幀的采樣值。
vui_parameters_present_flag等于1表示vui_parameters()在碼流中是存在的,vui_parameters_present_flag等于0表明vui_parameters()在碼流中不存在。
rbsp_stop_one_bit??????? 恒等于1
rbsp_alignment_zero_bit????? 恒等于0.
Note:
?????? More detail need refer to
?????? 1). Advanced video coding for generic audiovisual services.pdf P63.
?????? 2). Refer to ISOIEC 14496-10-2005-PDAM 3.doc P40
rbsp_trailing_bits( ) { C Descriptor
??? rbsp_stop_one_bit /* equal to 1 */ All f(1)
??? while( !byte_aligned( ) )????
?????? rbsp_alignment_zero_bit /* equal to 0 */ All f(1)
}????
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 = = 83 ) {????
?????? seq_parameter_set_svc_extension( ) /* specified in Annex F */????
??? }????
??? if( profile_idc = = 100 | | profile_idc = = 110 | |
??????? profile_idc = = 122 | | profile_idc = = 144 | |
??????? profile_idc = = 83 ) {????
?????? 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??
}????
delta_pic_order_cnt_bottom 表示一個編碼幀的底場和頂場的圖像順序數之間的差.
PicInterlace代表幀級隔行掃描,MbInterlace代表宏塊級隔行掃描
PicInterlace???????????? = 0???? # Picture AFF??? (0: frame coding, 1: field coding, 2:adaptive frame/field coding)
MbInterlace????????????? = 0???? # Macroblock AFF (0: frame coding, 1: field coding, 2:adaptive frame/field coding) .
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jiangdf/archive/2009/06/08/4252071.aspx