H265 CTU、CU、PU、TU划分的特点及要求

2023-05-16

目录

  • H265 CTU、CU、PU、TU划分的特点及要求
    • 大小及划分模式
    • 常见问题
      • 1、Spec里对于CTU大小的规定在哪?
      • 2、Spec对于TU大小的规定在哪?
      • 3、Spec里对于M/2*M/2的划分方式的规定在哪里?
      • 4、8x4和4x8不支持双向参考的规定在哪?
      • 5、TU划分是如何受PU划分的影响的?TU和PU大小一样吗?
      • 6、在以上情况下,可以突破MinTbLog2SizeY的限制吗?(暂未解决)

H265 CTU、CU、PU、TU划分的特点及要求

以下的size特指luma块的大小,min_cu_size 默认情况下= 8。

大小及划分模式

CTU size:16x16,32x32,64x64
CU size:8x8,16x16,32x32,64x64
PU size
设CU size = MxM
Intra PU:M/2 * M/2 (only when CU size reaches min_cu_size),MxM
Inter PU:支持8种划分模式
在这里插入图片描述

Iinter PU的限制

  • The splitting into four PBs is allowed only when the CB size is equal
    to the minimum allowed CB size (只有CB为最小的CB时才可以分成4个PB,由下文得知而且只有CB
    大于8时才允许继续成4个PB)
  • The lower four partition types are only allowed when M is 16 or
    larger for luma. (spec: If log2CbSize is greater than MinCbLog2SizeY
    and amp_enabled_flag is equal to 1)
  • PBs of luma size 4×4 are not allowed for interpicture prediction, and
    PBs of luma sizes 4×8 and 8×4 are restricted to unipredictive
    coding.(帧间预测模式下,4x4的PB不允许,4×8 and 8×4只允许在单向预测模式下)

TU size
4x4,8x8, 16x16, 32x32
当CB大于最大TB时,隐含表示该CB需要做进一步的分隔;当CB继续分隔会小于最小TB时,隐含表示该CB不会继续作分隔。在正常范围内且划分深度小于最大划分深度时,都可选择继续划分或不划分。最大划分深度由encoder写在sps中,允许范围为[0,CtbLog2SizeY − MinTbLog2SizeY]。
此外,根据inter/intra PU的划分方式,TU存在默认划分机制(见后文中的记录),TU必须等于或小于intra PU,但可以跨越inter PU边界。

常见问题

1、Spec里对于CTU大小的规定在哪?

在“附录A Profiles, tiers and levels”中,如
Main Profile
CtbLog2SizeY derived according to active SPSs for the base layer shall be in the range of 4 to 6, inclusive.

2、Spec对于TU大小的规定在哪?

7.4.3.2.1 General sequence parameter set RBSP semantics
log2_diff_max_min_luma_transform_block_size
The variable MaxTbLog2SizeY is set equal to log2_min_luma_transform_block_size_minus2 + 2 + log2_diff_max_min_luma_transform_block_size.
The CVS shall not contain data that result in MaxTbLog2SizeY greater than Min( CtbLog2SizeY, 5 ).

3、Spec里对于M/2*M/2的划分方式的规定在哪里?

syntax的解析过程有:
在这里插入图片描述
When part_mode is not present, the variables PartMode and IntraSplitFlag are derived as follows:
– PartMode is set equal to PART_2Nx2N.
– IntraSplitFlag is set equal to 0.
所以当intra,而且不是最小CB时,part_mode不存在,则默认不进行划分。Inter时,spec对其取值有限制。
The value of part_mode is restricted as follows:
– If CuPredMode[ x0 ][ y0 ] is equal to MODE_INTRA, part_mode shall be equal to 0 or 1.
– Otherwise (CuPredMode[ x0 ][ y0 ] is equal to MODE_INTER), the following applies:
– If log2CbSize is greater than MinCbLog2SizeY and amp_enabled_flag is equal to 1, part_mode shall be in the range of 0 to 2, inclusive, or in the range of 4 to 7, inclusive.
– Otherwise, if log2CbSize is greater than MinCbLog2SizeY and amp_enabled_flag is equal to 0, or log2CbSize is equal to 3, part_mode shall be in the range of 0 to 2, inclusive.
– Otherwise (log2CbSize is greater than 3 and equal to MinCbLog2SizeY), the value of part_mode shall be in the range of 0 to 3, inclusive.
下表为part_mode和IntraSplitFlag的意义
part_mode和IntraSplitFlag的意义

