HM學(xué)習(xí)筆記_來自博客_第1頁
HM學(xué)習(xí)筆記_來自博客_第2頁
HM學(xué)習(xí)筆記_來自博客_第3頁
HM學(xué)習(xí)筆記_來自博客_第4頁
HM學(xué)習(xí)筆記_來自博客_第5頁
已閱讀5頁,還剩10頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、HM學(xué)習(xí)筆記_來自博客HEVC學(xué)習(xí)(二) HM的整體結(jié)構(gòu)及一些基本概念7個工程1. TAppCommon2. TAppDecoder3. TAppEncoder4. TlibCommon5. TLibDecoder6. TLibEncoder7. TLibVideoIOT代表Test(這一個的理解可能有誤),App代表Application,表明該工程主要包含一些應(yīng)用函數(shù)Lib代表Library,表明該工程主要包含一些庫函數(shù)。Common表明該工程包含的一些函數(shù)是編碼器和解碼器共用的,Decoder表明該工程包含的函數(shù)是解碼器使用的,而Encoder表明該工程包含的函數(shù)是編碼器使用的。Vide

2、oIO工程主要是實現(xiàn)對YUV文件的讀寫操作。編碼器和解碼器的主函數(shù)分別在encmain.cpp和decmain.cpp中,相信光看源文件名都能看出來了。(1)類的命名:(2)變量的命名:(3)函數(shù)的命名:HEVC學(xué)習(xí)(三)幀內(nèi)預(yù)測系列之一fillReferenceSamples函數(shù)(填補當(dāng)前PU周圍相關(guān)的樣本值)Void TComPattern:fillReferenceSamples圖像2(左上角為4個像素點,如無強調(diào)則以塊為單位計算長度等?)PS:此處有兩塊圖像:重建的YUV的大圖像1、相對應(yīng)的專用于預(yù)測的PU及其周邊的參考樣點圖像2Pel* piRoiTemp指向重建Yuv圖像1 的位置

3、(臨時使用,指向可隨意變動)Pel* piRoiOrigin指向重建Yuv圖像1對應(yīng)于當(dāng)前PU所在位置的首地址(對當(dāng)前PU固定)Int* piAdiTemp圖像2 的感興趣位置(變動的,用于賦值)iPicStride 重建YUV圖像1的寬iNumIntraNeighbor指示PU周邊可用鄰塊數(shù)uiWidth= uiCuWidth*2+1圖像2的寬,uiHeight= uiCuHeight*2+1圖像2的高uiCuWidth 圖像2的CurrentPU部分的寬,uiCuHeight圖像2的CurrentPU部分的高iTotalSamples總樣點數(shù)iTotalUnits以4x4塊為單位的塊數(shù)iU

4、nitSize塊的大小主要功能是在真正進(jìn)行幀內(nèi)預(yù)測之前,使用重建后的Yuv圖像對當(dāng)前PU(Predict Unit預(yù)測單元)的相鄰樣點進(jìn)行賦值,為接下來進(jìn)行的角度預(yù)測提供參考樣點值。PS:關(guān)于一個PU的相鄰點,以及它的相鄰點的可用性如何判斷的問題,是一個細(xì)節(jié)問題,并不會影響我們對這個函數(shù)實現(xiàn)功能的理解。PS:reference samples are partially available 部分沒看,也看不懂每個4x4塊里的4個樣點分別被賦值為對應(yīng)位置的重建Yuv的樣點值?(4*4塊中不是16個樣點嗎)HEVC學(xué)習(xí)(四)幀內(nèi)預(yù)測系列之二CU、PU地址計算方法光柵掃描,即從左往右,由上往下,先掃

