[HEVC] HEVC學習(二) —— HM的整體結構及一些基本概念

[HEVC] HEVC學習(二) —— HM的整體結構及一些基本概念

本帖最後由 cjl2011 於 2012-11-12 06:16 PM 編輯

在剛開始看HM的時候,對着7個工程,可能有人會感到困惑,該從哪裏看起呢?當然了,對於已經有一定代碼量積累的人或者之前研究過H.264代碼如JM的人來說,從何入手應該不成問題。但我寫這篇出來,一方面是自己做個總結,備忘,另一方面也是希望能夠幫助剛剛入手HM的朋友。好了,不多廢話,還是進入正題吧。



對於一個完整的HM解決方案來說,總共包含了7個工程:1. TAppCommon 2. TAppDecoder 3. TAppEncoder

4. TLibCommon 5. TLibDecoder 6. TLibEncoder 7. TLibVideoIO



其中,'T'代表'Test'(這一個的理解可能有誤),'App'代表'Application',表明該工程主要包含一些應用函數,'Lib'代表'Library',表明該工程主要包含一些庫函數,這裏順便提一下,應用函數與庫函數的主要區別是:前者是面向用戶的,主要是通過調用若干庫函數實現更爲豐富和複雜的功能,而後者是面向程序設計者的,或者說對用戶是不可見的,它由程序設計者來實現,主要是對一些基本的功能進行底層設計與實現,對於用戶來說,只關心這些庫函數的接口以及如何調用,不需也不應該關心它的實現。'Common'表明該工程包含的一些函數是編碼器和解碼器共用的,'Decoder'表明該工程包含的函數是解碼器使用的,而'Encoder'表明該工程包含的函數是編碼器使用的。'VideoIO'工程主要是實現對YUV文件的讀寫操作。



在有了上述的認識以後,相信對如何入手代碼有了更爲明確的方向了。比如,如果你想看編碼器的代碼,則首先應該找到跟'Encoder'有關的工程,即'TAppEncoder'和'TLibEncoder'這兩個,其次,對於跟蹤代碼來說,應該從main函數入手,道理是顯然的,因爲程序的入口函數就是main,既然如此,那麼這些函數應該是在用戶程序裏了,即應該找到'TAppEncoder'這個工程。對於解碼器來說,也是類似的,找到'TAppDecoder'這個工程,就可以開始從main函數開始你的解碼之旅了。這裏順便提一下,編碼器和解碼器的主函數分別在encmain.cpp和decmain.cpp中,相信光看源文件名都能看出來了。



最後,簡單介紹下HM代碼中關於變量、函數的命名規則,熟悉這些規則,有利於對代碼更好的理解。



(1)類的命名:

一般來說,一個頭文件只包含一個類的定義,文件名即爲類名,且該類是屬於哪個工程的,它的名字就以該工程的前幾個字母開頭,如類TAppEncTop,它就是以工程TAppEncoder的前7個字母開頭,因此,從該類的名字,就能夠看出該類是屬於哪個工程的。

(2)變量的命名:

對於類的數據成員來說,一般以'm_'開頭,即'member';對於全局變量來說,一般以'g_'開頭,即'global'。

對於一般的變量(包含上述兩種變量)來說,有如下命名規則:'p',該變量是指針類型,即'pointer',n個'p'則表明該指針爲n級指針;'c',該變量是某個類的對象,即'class';'i',該變量是整型,即'int';'u',該變量是無符號型,即'unsigned';'h',該變量是字符型,這裏不用'c'來代表'char’應該是爲了避免跟前面的'class'衝突了;'b',該變量是布爾類型,即'bool’;'d',該變量是雙精度浮點數,即'double';'f',該變量是單精度浮點數,即'float';'a',該變量是類組,即'array';'e',該變量是枚舉類型,即'enum';等等。值得一提的是,不是每個變量的命名都滿足這些規則,具體情況還是要具體分析的。但是,按照這些規則,80%以上的變量都能一眼看出它的特性來。



(3)函數的命名:

一般來說,對於一個類的成員函數來說,如果該函數的訪問權限是'protected',則在其函數名前加上'x';但是,在我看代碼過程中,有些'protected'的成員函數並沒按照這個規則來命名,所以,這一條規則僅供參考。能夠肯定的是,只要某個函數名字前有個'x',則該函數一定是某個類的protected成員函數。



說了這麼多,舉個具體實例來說明下吧:

在工程TLibEncoder的頭文件TEncCu.h中,定義了一個類TEncCu,有個數據成員m_ppcBestCU,根據前面的命名規則,它首先是個數據成員,是個二級指針,且是指向一個類的,實際上,它是這麼聲明的,TComDataCU**,TComDataCU它就是一個類,且該變量被聲明爲二級指針,據此,符合上述命名規則。

還有一個數據成員這麼聲明UChar                   m_uhTotalDepth; 無符號字符型,同樣也是符合命名規則的。

在該類中,有這麼一個成員函數xCompressCU,以'x'開頭命名,在類中被聲明爲'protected',符合命名規則。



還有許多諸如此類的例子,在實際看代碼的過程中,大家可以一條條去驗證,如果發現我裏面有哪些地方說的不對或者不夠全面的,歡迎批評指正。

(轉載請註明出處。原文地址:http://blog.csdn.net/hevc_cjl/article/details/8170646
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章