x264中的AQ:

简述:

有四种aq模式,分别为:

- 0: Disabled

- 1: Variance AQ (complexity mask)

- 2: Auto-variance AQ

- 3: Auto-variance AQ with bias to dark scenes

实际aq的应用不仅与aq-mode的设置有关,还与aq-strength有关,aq-strength决定是了实施aq-mode的强度,aq-strength

的取值范围在(0,3),值越大应用aq的强度越大;

与aq相关的主要函数为x264_adaptive_quant_frame,在该函数中,根据不同的aq模式完成每个宏块的qp偏移值,计算过程使用到宏块的方差信息与aq-strength;

void x264_adaptive_quant_frame( x264_t *h, x264_frame_t *frame, float *quant_offsets )
{/* Initialize frame stats */for( int i = 0; i < 3; i++ ){frame->i_pixel_sum[i] = 0;frame->i_pixel_ssd[i] = 0;}/* Degenerate cases */if( h->param.rc.i_aq_mode == X264_AQ_NONE || h->param.rc.f_aq_strength == 0 ){/* Need to init it anyways for MB tree */if( h->param.rc.i_aq_mode && h->param.rc.f_aq_strength == 0 ){if( quant_offsets ){for( int mb_xy = 0; mb_xy < h->mb.i_mb_count; mb_xy++ )frame->f_qp_offset[mb_xy] = frame->f_qp_offset_aq[mb_xy] = quant_offsets[mb_xy];if( h->frames.b_have_lowres )for( int mb_xy = 0; mb_xy < h->mb.i_mb_count; mb_xy++ )frame->i_inv_qscale_factor[mb_xy] = x264_exp2fix8( frame->f_qp_offset[mb_xy] );}else{memset( frame->f_qp_offset, 0, h->mb.i_mb_count * sizeof(float) );memset( frame->f_qp_offset_aq, 0, h->mb.i_mb_count * sizeof(float) );if( h->frames.b_have_lowres )for( int mb_xy = 0; mb_xy < h->mb.i_mb_count; mb_xy++ )frame->i_inv_qscale_factor[mb_xy] = 256;}}/* Need variance data for weighted prediction */if( h->param.analyse.i_weighted_pred ){for( int mb_y = 0; mb_y < h->mb.i_mb_height; mb_y++ )for( int mb_x = 0; mb_x < h->mb.i_mb_width; mb_x++ )x264_ac_energy_mb( h, mb_x, mb_y, frame );}elsereturn;}/* Actual adaptive quantization */else{/* constants chosen to result in approximately the same overall bitrate as without AQ.* FIXME: while they're written in 5 significant digits, they're only tuned to 2. */float strength;float avg_adj = 0.f;float bias_strength = 0.f;if( h->param.rc.i_aq_mode == X264_AQ_AUTOVARIANCE || h->param.rc.i_aq_mode == X264_AQ_AUTOVARIANCE_BIASED ){float bit_depth_correction = 1.f / (1 << (2*(BIT_DEPTH-8)));float avg_adj_pow2 = 0.f;for( int mb_y = 0; mb_y < h->mb.i_mb_height; mb_y++ )for( int mb_x = 0; mb_x < h->mb.i_mb_width; mb_x++ ){uint32_t energy = x264_ac_energy_mb( h, mb_x, mb_y, frame );float qp_adj = powf( energy * bit_depth_correction + 1, 0.125f );frame->f_qp_offset[mb_x + mb_y*h->mb.i_mb_stride] = qp_adj;avg_adj += qp_adj;avg_adj_pow2 += qp_adj * qp_adj;}avg_adj /= h->mb.i_mb_count;avg_adj_pow2 /= h->mb.i_mb_count;strength = h->param.rc.f_aq_strength * avg_adj;avg_adj = avg_adj - 0.5f * (avg_adj_pow2 - 14.f) / avg_adj;bias_strength = h->param.rc.f_aq_strength;}elsestrength = h->param.rc.f_aq_strength * 1.0397f;for( int mb_y = 0; mb_y < h->mb.i_mb_height; mb_y++ )for( int mb_x = 0; mb_x < h->mb.i_mb_width; mb_x++ ){float qp_adj;int mb_xy = mb_x + mb_y*h->mb.i_mb_stride;if( h->param.rc.i_aq_mode == X264_AQ_AUTOVARIANCE_BIASED ){qp_adj = frame->f_qp_offset[mb_xy];qp_adj = strength * (qp_adj - avg_adj) + bias_strength * (1.f - 14.f / (qp_adj * qp_adj));}else if( h->param.rc.i_aq_mode == X264_AQ_AUTOVARIANCE ){qp_adj = frame->f_qp_offset[mb_xy];qp_adj = strength * (qp_adj - avg_adj);}else{uint32_t energy = x264_ac_energy_mb( h, mb_x, mb_y, frame );qp_adj = strength * (x264_log2( X264_MAX(energy, 1) ) - (14.427f + 2*(BIT_DEPTH-8)));}if( quant_offsets )qp_adj += quant_offsets[mb_xy];frame->f_qp_offset[mb_xy] =frame->f_qp_offset_aq[mb_xy] = qp_adj;if( h->frames.b_have_lowres )frame->i_inv_qscale_factor[mb_xy] = x264_exp2fix8(qp_adj);}}/* Remove mean from SSD calculation */for( int i = 0; i < 3; i++ ){uint64_t ssd = frame->i_pixel_ssd[i];uint64_t sum = frame->i_pixel_sum[i];int width  = 16*h->mb.i_mb_width  >> (i && CHROMA_H_SHIFT);int height = 16*h->mb.i_mb_height >> (i && CHROMA_V_SHIFT);frame->i_pixel_ssd[i] = ssd - (sum * sum + width * height / 2) / (width * height);}
}

