CU PU TU划分以及PU最佳预测模式选择

在HM对CU进行划分(CU模式判别)、PU模式选择(划分)、以及PU预测模式划分的过程总算有点理解,现对整个过程进行详细介绍。

HM进行块划分和模式选择主要的工作是:

一、分层递归所有CU划分模式。
二、对每一个CU遍历所有PU(划分)模式,选出最优划分模式,与此同时也完成了最优TU模式的选择。
三、对每一个PU遍历所有的预测模式(intra,inter等,对帧内帧间都遍历一遍比较选出最优模式,记录预测数据。选择最优预测模式。

划分过程中并不是按一二三的顺序进行的,为并不是把CU划分好了再进行PU模式选择和预测模式选择,是后者在CU划分的过程中进行了。画了两个图便于理解如下图所示:

首先关于CU划分讲解:

①把CTU作为CU(LCU),计算此CU (这个CU已完成了二跟三)的RDCost,此时出为64 * 64,深度为0,记录预测数据。包含分割数据split_flge。
②对64 * 64的CU进行四叉树划分,得到四个32 * 32的CU ,计算这四个小CU的RDCost,相加得到RDCost和,并且得到四个分别的最佳预测模式和预测数据并记录。
③对32 * 32的CU继续划分,得到四个16 * 16的CU ,同样的重复②中操作。
④达到最深深度8 * 8的CU同样进行②的操作,用四个8 * 8的CU率失真代价之和与被拆分的16*16的CU进行比较作为反馈,决定是否拆分(若小的小则确实该拆分,若大的小则不必进行分四叉树)。
⑤进行向上的比较,确定是否四叉树划分。
这样就是所谓的遍历一遍,也就是说一个LCU被划分为64个最小CU后才能完成最后的CU划分。我们必须等划分到8x8才能决定CU的划分到底是什么样的,即是选择8x8还是16x16,待16x16完成以后,就选择16x16还是32x32,待32x32完成以后,就决定是32x32还是64x64。所以只有8x8CU划分完毕才能做后续CU划分的决定。不管CU的大小多大,每一个CU预测完成(即确定了当前pu划分层次的pu预测模式)之后,都会有对象的对象来存储和当前CU所有有关的预测数据(最佳预测模式,预测数据,预测残差)。

下面对PU模式选择的讲解:

PU模式判别
①计算2Nx2N模式的率失真代价,将其作为最优代价,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将2Nx2N作为最优的PU模式
②如果CU的深度已经取得最大值,且inter_4x4_enabled_flag是1,那么执行③,否则执行④
③计算NxN模式的率失真,更新最优代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将NxN作为最优的PU模式
④计算Nx2N模式的率失真代价,更新最优代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将Nx2N作为最优的PU模式
⑤计算2NxN模式的率失真代价,更新最优代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将2NxN作为最优的PU模式
⑥如果TestAMP_Hor为1,当前CU执行水平方向上的AMP模式,否则执行本步骤。计算2NxnU模式的率失真代价,更新最优代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将2NxnU作为最优的PU模式;否则计算2NxnD模式的率失真代价,更新最优的代价和模式,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将2NnD作为最优的PU模式
⑦如果TestAMP_Ver为1,当前CU执行垂直方向上的AMP模式,否则执行本步骤。计算nLx2N模式的率失真代价,更新最优模式和代价,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将nLx2N作为最优的PU模式;否则计算nRx2N模式的率失真代价,更新最优模式和代价,如果预测残差的编码比特数为零,那么满足CBF_Fast,直接跳至⑪,并将nRx2N作为最优的PU模式
⑧注意上面的都是帧间的模式,现在需要计算帧内2Nx2N模式的率失真代价,更新最优模式和代价
⑨如果当前CU深度为最大值,计算帧内NxN模式的率失真代价,更新最优模式和代价
⑩如果当前CU大于或等于PCM模式所允许的最小单元,并且代价大于PCM模式,那么更新最优模式和代价
⑪结束搜索,得到最优的PU模式。注意对于每一种PU模式,都要夯实不同的TU划分,选取最优的TU模式,因此最优的PU模式包含了最优的TU模式

下面对PU预测模式选择进行讲解:

在对每一个PU的模式选择,都会对帧内和帧间进行遍历,待比较RDCost之后再选择此PU块选择帧内模式还是帧间模式。
1)帧间预测模式。
HEVC采用了Merge和AMVP技术,更加高效地表示帧间预测参数,但是这两种方式有比较大的区别,因此帧间预测可以分成Merge帧间预测模式和非Merge帧间预测模式(采用AMVP技术),分别选取最优的Merge帧间预测模式和非Merge帧间预测模式,然后从中选取最优的模式。
对于Merge帧间预测模式,遍历所有的候选模式,计算率失真代价,选择率失真代价最小的模式为最优模式。当采用merge帧间预测模式I按摩,且预测残差信号的编码比特数为零时,只需要编码skip标识和merge索引两个语法元素,此时该模式称为MODE_SKIP模式
对于非Merge帧间预测模式(采用AMVP技术)
①根据AMVP技术确定MVP列表,计算每个MVP的率失真代价,得到最优的MVP
②以最优MVP为起始点,进行整像素运动预测,得到最优的整像素运动矢量
③以整像素运动矢量为中心,进行半像素搜索,从周围的8个点确定最优的半像素精度运动矢量
④以半像素精度矢量为中心,进行1/4像素精度的运动搜索,确定最优的1/4像素精度运动矢量

