/**
* @brief 边界补偿模式下像素的5种分类 :
* 第1类谷点和第2类凹拐点,需要加上一个正补偿值;
* 第4类峰点和第3类凸拐点,需要加上一个负补偿值;
* 第0类像素不进行补偿。
*/
const uint32_t SAO::s_eoTable[NUM_EDGETYPE] = {1, 2, 0, 3, 4};
inline int32_t roundIBDI(int32_t num, int32_t den);
inline int8_t signOf(int x);
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);
bool SAO::create(x265_param* param, int initCommon);
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);
void SAO::generateLumaOffsets(SaoCtuParam* ctuParam, int idxY, int idxX);
void SAO::generateChromaOffsets(SaoCtuParam* ctuParam[3], int idxY, int idxX);
void SAO::calcSaoStatsCTU(int addr, int plane);
void SAO::calcSaoStatsCu_BeforeDblk(Frame* frame, int idxX, int idxY);
void SAO::rdoSaoUnitCu(SAOParam* saoParam, int rowBaseAddr, int idxX, int addr);
void SAO::saoStatsInitialOffset(int planes);
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);
void SAO::saoLumaComponentParamDist(SAOParam* saoParam, int32_t addr,
int64_t& rateDist, int64_t* lambda, int64_t &bestCost);
void SAO::saoChromaComponentParamDist(SAOParam* saoParam, int32_t addr,
int64_t& rateDist, int64_t* lambda, int64_t &bestCost);
void saoCuStatsBO_c(const int16_t *diff, const pixel *rec, intptr_t stride,
int endX, int endY, int32_t *stats, int32_t *count);
void saoCuStatsE0_c(const int16_t *diff, const pixel *rec, intptr_t stride,
int endX, int endY, int32_t *stats, int32_t *count)
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);
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);
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);