4、8x4和4x8不支持双向参考的规定在哪?

在这里插入图片描述

5、TU划分是如何受PU划分的影响的?TU和PU大小一样吗?

rqt_root_cbf equal to 1 specifies that the transform_tree( ) syntax structure is present for the current coding unit.
rqt_root_cbf equal to 0 specifies that the transform_tree( ) syntax structure is not present for the current coding unit.
When rqt_root_cbf is not present, its value is inferred to be equal to 1.
在这里插入图片描述

只有当intra为最小CB时,IntraSplitFlag才有可能等于1,此时MaxTrafoDepth = max_transform_hierarchy_depth_intra+1,允许TU的划分更进一步。

在这里插入图片描述

split_transform_flag表示一个block是否要分成等分的4个小块,当split_transform_flag不存在时,按如下方式取值:
When split_transform_flag[ x0 ][ y0 ][ trafoDepth ] is not present, it is inferred as follows:
– If one or more of the following conditions are true, the value of split_transform_flag[ x0 ][ y0 ][ trafoDepth ] is
inferred to be equal to 1:
– log2TrafoSize is greater than MaxTbLog2SizeY.
– IntraSplitFlag is equal to 1 and trafoDepth is equal to 0.
– interSplitFlag is equal to 1.
– Otherwise, the value of split_transform_flag[ x0 ][ y0 ][ trafoDepth ] is inferred to be equal to 0.

The variable interSplitFlag is derived as follows:
– If max_transform_hierarchy_depth_inter is equal to 0 and CuPredMode[ x0 ][ y0 ] is equal to MODE_INTER and PartMode is not equal to PART_2Nx2N and trafoDepth is equal to 0, interSplitFlag is set equal to 1.
– Otherwise, interSplitFlag is set equal to 0.

所以不考虑MaxTbLog2SizeY和MinTbLog2SizeY的影响下
对于inter的CU来讲,如果max_transform_hierarchy_depth_inter=0,split_transform_flag不存在,它的值如下决定:
inter PART_NxN时,TU被自动划分一次,因为到下一层split_transform_flag仍然不存在,就只能取为0,在这种情况下TU和PU的划分完全一致。
inter PART_2Nx2N,TU不被划分,TU和PU的划分也完全一致。
其他inter PU划分方式下,TU被自动划分一次,但与PU大小不一致。
但是若max_transform_hierarchy_depth_inter!=0,则没有这个限制。
对于intra的情况,如果PU划分,IntraSplitFlag=1,在第一层时,split_transform_flag不存在直接被取为1,所以会自动划分。但是下一层时,好像split_transform_flag就可以存在了。
如果PU不划分,IntraSplitFlag=0,那好像split_transform_flag是可以存在的。
所以对于intra的情况,TU只能比PU相等或更小,也不一定完全一致。为什么TU不能跨越Intra PU呢?因为此时帧内预测需要相邻块的重建像素值作为参考,若相邻块和当前一起作transform,这个条件是无法满足的。
既然对于inter,不考虑max_transform_hierarchy_depth_inter的影响,为什么对于intra,需要给max_transform_hierarchy_depth_intra加上IntraSplitFlag呢?这两种情况下执行原因不同,inter时,TU可以跨越PU的边界,为了防止PU边界上的不连续性影响压缩性能,倾向于在CU继续下分PU的情况下把TU也做下分,但是这是split_transform_flag不存在时才会有的行为,此时TU最多下分一层,当然也可以encoder通过split_transform_flag明确指出不分或继续下分很多层。intra的TU要求比PU要小,不存在TU跨越多个intra PU的情况,可能是为了在某些特殊情况下达到细分的效果,允许intra TU比max_transform_hierarchy_depth_intra再多分一层。
IntraSplitFlag只在CU = min_cb_size时才为1,默认情况下min_cb_size=8,此时TU分一层就到4x4了,最多也只分一层。

