/* Deblocking filter process in CU-based (the same function as conventional's)* param Edge the direction of the edge in block boundary (horizonta/vertical), which is added newly 基于CU进行环路滤波:过程:1.递归找到每个CU,基于CU进行进行环路滤波2.确定滤波边界,设置边界强度1.默认给CU内部的PU边界设置block strength = 12.默认给CU内部的TU边界递归设置block strength = 23.默认给CU边界但非帧边界设置block strength = 2,帧边界block strength = 04.对于非0的8x8block,获取其boundary strength,并将其赋值给block strength3.进行边界滤波*/
void Deblock::deblockCU(const CUData* cu, const CUGeom& cuGeom, const int32_t dir, uint8_t blockStrength[])
{uint32_t absPartIdx = cuGeom.absPartIdx;uint32_t depth = cuGeom.depth;if (cu->m_predMode[absPartIdx] == MODE_NONE)return;// 若当前cuGeom.depth深度没有达到之前分析的最优深度m_cuDepth[absPartIdx],则递归if (cu->m_cuDepth[absPartIdx] > depth){// 拆分当前CUfor (uint32_t subPartIdx = 0; subPartIdx < 4; subPartIdx++){// 得到subCU的几何形状const CUGeom& childGeom = *(&cuGeom + cuGeom.childOffset + subPartIdx);// 若当前subCU呈现出来,则递归deblockif (childGeom.flags & CUGeom::PRESENT)deblockCU(cu, childGeom, dir, blockStrength);}return;}/*  确定滤波边界  */// CU的4x4block个数uint32_t numUnits = 1 << (cuGeom.log2CUSize - LOG2_UNIT_SIZE);// PU边界给1setEdgefilterPU(cu, absPartIdx, dir, blockStrength, numUnits);// 递归对TU边界给2setEdgefilterTU(cu, absPartIdx, 0, dir, blockStrength);// CU边界给2,图像边界给0setEdgefilterMultiple(absPartIdx, dir, 0, bsCuEdge(cu, absPartIdx, dir), blockStrength, numUnits);/* 获取边界强度 */// CU的4x4block个数uint32_t numParts = cuGeom.numPartitions;// 遍历当前CU的每个4x4blockfor (uint32_t partIdx = absPartIdx; partIdx < absPartIdx + numParts; partIdx++){// 因为这里遍历单位4x4block,而滤波边界单位为8x8block,// 所以bsCheck过滤掉非8x8block边界uint32_t bsCheck = !(partIdx & (1 << dir));// 若是8x8边界,且blockStrength非0,则获取获取边界强度if (bsCheck && blockStrength[partIdx])blockStrength[partIdx] = getBoundaryStrength(cu, dir, partIdx, blockStrength);}/* 执行环路滤波 */// 最小环路滤波执行单位DEBLOCK_SMALLEST_BLOCK = 8x8中,有partIdxIncr块4x4block,// 遍历时计数器增长单位为partIdxIncrconst uint32_t partIdxIncr = DEBLOCK_SMALLEST_BLOCK >> LOG2_UNIT_SIZE;uint32_t shiftFactor = (dir == EDGE_VER) ? cu->m_hChromaShift : cu->m_vChromaShift;uint32_t chromaMask = ((DEBLOCK_SMALLEST_BLOCK << shiftFactor) >> LOG2_UNIT_SIZE) - 1;uint32_t e0 = (dir == EDGE_VER ? g_zscanToPelX[absPartIdx] : g_zscanToPelY[absPartIdx]) >> LOG2_UNIT_SIZE;// 以8x8block为单位遍历进行边界滤波for (uint32_t e = 0; e < numUnits; e += partIdxIncr){// 进行luma环路滤波edgeFilterLuma(cu, absPartIdx, depth, dir, e, blockStrength);// 进行chroma环路滤波if (!((e0 + e) & chromaMask) && cu->m_chromaFormat != X265_CSP_I400)edgeFilterChroma(cu, absPartIdx, depth, dir, e, blockStrength);}
}

