本申请要求于2012年10月3日提交的临时申请序号61/709,316以及于2013年2月14日提交的临时申请序号61/764,807的优先权,这两个申请的全文通过引用结合于此。
具体实施方式
图1示出了源150通过通信链路154与接收器152通信的一个实例架构100。源150或接收器152可以存在于操控图像数据的任意装置内,例如,DVD或蓝光播放器、智能电话、平板电脑或任意其他装置。源150可以包括保持虚拟缓冲器114的编码器104。接收器152可以包括解码器106、存储器108以及显示器110。编码器104接收源数据112(例如,源图像数据),并且可以保持预定容量的虚拟缓冲器114,以模制或模拟临时储存压缩输出数据的物理缓冲器。编码器104还可以评估编码符号,以通过预定的比特率进行传输。编码器104可以指定比特率,仅举两例,以每个像素的比特为单位或者以每个时间单位的比特为单位。
例如,通过保持用于编码的比特数减去输出的比特数的累计计数,编码器104可以确定比特率。虽然编码器104可以在将编码数据116传输给存储器108之前,使用虚拟缓冲器114来模制数据的缓冲,但是预定容量的虚拟缓冲器和输出比特率不必等于编码器内的任何缓冲器的实际容量或者实际输出比特率。而且,编码器104可以响应于虚拟缓冲器的充溢度或空虚度,调整用于编码的量化步长。下面,描述示例性编码器104和编码器104的操作。
解码器106可以从存储器108中获得编码数据116。而且,解码器106可以确定预定的虚拟缓冲器的容量和比特率,并且可以确定编码器104用于编码该编码数据116的量化步长。在解码器106将编码数据116解码时,解码器106还可以确定虚拟缓冲器114的充溢度或空虚度,并且调整用于解码的量化步长。即,解码器106可以跟踪编码器104的操作,并且确定编码器104所使用的量化步长。解码器106对编码数据116解码,并且将视频数据118提供给显示器110。在一些实施方式中,在编码数据116内没有量化步长,节省了大量带宽。下面描述解码器106和编码器104的实例及其操作。
存储器108可以实施为静态随机存取存储器(SRAM)、动态RAM(DRAM)、固态驱动器(SSD)、硬盘或其他类型的存储器。显示链路154可以是无线或有线连接或有线和无线连接的组合。编码器104、解码器106、存储器108以及显示器110可以存在于单个装置(例如,智能电话)内。或者,编码器104、解码器106、存储器108以及显示器110的任意子集可以存在于给定的装置内。例如,蓝光播放器可以包括解码器106和存储器108,并且显示器110可以是与蓝光播放器进行通信的分体显示器。
图2示出了编码器200的实例。编码器200对视频数据202编码。例如,视频数据202可以采用一系列连续帧202,…,202-x的形式。帧202,…,202-x可以采用像素分量的二维矩阵的形式,可以在任意颜色空间内表示该形式,例如,红/绿/蓝(RGB)、YUV、亮度Y/色度蓝色Cb/色度红色Cr(YCbCr)、亮度Y/色度橙色/色度绿色(YCoCg)、α、红色、绿色、蓝色(ARGB)或其他颜色空间。每个像素分量可以与空间位置对应。虽然矩阵可以重叠,以形成图片,但是在矩阵内的每个像素分量不必与在其他矩阵内的像素分量共同定位。
可以使用包括预定数量的比特(例如,每个像素分量具有8、10或12比特)的值,编码每个像素分量。作为实例,编码可以使用10比特YCbCr4:2:2、8比特YCbCr 4:2:2、10比特YCbCr 4:4:4、8比特YCbCr 4:4:4、8比特ARGB 32或8比特RGB 24编码。编码器200可以按照光栅扫描顺序接收帧的像素分量:从左到右、从上到下。在某些实现方式中,视频编码器200可以以预定速率接收像素分量。预定速率可以与每秒显示速率的实时帧对应。
视频编码器200可以包括输入、预测器&量化器204、映射和可变长度编码器(VLC)206、速率控制器208、速率缓冲器210以及存储器(例如,DRAM)212。视频编码器200接收和编码像素分量。虽然表示进入视频编码器200内的像素分量的比特数可以恒定(每个像素分量),但是表示每个编码的像素的比特数可以显著改变。编码器200可以通过减小量化步长来增大表示编码像素的比特数,或者通过增加量化步长来减少比特数。
输入、预测器&量化器204预测并且量化像素分量,产生量化残差。在某些实现方式中,输入、预测器&量化器204可以由相同帧(例如,202-0)内的先前编码并且重构的像素分量预测像素分量。映射器和可变长度编码器206编码量化残差,产生编码比特。
输入、预测器&量化器204可以使用预定的初始量化步长来量化预定量的数据,例如,视频像素数据。映射和可变长度编码器206向速率控制器208发信号,该速率控制器反过来指导输入、预测器&量化器204递增、递减或不改变量化参数,在下面更详细地进行描述。
映射和可变长度编码器206可以使用其自然数2的补码的二进制值编码量化的样本值。映射和可变长度编码器206用于编码每个值的比特数量可以由相同像素分量的编码值和与每单位样本相关联的前缀值的最近历史的组合动态地确定。
速率控制器208确定递增、递减还是不改变量化参数。速率控制器208可以执行量化步长分析,例如,通过模拟或模制以预定比特率评估的预定容量的缓冲器。模制的缓冲器可以称为虚拟缓冲器。如果虚拟缓冲器变满,那么速率控制器208可以增大或递增量化步长。如果虚拟缓冲器变空,那么速率控制器208可以减小或递减量化步长。下面相对于切片的速率控制,描述其进一步的方面。
速率控制器208可以确定虚拟缓冲器的充溢度,例如,通过对用于编码在给定数量的输入样本上接收的输入的比特计数然后减去每个样本的的预定比特率(以比特为单位)与输入样本的数量的乘积。输入样本的数量可以是一个样本。
解码器可以从初始量化步长开始对编码数据解码。在解码器对编码数据解码时,解码器还可以确定虚拟缓冲器的充溢度。通过观察用于编码与输入样本的数量对应的量的解码数据的比特量,解码器可以确定充溢度或空虚度。然后,解码器可以确定在编码器200处做出的量化步长决定。因此,编码器200不需要将量化步长显式(explicitly)传输给速率控制器或解码器内的任何其他逻辑。
图3示出了并行处理架构300。多路分解器302接收输入像素分量304,并且将每个像素分量分成组成部分,例如,α306、红色308、绿色310以及蓝色312。预测&量化块314、316、318以及320与像素分量的一个特定组成部分相关联。可以具有任何数量的这种块,这些块可以并行操作。在具有四个像素分量的格式的情况下(例如,ARGB),每个预测&量化块处理特定的分量部分。在架构300处理具有比预测&量化块更少的组成部分的像素分量时,然后,一些预测&量化块不需要操作,用于处理那些像素分量。预测&量化块314–320可以将量化残差提供给一个特定的分量映射器322、324、326以及328。分量映射器322–328还可以并行操作。
映射器322–328将映射的量化残差'E'提供给多路复用器330。多路复用器330将映射的量化残差'E'多路传输到提供给可变长度编码器334的残差流332内。或者,可以具有与每个分量映射器相关联的可变长度编码器,并且多路复用器330可以多路传输由多个可变长度编码器输出的可变长度编码的量化残差。
图4示出了预测器和量化器400的实例。预测器和量化器400包括缓冲器402、第一延迟逻辑404(实现(例如)6个样本延迟)、预测引擎406以及第二延迟逻辑408(实现(例如)3个样本延迟)。缓冲器402可以储存前一个重构图像行。预测引擎406接收当前像素分量'x'、来自第一延迟块404的前一行重构像素分量'w'、't'、's'、'g'、'c'、'b'、'd'以及'h'以及来自第二延迟块408的当前行左边的重构像素'k'、'r'、'f'、'a'。
为了使用重构的像素分量,而非输入像素分量,量化器410可以将量化残差E'提供给反向量化器412。反向量化器412反向量化所量化的残差。重构像素'Rx'由量化残差E'和来自预测引擎的预测值生成。
预测引擎406可以包括边预测引擎414、LS预测引擎416、左预测引擎418以及ABCD预测引擎420。如上所述,预测引擎406预测前一行的重构像素分量'w'、't'、's'、'g'、'c'、'b'、'd'以及'h'的当前像素分量'x'以及在当前行的左边的重构像素'k'、'r'、'f'、'a',从而产生表示像素分量'x'的残差E"。
现在,参照图5,描述预测引擎406的操作,图5示出了实例像素分量500。预测引擎406可以由上一行的相邻重构像素以及待预测像素的相同行的左边像素自适应地预测像素分量。例如,预测引擎406可以由任意重构像素't'、's'、'g'、'c'、'b'、'd'、'h'、'k'、'r'、'f'以及'a'的组合预测像素'x'。
空间预测自适应地选择边预测引擎414、LS预测引擎416、左预测引擎418以及ABCD预测引擎420这四个候选预测引擎中的一个的输出作为其用于当前像素分量的预测。考虑候选预测器,可以根据为一个或多个先前重构的像素分量确定的预测误差,进行选择。这个操作在编码器和解码器中可以相同,并且在编码数据内不需要包括任何预测控制信息。解码器可以实现相同的预测模式算法,并且推断出由编码器使用的预测模式。一旦选择了预测器,就使用所选择的预测器来预测每个样本的值。残差值E"作为预测值与实际的样本值之间的差值来计算。
LS预测引擎416
LS预测引擎416可以根据以下内容产生当前样本'x'的预测值Rx:
ABCD预测引擎420
ABCD预测引擎420可以产生预测值Px=(a+b+c+d+2)/4。这是四个相邻样本的平均值。
左预测引擎418
左预测引擎418可以将当前样本的左像素的重构值用作其预测值。换言之,Px='a'。
边预测引擎414
边预测引擎414可以使用比LS预测引擎416更多的相邻像素。边预测引擎414可以检测在当前样本'x'周围的成几个可能角度的边,并且在预测中使用该边信息。作为实例,边预测引擎414可以搜索水平的、垂直的、45度、135度、大约22.5度以及大约157.5度的边的方向。边预测引擎414可以通过两个阶段实现。第一阶段是边检测。第二阶段是边选择。
可以为预测函数指定一些选择。通过使边预测引擎414配置有参数(例如,NOLEFT=1),可以禁止使用挨着'x'位于'x'左边的重构样本值'a'。避免使用样本'a',可以允许预测、量化以及反向量化路径运转更多的时间,这可以是高吞吐量系统的一个优点,在该系统中,电路定时会导致难以快速地重构样本'a'。通过使边预测引擎414配置有参数NOLEFT=2(也称为NO2LEFT),可以禁止使用重构样本值'a'和'f','a'和'f'是挨着'x'位于'x'左边的两个样本。这允许预测、量化以及反向量化路径运转甚至更多的时间。在电路定时需要三个时钟周期来预测、量化以及反向量化时,使用NOLEFT=2,促进每个时钟一个样本的吞吐量。
可以选择性启用和禁止上面列出的四个引起的单独预测引擎。对于某些类别的内容,通过使用预测函数的子集,可以获得更好的性能。在沿着图像的左上边预测样本时,例如,可以使用左预测引擎418,下面进行规定。
NOLEFT=1选项
在NOLEFT=1时,根据以下内容,使用重构样本值'f'、'g'以及'c',由其预测Pa代替在LS预测引擎416、左预测引擎418以及ABCD预测引擎420内的重构样本值'a':
NOLEFT=2选项
在NOLEFT=2时,使用重构样本值'r'、's'、'g'以及'c',由其预测Pf和Pa代替在LS预测引擎416、左预测引擎418以及ABCD预测引擎420内的重构样本值'f'和'a'。'a'的预测可以使用与在NOLEFT中相同的方法,除了根据以下内容由Pf代替'f'以外:
Pf=(r+g+s+c+2)/4,-
NOLEFT=0、NOLEFT=1、NOLEFT=2的边预测引擎
在NOLEFT=0时,在预测中使用左边样本,并且以下内容可以应用于边检测中:
在NOLEFT=1时,在预测中不使用左边样本,并且以下内容可以应用于边检测中:
在NOLEFT=2时,在预测中不使用这两个左边样本,并且以下内容可以应用于边检测中:
参数'max_strength'可以定义为在两个样本之间差的最大可能绝对值。这个参数可以与像素数据格式相关,例如,对于8比特数据,max_strength=255,并且对于10比特数据,max_strength=1023。可以在NOLEFT=0、NOLEFT=1以及NOLEFT=2的各种情况下,应用相同的边选择逻辑,除了在NOLEFT=1或NOLEFT=2时,可以由其预测Pa代替样本值'a',并且在NOLEFT=2时,可以由其预测Pf代替样本值'f'以外:
预测选择
单元(unit)可以被视为相同分量的相邻样本的逻辑分组。例如,单元尺寸可以选择为等于2。单元尺寸可以是由单元包括的样本的数量。在替换的实施方式中,单元尺寸可以选择为具有值1、3、4或另一个值。在一个实施方式中,在单元尺寸选择为等于2时,对于一个分量的每对样本,可以使用相同分量的前一对样本评估所选择的一组(高达所有)候选预测器,并且为当前对选择为前一对执行最佳的预测器。可以在与单元未对准的界限上进行预测器的选择。可以具有某些例外,在这些例外之下限制这组候选预测器,例如,在位于左边或上面的样本不能使用时,或者例如,在不能使用一个或多个预测器时。
对于图像的第一对样本,例如,在头一行的左边的两个样本,可以选择左预测引擎418,作为预测器。进一步,对于每行的第一对样本而不是第一个样本,可以选择LS预测引擎418。可以为不能用于预测的样本值分配预先确定的值,例如,样本值的最大范围的一半。
对于其他样本对,可以根据左边这对样本的估计预测误差选择预测器,可以由所有四个预测器计算这些估计预测误差。在发现当前样本'x'的重构值时,可以如下计算当前样本的估计预测误差:
err_sample=ABS(x'-Px)
在以上方程中,Px是这四个预测器中的每个的当前样本的预测值。一个预测器的预测误差是预测器的一对样本中的两个样本的err_sample的总和。然后,选择具有最小预测误差的预测器作为相同分量的下一对样本的预测器。
要注意的是,在NOLEFT=1时,左边样本的预测误差不可用。假设当前样本是图5中的'x',那么如果NOLEFT=0,那么由左边这对样本'f'和'a'选择的预测引擎用于当前的样本对。如果NOLEFT=1,那么可以使用由可用的左边这对的最小预测误差选择的预测器,例如,如果'x'是这对中的第二样本,那么样本'r'和'f',或者如果'x'是这对中的第一样本,那么样本'r'和'k'。如果NOLEFT=2,如果'x'是这对中的第一样本,那么可以使用由样本'r'和'k'的最小预测误差选择的预测器,或者如果'x'是这对中的第二样本,那么样本'k'及其紧接在左边的样本。残差或误差值E"可以确定为E"=x–Px。
可以如下获得用于未来预测中的重构样本值'x':
x'=Px+E'*QuantDivisor;
if(x'<0)x'=0;
else if(x'>MAXVAL)x'=MAXVAL;
下面限定值QuantDivisor。MAXVAL是可以由未压缩的视频样本字长编码的最大值,例如,对于10比特视频,为1023,并且对于8比特视频,为255。在一个实现方式中,Cb和Cr是非负整数。
参照图6,描述映射器和可变长度编码器206的操作,该图示出了也称为单元的样本单元600的实例。映射器和可变长度编码器206可以使用熵编码来对使用其自然数2的补码二进制值的样本值编码。用于编码每个值的比特数可以由相同分量的编码值的最近历史和与样本的每个单元605相关联的前缀值的组合动态地确定。在某些实现方式中,单元605包括特定分量类型的两个样本610,例如,Y、Cb或Cr、或α、R、G或B。在一些实现方式中,Cb和Cr在一个单元内共同编码。相同的一组分量可以用于预测比特的数量。
样本的每个单元605具有单元样本尺寸。单元样本尺寸可以是主单元内的每个样本的比特的尺寸。单元605样本尺寸可以足够大,以便编码包含在单元505内的每个样本,并且可以更大。一个样本的尺寸可以是用于以2的补码编码的样本值的比特数。例如,值0具有尺寸0,值-1具有尺寸1,值-2或1具有尺寸2,值-4、-3、2或3具有尺寸3,以此类推。
单元605可以具有最大样本尺寸,该尺寸是在单元605中的所有样本的尺寸的最大值。单元605还可以具有预测尺寸。在一个实现方式中,如果预测尺寸大于或等于最大样本尺寸,那么单元605样本尺寸等于预测尺寸。在一个实现方式中,如果最大样本尺寸大于预测尺寸,那么在前缀值612中编码始终是非负的差值,并且最大样本尺寸可以用作单元605样本尺寸。在另一个实现方式中,如果最大样本尺寸与预测尺寸不同,那么在前缀值612中编码可以是正或负的差值。前缀值可以使用一元编码,例如,对于非负前缀值的实现方式,值0具有代码1(二进制),值1具有代码01、值2具有代码001,以此类推。单元样本尺寸是预测尺寸与前缀值612的总和。对于10比特视频,最大可能样本尺寸是10,并且最小可能样本尺寸是0,因此,最大可能前缀值是10,占据了11比特,即,0000 0000 001。对于带符号的前缀值的实现方式,带符号的前缀值可以是一元编码。
预测尺寸可以是先前编码的样本的尺寸的函数。在一个实现方式中,假设单元尺寸是2,预测尺寸是前两个样本(例如,先前单元)的相同分量的样本的尺寸的平均值(通过四舍五入)。如果单元尺寸是4,那么预测尺寸可以是先前单元的相同分量的四个样本的尺寸的平均值。如果单元尺寸是3,那么预测尺寸可以由先前单元的相同分量的最后两个样本的尺寸的平均值生成,从而避免除以3。或者,如果单元尺寸是3,那么预测尺寸可以生成为相同分量的先前单元的3个样本的加权总和。加权可以是(例如)(1/4,1/4,1/2)。
例如,如果在量化之后,图像的分量促使样本的尺寸对于很多连续的样本是2,那么预测尺寸是2,并且前缀值是0。因此,前缀代码是‘1’,每个样本使用2比特编码,并且两个样本的单元总共具有5比特。在一个瞬态造成样本尺寸突然增大的情况下,前缀值编码尺寸的增大。在另一个瞬态造成样本尺寸突然减小的情况下,前缀值可以是0,并且单元样本尺寸可以等于预测尺寸,该预测尺寸可以超过在单元中的样本的尺寸。因此,即使其自身的尺寸更小,也可以使用等于预测尺寸的比特数编码每个样本。在瞬态之后,在样本尺寸没有另一个变化时,单元样本尺寸和预测尺寸再次聚集。考虑样本的尺寸在单元之间不同,尤其在尺寸不非常快速地频繁变化时,这种技术能非常有效地编码样本。
Δ尺寸单元可变长度编码(DSU-VLC)方案促进在硬件内高速地有效编码和解码,这部分是因为这不取决于VLC表。由前缀值(计数0)和预测尺寸确定待解码的单元内的比特数,这可以在编码或解码当前单元之前确定。编码或解码每个时钟的一个单元可行,并且更快速解码的方法也可行。对于更大的吞吐量,编码可以并行编码多个单元。由于各种原因,单元尺寸可以选择为大于2。例如,在使用提出单元尺寸2实际上不能满足的吞吐量要求的情况下,可以选择更大的单元尺寸,在这种情况下可以使用单元尺寸3或4。
再次参照图4,量化器410使用量化参数Quant来量化残差E",这通常包括无损编码的情况。Quant可以采用的值的范围从0(代表无损)到与QuantDivisor[]的最高值对应的值(见下文)。通过下面显示的QuantDivisor和QuantOffset的一组示例性值,Quant的值的范围从0到17。
量化器410可以如下对残差值E"进行量化:
其中,可以通过截断,进行除法,例如,与在'C'语言中一样。
这组除数可以是:
int QuantDivisor[]={1,3,5,7,9,10,12,14,16,18,20,24,28,32,48,64,128,256};
这组相关联的偏移(舍入常数)可以是:
int QuantOffset[]={0,1,2,3,4,4,5,6,7,8,9,11,13,15,23,31,63,127};
在这种方法中,具有4个奇数值除数(3、5、7以及9),7个是这些奇数值除数中的一个和五个其他值中的一个的乘积,每个都是2的幂:2**N。结果,在一个实现方式中,量化函数支持4个奇数值除数。
使用QuantDivisor[]的这组特定的值,为良好的压缩提供低复杂度。要注意的是,可以使用乘以一小组优化常数值,来在硬件内进行除以奇数。
在其他实施方式中,可以选择除数,以便除数没有奇数因子。例如:
int QuantDivisor[]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096};
int QuantOffset[]={0,0,1,3,7,15,31,63,127,255,511,1023,2047};
速率控制
通过速率控制技术,确定Quant的值,速率控制技术可以在编码器和解码器内同样地进行。速率控制技术可以使其决定基于最近编码的确定数量的像素分量的活动的测度(measure,度量)以及缓冲模型的充溢度。预定数量可以是(例如)3、2或某个其他数。每个编码的预定数量的像素分量可以更新Quant的值一次。
图7示出了虚拟缓冲模型700的实例。虚拟缓冲模型700与比特流源702、速率控制器208以及比特流用户706通信。虚拟缓冲模型700模制速率缓冲器的行为,其中,输出比特率是额定比特率。额定比特率可以在每个像素或每组像素的比特单元内,或者可以在其他单元内,例如,每个单位时间的比特,例如,每秒的比特。比特流用户706可以以额定速率模制比特的消耗。例如,比特流源702可以是映射器和可变长度编码器206的输出。一组像素可以包括预定数量的像素,例如,2、3、4或某个其他数量。
在创建比特时,比特进入虚拟缓冲模性700内。例如,在编码组时,将用于编码组的比特数加入模型700中。比特根据预定的方案离开虚拟缓冲模型700。例如,该方案可以在每组的比特单元内规定恒定的速率。虚拟缓冲模型700可以作为累加器708实现,其中,每个组加入一个值,并且减去其他值。或者,从虚拟缓冲模型700中移除比特的方案可以以每秒的比特为单位。或者,将比特加入缓冲模型700中或者从缓冲模型700中减去比特的时间可以比组更精细或更粗糙,并且可以使用除了组以外的结构,例如,样本、宏模块、切片或图片。为了模制先进先出(FIFO)缓冲器的行为,在从充溢度中减去比特数(这可能另外产生充溢度的负值)时,虚拟缓冲模型700的充溢度可以固定为0。
在用于虚拟缓冲模型700内的输出比特率小于或等于在编码器中从速率缓冲器中移除比特的实际比特率并且速率控制器704确保虚拟缓冲模型700不溢流时,速率缓冲器也不溢流。更一般地,编码器可以使用虚拟缓冲模型700来管理编码器产生比特的速率,以便稍后可以应用于编码器的比特流中的另一个虚拟缓冲模型不溢流或下溢。比特离开虚拟缓冲模型的比特率可以在任意时间变成任一个支持值。如果比特离开速率缓冲器的实际速率等于或接近比特离开虚拟缓冲模型的速率,那么编码器的比特率可以通过有效瞬时响应设为任何支持的比特率。由于速率控制使用虚拟缓冲模型管理产生比特的速率,所以速率控制函数不需要监控比特离开速率缓冲器的速率。
在一个实现方式中,编码器和解码器进行相同的速率控制(RC)决定,这些决定控制量化器的值或Quant,编码器不传输特别表示量化控制的任何比特。速率控制可以取决于先前组的由样本的尺寸测量的活动以及虚拟缓冲模型的充溢度和在先前样本中的(如果有的话)边的强度的测度。速率控制可以使用几个可配置的阈值。单元605被组织到组710内。组710用于组织样本,以促进缓冲模式和速率控制。在另一个示例性实施方式中,解码器不进行与编码器相同的速率控制决定,并且编码器传输指示至少一部分量化控制的比特。
在一个实现方式中,编码器(包括速率控制器208)确保虚拟缓冲模型700决不超过限定的最大充溢度,同时选择量化等级,以使总体主观图像质量最佳。可以比较容易地实现某些图像和比特率,而对于其他图像和比特率,缓冲器充溢度可以变化并且偶尔接近或达到虚拟缓冲模型700的尺寸,并且量化可以改变并且可以偶尔达到最大容许值。
虚拟缓冲模型700可以表示预定尺寸BufferSize的FIFO。可以根据特定的应用,选择BufferSize的值。更大的尺寸通常促进更好地压缩规定的比特率和图像内容,反之亦然。更大的尺寸还表示在物理速率缓冲器内可用的更大量的空间以及潜在增大的潜伏期。在一个示例性实施方式中,在图片的开始,缓冲模型700初始化为空。或者,虚拟缓冲模型700充溢度可以从一个图片中保持到下一个图片中,或者可以初始化为某个其他值。
在对样本的每个组710编码时,将用于编码组的比特数加入在虚拟缓冲模型700内的累加器。在编码每个组之后,从累加器中减去等于每个组的比特的预算的数量(例如,额定比特率),结果固定为0,以实施非负充溢度。在解码器模仿编码器的速率控制的实施方式中,在解码器中发生相同的操作:在对每个组解码时,将组占据的比特数加入模型中,并且减去额定比特率,例如,每个组的比特的预算数量,结果固定为0。这样,编码器和解码器缓冲模型在每个图片内为每组精确地追踪。通过调整Quant值,速率控制器208可以保证缓冲器充溢度决不超过定义的最大值,例如,缓冲尺寸。
在一个实施方式中,在每个图片的开始,量化值Quant初始化为0,与无损编码对应。在另一个实施方式中,Quant值初始化为非零值。可以动态地调整Quant值,以免缓冲模型溢流,同时使压缩图像质量最佳。速率控制算法可以促进以低比特率对困难图像的编码,具有最小可见的量化误差,以及以更高的比特率对困难图像的编码,没有可见的量化误差。
在一个实施方式中,测量每组的活动等级。活动等级可以是在组中的每个单元的最大量化残差尺寸,乘以在单元内的样本数(例如,2、3或4),加上1(与前缀值0对应),在该组内的所有单元计算总和。在量化之后,量化残差尺寸使用Quant的当前值。作为每个单元的2个样本以及每个组的3个单元的实例,样本0和1的比特数分别是SampleSize[0]和SampleSize[1]。假设单元0的这两个样本的最大值是MaxSizeUnit[0]=MAX(SampleSize[0],SampleSize[1]),那么该组的活动等级是RcSizeGroup=MaxSizeUnit[0]+1+MaxSizeUnit[1]+1+MaxSizeUnit[2]+1。在下面显示的实例中计算在最后的组中编码的比特的实数的另一个参数(例如,BitsCodedCur)也用于确定Quant值应增大、减小还是不变。
下面描述虚拟缓冲尺寸是16Kbits的实例的量化参数Quant的控制。在这个实例中,“MaxBitsPerGroup”表示在每组比特内的预定的数据速率。Offset[]是根据缓冲模型的充溢度(由“Buffer_fullness”表示,并且与由BufTh1、BufTh2等表示的各种阈值进行比较)调整“target_activity_level”的一组值:
可以为16Kbits(16,384比特)的缓冲模型尺寸设置以比特为单元的缓冲器充溢度的14个阈值(BufTh1到14),作为{1792,3584,5376,7168,8960,10752,12544,13440,14336,15232,15456,15680,15960,16240}。可以为Target_activity_level设置15个偏移值(offset[0到14]),作为{20,10,0,-2,-4,-4,-8,-10,-10,-10,-10,-12,-12,-12,-12}。
通过由两个连续的阈值限制的任何范围的缓冲器充溢度(例如,BufThl<=Buffer_fullness<BufTh2),具有由MIN_QP和MAX_QP规定的Quant范围,允许使用速率控制器208。这有助于调节Quant的变化,以在缓冲器等级较低时避免过度量化,并且避免在缓冲器充溢度较高时,表面使用过多对视觉质量没有帮助的更低有效位。根据缓冲器充溢度等级,分别从具有实例默认值{0,0,1,2,2,3,4,8,8,8,13,14,15,16,17}的15个值的阵列minQP[0to 14]以及具有实例默认值{2,2,2,3,3,7,9,10,11,12,13,14,15,16,17}的15个值的阵列maxQP[0to 14]的中选择与缓冲器充溢度等级的每个范围相关联的这对参数MIN_QP和MAX_QP。
根据测量的活动等级、目标活动等级、由MIN_QP和MAX_QP指定的允许的Quant范围以及强边的强度,调整Quant值。在具有强边时,如果Quant值依然固定,那么活动等级通常大幅增大。通过检查当前组的活动等级以及先前组的活动等级以及Quant的相关值,速率控制算法检测强边的存在。在检测到强边时,速率控制算法不增大紧接在强边的存在之后的Quant值,以便避免在可以循着强边的光谱区域内更加容易可见的潜在量化噪声。可以在(例如)某个动画片内容内观察到这个因素。速率控制可以在强边之后的第二组中增大Quant值。下面,在检测强边时用作阈值的一个参数在伪码中定义为EdgeFactor。
一些实施方式避免Quant在高量化值周围过度波动,这会在一些图像中造成可见的高频率量化噪声。这些实施方式调节Quant的增大,以便在Quant值已经较高时,对于像素的两个连续组,Quant不增大。具有某些例外。然而,一旦所测量的活动等级较低,就可以允许减小Quant。在以下实例中定义为Quantlncrl_imit[0]和Quantlncrl_imit[1]的两个参数控制这些调整;其默认值可以设为11。在以下实例中,cSizeGroup表示活动等级,BitsCodedCur表示用于编码最近编码组的比特的实际数量,并且RcTgtBitsGroup表示Target_activity_level。RcTgtBitOffset[0]和RcTgtBitOffset[1]是调整目标活动等级的范围的偏移值。EdgeFactor是用于检测强边的参数。最后组的量化步长是Quant,在为当前组分配该值之前,其作为QuantPrev进行保存。
可以如下实现Quant调整的操作:
在缓冲器充溢度接近最大容许等级时,由活动等级确定的以上Quant值可以由max_QP代替:
if(Buffer_fullness>=BufTh_overflow_avoid)
*Quant=max_QP;
其中,BufTh_overflow_avoid是可编程参数。
图8示出了实例解码器800。解码器800包括速率缓冲器802、可变长度解码器(VLD)804、预测器、映射器和反向量化器(PMIQ)806以及速率控制器808。解码器800可以位于与编码器相同的装置内或者不同的装置内,并且可以从任意源中接收比特流输入,例如,存储器或通信接口。例如,解码器800可以远离编码器,并且可以通过网络接口接收输入比特流。
速率缓冲器802可以是FIFO存储器,在编码器800接收数据速率之后,该存储器可以临时储存压缩数据速率。速率缓冲器802可以与视频解码器的剩余部分整合,或者可以位于另一个模块内,并且可以与另一个存储器组合。速率缓冲器802的尺寸可以至少与用于视频编码器内的虚拟缓冲器一样大。例如,在视频编码器使用16kbits虚拟缓冲器(例如,2048个字节)的情况下,速率缓冲器可以具有相同的尺寸,即,2048个字节或更大。可以在速率缓冲器802与VLD 804之间使用准备接受的流量控制,以在速率缓冲器802空着时,控制解码操作悬挂,直到具有在速率缓冲器802内可使用的数据。
在任何规定的时间,速率缓冲器802的充溢度可以与虚拟缓冲模型的充溢度不同。这部分因为解码器虚拟缓冲模型模仿编码器虚拟缓冲模型的操作,而非解码器的操作,并且缓冲模型对指定数量的编码比特/像素乘以每次对组解码时从缓冲模型中去除在组中的像素的数量进行运算,而非比特到达解码器的实际进度。压缩比特的传输可以模制为与解压缩函数精确地同步,而在实际操作中,可以以比这个速率更快或更慢地的速率从存储器中读取速率缓冲器802的输入。这就是上述速率控制对缓冲模型(而非对速率缓冲充溢度)进行操作的一个原因。
VLD 804的输入是压缩比特流812。压缩比特流812可以包括一系列组。这些组可以包括一组单元。每个单元可以具有前缀和某个数量的样本,例如,2、3或4个样本。VLD 804运算是可变长度编码器(VLC)206函数的反函数。由于VLD 804的输入是比特流(例如,VLC编码的样本流),所以可以依次执行一部分或所有VLD运算。然而,一些VLD功能可以是流水线式。
在一个实施方式中,VLD 804使用单元尺寸2,即,每个单元具有2个样本。对于任何给定图像的编码器和解码器,单元尺寸的选择可以相同。单元尺寸通常是编码比特流的属性。
VLD 804解码操作需要在与目前编码的元件相同的元件的先前单元内确定样本的实际尺寸(例如,有效位的数量),并且从这个信息中产生预测的单元样本尺寸。这个分析可以是流水线式的。VLD 804可以对每个单元的前缀解码,每个单元的前缀可以时一元编码的。将将解码的前缀值加入预测的样本尺寸值中。所产生的样本尺寸信息表示在单元内包含的每个样本的比特的数量。VLD 804从输入比特流中提取等于前缀尺寸加上确定的样本尺寸乘以每个单元的样本数量的比特数。一旦VLD 804提取这些比特,可以通过可以是流水线式的后续解码步骤对这些比特进行多路分解和处理。
与VLC一样,计算当前组所消耗的比特数以及当前组的活动等级并将其传递给速率控制器808,用于进行速率控制。VLD 804生成RcSizeGroup和BitsCodedCur的值,并且将这些值传递给速率控制器808。
一旦提取了编码样本,这些样本就被转换成合适的格式,用于后续处理。例如,这些样本就可以转换成11比特2的补码带符号格式,具有负样本值的符号扩展。这些恒定的宽度样本值被多路分解成样本的单独的分量流,并且被发送给预测器、映射和l-Quant(PMIQ)块体806。
图9示出了用于编码的实例逻辑900。逻辑900将量化步长初始化为0(902),然后接收像素分量的单元(904)。逻辑900还使用量化步长进行量化,并且编码量化值(906)。逻辑900测量虚拟缓冲器的充溢度(908)并且基于测量的充溢度调整量化步长(910)。如果完成编码(912),那么流动可以返回(902)或完全结束;否则,流动可以在(904)处继续。
图10示出了用于解码的实例逻辑1000。逻辑1000将量化步长初始化为0(1002)。逻辑1000对编码单元解码,并且更新虚拟缓冲器(1004)。逻辑1000还使用量化步长参数去量化(1006),并且测量虚拟缓冲器的充溢度(1008)。而且,逻辑1000可以基于测量的充溢度,调整量化步长(1010)。逻辑1000确定是否完成了帧的解码(1012),如果完成的话,那么流动可以返回(1002)或完全结束;否则,流动可以返回(1004)。
操作描述
以上描述提供了支持额外特定的图像处理操作的实例架构。接下来提供这些操作中的一些的介绍。下面还进一步讨论支持图像处理操作的额外架构实现方式。
图11基于图1的实例示出了实例编码和解码系统1100。系统1100支持实时操作。可以解压缩的源数据112(例如)实时地并且按照光栅扫描顺序进入编码器104。编码器104压缩输入的像素,以形成比特流并且在其比特缓冲器210内临时储存部分比特流。比特缓冲器210的输出是显示流压缩(DSC)比特流1106的切片层。DSC比特流1106可以(例如)从编码器104实时传输给解码器106。在这方面,大量通信链路1104可以将DSC比特流1106传输给解码器106。大量传输层可以位于通信链路1104的下面,并且通信链路1104可以包括(例如)本地高速总线、WiFi链路、以太网链路、卫星链路、蜂窝(例如,3G或4G/LTE)链路。
解码器106将DSC比特流1106接收到其速率缓冲器802内,速率缓冲器802临时储存部分DSC比特流1106。解码器106对速率缓冲器802中的比特解码,以获得未压缩的像素。解码器106(例如)实时地并且按照光栅扫描顺序为显示器110输出未压缩的像素。从解码过程中输出的图像可以与输入编码过程内的图像具有相同的格式。
DSC比特流可以包括使用图片层语法编码的一系列帧。图片层语法可以包括PPS(图片参数集)和切片语法。PPS包含解码器106用于正确地解码切片层的参数。图12示出了PPS 1200的实例。
图片层可以以整个图片为单位进行操作。例如,在渐进格式视频的情况下,图片可以是帧,或者在交错格式视频的情况下,图片可以是场。每个图片可以包括整数个连续的、非重叠的、相同尺寸的、矩形切片。在编码器104中,通过该切片层指定切片编码。在解码器106中,每个切片可以单独地解码,而不干扰其他切片。每行可以具有一个切片,或者每行可以具有多个切片。在每行具有多个切片的情况下,覆盖一行的切片的比特在DSC比特流1106中通过下面描述的切片多路复用过程多路复用。每个切片可以包括一组群组,每个组可以是按照光栅扫描顺序由三个连续像素构成的组。而且,编码器104可以编码具有多个(例如,三个)熵代码的每个组,每个元件具有一个代码,并且每个代码可以是特定类型的可变长度代码(VLC)。而且,一些组可以包括一个或多个额外比特,该一个或多个额外比特用信号通知特定的解码操作。
图13示出了编码器1300的另一个实例。DSC编码过程生成可以精确地符合独立指定的bpp(每个像素的比特)速率的比特流。可以根据每个像素时间的比特,指定bpp率,可以在算法上指定,这是因为像素时间的单元在编码器1300的输入和输出都相同。编码每个像素或一组像素的比特数可以大幅变化。在编码器1300中,速率缓冲器1302促进将用于编码每个组的可变数量的比特转换成(例如)恒定的bpp率。为此,编码过程包括速率控制器1304。
编码器1300可以包括颜色空间转换逻辑1306,例如,RGB输入到可逆YCoCg转换逻辑。输入缓冲器1308储存转换的输入。预测、量化以及重构(PQR)逻辑1310实现样本值的预测和残差值的生成。预测、量化以及重构(PQR)逻辑1310可以包括多个(例如,3个)预测器:改进的中值自适应预测(MMAP)、中点预测(MPP)以及块预测(BP)。PQR逻辑1310还实现残差值的量化和样本值的重构。还具有索引颜色历史(ICH)1312,与可以使用Δ尺寸单元可变长度编码(DSU-VLC)实施熵编码的VLC编码逻辑1314一样。输入缓冲器1308将样本提供给平坦度确定逻辑1318。还要注意的是,具有子流多路复用逻辑1320,以准备到速率缓冲器1302的多路复用输出流。
图14示出了解码器1400的另一个实例,该解码器被配置为对编码器1300编码的图像数据进行解码并且产生图像输出1418。解码器1400可以实现由编码器1300执行的逆操作。解码器1400可以包括速率缓冲器1402、子流多路分解器1420以及用于Δ尺寸单元的可变长度编码(DSU-VLC)的VLC熵解码逻辑1404。解码器1400还包括PQR逻辑1406,该逻辑可以实现多个(例如,3个)预测器:改进的中值自适应预测(MMAP)、中点预测(MPP)以及块预测(BP)。PQR逻辑1406还执行残差值的反向量化和样本值的重构。还具有ICH 1408、速率控制逻辑1410以及颜色空间转换逻辑1412。平坦度指示可以从编码器中在比特流中用信号传送,并且提供给速率控制逻辑1410。
编码过程可以产生符合HRD(假设参考解码器)约束的显示流编码的比特流。HRD可以是包括速率缓冲器的模型的解码器的理想模型,该模型应不上溢,也不下溢。
DSC比特流和解码过程促进在实际的硬件实现方式中每个时钟周期解码3个像素。在其他实现方式中,解码过程每个时钟可以处理1个、3个或其他数量的像素。通过并行编码和解码多个切片,可以增大每个时钟的像素的额外吞吐量,这通过在DSC比特流中利用每行的多个切片来促进。
颜色空间转换逻辑1306、1412
输入到编码过程中的RGB视频可以转换成YCoCg,用于后续处理。可以使用可逆形式的YCoCg,同样,这两个色度分量中的每个的比特数在YCoCg中比在RGB中更大。在YCbCr输入的情况下,不需要进行颜色空间转换。在解码过程中进行反向颜色空间转换。
PQR逻辑1319、1406
使用预测性编码(P模式)或索引颜色历史编码(ICH模式),对每组像素编码。对于P模式,具有3个预测器:改进的中值自适应预测(MMAP)、块预测(BP)以及中点预测(MPP)。编码器和解码器可以在每个中使用相同的算法自动选择MMAP、BP或MPP,而不在DSC比特流中发信号通知进行选择。
在编码器1300中,使用所选择的预测器预测每个样本。比较原始样本值和预测值,并且量化差异。然后,如果选择P模式,那么每个量化误差进行熵编码。编码器1300还执行重构步骤,在该步骤中,将反向量化误差加入预测中,以便编码器和解码器可以使用相同的参考样本。
在解码器1400中,使用所选择的预测器预测样本。通过解码DSC比特流获得的残差值被反向量化,并且将结果加入预测中,形成重构样本值。
中值自适应预测(MAP)可以是在JPEG-LS中使用的预测方法。然而,进行修正以允许解码器1400在一个组内同时处理三个像素,并且提高编码。改进的中值自适应预测(MMAP)有利于解码器以3个像素/时钟运行的硬件实现方式。MMAP根据位于当前样本的左边和上面的先前编码的重构样本预测当前样本值。为此,编码器1300和解码器1400可以使用相同组的重构样本,因此,MMAP在编码器1300和解码器1400内产生相同的结果。MMAP可以是默认预测器,并且在大部分情况下,在预测样本值时有效。
MPP从大约位于样本的有效范围的中点的值中预测当前样本。MPP具有限制残差的最大尺寸的优点。当在一组的一个分量内的样本编码所需要的比特数大于或等于该分量的比特深度减去量化位移时,可以选择MPP,代替MMAP。
BP根据相同的扫描线中的位于当前样本左边的先前编码的重构样本预测当前样本。从当前样本到预测器位置的偏移是BP向量。BP函数自动确定BP向量以及是否使用BP的决定,该BP函数在编码器和解码器内相同。
块预测
在预测值是相同的行中位于当前样本的左边的样本的情况下,块预测可以预测当前样本。参考样本的相对位置可以位于(-3)与(-10)之间,包括(-3)和(-10)。使用额外像素位置,可以提高质量。相对位置是在相同行的样本内的向量;这称为块预测向量。
可以在前一行样本上进行找出最佳向量的搜索,而非在当前编码的行中。在一个实现方式中,块搜索使用具有从-3到-10的范围的值的各电势向量比较一组9个连续的样本和参考样本。所比较的当前样本和参考样本位于相同的扫描线内,例如,位于待编码的样本行之上的一行。对于考虑的每个向量,对当前和参考组的每个中的9个样本计算SAD(绝对误差和)。选择具有最低SAD值的向量。在束缚的情况下,选择最接近0的向量。
还使用向量-1的9个像素SAD,以便确定应使用BP还是MMAP。下面提供预测器选择的更多细节。
一旦选择,向量就应用于每组3个样本中。因此,每3个样本进行块搜索。
向量表示像素X的预测值是位于在同一行的像素X的左边的像素,在像素单元中到左边的距离等于向量值。
图15说明了块搜索的实例样本组1500,示出了几个参考样本1502和向量1504、1506。还显示了当前样本'x'1506和当前SAD计算样本1508的一个实例。
索引颜色历史(ICH)逻辑1312、1408
图16示出索引颜色历史1600的一个实例。
在多个类型的内容中,例如,计算机生成的文本和图形中,相似的像素值常常相当接近,同时不一定彼此相邻。正因为如此,在索引颜色历史(ICH)内保持跟踪多个最近使用的像素值是会有帮助的。在编码器1300为特定的组选择ICH模式时,发送ICH内与所选择的像素值对应的索引值。这些索引值直接用于输出像素流内。
ICH逻辑包括储存单元,该储存单元保持使用另一种编码方法(例如,预测编码)编码的一组最近使用的颜色值。编码器1300和解码器1400可以保持ICH的相同状态。ICH可以具有32个条目,索引值指向每个条目。对于ICH编码的组,每个像素可以使用5比特ICH索引编码,该索引指向一个条目。在每组像素以P模式在编码器内编码或者在解码器内解码时,将组中的所有像素的值输入ICH内。可以管理ICH,作为移位寄存器,其中,最近最多使用的(MRU)值在顶部,并且最近最少使用的(LRU)值在底部。新条目在顶部增加,并且所有其他条目向下移动,底部条目从ICH中掉落出来。在以ICH模式对组编码时,用于编码那些像素的三个索引引用在ICH中的条目。在引用ICH条目时,该条目移动到ICH的顶部,并且在条目的先前位置之上的其他值下移1。对于每个ICH编码组的所有3个条目,并行进行这个操作,并且该组的最近(例如,最右边的)像素组变成MRU。结果,最近最多使用的(MRU)值位于历史的顶部,并且最近最少使用的(LRU)值位于历史的底部。每当在历史的顶部增加三个像素的P模式组时,便移除三个LRU值。
对于第一行的每个切片,所有32个ICH条目被视为移位寄存器的一部分。对于在第一行切片之后的行,最后7个索引值被限定为指向当前行之上的行中的重构像素,而非ICH中的条目。这可用于有效地编码不在历史移位寄存器内的像素值,并且提高了某些内容的编码。
编码器1300可以逐个组地选择ICH模式。编码器1300使用亮度子流DSU-VLC中的转义码,发信号通知组的ICH模式的使用。对于以ICH模式编码的每个组,使用固定长度5比特代码,编码在这个组中的每个像素,其中,索引值指向历史。通过经由比特流语法确定使用ICH模式,并且通过读取由构成像素的编码值的ICH索引指向的值,解码在组中的每个像素,从而解码器1400对每个ICH编码的组解码。通过将P模式像素插入ICH内并且通过响应于ICH模式组将ICH条目重新排序,编码器1300和解码器1400为每个组相同地更新ICH状态。
熵编码逻辑1314、1404
显示流编码在多个层上限定语法。最低层称为子流层。在每个切片内可以具有三个子流,每个分量具有一个子流。这三个子流可以由子流多路复用(SSM)过程共同多路复用,以形成编码切片。如果每行具有多于一个切片,那么编码的切片可以由切片多路复用过程多路复用;并且如果每行仅仅具有一个切片,那么不使用切片多路复用过程。所有切片的所产生的比特级联,以形成编码图片。图片参数集(PPS)可选地位于每个编码图片之前。
子流层
显示流编码可以使用上面称为DSU-VLC的熵编码技术,用于编码与预测编码相关联的残差。像素的ICH编码为每个像素使用固定长度的代码。专用值用于发信号通知ICH模式的使用,并且其他代码发信号通知与像素的平坦区域相关联的量化调整。
残差值 |
比特的尺寸 |
表示 |
-3 |
3 |
101b |
-2 |
2 |
10b |
-1 |
1 |
1b |
0 |
0 |
<空> |
1 |
2 |
01b |
2 |
3 |
010b |
3 |
3 |
011b |
表1-用于不同的残差值的尺寸的实例
在每个切片中的像素均可以组织成三个连续的像素的组。组是由编码和解码过程使用的逻辑结构,但是不需要直接在比特流中表示。DSU-VLC将样本组织成单元。单元是一个分量的三个连续样本的残差的编码组。每个单元具有两部分:前缀和残差。基于相同分量类型的前三个残差的尺寸以及可以发生的QP的任何变化,预测每个残差的尺寸。前缀可以是表示单元中最大残差的尺寸与预测尺寸之间的非负差值的一元代码。如果差值是负数,那么由前缀编码的值是0。每个单元的残差部分包含3个值,单元中的每个样本具有一个。以2的补码对残差值编码。分配给残差的比特数可以在单元之间变化;然而,在一个单元中的全部3个残差可以分配给相同数量的比特。
此外,亮度单元的前缀还表示ICH模式是否用于每个组。从P模式到ICH模式的转换可以由转义码表示,例如,表示大于亮度的最大可能残差尺寸的尺寸的前缀值。亮度的最大可能残差尺寸取决于应用于该组中亮度的QP值。紧随另一个ICH模式组之后的ICH模式组可以由包括单个“1”比特的亮度前缀代码表示。紧随ICH模式组之后的P模式组可以由修正一元代码表示。
对于ICH模式组,对于每个元件,残差部分可以是5比特,其中,每5比特代码是编码完整像素的ICH索引,并且色度分量不使用前缀。对于在开始ICH模式组之后的后续CH模式组,每个组可以为使用每个组的16比特,例如,1比特前缀和(3)5比特ICH代码。
亮度子流还可以在语法中包含一些有条件的固定长度代码,用于编码器传输关于从忙碌区域到光滑区域的过渡的信息。下面更详细地讨论这个“平坦度指示”。
子流多路复用
可以使用没有报头的固定长度的子流多路复用方案,将三个元件状子流多路复用在一起。在美国专利公开号2011-0305282 A1中,描述了一种这样做的技术,该案并入本文中,以作参考。错误!未发现参考源(Error!Reference source not found)。图17示出了子流多路复用1700的结果的实例,包括各种多路复用字和分量1702。每个多路复用字可以具有相同的尺寸,例如,对于每个分量的8或10比特(bpc),具有48比特,或者对于12bpc,具有64比特。从并行子流解码器使用数据以便实时解码的顺序,获得多路复用字1702的顺序。
图18示出了子流多路分解逻辑1800的实例。逻辑1800包括存储器,例如,速率缓冲器1802、多路分解器1804以及具有VLD的漏斗移位器1806、1808以及1810。漏斗移位器和VLD的组合称为子流处理器(SSP)。在每个组时间,SSP的任意组合可以请求多路复用字或什么都不请求。如果从SSP接收到请求,那么多路分解器1804将多路复用字发送给这个SSP。如果在相同组时间内接收到多个请求,那么多路分解器1804将多路复用字发送给做出请求的每个SSP。
在切片结束时,SSP可以在子流层数据结束之后请求多路复用字。因此,编码器1300可以根据需要在切片结束时插入填充的多路复用字。
图19示出了子流多路复用逻辑1900的实例,包括VLC和漏斗移位器1902、1904、1906、平衡存储器(例如,FIFO)1908、1910、1912、多路复用器1914、速率缓冲器1916以及多路分解器模型1918。多路分解器模型1918有助于编码器1300正确地命令多路复用字。平衡FIFO 1908、1910、1912可以存储价值多组的数据,以便在合适的时间提供多路复用字。
速率控制
编码器1300和解码器1400可以使用相同的速率控制(RC)算法,其相同地配置。在解码器1400内模仿由RC算法做出的在编码器内调整QP的决定,以便在每个像素处,解码器1400具有与编码器1300相同的QP值,不消耗任何比特来传送QP值,除了平坦度指示以外。基于先前传输和接收的信息,在编码器1300和解码器1400内做出RC决定。RC可以改变每组的QP值。
速率控制目标
RC为编码器1300和解码器1400提供量化参数(QP),以供每组使用。由于RC函数在编码器侧和解码器侧上相同,所以编码器1300和解码器1400已知基础QP值,并且不需要在比特流中传输。然而,可以在用于下面描述的平坦度指示的比特流中发送基础QP值或者对基础QP值的调整。
RC试图确保假设参考解码器(HRD)一致性。具有理想的速率缓冲器(FIFO)的模型,该模型将用于编码每个组的不同数量的比特转换成特定的恒定比特率。RC被设计为确保这个FIFO不上溢或下溢,假设通过假定的恒定比特率去除比特。
RC在其QP决定中优化图片质量。由于知觉掩蔽,在较平坦的区域上使用较低的QP,并且在忙碌区域使用较高的QP是可取的。此外,所有像素保持恒定的质量;例如,第一行切片具有有限的预测是可取的,因此,可以使用额外的比特分配。
HRD缓冲模型
假设参考解码器(HRD)模型描述了解码系统中的理想的速率缓冲器的性能。编码器速率缓冲模型可以在解码器侧上反射。编码器模型试图确保没有上溢或下溢。由于DSC可以是恒定比特率(CBR),所以HRD模型充溢度等于缓冲器尺寸-编码器缓冲充溢度;因此,解码器缓冲模型不上溢或下溢。DSC编码器速率缓冲模型可以定义比特进入和离开速率缓冲器的方案。
在初始延迟期间,例如,初始传输延迟,编码器将比特生成其每组的速率缓冲,而不移除任何比特。在这个期间,编码器模型充溢度根据所生成的比特的数量增大。例如,可以根据组时间或像素时间,指定延迟周期。
只要在切片内具有更多待编码的像素,编码器就根据内容生成比特。以指定的恒定速率移除比特。为了防止缓冲充溢度降低为低于0,使用预测模型可以优先于使用MPP,这执行最小的数据速率。一旦编码了最后一组切片,就不将更多的比特加入速率缓冲器中。比特继续以恒定速率离开速率缓冲器,直到缓冲器变空,然后,编码器发送零比特,以确保在CBR操作中,以比特为单位的压缩切片尺寸等于bpp*切片中像素数量。
将解码器初始延迟指定为编码器初始延迟的补充;例如,HRD延迟减去编码器初始延迟。然后,解码器速率缓冲充溢度作为编码器缓冲充溢度的补码追踪。
CBR对VBR
在编码器速率缓冲器另外下溢时的条件下,具有编码器是否插入比特以防止下溢的设计选择,或者使用VBR。为了防止下溢,RC确定在下一个编码组之后是否能够具有下溢,并且在发生这个条件时,促使实施最小的比特率的MPP模式。由于解码器解码额外比特,正如任何其他组一样,所以解码器不要求任何特定逻辑处理填充物。
能够支持可变比特率(VBR)。在另外下溢并且不发送任何比特(关闭)时的某些情况下,通过VBR,编码器1300停止发送比特。然后,编码器1300再次在具有某个识别事件(打开)时开始发送比特。为了使开关VBR与不取决于传输的实时行为的一般HRD兼容,可以指定关闭和打开事件。
在另外下溢并且不发送任何比特时,通过VBR,编码器停止发送比特。编码器的RC过程每组操作一次。在每个组中,将编码该组的比特数加入缓冲模型中,并且通常,从缓冲模型中减去每组的比特的标称数,该标称数是3*bpp,必要时进行调整,以形成整数比特。通过VBR,如果从缓冲模型充溢度中这样减去比特/组,会造成负值充溢度,那么RC减去标称数量的比特,然后,将缓冲充溢度固定为0,即,决不允许模型充溢度为负数。在具有真实传输和真实解码器的真实系统中,在编码器不发送任何比特时,即,在其真实速率缓冲器为空时,输送不发送任何比特,并且解码器不接收任何比特。解码器的真实速率缓冲器可以为满,但是不上溢。在编码器发送比特时,预期输送通过正常的速率传输比特,并且解码器通过该速率接收比特。解码器的真实缓冲器不上溢或下溢,并且解码器不需要做任何特殊的事情来处理VBR。输送应理解具有以及没有可用于发送和接收的有效数据的时间。
切片
编码图片的比特数可以等于该图片的像素数乘以指定bpp率。而且,通过重写先前版本的每个相应切片,可以在压缩这缓冲器内的适当位置中,更新图片的切片的任意子集。结果,可以传输完整的图片,作为包括整个图片的一系列连续的切片,并且作为一系列连续的切片传输的整个图片满足与切片相同的要求,例如,比特数等于像素数乘以bpp率,而且,包括切片的整个图片应符合合适的HRD模型,以通过这个操作模式,确保正确的实时缓冲器行为。结果,从开始传输到开始解码的延迟以及从结束传输到结束解码的延迟彼此相同并且对于每个切片都相同。
算法使用可以称为速率缓冲器的速率缓冲模型。在每个切片的结尾,算法允许编码器的速率缓冲器具有高达指定的充溢度,例如,最大比特数。如果在编码切片的结尾,编码器的缓冲器具有比这个最大数量少的比特,那么可以在结尾使用(例如)0填充剩余的比特,以正好产生所需要的比特数。这个最后的比特数占据了指定的像素时间数,以通过指定的bpp率传输。这个像素时间数是从编码结束到传输结束的延迟,这可以称为最终传输延迟。在理想的编码器和解码器的组合中,以像素时间为单元的总速率缓冲延迟等于速率缓冲器尺寸除以bpp率。从开始编码切片到开始传输该切片的初始传输延迟与最终传输延迟相同。从开始接收切片到开始解码切片的初始解码延迟(例如,在HRD定时模型中的延迟)被设为等于总端对端速率缓冲延迟减去初始传输延迟。这允许每个以上描述具有正确的操作。
图20示出了切片定时和延迟2000的实例。图20示出了切片输入视频定时2002、切片传输定时2004以及切片解码定时2006。对于在切片结尾可以在编码器缓冲器中的最大比特数,该算法可以具有固定的参数值,通常是~4kbits。所产生的结束传输延迟是bpp率的函数;该延迟被设为ceil(4096/bpp_rate)。通过8bpp,这个延迟是170组时间,并且通过12bpp,这个延迟是114组时间。最初延迟可以设为这个值。
端对端HRD延迟等于HRD缓冲器尺寸除以bpp率。例如,如果HRD缓冲器尺寸是19,836比特,并且速率是12bpp,那么端对端HRD延迟是floor(19,836/36)=551组时间。这实际上是上限,并且HRD延迟可以设为更低值,然而,如果使用更低值,那么该算法不能充分利用可用缓冲器尺寸,用于RC的目的。
直接应用于HRD并且间接应用于真实的解码器的初始解码延迟应设为HRD延迟-初始传输延迟。在此处的实例中,初始传输延迟如上所述设为114组时间,初始解码器延迟是551-114=437组时间。这是应用于HRD的延迟,即,理想的假设解码器。真实的解码器当然自由地具有额外延迟。
该算法的速率缓冲器尺寸也是HRD缓冲器尺寸,只要不超出兼容解码器的能力,该尺寸就可以由编码器选择。最佳速率缓冲器尺寸是几个因素的函数,包括bpp率和切片的宽度。
要注意的是,初始传输延迟通常是bpp率的函数。只要不超出解码器的能力,HRD速率缓冲器尺寸就可以由编码器设置。通过可调的比特率以及从在编码器内的视频到在解码器外面的视频的恒定端对端延迟,并且通过从在解码器内的压缩数据到在解码器外面的视频的恒定延迟,设计真实系统是切实可行的。编码器可以将初始传输延迟和初始解码器延迟设为所选值,以促进通过恒定延迟无缝地改变比特率。
切片的选项
编码器1300和解码器1400支持广泛的切片宽度和高度。一个配置是切片宽度=1/4图片宽度,切片高度=32行。另一个可能的配置是切片宽度=图片宽度,切片高度=8行。切片尺寸可以由图片宽度乘以图片高度规定。为了尽可能减小需要发送的额外数据,可以在整个图片中使用相同尺寸的切片。
更高的切片可以造成更好的压缩。将额外比特分配给每个切片的第一行,以尽可能提高质量,并且防止在切片之间的界限处具有伪影。通过在PPS中的参数,设置在第一行上为每组分配的额外比特的数量。可用于每个切片的第一行之后的所有行的比特数可以减少,以便每个切片的总比特数是像素数乘以bpp率。在每个切片中的第一行之后具有更多的行,就要求更少地减少比特分配。因此,32行的切片高度通常提供比8行的切片高度更好的性能。没有与切片高度相关联的成本,没有额外缓冲,也没有任何其他额外资源。编码器1300和解码器1400支持等于整个图片尺寸的切片尺寸。
为了各自实际目的,具有比全屏幕宽度更窄的切片是可取的。更窄的切片提供通过部分更新来更新更窄的切片或者促进通过低成本进行并行处理的能力。实际上,每行的多个切片可以使用一个行缓冲器,即,图片宽度的尺寸。对于每行的多个切片以及比一行高的切片,用于不同切片的速率缓冲器可以独立(independent)。例如,对于每行4个切片,实际的实现方式使用4个速率缓冲器。虽然不确切地成比例,但是在最佳速率缓冲器尺寸是切片宽度的函数时,与通常为1个切片/行的情况规定尺寸相比,可以规定每个速率缓冲器的尺寸对于4个切片/行的情况更小。因此,在每行具有多个切片时,速率缓冲器空间的总量小幅增大,而缓冲空间的行总量不增大。
切片多路复用
在被配置为每个扫描线使用多于一个切片的系统中,可以根据特定的模式多路传输压缩数据,以便尽最小化编码器和解码器的成本。所推荐的模式如下。对于每行整数S个切片,每个切片具有每行P个像素,并且图片具有W个像素的宽度。优选地,P对于所有切片相等,等于W/S,其优选地为整数。多路传输的比特流包含的比特数=第一行切片的第一切片的P*bpp率,第一行的第二切片的P*bpp率,以此类推第一行的所有切片。
这个模式的一个迭代具有W*bpp率比特,这可以是与(如果每行具有一个切片)要使用的比特数相同的比特数。如果P*bpp率不是整数,那么可以进行调整,以便每个切片产生整数个比特。例如,一个切片的一行所包括的比特数可以是P*bpp的整数截断值加上先前截断的累积残余量。然后,这个模式根据需要重复多次,以传输第一行切片中所有切片的所有比特。应用规格(例如,被设计为携带DSC压缩图像数据的传输规格)可以在分开的数据包内携带不同切片的数据。在这种情况下,与其他切片的比特相比,一个切片的最后比特可以在与其他切片的数据包分开的数据包内,包括紧接在第一个之下的垂直相邻的切片的第一比特。或者,应用规格可以选择封装一个切片的最后比特和另一个切片的第一比特,例如,水平相邻的邻近切片或垂直相邻的邻近切片。对于整个图像,总体模式可以重复。在比特流中不需要包括标记或指示,表示哪些比特用于哪个切片。相反,输送层可以提供这种指示符。
关于切片多路复用的附加信息如下。
在禁止VBR时,可以发生切片多路复用,即,启用填充。在禁止填充时,编码每个切片的比特数可以变化,例如,DSC操作是VBR。图片包括某个数量的切片。在可能的情况下,例如,在图片宽度与切片宽度的比率是整数时,切片可以具有相同的尺寸。在这个比率并非整数的情况下,切片的列宽可设为相差不超过1的整数值,并且其总和是图片宽度。在也启用VBR时,也能够进行切片多路复用。所使用的存储器和多路复用模式取决于链路的特征,包括(例如)进入或离开低功率状态所需要的开销。
通过禁止VBR(启用填充),使用相同数量的压缩比特,编码相同宽度的切片。在切片宽度等于图片宽度时,依次发送切片层数据(切片0、切片1、…切片N-1,其中,N是切片的数量)。在切片宽度比图片宽度更短时,在相同行上的所有切片的切片数据可以多路传输到固定长度的数据块内。每个数据块的长度可以等于floor(bits_per_pixel*slice_width)。由于bits_per_pixel可以是分数,所以使用floor()(向下取整)函数。例如,在图片在每行上分成两个相同尺寸的切片的情况下,多路传输的比特流包含:
切片0数据块/切片1数据块/切片0数据块/切片1数据块…
由于ceil()函数,所以如果需要的话,那么每个切片的最终数据块可以填充有0比特。
通过启用VBR,编码每个切片的比特数可以与P*bpp率不同。例如,比特数可以小于这个值。每个数据块的比特数可以与floor(bits_per_pixel*slice_width)不同,例如,比特数可以小于这个值。可以使用不同比特数的数据块,多路传输切片。每个数据块的比特数可以(例如)由在传输层内的数据包长度信息或标记代码指示。
可以根据标记为Y、Co以及Cg的分量指定显示流编码。如果在当前的PPS内convert_rgb标志等于0,那么编码器可以接受YCbCr输入。可以将Cb分量映射到Co分量标签中。可以将Cr分量映射到Cg分量标签中。在这种情况下,Cb/Co和Cr/Cg分量的位深度可以等于Y分量,使用在当前的PPS内的bits_per_component字段指定Y分量的位深度。如果在当前的PPS内convert_rgb标志等于1,那么编码器可以进行从RGB到YCoCg的颜色-空间转换。颜色空间转换可以是:
CSCCo=R–B
t=B+(cscCo>>1)
cscCg=G–t
y=t+(cscCg>>1)
与Y相比,cscCo和cscCg值具有动态范围的一个额外比特。最终的Co和Cg值的中心可以在中点周围:
Co=cscCo+(1<<bits_per_component)
Cg=cscCg+(1<<bits_per_cornponent)
要注意的是,在此处,bits_per_component变量可以表示R、G以及B分量中的每个的比特数,该比特数小于Co和Cg分量的每个分量的比特数。如果切片延伸超过图片的右边,那么在每行图片中的最右边的像素可以重复,以将切片填充到正确的水平尺寸中。如果切片延伸超过图片的底边,那么在图片的每个像素列中的最底部的像素可以重复,以将切片填充到正确的垂直尺寸中。
线路储存器
显示流压缩可以包括缓冲存储器,用于保持前一行的重构像素值,用于MMAP预测和ICH。在某些情况下,解码器线缓冲器可以具有充足的存储,以包含全范围的重构样本。然而,一些解码器可以选择使用较小的位深度来降低实现成本。
如果使用更小的位深度,那么解码器可以将该深度传送给编码器。编码器可以根据解码器实现方式所支持的内容设置linebuf_width。可以使用比特减少的样本的以下方法:
shiftAmount=MAX(0,maxBpc-linebuf_width);
round=(shif Amount>0)?(1<<(shiftAmount-1)):0;
storedSample=(sample+round)>>shiftAmount;
readSample=storedSample<<shiftAmount;
其中,maxBpc是当前分量的位深度,storedSample是写入线缓冲器中的样本值,并且readSample是回读的值。
预测类型
在P模式中可以支持三种预测类型:MMAP、BP以及MPP。
改进的中值自适应预测(MMAP)
下面在表格中规定改进的中值自适应预测。
表2-包围当前组的像素
表2显示了包围预测的在该组中的三个像素(P0、P1以及P2)的像素的标记惯例。像素'c'、'b'、'd'以及'e'位于前一行,并且像素'a'是直接位于左边的重构像素。
在用于以下MMAP公式中之前,QP自适应滤波器可应用于前一行的参考像素中。水平低通滤波器[0.250.50.25]可以应用于前一行中,以获得过滤的像素filtC、filtB、filtD以及filtE。例如,
filtB=(c+2*b+d+2)>>2;
过滤的像素可以与原始像素混合,以获得用于MMAP(blendC、blendB、blendD、blendE)内的值。以下方法用于混合:
diffC=CLAMP(filtC-c,-QuantDivisor[qlevel]/2,
QuantDivisor[qlevel]/2);
blendC=c+diffC;
diffB=CLAMP(filtB-b,-QuantDivisor[qlevel]/2,
QuantDivisor[qlevel]/2);
blendB=b+diffB;
diffD=CLAMP(filtD-d,-QuantDivisor[qlevel]/2,
QuantDivisor[qlevel]/2);
blendD=d+diffD;
diffE=CLAMP(filtE-e,-QuantDivisor[qlevel]/2,
QuantDivisor[qlevel]/2);
blendE=e+diffE;
下面提供每个的预测值:
P0=CLAMP(a+blendB-blendC,MIN(a,blendB),MAX(a,blendB));
PI=CLAMP(a+blendD-blendC+R0,MIN(a,blendB,blendD),MAX(a,blendB,blendD));
P2=CLAMP(a+blendE-blendC+R0+Rl,MIN(a,blendB,blendD,blendE),MAX(a,blendB,blendD,blendE));
其中,R0和R1是组中的第一和第二样本的反向量化残差。
在第一行的切片的情况下,前一行的像素不可用。因此,每个像素的预测变成:
P0=a;
PI=CLAMP(a+R0,0,(l<<maxBpc)-1);
P2=CLAMP(a+R0+Rl,0,(l<<maxBpc)-1);
其中,maxBpc是正在预测的分量的位深度。
块预测(BP)
BP预测值是从位于当前像素的左边的某个数量的像素中提取的像素值。“块预测向量”(bpVector)是表示位于左边的像素的数量的值的负数,以用于预测。在一个实现方式中,块预测向量始终在-3与-10之间,包括-3和-10,这表示使用位于当前组的外面的样本。
BP预测值用于预测由块预测向量引用的像素的全部三个分量:
P[hPos]=recon[Pos+bpVector];
因此,3x1组的预测值与由块预测向量所指向的3x1组像素的重构像素值对应。
中点预测
中点预测值是等于或接近该范围的中点的值,并且取决于紧挨当前像素(在表2中,像素"a")左边的重构像素的值。
midpointPred=(1<<(maxBpc-1))+(a&((1<<ql_evel)-1));
其中,maxBpc是正在预测的分量的位深度,并且qLevel是应用于当前分量中的量化水平。
预测选择
块预测由编码器1300支持。通过将PPS信号中的block_pred_enable设为0,编码器1300可以选择禁止在流中进行块预测(例如,因为连接的解码器不支持块预测或者因为图片不从块预测中受益)。在这种情况下,通过块预测选择MMAP,并且不使用在这个部分中的算法。
可以使用前一行的信息,在组的基础上,做出使用BP还是MMAP的决定。这表示如果有助于实现,那么在处理当前组之前,可以对线路时间做出决定。在这个部分中提及的组从切片的最左边像素列中在hPos像素的水平位置开始。
图21示出了形成9x1SAD的3x1部分SAD的实例2100。首先,可以进行搜索,以找出最佳的块预测向量。用于SAD的参考像素可以是前一行中的9个像素的组,在hPos–6的水平位置开始。在参考像素与指向前一行的像素的9个不同块预测candidateVector’s(-1、-3、-4、-5、-6、-7、-8、-9以及-10)之间计算SAD。9像素的SAD计算为3个3像素SAD的总和(见图21)。首先,根据以下公式,在3像素SAD中计算总和之前,每个绝对差可以截断并且削减:
modifedAbsDiff=MIN(absDiff>>(maxBpc-7),0x3F);
其中,maxBpc是当前分量的位深度。
在三个相邻的样本的每组之上并且在3个分量之上,计算所产生的6比特imodifiedAbsDiff值的总和,产生10比特值,表示一个分量的3x1部分SAD;这个10比特值固定为9比特(例如,大于511的值固定为511)。计算三个9比特的3像素部分SAD的总和,以获得最终的9像素SAD,这是11比特数。在比较之前,截断每个9x1SAD的3个LSB:
bpSad[candidateVector]=MIN(511,sad3xl_0[candidateVector]+sad3xl_l[candidateVector]+sad3xl_2[candidateVector]),
9个9像素SAD彼此进行比较,并且可以选择最低的SAD,通过选择最小幅度的块预测向量,打破僵局。如果最低的SAD块预测向量是-1,那么bpCount计数器重设为0,并且为这个组选择MMAP。如果最低的SAD块预测向量并非-1,那么候选的BP向量变成具有最低SAD的向量,并且bpCount计数器增加,除非hPos<9。
如果以下条件都成立,那么可以选择BP:
bpCount值大于或等于3。
lastEdgeCount小于9。lastEdgeCount值表示经过的(由于出现“边”)像素的数量。对于任何分量,在ABS(当前样本-剩下的样本)>32<<(bits_per_component-8)时,“边”出现。
在BP/MMAP与MPP之间选择
如果选择BP/MMAP,编码器可以基于所生成的量化残差的尺寸决定是否使用BP/MMAP。例如,编码器可以为这三个分量的每个确定BP/MMAP的最大残差尺寸。如果任何分量的最大残差尺寸大于或等于这个分量的阈值,例如,maxBpc–qLevel,那么可以为这个分量选择MPP。
此外,编码器可以选择MPP,以便实施最小的数据速率,以防止下溢。
量化
从相应的输入样本中减去像素的每个样本的预测值,以形成残差样本值E,像素的每个分量具有一个值。
E=x–Px,其中,x是输入,Px是预测值。
可以使用由作为2的幂的除数截断的除法,并且使用通过小于除数的一半的四舍五入值(即,1)进行的四舍五入,量化每个残差值E。
If E<0QE=(E-ROUND)/DIVISOR
Else QE=(E+ROUND)/DIVISOR
//"/"运算符是通过截断进行的除法,与在C语言中一样。
其中:
DIVISOR=2**qLevel=1<<qLevel
ROUND=DIVISOR/2-1
对于亮度和色度,qLevel的值可以不同,并且由速率控制(RC)函数决定。
可以检查MPP量化残差,以确保其尺寸不超过阈值,例如,maxBpc–qLevel,其中,qLevel是分量类型(亮度或色度)的量化等级,并且maxVal是分量类型的最大可能样本值。如果MPP残差超过这个尺寸,那么编码器可以将该残差变成具有maxBpc–qLevel的尺寸的最近残差。
反向量化和重构
加密器可以遵循在解码器中使用的相同过程,以得到重构像素值。对于使用MMAP、BP或MPP预测的像素,重构样本值可以是:
reconSample=CLAMP(predSample+(quantized_residual<<qLevel),0,maxVal);
其中,predSample是预测样本值,quantized_residual是量化残差,qLevel是分量类型(亮度或色度)的量化等级,并且maxVal是分量类型的最大可能样本值。
平坦度QP覆盖
图22示出了用于编码器平坦度检查的原始像素的实例2200。如果即将来临的输入像素比较平坦,以允许QP快速降低,那么编码器生成“平坦度信号”。下面描述用于在语法中确定平坦度比特的编码器算法,与编码器和解码器为了修改QP所遵循的算法一样。
编码器平坦度决定
一组4个连续的组称为超群。在编码之前,编码器检查每个超群,以便确定(如果有的话)那些组是“平坦的”。第一超群以在图22中所示的切片中的第二个组开始。可以连续地在切片内定义超群。包括一行的最后一个组的超群可以缠绕在周围,以在后续的行上包括组。
可以在超群内为每个组单独地进行平坦度决定,并且该决定包括用于每个组的“平坦度类型”(例如,略微平坦或非常平坦)的决定。使用原始的未压缩图像的像素,可以进行两个平坦度检查。
平坦度检查1在图22中所示的样本之间为每个分量确定MAX和MIN值。为每个分量确定flatQLevel值:
flatQLevel=MapQpToQlevel(MAX(0,masterQp-4));
所使用的masterQp值是用于位于正在测试的超群左边的第二组的速率控制的值。MapQptoQIevel将masterQP值映射到用于亮度和色度的qLevelY(亮度)和qLeveIC(色度)值中。例如,masterQP值0可以映射到qLeveIC和qLevelY值0中,值1和2可以分别映射到qLeveIC值1和2中,并且masterQP中的连续单元增大可以映射到在qLevelY与qLeveIC之间交替的单元增大中。
如果用于任何分量的MAX–MIN大于(2<<(bits_per_component-8)),那么非常平坦的检查未通过平坦度检查1;否则,通过该检查。如果用于任何分量的MAX–MIN大于QuantDivisor[flatQLevel],那么略平坦的检查未通过平坦度检查1;否则,通过该检查。
如果平坦度检查1指示该组略微平坦或者非常平坦,那么该结果是用于该组的最终结果。如果都未通过,那么在图22中指示的6个像素之上进行平坦度检查2。与在平坦度检查1中一样,进行相同的比较,除了在6个样本(而非4个)上计算MAX和MIN以外。然后,平坦度检查2的最终结果用作该组的最终结果。
对于规定的超群,然后,具有不平坦、略微平坦或者非常平坦的四个平坦度指示。如果先前的超群具有平坦度指示,那么prevlsFlat值初始化为1;否则,初始化为0。以下算法用于将平坦度信息提取到单个平坦度位置和类型内:
Loop over four groups in supergroup{
If!revlsFlat&&group is either very flat or somewhat flat
Current group and flatness type is signaled
Else
prevlsFlat=0;
}
如果未选择组,那么不进行QP修改,并且在熵解码器中,将超群的flatness_flag设为0。如果选择组,那么将超群的flatness_flag设为1,并且用信号传输相应的组,与在比特流中的first_flat组及其相关的flatness_type一样。如果masterQp值在flatness_min_qp和flatness_max_qp的范围内,那么熵编码器仅仅用发信号告知flatness_flag,因此,如果相应的masterQp超出范围,那么在RC内不进行任何调整。
编码器平坦度搜索不跨越到下一行。如果在超群内的一个组落在下一行上,那么不将其视为平坦。然而,一行的第一组可以包含next_flatness_flag语法元素,假设语法允许其在这个点(见部分错误!未发现参考源(Error!Reference source not found.))。
平坦度QP调整
编码器和解码器对组做出了相同的QP调整,其中,做出了平坦度指示。RC接收与超群内的特定组对应的可以为“略微平坦”或“非常平坦”的平坦度信号。应注意的是,如果当前的masterQp小于7<<(2*(bits_per_component-8)),那么可以假设平坦度指示“略微平坦”。
对于“非常平坦”的信号,如下调整QP:
masterQp=1<<(2*(bits_per_component-8));
对于“略微平坦”的信号:
masterQp=MAX(stQp-4,0);
如果特定组没有平坦度信号,那么:
masterQp=stQp
如果平坦度QP覆盖修改masterQp,那么修改的masterQp用作在下一个RC周期上的短期速率控制的起始点。
缓冲器模型和速率控制
除了上述实现方式以外或者作为上述实现方式的扩展,例如,参照图7,接下面描述一些额外的速率控制技术。在一些实现方式中,编码器和解码器确保完整的图像在固定数量的比特内配合。所描述的虚拟缓冲器模型采用所定义和所控制的比特率/像素和比特率/单位时间。在一些实现方式中,每个图片的比特总数可以比像素数乘以比特/像素的乘积大高达缓冲模型的尺寸。在一些实现方式中,编码器将整个编码图片尺寸限制为像素数乘以比特/像素率的乘积。在这方面,可以编码整个图片,以便可以在等于图像中行数的多个行时间上传送,并且在那些行内,每个像素时间可以具有固定的或限制比特数。
上述虚拟缓冲器模型的一个变型例是,对编码器和/或解码器使用的缓冲器模型的充溢度增大充溢度偏移。可以算法规定充溢度偏移的值。预先确定从开始编码到开始传输的延迟以及从开始接收到开始解码的延迟。例如,初始传输延迟可以是一个行时间,并且初始解码延迟可以是一个行时间,而缓冲器模型尺寸可以足够大,以便按指定的传输速率容纳6个行时间。
在这个实例中,充溢度偏移可以具有5*R*TI(5*指定速率*一个行时间)的初始值。由于偏移造成缓冲其模型的底部5*R*TI部分不可使用,所以这促使编码器确保缓冲器模型的充溢度不超过1*R*TI。然后,编码器可以将偏移值减小,针对每个预定像素数减少预定量(例如,每个像素一次,或者每3个像素的组一次,或者其他量)。例如,可以选择偏移值减小的预定量,以便在第一行视频结束时,偏移变成4*R*TI。结果,编码器可以用于编码第一行的最大比特数是2*R*TI,并且结果,确保在2个行时间内完成第一行的传输,从开始传输开始。解码器在传输开始加上任意延迟开始接收数据。稍后,解码器在一个行时间后(例如,初始解码延迟)开始解码,并且在此时间的一个时间行后,解码器完成第一行的解码。因此,解码器确保到需要数据的时间,接收解码第一行所需要的所有数据。
编码器可以继续将充溢度偏移减少,例如,相同的预定比特数/像素,直到偏移值达到0。在这个实例中,在第五行的结尾偏移达到0。偏移保持0,直到偏移开始增大的另一个时间。例如,在从图像的结尾往上第五行的行开始,充溢度偏移可以开始增大相同的预定比特数像素,并且继续增大,直到在图像的结尾像素处达到值5*R*TI。由于充溢度偏移值,编码器对图像完成编码,在缓冲器模型中具有不多于1*R*TI比特。可以在1*TI或更少的时间内传输这个比特数。由于在这个实例中,解码器在开始接收压缩数据1*TI之后开始解码图像,所以在数据接收的最后行时间1*TI之后,完成对最后一行图像的解码。如上所述,编码图像结尾的所有比特在1*TI内被传输并因此被接收,所以到需要的时候,解码器接收到了图像的所有比特,包括图像的最后像素。
在这个实例中,在等于图像的行数的多个行时间内,以预定的速率R传输图像的所有比特。缓冲器模型性能有助于整个图像的高质量编码,在第一和最后一行具有大幅速率控制自由,并且其他行具有甚至更大的速率控制自由。在缓冲器模型的尺寸是6*R*TI的这个实例中,对于除了前五行和最后五行以外的所有图像,编码器具有利用缓冲器模型的整个6*R*TI尺寸来有效地对图像内容编码的自由。
相同的技术可以应用于图像的区域中。例如,对于编码器将图像分成固定数量的切片是可取的。每个切片可以具有基本上相同数量的行。例如,在具有1080行的图像中,可以具有8个尺寸相同的切片,每个切片135行。本文公开的技术可以用于确保在135个行时间内完全传送每个切片。在以上解释中,切片的开始可以代替图像的开始,并且切片的结尾可以代替图像的结尾。
速率控制的缓冲器模型将用于编码每个组或其他组样本的不同数量的比特转换成规定的恒定比特率。在对每个组编码时,将用于编码该组的比特数加到缓冲器充溢度中,并且从缓冲器充溢度中减去每个组待传输的比特数。结果称为缓冲器模型充溢度,或者简称为bufferFullness。这个缓冲器充溢度通过线性变换(例如,偏移和标度)进行修改,以产生称为rcModelFullness的值。变换可以将额外比特分配给每个切片的第一行,并且将较少的比特分配给其他行,以便在每个切片结尾,将编码器缓冲器内的最大比特数限制为任何规定的界限。第一行分配和切片界限的结尾可配置。
由于每组指定数量的比特可以包括分数分量,所以在CBR操作中,每组从缓冲器模型中去除的比特数在一个组到下一个组可以略有出入。指定bits_per_pixel率可以使用4个分数位,例如,提供每个像素1/16比特的分辨率。如果指定每组的比特数是整数,那么每组从缓冲器模型中移除的比特数等于指定的整数。如果分数分量并非0,那么每组移除整数个比特得到的分数残差被保持并且应用到下一个组中。
在一个实现方式中,rcModelFullness可以限定为使用负值,其中,空状态由-rc_model_size的值表示,并且满状态由0值表示。RC算法可以设计为将rcModelFullness值保持在空(例如,-rc_model_size)与满(例如,0)之间。偏移值rcXformOffset和标度值rcXformScale被设计为将始终非负的实际缓冲器充溢度bufferFullness转换成速率控制缓冲器模型充溢度rcModelFullness。如下面所述,空等级在数字上是负并且满等级是0的原因涉及设计线性转换的方式。
RC算法动态选择量化参数(QC),以在其有效范围内保持rcModelFullness,并且优化主观质量。通常,RC试图用大约目标数量的比特编码每个组,而编码每个单独的组所消耗的比特数可以能幅变化。这种行为允许有效地编码异常困难的图像特征;这有助于在图像上保持几乎相同的主观质量,而不浪费比特。
在图23中显示了速率控制技术2300的整体结构。整体技术包括缓冲等级跟踪器2350、线性转换2352、参数选择2354以及QP调整2356。下面详细描述其中的每个。
上述速率控制技术对于稳态操作非常良好,例如,在编码器对整个图像编码时。下面描述的切片速率控制技术解决了对图像的初始部分(例如,切片的第一行)编码的问题,同时满足对每个切片的总比特数num_pixels*bpp(比特/像素率)的限制。
上述速率控制技术的一种自适应是保持比特总数小于或等于规定数量的像素(num_pixels)乘以bpp的乘积。在一个实现方式中,通过在编码最后一个像素时限制编码器的缓冲器内的比特数,并且根据这个限制,延迟每个图片或切片的开始传输,这些技术可以这样做。切片可以具有一行或多行的高度,其中,每行通常具有1个像素的高度。每个切片或图片的初始部分(例如,第一行)的编码与切片的剩余行的编码共同优化。“切片”可以包括整个图片是一个切片的情况。这些技术根据预测信息在第一行的不可用性为第一行分配额外比特,并且相应地为在切片内的所有其他行分配更少的比特。
编码器为第一行分配的额外比特数取决于用于每个切片的第一行实现期望的主观质量等级的比特数并且取决于正在编码的内容。编码器可以平衡这个数量和分配给剩余行的减少的比特数,以便满足total_bits<=num_pixels*bpp的约束条件。
待压缩的图像内容广泛地变化。为了确定在第一行和其他行的比特数的值,可以检查代表性图像,例如,被视为难以编码的图像。经验证据指示,例如,对于12bpp(比特/像素)恒定比特率编码,在第一行中的像素均应平均分配额外的5bpp。即,用于编码在第一行中的像素的平均比特数可以大约为17bpp。然而,串流率在CBR(恒定比特率)编码中保持12bpp。CBR率表示离开速率缓冲器的比特的率,而用于编码每个像素的多个比特进入速率缓冲器。对于编码不太具有挑战性的图像,可以获得充足的质量,编码每个像素平均消耗更少的比特。对于不是特别难以适当地编码的图像,无损地编码或者至少以降低的质量编码是可取的。
编码器可以实施上限,即,无论对每个图像编码多么困难,在每个切片结尾,编码器缓冲器内的最大比特数。可以凭经验确定在每个切片结尾解码器缓冲器内可以允许的最大比特数。实验表明,4kb(4,096比特)是合适的值,但是可以根据应用,选择其他值,例如,2kb或8kb。
在一个实现方式中,速率控制适应功能利用编码器缓冲模型充溢度的变换形成速率控制(RC)缓冲器模型充溢度。这两个值可以分别称为“实际充溢度”和“RC充溢度”。变换可以是线性转变换,例如,乘以标度值并且加上偏移值,或者可以是非线性变换。
RC充溢度影响量化步长或参数(QP)。具体而言,随着RC充溢度的增大,QP也可以增大,并且编码单个像素的比特数总体上减少。随着RC充溢度的减小,QP也减小,并且编码单个像素的比特数总体上增加。编码器可以实现RC充溢度范围,并且对于任何给定范围,可以具有最小QP和最大QP。下面的RC控制技术将每个像素的额外比特分配给第一行,以帮助避免图像伪像,尤其是考虑到任何在先预测信息不能用于第一行,以帮助第一行编码。这些技术可以给第一行分配每个像素的预定数量的额外比特,造成第一行切片具有更好的编码一致性。对于后面的行,可以去除每个像素预算的额外比特。
在一个实现方式中,RC充溢度的值可以计算为RC充溢度=(实际的充溢度+偏差)*比例。
缓冲等级跟踪器
图24示出了缓冲等级跟踪器2350的实例。
codedGroupSize输入2402是熵编码器或熵解码器的输出,指示用于编码前一个组的比特数。bitsPerGroup输入2404是给每个组分配的比特数,如果bits_per_pixel包含非零分数比特,那么该比特数可以通过+/-1而变化:
bpgFracAccum+=(3*bits per pixel)&Oxf;//4fractional bits
if(groupCount<initial enc delay)
bitsPerGroup=0;
else
bitsPerGroup=floor(3*bits per pixel)+(bpgFracAccum>>4);
bpgFracAccum&=Oxf;
如果vbr_enable等于1,那么如果最终的修改值小于0,那么bufferFullness输出2406固定为0。在这种情况下,forceMpp输出2408可以始终是0。
如果vbr_enable等于0,那么比特填充检测逻辑2410检查下一个组是否可以潜在地造成下溢条件(例如,造成bufferFullness小于0)。如果这样的话,那么forceMpp输出2408设为1,这表示熵编码器使用MPP模式,以便保证最小的比特率或者防止缓冲器下溢。可以如下确定forceMpp输出2408:
forceMpp=(groupCount>initial enc delay)&&(bufferFullness<ceil(bits_per_pixel*3)-3);
其中,groupCount是在0处开始每个切片并且增大每个组的计数器。寄存器2412储存缓冲器充溢度的当前值。
图25示出了可以实现速率控制的编码器逻辑2500的实例。编码器逻辑2500实现缓冲器模型2502、变换逻辑2504(其可以实现变换逻辑2352)以及量化调整2506逻辑(作为实例,其可以实现逻辑2354和2356)。编码器逻辑2500还包括产生偏移值2508的偏移值发生器2512以及生成比例值2510的比例值发生器2514。实现方式可以是硬件、软件或这两者的形式,并且下面进一步详细地描述。
为了说明速率控制,假设bpp速率是12bpp,每个切片的第一行应分配17bpp,并且切片具有8行的高度。每个切片的比特总数是12bpp*slice_width*8行。由于为第一行分配17bpp,所以剩余行的预算是(12bpp*8lines-17bpp*1line)/(8-1)行,或者大约是11.29bpp。假设在每个切片结尾,在缓冲器内允许的最大比特数=4kb(千比特)。与传输4kb对应的像素时间数是ceiling(4096b/12bpp)=342像素时间。因此,初始传输延迟设为342像素时间。换言之,在每个切片开始时,前342个像素时间不传输任何数据,随后,对于等于切片中的像素数的大量像素时间,以12bpp传输数据,包括在编码最后的像素之后的342像素时间。
对于第一行的前342个像素,数据以大约17bpp的速率累积在编码器缓冲器内,总共大约342*17=5,814比特。假设图像宽度是1920个像素,在第一行中具有1920-342=1,578额外像素。在这些像素编码时,期望用于对每个像素编码的比特数平均为17bpp,而传输速率为12bpp,因此,编码的数据以大约5bpp的速率累积在编码器缓冲器内。这个额外的累积大约为1578*5=7,890比特。在这种情况下,在第一行的结尾在编码器缓冲器内的比特的总累积数大约为5,814+7,890=13,704比特。
编码器可以使用偏移值发生器2512为偏移值2508生成值。发生器可以产生偏移值,这些偏移值遵循轨迹,以便在切片或图片的编码中,实际充溢度+偏差的总和在各个点处具有期望值。例如,继续以上实例,在编码切片的前342个像素之后,预期的实际缓冲充溢度可以是5814比特,并且期望的RC充溢度可以是2048比特,因此,紧接在编码第342个像素之后,偏移值可以是2048-5814=-3766。在编码第一像素之前的偏移值可以是0。在编码第一整行之后的预期的实际缓冲充溢度可以是13704比特。如果期望的RC充溢度在这个点是2kb,那么偏移值可以是2048-13704=-11656。在切片结尾,偏移值可以是0。偏移值可以从第一指定值线性地进展为第二指定的值,然后,进展为后续指定的值。即,偏移值可以在拐点之间分段成线性,例如,在图26中,从0到-3766、从-3766到-11,656、从-11,656到0。要注意的是,以上实例使用正速率控制阈值(见图28),并且在沿着偏移值的轨迹的任何指定的点,偏移值可以是负或正。在其他实现方式中,速率控制阈值可以是负值阈值。在这种情况下,偏移值可以严格地是负值,这是因为实际充溢度是非负的,并且负偏移值用于使变换的充溢度值向下进入负阈值范围内。
编码器逻辑2500可以使用比例值发生器2514为比例值2510生成值。比例值发生器2514可以被设计为产生遵循指定轨迹的比例值。例如,比例值在切片的开始处可以是1,并且保持1,直到在切片内的某个像素,然后,在切片结尾,线性进展成诸如2的另一个值。在图24的实例中,在切片结束时,偏移值是0,并且比例值是2。结果,实际充溢度值4k产生RC充溢度值8k。如果设计目标是将编码器缓冲器内的最大比特数限制为4k,同时RC算法使用将RC充溢度限制为8k的控制算法,那么这是可取。与偏移值2508一样,比例值2510可以在拐点之间分段成线性,例如,在图26中,在一段时间保持1.0,然后,从1.0线性增大为2.0。比特轨迹可以在实现方式之间不同。例如,在切片开始和结尾,比特轨迹可以试图将有效速率控制阈值的底部保持为大约0。而且,这种比特轨迹的近似值可以用于降低实现方式复杂度或出于其他原因。
图26示出了随着时间的比特轨迹2600的实例,如上所述,包括比例参数2510和偏差2508。图26还说明了参数对RC充溢度2602的影响,并且还显示了预期的最大实际缓冲器充溢度2604。如图所示,将17bpp(标称的12bpp加上额外的5bpp)分配给前342个像素,并且将5bpp分配给这行的剩余部分。在时间段2650期间,比特累积在缓冲器内,用于342像素的传输延迟,并且随后,在时间段2652期间,以12bpp离开缓冲器。由于将17bpp分配给第一行,在时间段2652期间在缓冲器内以5bpp累积。在第一行之后,在时间段2654期间,随着比特继续以12bpp离开缓冲器时,所分配的bpp降低为低于12,并且实际缓冲充溢度相应地下降。在切片结尾,在缓冲器内实际上依然保留2kb,但是由于比例值是2.0,所以RC充溢度是4kb。并且用于第一行的额外比特预算可以广泛地变化。例如,标称bpp的数量可以在6与24之间的范围内。
RC技术允许在切片结尾的实际缓冲充溢度非零。这有助于避免在切片结尾重量化,重量化会造成视觉伪像。响应于图像内容,RC技术允许速率缓冲器追踪到通常要去的地方。要注意的是,将比例值2510被应用于缓冲充溢度。因此,比例值2.0将标称缓冲范围(例如,8kb)有效地降低为更小的范围(例如,4kb)。即,在编码器希望真实的缓冲器充溢度在更小的范围内追踪时,编码器可以应用比例值,以减小有效的缓冲范围。
或者,偏移值发生器2512可以被配置为生成偏移值,例如在切片结尾偏移值达到4k。例如,在切片结尾的实际充溢度4k加上偏移值4k在切片结尾产生RC充溢度值8k。
或者,偏移值2508可以遵循以负值(例如,-4k)结束的轨迹。在这个实例中,RC算法可以具有从-8k到0的RC充溢度的有效范围,其中,-8k可以与空缓冲模型对应,并且0可以与满缓冲模型对应。比例值可以遵循多个不同的轨迹。例如,一个轨迹从切片的开始具有大于或等于1的值,然后,在对切片的内部编码时降低为(例如)等于1的值,然后,在切片结尾增大为大于或等于1的比例值。
图27示出了对于不同类型的内容关于比例参数2510的偏差充溢度和实际充溢度的一个实例2700。具体地,实例2700说明了被视为最糟糕情况内容、困难内容、容易内容以及中等内容的偏差充溢度和实际充溢度。在图27中引用“WC”表示“最糟糕情况”场景。
变换逻辑2504进行的比例值2510和偏移值2508的线性变换对切片的过程中的缓冲充溢度进行管理。该变换逻辑具有三个主要功能:1)在切片期间,包括初始延迟,保持质量恒定;2)为每个切片的第一行分配额外比特;以及3)通过限制最终编码器缓冲器充溢度,确保切片在正确数量的比特内编码。
图27示出了由比例值2510造成的范围压缩。在左边,以实际缓冲器充溢度0到8kb的范围开始,并且在右边,以0到4kb的范围结束切片。图27示出了位于第一行2702结尾的右边的比特轨迹。要注意的是,用于‘容易’内容的实际充溢度不低于0,但是,可以生成额外比特以保持实际充溢度高于0。
在图27的下部,显示了缓冲器模型充溢度的范围0到-8k。下部显示了在应用比例和偏差之后充溢度发生的情况以及充溢度如何落在范围内。
在一个实现方式中,线性变换逻辑2352或2504实现以下内容,其中,比例值2510称为rcXformScale,并且偏移值2508称为rcXformOffset:
rcModelFullness=(rcXformScale*(bufferFullness+
rcXformOffset))>>3
rcXformOffset被设计为执行上面列出的功能。在整个切片中应用rcXformScale因子,以将减小的实际缓冲器充溢度范围变换成切片结尾处满缓冲器模型充溢度范围,对切片开始处的范围变换具有一定影响,并且在切片的过程中逐渐改变变换,例如,在第一行之后开始。
编码器可以选择rcXformOffset值的负范围,以便产生rcModelFullness的负范围。由于由粗糙量化乘以接近0的值造成的误差项产生几乎为0的值,所以这样做,以便在几乎为满时,rcXformScale因子的粗糙分辨率对rcModelFullness的值具有最小影响。rcXformScale因子量化误差反而移动到rcModelFullness范围的空端,其中,具有微不足道的影响。
rcXformOffset值在已知的初始值initial offset-rc_model_size处开始每个切片。每个组的rcXformOffset修改包括几个物体的叠加:
在一个实现方式中,在初始延迟期间,rcXformOffset以每组(bits_per_pixel*3)比特的速率减小。
在整个切片期间,rcXformOffset以slice_bpg_offset速率增大。
在第一行切片期间,rcXformOffset以每组first_line_bpg_offset比特的速率减小。
在非第一行切片期间,偏移通过每组nfl_bpg_offset比特的速率增大。
虽然在接近切片的结束之前,不可能实施这个限制,但是在非第一行切片期间,可以防止rcXformOffset超过final_offset-rc_model_size。
例如,以11个分数位的精度跟踪rcXformOffset值。因此,以11个分数位的精度,规定每组调整,例如,slice_bpg_offset或nfl_bpg_offset。在切片开始,初始rcXformScale值设为initial_scale_value。因此,在切片开始时,初始比例因子可以大于1。在切片开始,对于每个scale_decrement_interval组,rcXformScale因子减小1,直到达到统一比例。
由于每scale_increment_interval组,所以在切片的最后一行上,rcXformScale因子从(例如)8(以1/8为单位)开始平稳地增大(例如)1。
rcXformOffset和rcXformScale的有效效应在于,根据分配在第一行中的额外比特以及指定的初始传输延迟,允许缓冲器充溢度增大,以从第一行的结尾开始直到切片的结尾,平稳地减小最大充溢度,并且确保在切片的结尾,缓冲器内的比特数不超过initial_enc_delay*3*bits_per_pixel,即,子流多路复用过程可以生成的最大填充比特数。
长期参数选择
如上所述,在编码器内包括长期参数选择逻辑2354。在长期参数选择逻辑2354内,rcModelFullness的值可以分类为在多个范围中的一个中,例如,在图28中所示的范围2800。这组范围由一组阈值确定。例如,可以具有由14个阈值(rc_buf_thresh)和rc_model_size限定的15个范围。对于每个范围,可以具有最小量化值(rc_min_qp)、最大量化值(rc_max_qp)以及调整每组的目标比特的偏移(rc_bpg_offset)。
用于每个范围的rc_min_qp和rc_max_qp被配置为在RC缓冲器充溢度等于或接近空时,RC将masterQp值设为0或接近0,并且在RC缓冲器充溢度接近满时,RC增大masterQp值,在RC缓冲器充溢度接近满时,最后达到将masterQp设为最大有效值的点。每组的目标比特数在RC充溢度为空时最大,并且在RC充溢度为满时最小。
将rc_model_fullness与多个阈值比较,以确定其在15个范围中的哪个中。每个范围具有用于短期速率控制的相关联的rc_min_qp、rc_max_qp以及rc_bpg_offset。在一个实现方式中,编码器使用从-rc_model_size到0的阈值,并且通过从一组正限定的阈值中减去rc_model_size,可以发现这些值。可以假设每个阈值的6个LSB是0,以促进阈值比较功能的有效查找表实现方式。
在缓冲器模型充溢度的每个范围的值minQp、maxQp以及bpgOffset装有与和rcModelFullness对应的范围对应的rc_min_qp[]、rc_max_qp[]以及rc_bpg_offset[]值。
短期参数选择
如上所述,在编码器内包括短期参数选择逻辑2356。短期参数选择逻辑2356对QP进行调整,并且可以使用熵编码器的信息,以便对QP进行最终调整。
短期参数选择逻辑2356可以实现在图29中所示的短期速率控制逻辑以及在图30中所示的QP递增逻辑。参数minQP表示给定范围允许的最小QP值。先前的QP(prevQp)的值是为先前的组生成的最近的主QP值(masterQp)。在图30中,在此之前使用的masterQp称为prev2Qp。
逻辑2900确定每个组比特(BPG)的目标,tgtMinusOffset以及tgtPlusOffset(2902)。根据测试2904、2906以及2908的结果,短期QP(stQP)改变。具体而言,stQP可以变为:先前的QP减去1和最小QP除以2的最大值(2910)、先前的QP减去1和最小QP的最大值(2912)、递增值(2914),或者可以保持在先前的QP(2916)。
图30(例如,与图29一起)示出了可以生成递增值的实例QP递增逻辑3000(2914)。逻辑3000将当前QP设为最小QP和前一个QP的最大值(3002)。根据测试3004、3006、3008、3010以及3012的结果,根据两个选择中的一个,设置stQP。在第一选择中,将stQP设为当前QP(3014)。在第二选择中,将stQP设为最大QP和当前QP加上递增量的最小值(3016)。如在以下段落中所述,可以确定递增量incrAmount。
rcXformBpgOffset值是对于每个切片中的第一行是正数并且对于在切片中的所有其他行是负数的偏移,在内部计算该偏移:
if(first line of slice)
rcXformBpgOffset=first_line_bpg_offset;
else
rcXformBpgOffset=-floor(nf1_bpg_offset);
if(groupCount>=initial_enc_delay)
rcXformBpgOffset-=floor(slice_bpg_offset);
用于每组的目标比特数(例如,速率控制使用的目标活性等级)称为rcTgtBitsGroup:
rcTgtBitsGroup=round(3*bits_per_pixel)+bpgOffset+rcXformBpgOffset
除了响应于rcModelFullness以外,RC使用称为rcSizeGroup和codedGroupSize的熵编码的值根据图像的活性(activity)的测度调整QP,rcSizeGroup和codedGroupSize是当前组之前的组的活性的粗糙测度。速率控制计算每个组的高比特和低比特阈值:
tgtMinusOffset=rcTgtBitsGroup-rc tgt offset lo
tgtPlusOffset=rcTgtBitsGroup+rc tgt offset hi
比较codedGroupSize和rcSizeGroup值以及tgtMinusOffset和tgtPlusOffset,以确定图像的局部区域的活性是在期望的范围内、低于期望的范围还是高于期望的范围。还比较rcSizeGroup的值和表示每组的最小可能比特数的常数3。基于这些比较,RC增大或减小QP,或者使QP不改变,经受应用于每个范围的最小和最大QP界限。
如果rcModelFullness落在最顶部的范围内,那么QP可以自动设为用于该范围的rc_max_qp,以免缓冲器上溢。在图30中显示了三个其他参数:rc_edge_factor、rc_quant_incr_limit1以及rc_quant_incr_limit0。
上面使用的参数的描述如下:
rcXformBpgOffset-如上所述确定的表示为切片的不同行选择的每组比特的偏差的内部变量。
first_line_bpg_offset-这个值指定了为切片的第一行上的每组分配的额外比特数。
nfl_bpg_offset-这个值指定了为切片的第一行之后的组中的每个组解除分配的比特(包括分数比特)数。
slice_bpg_offset-这个值指定了为所有组解除分配的比特(包括分数比特)数,以便实施切片约束(例如,最终充溢度不能超过初始编码器延迟*每组比特)。
initial_offset-这个值指定了rcXformOffset的初始值,例如,该值是在切片开始时的initial_offset-rc_model_size。
final_offset-这个值指定了rcXformOffset的最大切片结束值,例如,该值是final_offset-rc_model_size。
rc_edge_factor-这个值可以与当前活性与先前活性的比率进行比较,以便确定“边”的存在,这反过来确定QP是否在短期速率控制内递增。
rc_quant_incr_limit0-这个值可以是用于短期速率控制的QP阈值。
rc_quant_incr_limit1-这个值是可以用于短期速率控制的QP阈值。
rc_tgt_offset_hi-这个值指定在由短期速率控制允许的每组目标比特周围的可变性范围的上端。
rc_tgt_offset_lo-这个值规定在由短期速率控制允许的每组目标比特周围的可变性范围的下端。
可以根据以下内容确定QP的增量(incrAmount):
incrAmount=(codedGroupSize-rcTgtBitsGroup)>>1;
所产生的QP称为stQP,这可以由上面参照图22描述的平坦度QP覆盖逻辑修改。
编码器将masterQp值映射到用于亮度和色度的qLevelY和qLevelC值中。编码器可以实现各种各样的映射,在以下表格中显示了其中的一次。
返回上面参照图25记录的偏移和比例参数,并且提供一些特定的实例,偏移值发生器2512和比例值发生器2514可以产生描述为线性轨迹的值的粗糙近似值。例如,差分值可以加入用于每特定数量的像素的累加器中。比例和偏移值以及使用这些值的操作可以具有指定的精度和分辨率。
作为一个具体实例,在切片的整个编码中获得大约2kb的RC充溢度是可取地。如上所述,编码器可以将包括偏移和比例因子的线性变换应用于实际充溢度,以产生RC充溢度。在整个第一行中,比例因子具有1.0的值。在第一行的第一个像素中,偏移值=0并且比例值=1。虽然可以在第一像素处可取地使用正偏移值,以便获得RC充溢度值2kb,但是对于可以无量化损耗地潜在地编码的不太困难的内容,这不可取,因此,在这个实例中,初始偏移值设为0。
在第一像素,由于比例因子是1并且偏移是0,所以RC充溢度等于实际充溢度。在对前列像素集(例如,前342个像素)编码时,对于困难的图像,实际充溢度以大约17bpp的速率增大。为了在前列像素集结尾实现2kb的RC充溢度,在第342个像素处,偏移值从0线性减小为-(342*17)+2048=-3,766值。即,对于342*17=5,814比特的实际充溢度,应用偏差-3,766,产生5,814-3,766=2,048比特的RC充溢度。在第一行的剩余1920-342=1578像素编码时,对于这1578个像素,使偏移值以5bpp的速率在第342个像素处从-3,766开始线性减小,从而RC充溢度再次保持为大约2kb,在第一行结束时产生-3766-(5*1578)=-11,656的值。在第一行结尾,预期用于编码第一行的比特数大约为1920*17=32,640,预期实际充溢度大约为342*17+1578*5=13,704比特,并且所产生的RC充溢度大约为13,704-11,656=2,048比特。
在编码第一行的结尾之后,例如,在开始编码第二行时,偏移值开始从其初始值-11,656线性增大为在切片的最后像素处的最终值0。而且,虽然为了编码困难图像的目的,在切片结尾,可能可取地将偏移设为正值,但是可以优选地保持偏移值至少大于或等于0,以便能够无损地编码可能通过可用的比特率无损地编码的图像或切片。如果比例因子在整个切片中保持为1.0,并且实际充溢度在切片结尾是2kb,那么偏移0造成2kb的RC充溢度值。然而,比例因子从第一行结尾处的1.0线性增大为在切片结尾处的2.0。结果,2kb的实际充溢度值产生4kb的RC充溢度值。由于在这个实例中,RC具有8kb的跨度,所以RC允许的最大RC充溢度是8kb;这与4kb的实际充溢度对应,该实际充溢度与切片结尾处的最大实际允许充溢度对应。
从第二行的开始到切片的结束的增大的偏移和增大的比例因子的组合减少了可用于编码第二行的像素的比特预算,直到切片结束。如果正在编码的内容在切片的最后像素处造成4kb的实际缓冲充溢度,那么第二到第八行的比特预算是比特总数减去用于编码第一行的期望比特数除以剩余的像素数(1920*8*12-1920*17)/(1920*7)或者大约11.29bpp,如上所述。如果在切片结尾处的实际充溢度与在第一行结尾处的实际充溢度相同,那么偏移值的调整造成11,656比特/(1920像素/行*7行)或者大约0.867bpp的bpp预算减小,造成12-0.867或者大约11.133bpp的净bpp预算。然而,如果在切片结尾的实际充溢度比在第一行结尾的实际充溢度大2kb,即,在切片结尾的4kb对在第一行结尾的2kb,那么比特预算减小(11,656-2048)/(1920*7),大约为0.715bpp,净减小12bpp-0.715bpp或大约11.29bpp。比例因子增大为2.0,允许RC将在切片结尾的最大比特数限制为4kb,而RC范围跨过8kb。对于在切片结束时或者即将结束时不产生最大数量的比特(以便在没有比例因子时,实际充溢度较小)的内容,比例因子可以具有很小的影响。
编码器可以被配置为在用于编码的比特总数小于目标数时,在产生在切片内编码像素的最后比特之后,插入填充比特,从而精确地产生目标比特数。目标比特数可以是切片中的像素的数量乘以比特/像素率的乘积。
在编码器中,通过将递增值加入累加器的每个像素、组或其他间距中,偏移值发生器2512可以计算偏移值。例如,可以具有三个递增值,第一值用于切片的第一传输延迟部分,第二值用于第一行的剩余部分,并且第三值用于切片的剩余部分。如果每3个像素(一组)增加偏差,那么在前342个像素中具有114组,与初始传输延迟对应。在此处的实例中提供的值造成大约为-33.035的第一递增值。可以选择充足的递增精度,以便在初始传输延迟结束时的偏移值足够接近期望值-3766;该精度不需要精确。例如,如果允许1%或大约38的误差,那么递增值可以与理想的递增值相差38/114=0.333。使用二进制算法,可以规定递增1分数比特,以便最大误差是0.25。因此,第一递增值可以是-33.00。然后,在传输延迟间距结束时产生的偏移值是-342*33.0=-3,762。在这个实例中,第二递增值是[-11,656-(-3762)]/(1920/3-114)或者大约为-15.008。如果再次允许最大误差为1%(116),那么递增误差可以高达116/526组=0.22。可以规定递增2分数比特,以便最大误差是0.125。因此,第二递增值可以是-15.00。然后,在第一行结束时产生的偏移值是-3,762-526*15=11,652。第三递增值应是11,652/(1920/3*7)或者大约为2.6009。如果允许最大误差为100(例如),那么递增误差可以高达100/(1920/3*7)=100/4,480或大约0.0223。可以规定递增5分数比特,以便最大误差是0.015625。第三递增值可以在底部10中规定为2.59375或者在底部2中规定为10.10011。在切片结束时所产生的最终偏移值是-11652+11620=-32。这个值在公设的允许界限内。
比例值发生器2514可以通过相似的方式确定比例值2510。在一个实现方式中,比例因子2510可以在7*1920/3=4480组的行上从1.0增大为2.0。增量可以是1/4480或大约0.223215E-3。如果在负方向的最终比例值的最大误差是0并且在正方向的最大误差为(例如)2%,那么最大递增误差是0.02/4480或大约为4.464E-6。这表示规定增量,以便其最低有效位与2**-18对应,造成最大正误差~3.815E-6。增量所需要的最高有效位与2**-13对应,总共具有6个有效位。每组累积这种增量的加法器可以使用20比特。
或者,可以不太频繁地更新比例因子2510的计算,例如,每64组。在这种情况下,具有7*(1920/3)/64=70个递增步骤。通过这种形式,与以上的每组方法相比,递增值可以仅仅向左移动6比特,并且累积加法器可以具有20-6=14比特。
递增比例因子2510的另一个替换的方法是使用简单的常数(例如,1)递增,选择间距,以产生期望的结果。例如,8比特计数器可以用于计算在1.0与2.0之间的值。例如,对于每4480/256组,即,每17.5组,这个计数器可以递增,通过使每17或18组递增,可以密切地接近该计数器,间距使每个增量交替。可以通过5比特计数器以及少量逻辑实现这种交替的间距。
相同的方法可以用于其他特定的设计操作中。例如,8bpp的比特率以及8+4=12bpp的第一行分配。使用从这些参数中获得的值,代替在以上实例中的很多特定值,并且操作可以基本上相同。
对于在特定标准或产品中的利用,相关参数可以提前规定并且构建到实现方式内,或者一个或多个参数可以在软件内计算并且载入实现方式内。在一个实现方式中,系统的编码器侧在与每个图片一起传输的配置报头中计算参数并且规定这些参数,以便解码器可以直接装载和利用在报头内的值,而不要求在系统的解码器侧中进行软件交互作用。
图31示出了在解码器中的子流多路分解逻辑3100的一个实例。在多路分解逻辑3100中,速率缓冲器3102馈送多路分解器3104。多路分解器3104将元件(例如,Y、Co、Cg)样本提供给漏斗移位器3106、3108以及3110。漏斗移位器3106、3108以及3110的输出依次将数据提供给熵解码器3112、3114以及3116。速率控制逻辑3118协调熵解码器3112、3114以及3116的操作。
多路分解器3104从每个漏斗移位器(3106、3108或3110)中接收请求,指示需要多路复用字。如果当前漏斗移位器充溢度减去解码的语法元素尺寸小于最大的语法元素尺寸,那么发送请求信号。对于任何规定的组时间,可以发生0、1、2、或3请求。如果坚持在规定的组时间内具有多个请求,那么在切片中的多路复用字的顺序是muxWordY,然后是muxWordCo,然后是muxWordCg。
如果vbr_enable等于0,那么多路分解器清除在切片结束时增大的任何零填充比特,以将切片填充到总压缩尺寸上限(slice_width*slice_height*bits_per_pixel)中。如果将vbr_enable设为1,那么从切片的端部中不去除任何填充比特。
熵解码
在多路分解之后,熵解码器3112-3116解析输入的比特流的比特。多路分解图片层,以提取每个切片的切片层比特。子流多路分解器将切片层数据多路分解成3个子流。熵解码器解析子流层。
可以依次处理在子流内的每个组。在与平坦度确定相关联的亮度单元的开始,一些组具有条件比特。一旦处理了每个组,熵解码器就将残差和ICH索引数据发送给像素重构和ICH块体。熵解码器将为整个组解析的总比特数(codedGroupSize)以及(如果最佳地预测尺寸)所使用的比特数(rcSizeGroup)输出给速率控制。
在处理每个组之后,将所产生的残差和ICH选择传递给重构和ICH块体。
每行可以在组界限上开始。如果切片宽度不能被3整除,那么每行的最后一组可以包括不到3个像素。然而,熵解码器可以依然在P模式中解析3个残差并且在ICH模式中解析3个历史索引。虽然在切片的边缘之外的像素没有产生任何像素数据,那么P模式残差依然用于计算下一个预测尺寸的目的。
如果输入速率缓冲器溢流,那么解码器可以将溢流视为误差条件。在解码时,解码器可以计算比特,并且如果熵解码器试图在切片数据结束之后解析比特,那么解码器可以标记误差条件。切片数据长度固定(如果vbr_enable设为0)或者可变,并且通过传输传送给解码器(如果vbr_enable设为1)。
速率控制
速率控制逻辑3118可以实现与在编码器中实现的速率控制相同的速率控制。编码器和解码器速率控制在每个组中产生相同的QP值。
解码器速率控制逻辑3118可以运行,仿佛该逻辑是编码器速率控制逻辑。对于每个组,在编码器编码该组并且将用于编码该组的比特数加入其缓冲模型充溢度中的情况下,解码器在解码组时,将相同的比特数加入其缓冲模型充溢度中。在编码或解码相同的组时,编码器和解码器RC算法减去相同数量的比特。
解码器RC缓冲模型与编码器RC缓冲模型相同。然而,解码器的操作背景与编码器的操作背景不同。解码器具有速率缓冲器3102,该缓冲器可以与编码器缓冲模型不同。
要解码的比特流(减去PPS)进入解码器速率缓冲器3102,并且在解码比特时,解码器从速率缓冲器3102中去除比特。这与RC缓冲模型操作的意义相反。在每个切片开始时,在开始解码切片之前,解码器在其速率缓冲器中为initial_dec_delay组时间累积比特。一旦解码开始,RC函数就与在编码器中一样运行,包括initial_enc_delay函数。
通过熵解码器3112–3116,将平坦度信息传输给解码器RC。在先前的超群中用信号传递用于规定的超群的平坦度信息,以简化熵解码和定时。如果用于规定的超群的flatnessFlag是0,那么不进行任何QP调整。如果flatnessFlag是1,那么flatnessGroup用信号通知这四个组中的哪个需要QP调整,并且flatnessType指示该内容是略微平坦还是非常平坦。如果由于QP太低,所以不在比特流中明确地用信号传递flatnessType,那么假设flatnessType是0(略微平坦)。通过上述用于平坦度QP调整的相同方式,进行调整。
行存储器
与编码器一样,解码器可以实现行存储器。在解码器中的行存储器可以与上面为编码器描述的行存储器相似或相同。
预测和重构
在解码器中的预测和重构功能可以与编码器的相应功能匹配。
预测类型
解码器预测类型与编码器中的预测类型相同:MMAP、BP以及MPP。
预测类型选择
不需要在比特流中用信号显式传递预测类型,因此,编码器和解码器可以遵循相同的过程,以确定每个组用哪个预测类型。如果解码器支持块预测,那么可以具有在BP与MMAP之间选择的逻辑;如果解码器不支持块预测或者在PPS中将bp_enable设为0,那么决不选择BP,而是使用MMAP。如果解码器不支持块预测并且在PPS中将bp_enable设为1,那么流不可解码,并且解码器要通过合适的方式处理误差。
在BP与MMAP之间的选择
编码器和解码器可以执行相同的算法,以在BP与MMAP之间进行选择。
在BP/MMAP与MPP之间的选择
在比特流中发信号告知在BP/MMAP与MPP之间的选择。用于DSU-VLC编码的尺寸确定在解码器中使用MPP还是BP/MMAP。如果对于某个分量,尺寸等于maxBpc–qLevel,那么对于在该组中的所有三个样本,使用MPP预测该分量。否则,对于在该组中的所有三个样本,BP或MMAP用于该分量。
图32示出了解码器中的索引颜色历史(ICH)逻辑3200。对于每个组,解码器可以与编码器具有相同的对像素的ICH值的映射。解码器历史缓冲器3202可以与编码器历史通过相同的方式构造。用于更新ICH的解码过程可以与用于更新ICH的编码过程相同。
对于每个组,熵编码表示是否选择ICH。如果选择ICH,那么熵解码器还提供3个历史索引。编码器和解码器可以保持相同的ICH状态,因此,更新过程可以遵循上面识别的过程。
颜色空间转换
显示流编码可以使用标记为Y、Co以及Cg的分量,或者可以使用标记为Y、Cb以及Cr的分量。如果convert_rgb标志在当前的PPS内等于0,那么解码器可以产生YCbCr输出,而不进行颜色空间转换。可以将Cb分量映射到Co分量标签中。可以将Cr分量映射到Cg分量标签中。在这种情况下,Cb/Co和Cr/Cg分量的位深度可以等于Y分量,Y分量的位深度使用在当前的PPS内的bits_per_component字段指定。
如果convert_rgb标志在当前的PPS内等于1,那么解码器可以进行从YCoCg到RGB的颜色-空间转换。首先,Co和Cg值可以重新以0为中心:
cscCg=Cg-(1<<bits_per_component)
cscCo=Co-(1<<bits_per_component),
其中,bits_per_component是R、G以及B分量中的每个的比特数,该比特数小于Co和Cg分量的每个分量的比特数。
最终的CSC可以是:
t=y-(cscCg>>1)
cscG=cscCg+1cscB=t-(cscCo>>1)
cscR=cscCo+cscB
可以限制最终的R、G以及B值的范围:
R=CLAMP(cscR,0,maxVal)
G=CLAMP(cscG,0,maxVal)
B=CLAMP(cscB,0,maxVal)
其中,maxVal=((1<<bits_per_component)-1)。
如果切片在图片的右边缘之外延伸,那么可以丢弃所产生的解码像素。如果切片在图片的底部边缘之外延伸,那么可以丢弃所产生的解码像素。
误差处理
如果检测到误差条件,那么解码器可以输出像素数据,直到切片的结尾。这种像素数据可以具有任何任意值。解码器可以在依然在切片内的速率缓冲器内丢弃任何压缩比特,解码器可以重新开始解码下一个切片,并且在切片内发生误差,不需要影响任何其他切片的解码。
可以以硬件、软件或硬件和软件的多个不同组合的多种不同的方式实现上述方法、装置以及逻辑。例如,系统的全部或部分可以包括控制器、微处理器或专用集成电路(ASIC)内的电路,或者可以通过离散逻辑或元件或者其他类型的模拟或数字电路的组合实现,在单个集成电路上组合或者在多个集成电路之中分布。上述所有或部分逻辑可以作为指令实现,用于由处理器、控制器或其他处理装置执行,并且可以储存在有形的或永久的机器可读或计算机可读介质内,例如,闪速存储器、随机存取存储器(RAM)或只读存储器(ROM)、可擦可编程只读存储器(EPROM)或其他机器可读介质(例如,光盘只读存储器(CDROM)或磁盘或光盘))。因此,计算机程序产品等产品可以包括存储介质以及储存在该介质上的计算机可读指令,在端点、计算机系统或其他装置中执行时,这些指令促使装置根据任何以上描述执行操作。
系统的处理能力可以分布在多个系统元件之间,例如,在多个处理器和存储器之间,可选地包括多个分布的处理系统。参数、数据库以及其他数据结构可以单独地储存和管理,可以包含在单个存储器或数据库内,可以通过多种不同的方式在逻辑上和在物理上组织,并且可以通过多种方式实现,包括数据结构,例如,链表、哈希表或隐式存储机制。程序可以是单个程序、单独程序的一部分(例如,子程序),分布在几个存储器和处理器之上,或者通过多种不同的方式实现,例如,以程序库的方式,例如,共享库(例如,动态链接库(DLL))。例如,DLL可以储存执行上述任何系统处理的代码。
特别描述各种实现方式。然而,还能够具有很多其他实现方式。
例如,编码器或解码器可以包括:
缓冲等级跟踪器,包括缓冲器充溢度输出;
线性转换逻辑,与缓冲器充溢度输出耦接,并且包括:
偏移值发生器,包括偏移值输出;
比例值发生器,包括比例值输出;以及
变换逻辑,被配置为响应于偏移值输出和比例值输出,将线性变换应用于缓冲器充溢度输出中,以获得修改的缓冲器充溢度输出;
多级式量化选择逻辑,包括:
修改的缓冲器充溢度到量化参数范围的映射;以及
参数调整逻辑,被配置为响应于先验编码结果以及量化参数QP的先验值,在量化参数范围内获得量化参数QP。
在编码器或解码器内:
偏移值输出可以包括分段线性偏移值;
比例值输出可以包括分段线性比例值;以及
与具有预测信息的后续图像线相比,线性变换可以被配置为促使将每个像素的额外比特分配给没有预测信息的图像行。
此外,编码和解码可以包括对图像切片的行编码,并且变换可以包括将分段线性偏移值应用于充溢度值中,将分段线性比例因子应用于充溢度值中或者这两者。