6、在以上情况下,可以突破MinTbLog2SizeY的限制吗?(暂未解决)

如果MinTbLog2SizeY=MinCbLog2SizeY,如果IntraSplitFlag或interSplitFlag为1,那按上面的逻辑,split_transform_flag会被取为1的。
可是HEVC overview1那篇文章中说:Not splitting is implicit when splitting would result in a luma TB size smaller than the indicated minimum.
看起来TU不应该比MinTbLog2SizeY还要小的。
问题出在哪儿了?

看了好几个资料,也没有找到答案,分析一下HM的代码,要看decoder:

相关参数:
getQuadtreeTUMaxDepthInter
getQuadtreeTUMaxDepthIntra
getQuadtreeTULog2MinSize
getQuadtreeTULog2MaxSize

代码
getQuadtreeTULog2MinSizeInCU()

  if (log2CbSize < (m_pcSlice->getSPS()->getQuadtreeTULog2MinSize() + quadtreeTUMaxDepth - 1 + interSplitFlag + intraSplitFlag) )
  {
    // when fully making use of signaled TUMaxDepth + inter/intraSplitFlag, resulting luma TB size is < QuadtreeTULog2MinSize
    log2MinTUSizeInCU = m_pcSlice->getSPS()->getQuadtreeTULog2MinSize();
  }

TDecEntropy::xDecodeTransform ()

  if( pcCU->isIntra(uiAbsPartIdx) && pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_NxN && uiDepth == pcCU->getDepth(uiAbsPartIdx) )
  {
    uiSubdiv = 1;
  }
  else if( (pcCU->getSlice()->getSPS()->getQuadtreeTUMaxDepthInter() == 1) && (pcCU->isInter(uiAbsPartIdx)) && ( pcCU->getPartitionSize(uiAbsPartIdx) != SIZE_2Nx2N ) && (uiDepth == pcCU->getDepth(uiAbsPartIdx)) )
  {
    uiSubdiv = (uiLog2TrafoSize >quadtreeTULog2MinSizeInCU);
  }
  else if( uiLog2TrafoSize > pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() )
  {
    uiSubdiv = 1;
  }
  else if( uiLog2TrafoSize == pcCU->getSlice()->getSPS()->getQuadtreeTULog2MinSize() )
  {
    uiSubdiv = 0;
  }
  else if( uiLog2TrafoSize == quadtreeTULog2MinSizeInCU )
  {
    uiSubdiv = 0;
  }
  else
  {
    assert( uiLog2TrafoSize > quadtreeTULog2MinSizeInCU );
    m_pcEntropyDecoderIf->parseTransformSubdivFlag( uiSubdiv, 5 - uiLog2TrafoSize );
  }

这好像是intra情况下tu可以小于MinTbLog2SizeY,但是inter不可以。
Hm把spec中的逻辑改写了好多,包括有些参数的意义也有所改动,比如这里的pcCU->getSlice()->getSPS()->getQuadtreeTUMaxDepthInter(),其写入时加过1,所以要在等于1时判断inter是否需要默认划分,不太好理解。

  READ_UVLC_CHK( uiCode, "max_transform_hierarchy_depth_inter", 0, ctbLog2SizeY - minTbLog2SizeY);    pcSPS->setQuadtreeTUMaxDepthInter( uiCode+1 );
  READ_UVLC_CHK( uiCode, "max_transform_hierarchy_depth_intra", 0, ctbLog2SizeY - minTbLog2SizeY);    pcSPS->setQuadtreeTUMaxDepthIntra( uiCode+1 );