Deblock::deblockCU()相关推荐

  1. H.266/VVC技术学习之环路滤波:去块滤波(Deblock)技术

    一.方块效应 目前主流的视频编码标准都是基于分块的混合编码机制,其处理过程是针对每个块单独进行处理的,因此由于编码模式的差异以及量化误差的原因,会导致相邻块重建像素不连续的现象.对于一个两侧强相关性的 ...

  2. 获得H.264视频分辨率的方法

    在使用ffmpeg解码播放TS流的时候(例如之前写过的UDP组播流),在连接时往往需要耗费大量时间.经过debug发现是av_find_stream_info(已抛弃,现在使用的是avformat_f ...

  3. HEVC算法和体系结构:环路滤波技术

    环路滤波(In-Loop Filtering)技术 类似于以往的视频编码标准,HEVC仍采用基于块的混合编码框架,一些失真效应仍然存在,如方块效应.振铃效应.颜色偏差以及图像模糊等等.为了解决这些问题 ...

  4. In-Loop Filters in HEVC

    有两种滤波,一个deblock filter用来减弱因为transform和预测边界的不联系性:另外一个是SAO,通过减弱振铃效应和改变像素的强度来提升画质.https://blog.csdn.net ...

  5. AI视觉,视频云新挑战的解决之道

    正文字数:4204  阅读时长:6分钟 AI就像一个加速器,正在渗透在多媒体应用的方方面面,改进甚至颠覆传统的图像视频处理方法.本文整理自腾讯云高级研发工程师刘兆瑞在LiveVideoStackCon ...

  6. AVS3关键技术、性能和复杂度分析

    本文由北京大学的范逵博士在LiveVideoStack线上分享第三季,第七期的内容整理而成,本次分享将主要从AVS3关键技术介绍.AVS3性能测试两个方面介绍AVS3基准档次中新采纳的编码工具,并分析 ...

  7. 深度学习赋能视频编码

    深度学习赋予了诸如计算机视觉等领域新的研究契机,其应用也获得了视频编码领域的诸多关注.在LiveVideoStack线上分享中北京大学信息技术学院 助理研究员王苫社详细介绍了当下深度学习在视频编码中的 ...

  8. 手淘H265编解码算法与工程优化

    本文来自淘宝(中国)软件有限公司 高级算法专家 李晓波在LiveVideoStackCon 2018讲师热身分享,并由LiveVideoStack整理而成.在分享中李晓波详细解析了手淘在H.265高效 ...

  9. 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)

    在看到这篇文章前我已经解决了这个问题,但是知其然不知其所以然,看到原作者写的文章很详细. 于是转之,感谢原作者. 原文链接:http://blog.csdn.net/ymsdu2004/article ...

最新文章

  1. 使用javascript模拟常见数据结构(二)
  2. 【原创】用J-LINK烧写ARM开发板的Nor Flash
  3. SAP BW增量队列深入研究
  4. Java 8 Friday Goodies:新的新I / O API
  5. 编写自动调试器以在测试执行期间捕获异常
  6. Android studio3.5 SDK29项目开发笔记
  7. 【Flink】flink-connector-elasticsearch5与flink-connector-elasticsearch6 有什么区别
  8. (三)设置Jenkins为MLOps构建CI/CD管道
  9. TensorFlow2.0: keras.metrics的使用
  10. 拿签证威胁外籍博士后,实验室导师真的可以为所欲为?
  11. Android 使用WakeLock
  12. java 线程协作 wait(等待)与 notiy(通知)
  13. 地下室计算机房冷量,34平米用多大风管机
  14. mongoose 入门(四)使用aggregate 聚合管道、使用 populate 实现关联查询
  15. 抖音直播运营分析:深入解读直播带货运营那些专业术语
  16. echarts将x轴展示在图标上方
  17. HLK-W801-LVGL8之横屏显示
  18. 【PyTorch】nn.Conv2d函数详解
  19. 2017年山东省机器人比赛 双足竟步 arduino源代码(删去了关键步态程序 gongneng1 和 gongneng2)
  20. 计算机网络应用层之HTTP协议

热门文章

  1. 分析称手机网络电话改变公众通信习惯
  2. android 闹钟提醒实现方法,Android开发实例之闹钟提醒
  3. 【linux杂谈】安装linux虚拟机的时候发现的full name,user name有啥区别
  4. 使用PageInfo做分页时手动设置参数的实现方式
  5. java毕业设计——基于java+EVENODD编码的基于纠错码的冗余技术设计与实现(毕业论文+程序源码)——基于纠错码的冗余技术
  6. 大数据开源框架之基于Spark的气象数据处理与分析
  7. Halcon入门(一)shape-based matching
  8. html页面禁用开发者工具,禁用electron开发者工具中console警告信息
  9. EasyConnect for Mac 安装和使用教程
  10. 1、读入 cgss2003.dta 数据,查看 codebook,找到本人出生年份、文化程度变量;