1. 程式人生 > >H264引數結構三:序列引數集層(SPS) & 影象引數集語義

H264引數結構三:序列引數集層(SPS) & 影象引數集語義

   1:  pic_parameter_set_rbsp( ) {   
   2:      // pic_parameter_set_id 用以指定本引數集的序號,該序號在各片的片頭被引用。 
   3:     pic_parameter_set_id   
   4:      // seq_parameter_set_id  指明本影象引數集所引用的序列引數集的序號。 
   5:      seq_parameter_set_id   
   6:     // entropy_coding_mode_flag  指明熵編碼的選擇,本句法元素為0時,表示熵編碼使用 CAVLC,本句法元素為1時表示熵編碼使用 CABAC  
   7:      entropy_coding_mode_flag   
   8:      // pic_order_present_flag        POC 的三種計算方法在片層還各需要用一些句法元素作為引數,本句法元素等於1時表示在片頭會有句法元素指明這些引數;本句法元素等於0時,表示片頭不會給出這些引數,這些引數使用預設值 
   9:      pic_order_present_flag   
  10:      // num_slice_groups_minus1  本句法元素加1後指明影象中片組的個數。H.264  中沒有專門的句法元素用於指明是否使用片組模式,當本句法元素等於0(即只有一個片組),表示不使用片組模式,後面也不會跟有用於計算片組對映的句法元素。  
  11:      num_slice_groups_minus1   
  12:      if( num_slice_groups_minus1 > 0 ) {    
  13:          /* slice_group_map_type  用以指明片組分割型別。  
  14:             map_units 的定義: 
  15:            -  當 frame_mbs_only_flag 等於1時,map_units 指的就是巨集塊 
  16:            -  當 frame_mbs_only_flag 等於0時  
  17:                -  幀場自適應模式時,map_units 指的是巨集塊對 
  18:                -  場模式時,map_units 指的是巨集塊 
  19:                -  幀模式時,map_units 指的是與巨集塊對相類似的,上下兩個連續巨集塊的組合體。      */ 
  20:          slice_group_map_type        
  21:          if( slice_group_map_type    = =    0 )         
  22:              for( iGroup = 0; iGroup <= num_slice_groups_minus1; iGroup++ )         
  23:                  // run_length_minus1[i]     用以指明當片組型別等於0時,每個片組連續的 map_units 個數 
  24:                  run_length_minus1[ iGroup ]    
  25:          else if( slice_group_map_type    = =    2 )         
  26:              for( iGroup = 0; iGroup < num_slice_groups_minus1; iGroup++ ) {         
  27:                  // top_left[i],bottom_right[i]   用以指明當片組型別等於2時,矩形區域的左上及右下位置。 
  28:                  top_left[ iGroup ]   
  29:                  bottom_right[ iGroup ]   
  30:              }         
  31:          else if(    slice_group_map_type    = =    3    | |     
  32:                      slice_group_map_type    = =    4    | |     
  33:                      slice_group_map_type    = =    5 ) { 
  34:              // slice_group_change_direction_flag 與下一個句法元素一起指明確切的片組分割方法。  
  35:             slice_group_change_direction_flag    
  36:             // slice_group_change_rate_minus1       用以指明變數 SliceGroupChangeRAte 
  37:              slice_group_change_rate_minus1    
  38:          } else if( slice_group_map_type    = =    6 ) {    
  39:             // pic_size_in_map_units_minus1   在片組型別等於6時,用以指明影象以 map_units 為單位的大小。      
  40:              pic_size_in_map_units_minus1    
  41:              for( i = 0; i <= pic_size_in_map_units_minus1; i++ )         
  42:                  // slice_group_id[i]           在片組型別等於6時,用以指明某個 map_units 屬於哪個片組。 
  43:                  slice_group_id[ i ]    
  44:          }         
  45:      }         
  46:     // num_ref_idx_l0_active_minus1  加1後指明目前參考幀佇列的長度,即有多少個參考幀(包括短期和長期)。值得注意的是,當目前解碼影象是場模式下,參考幀佇列的長度應該是本句法元素再乘以2,因為場模式下各幀必須被分解以場對形式存在。(這裡所說的場模式包括影象的場及幀場自適應下的處於場模式的巨集塊對)  本句法元素的值有可能在片頭被過載。  
  47:        在序列引數集中有句法元素 num_ref_frames 也是跟參考幀佇列有關,它們的區別是num_ref_frames指明參考幀佇列的最大值,解碼 器用它的值來分配記憶體空 間;num_ref_idx_l0_active_minus1 指明在這個佇列中當前實際的、已存在的參考幀數目,這從它的名字“active”中也可以看出來。影象時,並不是直接傳送該影象的編號,而是傳送該影象在參考幀佇列中的序號。這個序號並不是在碼流中傳送的,這個句法元素是 H.264 中最重要的句法元素之一,編碼器要通知解碼器某個運動向量所指向的是哪個參考而是編碼器和解碼器同步地、用相同的方法將參考影象放入佇列,從而獲得一個序號。這個佇列在每解一個影象,甚至是每個片後都會動態地更新。維護參考幀佇列是編解碼器十分重要的工作,而本句法元素是維護參考幀佇列的重要依據。參考幀佇列的複雜的維護機制是 H.264 重要也是很有特色的組成部分  
  48:      num_ref_idx_l0_active_minus1   
  49:      num_ref_idx_l1_active_minus1  
  50:      // weighted_pred_flag  用以指明是否允許P和SP片的加權預測,如果允許,在片頭會出現用以計算加權預測的句法元素。 
  51:     weighted_pred_flag    
  52:      // weighted_bipred_flag   用以指明是否允許 B 片的加權預測,本句法元素等於 0 時表示使用預設加權預測模式,等於 1 時表示使用顯式加權預測模式,等於 2 時表示使用隱式加權預測模式。  
  53:      weighted_bipred_idc    
  54:      // pic_init_qp_minus26  加 26 後用以指明亮度分量的量化引數的初始值。在 H.264 中,量化引數分三個級別給出:影象引數集、片頭、巨集塊。在影象引數集給出的是一個初始值。 
  55:      pic_init_qp_minus26    /* relative to 26 */    
  56:      pic_init_qs_minus26    /* relative to 26 */   
  57:      // chroma_qp_index_offset   色度分量的量化引數是根據亮度分量的量化引數計算出來的,本句法元素用以指明計算時用到的引數。 
  58:      chroma_qp_index_offset    
  59:     // deblocking_filter_control_present_flag  編碼器可以通過句法元素顯式地控制去塊濾波的強度,本句法元素指明是在片頭是否會有句法元素傳遞這個控制資訊。如果本句法元素等於 0,那些用於傳遞濾波強度的句法元素不會出現,解碼器將獨立地計算出濾波強度。 
  60:      deblocking_filter_control_present_flag   
  61:      // constrained_intra_pred_flag  在 P 和 B 片中,幀內編碼的巨集塊的鄰近巨集塊可能是採用的幀間編碼。當本句法元素等於 1 時,表示幀內編碼的巨集塊不能用幀間編碼的巨集塊的畫素作為自己的預測,即幀內編碼的巨集塊只能用鄰近幀內編碼的巨集塊的畫素作為自己的預測;而本句法元素等於 0 時,表示不存在這種限制。 
  62:      constrained_intra_pred_flag   
  63:      // redundant_pic_cnt_present_flag 指明是否會出現 redundant_pic_cnt  句法元素。 
  64:      redundant_pic_cnt_present_flag   
  65:      rbsp_trailing_bits( )        
  66:  }