1、sequence_parameter_set_rbsp_t結構體內成員及用途
1. unsigned profile_idc: 它指的是碼流對應的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
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級的碼流。
2. constrained_set0_flag
當constrained_set0_flag值爲1的時候,就說明碼流應該遵循基線profile(Baseline profile)的全部約 束.constrained_set0_flag值爲0時,說明碼流不必定要遵循基線profile的全部約束。
3. constrained_set1_flag
當constrained_set1_flag值爲1的時候,就說明碼流應該遵循主profile(Main profile)的全部約束.ui
constrained_set1_flag值爲0時,說明碼流不必定要遵循主profile的全部約束。
4. constrained_set2_flag
當constrained_set2_flag值爲1的時候,就說明碼流應該遵循擴展profile(Extended profile)的全部約 束.constrained_set2_flag值爲0時,說明碼流不必定要遵循擴展profile的全部約束。
注意:當constraint_set0_flag,constraint_set1_flag或constraint_set2_flag中不僅一個值爲1的話,編碼
那麼碼流必須知足全部相應指明的profile約束。
5. level_idc
它指的是碼流對應的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來講的相應的值。spa
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和orm
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(對於當前宏塊的最後一個切ip
片和下一個宏塊的第一個切片也適用),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的文檔中有表可查。
6. seq_parameter_set_id
seq_parameter_set_id指定了由圖像參數集指明的序列參數集。seq_parameter_set_id值應該是從0到31,包括0和31
注意: 當可用的狀況下,編碼器應該在sps值不一樣的狀況下使用不一樣的seq_parameter_set_id值,而不是變化某一特定值的seq_parameter_set_id的參數集的語法結構中的值。
7. log2_max_frame_num_minus4
log2_max_frame_num_minus4指定了變量MaxFrameNum的值,MaxFrameNum = 2(log2_max_frame_num_minus4+4)
log2_max_frame_num_minus的值應該在0到12之間,包括0和12.
8. pic_order_cnt_type
pic_order_cnt_type指定了解碼圖像順序的方法。pic_order_cnt_type的值是0,1,2。
pic_order_cnt_type在當一個編碼視頻序列有以下限定時不爲2
a) 包含非參考幀的可訪問單元,並緊接着一個包含非參考可訪問單元
b) 兩個可訪問單元,它們分別包含兩個場中的一個,它們一起組成了一個互補的非參考場對,被緊接着一個包括非參考圖像的可訪問單元。
c) 一個包含非參考場的可訪問單元,並緊接着一個包含另外一個非參考圖像的可訪問單元,它們不組成互補的非參考場對。
9. log2_max_pic_order_cnt_lsb_minus4
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以及它們之間的值。
10. delta_pic_order_always_zero_flag
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]可能在序列的切片頭中存在。
11. offset_for_non_ref_pic
offset_for_non_ref_pic被用來計算一個非參考圖像的圖像順序值。offset_for_non_ref_pic值取值範圍爲(-2)^(31)到2^(31)-1,包括邊界值。
12. offset_for_top_to_bottom_field
offset_for_top_to_bottom_field被用來計算一幀中的下場的圖像順序值。offset_for_top_to_bottom_field值的取值範圍爲(-2)^(31)到(2)^(31)-1,包括邊界值。
13. num_ref_frames_in_pic_order_cnt_cycle
num_ref_frames_in_pic_order_cnt_cycle在解碼過程當中被用來計算圖像順序值。num_ref_frames_in_pic_order_cnt_cycle在0到255之間取值,包括邊界值。
14. offset_for_ref_frame[i]
offset_for_ref_frame[i]是一列num_ref_frames_in_pic_order_cnt_cycle中的一個元素, 它被在解碼過程的解碼順序值中使用。offset_for_ref_frame[i]的值爲(-2)^31到(2)^(31)-1,包括邊界值。
15. num_ref_frames
num_ref_frames指定了長期的和短時間的參考幀的最大總數目,互補的參考場對和在解碼過程當中對於任何序列使用的幀間預測的非配對的參考場。 num_ref_frames也決定了滑動窗口的操做大小過程。num_ref_frames值在0-16之間,包括邊界值。
16. gaps_in_frame_num_value_allowed_flag
gaps_in_frame_num_value_allowed_flag值指明瞭frame_num容許的值和解碼過程當中的frame_num的差距值。
17. pic_width_in_mbs_minus1
pic_width_in_mbs_minus1加1指明瞭對於每一個解碼圖像中的寬度值。在宏塊單元中的圖像寬度的變量值爲:
PicWidthInMbs = pic_width_in_mbs_minus1+1;
對於亮度元素來講圖像寬度變量的值:PicWidthInSamplesL = PicWidthInMbs * 16;
對於色度元素來講圖像寬度變量的值:PicWidthInSamplesC = PicWidthInMbs * 8
18. pic_height_in_map_units_minus1
pic_height_in_map_units_minus1指明瞭解碼幀或場中的一個切片組的高度。變量PicHeightInMapUnits的值和PicSizeInMapUnits:
PicHeightInMapUnits = pic_height_in_map_units_minus1 + 1;
PicSizeInMapUnits = PicWidthInMbs * PicHeightInMapUnits
19.frame_mbs_only_flag
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
20. mb_adaptive_frame_field_flag
mb_adaptive_frame_field_flag等於0代表在一個圖像內不能切換使用幀和場宏塊。 mb_adaptive_frame_field_flag等於1表示在一幀中有可能使用場和幀的切換,當 mb_adaptive_frame_field_flag沒有設定的時候,應該賦給0.
21. direct_8x8_inference_flag
direct_8x8_inference_flag指明瞭在亮度運動向量生成B_Skip,B_Direct_16x16和 B_Direct_8x8的方法。當frame_mbs_only_flag爲0時,direct_8x8_inference_flag應爲1
22. frame_cropping_flag
frame_cropping_flag等於1代表在sps中下一個使用的幀剪切偏移量參數。frame_cropping_flag等於0代表幀剪切偏移量不存在。
23. frame_crop_left_offset,frame_crop_right_offset,frame_crop_top_offset,frame_crop_bottom_offset指明瞭在一個窗中一幀的採樣值。
24. vui_parameters_present_flag
vui_parameters_present_flag等於1表示vui_parameters()在碼流中是存在的,vui_parameters_present_flag等於0代表vui_parameters()在碼流中不存在。it