aq偏移值的应用主要在x264_ratecontrol_mb_qp函数中完成,在该函数中,对每个宏块在原先的qp基础上再加上x264_adaptive_quant_frame计算出来的qp偏移值;

int x264_ratecontrol_mb_qp( x264_t *h )
{x264_emms();float qp = h->rc->qpm;if( h->param.rc.i_aq_mode ){/* MB-tree currently doesn't adjust quantizers in unreferenced frames. */float qp_offset = h->fdec->b_kept_as_ref ? h->fenc->f_qp_offset[h->mb.i_mb_xy] : h->fenc->f_qp_offset_aq[h->mb.i_mb_xy];/* Scale AQ's effect towards zero in emergency mode. */if( qp > QP_MAX_SPEC )//QP_MAX_SPEC = 51qp_offset *= (QP_MAX - qp) / (QP_MAX - QP_MAX_SPEC);qp += qp_offset;}return x264_clip3( qp + 0.5f, h->param.rc.i_qp_min, h->param.rc.i_qp_max );
}

x264中的AQ模块代码学习相关推荐

  1. Python中re(正则表达式)模块函数学习

    2019独角兽企业重金招聘Python工程师标准>>> Python正则表达式指南 今天学习了Python中有关正则表达式的知识.关于正则表达式的语法,不作过多解释,网上有许多学习的 ...

  2. node-mysql中的连接池代码学习

    node-mysql是一个node.js下的mysql驱动,前段时间在处理连接池的问题上遇到了连接不释放的疑难杂症,虽已解决,但仍需总结经验避免下次重蹈覆辙.下面是node-mysql中的连接池的部分 ...

  3. [转载] Python中的string模块的学习

    参考链接: Python当中string.whitespace 学习资料:http://docs.python.org/library/string.html#string.Formatter 感觉学 ...

  4. python中的utils模块_python学习笔记-import utils报错

    今天遇到一个坑爹的问题,查找了半天原因,终于解决了,在此特地记录一下. 运行环境:Windows eclipse 我在eclipse中配置了python的运行环境,在eclipse中编写python代 ...

  5. PX4代码学习系列博客(5)——在px4中添加自己的模块

    怎么在px4中添加自己的模块 在"px4固件目录结构和代码风格"这一节,曾经说过NuttX是一个实时的嵌入式系统,上面可以像windows那样运行程序.那既然是应用程序,那我们应该 ...

  6. 2016年大数据Spark“蘑菇云”行动代码学习之AdClickedStreamingStats模块分析

    2016年大数据Spark"蘑菇云"行动代码学习之AdClickedStreamingStats模块分析     系统背景:用户使用终端设备(IPAD.手机.浏览器)等登录系统,系 ...

  7. 学习笔记之卸载远程目标进程中的DLL模块(转)

    学习笔记之卸载远程目标进程中的DLL模块 (2007-07-23 23:51:02) 转载▼ 学习笔记之卸载远程目标进程中的DLL模块2007/7/23 1.首先得把DLL模块中的线程结束 使用Cre ...

  8. web前端学习中CSS,JS代码压缩

    web前端要学习的知识有很多,前端基础要学习三个部分:HTML,CSS,JavaScript(简称JS),因此首先明确三个概念:HTML负责结构,网页想要表达的内容由html书写. CSS负责样式,网 ...

  9. 使用python中的tkinter模块制作一个学习打卡小软件

    学习任务打卡小软件---戈多Sensei 1.制定任务 2.完成任务 3.学习评估 最近为了给我的星星⭐写一个学习记录软件,学习了一下python中的tkinter模块,做了一个可视化打卡界面,此处为 ...

最新文章

  1. Cisco PT模拟实验(19) 路由器的NAT功能配置
  2. CF 8D Two Friends (三分+二分)
  3. 【612页】Android 大厂面试题及解析大全(中高级)
  4. 用XMLHTTP获取动态页生成的HTML内容
  5. sqlplus环境配置(login.sql)
  6. 在此iphone上尚未受信任_电脑显示服务器上的安全数据库没有此工作站信任关系的解决方法...
  7. Processing 字体变形
  8. db h2 数据类型_H2Database数据类型
  9. Beyond Compare “许可证密钥已被撤销”解决
  10. wpf之MVVM绑定背景色
  11. Atitit 软件开发中 瓦哈比派的核心含义以及修行方法以及对我们生活与工作中的指导意义
  12. 关于安装更新office版本时,需要卸载office所遇到的问题
  13. oracle数据库驱动下载(ojdbc)
  14. Repast Simphony 模型发布及使用
  15. 倒立摆 adams matlab,基于adams和matlab的一级倒立摆联合仿真
  16. 555低电平出发定时器
  17. J-Link软件和文档包的版本发行说明(4)[V6.50 ~ V6.90a版本]
  18. (增删查改+排序+文件存储)通讯录实现(附源码)
  19. 集宁一中高122班聚会筹委会正式成立
  20. 正则表达式 取最后一个 . 然后进行匹配

热门文章

  1. mysql查询第八页_第八节:MySQL之Select指令详解和相关练习
  2. 如何解决下载链接在微信中无法打开的问题?
  3. 【数据集】Zachary空手道俱乐部关系网络图
  4. 【观察】赋能中小企业驶入成长“快车道”,华为云云商店背后的三重新价值...
  5. Threat Intellgence
  6. 一个域名对网站的价值分析
  7. 【汇正财经】9.15日盘面回顾和行情解析
  8. 常见word,excel,ppt 转pdf
  9. 扫雷游戏——C/C++
  10. 2021你挣了多少外快?务实社海哥告诉你2022副业做什么好?