相信会有不少人对如何确定CU最终的划分有所困惑(包括我在内,刚开始接触时也不知道该怎么做),我觉得很大的一个原因就是CU是递归划分的,这就导致在寻找确定最佳分割位置时比较困难。

其实,解决问题的办法说难也不难,关键在于思路的转换,既然对于xCompressCU中是如何保存划分模式的觉得难以理解,何不跳出这个小圈子寻找新的方法呢?

我们可以从解码器的角度来考虑,因为最终编码后的码流是要经过解码器解码的,解码器事先也是不知道CU到底最终是如何划分的。因此,可以推断,编码器必然会保存下这个信息,至少是提示信息。不妨参考encodeCU这个函数的实现,因为它是最终将信息编码成码流的函数。该函数调用的是xEncodeCU来完成实际工作,截取它当中其中一段对我们有用的代码:

// We need to split, so don't try these modes.
if(!bSliceStart&&( uiRPelX < pcSlice->getSPS()->getPicWidthInLumaSamples() ) && ( uiBPelY < pcSlice->getSPS()->getPicHeightInLumaSamples() ) )
{
m_pcEntropyCoder->encodeSplitFlag( pcCU, uiAbsPartIdx, uiDepth );
}

不错,encodeSplitFlag就是用于编码CU分割信息的函数,它的实现如下:

// Split mode
Void TEncEntropy::encodeSplitFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, Bool bRD )
{
if( bRD )
{
uiAbsPartIdx = 0;
}
if( !bRD )
{
if( pcCU->getLastCUSucIPCMFlag() && pcCU->getIPCMFlag(uiAbsPartIdx) )
{
return;
}
}
m_pcEntropyCoderIf->codeSplitFlag( pcCU, uiAbsPartIdx, uiDepth );
}

对我们有用的函数是最后的codeSplitFlag函数,它的实现如下:

Void TEncSbac::codeSplitFlag   ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
{
if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
return;
UInt uiCtx           = pcCU->getCtxSplitFlag( uiAbsPartIdx, uiDepth );
UInt uiCurrSplitFlag = ( pcCU->getDepth( uiAbsPartIdx ) > uiDepth ) ? 1 : 0;
assert( uiCtx < 3 );
m_pcBinIf->encodeBin( uiCurrSplitFlag, m_cCUSplitFlagSCModel.get( 0, 0, uiCtx ) );
DTRACE_CABAC_VL( g_nSymbolCounter++ )
DTRACE_CABAC_T( "\tSplitFlag\n" )
return;
}

可以看到最为有用的一句:

  UInt uiCurrSplitFlag = ( pcCU->getDepth( uiAbsPartIdx ) > uiDepth ) ? 1 : 0;

也就是说,通过判断pcCU->getDepth( uiAbsPartIdx )是否大于uiDepth来确定当前CU是否还要继续分割,后者我们知道,是当前CU的深度,那么前者呢?自然就是在xCompressCU中确定下来的当前CU的最佳分割模式。至此,我们最想获得的信息就在这里。

经过上述分析后,一句话总结获取CU最佳划分的方法:在HM中调用完xCompressCU之后(至少也应该是compressCU调用完它之后,此时最佳PU为m_ppcBestCU[0]),在调用encodeCU之前(也可以之后,这个只要保证pcCU没被修改过即可),对compressCU的参数pcCU进行类似语句: pcCU->getDepth( uiAbsPartIdx ),即可获得Z order为uiAbsPartIdx的4x4块的深度,如果把整个CU每个4x4块的深度确定下来,那么它的划分自然也就确定下来了。

下图是我打印出的某一块CU在最大尺寸64 x 64,最大深度为4(即depth = 0 ~ 3)的某一种划分情况,每个数字代表对应位置的4x4块的实际深度,红线给出CU的最佳划分。

(转载请注明出处。)

