transformskip和intra block copy, palatte mode 一样,是针对screen content 的编码工具,该工具的提出是因为对于screen content,其经常包含尖锐边缘或者跳变,相关性极差,这种情况下进行正常的transform反而会带来负面影响,还不如跳过变换环节,直接对残差进行量化。下面来直接看代码:

 if (pcCU->getTransformSkip(uiAbsPartIdx, compID) != 0)//开启transformskip{xTransformSkip(pcResidual, uiStride, m_plTempCoeff, rTu, compID);}else.  //执行正常的transform{const Int channelBitDepth = pcCU->getSlice()->getSPS()->getBitDepth(toChannelType(compID));xT(channelBitDepth, rTu.useDST(compID), pcResidual, uiStride, m_plTempCoeff, uiWidth, uiHeight, pcCU->getSlice()->getSPS()->getMaxLog2TrDynamicRange(toChannelType(compID)));}#if DEBUG_TRANSFORM_AND_QUANTISEstd::cout << g_debugCounter << ": " << uiWidth << "x" << uiHeight << " channel " << compID << " TU between transform and quantiser\n";printBlock(m_plTempCoeff, uiWidth, uiHeight, uiWidth);
#endif // if DEBUG_TRANSFORM_AND_QUANTISExQuant(rTu, m_plTempCoeff, rpcCoeff,#if ADAPTIVE_QP_SELECTIONpcArlCoeff,
#endif // if ADAPTIVE_QP_SELECTIONuiAbsSum, compID, cQP);//执行量化
Void TComTrQuant::xTransformSkip(Pel *piBlkResi, UInt uiStride, TCoeff *psCoeff, TComTU &rTu, const ComponentID component)
{const TComRectangle &rect = rTu.getRect(component);const Int width = rect.width;const Int height = rect.height;const Int maxLog2TrDynamicRange = rTu.getCU()->getSlice()->getSPS()->getMaxLog2TrDynamicRange(toChannelType(component));const Int channelBitDepth = rTu.getCU()->getSlice()->getSPS()->getBitDepth(toChannelType(component));Int iTransformShift = getTransformShift(channelBitDepth, rTu.GetEquivalentLog2TrSize(component), maxLog2TrDynamicRange);//rTu.GetEquivalentLog2TrSize(component) always is 2.if (rTu.getCU()->getSlice()->getSPS()->getSpsRangeExtension().getExtendedPrecisionProcessingFlag()){iTransformShift = std::max<Int>(0, iTransformShift);//这个iTransformShift是因为在编码器里变换和量化融合在一起,量化步骤包含了变换步骤中乘以1/128的部分,所以在这里要先乘上128}const Bool rotateResidual = rTu.isNonTransformedResidualRotated(component);//对残差进行旋转,因为对于intra prediction来说,越远预测的越差,残差越大const UInt uiSizeMinus1 = (width * height) - 1;if (iTransformShift >= 0){for (UInt y = 0, coefficientIndex = 0; y < height; y++){for (UInt x = 0; x < width; x++, coefficientIndex++){psCoeff[rotateResidual ? (uiSizeMinus1 - coefficientIndex) : coefficientIndex] = TCoeff(piBlkResi[(y * uiStride) + x]) << iTransformShift;}}}else // for very high bit depths{iTransformShift = -iTransformShift;const TCoeff offset = 1 << (iTransformShift - 1);for (UInt y = 0, coefficientIndex = 0; y < height; y++){for (UInt x = 0; x < width; x++, coefficientIndex++){psCoeff[rotateResidual ? (uiSizeMinus1 - coefficientIndex) : coefficientIndex] = (TCoeff(piBlkResi[(y * uiStride) + x]) + offset) >> iTransformShift;}}}
}

在h265中,对于每个CU来说是否开启transformskip完全有RDO来选择;

 for (Int modeId = firstCheckId; modeId < 2; modeId++)//第一次TransformSkip为false,第二次TransformSkip为true,通过rdcost来选择是否用TransformSkip;{DEBUG_STRING_NEW(sModeString)Int default0Save1Load2 = 0;singleDistTmpLuma = 0;if (modeId == firstCheckId){default0Save1Load2 = 1;}else{default0Save1Load2 = 2;}pcCU->setTransformSkipSubParts(modeId, COMPONENT_Y, uiAbsPartIdx, totalAdjustedDepthChan);//把modeId赋值给m_puhTransformSkip,会导致在xIntraCodingTUBlock里使用xTransformskip 或者xT;xIntraCodingTUBlock(pcOrgYuv, pcPredYuv, pcResiYuv, resiLumaSingle, false, singleDistTmpLuma, COMPONENT_Y, rTu DEBUG_STRING_PASS_INTO(sModeString), default0Save1Load2);......
}

