HEVC熵编码原理解读之transform_tree(一)

HEVC熵编码原理解读之transform_tree(一)

在HEVC中,语法元素按照协议进行编码。本片文章主要介绍HEVC标准的7.3.8.8节transform_tree函数,解释变换单元语法元素中是如何编码的。
图一是这部分的代码。该部分功能是控制残差编码模块transform_unit的开启和编码语法元素:split_transform_flag、cbf_cb、cbf_cb、cbf_luma


图一

transform_tree函数的输入分别是cu块的左上角坐标(x0,y0)、tu的左上角坐标(xBase,yBase)、tu块的log2大小 log2TrafoSize、tu的相对cu的深度trafoDepth和tu块的索引blkIdx。
transform_tree函数被coding_unit函数调用,所以它最开始的输入是由coding_unit函数给的。调用的格式如下:

transform_tree( x0, y0, x0, y0, log2CbSize, 0, 0 );

第一次进入该模块时,log2CbSize对应log2TrafoSize,0对应trafoDepth。因此,我们知道tu所在cu的大小。并且由于trafoDepth等于0,我们可以知道trafoDepth对应的是cu相对tu的深度,而非绝对深度。

1、split_transform_flag:
语法元素split_transform_flag表示tu块是否继续划分tu。该语法元素的编码条件是:
log2TrafoSize <= MaxTbLog2SizeY——条件1
log2TrafoSize > MinTbLog2SizeY——条件2
trafoDepth < MaxTrafoDepth ——条件3
!( IntraSplitFlag && ( trafoDepth = = 0 ) ) ——条件4
只有同时满足条件1~条件4,才满足split_transform_flag的编码条件。
条件1是指6464的cu块可以跳过编码split_transform_flag。因为tu块的大小小于等于32,所以split_transform_flag一定为1。
条件2是指4
4的tu块可以跳过编码split_transform_flag。因为tu块的大小最小为4,所以split_transform_flag一定为0。
条件2是指tu深度不能超过最大tu深度。
条件3是指tu深度等于0并且帧内分割方式等于1的时候,不编码split_transform_flag。

2、cbf_cb和cbf_cr:
首先,ChromaArrayType 是指颜色的采样方式,包括以下三种采样方式:
4:2:0 (ChromaArrayType = 1)
4:2:2 (ChromaArrayType = 2)
4:4:4 ( ChromaArrayType = 3)

语法元素cbf_cb和cbf_cr表示tu块的两个色度块的cbf是否为0,当为0时,表示该cu的色度残差全为0,反之,则不全为0。该语法元素的编码条件我们根据颜色的采样方式来定:
颜色的采样方式为4:4:4时,即 ChromaArrayType = 3,当tu的相对深度为0或者上一层cbf_cb/cbf_cr等于1时,编码cbf_cb/cbf_cr。
颜色的采样方式为4:2:0时,即 ChromaArrayType = 1,当log2TrafoSize大于2,并且tu的相对深度为0或者上一层cbf_cb/cbf_cr等于1时,编码cbf_cb/cbf_cr。
颜色的采样方式为4:2:2时,即 ChromaArrayType = 2,当log2TrafoSize大于2,并且tu的相对深度为0或者上一层cbf_cb等于1时,编码cbf_cb/cbf_cr。进一步地,又当前tu的split_transform_flag等于0或者当前tu的大小为8。需再编一次cbf_cb/cbf_cr。

3、Transform tree的遍历:
紧接着如果该tu需要继续划分tu,即split_transform_flag等于1,则继续遍历4次该函数。按照图2的顺序。

01
23

表一

4、cbf_luma:
若该tu不继续划分,即split_transform_flag等于0,则编码cbf_luma,表示亮度分量的残差是否全为零。当cbf_luma==0时,表示全为0,反之,则不全为零。该语法元素的编码条件为:
cu的预测方式为帧内预测;——条件1
tu的相对深度不为0;——条件2
cbf_cbf等于1;——条件3
cbf_cr等于1;——条件4
当颜色的采样方式为4:2:2时,上一层的cb活cr的cbf为1;——条件5
只要满足以上任何一条件都满足编码cbf_luma的条件。

5、transform_unit:
最后,开启transform_unit的编码,进入残差编码,其输入的格式如下:

 transform_unit( x0, y0, xBase, yBase, log2TrafoSize, trafoDepth, blkIdx );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值