HEVC学习(十二) —— CU的最终划分相关推荐

  1. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  2. OpenCV与图像处理学习十二——图像形状特征之HOG特征

    OpenCV与图像处理学习十二--图像形状特征之HOG特征 一.图像特征理解 1.1 颜色特征 1.2 纹理特征 1.3 形状特征 1.4 空间关系特征 二.形状特征描述 2.1 HOG特征 2.1. ...

  3. PyTorch框架学习十二——损失函数

    PyTorch框架学习十二--损失函数 一.损失函数的作用 二.18种常见损失函数简述 1.L1Loss(MAE) 2.MSELoss 3.SmoothL1Loss 4.交叉熵CrossEntropy ...

  4. 【FastAPI 学习十二】定时任务篇 (移步博客园或个人网站 无广告,界面清爽整洁)

    声明 目前个人放弃CSDN平台,文章只发布于个人网站和博客园 博客园地址 [FastAPI 学习十二]定时任务篇

  5. C1认证学习十二(网络拓扑)

    C1认证学习十二(网络拓扑) 任务背景 互联网是一个广义的概念,它泛指是一切通过网路连接在一起的计算机的集合,所以,若果只是局部观察,那就不能再说互联网是一个互联的了,那么,如果说对于一个公司来说,具 ...

  6. Js高级程序设计第三版学习(十二章)

                                  Js高级程序设计第三版学习(十二章) 第十二章 DOM2和DOM3   1.样式: 访问样式属性 任何支持style特性的HTML元素都有一 ...

  7. linux中ftp的工作原理,Linux系统学习 十二、VSFTP服务—简介与原理

    1.简介与原理 互联网诞生之初就存在三大服务:WWW.FTP.邮件 FTP主要针对企业级,可以设置权限,对不同等级的资料针对不同权限人员显示. 但是像网盘这样的基本没有权限划分. 简介: FTP(Fi ...

  8. Android OpenGL ES 学习(十二) - MediaCodec + OpenGL 解析H264视频+滤镜

    OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学 ...

  9. HEVC学习(二十八) —— 量化之二

    Void TComTrQuant::transformNxN( TComDataCU* pcCU, Pel* pcResidual, //!< 残差 UInt uiStride, TCoeff* ...

  10. Python学习十二:Flask框架

    文章目录 一.Flask 简介 1.1 安装虚拟环境 1.1.1 安装Virtualenv 1.1.2 创建虚拟环境 1.1.3 激活虚拟环境 1.2 安装Flask 1.3 第一个Flask 二.F ...

最新文章

  1. [20170419]bbed探究数据块.txt
  2. ByteBuffer使用之道
  3. ubuntu14.04上网问题
  4. wxpython 调用子窗口_wxpython入门第一步(简单例子)
  5. php处理管道文件流
  6. Ngnix中的fastcgi参数性能优化和解释
  7. 斗鱼TV Web API
  8. mysql数据加表头导出_mysql导出数据到表格讲解大全(导出数据带表头,导出数据中文乱码问题解决)...
  9. 2016年度中国手游报告:梦幻西游手游是最大赢家
  10. oppo小布机器人_OPPO小布助手喜迎重大升级,你的私人全能管家现已上线!
  11. 计算机图形学复习笔记
  12. matlab求自相关频率,使用自相关求周期性
  13. dataframe 对象中统计每个列的所有数的和,或者每一行所有值的和
  14. 想做吃鸡游戏么兄弟?98K轻量物理了解一下
  15. 应用组件的名字与已安装应用有冲突
  16. 哈工大威海计算机学院教师,计算机学院青年教师齐元凯在《IEEE T-PAMI》上发表论文...
  17. cocos2d-js html5自定义鼠标图案及设置原点方法
  18. Python3.4下载网页
  19. c语言高精度加减法程序,C语言实现高精度加减法
  20. ldpc译码讲解_LDPC码译码方法和编码方法与流程

热门文章

  1. 【网站】八大极品桌面壁纸网站,惊艳
  2. tar命令打包并压缩指定的文件夹并且排除指定的文件
  3. java 股票指标算法库_股票K线指标算法整理(Java封装工具类,K线指标算法工具类)...
  4. (构造笔记)GRASP学习心得
  5. python寻找完全平方数_279 完全平方数(bfs)
  6. The database could not be exclusively locked to perform the operation(SQL Server 5030错误解决办法)(转)...
  7. bitbake 编译错误集
  8. Ins图片爬取(基于python,selenium)
  9. Go http Server
  10. QRCode.js 生成二维码放大后会模糊的问题