x265的sao优化思考
生活随笔
收集整理的這篇文章主要介紹了
x265的sao优化思考
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
資料整理
干貨 | H.265編碼SAO算法優化
https://www.jianshu.com/p/178633de0e65
這篇文章介紹的很好,將sao的原理和細節基本都介紹清楚了
sao 樣點自適應補償,bo 像素灰度值分成32個band;eo又分成四種方式,5中像素類型
這篇文中介紹的優化方法,將數據怎么存放,一次性計算,但是性能在有匯編優化的情況下就不明顯了,不嘗試了
https://blog.csdn.net/nk_wavelet/article/details/52662954
介紹了x265中每個函數模塊的作用
/** * @brief 邊界補償模式下像素的5種分類 : * 第1類谷點和第2類凹拐點,需要加上一個正補償值; * 第4類峰點和第3類凸拐點,需要加上一個負補償值; * 第0類像素不進行補償。 */ const uint32_t SAO::s_eoTable[NUM_EDGETYPE] = {1, 2, 0, 3, 4};/* 對|num / den|四舍五入,然后前面添加符號 */ inline int32_t roundIBDI(int32_t num, int32_t den);/* 獲取輸入變量x的符號 */ inline int8_t signOf(int x);/* 獲取 a-b的符號 */ inline int signOf2(const int a, const int b);/*** @brief 計算D_post和 D_pre的差值,其中D_pre和D_post分別表示原始像素與重構像素(SAO補償前、補償后)之間的失真。* @param count : 一個CTB內某個特定SAO類型樣本的個數* @param offset : 一個CTB內某個特定SAO類型樣本的補償值* @param offsetOrg : 原始像素與重構像素(SAO補償前)之間的差值之和*/ inline int64_t estSaoDist(int32_t count, int32_t offset, int32_t offsetOrg);/* 創建SAO的部分參數,分配空間 */ bool SAO::create(x265_param* param, int initCommon);/* 為當前CTU的SAO參數分配空間并初始化 */ void SAO::allocSaoParam(SAOParam* saoParam);/*** @brief 根據SAO補償模式對重構像素值進行補償.* @param addr : 從上到下、從左到右,當前CTU的序號* @param typeIdx : SAO補償模式,取值SAO_EO_X 或 SAO_BO* @param plane : 顏色空間平面的序號,亮度平面為0,兩個色度平面分別為1和2. */ void SAO::applyPixelOffsets(int addr, int typeIdx, int plane);/* 獲取亮度CTU的SAO補償模式及對應的補償值(在此函數之前已經計算得到)并進行補償 */ void SAO::generateLumaOffsets(SaoCtuParam* ctuParam, int idxY, int idxX);/* 獲取色度CTU的SAO補償模式及對應的補償值(在此函數之前已經計算得到)并進行補償 */ void SAO::generateChromaOffsets(SaoCtuParam* ctuParam[3], int idxY, int idxX);/* 統計當前CTU在BO和EO各模式下的像素歸類: 重構像素與原始像素差值之和(保存在數組 m_offsetOrg 中), 像素種類 classIdx 的計數(保存在數組 m_count 中) */ void SAO::calcSaoStatsCTU(int addr, int plane);/* 去方塊濾波前對CTU的像素統計歸類, 只有當 SAO 和 bSaoNonDeblocked 都開啟的情況下才使用,因此暫時忽略 */ void SAO::calcSaoStatsCu_BeforeDblk(Frame* frame, int idxX, int idxY);/* 計算CTU在各種模式下的最佳SAO代價,與直接采用左邊或上面CTU的SAO參數作比較,找出最 優的SAO代價并將最優SAO模式下的各種參數保存在saoParam->ctuParam[plane][addr]中 */ void SAO::rdoSaoUnitCu(SAOParam* saoParam, int rowBaseAddr, int idxX, int addr);/* 利用先前已得到的統計信息(即m_count和m_offsetOrg)計算初始補償值(即m_offset) */ void SAO::saoStatsInitialOffset(int planes);/* 計算率失真代價值,公式為:(失真 + lambda * 編碼比特數)*/ inline int64_t SAO::calcSaoRdoCost(int64_t distortion, uint32_t bits, int64_t lambda);/** * @brief 估計中間過程的補償值,即:在給定的SAO模式和某種類點的情況下,找到最優率失真代價及對應的補償值和失真值. * @param typeIdx : SAO模式,即 SAO_EO_X 和 SAO_BO * @param lambda : 拉格朗日乘子,取值依賴QP,即 256.0 * x265_lambda2_tab[qp] * @param count : typeIdx模式下,某classIdx的點的數目 * @param offsetOrg : 原始像素與重構像素(SAO補償前)之間的差值之和 * @param offset[輸出] : 最優率失真代價對應的補償值 * @param distClasses[輸出] : 最優率失真代價對應的失真 * @param costClasses[輸出] : 最優率失真代價 */ void SAO::estIterOffset(int typeIdx, int64_t lambda, int32_t count, int32_t offsetOrg, int32_t& offset, int32_t& distClasses, int64_t& costClasses);/* 搜尋亮度最優SAO模式,得到最優率失真代價 */ void SAO::saoLumaComponentParamDist(SAOParam* saoParam, int32_t addr, int64_t& rateDist, int64_t* lambda, int64_t &bestCost);/* 搜尋色度最優SAO模式,得到最優率失真代價 */ void SAO::saoChromaComponentParamDist(SAOParam* saoParam, int32_t addr, int64_t& rateDist, int64_t* lambda, int64_t &bestCost);/* 統計某個CU內條帶點數目及失真之和, count和stats分別記錄了條帶點計數和失真之和*/ void saoCuStatsBO_c(const int16_t *diff, const pixel *rec, intptr_t stride, int endX, int endY, int32_t *stats, int32_t *count);/* 統計CU內的點在EO_0模式下的各種類點的數目及失真之和 */ void saoCuStatsE0_c(const int16_t *diff, const pixel *rec, intptr_t stride, int endX, int endY, int32_t *stats, int32_t *count)/* 統計CU內的點在EO_1模式(垂直方向)下的各種類點的數目及失真之和 */ void saoCuStatsE1_c(const int16_t *diff, const pixel *rec, intptr_t stride, int8_t *upBuff1, int endX, int endY, int32_t *stats, int32_t *count);/* 統計CU內的點在EO_2模式(135度方向)下的各種類點的數目及失真之和 */ void saoCuStatsE2_c(const int16_t *diff, const pixel *rec, intptr_t stride, int8_t *upBuff1, int8_t *upBufft, int endX, int endY, int32_t *stats, int32_t *count);/* 統計CU內的點在EO_3模式(45度方向)下的各種類點的數目及失真之和 */ void saoCuStatsE3_c(const int16_t *diff, const pixel *rec, intptr_t stride, int8_t *upBuff1, int endX, int endY, int32_t *stats, int32_t *count);https://amefs.net/archives/1264.html
limit-sao測試與簡單總結,sao會讓整體圖像變得模糊,偏離等等,但整體來說還是可以降低ringing的效果
H.265/HEVC 的編碼結果 H.265/HEVC 可以壓縮掉2%~6% 的碼流,而對應的編解碼器的時間復雜度僅僅上升約2%
總結
以上是生活随笔為你收集整理的x265的sao优化思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华硕笔记本k555拆机图解_华硕K43系
- 下一篇: 中间人攻击的实践与原理(ARP毒化、DN