HEVC解碼中VPS參數集解析

視頻參數集”結構用於解釋編碼過的視頻序列的整體結構,包括時域子層依賴關係等。HEVC中加入該結構的主要目的是兼容標準在系統的多子層方面的擴展,處理比如未來的可分級或者多視點視頻使用原先的解碼器進行解碼但是其所需的信息可能會被解碼器忽略的問題。

對於給定視頻序列的某一個子層,無論其SPS相不相同都共享一個VPS。其主要包含的信息有:1、多個子層或操作點共享的語法元素;2、檔次和級別等會話關鍵信息;3、其他不屬於SPS的操作點特定信息。

博文NAL解碼(一)中列出了碼流的二進制結構。在我們自己編碼生成的碼流中,第一個NAL單元攜帶的就是VPS信息。如何得知?通過解析nal單元頭可以提取nal類型字段。解析這個VPS nal單元的具體流程爲:

(1)在完成配置參數的解析之後,TAppDecTop::decode()這個函數正式進行解碼過程。在編碼碼流未到結束的情況下,byteStreamNALUnit(bytestream, nalUnit, stats);這個函數不斷在碼流中讀取NAL數據。該函數的功能上一篇博文曾經提到過,主要功能是給_byteStreamNALUnit(bs, nalUnit, stats)這個函數戴一層TT(O(∩_∩)O哈哈~),外加返回一個元素的個數值。

(2)_byteStreamNALUnit(bs, nalUnit, stats)這個函數中,尋找碼流中的NAL起始位0x00000001,並將下一個nal起始位前面的字節檢出放入nalUnit這個單元中。

(3)read(nalu, nalUnit)處理nalUnit的數據,保留其中的有效數據,捨棄掉其中的填充部分,主要通過convertPayloadToRBSP函數實現。readNalUnitHeader (InputNALUnit& nalu)函數解析nal的數據頭,在該函數中可以很明白地看到從碼流中取出了nal的0位、nal類型、6位0保留字和時間id。該碼流中的nal頭的二進制碼爲0x4001,二進制結構爲0100 0000 0000 0001,與上篇博文中的NAL頭數據結構對比可知,其nal type = 32,temporal id = 0;

(4)bNewPicture = m_cTDecTop.decode(nalu, m_iSkipFrame, m_iPOCLastDisplay)解析NAL的數據。該函數的主題是一個switch-case語句,通過判斷不同的nal類型進行不同的解碼操作。上一步中nal type = 32 = NAL_UNIT_VPS,因此調用xDecodeVPS()解析該NAL。

流程:xDecodeVPS()--->m_cEntropyDecoder.decodeVPS( vps )--->m_pcEntropyDecoderIf->parseVPS(pcVPS)

parseVPS(pcVPS)主要使用三個宏從碼流中讀取數據:READ_CODE()讀取指定長度的比特位,READ_FLAG()當前位置下一位標識位,READ_UVLC()按照變長碼方式從碼流中讀取數據。函數所讀取的字段可以參考標準文檔的說明(提案JCT-VC L1003)第43頁。

部分參數的解釋以及本例中的取值,【本例取值】:
vps_video_parameter_set_id:其他語法元素所參考的VPS編號,【0】;
vps_reserved_three_2bits:保留位,指定爲3,【3】;
vps_max_layers_minus1:當前版本保留,值爲0,用於未來的3D和可分級擴展標準使用,【0】;
vps_max_sub_layers_minus1:這個值表示比特流中可以支持最大數目的時域子層數目減1,取值範圍爲0到6,也就是最大可以支持7個子層,【0】;
vps_temporal_id_nesting_flag:當前一個參數vps_max_sub_layers_minus1爲0(即不支持時域子層)時,這個參數應該爲1;vps_max_sub_layers_minus1非0時,指定是否對編碼視頻序列的幀間預測添加限制。用於子層切換過程中,【1】。
vps_reserved_0xffff_16bits:兩個字節的保留位,全部爲1,【255,255】;
vps_sub_layer_ordering_info_present_flag:爲1,vps_max_dec_pic_buffering_minus1[ i ], vps_max_num_reorder_pics[ i ]和 vps_max_latency_increase_plus1[ i ]適用於vps_max_sub_layers_minus1 + 1個子層;爲0,這些參數適用於所有子層,【1】;
vps_max_dec_pic_buffering_minus1:指定所需的最大解碼圖像緩存的數量,【0】;
vps_max_num_reorder_pics和vps_max_latency_increase_plus1:指定按照解碼順序在某一幀之後,而顯示順序在某一幀之前的幀的最大數量;這兩個參數的區別暫時還沒看明白,【0,0】;
vps_max_layer_id:CVS中所有NAL單元的最大允許的nuh_layer_id值。
vps_num_layer_sets_minus1:由VPS指定的圖層組的數量-1;當前標準中指定爲0;
layer_id_included_flag[][]:表示nuh_layer_id與layerSetLayerIdList[]的包含關係;
vps_timing_info_present_flag:標識該VPS是否包含幾個時間相關參數,【0】;
vps_extension_flag:標識該VPS是否包含擴展信息,【0】。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章