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
調用FwdNsst4x4
和FwdNsst8x8
進行變換的,一些初始化、預判決等操作都直接在transformNxN
中,看上去很混亂,詳見:H.266代碼學習:MDNSST相關代碼初步學習。從BMS1.0開始,對這一部分做了整理爲二次變換函數xFwdNsst
,這也是transformNxN
變整潔的一大原因。
由於本人研究方向不在此,具體實現部分這裏就不細究了,大致看了下,和BMS1.0沒有什麼變化,之後出了詳細算法介紹再來補吧。