这里主要是结合HEVC的解码端I帧进行讲解的,其中P,B帧基本上没有太大的出入,主要是PU还存在不规则的情况对P帧还没有把握

之后清楚解析后,再进行补充

在之前的博文中提到了编码树结构的相关概念,这里主要结合代码进行进一步的讲解

帧内模式中:

35中预测模式是在PU的基础上进行定义的,但是在具体的帧内预测过程中是以TU为单位的,标准规定PU可以四叉树的形式划分为TU,并且同一个PU内的TU共享一种预测模式

在实际的预测中,每一个TU自己预测自己的,自己参考自己周围的像素点

所以说:PU只是定义预测的方式,而真正的和预测像素和重构的过程都是通过TU进行处理的

下面是熵解码读出一些数据的记录线索:

pCu 代表的是一个CTU对应的结构体

uiAbsPartIdx 表示当前CU在CTU中的位置(以配置文档中最小TU为单位)

最后一个参数表示当前CU或者PU中有多少个TU

//<从CTU中递归进入CU的过程中记录深度信息

memset( pCu->pPuhDepth + uiAbsPartIdx, uiDepth+splitFlag, uiCurNumParts );

//<记录当前CU预测部分PU是N*N,or2N*2N,同时记录当前CU的width,height

memset(pCu->pPePartSize+uiAbsPartIdx,partSize,uiCurNumParts);

memset(pCu->pPuhWidth+uiAbsPartIdx,pSps->uiMaxCUWidth>>uiDepth,uiCurNumParts);

memset(pCu->pPuhHeight+uiAbsPartIdx,pSps->uiMaxCUHeight>>uiDepth,uiCurNumParts);

//<写入预测模式,帧内or帧间

memset(pCu->pPePredMode+uiAbsPartIdx,MODE_INTRA,uiCurNumParts);(目前都是写入帧内)

//<针对PU的模式写入亮度,色度预测部分的方向

memset(pCu->pPuhIntraDir[CHANNEL_TYPE_LUMA]+uiAbsPartIdx+i*partOffset,intraPredMode,uiCurNumParts);

i表示的是如果进行劈分,分四次写入

memset(pCu->pPuhIntraDir[CHANNEL_TYPE_CHROMA]+uiAbsPartIdx,symbol,uiCurNumParts);

//<从CU为根节点进入TU,递归获得最后的最小TU进行解残差系数的解码.帧内部分和PU相关的是:如果为帧内模式,同时PU劈分,那么TU需要劈分

//<在每一次递归过程中,CBF的值

memset(pCu->pPuhCbf[compID]+uiAbsPartIdx,uiCbf,pImg->numPartitionsInCtu>>(uiDepthAdj<<1));

//<TU递归到最小的时候,写入当前TU相对于CU的深度

memset(pCu->pPuhTrIdx + uiAbsPartIdx,uiTrDepth,uiCurNumParts);

//<每一个TU中残差系数

存储在:

pCoeff = pCu->pTrCoeff[compID]+pTu->offsets[compID];

Offsets表示的是通过递归获取的当前TU在CTU中的偏移位置

注意:每一次劈分到最小解码TU,并不代表当前TU就一定是配置信息中的最小TU,这是在编码端决定的 

得到对应的信息之后,进行解码CTU操作

首先是进入

m_pcCuDecoder->decompressCtu ( pCtu );  函数

之后进入递归过程,和读数据时候的过程是相同的,得到最小的CU之后进行解码:

<span style="font-size:18px;"> case MODE_INTRA:xReconIntraQT( m_ppcCU[uiDepth], uiDepth ); //<开始解帧内预测</span>

之后根据partSize 将CU划分为对应的PU

TComTURecurse <span style="color:#ff0000;"><strong>tuRecurseCU</strong></span>(pcCU, 0);TComTURecurse tuRecurseWithPU(tuRecurseCU, false, (uiInitTrDepth==0)?TComTU::DONT_SPLIT : TComTU::QUAD_SPLIT);do{xIntraRecQT( m_ppcYuvReco[uiDepth], m_ppcYuvReco[uiDepth], m_ppcYuvResi[uiDepth], chanType, tuRecurseWithPU );} while (tuRecurseWithPU.nextSection(tuRecurseCU));

因为虽然现在是PU获得预测模式,但是最后还是通过TU进行解码,所以这里还是用了TU的存储结构

while循环内就进入了PU开始解TU的过程

Void
TDecCu::<strong><span style="color:#ff0000;">xIntraRecQT</span></strong>(TComYuv*    pcRecoYuv,TComYuv*    pcPredYuv,TComYuv*    pcResiYuv,const ChannelType chType,TComTU     &rTu)
{UInt uiTrDepth    = rTu.GetTransformDepthRel();TComDataCU *pcCU  = rTu.getCU();UInt uiAbsPartIdx = rTu.GetAbsPartIdxTU();UInt uiTrMode     = pcCU->getTransformIdx( uiAbsPartIdx );if( uiTrMode == uiTrDepth ){if (isLuma(chType))xIntraRecBlk( pcRecoYuv, pcPredYuv, pcResiYuv, COMPONENT_Y,  rTu );else{const UInt numValidComp=getNumberValidComponents(rTu.GetChromaFormat());for(UInt compID=COMPONENT_Cb; compID<numValidComp; compID++){xIntraRecBlk( pcRecoYuv, pcPredYuv, pcResiYuv, ComponentID(compID), rTu );}}}else{TComTURecurse tuRecurseChild(rTu, false);do{xIntraRecQT( pcRecoYuv, pcPredYuv, pcResiYuv, chType, tuRecurseChild );} while (tuRecurseChild.nextSection(rTu));}
}

