H.266/VVC幀內預測框架
本人是西電研一的一名普通學生,現在在通院信科所多媒體通訊實驗室,主要研究方向是視訊編碼標準H.266/VVC。
如很多剛上研同學一樣,入學以來經歷了迷茫、對科研方向無從下手等問題。兩個月來,在理清視訊編碼結構後,終於漸漸理解並敢於修改VVC的程式碼。準備在部落格這個平臺上記錄自己的學習過程,希望可以與更多更優秀的人交流討論。
第一次寫微博,準備多說些。我是在大三最開始瞭解的視訊編碼,當時的計網老師也就是我現在的課題組組長介紹了多媒體通訊這個研究方向。當時初步瞭解了一下感覺是我的興趣所在,便聯絡了我現在的導師。考研過後,畢設讓我開始了我的第一個視訊編碼的科研方向:環路濾波。大概兩個月的時間,這也許讓我適應了一陣子實驗室生活,從小白變成了菜鳥。畢業暑假返校後,CCLM的提出使得幀內改進空間更大,我也開始把研究方向轉向幀內,從初步理解的ALF轉向色度DM模式。在師兄的幫助下從DM往上層看到色度幀內預測,進一步到亮度幀內預測。現在已對VTM3.0中幀內預測框架的程式碼有了大體認識,總結如下。
1 xCheckRDCostIntra
這個函式是進入幀內預測的通道:
首先獲取最佳幀間代價和EMT相關資訊getUseIntraEMT,初始化快取並使CU加入並進行賦值。
如果是亮度通道,則進行亮度預測estIntraPredLumaQT(2.1),進行一些處理。如果是色度通道或不是色度獨立劃分,且色彩格式不是4:0:0,則進行色度預測estIntraPredChromaQT(2.2)。
最後處理變換標誌位rootCbf,編碼CU引數並更新CU上下文,計算RDO。更新EMT相關資訊。
2.1 estIntraPredLumaQT
亮度預測過程如下:
做初始化準備,設定EMT標誌。(尚未理解EMT)
0:EMT不適用於當前CU;
1:EMT快速演算法可以應用於當前CU,後面則直接拷貝進uiRdModeList和extendRefList。
2:EMT檢查是否應用當前CU,跳過了下面候選列表計算,設定skip的閾值,載入重定尺寸的uiRdModeList,CandCostList,extendRefList。
確定要測試的模式集。亮度模式可用數量67,確定要計算RDO的數量。
如果EMT為0或1,初始化亮度預測模式initIntraPatternChType(相鄰參考畫素的獲取+參考畫素的濾波),首先初始化原始快取、預測快取、以及一系列引數。
1.遍歷67種亮度模式,對每一種序號大於2且是偶數的模式進行以下操作:令亮度預測方向是這個模式。如果可用DPCM進行第一次通過幀內估計,則直接呼叫encPredIntraDPCM傳輸一個cu的預測值;不可用DPCM則呼叫predIntraAng使用角度預測求解預測值。隨後使用哈達瑪變換得到殘差平方和(SATD)的值,隨後比較SATD更新候選列表updateCandList
2.遍歷N個種子模式,更新種子模式:若種子模式在3到65中間,按序遍歷種子及其相鄰的角度,用DPCM或角度預測後變換求SATD過程同上,更新這N個值的列表。
3.進行MPM的操作:呼叫PU::getIntraMPMs獲取存有6個值的MPM列表(多參考行中,對選中的行MPM列表的每一個進行DPCM或角度預測後變換求RDO獲取最佳參考行)。前M個MPMs被增加到前面N種模式中,得到幀內亮度預測最終列表(M+N個候選)。
如果運用的快速PB,重定尺寸並重置上下文。至此模式列表選擇全部結束。
遍歷擴充套件列表extendRefLis的每一項,設定上下文模型,對篩選出的幀內預測模式進行一系列完整的操作xRecurIntraCodingLumaQT,通過RDO比較更新以選取最優亮度模式。
2.2 estIntraPredChromaQT
色度預測過程如下:
從第一個PU開始,初始化失真及代價。建立一個臨時的編碼結構,給TU建立一個儲存。
1.建立modelist列表:初始化色度模式列表modelist如下圖所示,其中橫行的亮度指的是色度塊對應亮度塊中間塊的預測方向,豎行的色度列表存有對應預設值,當預設值與DM衝突時用66這個方向代替。每個豎著的一排都是對應其亮度方向的一個modelist列表
2.進行3種LM的一系列操作:最後存上RDO。(尚未細看)
3.遍歷四種傳統模式和DM共5種:恢復上下文模型,將列表中的這個值賦值給色度預測方向,進行色度分量的編碼工作xRecurIntraChromaCodingQT,返回失真。通過獲得位元數及返回的失真得到RDO,用臨時編碼結構儲存。比較更新這五種情況的最佳RDO,儲存最優模式的資料,找到最佳模式和最小RDO。
4.迴圈Cb與Cr:從臨時編碼結構賦值給當前編碼結構。最終確定最佳模式和失真。
3 編解碼
vtm3.0色度相關CABAC編碼如下,解碼即逆過程。
以上是近期學習的一些總結,最底層部分除了DM外也沒太看。聽說實驗室最近有要向視訊編碼的其他部分側重的傾向,而我可能是對幀內瞭解最少的一個人,所以我的幀內之行可能就告一段落了,當然都說不準。黃色底紋部分是我認為我應該繼續深入看的幾個函式,在這裡先開個坑以後慢慢填。剛上手難免會有些錯誤,希望能多與前輩們多多交流。