5、描完一行,再移至下一行起始位置繼續(xù)掃描。H.264使用的主要就是光柵掃描順序。HEVC里同樣也有光柵掃描順序,但是,由于它對CU采用的是遞歸劃分的方式,如果仍是采用光柵掃描順序,對CU的尋址會很不方便。HEVC定義了Z掃描順序Z掃描是針對一個CU來說的,它是用于遞歸掃描CU的分割。定位一幅圖像中的一個CU(或其分割)大致是這么個過程,首先,由于CU的尺寸的最大值是已知的,會根據(jù)這個定位到該CU左上角相對于圖像左上角的位置,即得到它的坐標(biāo),接著,才是對當(dāng)前塊進(jìn)行Z掃描,單位是4x4塊,換句話說,Z掃描地址是對一個CU有效的,不能直接使用這個地址來確定它在圖像中的位置。HEVC學(xué)習(xí)(五)幀內(nèi)預(yù)測系

6、列之三initAdiPattern函數(shù)(預(yù)測的前期準(zhǔn)備,得到PU的過程)Void TComPattern:initAdiPattern獲得iNumIntraNeighbor、bNeighborFlags等將參數(shù)傳入(一)中的fillReferenceSamples 函數(shù)賦值對周圍樣點進(jìn)行3抽頭的平滑濾波主要功能有三個(1)檢測當(dāng)前PU的相鄰樣點包括左上、上、右上、左、左下鄰域樣點值的可用性,或者說檢查這些點是否存在;(2)參考樣點的替換過程;(二)中已介紹過(3)相鄰樣點即參考樣點的平滑濾波。Bool bNeighborFlags4 * MAX_NUM_SPU_W + 1指示4個方向上相鄰樣點

