/**
* @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);

x265源码分析:SAO 函数总结及逻辑关系图相关推荐

  1. x265源码分析 main函数 x265.cpp

    图片转载于x265源码流程分析_Dillon2015的博客-CSDN博客_x265编码流程 cliopt.prase main ()函数--解析函数参数并进行编码准备工作:x265.cpp (1)Ge ...

  2. jQuery源码分析-each函数

    本文部分截取自且行且思 jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理,在jQuery使用的频率非常大,下面就这个函数做了详细讲解: 复制代码代码 /*! * jQuer ...

  3. GCC源码分析(十一) — 函数节点的gimple低端化

    版权声明:本文为CSDN博主「ashimida@」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/lidan1 ...

  4. ceph bluestore 源码分析:刷缓存(trim)逻辑

    环境 ceph版本:12.2.1 部署模式:ec 2+1 osd: 3个 且资源池已经有数据 执行命令:ceph daemon osd.0 flush_store_cache 进行刷缓存.即将dump ...

  5. [授权发表]源码分析:静态分析 C 程序函数调用关系

    故事缘由 工欲善其事,必先利其器.今天我们来玩转一个小工具,叫 Callgraph,它可以把 C 语言的函数调用树(或者说流程图)画出来. 传统的命令行工具 Cscope,Ctags 可以结合vim ...

  6. GCC源码分析(十) — 函数节点的gimple高端化

    版权声明:本文为CSDN博主「ashimida@」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/lidan1 ...

  7. 【Linux 内核 内存管理】mmap 系统调用源码分析 ④ ( do_mmap 函数执行流程 | do_mmap 函数源码 )

    文章目录 一.do_mmap 函数执行流程 二.do_mmap 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 & ...

  8. c++imread 函数_OpenCV学习笔记与源码分析: imread( )函数

    引言 imread()函数在opencv使用比较. imread()函数 声明: Mat imread(const string& filename, int flags); 这很标准的写法, ...

  9. ceph bluestore源码分析:非对齐写逻辑

    文章目录 环境 原理说明 总结 环境 ceph:12.2.1 场景:ec 2+1 部署cephfs,执行如右写模式:dd if=/dev/zero of=/xxx/cephfs bs=6K count ...

最新文章

  1. 将SpringBoot应用Docker化并部署到SAP云平台
  2. [Java网络编程基础]InetAddress的使用
  3. 非对称加密 公钥私钥_选择Java加密算法第3部分–公钥/私钥非对称加密
  4. ASP.NET TextBox 当鼠标点击后清空默认提示文字
  5. mysql 导出dmp文件_PLSQL Developer导入导出表数据结构
  6. win ollvm环境_Python3 环境搭建
  7. java 回车表示_Java 换行和回车
  8. Mixly-继电器控制直流电机
  9. 多个txt文件合并成一个txt文件、多个csv文件合并成一个csv文件
  10. 1156:求π的值(C C++)
  11. JavaScript入门,难不难你来说
  12. 从实习生到算法专家,他只用了2年!
  13. BackupPC - 恢复选项Restore options
  14. WiFi-ESP8266入门http(3-2)网页认证上网-post请求
  15. 关键信息基础设施确定指南_干货分享 | 关键信息基础设施运营单位如何做好业务安全测试...
  16. p2p sdk接收文件服务端epoll模型源码
  17. centOS7的vi中如何使用汉语拼音和五笔
  18. 论文推荐-计算机视觉
  19. hadoop编程:分析CSDN注册邮箱分布情况
  20. Ubuntu 20.04切换软件源为清华源

热门文章

  1. TCP/IP协议栈初始化 总结
  2. python字符串删除指定字符
  3. Xcode. pods 第一次在项目中安装使用的一些问题
  4. 【css炫酷动画】让面试官眼前一亮的故障风格文字动画
  5. Spring 自定义Enable注解以及Enable注解扩展
  6. 移动开发之设计模式- 备忘录模式(IOSAndroid)
  7. Bootstrap学习总结笔记(2)-- 基本样式之表格
  8. jira使用教程管理项目
  9. 最强蜗牛 服务器维护祷告,最强蜗牛维护补偿在哪里领取 维护补偿领取攻略
  10. .NET快速开发平台成功案例之大型ERP人事工资考勤系统|C/S框架网