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