HM 15.0 1 -概要

這一章其實本來不應(yīng)該這么寫,但是我們大概有個概要,對于學(xué)習(xí)是很快的,但是真的在閱讀代碼的時候,是不能這么看的;不過也不要緊,學(xué)習(xí)嘛
看一下HM編碼器,里面的頭文件和C++文件的作用:

文件的功能以及作用:
AccessUnit.h 定義了存取單元(或者說訪問單元),實質(zhì)是一個類型為NALUnitEBSP的list
NAL.h 定義了NALUnit(NAL單元)和NALUnitEBSP(EBSP類型的NAL單元)
AnnexBwrite.h 實現(xiàn)了把存取單元寫入外部數(shù)據(jù)隊列的功能
CommonDef.h 定義各種宏
ContextModel.h/ContextModel.cpp 定義了熵編碼需要的上下文模型
ContextModel3DBuffer.h/ContextModel3DBuffer.cpp 定義了熵編碼上下文模型需要的3維緩存區(qū)
ContextTables.h 定義各種上下文所需的表格,例如二進(jìn)制化、熵編碼等等
encmain.cpp 編碼器的主函數(shù)
libmd5.h/libmd5.cpp/MD5.h md5的實現(xiàn)
NALwrite.h/NALwrite.cpp 定義了輸出的NAL單元(OutputNALUnit)、實現(xiàn)把NAL單元寫到外部輸出流中(std::ostream)
program_options_lite.h/program_options_lite.cpp 編碼器的選項配置
SEI.h/SEI.cpp 圖像增強信息方面
SEIwrite.h/SEIwrite.cpp 寫SEI信息到比特流中
SyntaxElementWriter.h/SyntaxElementWriter.cpp 語法元素寫入器
TAppEncCfg.h/TAppEncCfg.cpp 編碼器應(yīng)用程序配置類
TAppEncTop.h/TAppEncTop.cpp 繼承自TAppEncCfg,編碼器應(yīng)用程序頂層類(或者說編碼器的主類)
TComBitCounter.h/TComBitCounter.cpp 比特計數(shù)器
TComBitStream.h/TComBitStream.cpp 比特流
TComCABACTables.h/TComCABACTables.cpp定義了CABAC所需要的各種表格
TComDataCU.h/TComDataCU.cpp CU(編碼單元的定義)
TComInterpolationFilter.h/TComInterpolationFilter.cpp 插值過濾器
TComList.h 公用的列表的定義,繼承自std的list
TComLoopFilter.h/TComLoopFilter.cpp 環(huán)路濾波器的實現(xiàn)
TComMotionInfo.h/TComMotionInfo.cpp 運動信息的實現(xiàn)
TComMv.h mv(運動向量)的定義
TComPattern.h/TComPattern.cpp 公共的模式類,定義了YUV三個顏色分量的方位方法和相鄰像素的訪問方法
TcomPic.h/TcomPic.cpp 是圖片類,它包含TComPicSym(圖像符號類)和TComPicYuv(yuv數(shù)據(jù)類:包括原始數(shù)據(jù),預(yù)測數(shù)據(jù)、慘差數(shù)據(jù))
TComPicSym.h/TComPicSym.cpp 定義了圖像符號類,定義了從圖像到片和cu的訪問方式
TComPicYuv.h/TComPicYuv.cpp 圖像的yuv數(shù)據(jù)類:包括原始數(shù)據(jù),預(yù)測數(shù)據(jù)、殘差數(shù)據(jù)
TComPicYuvMD5.cpp 圖像的yuv的md5的實現(xiàn)
TComPrediction.h/TComPrediction.cpp 預(yù)測的實現(xiàn)(幀內(nèi)預(yù)測/幀間預(yù)測)
TComRdCost.h/TComRdCost.cpp率失真代價
TComRdCostWeightPrediction.h/TComRdCostWeightPrediction.cpp 帶率失真權(quán)重的預(yù)測
TComRom.h/TComRom.cpp 全局的變量和函數(shù)
TComSampleAdaptiveOffset.h/TComSampleAdaptiveOffset.cpp SAO的定義和實現(xiàn)
TComSlice.h/TComSlice.cpp 片的定義和實現(xiàn)
TComTrQuant.h/TComTrQuant.cpp變換和量化的實
TComWeightPrediction.h/TComWeightPrediction.cpp帶權(quán)重的預(yù)測
TComYuv.h/TComYuv.cpp  TComPicYuv和TComYuv的區(qū)別,TComYuv可以看作是一個方便操作YUV的類,主要用于預(yù)測階段,從TComPicYuv產(chǎn)生而來,TComYuv的作用沒有TComPicYuv那么大
TEncAnalyze.h/TEncAnalyze.cpp 編碼器分析類(性能分析類)
TEncBinCoder.h 二進(jìn)制編碼器的定義(定義了二進(jìn)制化和熵編碼的一些類)
TEncBinCoderCABAC.h/TEncBinCoderCABAC.cpp CABAC二進(jìn)制編碼器
TEncBinCoderCABACCounter.h/TEncBinCoderCABACCounter.cpp CABAC比特計數(shù)器
TEncCavlc.h/TEncCavlc.cpp CAVLC熵編碼器
TEncCfg.h 編碼器的基礎(chǔ)配置類
TEncCu.h/TEncCu.cpp CU編碼器
TEncEntropy.h/TEncEntropy.cpp 熵編碼器
TEncGOP.h/TEncGOP.cpp 圖像組編碼器
TEncPic.h/TEncPic.cpp 圖像編碼器
TEncPreanalyzer.h/TEncPreanalyzer.cpp 預(yù)測分析器編碼器
TEncRateCtrl.h/TEncRateCtrl.cpp 速率控制器(幀速率、比特速率等等)
TEncSampleAdaptiveOffset.h/TEncSampleAdaptiveOffset.cpp SAO編碼器
TEncSbac.h/TEncSbac.cpp SBAC編碼器(SBAC是CABAC的改進(jìn),是并行的CABAC算法)
TEncSearch.h/TEncSearch.cpp 運動搜索的實現(xiàn)
TEncSlice.h/TEncSlice.cpp 片編碼器
TEncTop.h/TEncTop.cpp 公共的編碼器類(與編碼器應(yīng)用類不一樣,編碼器應(yīng)用類是一個包裝的接口類)
TvideoIOYuv.h/TvideoIOYuv.cpp YUV的I/O類,是用來讀取yuv文件的類,讀取出來之后把數(shù)據(jù)放到TComPicYuv中 
TypeDef.h 基礎(chǔ)類型的定義
WeightPredAnalysis.h/WeightPredAnalysis.cpp 帶權(quán)預(yù)測分析
TCom和TEnc的區(qū)別在于,TEnc一般是管理器或者編碼器,而TCom則是數(shù)據(jù)存儲類或者算法實現(xiàn)類,例如TEncCu是CU編碼器類,而TComDataCU則是CU的數(shù)據(jù)類(或者說CU數(shù)據(jù)的操作類,因為實際的數(shù)據(jù)仍然存放在TComPicYuv中)

