关于H264标准中变换与量化的理解

来源:互联网 发布:淘宝美工招聘要求 编辑:程序博客网 时间:2024/06/12 12:04

变换与量化

王超  2010.12.20

1. 相关变量

Sequence Parameter Sets(SPS)  序列参数集

Picture Parameter Sets(PPS)  图像参数集

(CodedBlockPattern)CBP 当前块的编码模式coded_block_pattern

指亮度和色度分量的各小块的残差的编码模式,所谓编码模式有以下几种:

a) 所有残差(包括DC、AC)都编码

b) 只对DC系数编码

c) 所有残差(包括DC、AC)都不编码

predL 宏块中像素的亮度预测值

predC 宏块中的色度预测样点值

QPY 亮度量化参数

QPC 每个色度分量Cb和Cr的色度量化参数。

 

SubWidthC 、SubHeigthC 在chroma_format_idc = 1(也就是4:2:0)时,为2。对应的MbHeigthC、MbWidthC为8。

 

Floor(x)函数

其功能是“下取整”,或者说“向下舍入”,即取不大于x的最大整数。

Round(x)函数

其功能采用“银行家舍入”算法,即四舍五入取偶。详细地说是这样,四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍去,五前为奇要进一。

2. 变换与量化的简介

离散余弦变换(DCT)是N.Ahmed等人在1974年提出的正交变换方法。它常被认为是对语音和图像信号进行变换的最佳方法。在视频压缩中,最常用的变换方法是DCT,DCT被认为是性能接近K-L变换的准最佳变换

变换编码的主要特点有:

1) 在变换域里视频图像要比空间域里简单。

2) 视频图像的相关性明显下降,信号的能量主要集中在少数几个变换系数上,采用量化和熵编码可有效地压缩其数据。

3) 具有较强的抗干扰能力,传输过程中的误码对图像质量的影响远小于预测编码。通常,对高质量的图像,DMCP要求信道误码率 ,而变换编码仅要求信道误码率。DCT等变换有快速算法,能实现实时视频压缩。针对目前采用的帧内编码加运动补偿的视频压缩方法的不足, 我们在Westwater 等人提出三维视频编码的基础上, 将三维变换的结构应用于视频图像压缩, 进一步实现了新的视频图像序列的编码方法。

量化是在不降低视觉效果的前提下减少图像编码长度,减少视觉恢复中不必要的信息。H264采用标量量化技术,它将每个图像样点编码映射成较小的数值。一般标量量化器的原理为:FQ = round(y/Qstep)。其中,y为输入样本点编码,Qstep为量化步长,FQ为y的量化值。其相反过程即反量化为:y' = FQ ·Qstep

3. 解码中变换与量化的流程

解码器端,码流首先经过熵解码然后根据NxN(N取4/8/16)预测模式来选择如何组织系数列表。再经过反向变换系数扫描将系数变换成二维数组,便于进行反量化和反DCT变换。得出的残差值与帧内或帧间预测得到的预测样点值相加,得到图像滤波前的重建样点值。具体流程如图3.1所示。

3.1 从码流数据到残差值过程

不同的预测模式下,LumaLevel列表和之后的逆变换都有所不同,但整体流程不变。图2.1示例的是4x4亮度块变换解码过程。

3.1. LumaLevel列表的解析

— 如果MbPartPredMode( mb_type, 0 ) 等于Intra_16x16变换系数幅值被解析成Intra16x16DCLevel列表和16个Intra16x16ACLevel[ i ]列表。Intra16x16DCLevel包含16级用于每个4x4亮度块的DC的变换系数幅值。对16个索引值为i=0..15的4x4亮度块中的每一个亮度块,第i个块的15个AC变换系数幅值被解析成第i个列表Intra16x16ACLevel[ i ]。

解析

MbPartPredMode( mb_type, 0 ) 等于Intra_16x16,进行16x16为单位解码。对于每个4x4亮度块,经过编码后的系数分为1个DC系数+15个AC系数,所以Intra16x16DCLevel应为Intra16x16DCLevel[ 16 ]Intra16x16ACLevel应为Intra16x16ACLevel[ 16 ][ 15 ]二维数组。

 

— 否则(MbPartPredMode( mb_type, 0 )不等于Intra_16x16),应用如下规则:

— 如果transform_size_8x8_flag等于0,对16个序号值为i=0..15的4x4亮度块中的每一个亮度块,第i个块的16级变换系数幅值被解析成第i个列表LumaLevel[ i ]。

解析

transform_size_8x8_flag = 0,则进行以4x4子块为单位的解码。16x16块一共有16个4x4块,列表LumaLevel[ i ]为二维数组,代表第i个块的幅值起始地址LumaLevel[ i ]LumaLevel[ 16 ][ 16 ]

— 否则(transform_size_8x8_flag等于1),对4个序号值为i=0..3的8x8亮度块中的每一个亮度块,应用如下规则:

— 如果entropy_coding_mode_flag等于0,首先,对每个序号为i4x4 = 0..3的4个4x4亮度块中的每一个亮度块,第i4x4个块的16级变换系数幅值被解析成第(i8x8 * 4 + i4x4)个列表LumaLevel[ i8x8 * 4 + i4x4 ]。其次,序号值为4 * i + i4x4的第i8x8个亮度块的64级变换系数幅值(其中i = 0..15,i4x4 = 0..3)可以从公式LumaLevel8x8[ i8x8 ][ 4 * i + i4x4 ] = LumaLevel[ i8x8 * 4 + i4x4 ][ i ]得到。

解析

transform_size_8x8_flag = 1 && entropy_coding_mode_flag = 0,表示进行两级索引进行解码。先进行8x8块索引然后再进行4x4块索引。

