具体实施方式
图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可以响应于虚拟缓冲器的充溢度(fullness)或空虚度,调整用于编码的量化步长。下面,描述示例性编码器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不需要将量化步长显式传输给速率控制器或解码器内的任何其他逻辑。
图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时,在预测中使用左边样本,并且以下内容可以应用于边检测中:
if((2*ABS(a-c)>6*ABS(c-b))&&2*ABS(a-c)>6*ABS(c-g)&&2*ABS(a-c)>6*ABS(a-f))
{
edgel=0;
strengthl=ABS(c-b);
}
else if(2*ABS(b-c)>6*ABS(c-a)&&2*ABS(c-d)>6*ABS(c-a)){
edgel=1;
strengthl=ABS(c-a);
}
Else
{
strengthl=max_strength;
edgel=7;
}if(2*ABS(a-g)>6*ABS(a-b)&&2*ABS(a-g)>6*ABS(f-c))
{edge2=2;
strength2=ABS(a-b);
}
else if(2*ABS(a-b)>6*ABS(a-g)&&2*ABS(a-b)>6*ABS(s-f))
{
edge2=3;
strengt 2=ABS(a-g);
}
Else
{
strength2=max_strength;
edge2=7;
}if(2*ABS(a-g)>6*ABS(a-d))
{
edge3=4;
strength3=ABS(a-d);
}
else if(2*ABS(a-b)>6*ABS(a-s))
{
edge3=5;
strength3-ABS(a-s);
}
Else
{
strength3=max_strength;
edge3=7;
}
在NOLEFT=1时,在预测中不使用左边样本,并且以下内容可以应用于边检测中:
if((2*ABS(f-g)>6*ABS(c-g))2*ABS(f-g)>S*ABS(s-g)2*ABS(f-
6*ABS(r-f))
{
edgel=0;
strength1=ABS(c-g);
}
else if(2*ABS(g-c)>6*ABS(f-g)&&2*ABS(b-g)>6*ABS(g-f)){
edgel=1;
strength1=ABS(f-g);
}
Else
{
strengthl=max_strength;
edgel=7;
}if(2*ABS(f-s)>6*ABS(f-c)&&2*ABS(f-s)>6*ABS(r-g)){
edge2=2;
strength2=ABS(f-c);
}
else if(2*ABS(f-c)>6*ABS(s-f)&&2*ABS(f-c)>6*ABS(r-t)){
edge2=3;
strength2=ABS(s-f);
}
Else
{
strength2=max_strength;
edge2=7;
}
if(2*ABS(s-f)>6*ABS(f-b))
{
edge3=4;
strength3=ABS(f-b);
}
else if(2*ABS(f-c)>6*ABS(f-t))
{
edge3=5;
strength3=ABS(f-t);
}
Else
{
strength3=max_strength;
edge3=7;
}
在NOLEFT=2时,在预测中不使用这两个左边样本,并且以下内容可以应用于边检测中:
if((2*ABS(r-s)>6*ABS(g-s))&&2*ABS(r-s)>6*ABS(t-s)&&2*ABS(r-s)>6*ABS(k-r))
{
edgel=0;
strengthl=ABS(g-s);
}
else if(2*ABS(s-g)>6*ABS(r-s)&&2*ABS(c-s)>6*ABS(s-r)){
edgel=1;
strengthl=ABS(r-s);
}
else
{
strengthl=max_strength;
edgel=7;
}
if(2*ABS(r-t)>6*ABS(r-g)&&2*ABS(r-t)>6*ABS(k-s))
{
edge2=2;
strength2=ABS(r-g);
}
else if(2*ABS(r-g)>6*ABS(t-r)&&2*ABS(r-g)>6*ABS(k-w)){
edge2=3;
strength2=ABS(t-r);
}
Else
{
strengt 2=max_strength;
edge2=7;
}
if(2*ABS(t-r)>6*ABS(r-c))
{
edge3=4;
strengt 3=ABS(r-c);
}
else if(2*ABS(r-g)>6*ABS(r-w))
{
edge3=5;
strength3=ABS(r-w);
}
Else
{
strengt 3=max_strength;
edge3=7;
}
参数'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比特,即,00000000001。对于带符号的前缀值的实现方式,带符号的前缀值可以是一元编码。
预测尺寸可以是先前编码的样本的尺寸的函数。在一个实现方式中,假设单元尺寸是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的值,速率控制技术可以在编码器和解码器内同样地进行。速率控制技术可以使其决定基于最近编码的确定数量的像素分量的活动的测度以及缓冲模型的充溢度。预定数量可以是(例如)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”的一组值:
//Set target number of bits per Group according to buffer fullness
if(Buffer_fullness<BufThl)
{
Target_activity_level=MaxBitsPerGroup+offset[0];
MIN_QP=minQP[0];
AX_QP=maxQP[0];
}
else if(Buffer_fullness<BufTh2)
{
Target_activity_level=MaxBitsPerGroup+offset[1];
MIN_QP=minQP[1];
MAX_QP=maxQP[l];
}
else if(Buffer_fullness<BufTh3)
{
Target_activity_level=max(0,(MaxBitsPerGroup+offset[2])),-MIN_QP=minQP[2];
MAX_QP=maxQP[2];
}
else if(Buffer_fullness<BufTh4)
{
Target_activity_level=max(0,(MaxBitsPerGroup+offset[3]
));
MIN_QP=minQP[3];
MAX_QP=maxQP[3];
}
else if(Buffer_fullness<BufTh5)
{
Target_activity_level=max(0,(MaxBitsPerGroup+offset[4]
));
MIN_QP=minQP[4];
MAX_QP=maxQP[4];
}
else if(Buffer_fullness<BufTh6)
{
Target_activity_level=max(0,(MaxBitsPerGroup+offset[5]));
MIN_QP=minQP[5];
MAX_QP=maxQP[5];
}
else if(Buffer_fullness<BufTh7)
{
Target_activity_level=max(0,(MaxBitsPerGroup+offset[6]));
MIN_QP=minQP[6];
MAX_QP=maxQP[6];
}
else if(Buffer_fullness<BufTh8)
{
Target_activity_level=raax(0,(MaxBitsPerGroup+offset[7]));
MIN_QP=minQP[7];
MAX_QP=maxQP[7];
}
else if(Buffer_fullness<BufTh9)
{
Target_activity_level=max(0,(MaxBitsPerGroup+offset[8]));
MIN_QP=minQP[8];
MAX_QP=maxQP[8];
}
else if(Buffer_fullness<BufTh 10)
{
Target_activity_level=max(0,(MaxBitsPerGroup+offset[9]));
MIN_QP=minQP[9];
MAX_QP=maxQP[9];
}
else if(Buffer_fullness<BufThll)
{
Target_activity_level=max(0,(MaxBitsPerGroup+offset[10]));
MIN_QP=minQP[10];
MAX_QP=maxQP[10];
}
else if(Buffer_fullness<BufTh l2)
{
Target_activity_level=raax(0,(MaxBitsPerGroup+offset[11]));
MIN_QP=minQP[11];
MAX_QP=maxQP[12];
}
else if(Buffer_fullness<BufThl3)
{
Target_activity_level=max(0,(MaxBitsPerGroup+offset[12]));
MIN_QP=minQP[12];
MAX_QP=maxQP[12];
}
else if(Buffer_fullness<BufThl4)
{
Target_activity_level=max(0,(MaxBitsPerGroup+offset[13]));
MIN_QP=minQP[13];
MAX_QP=maxQP[13];
}
Else
{
Target_activity_level=ma(0,(MaxBitsPerGroup+offset[14]));
MIN_QP=minQP[14];
MAX_QP=maxQP[14];
}
可以为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调整的操作:
if(RcSizeGroup<(RcTgtBitsGroup-RcTgtBitOffset[0])
&&BitsCodedCur<(RcTgtBitsGroup-RcTgtBitOffset[0]))
{QuantPrev=Quant;
Quant=MAX(MIN_QP,(Quant-U);
}
else if(BitsCodedCur>RcTgtBitsGroup+RcTgtBitOffset[1])
{if((QuantPrev==Quant&&RcSizeGroup*2<RcSizeGroupPrev*
EdgeFactor)||(QuantPrev<Quant&&RcSizeGroup<RcSizeGroupPrev*EdgeFactor&&Quant<QuantlncrLimit[0])||(Quant<QuantlncrLimit[1]))
{QuantPrev=Quant;
Quant=MI(MAX_QP,(Quant+1));}}
else 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-0305282A1中,描述了一种这样做的技术,该案并入本文中,以作参考。错误!未发现参考源(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<0 QE=(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周期上的短期速率控制的起始点。
2D DPCM编码
在上面讨论的实例编码器中,编码器可以按照光栅扫描顺序进行编码(从左到右、从上到下)。然而,在另一个实现方式中,编码器在二维组的样本上操作。即,编码器可以按照与光栅扫描顺序不同的顺产编码。例如,编码器可以在块内按光栅扫描顺序编码,多个块按照光栅顺序在图像内排序。每个块体可以具有比一行大的高度以及比图像的整个宽度小的宽度。块可以是正方形,具有4x 4、8x 8的尺寸或某个其他尺寸。这种块体可以称为2D块体。要注意的是,编码器可以使用差分脉码调制(DPCM),用于对2D块编码。
样本可以是像素的分量,或者样本可以是单个分量的样本的矩阵的元素。如果具有多个分量,那么分量的矩阵可以一致或不一致。字像素的使用可以称为样本,并且不同分量的样本可以不共同定位。在2D块内的样本的DPCM编码可以与上述DPCM编码相似,基于重构的先前编码的样本值预测样本,找出样本的残差值,可选地量化残差值,并且对所生成的残差值编码。然而,在2D DPCM内,编码样本的顺序可以遵循在块内定义的顺序,并且按照所选顺序(例如,光栅顺序)对块编码。用于在2DDPCM内预测样本值的这组样本可以基于按照用于2D DPCM的样本顺序预先编码的样本。因此,至少对于某些样本,用于预测的这组样本可以与用于光栅顺序DPCM的样本不同。例如,块可以是方形,并且可以在每个块内按照光栅顺序对样本编码。在这种情况下,在块的第一行之后的块内的行上,编码在块右边的样本时,位于这种样本的上面和右边的样本没有预先编码并且不可用于预测这种样本。在另一个实例中,块可以是方形,并且可以在每个块内以Z字形模式对样本编码,以便在对当前样本编码之前对当前样本之下和左边的样本编码,因此,左下角样本可用于预测并且可用于预测当前样本。
图23示出了编码器可以用于2D DPCM编码的2D块2300的实例。例如,2D块2302是4像素行乘以4像素列的块。根据块包括的像素数,2D块的范围可以广泛地变化。仅举几例,方形2D块可以是2x 2、3x 3、4x 4或8x 8像素。在其他实现方式中,2D块可以是矩形块2304、三角形或锥形块2306、L形块体2308和2312、八角形块体2310或者具有其他非方形形状。2D块可以是彼此的旋转版本,并且可以互锁形成更大的2D形状。例如,L形块2312和2314(与L形块2308和2316一样)相对于彼此旋转180度,并且互锁形成矩形块体。
在2D块内,编码器可以按照所选的顺序(例如,光栅扫描顺序、通过垂直条纹、通过交错的L形部分或者任何其他顺序)对像素编码。更具体而言,通过进行空间颜色转换,预测样本值,生成残差值,为在2D块内的一些或所有像素进行残差值的量化,并且在残差值上进行熵编码,例如,使用上面讨论的技术,包括用于残差值的DSU-VLC,编码器可以对像素的每个样本(例如,R、G以及B样本)编码。
图24示出了编码场景2400。编码器已经编码并且重构了在第一2D块2402内的像素,并且在对第二2D块2404编码。第二2D块2404可利用已经重构的左邻,例如,由于第一2D块2402的在先编码。即,第一2D块2402已经在编码器内编码,并且第一2D块2402已经在解码器内解码。第一2D块2402内的所有像素都是可用于对第二2D块2404编码和解码的邻居,并且编码器可以使用这些像素来进行预测。在图24中具有两个实例,即,像素2406和2408。这两个像素已重构并且可用于预测块2404内的像素。根据正在编码的第二2D块内的像素(例如,像素2410),左邻包括位于正在编码的像素下面和左边的像素。例如,像素2408位于像素2412的下面和左边。从第一2D块2402中可获得的像素可以提高正在编码的当前像素(例如,像素2412或2410)的预测。
因此,用于2D块体的DPCM编码可以依赖于正在编码或解码的相同的2D块体(例如,像素2412)和先前编码或解码的2D块的重构像素。而且,随着编码或解码在2D块2404内部进一步移动(例如)到像素2414,那么编码过程具有在该2D块内的可使用的紧密的重构样本,例如,像素2416和2418。因此,2D DPCM编码可以根据2D块体内部编码或解码,而非总是依赖于来自2D块外面的重构像素。而且,编码和解码过程可以使用多个不同类型的预测器,例如,MMAP和上面讨论的其他预测器。
还要注意的是,关于正在编码或解码的当前像素,可以根据由预测向量指定的多个不同方向进行预测。关于像素2410,图24中示出了预测向量2420和2422的实例。作为其他实例,预测向量可以是从以下像素到正在处理的当前像素:在当前2D块内位于顶部的一个像素、在当前2D块内位于左边的一个像素、或者在先前编码的2D块体内位于左边的两个像素以及位于下面的一个像素。预测向量不限于这些实例。
对于在块内的每个像素的每个分量,编码器的输出可以是每个样本一个残差。例如,对于每个像素的每个R、G以及B分量,或者对于用于表示像素的任何其他颜色空间的分量,可以具有一个残差。编码器可以将任何数量的残差共同集合成一个单元,例如,集合成具有2、3、4或某个其他数量的样本的单元。编码器可以对残差进行熵编码。
在一些实现方式中,不同分量的样本不必共同定位。即,并非所有的样本都必须是位于一个物理位置的像素的一部分。例如,样本可以与Bayer模式(例如,RGBG、GRGB或RGGB模式)对应,其中,每个物理位置对应不同的颜色。因此,2D DPCM编码可以对不必均有助于单个物理像素的样本进行操作。换言之,2D DPCM可以对与单个物理位置对应的样本进行操作,但是该位置不需要形成限定特定像素的颜色的更大样本组(例如,R、G、B)的一部分。
2D块DPCM的一个方面在于,与基于解码历史由解码过程本身隐式恢复解码器中的这些参数相比,编码器可以在编码比特流中显式指示QP、预测或其他编码变量(例如,通过发送这些变量的值或指示符)。参数指示符对于每个块可以使用非常少的比特,例如,每个2D块使用1比特。每个块消耗的比特在2D块内的像素数上分摊可能较大的成本,因此,使显式指示相当高效,尤其是在2D块尺寸增大时。作为一个具体实例,对于这个显式指示符,8x 82D块的1比特仅仅花费1/64比特每像素。相比之下,在光栅扫描顺序中的8个连续像素的1比特指示符花费1/8比特每像素。
然而,每当需要时,编码器和解码器可以使用隐式QP和预测。然后,在编码器决定通过历史对于解码器完全确定没有帮助的方式改变QP、预测向量或其他参数时,编码器可以以比特成本效率的方式将比特显式插入比特流内,以通知解码器新的QP或其他参数值。这提供了QP、预测和其他参数的一种混合的隐式/显式信令。
作为一个具体实例,编码器可以使用(例如)每个2D块一个操作模式位,以指示解码器是否应继续隐式获得参数。例如,在设置操作模式位时,解码器可以继续隐式确定参数。但是在清除比特时,编码器可以在比特流中提供参数指示符,并且覆盖(override)或者修改该2D块的解码器的隐式操作。参数指示符可以(作为实例)是显式QP值、提高或降低QP的指示、打开或关闭块预测的指示符或者预测向量的显式值。
2D块体DPCM的另一个方面是可以受益于更好的块预测。在图片内,通过指定或指向应该用于预测当前编码的2D块的在先块,图片内部预测向量有助于2D块预测。利用2D DPCM,可以分配比特以指定预测向量。通过在2D块内的所有比特上分摊,显式指定比特流中的预测向量的成本可以具有足够低的比特成本,以使比特消耗可接受,用于使用显式预测向量。
编码器可以使用DPCM来预测2D块内的每个像素,并且可以至少部分根据相同的2D块内的其他像素的值,预测在2D块内的多个像素中的一些或所有像素。这可以产生比基于变换的编码或变换旁路编码更好的质量压缩。在本公开的各种实施方式中,量化可以应用于块内的至少一些或很多像素内。
在2D块内的像素的二维设置产生二维块的小空间范围。该空间范围易于产生有效的图像编码,同时与从具有相同范围的一维块体中获得的像素相比,每个块具有更大数量的像素。如上所述,每个块的更大数量的像素分摊用于指示与块的编码相关的信息的比特的比特成本,例如,指示QP和预测控制的比特。
如上所述,在一个实现方式中,对于2D像素块,每个块的一个(或多个)位对这个块使用指示隐式预测还是显式预测。如果使用显式预测,那么另一个或多个位指示对该块使用哪种预测类型和模式。可以指示的类型和模型包括(作为实例)空间预测和块预测。空间预测可以与在AVC和/或H.264中规定的空间预测相似。还可以仅使用块预测。或者,显式预测可以仅仅使用块体预测。要注意的是,隐式预测可以使用每个样品的空间预测的形式,例如,上面参照图4和图5描述的预测。
通过DPCM编码,编码器可以组合块预测和二维DPCM以及显式预测和/或混合隐式-显式预测。而且,编码器可以将对一些2D块使用DPCM并且对其他2D块使用变换编码,并且根据特定类型的内容或者由外部控制器发送信号,根据需要(例如,逐个块体地)在这两者之间切换。变换编码可以使用空间和/或块体预测,每个块选择一种类型,然后,对残差进行变换和量化,并且进行熵编码。而且,在一些实现方式中,编码器可以在2D块与1D组像素(例如,上述1x 3“块”)之间进行切换,例如,在图像中的一组行的端部。而且,如上所述,编码器可以使用索引颜色历史(ICH)对2D块体内的一些或所有像素或样本编码。
在其他实现方式中,编码器可以在不同尺寸的2D块之间进行切换。例如,编码器可以从用于具有4个图像行的各组的4x 4块中切换,切换到用于具有16个图像行的不同组的16x 16块,以及切换到用于具有8个图像行的仍然不同组的8x 8块。而且,在给定的2D块内,编码器可以基于子块编码。例如,可以在8x 8块内定义4个4x 4子块。编码器可以选择任何期望的编码技术用于每个4x 4子块体,例如,2D DPCM、变换编码或其他编码技术。
编码器还可以增强DSU-VLC用于变换编码。采用给定的2D块尺寸,例如,4x 4。在变换和量化之后,编码器具有4x 4阵列的量化值。这些量化值可以通过该阵列由所选择的扫描顺序排序,并且转换成一维数字序列,例如,4x 4阵列的16个数字。
然后,编码器可以根据所选择的顺序将这些数字安排到覆盖在数字序列内的所有16个样品的组内。组尺寸可以在2D块体之间一致。例如,组尺寸可以是每个2D块的一个DC分量,并且另一个组尺寸可以是每个2D块的6个高频分量。具有包括所有残差的很多种方式,对于16个残差使用5个组的一个实例是{1}、{2:4}、{5:8}、{9:12}、{13:16},并且使用4个组的一个实例是{1}、{2:5}、{6:10}、{11:16},其中,在大括号内的数字表示按照扫描顺序的量化转换系数。
然后,编码器可以使用DSU-VLC对每个组编码。因此,例如,这些组可以包括作为具有明显非零值的DC分量值的组。最后几个项的组可以是具有零值的高频项。中间组可以具有包括中间值的中频项。增强型DSU-VLC可以使用相同分量的在先编码组对一个组编码。例如,可以根据前一个DC分量组预测DC分量组的尺寸,然后确定预测(Δ尺寸)差,并且使用可变长度代码对残差编码。例如,可以根据相同分量的前一个高频组预测高频组的尺寸。
图25示出了编码器逻辑2500的一个实例。编码器逻辑2500获得待编码的图像(2502)。例如,该图像可以储存在用于编码器的缓冲器内,或者该图像可以流动到编码器中。编码器逻辑确定2D块配置,用于编码图像(2502)。例如,2D块配置可以是2x 2、4x 4、8x 8、矩形或其他2D块。编码器逻辑2500还确定对2D块(2506)使用潜在的几个不同的编码技术中的哪个。
在选择DPCM时,编码器逻辑2500执行图像中的图像分量的块的2D DPCM编码(2508)。作为实例,分量可以是颜色空间分量,例如,单个像素的R、G、B分量或单独的分量(例如,Bayer模式分量)。编码可以包括:使用块内重构像素来对相同的2D块内的其他像素(2510)编码,并且使用先前编码的2D块的重构相邻像素来对2D块内的像素(2512)编码。然而,如上所述,编码器可以在用于2D块的不同编码技术之间进行切换。作为另一个实例,编码器逻辑2500可以将变换编码(例如,离散余弦变换(DCT)编码)应用于特定的2D块(2514)。
编码器逻辑2500生成编码图像的比特流(2516)。在这方面,例如,比特流可以包括熵编码的残差。如上所述,DSU-VLC编码,包括根据覆盖2D块内的样本的预定组尺寸进行的DSU-VLC编码,会产生熵编码的残差。还要注意的是,编码器逻辑2500还产生比特流作为混合隐式/显式编码比特流。
在这方面,编码器逻辑2500可以将操作模式位插入用于编码2D块体的比特流内,该操作模式位在隐式编码参数决定与显式编码参数决定之间进行区分(2518)。例如,编码器逻辑2500可以将比特流中的操作模式位清除,以选择显式编码参数决定,并且将编码参数指示符插入比特流内。通过将调整规定为比特流内的编码参数,显式编码参数决定可以包括对隐式确定参数值的调整。编码参数可以包括量化参数指示符、预测向量指示符或其他参数。而且,编码器逻辑2500可以在比特流内设置操作模式位,以选择隐式编码参数决定。
可以以硬件、软件或硬件和软件的多个不同组合的多种不同的方式实现上述方法、装置以及逻辑。例如,系统的全部或部分可以包括控制器、微处理器或专用集成电路(ASIC)内的电路,或者可以通过离散逻辑或元件或者其他类型的模拟或数字电路的组合实现,在单个集成电路上组合或者在多个集成电路之中分布。上述所有或部分逻辑可以作为指令实现,用于由处理器、控制器或其他处理装置执行,并且可以储存在有形的或永久的机器可读或计算机可读介质内,例如,闪速存储器、随机存取存储器(RAM)或只读存储器(ROM)、可擦可编程只读存储器(EPROM)或其他机器可读介质(例如,光盘只读存储器(CDROM)或磁盘或光盘))。因此,计算机程序产品等产品可以包括存储介质以及储存在该介质上的计算机可读指令,在端点、计算机系统或其他装置中执行时,这些指令促使装置根据任何以上描述执行操作。
系统的处理能力可以分布在多个系统元件之间,例如,在多个处理器和存储器之间,可选地包括多个分布的处理系统。参数、数据库以及其他数据结构可以单独地储存和管理,可以包含在单个存储器或数据库内,可以通过多种不同的方式在逻辑上和在物理上组织,并且可以通过多种方式实现,包括数据结构,例如,链表、哈希表或隐式存储机制。程序可以是单个程序、单独程序的一部分(例如,子程序),分布在几个存储器和处理器之上,或者通过多种不同的方式实现,例如,以程序库的方式,例如,共享库(例如,动态链接库(DLL))。例如,DLL可以储存执行上述任何系统处理的代码。
特别描述各种实现方式。然而,还能够具有很多其他实现方式。
例如,在方法和系统中,编码可以包括:
在编码过程中确定熵编码残差值;以及
产生包括该熵编码残差值的比特流。
而且,产生比特流可以包括:
产生混合隐式/显示编码比特流。
系统的另一个实现方式包括:
缓冲器,被配置为存储图像的图像数据;以及
编码逻辑,与所述缓冲器进行通信,并且被配置为:
a)在图像数据间确定第一二维像素块;
使用二维差分脉码调制对第一二维像素块编码,包括:
获得在第一二维块内的重构像素;以及
使用重构像素,对第一二维块内的第二不同像素编码;
b)在图像数据间确定第二二维像素块;
c)使用变换编码技术对所述第二二维像素块编码;
d)确定用于二维差分脉码调制编码和用于变换编码的熵编码的残差值;以及
e)产生包括熵编码的残差值的比特流。
比特流可以包括:
用于第一二维块的第一操作模式位,所述第一操作模式被配置为选择编码参数的隐式模式决定;
用于第二二维块的第二操作模式位,所述第二操作模式位被配置为选择编码参数的显式模式决定;以及
编码参数指示符,与第二二维块相关联。
比特流还可以包括:
第一编码指示符,指定用于第一二维像素块的二维差分脉码调制;以及
第二编码指示符,指定用于第二二维像素块的变换编码。