簡單介紹一下HM的基本工作:

 TAppEncTop的encode函數(shù)調(diào)用了compressGOP這個函數(shù),這是一個非常重要的函數(shù),它對一個圖像組進(jìn)行編碼。
    compressGOP函數(shù)(這個函數(shù)將近2000行,我就不貼上來了。。。):
    1、調(diào)用xInitGOP設(shè)置圖像組中幀的數(shù)量
    2、設(shè)置一些圖像增強信息
    3、進(jìn)入一個大的for循環(huán),對圖像組的每一幀圖像進(jìn)行處理
         3.1、說明一下GOPEntry并不表示一個圖像組,而是表示某一幀對應(yīng)的GOP(即圖像組)的信息,它包含了這個幀的參考幀等重要的信息。
         3.2、調(diào)用selectReferencePictureSet、createExplicitReferencePictureSetFromReference、applyReferencePictureSet、arrangeLongtermPicturesInRPS、setRefPicList、setRefPOCList、setList1IdxToList0Idx等幾個函數(shù),設(shè)置當(dāng)前幀的參考圖像集、參考幀、并對這些參考幀進(jìn)行排序等等,比較復(fù)雜的功能。
         3.3、進(jìn)入一個while循環(huán),對幀的每一片(slice)進(jìn)行編碼,主要是調(diào)用compressSlice來選出最優(yōu)的參數(shù),以及預(yù)測、變換、量化的編碼工作,然后進(jìn)行環(huán)路濾波,最后調(diào)用encodeSlice對其進(jìn)行熵編碼
    4、一些收尾工作!

接下來的內(nèi)容比較關(guān)鍵,代表的是在工程里,函數(shù)和變量的命名規(guī)范:

TcomPic 是圖片類,它包含TComPicSym(圖像符號類)和TComPicYuv(yuv數(shù)據(jù)類:包括原始數(shù)據(jù),預(yù)測數(shù)據(jù)、殘差數(shù)據(jù))

    TvideoIOYuv 是用來讀取yuv文件的類,讀取出來之后把數(shù)據(jù)放到TComPicYuv中

    TComPicSym中則存放了指向片(TComSlice)的二級指針,和指向CU(TComDataCU)的二維指針,其實片和CU的實際數(shù)據(jù)仍然存放在TComPicYuv中

    TEncEntropyIf是熵編碼算法的純虛類

    TEncSbac(TEncEntropyIf的子類)是SBAC熵編碼算法的實現(xiàn),SBAC是CABAC算法的一個改良

    TencCavlc(TEncEntropyIf的子類) 是CAVLC熵編碼算法的實現(xiàn)

    TEncEntropy是熵編碼器類,它和TEncEntropyIf的區(qū)別是,TEncEntropy是一個算法的管理和控制類,而TEncEntropyIf則是具體算法的實現(xiàn)類

    TEncBinIf是二進(jìn)制編碼的純虛類(二進(jìn)制編碼和熵編碼是有區(qū)別的,熵編碼需要用到二進(jìn)制編碼,還有一些其他沒有熵編碼的元素也可能用到二進(jìn)制編碼類)

    TencBinCABAC(TEncBinIf的實現(xiàn)) 二進(jìn)制CABAC類

    TcomBitIf是比特流虛類

    TComOutputBitstream(TcomBitIf的子類)輸出的比特流類

    TComBitCounter(TcomBitIf的子類)比特流計數(shù)器類

    TEncGOP是圖像組處理類,也就是圖像組編碼器類(它的m_pcListPic存放圖像組數(shù)據(jù))

    GOPEntry是圖像組對象類,它包含了圖像組必要的一些信息,TEncGOP處理的對象就是他

    TCom和TEnc的區(qū)別在于,TEnc一般是管理器或者編碼器,而TCom則是數(shù)據(jù)存儲類或者算法實現(xiàn)類,例如TEncCu是CU編碼器類,而TComDataCU則是CU的數(shù)據(jù)類(或者說CU數(shù)據(jù)的操作類,因為實際的數(shù)據(jù)仍然存放在TComPicYuv中)

    TComPicYuv和TComYuv的區(qū)別,TComYuv可以看作是一個方便操作YUV的類,主要用于預(yù)測階段,從    TComPicYuv產(chǎn)生而來,TComYuv的作用沒有TComPicYuv那么大

    一些其他數(shù)據(jù)類型的定義:
    (1)Pxl 是8比特的像素類型
    (2)Pel 是16比特的像素類型
    (3)TCoeff 是變換系數(shù)的數(shù)據(jù)類型(int)
    (4)TComPicSym圖像符號
    (5)枚舉類型SliceConstraint,定義了和片相關(guān)的一些常量
    (6)枚舉類型SAOComponentIdx,定義了SAO組件的索引
    (7)枚舉類型SAOMode,定義了SAO的模式
    (8)枚舉類型SAOModeMergeTypes,定義了SAO模式合并的類型
    (9)枚舉類型SAOModeNewTypes定義了SAO模式的新類型
    (10)枚舉類型SAOEOClasses定義了SAO的EO類型
    (11)結(jié)構(gòu)體SAOOffset定義了SAO的偏移
    (12)結(jié)構(gòu)體SAOBlkParam定義了SAO塊的參數(shù)
    (13)枚舉DFunc定義了失真的計算函數(shù)
    (14)枚舉RefPicList定義了參考列表
    (15)枚舉TextType定義圖像紋理的類型(即亮度,色度等)
    (16)枚舉MVP_DIR定義了運動矢量預(yù)測的方向
    (17)枚舉CI_IDX定義了SBAC率失真方面的優(yōu)化
    (18)枚舉COEFF_SCAN_TYPE定義了系數(shù)的掃描方式

以TCom開頭的數(shù)據(jù)結(jié)構(gòu)是存放數(shù)據(jù)和信息的類;以TEnc開頭的數(shù)據(jù)結(jié)構(gòu)則是編碼功能實現(xiàn)的類;例如TComPic是存放圖像數(shù)據(jù)信息的類,而TEncPic則是實現(xiàn)幀編碼功能的類;以TApp開頭的的是應(yīng)用程序的入口。