H.265中针对scc的工具 -- transformskip相关推荐

  1. 完成一个H.265/HEVC码流分析工具

    经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具.时间包括平时的周末.晚上,以及调休的集中时间.当然,中秋回家过节不写代码.截至今天,经过多种H.265序列测试,也有各种 ...

  2. 一个H.265/HEVC码流分析工具

    经过大约一个月左右的业余时间,终于初步完成一个H.265/HEVC码流分析工具.时间包括平时的周末.晚上,以及调休的集中时间.当然,中秋回家过节不写代码.截至今天,经过多种H.265序列测试,也有各种 ...

  3. 视频编码(3):H.266 编码性能比 H.265 再提升 49% 的关键丨音视频基础

    ​ 我们在前文视频编码(2):H.265 如何比 H.264 提升 40% 编码效率丨音视频基础_音视频开发老马的博客-CSDN博客中探讨了 H.264 视频编码的基本概念.编码工具.编码流程及码流结 ...

  4. H.265和H.264对比分析(VR视频传输)

    名 称 : H.265和H .264对比分析 姓 名 : 殷松 时 间 : 2017年6月14日 目 录 一. H.265(HEVC)与H.264对比 二.H.265关键技术分析 三.H.265与H. ...

  5. 【笔记】H.265/HEVC 视频编码(四)——预测编码

    预测编码时视频编码中的核心技术之一.对于视频信号来说,一幅图像内邻近像素之间有较强的空间相关性,相邻图像之间有较强的时间相关性.因此采用帧内预测和帧间预测的方式,去除视频的空域和时域的相关性.视频编码 ...

  6. H.265/HEVC学习笔记:帧内预测编码

    帧内预测编码是指利用视频空间域的相关性,使用当前图像已编码的像素预测当前像素,然后将预测残差(当前像素真实值与预测值之间的差值)作为后续编码模块的输入,进行下一步编码处理.在解码端解码时使用同样的方式 ...

  7. H.265与H.264的区别详解

    1.H.264与H.265的主要差异 H.265仍然采用混合编解码,编解码结构域H.264基本一致, 主要的不同在于: Ø 编码块划分结构:采用CU (CodingUnit).PU(Predictio ...

  8. 建议收藏 | H.265编码原理入门

    视频编码的目的是为了压缩原始视频,压缩的主要思路是从空间.时间.编码.视觉等几个主要角度去除冗余信息.由于 H.264 出色的数据压缩比率和视频质量,成为当前市场上最为流行的编解码标准.而 H.265 ...

  9. H.264分隔符AUD误用导致iOS设备无法播放H.265视频的问题解决

    AUD,全称Access Unit Delimiter,它是H.264接入单元(Access Unit,AU)的分隔符. AU定义为多个按解码顺序排列的NALU,这些NALU解码正好生成一个图像.AU ...

  10. 【转】数字音视频压缩编码标准及H.265的编码优势

    在制定数字音视频压缩编码标准的过程中,联合图像专家组(Joint Photographic Experts Group, JPEG).动态图像专家组(Moving Pictures Experts G ...

最新文章

  1. 数据中心巡检实操之UPS及电池
  2. jQuery调用其他JS文件中的方法
  3. PAT1049 数列的片段和 (20 分)
  4. c++用一级运算比较大小_16.初中数学:怎么比较a、b、c、d的大小?幂的运算,基础常见考题...
  5. 【机器学习】深度学习开发环境搭建
  6. 优化MyBatis配置文件中的配置
  7. 下一步目标:整理出1套相对成熟的ios 开发框架
  8. 一个牛人给java初学者的建议
  9. testbed 桩函数设置
  10. 232接口针脚定义_工业RS232接口总线原理与应用方案
  11. 学英语三个月超过你过去学三年
  12. 【电脑修复小知识】电脑网络正常连接,但是浏览器却无法打开网页是什么原因?三招教你修复!
  13. 电磁兼容学习-电磁干扰三要素
  14. Android Project Butter 黄油计划
  15. Dbeaver连接Clickhouse无法下载/更新驱动
  16. android主动获取手机电量,获取Android手机的电量信息
  17. 5 MATLAB参数估计与假设检验-参数估计
  18. 使用网络唤醒功能实现远程开机 —— 定时执行专家
  19. python圆形_Python实现的圆形绘制(画圆)示例
  20. 《软件设计的哲学》(三)【复杂性的本质】

热门文章

  1. 数据结构实验之大规模数据交并集
  2. 公告模块phpcms
  3. 最火的几颗国产视频芯片
  4. MYSQL数据库ANY的用法_数据库——IN、ANY、SOME 和 ALL 操作符的使用
  5. 带你通关全栈树型结构设计:从数据库到前端
  6. 解决弹出 “百度未授权使用地图API,可能是因为您提供的密钥不是有效的百度LBS开放平台密钥”的方法
  7. 浅析vendor_init
  8. 关于Iphone 4 如何用itunes备份短信等设置
  9. springboot整合thumbnailator实现图片处理
  10. 前端处理无网络兜底图片展示