轉載地址:http://blog.csdn.net/feixiang_john/article/details/7876227#comments
1.編碼器程序從"TAppEncoder"工程中的encmain.cpp文件開始的,此文件中包含程序運行的入口函數"main",在main函數中主要做了編碼器對象的創建、分析配置文件,初始化配置參數,和編碼器最重要的功能"encode"。
2.在"encode"函數中,主要實現了讀取YUV文件的數據、初始化工具對象例如:GOPEncoder、SliceEncoder、CUEncder……。在此函數裏,還包括一個encode函數,調用CompressGOP函數來具體執行編碼任務。
3.在CompressGOP函數中,完成了以下的功能:
一,InitGOP將文件的碼流分成若干GOP以便後續程序能夠順利執行。
二,InitEncSlice創建編碼的Slice。
三,在此函數中,還包括preCompressSlice和CompressSlice兩個函數,前者的作用是選擇不同的lamuda進行編碼(編碼是調用了CompressCU函數,後續介紹),後者是在最好的lamuda下進行編碼。
四,循環濾波, DB, ALF, SAO等
五,cabac。
下面重點跟蹤下幀內預測:
4.在xCompressCU函數中(CompressCU函數的主體也是調用xComprssCU函數),先進行幀間預測xCheckRDCostMerge2Nx2N,xCheckRDCostInter等。在做完幀間預測後進行幀內預測,這是調用的函數是xCheckRDCostIntra,在xCompressCU函數的後續部分,還遞歸調用自身以實現對每個CU的編碼。變換編碼在encodeCoeff中實現,量化在xCheckIntraPCM完成。
5.xCheckRDCostIntra函數,主要完成幀內預測的任務,對亮度的預測使用estIntraPredQT,對色度使用estIntraPredChromaQT。
6.estIntraPredQT函數,在思想對亮度的處理和色度的處理是一樣的,所以只介紹亮度的處理函數。在estIntraPredQT函數中,主要完成了RDCost的選擇,在其中predIntraLumaAng函數實現了方向的預測;calcHAD函數計算了SATD;xModeBitsIntra函數計算編碼的碼率;xUpdateCandList更新了最好的RDCost所使用的模式。
overview