从这个函数可以看出来,从PU进入TU之后还是进行一个和读参数对应的递归操作

从读数据和解数据的过程基本可以看出来了

CU,TU,PU可以说是相互独立的,因为他们各自负责一部分的模块

但是又有一定的联系,就帧内预测而言:

根节点都是CU,编码过程中是CU->PU,CU->TU,在帧内模式的情况下如果PU是N*N,那么CU->TU是一定会劈分一次

解码过程,先判断出帧内情况,所以根据PU先判断CU是否劈分了一次,之后再根据深度信息得到TU

对于帧间情况下,之后进行补充

HEVC-I帧中CU,TU,PU之间的关系相关推荐

  1. Python中怎样改变集合之间的关系?

    Python中怎样改变集合之间的关系?数学中,两个集合关系的常见操作包括:交集.并集.差集.补集.设A,B是两个集合,集合关系的操作介绍如下: 交集是指属于集合A且属于集合B的元素所组成的集合, 并集 ...

  2. 一文理清Mybatis中resultType与resultMap之间的关系和使用场景

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 1.概述 Mybatis ORM半自动映射框架对java开发工程师来说应该是必会的框架之一. ...

  3. OpenVX中 graph与node之间的关系,以及在CNN中的定位

    OpenVX中 graph与node之间的关系,以及在CNN中的定位 很多小伙伴都知道,OpenVX是用来处理图像的一组API,核心是kernel函数的实现,OpenVX对于图像处理是调用底层硬件的G ...

  4. (1)三相电机中相电压与线电压之间的关系 (2)电机转速,机器速度,电角速度之间的关系(3)磁链估算和磁场定向的定义

    三相电机中相电压与线电压之间的关系 Ua=1/3(2Uab+Ubc) Ub=1/3(Ubc-Uab) Uc=-1/3(Uab+2Ubc) 电机转速,机械速度,电角速度之间的关系 电角速度=机器速度* ...

  5. java中文件名和类名之间的关系

    在java里,文件名与类名之间的关系,有下面这些约束: Java保存的文件名必须与类名一致 如果文件中只有一个类,文件名必须与类名一致 一个Java文件中只能有一个public类 果文件中不止一个类, ...

  6. android中matrix的单位,Android中canvas和matrix之间的关系是什么?

    我读了这个画布概述: The Canvas class holds the "draw" calls. To draw something, you need 4 basic co ...

  7. 【Android 界面效果10】Android中View,ViewGroup,Window之间的关系

    一.首先说说View和ViewGroup吧 Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的.所有View的子类成为"Widget",所有V ...

  8. PHP 中的类, 对象之间的关系

    最近,看了一篇介绍关于PHP中类与对象关系的文章,感觉对类和对象的理解又加深了一层,这里总结一下: (1):创建一个新的类 class Test{public $class_name = " ...

  9. 计算材料学中的四巨头之间的关系

    第一性原理.密度泛函理论.从头算和分子动力学之间的关系 首先.第一性原理是First Principle,.不是从头算(ab initio),也不是DET,更不是分子动力学. 分子模拟有两个层面的东西 ...

最新文章

  1. 论文Fast and accurate short read alignment with Burrows-Wheeler transform
  2. Jenkins怎么启动和停止服务
  3. python最大分词_python正向最大匹配分词和逆向最大匹配分词的实例
  4. python 学习源
  5. TIANCHI天池-OGeek算法挑战赛-完整方案及代码(亚军)
  6. 010 使用list和tuple
  7. 【文末有福利】如何理解我们所处世界的复杂性?
  8. C#LeetCode刷题-字符串
  9. python文本编码转换_python实现文件批量编码转换及注意事项
  10. HDU 1257 - 最少拦截系统
  11. Microsoft Office 2008 for Mac Service Pack 1 更新后无法启动程序问题解决方案
  12. mathematica 如何在数组中等间隔插入元素
  13. 算法入门—《啊哈算法》读书总结
  14. (九)指向一维数组和二维数组的指针(数组指针)
  15. 如何批量快速提取复制文件夹里所有文件夹名和文件名(包括所有子文件里的所有文件夹名和文件名)详细步骤
  16. WMB系列-消息流中节点监视与MM+的使用注意事项
  17. 关于MySQL加载驱动错误问题。
  18. 宝塔下 nginx 支持图片放缩
  19. BigWorld用到的其他库
  20. MacBook 强制关机的四种方法

热门文章

  1. 利用autossh反向代理实现内网穿透
  2. [摄影写真工作室网站模板]织梦模板+响应式模特艺术展示类网站+自适应手机版
  3. POI 导出excel 注意事项
  4. 拼多多api接口应用示例
  5. 在计算机中将硬盘上的数据复制到u盘上称为,怎样将旧电脑所有数据(包括系统盘数据),全部复制到新电脑上?...
  6. tkinter Canvas 实现 鼠标手绘画板 功能
  7. 推荐一款图表功能强大的可视化报表工具
  8. python拿到股票代码和代码名称等基本信息
  9. java连连看解说_java—连连看-实现消除
  10. python实现面向对象(1)