2)帧内预测模式。
①遍历所有的预测模式,得到每种模式下的残差信号,再对残差信号进行Hadamard变换计算SATD值
②利用SATD值计算每种预测模式的率失真代价,选取率失真代价最小的几种模式(与PU大小相关)为预测模式集
③将已编码相邻块的预测模式补充到预测模式集中
④遍历模式集合中的所有模式,并对残差信号进行正常编码(熵编码),计算率失真代价
⑤选取最优的预测模式作为该PU的最优模式
⑥当亮度块的模式确定之后,把该模式以及DC、planar、水平方向模式、垂直方向模式作为色度块的候选模式,选取最优的模式即可

以上的过程都是在函数TEncCu::xCompressCU中实现。

以上是学习笔记,仅供于学习。

每一步详细介绍—在HM中进行CU PU TU划分以及PU最佳预测模式选择相关推荐

  1. python位运算符_详细介绍Python语言中的按位运算符

    按位运算符是把数字看作二进制来进行计算的.Python中的按位运算法则如下: 按位与 ( bitwise and of x and y ) & 举例: 5&3 = 1 解释: 101 ...

  2. [转载] 详细介绍Python函数中的默认参数

    参考链接: Python函数中的默认参数 详细介绍Python函数中的默认参数 import datetime as dt def log_time(message, time=None): if t ...

  3. python语言中运算符号_详细介绍Python语言中的按位运算符

    <从问题到程序:用Python学编程和计算>--2.11 补充材料 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第2章,第2.11节,作者:裘宗燕 ...

  4. 详细介绍js函数中的arguments

    arguments相当于一个"伪数组" ECMAScript函数的参数和其他的语言还是有些不同的,他并不介意你传进来多少个参数,以及参数的数据类型:通俗的说,即使你在定义函数时,只 ...

  5. vue3【列表渲染】v-for 详细介绍(vue中的“循环”)

    vue 常用语法--列表渲染 v-for 文章简介 v-for 主要内容

  6. java中char占的二进制,java数据类型与二进制详细介绍

    java数据类型与二进制详细介绍 在java中 Int 类型的变量占 4个字节 Long 类型的变量占8个字节 一个程序就是一个世界,变量是这个程序的基本单位. Java基本数据类型 1. 整数类型 ...

  7. wince中BIB文件的详细介绍

    wince中BIB文件的详细介绍 在WinCE中使用的一个重要的文件就是BIB文件,全称Binary Image Builder File.在WinCE的编译过程中会用到BIB文件,应该是在最后的Ma ...

  8. c语言中 的优先级几级,C语言中的操作符优先级的详细介绍

    C语言中的操作符优先级的详细介绍 C语言中操作符的优先级大全, 当然c++, Objective-C,大部分语言都试用. 下面是来自The C Programming Language 2th的总结. ...

  9. (数据科学学习手札32)Python中re模块的详细介绍

    一.简介 关于正则表达式,我在前一篇(数据科学学习手札31)中已经做了详细介绍,本篇将对Python中自带模块re的常用功能进行总结: re作为Python中专为正则表达式相关功能做出支持的模块,提供 ...

最新文章

  1. oracle trunc()截断函数
  2. R语言循环中break函数和next函数使用实战
  3. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
  4. HTML/BODY的背景渲染原理
  5. H.264专利费不受FRAND限制 Android设备商受影响
  6. 缺失值的处理——R语言
  7. linux系统需要备份吗,准备好了吗?请备份你的Linux系统
  8. 小林求职记(二):说好的问基础,为啥我感觉一点也不基础呢?
  9. java创建hbase多个列族_Spark:DataFrame写HFile (Hbase)一个列族、一个列扩展一个列族、多个列...
  10. 服务器上网站文件无法删除不了怎么办啊,Windows服务器上文件夹删不掉怎么办...
  11. 2016 Multi-University Training Contest 2 1012 La Vie en rose (暴力)
  12. Teamviewer检测为商业用途的解决方案
  13. VC ++ 注册DLL
  14. 深信服校园招聘c/c++软件开发A卷
  15. 贪吃蛇大作战中的“马太效应”
  16. ASO优化:影响 APP权重与吸量的五大要素
  17. 套用带标题行的表格样式_excel表格样式采用内置样式 使用Excel 2010内置的单元格样式制作精美的表格效果...
  18. (跨境电商)最新海关税率表(2019年1月1日实施)
  19. Windows下C++通过Hooks记录键盘敲击记录的代码
  20. IOS (不越狱)网络抓包

热门文章

  1. 《利用机器学习开发算法交易系统》
  2. 1.如何实现MT4帐号同步交易?
  3. 让子盒子在父盒子中垂直居中的七个方法
  4. openxml的视频教程
  5. pic32mx是什么cpu_Digilent Microchip PIC32MX795F512 32位MCU开发方案
  6. uni-app h5、app模式下集成turn.js 翻书动画
  7. 百度api识别身份证信息
  8. 多地政府提及元宇宙发展 | 产业区块链发展周报
  9. excel数据可视化销售报表案例--根据某平台提供的明细数据及需求制作的一份销售报表案例
  10. 使用python uiautomation从钉钉网页版提取公司所有联系人信息