以TApp開頭的類:
    (1)TAppEncCfg 編碼器配置信息類,定義了一大堆的配置信息
    (2)TAppEncTop HEVC編碼器應(yīng)用對象類,繼承自TAppEncCfg,實現(xiàn)了整個編碼框架的入口,讀取文件,初始化,編碼、寫數(shù)據(jù)以及結(jié)束處理等操作。

以TEnc開頭的類:
    (1)TEncCfg 編碼過程中的配置信息,TAppEncCfg的配置信息直接從文件中讀取,而TEncCfg得信心則是通過計算或者判定得到
    (2)TEncTop 編碼主類,實現(xiàn)編碼的主要入口。

TApp和TEnc的關(guān)系:TAppEncTop調(diào)用TEncTop,TEncTop再調(diào)用其他的各個部分編碼功能,而TAppEncTop繼承自TAppEncCfg,TEncTop繼承自TEncCfg

    數(shù)據(jù)和編碼的類:
    (1)TVideoIOYuv 用于打開、關(guān)閉、讀寫YUV文件。
    (2)TComYuv 實現(xiàn)了內(nèi)存YUV數(shù)據(jù),指向YUV三個內(nèi)存分量的指針,以及它們的寬高信息
    (3)TComPicYuv 對TComYuv來說是更加仔細(xì)的實現(xiàn)(包括了邊緣填充)
    (3)GOPEntry 存放了圖像組的信息,例如poc,參考圖像列表等等
    (4)TEncGOP 實現(xiàn)了對圖像組的編碼功能
    (5)TComPic 圖像數(shù)據(jù)類,包含TComPicYuv和TComPicSym的對象
    (6)TComPicSym是圖像符號類,里面存放了更加詳細(xì)的圖像信息
    (7)TComSlice 存放了條帶(片)的數(shù)據(jù)信息
    (8)TEncSlice 實現(xiàn)片的編碼功能
    (9)TComDataCU 存放CU(編碼單元)的數(shù)據(jù)信息
    (10)TEncCu 實現(xiàn)了CU的編碼功能
    (11)TEncSearch 實現(xiàn)了運動搜索的功能
    (12)TComPattern 提供了相鄰像素的訪問方法
    (13)TComMv 定義了MV(運動向量)
    (14)TComPrediction 實現(xiàn)了預(yù)測的功能
    (15)TComRdCost 實現(xiàn)了率失真的計算功能
    (16)TComRom.h 文件里定義全局的函數(shù)
    (17)TComInterpolationFilter 實現(xiàn)了內(nèi)插值濾波功能
    (18)TComLoopFilter 實現(xiàn)了環(huán)路濾波
    (19)TComSampleAdaptiveOffset 實現(xiàn)了SAO方面的計算
    (20)TComTrQuant 實現(xiàn)了變換和量化的功能
    (21)TEncAnalyze 一個統(tǒng)計信息分析類
    (22)TEncPreanalyzer 源文件分析類,主要用來計算圖像的特征
    (23)TEncRateCtrl 碼率控制類
    (24)TEncSampleAdaptiveOffset SAO編碼實現(xiàn)類

    熵編碼的類:
    (1)TComBitIf 是比特編碼的虛基類,是比特編碼的基礎(chǔ)接口(If就是Interface)。比特編碼包括輸出比特流,比特計數(shù)器、SBAC編碼、CABAC編碼等等
    (2)TComOutputBitstream 是比特流輸出類,主要用于比特流的輸出,寫到文件或者buffer中
    (3)TComInputBitstream 比特流輸入類(它不是TComBitIf的子類)
    (4)TComBitCounter 比特計數(shù)器,用于統(tǒng)計比特的數(shù)量
    (5)TEncBinIf 二進(jìn)制編碼接口類
    (6)TEncBinCABAC CABAC編碼實現(xiàn)類
    (7)TEncBinCABACCounter CABAC比特計數(shù)實現(xiàn)類
    (8)TEncEntropyIf 熵編碼器的接口類
    (9)TEncCavlc CAVLC熵編碼實現(xiàn)類
    (10)TEncSbac SABAC熵編碼器實現(xiàn)類
由此可見熵編碼部分主要分為三個部分:二進(jìn)制化編碼器,熵編碼器,以及比特流統(tǒng)計以及寫出類
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,627評論 2 380