H.264官方軟件JM源代碼簡單分析-編碼器lencod

=====================================================

H.264/H.265 官方源代碼分析文章:

H.264官方軟件JM源代碼簡單分析-編碼器lencod

H.264官方軟件JM源代碼簡單分析-解碼器ldecod

HEVC官方軟件HM源代碼簡單分析-編碼器TAppEncoder

HEVC官方軟件HM源代碼簡單分析-解碼器TAppDecoder

=====================================================


上一篇文章總結了H.264官方參考軟件JM中的視頻解碼器ldecod的結構,本文繼續分析JM中的視頻編碼器lencod。


函數調用關係圖

JM中的H.264視頻編碼器lencod的函數調用關係圖如下所示。




下面解釋一下圖中關鍵標記的含義。

函數背景色
函數在圖中以方框的形式表現出來。不同的背景色標誌了該函數不同的作用:
白色背景的函數:不加區分的普通內部函數。
黃色背景函數:濾波函數(Filter)。用於環路濾波,半像素插值,SSIM/PSNR的計算。
綠色背景的函數:宏塊編碼函數(Encode)。通過對殘差的DCT變換、量化等方式對宏塊進行編碼。
紫色背景的函數:熵編碼函數(Entropy Coding)。對宏塊編碼後的數據進行CABAC或者CAVLC熵編碼。

淺藍色背景函數:碼率控制函數(Rate Control)。對碼率進行控制的函數。


箭頭線
箭頭線標誌了函數的調用關係:
黑色箭頭線:不加區別的調用關係。
黃色的箭頭線:濾波函數(Filter)之間的調用關係。
綠色箭頭線:宏塊編碼函數(Encode)之間的調用關係。
紫色箭頭線:熵編碼函數(Entropy Coding)之間的調用關係。
 
函數所在的文件
每個函數標識了它所在的文件路徑。

下文記錄結構圖中幾個關鍵的部分。



普通內部函數

普通內部函數指的是lencod中還沒有進行分類的函數。例如:
編碼器的main()函數中調用的參數配置函數Configure()、初始化編碼器函數init_encoder()、編碼函數encode_sequence()、釋放編碼器函數free_encoder()等。
編碼器主要編碼函數encode_one_frame()逐層調用的函數perform_encode_frame()、frame_picture()、code_a_picture()、code_a_plane()等。

宏塊編碼函數

宏塊編碼函數通過運動估計、DCT變換、量化等步驟對圖像數據進行編碼。編碼的工作都是在Slice結構體中的encode_one_macroblock()中完成的。encode_one_macroblock()調用PartitionMotionSearch()完成幀間宏塊運動估計的工作;調用mode_decision_for_I8x8_MB()、mode_decision_for_I4x4_MB()完成幀內宏塊的模式選擇;調用Slice結構體的luma_residual_coding()完成了殘差編碼的工作。
PartitionMotionSearch()調用了BlockMotionSearch()。BlockMotionSearch()調用了Macroblock結構體中的IntPelME()完成整像素的運動估計,又調用了SubPelME()完成了亞像素的運動估計。整像素的運動估計可以使用下面的方法:
EPZS_motion_estimation():EPZS算法;
full_search_motion_estimation():全搜索算法;
UMHEXIntegerPelBlockMotionSearch():UMHEX算法;
亞像素的運動估計可以使用下面的方法:
EPZS_sub_pel_motion_estimation():EPZS算法;
full_sub_pel_motion_estimation():全搜索算法;
UMHEXSubPelBlockME():UMHEX算法;

熵編碼函數

熵編碼函數使用CAVLC或者CABAC的方式對宏塊編碼後的數據進行熵編碼。熵編碼的工作都是在write_macroblock()中完成的。write_macroblock()調用了Slice結構體中的write_MB_layer()方法,根據Slice類型的不同,write_MB_layer()可以指向下面方法:
write_i_slice_MB_layer():I Slice宏塊熵編碼;
write_p_slice_MB_layer():P Slice宏塊熵編碼;
write_b_slice_MB_layer():B Slice宏塊熵編碼;

環路濾波函數

環路濾波函數對重建幀數據進行濾波,去除方塊效應。去塊效應濾波是在DeblockPicture()中完成的。DeblockPicture()調用了DeblockMb()。而DeblockMb()中調用GetStrengthVer()、GetStrengthHor()函數獲取濾波強度;調用EdgeLoopLumaVer()、EdgeLoopLumaHor()進行濾波。

碼率控制函數

碼率控制模塊函數分佈在lencod源代碼不同的地方,包括rc_init_seq()、rc_init_GOP()、rc_init_frame()、rc_handle_mb()等。



雷霄驊
[email protected]
http://blog.csdn.net/leixiaohua1020







發佈了372 篇原創文章 · 獲贊 2104 · 訪問量 1306萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章