7、值的可用性piAdiBuf= piAdiTempiNumUnitsInCu = uiCuWidth / iUnitSize; CurrentPU寬(以塊為單位,暫時理解4*4塊寬4)iTotalUnits = (iNumUnitsInCu Int iBufSize=uiCuHeight2 + uiCuWidth2 + 1;濾波緩存區(qū)的大小,相鄰塊的個數(shù)UInt uiWH= uiWidth * uiHeight一個緩存區(qū)中的元素個數(shù),圖像2中塊的總總個數(shù)piAdiBuf指向濾波前的參考樣點的首地址piFilterBuf將piAdiBuf所有參考樣點拷貝到此區(qū)域經(jīng)過濾波后所得值保存在piFilte

8、rBufN中存放濾波后樣點值的區(qū)域piFilterBuf1 經(jīng)過濾波的樣點值(與piAdiBuf相差uiWH,因為濾波前后的值順序存放)存放順序:piAdiBuf大小uiWHpiFilterBuf1uiWHpiFilteredBuf2uiWHpiFilterBufiBufSize(周邊樣本塊數(shù),只有這些才參與濾波)piFilterBufNPS:piAdiBuf、piFilterBuf1 按照圖像順序存放,piFilterBuf、piFilterBufN將周邊樣點順序存放,方便濾波Q:獲取當(dāng)前PU左上角LT,右上角RT以及左下角LB 以4x4塊為單位的Zorder ?不懂HEVC參考軟件代碼總結(jié)

9、1.編碼器程序從TAppEncoder工程中的encmain.cpp文件開始的,此文件中包含程序運行的入口函數(shù)main,在main函數(shù)中主要做了編碼器對象的創(chuàng)建、分析配置文件,初始化配置參數(shù),和編碼器最重要的功能encode。2.在encode函數(shù)中,主要實現(xiàn)了讀取YUV文件的數(shù)據(jù)、初始化工具對象例如:GOPEncoder、SliceEncoder、CUEncder。在此函數(shù)里,還包括一個encode函數(shù),調(diào)用CompressGOP 函數(shù)來具體執(zhí)行編碼任務(wù)。3.在CompressGOP函數(shù)中,完成了以下的功能:一,InitGOP將文件的碼流分成若干GOP以便后續(xù)程序能夠順利執(zhí)行。二,InitE

10、ncSlice創(chuàng)建編碼的Slice。三,在此函數(shù)中,還包括preCompressSlice和CompressSlice兩個函數(shù),前者的作用是選擇不同的lamuda進(jìn)行編碼(編碼是調(diào)用了CompressCU函數(shù),后續(xù)介紹),后者是在最好的lamuda下進(jìn)行編碼。四,循環(huán)濾波五,(熵編碼等,還沒看)。4.在xCompressCU函數(shù)中(CompressCU函數(shù)的主體也是調(diào)用xComprssCU函數(shù)),先進(jìn)行幀間預(yù)測xCheckRDCostMerge2Nx2N,xCheckRDCostInter等。在做完幀間預(yù)測后進(jìn)行陣內(nèi)預(yù)測,這是調(diào)用的函數(shù)是xCheckRDCostIntra,在xCompress

11、CU函數(shù)的后續(xù)部分,還遞歸調(diào)用自身以實現(xiàn)對每個CU的編碼。變換編碼在encodeCoeff中實現(xiàn),量化在xCheckIntraPCM完成。5.xCheckRDCostIntra函數(shù),主要完成幀內(nèi)預(yù)測的任務(wù),對亮度的預(yù)測使用estIntraPredQT,對色度使用estIntraPredChromaQT。6.estIntraPredQT函數(shù),在思想對亮度的處理和色度的處理是一樣的,所以只介紹亮度的處理函數(shù)。在estIntraPredQT函數(shù)中,主要完成了RDCost的選擇,在其中predIntraLumaAng 函數(shù)實現(xiàn)了方向的預(yù)測;calcHAD函數(shù)計算了SATD;xModeBitsIntra

12、函數(shù)計算編碼的碼率;xUpdateCandList更新了最好的RDCost所使用的模式。HEVC學(xué)習(xí)(六)幀內(nèi)預(yù)測系列之四實現(xiàn)亮度分量幀內(nèi)預(yù)測的主函數(shù)的大體框架estIntraPredQT函數(shù)(實現(xiàn)亮度分量幀內(nèi)預(yù)測)HEVC學(xué)習(xí)(七)幀內(nèi)預(yù)測系列之五predIntraLumaAng函數(shù)Void TComPrediction:predIntraLumaAng 幀內(nèi)預(yù)測的最為重要的函數(shù)之一predIntraLumaAng1.getPreditorPtr函數(shù)Int* TComPattern:getPredictorPtrInt *ptrSrc獲得指向參考樣點首地址的指針數(shù)組m_aucIntraFil

13、ter里面存放了不同PU尺寸下濾波的閾值getAdiOrgBuf函數(shù)返回指向未經(jīng)濾波的參考樣點的首地址sw = 2 * iWidth + 1?(ptrSrc指向的是當(dāng)前PU的左上鄰點,故加上2*iWidth指向下一行即當(dāng)前PU的左鄰點,加1指向當(dāng)前PU的首地址)PS:若幀內(nèi)預(yù)測模式滿足濾波的條件,則返回的指針要加上uiWH(詳見(五)2.根據(jù)幀內(nèi)預(yù)測模式調(diào)用以下函數(shù)xPredIntraPlanar函數(shù)進(jìn)行Intra_Planar模式預(yù)測xPredIntraAng函數(shù)進(jìn)行Intra_DC、Intra_Angular(有角度的)模式預(yù)測3.xDCPredFiltering函數(shù)Void TComPr

14、ediction:xDCPredFilteringxDCPredFiltering( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight)sw = 2 * iWidth + 1?xDCPredFiltering( Int* pSrc, Int iSrcStride, Pel*& rpDst, Int iDstStride, Int iWidth, Int iHeight )對Intra_DC模式的邊界進(jìn)行平滑濾波處理。Int iSrcStride預(yù)測模塊的Int* pSrc=ptrSrc+sw+1ptrSrc指向當(dāng)前PU的左上鄰點,指向當(dāng)前PU的首

15、地址,Q?:第一行的點,利用對應(yīng)上鄰點與其加權(quán)平均(不是與dcValue嗎?)HEVC/H.265參考代碼跟蹤跟蹤幀內(nèi)預(yù)測:4.在xCompressCU函數(shù)中(CompressCU函數(shù)的主體也是調(diào)用xComprssCU函數(shù)),先進(jìn)行幀間預(yù)測xCheckRDCostMerge2Nx2N,xCheckRDCostInter等。在做完幀間預(yù)測后進(jìn)行幀內(nèi)預(yù)測,這是調(diào)用的函數(shù)是xCheckRDCostIntra,在xCompressCU函數(shù)的后續(xù)部分,還遞歸調(diào)用自身以實現(xiàn)對每個CU的編碼。變換編碼在encodeCoeff中實現(xiàn),量化在xCheckIntraPCM完成。5.xCheckRDCostIntr

16、a函數(shù),主要完成幀內(nèi)預(yù)測的任務(wù),對亮度的預(yù)測使用estIntraPredQT,對色度使用estIntraPredChromaQT。6.estIntraPredQT函數(shù),在思想對亮度的處理和色度的處理是一樣的,所以只介紹亮度的處理函數(shù)。在estIntraPredQT函數(shù)中,主要完成了RDCost的選擇,在其中predIntraLumaAng 函數(shù)實現(xiàn)了方向的預(yù)測;calcHAD函數(shù)計算了SATD;xModeBitsIntra函數(shù)計算編碼的碼率;xUpdateCandList更新了最好的RDCost所使用的模式。HEVC學(xué)習(xí)(八)以SAO為例淺析跟蹤代碼方法尋找到SAO真正實現(xiàn)功能的代碼處HEVC

17、學(xué)習(xí)(九)幀內(nèi)預(yù)測系列之六xPredIntraPlanar函數(shù)Void TComPrediction:xPredIntraPlanar進(jìn)行Intra_Planar模式預(yù)測(對于代碼中的某些公式并未深究)UInt blkSize = offset2D=width圖像2中CurrentPU的寬度srcStride圖像2的寬topRowk= = pSrck-srcStride存放上邊界那一行的數(shù)組leftColumnk= pSrck*srcStride-1存放左邊界那一列的數(shù)組1位置的值等于其上面的點的值Q?: UInt shift1D = g_aucConvertToBit width + 2是什

18、么鬼?Q?:horPred = leftColumnk + offset2D;?為什么要加offset2D?Q?:topRowk HEVC學(xué)習(xí)(十一)幀內(nèi)預(yù)測系列之七xPredIntraAng函數(shù)Void TComPrediction:xPredIntraAng進(jìn)行Intra_DC、Intra_Angular(有角度的)模式預(yù)測Int blkSize = width; /!Pel* pDst = rpDst; /!Bool modeDC = dirMode Bool modeHor= !modeDC & (dirMode Int intraPredAngle角度偏移值PS:未看完幀內(nèi)預(yù)測過程:

19、1.判斷當(dāng)前TU相鄰參考像素的可用性,并進(jìn)行相應(yīng)的處理2.對參考像素進(jìn)行三抽頭濾波3.根據(jù)濾波后的參考像素計算當(dāng)前TU的預(yù)測像素值HEVC學(xué)習(xí)(十)與變換有關(guān)的幾個主要函數(shù)及重要變量在xCompressCU函數(shù)中,有這么幾個函數(shù)值得我們注意的,xCheckRDCostInter、xCheckRDCostMerge2Nx2N、xCheckRDCostIntra。它們分別是實現(xiàn)幀間預(yù)測模式、Merge模式、幀內(nèi)預(yù)測式的主函數(shù)。前兩個函數(shù)的子函數(shù)xEstimateResidualQT(實際上通過調(diào)用函數(shù)encodeResAndCalcRdInterCU)、第三個函數(shù)的子函數(shù)xRecurIntraCo

20、dingQT(實際上通過調(diào)用xIntraCodingLumaBlk、xIntraCodingChromaBlk)均會調(diào)用函數(shù)transformNxN。函數(shù)transformNxN這個函數(shù)主要調(diào)用了xTransformSkip、xT、xQuant三個函數(shù),分別實現(xiàn)對殘差進(jìn)行TS(Transform Skip)模式、普通變換模式以及量化的功能。對于第二個函數(shù)xT來說,它調(diào)用了xTrNxN。xTrNxN函數(shù)對幀內(nèi)預(yù)測模式的4x4塊進(jìn)行DST變換,其余的根據(jù)塊大小分別做蝶形快速變換(4x4,8x8,16x16,32x32)HEVC學(xué)習(xí)(十二) CU的最終劃分CU是遞歸劃分的,導(dǎo)致在尋找確定最佳分割位置

21、時比較困難。參考encodeCU這個函數(shù)的實現(xiàn),因為它是最終將信息編碼成碼流的函數(shù)。該函數(shù)調(diào)用的是xEncodeCU來完成實際工作,其中調(diào)用了Void TEncEntropy:encodeSplitFlag函數(shù)(用于編碼CU分割信息的函數(shù))其中又調(diào)用了codeSplitFlag( pcCU, uiAbsPartIdx, uiDepth )函數(shù)其中有代碼UInt uiCurrSplitFlag = ( pcCU-getDepth( uiAbsPartIdx ) uiDepth ) ? 1 : 0;通過判斷pcCU-getDepth( uiAbsPartIdx )是否大于uiDepth來確定當(dāng)前C

22、U是否還要繼續(xù)分割,后者我們知道,是當(dāng)前CU的深度,那么前者呢?自然就是在xCompressCU中確定下來的當(dāng)前CU的最佳分割模式。對compressCU的參數(shù)pcCU進(jìn)行類似語句: pcCU-getDepth( uiAbsPartIdx ),即可獲得Z order 為uiAbsPartIdx的4x4塊的深度,如果把整個CU每個4x4塊的深度確定下來,那么它的劃分自然也就確定下來了。HEVC中SAO-自適應(yīng)樣點補償詳細(xì)分析解讀SAO原理:SAO是在DB之后進(jìn)行, 輸入是重建幀和原始幀數(shù)據(jù), 輸出是SAO數(shù)據(jù)和SAO后的重建幀. 自適應(yīng)樣點補償是一個自適應(yīng)選擇過程,在去塊濾波后進(jìn)行。下面是整個H

23、EVC的編碼框圖, 可以看到SAO是在整個幀編碼完成后得到重建幀后進(jìn)行的,屬于Slice級別(幀級).首先把Frame劃分為若干LCU, 然后對每個LCU中每個像素進(jìn)行SAO操作.將根據(jù)其LCU像素特征選擇一種像素補償方式,以減少源圖像與重構(gòu)圖像之間的失真。自適應(yīng)樣點補償方式分為帶狀補償(Band Offset,BO)和邊緣補償(Edge Offset,EO)兩大類。帶狀補償將像素值強度等級劃分為若干個條帶,每個條帶內(nèi)的像素?fù)碛邢嗤难a償值。進(jìn)行補償時根據(jù)重構(gòu)像素點所處的條帶,選擇相應(yīng)的帶狀補償值進(jìn)行補償。邊緣補償主要用于對圖像的輪廓進(jìn)行補償。它將當(dāng)前像素點值與相鄰的2個像素值進(jìn)行對比,用于比較的2個相鄰像素可以在下圖中所示的4種模板中選擇,從而得到該像素點的類型。解碼端根據(jù)碼流中標(biāo)示的像素點的類型信息進(jìn)行相應(yīng)的補償校正。SAO-自適應(yīng)樣點補償意義何在:SAO意義:大量模擬測試和資料顯示, SAO平均可以節(jié)約2%到6%的碼率, 而編解碼的復(fù)雜度只增加2%左右!SAO主要目的和操作原理減少源圖像

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論