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优化思考相关推荐
- mysql 使用order by存在的问题与优化思考
目录 前言: 一 limit分页 二 order by和limit数据不一致的问题 三 ordey by与filesort 总结: 思考: 补充: 前言: 在很多实际业务中,往往需要涉及分页和排序,还 ...
- 一次面试引发的思考(中小型网站优化思考)
前言 故事的起因是这样的,由于本人地处偏僻工作地点在美丽的冰城哈尔滨虽然地方很美丽,但是这里的软件行业实在是算不上"美丽",这么多年由于个人原因或者公司原因经常换工作,因为这里都是 ...
- 一次面试引发的思考(中小型网站优化思考) (转)
前言 故事的起因是这样的,由于本人地处偏僻工作地点在美丽的冰城哈尔滨虽然地方很美丽,但是这里的软件行业实在是算不上"美丽",这么多年由于个人原因或者公司原因经常换工作,因为这里都是 ...
- for循环次数太多的时间优化_for循环关于对象长度优化思考
一.for循环对象长度两种写法 最近看到很多代码,各种语言,在写for循环的时候并没有把长度提取出来,而是每次遍历的时候进行计算. $str = 'bye 2019, hi 2020!'; for ( ...
- 电饭煲米和水比例优化思考
What 优化电饭煲煮饭,让用户操作更简单,适应场景:白米饭,杂粮饭,白米粥,八宝粥 Why 每次米饭粥可能做出来差别都很大,不是太湿就是太干,刚刚好的米饭很少能够做出来.需要一个傻瓜式的指引: 随着 ...
- 火车票订票系统的几点优化思考
一.场景分析 1.平时访问量不高,但是春运几天会出现瞬间高峰 2.订单的事务性要求较高 3.全国开放,并且票数要精准 4.瞬间访问量大 二.调优可行性方案 1.数据层次 使用oracle,在数据稳定性 ...
- sql 双分区查询_优化案例 | 分区表场景下的SQL优化
导读 有个表做了分区,每天一个分区. 该表上有个查询,经常只查询表中某一天数据,但每次都几乎要扫描整个分区的所有数据,有什么办法进行优化吗? 一.待优化场景 有一个大表,每天产生的数据量约100万,所 ...
- 优化案例 | CASE WHEN进行SQL改写优化
导读 今天给大家分享一个通过SQL改写而独辟蹊径的SQL优化案例 待优化场景 发现SLOW QUERY LOG中有下面这样一条记录: ... # Query_time: 59.503827 Lock_ ...
- 视差滚动的爱情故事之优化篇
上篇博客链接:视差滚动的爱情故事 [优化问题 : 解决Chrome下跳动的bug] 在上一篇的爱(diao)情(si)故事里面,demo3在 Chrome下是这样的问题:鼠标滚动视差元素动画生硬,鬼畜 ...
- 即时通讯mysql压力_Soul即时通讯之数据库优化
背景 在Soul的IM上线后,初始时用户本地消息量不大的情况下,数据库读写良好,不容易发现问题. 但随着产品用的时间越来越近,有些用户本地聊天数据达到500万条以上时,数据库性能瓶颈逐渐体现出来. 1 ...
最新文章
- java lambda 变量_java8新特性-lambda(变量捕获)
- Express4.x API (四):Router (译)
- Java 链接MySQL数据库时报的connect和denied错解决方法
- 神策数据成林松:数据智能在业务场景下的应用(附 PPT 下载)
- 我的算法学习(一)----数组的全排列
- linux oracle12c dbca,Linux下Oracle 12c R2图形化安装笔记
- CentOS系统下docker的安装与卸载
- 如何处理表单中的中文(中文编码/解码问题)
- 08-Flutter移动电商实战-dio基础_伪造请求头获取数据
- Linux/deppin 中安装、卸载软件的几种命令
- 搜索算法-搜索的优化
- R语言实战:个人贷款违约预测模型
- 计算器软件设计和计算机软件设计区别,基于LabVIEW的计算器程序设计
- linux灵活提取ip脚本
- ORACLE US7ASCII编码 读取时乱码问题
- 经典面试题【老鼠喝水】
- 笔划码、五笔码、拼音码软键盘中文输入
- 数字化的一切都会在安全沙箱里面
- 一封来自知乎的手机拍摄要领
- 开发团队PMO如何构建管理更有效?