H.264 sequence_parameter_sets成員值含義學習筆記

SPS: sequence parameter sets
它指的是碼流對應的profile.
 
1.1 基線profile(Baseline profile)
遵循基線profile的碼流應該遵循以下的約束:
 
a) 只有IP切片存在
b) NAL單元流不應該有範圍在24nal_unit_type,包括24.
c) 序列參數集(sps)frame_mbs_only_fag(之後介紹)應該等於1
d) 圖象參數值(psp)weighted_pred_flagweighted_bipred_idc都應該爲0
e) 圖象參數值(psp)entropy_coding_mode_flag應該等於0
f) 圖象參數值(psp)num_slice_groups_minus1應該在07之間,包括07**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之內的值。包括24.
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_idc77的或constrained_set1_flag值爲1level_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的值範圍爲07,包括07
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_flagconstraint_set2_flag中不只一個值爲1的話,那麼碼流必須滿足所有相應指明的profile約束。
Reserved. Set to 0.
Reserved. Set to 0.
它指的是碼流對應的level.
 
5.1 獨立於profilelevel約束
fR是這樣一個變量:
a) 如果圖像n是一幀,fR設爲1/172
b) 如果圖像n是一個場,fR設爲1/(172*2)
 
任何profile下的指定的level都應該滿足如下約束:
a) 理論上可訪問單元nCPB中的移除時間滿足這樣的約束: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) 對於可訪問單元0NumBytesInNALunit變量的總和少於或等於256*ChromaFormatFactor*(PicSizeInMbs+MaxMBPS*tr(0)-trn(0)/MinCRMaxMBPSMinCR是圖象0level表中相應的值,PicSizeInMbs是圖象0的宏塊數量。
d) 對於可訪問單元nNumBytesInNALunit值的總和是小於或等於256*ChromaFormatFactor*MaxMBPS*(tr(n)-trn(n-1))/MinCR,MaxMBPSMinCR的值是圖像nlevel級表中對應的值。
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 * MaxBRCpbSize[SchedSelIdx] <= 1000 * MaxCPBMaxBRMaxCPB是對於1000bits/s1000位單元對應於level級表的值。碼流應該爲0cpb_cnt_minus1中的一個值,包括0cpb_cnt_minus1.CpbSize[SchedSelIdx]也叫做CPB大小值。
j) 對於NAL HRD參數來說,BitRate[SchSelIdx] <= 1200 * MaxBRCpbSize[SchedSelIdx] <= 1200 * MaxCPBMaxBRMaxCPB是在1200bits/s1200位的單元值在極限level下的值。碼流應該滿足至少SchedSelIdx值從0cpb_cnt_minus1中的一個值。
k) 在亮度幀採樣中,垂直運動向量元素範圍不能超過MaxVmvRMaxVmvR值在level極限表中提供
l) 在亮度幀採樣單元中,水平運動向量範圍不能超過-20482047.75,包括-20482047.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值應該是從031,包括031
注意:當可用的情況下,編碼器應該在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的值應該在012之間,包括012.
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的值爲包括012以及它們之間的值。
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_cycle0255之間取值,包括邊界值。
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_minus11指明瞭對於每個解碼圖像中的寬度值。在宏塊單元中的圖像寬度的變量值爲:
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等於0pic_height_in_map_units_minus1就是宏塊單元的場高
frame_mbs_only_flag等於1pic_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_SkipB_Direct_16x16B_Direct_8x8的方法。
frame_mbs_only_flag0時,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
 
}
 
 
 
發佈了10 篇原創文章 · 獲贊 5 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章