Ffmpeg就是跟spec里的逻辑完全保持一致

    if (log2_trafo_size <= s->ps.sps->log2_max_trafo_size &&
        log2_trafo_size >  s->ps.sps->log2_min_tb_size    &&
        trafo_depth     < lc->cu.max_trafo_depth       &&
        !(lc->cu.intra_split_flag && trafo_depth == 0)) {
        split_transform_flag = ff_hevc_split_transform_flag_decode(s, log2_trafo_size);
    } else {
        int inter_split = s->ps.sps->max_transform_hierarchy_depth_inter == 0 &&
                          lc->cu.pred_mode == MODE_INTER &&
                          lc->cu.part_mode != PART_2Nx2N &&
                          trafo_depth == 0;

        split_transform_flag = log2_trafo_size > s->ps.sps->log2_max_trafo_size ||
                               (lc->cu.intra_split_flag && trafo_depth == 0) ||
                               inter_split;
    }

但是后面的操作中,用log2_min_tu_size做数组寻址,如果TU比min tb小就会有问题了:

        int min_tu_size      = 1 << s->ps.sps->log2_min_tb_size;
        int log2_min_tu_size = s->ps.sps->log2_min_tb_size;// TODO: store cbf_luma somewhere else
        if (cbf_luma) {
            int i, j;
            for (i = 0; i < (1 << log2_trafo_size); i += min_tu_size)
                for (j = 0; j < (1 << log2_trafo_size); j += min_tu_size) {
                    int x_tu = (x0 + j) >> log2_min_tu_size;
                    int y_tu = (y0 + i) >> log2_min_tu_size;
                    s->cbf_luma[y_tu * min_tu_width + x_tu] = 1;
                }
        }

android下的hevc decoder libhevc的处理逻辑也与spec基本一致。
为什么??


  1. [1]. Sullivan, G.J., et al., Overview of the high efficiency video coding (HEVC) standard. IEEE Transactions on circuits and systems for video technology, 2012. 22(12): p. 1649-1668. ↩︎

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

H265 CTU、CU、PU、TU划分的特点及要求 的相关文章

  • Linux下开启和禁用触摸板-转

    本文转自 xff1a https blog csdn net junmuzi article details 38491093 感谢原作者分享 电脑型号 xff1a DELL G3 操作系统 xff1a Linux 16 04 LTS 打开
  • function declared implicitly的正确解决方法

    使用GUIBuilder创建了两个 c文件 xff0c 需要在其中一个文件中调用另一个文件的函数 xff0c 他们初始只有 include DIALOG h xff0c 在编译只有一个警告 xff0c declared implicitly
  • Jetson TX2物理引脚与虚拟引脚映射计算

    Data 2017 11 17 Author cjh Theme Jetson TX2物理引脚与虚拟引脚映射计算 最近需要控制Jetson TX2 J21那一排的引脚 xff0c 发现其规律和TX2相距甚远 xff0c 网上NVIDIA的论
  • SVN

    转自 http blog csdn net gexiaobaohelloworld article details 7752862 SVN简介 SVN xff08 Subversion xff09 是一个自由 开源的项目源代码版本控制工具
  • svn使用的适用技巧

    关于SVN的使用 xff0c 这里整理两个重要的问题 xff1a 1 svn不能commit so 2 34 a 34 等库文件 xff1a svn add 还是 svn st 均查看不到想要提交的 so 文件 后来才知道原来是配置文件出了
  • calico更换ip地址池-k8s

    注意 xff1a 生产环境更换ip地址池会导致网络中断 xff0c 请慎重 在Kubernetes中 xff0c 以下所有三个参数必须等于或包含Calico IP池CIDR xff1a kube apiserver xff1a pod ne
  • Centos 7安装GNOME桌面环境

    第一步 xff1a 列出可安装的桌面环境 span class token punctuation span root 64 local span class token punctuation span span class token
  • Linux anaconda3 安装python版zeroc-ice 3.7.3报 undefined symbol: SSLeay

    原因 xff1a linux通过 pip install zeroc ice 61 61 3 7 3时会从源文件重新编译一个二进制版本 xff0c windows与macos不会重新编译 编译过程依赖openssl 但是centos7版本的
  • npm install提示没有权限

    npm install unsafe perm 61 true allow root
  • mysql排序后分页出现的数据混乱

    原因 xff1a 排序的字段值不唯一 xff0c 值相同时排序顺序不固定 解决方法 xff1a 增加排序字段改用值唯一的字段排序
  • Ubuntu安装mysql,修改数据存储目录

    1 创建目录并修改目录权限 mkdir home abc data chown R mysql mysql home abc data 2 修改mysql配置文件 etc mysql my cnf xff0c 增加以下配置 mysqld d
  • 获取CAS全部配置说明

    直接下载 xff1a CAS Server全部配置详解 通过cas bootadmin获取 通过CAS Initializr获取模块cas bootadmin server overlay curl http localhost 8080
  • SpringBoot配置SSL(https)

    生成证书 keytool genkey alias cas keyalg RSA validity 999 keysize 2048 storetype PKCS12 keypass aaaaaa storepass aaaaaa keys
  • 2018年秋招面经

    Data 2017 10 30 Author cjh 一不小心秋招都结束了 xff0c 趁还有些印象 xff0c 留下点东西造福大众 秋招一般聚集在9月初到10月底 xff0c 大公司快的有些8月中旬就开始了 xff0c 所以大家要把握时间
  • CAS Client部署

    参考内容 官方参考文档 xff1a Java Cas Client Cas Server部署参考 CAS Server部署 xff0c 基于版本6 6 4 修改配置 添加依赖 lt dependency gt lt groupId gt o
  • Python机器学习:train_test_split()划分数据集

    调用sklearn里面的model selection包的train test split 函数可以一行代码划分好数据集 包名 xff1a from sklearn model selection import train test spl
  • 安装Python3.8.10和ssh连接

    xff01 xff01 xff01 xff01 制作镜像之前防火墙要关掉 xff08 必须要关的 xff09 systemctl stop ufw span class token punctuation span service syst
  • WebSSH安装和开机自启设置

    一 安装 apt install nfs span class token punctuation span common WebSSH 要求 Python2 7 或 3 4 43 如果有 Python 环境 xff0c 可以使用 pip
  • novnc安装和开机自启设置

    一 安装和使用novnc 1 下载noNVC span class token function git span clone https github com novnc noVNC git 2 创建安装连接 VNC的默认会话不是安全的
  • vnc安装和开机自启设置

    一 安装VNC 键入以下命令以在 Ubuntu 服务器上安装 TigerVNC xff1a sudo apt install tigervnc standalone server tigervnc common 现在安装了 VNC 服务器