i4x4  每个8x8块中一共有4个4x4块,i4x4就表示这4个4x4块的序号。为什么说第i4x4个块的16级变换系数幅值,是因为在整个16x16块中一共有16个4x4块,针对LumaLevel[ i8x8 * 4 + i4x4 ]来说。

i8x 每个16x16块中一共有6个8x8块,i8x8就表示这4个8x8块的序号。

LumaLevel[ i8x8 * 4 + i4x4 ]是个二维数组,索引到16x16块中第多少个4x4块,例如图1.8.1,LumaLevel8x8[ i8x8 ][ 4 * i + i4x4 ] = LumaLevel[ i8x8 * 4 + i4x4 ][ i ]解释成

LumaLevel8x8[ 1 ][ 4 * i + 3 ] = LumaLevel[ 7 ][ i ]

 

 

                                

                                图3.2 16x16宏块图解

 

注 — 假定luma4x4BlkIdx = i8x8 * 4 + i4x4(其中包含偏移量为i4x4的相应的第i8x88x8亮度块的每一个四阶变换系数幅值)的4x4亮度块代表由6.4.3小节中的逆向4x4亮度块扫描过程给出的空间位置。

— 否则(entropy_coding_mode_flag等于1),第i8x8个块的64级变换系数幅值被解析成第i8x8个列表LumaLevel8x8[ i8x8 ]。

解析

transform_size_8x8_flag = 1 && entropy_coding_mode_flag = 1,只进行8x8块索引,一共有4个8x8块,列表则为LumaLevel8x8[ 4 ][ 64]

 

— 对每一个序号值为iCbCr = 0..1的色度分量,4x4色度块的4个DC变换系数幅值被解析成第iCbCr个列表ChromaDCLevel[ iCbCr ]。

— 对每一个色度分量(序号值为iCbCr = 0..1)的4x4色度块(序号值为i4x4 = 0..315 级AC变换系数幅值被解析成第iCbCr 个色度分量的第i4x4个列表ChromaACLevel[ iCbCr ][ i4x4 ]。

3.2. 变换系数的反扫描过程

本过程的输入是一个16个值的列表。

本过程的输出是一个变量c,它包含一个4x4 值的2 维数组。在变换系数的情况中,这些4x4 值代表变换块中分配给位置的幅值。在把反扫描过程应用到一个缩放列表的时候,输出变量c 包含一个2 维数组,该数组代表一个4x4缩放矩阵。

用于变换系数的反扫描过程把变换系数幅值的顺序映射到变换系数幅值位置。表 8-13 定义了两种映射方式:反Z 型扫描以及反域扫描。反Z 型应该用在帧宏块中的变换系数上,而反域扫描应该用在域宏块的变换系数上。

用于缩放列表的反扫描过程将缩放列表条目的顺序映射到相应的缩放矩阵中的位置。对于该映射,应该采用反Z型扫描。

3.3 给出了这个扫描的情况。

图3.3 4x4块扫描 (a)Z型扫描(b)域扫描

3.1提供16元素的输列表中的idx2数组cij映射

表3.1 对用在Z型以及域扫描的从idx到cij的映射的规范

 

3.3. LumaLevel列表到二维数组

上一步我们得到了LumaLevel列表,接下来需要将LumaLevel列表依次转换成二维数组进行处理。根据数据的不同,二维数组的大小也有所不同。如4x4残差块处理,二维数组则是4x4,8x8残差块,二维数组变成8x8。以图3.2中为例,来说明LumaLevel列表如何转换成二维数组Cij的。

当为4x4残差块的变换解码时,transform_size_8x8_flag = 0,LumaLevel列表被解析成LumaLevel[16][16],也就是说,LumaLevel列表到Cij转换需要循环进行16次。每次的转换依照3.2节中用于变换系数的反扫描过程进行。

 

3.4. 得到残差值

LumaLevel列表解析完之后,经过反向系数扫描得到二维数组,需要做变换解码才能得到残差值,不同的LumaLevel列表导致了之后进行的变换解码也有所区别。这一部分对照图3.4来说明(8.5.1至8.5.4)。

3.4 残差流程图

 

4. CBP详解

cbp一共6bit,高2bit表示cbpc(2:cb、cr中至少一个4x4块的AC系数不全为0;1:cb、cr中至少一个2x2的DC系数不全为0;0:所有色度系数全0)。

低4bit分别表示4个8x8亮度块,其中从最低一位开始的4位分别对应00,10,01,11位置的8*8亮度块。如果某位为1,表示该对应8*8块的4个4*4块中至少有一个的系数不全为0。

ICBPTAB[0] = 0  (00 0000)表示既没有亮度系数,也没有色差系数

ICBPTAB[1] = 16 (01 0000)表示没有亮度系数,有色差直流系数(没有交流系数)

ICBPTAB[2] = 32 (10 0000)表示没有亮度系数,有色差交流系数(可能含有直流系数)

ICBPTAB[3] = 15 (00 1111)表示有亮度系数,没有色差系数

ICBPTAB[4] = 31 (01 1111)表示有亮度系数,有色差直流系数(没有交流系数)

ICBPTAB[5] = 47 (10 1111)表示有亮度系数,有色差交流系数(可能含有直流系数)

 

0 < Cbp <= 15   有亮度,无色度

Cbp = 16        无亮度,有色度DC

16 < Cbp < 31   有亮度,有色度DC

Cbp = 32        无亮度,有色度AC

32 < Cbp <= 47  有亮度,有色度AC

所以在JM86代码中会有 if(cbp > 15)和 if(cbp > 31)这样的判断。

原创粉丝点击