BMS2.0變換編碼跟進

BMS2.0中,變換編碼採納了多核變換和二次變換。在JVET-K1002中提到,採納的多核變換隻使用DCT2,DCT8,DST7三種變換核,沒有給出具體的算法細節,現在來從代碼中大概看下變換部分的內容。

代碼和JEM變動不大,JEM代碼分析可見H.266代碼學習:transformNxN函數

和JEM一樣,變換編碼入口函數名稱保持爲transformNxN,變換尺寸JEM中就已經不是NxN了,換成transformMxN比較合適。上層函數也和JEM一致,幀內預測爲xIntraCodingTUBlock,幀間預測爲xEstimateInterResidualQT

實際變換入口函數依然是xT,多核變換和傳統HEVC DCT-2入口在在BMS1.0中還是分開的,在BMS2.0中都由xTrMxN_EMT實現,簡化代碼。

AMT

具體代碼部分簡略了很多,看起來比JEM舒服多了,基本維持JEM結構,沒什麼變化。主要變換是AMT的變換核:

//EMT transform sets
#if JVET_K1000_SIMPLIFIED_EMT
const int g_aiTrSubsetIntra[3][2] = { { DST7, DCT8 }, { DST7, DCT8 }, { DST7, DCT8 } };
#else
const int g_aiTrSubsetIntra[3][2] = { { DST7, DCT8 }, { DST7, DST1 }, { DST7, DCT5 } };
#endif

可以看到,BMS2.0將原本的三組變換集都換成了DST7和DCT8。這樣來說,只是砍掉了DCT5和DST1兩種變換核,實際對時間複雜度影響不大,還是得做4次率失真選最優。可能是DCT5和DST1在硬件實現上存在難度吧。

至於色度,BMS2.0中雖然加入了色度單獨劃分,色度還是隻用DCT2變換,AMT僅對亮度有效。

NSST

二次變換部分,JEM中是直接在transformNxN調用FwdNsst4x4FwdNsst8x8進行變換的,一些初始化、預判決等操作都直接在transformNxN中,看上去很混亂,詳見:H.266代碼學習:MDNSST相關代碼初步學習。從BMS1.0開始,對這一部分做了整理爲二次變換函數xFwdNsst,這也是transformNxN變整潔的一大原因。

由於本人研究方向不在此,具體實現部分這裏就不細究了,大致看了下,和BMS1.0沒有什麼變化,之後出了詳細算法介紹再來補吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章