本文件的一部分公开内容和所附材料包含了要求版权的材料。当该传真复制出现在专利商标局文件或记录中时,版权所有者不反对任何人对该专利文件或专利公开内容进行传真复制,但是保留除此之外的所有其他版权。
具体实施方式
在第一方面中,本中请描述了使用视频解码器对编码视频的比特流中的视频进行解码的方法,所述视频包括被划分为块的图片。所述方法包括:针对变换块内的系数组,对标识在生成所述变换块时使用的帧内编码模式的数据进行解码;基于所述帧内编码模式将所述系数组划分为区域;以及对用于重构所述系数组的系数的二进制值进行熵解码,其中所述熵解码包括基于哪个区域与该二进制值相关联来确定上下文。
本中请还公开了使用视频编码器对视频进行编码的方法,所述视频包括被划分为块的图片。所述方法包括:使用帧内编码模式根据各块之一的空间预测来生成该块的残余数据;对所述残余数据进行频谱变换,以获得变换系数的变换块,所述变换块被进一步划分为系数组;对所述系数组之一的变换系数进行程-游编码,以生成程-游对;以及对所述程-游对进行二进制化和熵编码,包括确定二进制化的程-游对的每个二进制值的上下文,其中,基于所述帧内编码模式将所述系数组划分为区域,以及确定二进制值的上下文至少部分基于哪个区域与该二进制值相关联。
在又一方面中,本申请描述了被配置为实现这种编码和解码方法的编码器和解码器。
在再一方面中,本中请描述了存储计算机可执行程序指令的非瞬时计算机可读介质,当执行所述计算机可执行程序指令时,所述计算机可执行程序指令将处理器配置为执行所述编码和/或解码方法。
根据以下结合附图对示例的描述的论述,本领域普通技术人员将理解本申请的其他方面和特征。
在随后的描述中,参考用于视频编码的AVS标准和/或开发中的AVS2标准来描述一些示例实施例。本领域普通技术人员将理解:本申请不限于AVS或AVS2,而是可以适用于其他视频编码/解码标准,包括可能的未来标准、多视图编码标准、可伸缩视频编码标准、以及可重配置视频编码标准。
在随后的描述中,当提到视频或图像时,术语帧、图片、切片、分片和矩形切片组可以在某种程度上相互交换使用。在一些情况下,一系列帧/图片可以被称为“序列”。在其他实现中可以使用其他术语。还将意识到:可以逐帧来执行特定编码/解码操作,一些是逐切片执行的,一些是逐图片执行的,一些是逐分片执行的,且一些是逐矩形切片组执行的,这取决于适用的图像或视频编码标准的具体要求或术语。在任何具体实施例中,适用的图像或视频编码标准可以视情况确定下面描述的操作是针对帧和/或切片和/或图片和/或分片和/或矩形切片组来执行的。因此,本领域普通技术人员在考虑到本公开的情况下将理解:针对给定实施例,本文描述的具体操作或过程以及对帧、切片、图片、分片、矩形切片组的具体引用适用于帧、切片、图片、分片、矩形切片组、还是这些中的一些或全部。如根据以下描述将变得显而易见的,这对于编码树单位、编码单位、预测单位、变换单位等同样成立。术语“块”可以用于指代编码树单位、编码单位、预测单位、或变换单位,这取决于其所使用的上下文。
将理解:本文描述的编码器或解码器均可以在包含一个或多个处理元件和存储器在内的专用计算设备或通用计算设备上实现。编码器或解码器执行的操作视情况可以例如通过专用集成电路来实现,或通过所存储的可由通用处理器执行的程序指令来实现。设备可以包括附加软件,该附加软件包括例如用于控制基本设备功能的操作系统。本领域普通技术人员在注意到以下描述的情况下将意识到其中可以实现编码器或解码器的设备和平台的范围。
编码器接收视频源并产生编码比特流。解码器接收编码比特流并输出解码视频帧。解码器可以被实现为视频回放设备的一部分,即,可以在显示设备上显示输出视频。将理解:诸如计算机、机顶盒、DVD或蓝光播放器之类的视频回放机和/或移动手持设备可以在显示设备上显示之前在存储器中对解码帧进行缓存。编码器和解码器可以被配置为以符合多种视频压缩标准的方式来工作。例如,编码器和解码器可以是符合AVS的。在其他实施例中,编码器和解码器可以符合其他视频压缩标准,包括AVS标准的演进,例如AVS2。
与任何基于块的混合编码框架一样,AVS将图片/帧划分为块。使用预测操作来生成预测块。该预测可以是空间预测,即帧内预测,在帧内预测中,本地重构像素是预测的基础,或者预测可以是时间预测,即帧间预测,在帧间预测中,来自附近图片/帧的重构像素是预测的基础。预测块和原始数据之间的差异是后续被编码的残余或误差。
首先通过以下方式对残余进行编码:使用例如DCT(或DST、或小波变换等)操作对残余进行频谱变换以将残余数据块变换为变换系数块。最左上角的系数是DC系数,且其他系数越远离最左上角系数,就是逐渐越高频率的系数。在很多情况下,变换块的右下部分有可能包含所有零系数,这就是为什么频谱变换对压缩有帮助。
然后使用量化步长对变换系数进行量化。在一些情况下,量化步长对于给定序列、图片/帧、或块可以是固定的。在一些情况下,量化步长更一般地是量化矩阵,其中,可以对变换块中的不同系数位置进行使用位置特定量化步长的量化。在一些实施例中,变换和量化操作被集成到单一操作中。在一些情况下,本文的描述可以将量化变换系数简称为“变换系数”或“系数”。将意识到:当提到对“变换系数”或“系数”的熵编码时,这些变换系数通常将是已被量化的。
根据适用的编码标准所规定的语法和编码方案,对量化变换系数块进行熵编码。在AVS情况下,按反扫描顺序来读取系数,其中,将扫描顺序定义为从最左上角系数到最右下角系数前进的锯齿扫描顺序。AVS中的实际编码开始于块中的最后有效(significant)系数,即,按扫描顺序的最后非零系数,并按反扫描顺序回到最左上角系数。被编码的数据包括四部分[程、游、符号、EOB]。“程”指示当前非零系数的量值(减1),“游”指示当前系数和按反扫描顺序的下一个非零系数之间的零系数的数目,符号指示非零系数的符号,以及EOB标志指示该当前系数是否是块中按扫描顺序的“第一个”非零系数,即,这是否是该块的按反扫描顺序编码的最后非零系数。
使用一元二进制化对“游”和“程”值进行二进制化。然后对二进制化的数据进行上下文自适应熵编码。
如上所述,EOB标志表示在具有相对多的非零系数的块中的显著开销成本。此外,“游”值可以在具有至少一个高频非零系数的稀疏块中较大,其导致由于一元二进制化方案而产生的对大量二进制值进行编码。最后,在解码器完成对所有变换系数数据的解码并检测到指示当前非零系数完成了该块的数据的EOB标志之前,解码器不知道正在被解码的任何数据在块中的位置。
本申请提供了通过信号通知最后有效系数数据来消除对EOB标志的使用的方法和系统。此外,为了改进在使用该方案进行变换编码的压缩效率,本申请提供了将每个块进一步划分为非重叠的系数组的方法和系统。在很多实施例中,系数组是正方形块,例如4x4,然而在一些实施例中,它们可以是非正方形的。在一些情况下,可以将系数组称为“子块”或“子编码块”。
现在参考图1,其示出了变换块100的示例。在该情况下,变换块100是16x16变换系数块。该变换块100已被分为十六个4x4系数组(CG),其中一些标有附图标记102。每个系数组102包含十六个变换系数。
逐系数组来执行对变换系数的编码。即,对一个系数组中的十六个变换系数进行编码,之后移动到下一个系数组。
在图1中指出了组扫描顺序104。在本示例中的组扫描顺序106是锯齿扫描顺序,其从最左上角系数组开始并向着最右下角系数组前进。在一些实施例中,按反组扫描顺序对系数组进行编码/解码,这意味着最左上角系数组是要编码/解码的最后系数组。
现在还参考图2,其示出了变换块100和在系数组102a之一中的扫描顺序108。系数组中的扫描顺序108对该系数组内的系数的处理进行排序。在该示例中,扫描顺序108是系数的锯齿扫描顺序。在一些实施例中,按扫描顺序108的逆序(“反扫描顺序”)对系数(特别是它们的程-游-符号数据)进行编码/解码。反扫描顺序开始于最右下角系数并向着最左上角系数以锯齿扫描方式前进。
将理解:在这些示例中描述的基于锯齿的扫描顺序和组扫描顺序表示了一种可能的扫描顺序集合。在其他实施例中,扫描顺序或组扫描顺序可以是对角式、垂直式、水平式、或对块和/或系数组中的位置的任何其他规定排序。在一个实施例中,组扫描顺序和系数组中的扫描顺序可以不同,即例如一个可以是锯齿的,而另一个可以是对角的。
将变换块100划分为系数组102(示出为102a、102b、102c)使得能够将CG标志用于信号通知特定系数组是否包含任何非零系数。如果系数组的所有系数是零,则编码器不需要对除了CG标志之外的任何数据进行编码。即,编码器仅对具有非零系数的系数组的程、游、和符号数据进行编码,例如,那些具有被设置为1的CG标志的系数组。在一些情况下,可以假定最左上角系数组的CG标志被设为1;即,不对该系数组的CG标志进行编码,且始终对系数(它们的程-游-符号数据)进行编码。
在一些实施例中,可以将CG标志作为集合进行发送,然后按反组扫描顺序发送每个非零CG的系数数据。在一些其他实施例中,在对下一个CG标志进行编码之前,指示CG包含非零系数的每个CG标志在编码比特流中可以后接该CG的数据,例如,程、游、和符号数据(即,CG标志可以与程-游-符号数据交织)。
本申请提出了对变换块中最后非零系数的位置进行编码,而不发送EOB标志。一旦解码器知道变换块中最后非零系数的位置,则在其对程-游数据进行解码时,它将知道其何时到达系数组中的最后系数,使得EOB标志不必要。此外,本申请提出了对两级最后系数位置信息进行编码:(a)按组扫描顺序包含非零系数的最后系数组的位置;以及(b)在该最后系数组中的最后非零系数的位置。从而,解码器将知道最后非零系数的坐标,且因此知道与变换块的所有后续解码的CG标志、程、游、和符号数据相关联的位置信息。
图2示出了系数组102b中的非零系数110和系数组102c中的非零系数112。在旧的AVS编码方案下,非零系数112将是整个变换块100上按反锯齿扫描顺序的最后系数。然而,根据本申请的该示例实施例,按反组扫描顺序的最后非零系数组是系数组102b,且该系数组中的最后非零系数是非零系数110。因此,编码器对系数组102b的位置和非零系数110在该系数组102b中的位置进行编码。然后编码器继续对最后系数组102b和最左上角系数组(其CG标志可以被推断为1)之间的剩余系数组的CG标志以及具有被设为(或被推断为)1的关联CG标志的每个系数组的程-游-符号数据进行编码。如稍后将描述的,在一些示例实施例中,还可以对每个非零CG内的最后系数位置进行编码。在其他实施例中,可以针对下一个CG对“最后游”进行编码,以指定在最右下角系数和下一个CG中的最后非零系数之间的零的数目,或在一些实施例中,游数据可以跨过CG边界(且可以按反组扫描顺序跳过所有零CG)。
图3示出了被划分为4x4个系数组的示例16x16变换块200。最后系数组202a位于xCG=3,yCG=1。在一些实施例中,这些坐标可以被二进制化和编码。在其他实施例中,可以将最后非零系数组的位置作为系数组按组扫描顺序的位置来信号通知,在本示例中该位置是12(在0,1,...,15的范围内)。在图3的关联系数组中示出了各个系数组的CG标志的值。将意识到:不需要对最后系数组202a的CG标志进行编码,这是由于基于其是最后系数组,因此知道其包含非零系数。在一些实施例中,还可以推断出在xCG=0,yCG=0处的第一个系数组的CG标志为1,而不管其是否包含任何非零系数,这是由于该系数组具有全零系数的可能性非常小。如果(如下面方括号所指示地)省略了这两个CG标志,则在本示例中,按反组扫描顺序的编码CG标志是:
[1]1 0 0 0 1 0 1 0 0 1 1[1]
现在参考图4,其以流程图形式示出了用于在视频编码器中对变换系数进行编码的一个示例过程300。如操作302所示,首先对残余数据块进行变换和量化,以产生量化变换系数块。请回忆本示例实施例假定不管8x8、16x16、32x32还是某个其他大小,变换块被划分为系数组。系数组可以是正方形变换系数组。在一些情况下,它们可以是2x2、4x4、6x6、8x8、或某个其他大小。在一些实现中,系数组大小可以取决于变换块大小。
在操作304中,编码器对按组扫描顺序的最后非零系数组的位置进行编码。组扫描顺序是从最左上角到最右下角的系数组的排序。在本示例中,组扫描顺序可以是锯齿扫描顺序。这些系数组中包含非零系数的最后系数组是最后非零系数组。在操作304中对其在变换块中的位置进行编码。
在操作306中,编码器对该最后非零系数组中的最后非零系数的位置进行编码。所编码的位置是在系数组内的位置且不是在变换块中的绝对位置,这是因为已经对系数组位置进行了编码。在该系数组中的最后非零系数是在系数组中按扫描顺序的最后非零系数。
然后在操作308中按反组扫描顺序对最后非零系数组和最左上角系数组之间的所有系数组的CG标志进行编码。在该实施例中,CG标志与程-游数据不交织。
然后在操作310中,对具有非零系数的系数组的程、游、符号数据进行编码。这包括其CG标志可以被推断为1的系数组,而不管该系数组是否包含非零系数,例如在一些实施例中的最左上角系数组。
最后,在操作312中,在比特流中输出编码数据。
在图5所示的示例过程400中以流程图形式示出了在解码器处的对应操作。在操作402,解码器对按组扫描顺序的最后非零系数组的位置进行解码。从而,解码器能够识别变换块中的哪个系数组是按组扫描顺序的包含非零系数的最后系数组。然后在操作404中,解码器对在最后非零系数组中按扫描顺序的最后非零系数的位置进行解码。
然后解码器在操作406中对系数组标志进行解码。针对最后非零系数组和最左上角系数组之间的每个系数组,可以按反组扫描顺序对CG标志进行解码。注意到:该示例假定最左上角系数组的CG标志被推断为1,然而在其他示例实施例中,可以对其进行编码/解码。从而解码器能够识别变换块中的哪些系数组包含非零系数,且从而它们是否具有针对其系数而编码的程、游、和符号数据。
在操作408中,解码器对非零系数组的程、游、和符号数据进行解码,以重构这些系数组的量化变换域系数。如下面将详细描述的,根据实现方式,解码器可以对每个非零系数组的最后游数据、每个非零系数组的最后非零系数位置数据、或跨系数组边界的游数据进行解码。将全零系数组重构为全零系数。
在操作410中,解码器对重构的变换系数块进行反量化和反变换,以生成重构残余块。通过与后续预测操作、滤波等的组合,解码器输出重构的像素数据。
如本领域技术人员在考虑到本文的完整描述的情况下将理解的:上述过程中的一些操作可以变化,使得它们按不同顺序发生,或以交织方式发生,或以组合方式发生。
对最后非零CG位置进行编码
如上所述,本申请提供了部分通过对包含非零系数的按组扫描顺序的最后系数组的位置进行编码来提供对最后非零系数的位置的信号通知。存在可以对该位置进行编码的各种方式。下面提供一些示例。
在一个示例中,使用x-y坐标来信号通知最后非零系数组位置。例如,xCG可以指示x位置,且yCG可以指示y位置。可以例如通过一元二进制化对这些值中的每一个值进行二进制化。在另一实施例中,可以使用固定长度的二进制数字。
然后使用上下文自适应编码对二进制化的x-y坐标进行编码。可以基于块大小和正在被编码的特定二进制值的二进制值索引来确定用于对二进制化坐标进行编码的上下文。可以针对xCG和yCG使用单独的上下文。在一个示例中,可以通过以下方式来给出上下文确定:
ctxInc(lastCGX)=0,如果块大小是8x8且二进制值索引=0;
2,如果块大小是16x16且二进制值索引=0;
4,如果块大小是16x16且二进制值索引=1;
6,如果块大小是16x16且二进制值索引=2;
8,如果块大小是32x32且二进制值索引=0;
10,如果块大小是32x32且二进制值索引=1;
12,如果块大小是32x32且二进制值索引>1;
ctxInc(lastCGY)=1,如果块大小是8x8且二进制值索引=0;
3,如果块大小是16x16目二进制值索引=0;
5,如果块大小是16x16且二进制值索引=1;
7,如果块大小是16x16且二进制值索引=2;
9,如果块大小是32x32且二进制值索引=0;
11,如果块大小是32x32且二进制值索引=1;
13,如果块大小是32x32且二进制值索引>1;
在本示例中,可以使用总共28个上下文:14个用于亮度(luma)分量且14个用于色度分量。
在另一示例中,x-y坐标的二进制化可以基于一元前缀和固定长度后缀的串联。注意到:在假定使用4x4个系数组的情况下,这可以直到块大小达到32x32才改变二进制化坐标。后缀可以是单一比特。然后可以使用旁路模式对后缀进行编码,即等概率,其避免了与该二进制值的编码相关的上下文确定步骤。用于对前缀进行编码的上下文是基于块大小和二进制值索引来确定的。
在这些示例的另一变型中,对xCG和yCG进行联合编码;意味着引入了用于信号通知最后非零系数组是否是在(0,0)处的最左上角系数组的标志,该最左上角系数组往往是最有可能的最后非零系数组。如果设置了该标志,则对xCG和yCG的进一步编码不是必需的。然而,如果未设置该标志,则对xCG值和yCG值进行编码。但是,由于编码器和解码器将知道xCG和yCG值不能都是0,因此如果编码/解码的xCG值是零,则将对yCG值进行编码和解码为(yCG-1)。下面阐述了示出了该变型的示例伪代码:
编码器:
解码器:
在另一示例中,使用最后非零系数组位置的按组扫描顺序的索引来信号通知最后非零系数组位置。组扫描顺序对在索引0处的最左上角到在索引NxN-1的最右下角的系数组进行排序,其中,NxN是系数组的总数。对组扫描位置号进行二进制化和编码。
对最后非零CG中的最后非零系数位置进行编码
如上所述,通过对最后非零系数组的位置和该最后非零系数组中的最后非零系数的位置进行编码,来信号通知变换块中最后非零系数的位置。可以用与上面关于系数组所描述的方式类似方式对最后非零系数组中的最后非零系数的位置进行编码,即可以对系数组中系数的x-y坐标进行编码,或者可以对系数组中按扫描顺序的系数的位置进行编码。
由于本申请规定了将变换块划分为系数组且将程-游编码用于对系数数据进行编码/解码,因此需要解决跨过系数组边界的游的问题。使用系数组划分,程-游编码在每个系数组中使用扫描顺序来发生。因此,在非零系数之间的游可以延伸跨过系数组边界。
现在参考图6,其示出了用于游信令的两种可能性。首先使用游、程、和符号数据对系数组CGi+1进行编码/解码。如图所示,编码按反扫描顺序前进。最后程-游对是用于对由附图标记502所指示的系数进行编码的。存在用于对游进行编码的两种可能方案。一种是对延伸跨过系数组边界直到下一个非零系数的游508进行编码。即,在该示例中,游508将是6。另一种方案是对截断的游506进行编码。截断的游506停止于系数组边界,且在该情况下游506将具有值2。将意识到:对截断的游进行编码将通常导致更短的游,因此其将更有效率;然而,截断的游留下了如何对下一个系数组(即,CGi)进行编码的问题。
如果对截断的游进行编码,则一种可能的方案是对每个非零系数组的最后非零系数的位置进行编码。即,其关联CG标志被设置为1的每个系数组也使其最后非零系数的位置被编码。在该示例中,系数组CGi中的系数504的位置将被编码在比特流中。如变换块中最后非零系数一样,对每个系数组的最后非零系数的位置的编码可以基于x-y坐标或按扫描顺序的位置。
一旦对位置数据进行二进制化,用于对最后非零系数的位置进行编码的上下文可以部分取决于二进制值索引,但是也可以取决于系数组在块中的位置。现在参考图8,其示出了示例16x16变换块600和用于上下文确定的区域划分。在该示例中,块被分为四个区域。区域0是最左上角系数组。区域1包括最右下角系数组右侧的三个系数组,且区域2包括最左上角系数组下方的三个系数组。其他九个系数组在区域3中。可以例如通过以下方式给出用于对x和y位置进行编码的上下文:
ctxInc(lastPositionX)=regionIndex*6+binIndex
ctxInc(lastPositionY)=regionIndex*6+binIndex+3
该示例将导致总共48个上下文:24个用于亮度且24个用于色度。
由于DCT变换的属性,区域1中CG中的系数对应于垂直分量,而区域2中CG的系数对应于水平分量。因此,当预测残余主要包含垂直分量时,非零变换系数往往位于接近区域2中CG的顶部的位置。类似地,当预测残余主要包含水平分量时,非零变换系数往往位于接近区域1中CG的左侧的位置。因此,区域1和区域2中CG中的最后系数的位置在本情况下表现出对称性。
因此,在一个实施例中,对区域2中的Y坐标进行编码可以共享与对区域1中的X坐标进行编码相同的上下文,且对区域2中的X坐标进行编码可以共享与对区域1中的Y坐标进行编码相同的上下文。这还等价于将区域2中CG中的最后系数位置的(X,Y)坐标交换,并使用区域1的上下文对其进行编码。
用于处理系数组边界处的截断的游的另一可能方案是对“最后游”512进行编码/解码,即按反扫描顺序从系数组中最右下角系数到第一个非零系数的零的游。同样地,在一些实施例中可以使用一元二进制化。可以根据系数组在块中的位置(如上所述)、二进制值索引、以及最大在先编码程(即,秩)来导出用于对最后游512进行编码的上下文。“秩”是与该变换块的之前编码的最大程相关联的值。在一个示例实现中,如下确定秩:
秩=0,如果最大编码程=0
1,如果最大编码程=1
2,如果最大编码程=2
3,如果最大编码程=3或4
4,如果最大编码程>4
在本示例中,可以如下确定上下文:
ctxInc(lastRun)=秩*2+min(1,binIndex),如果CG是块中左上角CG
=秩*2+min(1,binIndex)+10,其他情况
如上所述,最左上角系数组的CG标志可以被推断为1,这是因为非常有可能该系数组包含至少一个非零系数。在不太可能的其不包含任何非零系数的情况下,则可以发送特殊信号来指示该情况。例如,在对最后游进行编码的情况下,可以对特殊的最后游值lastRun=16进行编码。注意到:将仅在已推断出有效(significant)CG标志为1时才信号通知lastRun=16。
现在参考图7,其示出了非截断的游信令的示例实施例。在系数组边界处未截断游510的情况下,其可以被配置为在计算游时排除来自全零系数组的系数。即,在确定游510时,仅对具有被设置为1的关联CG标志的系数组中的系数进行计数,跳过按反组扫描顺序遇到的任何全零系数组,在本示例中例如是CGi+1。
现在参考图9,其示出了编码器900的示例实施例的简化框图。编码器900包括处理器902、存储器904、和编码应用906。编码应用906可以包括在存储器904中存储的、且包含用于将处理器902配置为执行诸如本文所述的操作之类的操作的指令在内的计算机程序或应用。例如,编码应用906可以根据本文描述的过程对比特流编码并输出编码的比特流。将理解:编码应用906可以存储在计算机可读介质上,例如压缩光盘、闪存设备、随机存取存储器、硬盘驱动器等。
针对熵编码的上下文确定
上面描述的很多编码和解码过程在对系数数据进行编码/解码的上下文中信号通知位置信息(或可以用于导出位置的信息)。被编码和解码的元素包括CG标志、程、游等。编码器和解码器拥有与正在被编码或解码的元素相关的当前位置信息这一事实意味着:该位置信息可以用于改进上下文确定。可以对上下文确定连同对各个这些元素的熵编码和解码附加地或备选地进行其他改变和改进。下面详细列出多个示例。应当强调的是:以下示例上下文模型是说明性的,且不意在反映使用位置信息和相关数据来导出上下文的可能上下文模型的完全范围。一些实现可以类似于一个或多个以下上下文模型,但是可以将各个上下文加以组合/重用,以减少需要跟踪的上下文的数量,并改进对较不频繁使用的上下文的统计准确性。
用于程编码的上下文模型
在AVS或AVS2的当前模型中,用于对程二进制值进行编码的上下文确定取决于该变换块的最大在先编码程。将该量值称为“秩”,且如下定义:
秩=0,如果最大编码程=0
1,如果最大编码程=1
2,如果最大编码程=2
3,如果最大编码程=3或4
4,如果最大编码程>4
在本申请的一个方面中,使用附加和/或备选信息来确定针对程编码的上下文。
在第一示例中,使用变换块中系数组的位置。在一个实施例中,这意味着一个上下文集合用于最左上角系数组目不同的上下文集合用于其他系数组。在每个上下文集合中,基于秩和二进制值索引来确定上下文,如以下所示:
ctxInc(程)=秩*2+min(1,binIndex),如果CG是块中的左上角CG
=秩*2+min(1,binIndex)+10,其他情况
可以使用其他基于位置的条件。例如,第一上下文集合可以是针对最左上角系数组及其右侧和下方相邻系数组的。
在第二示例中,按反扫描顺序的之前编码的非零系数之和可以是用于选择用于对当前系数的程数据进行编码的上下文的基础。现在参考图11,其示出了示例系数组700。系数组700是包含16个系数的4x4系数组。具有更暗的轮廓的系数在本示例中是非零系数。可以将最大值N设为在确定和时使用的之前编码的系数位置的最大数目。在本示例中,仅系数组内的系数位置被允许包括在和中。在某种意义上,最大值N作为滑动窗口。为了该示例的目的,N设置为6。换言之,编码器或解码器按反扫描顺序回看六个位置,且对这六个系数的值进行求和(其中一些或全部可以是零)。
在本实施例中,在确定用于对位置a、b和m中的非零系数的程进行编码的上下文时,进行以下计算:
absSum(a)=abs(b)+abs(c)+abs(d)+abs(e)+abs(f)+abs(g)=abs(b)+abs(d)+abs(e)
absSum(b)=abs(c)+abs(d)+abs(e)+abs(f)+abs(g)+abs(h)=abs(d)+abs(e)
absSum(m)=abs(n)+abs(o)+abs(p)=0
通过将系数的数量限制为预先选择的最大数量,与秩值相比,和倾向于反映更多本地化的信息。在一个实施例中,可以根据absSum、系数组的位置、和二进制值索引来导出用于对程值的二进制值进行编码的上下文确定:
ctxInc(程)=min(4,floor((absSum+1)/2))*2+min(1,binIndex),如果CG是块中左上角CG
min(4,floor((absSum+1)/2))*2+min(1,binIndex)+10,其他情况
注意到:在很多实现中“程”被编码为程-1,这是因为已经知道其是非零的。因此,可以对绝对和的确定进行以下改变:
absMinus1Sum(a)=max(0,abs(b)-1)+max(0,abs(c)-1)+max(0,abs(d)-1)+max(0,abs(e)-1)+max(0,abs(f)-1)+max(0,abs(g)-1)
absMinus2Sum(a)=max(0,abs(b)-2)+max(0,abs(c)-2)+max(0,abs(d)-2)+max(0,abs(e)-2)+max(0,abs(f)-2)+max(0,abs(g)-2)
在该实施例中,基于absMinuslSum、absMinus2Sum、秩、和二进制值索引如下确定用于对程值的二进制值进行编码的上下文:
ctxInc(程)=
秩,如果秩<=1并且binIndex=0;
(秩-2)*3+min(2,floor((absMinus1Sum+1)/2))+2,如果秩>1且binIndex=0;
秩+11如果秩<=2并且binIndex=1;
(秩-3)*3+min(2,floor((absMinus2Sum+1)/2))+14,其他情况
在第三示例中,取代使用系数的程(absSum),可以使用系数组中之前编码系数的数目的计数。在这种示例中,可以使用如图18所示的有限状态机,图18示出了在一个示例实施例中这种有限状态机710的状态转换。有限状态机710开始于状态0下对每个系数组的编码,保持在状态0下直到对程进行编码,如“L”所指示。每个零系数导致对当前游的递增,如“R”所指示。在本实施例中,在对每个程进行编码的情况下,即,在每个非零系数的情况下,其转换到下一个状态,直到对三个程进行了编码,其后其保持在状态s=3。
在本实施例中,状态“s”(范围从0至3)至少部分用于确定对当前正在被编码的程的二进制值进行编码的上下文。例如,在系数组中编码的第一程将具有s=0,编码的第二程将具有s=1等等,直到针对该系数组编码的第四个和后续程,它们将具有s=3。在一个实施例中,可以通过以下方式给出上下文确定:
ctxInc(程)=秩*8+s*2+min(1,binIndex)
在另一实施例中,可以对状态程进行量化,且通过以下方式给出上下文确定:
ctxInc(程)=秩*6+min(2,(s+1)/2)*2+min(1,binIndex)
用于游编码的上下文模型
在AVS2中,在游编码中使用的上下文模型基于相同程-游对中的秩和程。在本申请的另一方面中,使用附加和/或备选信息来确定用于游编码的上下文。具体地,在各种实施例中,上下文可以至少部分取决于系数组位置、系数位置、或系数组中在先编码的系数。
在第一示例中,用于对游值的二进制值进行编码的上下文可以根据变换块中系数组的位置来导出。其可以进一步取决于秩和absLevel,如下给出:
ctxInc(游)=
秩*4+(absLevel>1)*2+min(1,binIndex),如果CG是块中左上角CG
秩*4+(absLevel>1)*2+min(1,binIndex)+20,其他情况
在第二示例中,上下文确定至少部分基于相对于当前系数组的已经编码的系数(或系数的子集)的绝对和。如之前结合图11描述的,在和中包括的之前编码的系数可以被封顶在例如最大值6。则将通过以下方式给出上下文确定:
ctxInc(游)=
min(4,(absSum+1)/2)*2+min(1,binIndex),如果CG是块中左上角CG
min(4,(absSum+1)/2)*2+min(1,binIndex)+10,其他情况
在第三示例中,上下文确定取决于将系数组分为区域的划分以及程-游对中的非零系数位于哪个区域中。参考图12,其示出了被系数组的对角划分720分为区域A 722和区域B 724的系数组720。在该实施例中,左上角中的三个系数落入区域A 722,且其余系数落入区域B 724。现在还参考图13,其示出了使用不同的划分来分为区域A722和区域B 724的另一系数组726。
在图12和13中示出的实施例中,划分与扫描顺序对齐,使得系数落入区域A 722还是区域B 724中可以根据系数按扫描顺序的索引来确定。对于系数组720,如果scanPos<3,则系数在区域A中。对于系数组726,如果scanPos<6,则系数在区域A中。在第一实施例中,可以通过以下方式给出上下文确定:
如果CG是块中左上角CG且CG是块中最后非零CG,则
ctxInc(游)=min(4,(absSum+1)/2)*8+(scanPos<3)*2+min(1,binIndex),
否则如果CG是块中左上角CG,则
ctxInc(游)=min(4,(absSum+1)/2)*8+4+min(1,binIndex),
否则
ctxInc(游)=min(4,(absSum+1)/2)*8+6+min(1,binIndex)。
在不同实施例中,基于图13所示的对角线,通过以下方式给出上下文确定:
如果CG是左上角CG,则
ctxInc(游)=min(4,(absSum+1)/2)*6+(scanPos<6)*2+min(1,binIndex),
否则
ctxInc(游)=min(4,(absSum+1)/2)*6+4+min(1,binIndex)
在这两个实施例中,基于变换块的DC系数和一些周围的系数可以使用单独的上下文,区域测试仅在最左上角系数组的情况下才应用。虽然如此,在其他实施例中,基于区域的上下文确定可以应用在其他系数组中。
还将意识到:尽管这两个实施例依赖于对系数组的对角划分,其允许将扫描位置用于确定区域,但是在其他实施例中,可以定义不同的区域。例如,区域A可以被定义为在(0,0)、(0,1)、(1,0)和(1,1)处的系数;第一行中的系数;或第一列中的系数。可以定义其他区域。在一个实施例中,可以将系数组划分为多于两个区域。
用于CG标志编码的上下文模型
为了确定用于对CG标志进行编码的上下文,可以使用变换块中一个或多个之前处理的CG标志的值。例如,可以使用按反组扫描顺序的两个之前系数组的CG标志来确定用于对当前CG标志进行编码的上下文。
用于对CG标志进行编码的上下文还可以基于或备选地基于变换块中关联系数组的位置。例如,再次参考图8,根据系数组是位于区域1、2还是3中,可以使用不同上下文集合。请回忆:区域0的CG标志(最左上角系数组)可以被推断为1,在该情况下,不对其进行编码。
下面,使用CGflagA来指示按反组扫描顺序的紧挨着的前一系数组,且CGflagB用于指示按反组扫描顺序的再前一个系数组。在一个示例中,可以通过以下方式给出上下文确定:
如果CG在8x8块中,则
ctxInc(CGflag)=(CGflagA*2+CGflagB)*3+regionIndex-1
否则
ctxInc(CGflag)=(CGflagA*2+CGflagB)*3+regionIndex-1+12
在又一实施例中,上下文确定基于一个或多个之前编码的CG标志,其服从先前CG标志在变换块中的相同区域的要求。可以按例如图8的划分来定义区域。
用于熵编码的帧内特定上下文确定
类似于H.264/AVC、HEVC、以及其他视频编码标准,AVS2使用多个可能的帧内预测模式或方向。具体地,AVS2当前定义了以下帧内预测模式:
模式0-垂直模式
模式1-水平模式
模式2-DC模式
模式3-左下
模式4-右下
模式5-水平下模式
模式6-垂直左模式
模式7-水平上模式
模式8-垂直右模式
在所使用的帧内预测模式和残余块中的残余分布之间存在相当强的相关性。例如,水平模式倾向于导致在残余块的最左各列中的残余。垂直模式倾向于导致在残余块的最上各行中的残余。
某些现有编码标准(如H.264或HEVC)尝试利用该相关性来提升效率。例如,将帧内预测模式用作选择变换的基础。可以预定义某些被设计为对数据进行高效压缩的变换,使其落入残余块中特定区域或图案中。在另一示例中,系数扫描可以与模式相关的。即,所使用的帧内预测模式可以确定使用对角、水平还是垂直扫描顺序对块进行编码。
在一个方案中,本申请提出了至少部分基于所使用的帧内预测模式来确定用于对变换系数数据进行编码的上下文确定。可以在对每个系数组中最后非零系数的位置(如果其被信号通知,则如上所述)和/或每个系数组中的程-游对进行编码时使用与模式相关的上下文确定。为熵编码所选择的上下文集合可以基于所使用的帧内预测模式。例如,与使用垂直预测所获得的系数数据相比,在对使用水平预测所获得的系数数据进行熵编码时,可以使用不同的上下文集合。
在一个实施例中,帧间编码帧/图片可以与至少一个帧内预测模式共享上下文集合。在另一实施例中,帧间编码数据使用其自己的上下文集合。
如上所述,某些视频编码标准具有大量的帧内预测模式。在AVS2的情况下,存在九种模式,其中一些产生某种统计上类似的残余分布。例如,垂直、垂直-左、和垂直-右倾向于都产生在最上各行中具有非零残余值的残余分布。因此,在一个实施例中,将帧内预测模式分组,且将一个上下文集合用于该组模式。在特定实施例中,将模式分为三组:水平、垂直、和对角。对角集合包括左下、右下、和DC模式。用于对模式进行分类的示例伪代码如下所述:
在本示例中,值“intraModeIdx”指示帧内编码具有类别0、1还是2。
对于上下文导出,可以将系数组划分为区域。用于获得变换系数的帧内模式可以是用于选择划分的基础。在一个示例中,针对每种模式类别来定义预定义的划分。
现在参考图14、15和16,其示出了分别针对垂直类别、水平类别、和对角类别对4x4系数组750进行划分的示例。图14示出了使用水平划分将系数组750分为区域A 752和区域B 754的划分。该划分预期与垂直模式一起使用。图15示出了通过垂直划分被分为区域A752和区域B 754的系数组750。该划分预期与水平模式一起使用。图16示出了通过对角划分被分为区域A 752和区域B 754的系数组750。该划分预期与对角模式一起使用。因此,在本示例中存在六种不同的上下文集合:
intraModeRegionIdx=INTRA_PRED_VER_A=0;
intraModeRegionIdx=INTRA_PRED_VER_B=1;
IntraModeRegionIdx=INTRA_PRED_HOR_A=2;
intraModeRegionIdx=INTRA_PRED_HOR_B=3;
intraModeRegionIdx=INTRA_PRED_DC_DIAG_A=4;
intraModeRegionIdx=INTRA_PRED_DC_DIAG_B=5;
针对程编码的上下文导出
当对程的二进制值进行编码时,非零系数的位置落入系数组中的区域之一。因此,该区域可以与帧内编码模式信息一起用于帮助确定用于对这些二进制值进行编码的上下文。在一个示例实施例中,区域和模式信息仅用于最左上角系数组,这导致通过以下方式给出的上下文确定:
ctxInc(程)=intraModeRegionIdx*10+秩*2+min(1,binIndex),如果左上角CG
秩*2+min(1,binIndex)+60,其他情况
在另一实施例中,区域和模式信息对所有系数组中的上下文集合选择产生影响。在一个示例中,这可以被实现为:
ctxInc(程)=intraModeRegionIdx*10+秩*2+min(1,binIndex),如果左上角CG
intraModeRegionIdx*10+秩*2+min(1,binIndex)+60,其他情况
在又一实施例中,将区域和模式信息与上面结合图18所描述的状态信息“s”一起用于上下文确定。在一个示例中,这可以被实现为:
ctxInc(程)=intraModeRegionIdx*30+秩*6+min(2,(s+1)/2)+min(1,binIndex),如果左上角CG
intraModeRegionIdx*30+秩*6+min(2,(s+1)/2)+min(1,binIndex)+180,其他情况
用于游编码的上下文导出
在使用程编码的情况下,程值的二进制值都与它们表示的非零系数的位置相关联或“位于”该位置处。在使用游编码的情况下,实际上不是这样的。游值指示按扫描顺序在当前非零系数之前存在多少个零值系数。一旦被二进制化为一元,如果从当前非零系数按反扫描顺序开始将二进制化的游值的二进制值映射到系数,则每个二进制值指示其对应映射的系数是否是非零的,即,游值的二进制值类似“有效图”(significance map)。在这个意义上,游值的二进制值可以“位于”被划分的系数组的不同区域中,或与不同区域中的系数相关联。
现在参考图17,其示出了示例系数组780。在该示例中,使用了帧内预测的垂直模式之一,因此,系数组780被水平划分分为区域A782和区域B 784。正在被编码/解码的当前非零系数标记为786。由箭头来指示反扫描顺序。当前非零系数786落入区域B 784中。
游(假定按反扫描顺序的接下来的一个或多个系数是零)将涉及落入区域A 782中的关联或映射系数。例如,游值的第二二进制值可以被称为对应于位置788中的系数。该二进制值的值指示了位置788中的系数是零还是非零。因此,在一些实施例中,当对游值的二进制值进行编码时,“区域”索引可以被配置为根据对应位置在哪里来逐二进制值改变。例如:
在某些其他实施例中,游值的二进制值可以具有其基于相关联的程值(即,当前非零系数)所在的区域来确定的上下文。在任一情况下,(由intraModeRegionIdx所指示的)该区域可以用于帮助确定在对变换块中至少一个系数组的游值的二进制值进行编码时使用的上下文。下面描述了各种示例实施例。
在第一示例中,在确定仅用于最左上角系数组的上下文时使用区域和模式信息:
ctxInc(游)=intraModeRegionIdx*10+min(4,(absSum+1)/2)*2
+min(1,binIndex),如果左上角CG
min(4,(absSum+1)/2)*2+min(1,binIndex)+60,
其他情况
在第二示例中,区域和模式信息用于确定所有系数组的上下文:
ctxInc(游)=intraModeRegionIdx*10+min(4,(absSum+1)/2)*2+
min(1,binIndex),如果左上角CG
intraModeRegionIdx*10+min(4,(absSum+1)/2)*2+min(1,binIndex)+60,其他情况
在第三示例中,区域和模式信息用于确定最左上角系数组的上下文,且其他系数组依赖于对角划分(如图16所示):
如果(region(positionCurrentPair,binIndexCurrentRun)==A)
regioninCGIdx=0;
否则
regioninCGIdx=1;
ctxInc(游)=intraModeRegionIdx*10+min(4,(absSum+1)/2)*2+
min(1,binIndex),如果左上角CG
regioninCGIdx*10+min(4,(absSum+1)/2)*2+min(1,binIndex)+60,其他情况
在第四示例中,对所有系数组应用基于区域的上下文确定。该区域划分取决于帧内预测模式:
如果(intraModeRegionIdx=INTRA_PRED_VER_A||intraModeRegionIdx=INTRA_PRED_HOR_A||intraModeRegionIdx=INTRA_PRED_DC_DIAG_A)
regioninCGIdx=0;
否则
regioninCGIdx=1;
ctxInc(游)=regioninCGIdx*10+min(4,(absSum+1)/2)*2+min(1,binIndex),如果左上角CG
regioninCGIdx*10+min(4,(absSum+1)/2)*2+min(1,binIndex)+20,其他情况
在第五示例中,结合所有系数组来使用基于区域的上下文确定,且区域取决于帧内预测模式以及还取决于当前二进制值是否对应于最左上角系数组内的DC分量。有效地,定义第三区域,其仅包含变换块的DC分量。示例伪代码可以是:
如果(region(positionCurrentPair,binIndexCurrentRun)==DC_in_top-left-CG)
regioninCGIdx=0;
否则如果(intraModeRegionIdx=INTRA_PRED_VER_A||intraModeRegionIdx=INTRA_PRED_HOR_A||intraModeRegionIdx=INTRA_PRED_DC_DIAG_A)
regioninCGIdx=1;
否则
regioninCGIdx=2;
ctxInc(游)=regioninCGIdx*10+min(4,(absSum+1)/2)*2+min(1,binIndex),如果左上角CG
(regioninCGIdx-1)*10+min(4,(absSum+1)/2)*2+min(1,binIndex)+30,其他情况
根据前面描述,将意识到:存在涉及条件的不同组合或子组合的各种其他示例和实施例。
用于最后位置编码的上下文导出
如上所述,在一些示例实施例中,在系数组边界处将游截断。因此,在一些实施例中,可以信号通知每个系数组中的最后非零系数的位置。在一些其他实施例中,如图6中512所指示,信号通知每个系数组的“最后游”,其反映了从该系数组的最右下角到该系数组中的最后非零系数的按反扫描顺序的零系数的数量。可以使用至少部分使用帧内预测模式导出的上下文,对这些语法元素中的任一项进行编码。
针对基于x-y坐标的最后系数位置编码,在第一示例中,可以将帧内预测模式如下结合regionIndex(其指示了当前系数组在变换块中哪个位置处,如上所述)一起使用:
ctxInc(lastPositionX)=(regionIndex<3)*(intraModeIdx+1)*6+binIndex
ctxInc(lastPositionY)=(regionIndex<3)*(intraModeIdx+1)*6+binIndex+3
在第二示例中,可以在不参考regionIndex的情况下使用帧内预测模式:
ctxInc(lastPositionX)=intraModeIdx*6+binIndex
ctxInc(lastPositionY)=intraModeIdx*6+binIndex+3
在第三示例中,使用regionIndex,且就在最左上角系数组的情况下应用帧内预测模式:
如果CG是左上角CG:
ctxInc(lastPositionX)=intraModeIdx*6+binIndex
ctxInc(lastPositionY)=intraModeIdx*6+binIndex+3
否则
ctxInc(lastPositionX)=(regionIndex<3)*6+binIndex+18
ctxInc(lastPositionY)=(regionIndex<3)*6+binIndex+3+18
在考虑到前面的描述的情况下,将意识到其他示例。
针对“最后游”编码,在第一示例中,可以将区域与秩一起使用:
如果(binIndex==0)
ctxInc(lastRun)=秩,如果左上角CG
秩+5,其他情况
否则
ctxInc(lastRun)=intraModeRegionIdx*5+秩+10,如果左上角CG
intraModeRegionIdx*5+秩+40,其他情况
在第二示例中,也对最左上角系数组应用帧内编码模式划分和基于区域的上下文确定:
如果(intraModeRegionIdx=INTRA_PRED_VER_A||intraModeRegionIdx=INTRA_PRED_HOR_A||intraModeRegionIdx=INTRA_PRED_DC_DIAG_A)
regioninCGIdx=0;
否则
regioninCGIdx=1;
如果(binIndex==0)
ctxInc(lastRun)=秩,如果左上角CG
秩+5,其他情况
否则
ctxInc(lastRun)=regioninCGIdx*5+秩+10,如果左上角CG
regioninCGIdx*5+秩+20,其他情况
在考虑到前面的描述的情况下,将意识到其他示例。
将意识到:根据本申请的解码器和/或编码器可以用多种计算设备来实现,包括(但不限于):服务器、恰当编程的通用计算机、音频/视频编码和回放设备、电视机顶盒、电视广播设备、以及移动设备。解码器或编码器可以通过软件来实现,该软件包含用于将处理器配置为执行本文所述功能的指令。软件指令可以存储在任何合适的非瞬时计算机可读存储器上,包括CD、RAM、ROM、闪存等。
将理解:本文所述的编码器和实现所述用于配置编码器的方法/过程的模块、例程、进程、线程、或其他软件组件可以使用标准计算机编程技术和语言来实现。本申请不限于特定处理器、计算机语言、计算机编程惯例、数据结构、其他这种实现细节。本领域技术人员将认识到:可以将所述过程实现为在易失性或非易失性存储器中存储的计算机可执行代码的一部分、专用集成芯片(ASIC)的一部分等等。
可以对所述实施例进行某种调整和修改。因此,上面讨论的实施例被视为是说明性而非限制性的。