随机推荐

  • 研究生如何发表论文必读

    研究生如何发表论文必读 这是一个一年三篇IF大于7的牛人当我问到他怎么这么强的时候 xff0c 他给我他在网上总结发文章的秘笈 看了实在是心中有一种感觉 xff0c 特奉献出来 一 研究生必备四本 俗话说好记性不如烂笔头 xff0c 所以一
  • Debian Linux进入不了图形界面的折腾

    首先我的操作系统是Debian Linux xff0c 我Debian用的是Xfce桌面环境 xff0c 昨天我用了命令apt get install gnome 安装了一堆软件之后重启 xff0c 就进入不了图形界面了 xff0c 只能进
  • ROS与matlab进行通讯—保姆级教程

    话不多说 xff0c 直接来进行配置 xff1a 所用软件 xff1a windows10下matlab2018b和同一台 电脑上虚拟机 virtubalbox上的Ubuntu melodic 18 04版本 第一步 xff1a 将虚拟机网
  • stm32蜂鸣器实验

    硬件连接 xff1a 提示 xff1a 不能通过IO口直接驱动大功率器件 实验步骤 xff1a 使能IO口时钟 调用RCC APB2PeriphColckCmd 初始化IO口模式 调用函数BEEP Init 操作IO口 xff0c 输出高低
  • samba源码安装

    Data 2017 11 30 Author cjh Theme samba源码安装 最近在玩TI的AM5728开发板 xff0c 采用交叉编译 xff0c 在使用nfs挂在确实有些不习惯 xff0c 所以最后还是忍不住在上面安装了samb
  • vscode使用

    VScode自动调整格式 Shift 43 Alt 43 F 简书 jianshu com vscode 设置 tab 为四个空格 abbcccdde的博客 CSDN博客 vscode设置tab为4个空格 生产力 VSCode必备插件 C
  • Ubuntu使用apt-get安装本地deb包

    Ubuntu使用apt get安装本地deb包 milantgh 博客园
  • 随遇而安也是一种选择

    随遇而安也是一种选择 故事的开头都是相似的 xff0c 故事的结尾各有各的传奇 xff0c 各有各的平凡 题记 高中的岁月总是让人难忘的 xff0c 菁菁岁月中的庆阳一中 xff0c 充满了书生意气的神采飞扬 xff0c 恩师与同窗 xff
  • OFDPA软件概述

    OFDPA软件概述 OF DPA xff08 openflow data plane abstraction xff09 是一个应用软件组件 实现了 openflow与broadcom SDK间适配层的功能 OF DPA在broadcom交
  • freertos和ucos的区别

    一 freeRTOS比uCOS II优胜的地方 xff1a 1 内核ROM和耗费RAM都比uCOS 小 xff0c 特别是RAM 这在单片机里面是稀缺资源 xff0c uCOS至少要5K以上 xff0c 而freeOS用2 3K也可以跑的很
  • wget和curl中使用代理

    命令使用代理 wget curl 都支持使用代理 wget e http proxy 61 10 1 4 43 8080 proxy mimvp com curl x 10 1 4 43 8080 proxy mimvp com 环境变量使
  • SQL 触发器与WebApi回执

    1 需求数据库表添加 xff0c 修改 xff0c 删除数据 xff0c 触发器生效 xff0c 推送数据数据到WCF接口 a 创建WCF服务 xff0c 发布服务 b 启用数据库CLR功能 xff0c 默认是关闭状态 EXEC sp co
  • inelliJ IDEA注册码

    http idea lanyus com
  • 正则表达式之?、(?:pattern)、(?!pattern)、(?=pattern)理解及应用

    今天朋友问我一个问题 xff0c 是这样子的 xff0c 通过正则表达式匹配html标签input包含hidden的字符串 xff0c 具体如下 xff1a 34 lt input type 61 34 hidden 34 id 61 34
  • cmake源码安装

    Data 2017 12 1 Author cjh Theme cmake源码安装 在玩TI AM5728时 xff0c 要用到cmake编译程序 xff0c 无奈开发板又不能用apt get只好自己源码安装了 cmake源码下载 解压源码
  • Ubuntu下逻辑坏道解决方案

    一 逻辑坏道修复方法 逻辑坏道 服务器硬盘相比其他部件是较容易坏的 xff0c 如突然断电 大量频繁写入都会加速硬盘的老化 xff0c 下面介绍一些判断硬盘状况和修复的方法 发现硬盘坏道 dmesg 当有硬盘坏道时 xff0c 通常在dme
  • 解决本地无法ssh连接ubuntu虚拟机

    1 保证双方都能互相ping通 本地 Windows 查看ip xff1a ipconfig ubuntu虚拟机查看ip span class token function ifconfig span 2 保证ubuntu虚拟机安装了ssh
  • 70、在js中为什么0.1+0.2不等于0.3

    并不是所有小数都可以用 完整 的二进制来表示的 xff0c 比如十进制 0 1 在转换成二进制小数的时候 xff0c 是一串无限循环的二进制数 xff0c 计算机是无法表达无限循环的二进制数的 xff0c 毕竟计算机的资源是有限 因此 xf
  • Outlook 2013/2016 显示“正在启动...“ 无法进入Outlook的解决方案

    因上次非正常关闭 xff0c 导致Outlook 2016启动时 xff0c 一直处于启动界面 xff0c 无法进入主界面正常工作 刚开始Outlook 2016启动界面显示的是 34 正在处理 34 查询网上各种方法 xff0c 安全启动
  • H265 CTU、CU、PU、TU划分的特点及要求

    目录 H265 CTU CU PU TU划分的特点及要求大小及划分模式常见问题1 Spec里对于CTU大小的规定在哪 xff1f 2 Spec对于TU大小的规定在哪 xff1f 3 Spec里对于M 2 M 2的划分方式的规定在哪里 xff