Deblock::deblockCU()
/* 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()相关推荐
- H.266/VVC技术学习之环路滤波:去块滤波(Deblock)技术
一.方块效应 目前主流的视频编码标准都是基于分块的混合编码机制,其处理过程是针对每个块单独进行处理的,因此由于编码模式的差异以及量化误差的原因,会导致相邻块重建像素不连续的现象.对于一个两侧强相关性的 ...
- 获得H.264视频分辨率的方法
在使用ffmpeg解码播放TS流的时候(例如之前写过的UDP组播流),在连接时往往需要耗费大量时间.经过debug发现是av_find_stream_info(已抛弃,现在使用的是avformat_f ...
- HEVC算法和体系结构:环路滤波技术
环路滤波(In-Loop Filtering)技术 类似于以往的视频编码标准,HEVC仍采用基于块的混合编码框架,一些失真效应仍然存在,如方块效应.振铃效应.颜色偏差以及图像模糊等等.为了解决这些问题 ...
- In-Loop Filters in HEVC
有两种滤波,一个deblock filter用来减弱因为transform和预测边界的不联系性:另外一个是SAO,通过减弱振铃效应和改变像素的强度来提升画质.https://blog.csdn.net ...
- AI视觉,视频云新挑战的解决之道
正文字数:4204 阅读时长:6分钟 AI就像一个加速器,正在渗透在多媒体应用的方方面面,改进甚至颠覆传统的图像视频处理方法.本文整理自腾讯云高级研发工程师刘兆瑞在LiveVideoStackCon ...
- AVS3关键技术、性能和复杂度分析
本文由北京大学的范逵博士在LiveVideoStack线上分享第三季,第七期的内容整理而成,本次分享将主要从AVS3关键技术介绍.AVS3性能测试两个方面介绍AVS3基准档次中新采纳的编码工具,并分析 ...
- 深度学习赋能视频编码
深度学习赋予了诸如计算机视觉等领域新的研究契机,其应用也获得了视频编码领域的诸多关注.在LiveVideoStack线上分享中北京大学信息技术学院 助理研究员王苫社详细介绍了当下深度学习在视频编码中的 ...
- 手淘H265编解码算法与工程优化
本文来自淘宝(中国)软件有限公司 高级算法专家 李晓波在LiveVideoStackCon 2018讲师热身分享,并由LiveVideoStack整理而成.在分享中李晓波详细解析了手淘在H.265高效 ...
- 从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(如何解决编码 0 延时)
在看到这篇文章前我已经解决了这个问题,但是知其然不知其所以然,看到原作者写的文章很详细. 于是转之,感谢原作者. 原文链接:http://blog.csdn.net/ymsdu2004/article ...
最新文章
- 使用javascript模拟常见数据结构(二)
- 【原创】用J-LINK烧写ARM开发板的Nor Flash
- SAP BW增量队列深入研究
- Java 8 Friday Goodies:新的新I / O API
- 编写自动调试器以在测试执行期间捕获异常
- Android studio3.5 SDK29项目开发笔记
- 【Flink】flink-connector-elasticsearch5与flink-connector-elasticsearch6 有什么区别
- (三)设置Jenkins为MLOps构建CI/CD管道
- TensorFlow2.0: keras.metrics的使用
- 拿签证威胁外籍博士后,实验室导师真的可以为所欲为?
- Android 使用WakeLock
- java 线程协作 wait(等待)与 notiy(通知)
- 地下室计算机房冷量,34平米用多大风管机
- mongoose 入门(四)使用aggregate 聚合管道、使用 populate 实现关联查询
- 抖音直播运营分析:深入解读直播带货运营那些专业术语
- echarts将x轴展示在图标上方
- HLK-W801-LVGL8之横屏显示
- 【PyTorch】nn.Conv2d函数详解
- 2017年山东省机器人比赛 双足竟步 arduino源代码(删去了关键步态程序 gongneng1 和 gongneng2)
- 计算机网络应用层之HTTP协议
热门文章
- 分析称手机网络电话改变公众通信习惯
- android 闹钟提醒实现方法,Android开发实例之闹钟提醒
- 【linux杂谈】安装linux虚拟机的时候发现的full name,user name有啥区别
- 使用PageInfo做分页时手动设置参数的实现方式
- java毕业设计——基于java+EVENODD编码的基于纠错码的冗余技术设计与实现(毕业论文+程序源码)——基于纠错码的冗余技术
- 大数据开源框架之基于Spark的气象数据处理与分析
- Halcon入门(一)shape-based matching
- html页面禁用开发者工具,禁用electron开发者工具中console警告信息
- EasyConnect for Mac 安装和使用教程
- 1、读入 cgss2003.dta 数据,查看 codebook,找到本人出生年份、文化程度变量;