最近看了一些解碼端的代碼,爲了方便閱讀,寫個總結梳理一下思路,之後會不斷補充。
這裏借用雷神的圖:
decmain.cpp
HM解碼器入口是TAppDecoder的decmain.cpp,調用了四個入口函數cTAppDecTop.create()
(創建解碼器),cTAppDecTop.parseCfg( argc, argv )
(分析配置信息),cTAppDecTop.decode()
(解碼的入口),cTAppDecTop.destroy()
(解碼結束,內存釋放),另外還有計時操作。解碼器端需要學習的函數都在cTAppDecTop.decode()
中。
TAppDecTop::decode
該函數中會初始化解碼器,按幀讀入碼流,調用TDecTop::decode
進行NALU和視頻的解碼(xDecodeSlice
),調用executeLoopFilters
對重構的幀圖像進行濾波並按時間順序重新排序,如果該幀不是參考幀就會被釋放掉否則暫存。
decompressSlice
從雷神的框架圖中可以看到,有兩個decompressSlice
。
1.上層的TDecGop::decompressSlice
,主要完成解碼計時、熵解碼器初始化,調用TDecSlice::decompressSlice
進行解碼。
2.TDecSlice::decompressSlice
(詳見 HEVC代碼學習38:decompressSlice函數)進行實際解碼操作,其中會遍歷所有CTU進行解碼,其中調用了重要函數decodeCtu
和decompressCtu
,完成CTU的解碼和重構。
decodeCtu
(詳見 HEVC代碼學習39:decodeCtu和xDecodeCU函數)會調用xDecodeCU
來完成真正的CTU解碼工作,注意只是解碼CTU預測所需要的信息,沒有進行重構。
decompressCtu
完成CTU的預測,生成最終的重構CTU。
接下來的解碼中會調用很多Lib庫的函數,在編碼端可能已經看到過。