264雜

Nal_ref_idc:表示NAL的優先級.0~3,取值越大,表示當前NAL越重要,,需要優先受到保護,如果當前NAL是屬於參考幀的
片,或是序列參數集,或是圖像參數集這些重要的單位時,本句法元素必需大於0.
Nal_unit_type:當前NAL單元的類型


SODB:數據比特串 --> 最原始的編碼數據
RBSP:原始字節序列載荷 --> 在SODB的後面添加了結尾比特若干比特"0",以便字節對齊
EBSP:擴展字節序列載荷 --> 在RBSP基礎上添加了仿校驗字節(0x03)它的原因是:在NALU加到Annexb上時,需要添加
NALU之前的開始碼StartCodePrefix,如果該NALU對應的slice爲一幀的開始則用4位字節表示,0x00000001,否則用3位字節
表示0x000001,爲了使用NALU主體中不包括與開始碼相沖突的,在編碼時,每遇到兩個字節連續爲0,就插入一個字節的0x03,
解碼時將0x03去掉,也稱爲脫殼操作


NALU頭結構:0x 1(禁止位) 11(重要性指示位) 11111(NALU類型) 
NALU類型:1~12由h.264使用,24~31由h.264以外的應用使用.
重要性指示:標誌該NAL單元用於重建時的重要性,值越大,越重要.
禁止位:網絡發現NAL單元有比特錯誤時可設置該比特爲1,以便接收方丟掉該單元.


處理過程:
1.將VCL層輸出的SODB封裝成nal_unit,Nal_unit是一個通用封裝格式,可以適用於有序字節流方式和IP包交換方式.
2.針對不同的傳送網絡,將nal_unit封裝成針對不同網絡的封裝格式.


VCL層輸出的比特流SODB(string of data bits),到nal_unit之間,經過以下三步處理:
    1.SODB字節對齊處理後封裝成RBSP(Raw Byte Sequence Payload).
    2.爲防止RBSP的字節流與有序字節流傳送方式下的SCP(start_code_prefix_one,0x000001)出現
    競爭,循環檢測RBSP前三個字節,在出現字節競爭時在第三字節前加入emulation_prevention_three_byte(0x03),
    具體方法:(略)
NAL全稱Network AbstractLayer,即網絡抽象層.


在H.264/AVC視頻編碼標準中,整個系統框架被分爲了兩個層面,視頻編碼層面(VCL)和網絡抽象層面(NAL).
其中前者負責有效表示視頻數據的內容,而後者則負責格式化數據並提供頭信息,以保證數據適合各種信道和
存儲介質上的傳輸.




標識NAL單元中的RBSP數據類型,其中,nal_unit_type爲1, 2, 3, 4, 5及12的NAL單元稱爲VCL的NAL單元,其他類型的NAL單元爲非VCL的NAL單元。


0:未規定
1:非IDR圖像中不採用數據劃分的片段
2:非IDR圖像中A類數據劃分片段
3:非IDR圖像中B類數據劃分片段
4:非IDR圖像中C類數據劃分片段
5:IDR圖像的片段
6:補充增強信息 (SEI)
7:序列參數集
8:圖像參數集
9:分割符
10:序列結束符
11:流結束符
12:填充數據
13 – 23:保留
24 – 31:未規定


profile_idc/level_idc/constraint_set_flags
seq_parameter_set_rbsp(){
    profile_idc;//profile_level
    
    constraint_set0_flag;
    constraint_set1_flag;
    constraint_set2_flag;
    reserved_zero_5bits;
    
    level_idc;//指明所用的level
    
    seq_parameter_set_id;
    log2_max_frame_num_minus4;
    pic_order_cnt_type;
    
    if(pic_order_cnt_type == 0)
        log2_max_pic_order_cnt_lsb_minus4;
    else if(pic_order_cnt_type == 1){
        delta_pic_order_always_zero_flag    
        offset_for_non_ref_pic
        offset_for_top_to_bottom_field;
        num_ref_frames_in_pic_order_cnt_cycle;
        for(i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; i++)
        offset_for_ref_frame[i];
    }
    num_ref_frames;
    gaps_in_frame_num_value_allowed_flag;
    pic_width_in_mbs_minus1;
    pic_height_in_map_units_minus1;
    frame_mbs_only_flag;
    
    if(!frame_mbs_only_flag)
        mb_adaptive_frame_field_flag;
    
    direct_8x8_inference_flag;
    
    frame_cropping_flag;
    if(frame_cropping_flag){
        frame_crop_left_offset;
        frame_crop_right_offset;
        frame_crop_top_offset;
        frame_crop_bottom_offset;
    }
    vui_parameters_present_flag;
    if(vui_parameters_present_flag){
        vui_parameters()
        rbsp_trailing_bits()
    }
}


h.264標準中也有3種熵解碼方案:指數哥倫布解碼,CAVLC解碼和CABAC解碼.
在標準中通過描述子(Descriptor)的形式來說明一個語法元素熵解碼的方法.
Exp-Golomb的描述子有無符號指數哥倫布ue(v),有符號指數哥倫布se(v),截斷
指數哥倫布te(v)和映射指數哥倫布me(v).


0階指數哥倫布碼字是一種有規則結構的碼字,它的結構可以表示爲
[M zeros][1][INFO]
其中M zeros稱爲前綴,由M個零組成,而M位INFO稱爲信息後綴.碼字總長爲2M+1
編碼值索引code_num的值由以下方法得到:
    先讀入M位前綴0直至遇到1爲止,然後再讀入M位INFO後綴,則code_num可以
計算爲:
    code_num = 2^M + INFO -1;
則ue(v)從code_num到v的轉換公式爲v=code_num.




h264的句法和語義
    在編碼器輸出的碼流中,數據的基本單位是句法元素,每個句法元素由若干比特組成,
    它表示某個特定的物理意義,例如:宏塊類型,量化參數等.句法表徵句法元素的組織
    結構,語義闡述句法元素的具體含義.所有的視頻編碼標準都是通過定義句法和語義
    來規範編解碼器的工作流程.
    
    碼流是由一個個句法元素依次銜接組成的,碼流中除了句法元素並不存在專門用於控制或同步的內容.
    將該圖像的公共信息抽取出來,形成圖像一級的句法元素,而在片級只攜帶該片自身獨有的句法元素.
    h.264中,句法元素共被組織成序列,圖像,片,宏塊,子宏塊五個層次.
    
    
    
    
    
    
    
    
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章