具体实施方式
本公开描述了在跳过变换的情况下对块中的非零系数的符号进行编码的方法和编码器/解码器。
在第一方案中,本公开描述了一种对视频解码器中的数据的比特流进行解码,以重建视频中的块的非零系数的方法。所述方法包括确定所述块是在跳过变换的情况下进行编码的,并且基于所述确定,对相同符号标志进行解码,所述相同符号标志指示块中的非零系数是否全都具有相同符号。如果非零系数全都具有共同符号,则解码重建语义元素,所述语义元素指示所述共同符号是正还是负,以及基于所述语义元素,重建非零系数的有符号值;否则,重建块的相应非零系数的符号位,并基于其相应符号位,重建每个非零系数的有符号值。
在另一个方案中,本申请描述了一种对视频编码器中的视频的块进行编码的方法,所述块具有一个或多个非零系数。所述方法包括:确定要在跳过变换的情况下对块进行编码,并且基于所述确定:对相同符号标志进行解码,所述相同符号标志指示是否该块中的非零系数都具有共同符号;如果非零系数都具有共同符号,则对语义元素进行编码,所述语义元素指示共同符号是正还是负;以及如果非零系数不都具有共同符号,针对所述非零系数中的每个非零系数,如果不能推测得到其符号位,则对符号位进行编码。
在又一个方案中,本申请描述了一种对视频解码器中的数据的比特流进行解码以重建视频中的块的非零系数的方法。所述方法包括:确定所述块是在跳过变换的情况下进行编码的,并且基于所述确定:针对所述块中按照扫描顺序的每个非零系数,对所述非零系数的符号信息进行解码;以及基于所述符号信息,将所述非零系数设置为正或为负。所述解码是对至少一个非零系数的符号信息的不基于上下文的解码以及对至少一个其他非零系数的符号信息的基于上下文的解码。
在另一个方案中,本申请描述了一种在视频编码器中对视频的块进行编码的方法,所述视频的块具有两个或更多个非零系数。所述方法包括:确定要在跳过变换的情况下对块进行编码,并且基于所述确定:针对所述块中按照扫描顺序的每个非零系数,对所述非零系数的符号信息进行编码,其中所述符号信息基于所述非零系数是正还是负,以及其中所述编码是对至少一个非零系数的符号信息的不基于上下文的编码以及对至少一个其他非零系数的符号信息的基于上下文的编码。
在另一方面中,本公开描述了被配置为实现这种编码和解码方法的编码器和解码器。
在又一方面,本公开描述了存储计算机可执行程序指令的非瞬时计算机可读介质,所述计算机可执行程序指令在被执行时将处理器配置为执行所描述的编码和/或解码的方法。
根据以下结合附图对示例的描述的论述,本领域普通技术人员将理解本公开的其他方面和特征。
在以下描述中,参考用于视频编码的H.264标准和/或开发中的H.265/HEVC标准,描述了一些示例实施例。本领域技术人员应该理解,本申请不限于H.264/AVC或H.265/HEVC,而是可适用于其他视频编码/解码标准,包括可能的将来的标准、多视图编码标准、可伸缩视频编码标准、以及可重新的配置视频编码标准。
在随后的描述中,当提到视频或图像时,术语帧、图片、切片(slice)、分片(tile)和矩形切片组可以在某种程度上互换使用。本领域技术人员将认识到,在H.264标准的情形中,帧可以包含一个或多个切片。术语“帧”可以用H.265/HEVC中的“图片”来代替。在一些情形中,帧/图片的系列可称为“序列”。在其他视频编码标准中可使用其他术语。还将认识到,取决于可应用的图像或视频编码标准的具体要求或术语,某些编码/解码操作可以逐帧执行,而一些编码/解码操作逐切片执行,一些编码/解码操作逐图片执行,一些编码/解码操作逐分片执行,还有一些编码/解码操作以矩形切片组的方式执行。在任何特定实施例中,适用的图像或视频编码标准可以确定是否关于帧和/或切片和/或图片和/或分片和/或矩形切片组来执行以下描述的操作,视情况而定。相应地,根据本公开,本领域普通技术人员将理解,本文描述的特定操作或过程以及对帧、切片、图片、分片、矩形切片组的特定引用对于给定实施例是否适用于帧、切片、图片、分片、矩形切片组、或者其中的一些或全部。其还适用于编码树单元、编码单元、预测单元、变换单元等,这些将通过以下描述而变得清楚。
现在参照图1,图1以框图形式示出了用于对视频进行编码的编码器10。还参照图2,图2示出了用于对视频进行解码的解码器50的框图。将清楚的是,本文描述的编码器10和解码器50均可以在专用或通用计算设备(包含一个或多个处理单元和存储器)上实现。编码器10或解码器50执行的操作可以通过例如专用集成电路或通过通用处理器可执行的存储程序指令来实现,视情况而定。设备可以包括附加软件,该附加软件包括例如用于控制基本设备功能的操作系统。关于以下描述,本领域技术人员可以认识到在其中可以实现编码器10或解码器50的设备和平台的范围。
编码器10接收视频源12并产生编码比特流14。解码器50接收编码比特流14并输出解码视频帧16。可以将编码器10和解码器50配置为依照多种视频压缩标准进行操作。例如,编码器10和解码器50可以遵循H.264/AVC。在其他实施例中,编码器10和解码器50可以符合其他视频压缩标准,包括H.264/AVC标准的演进,如H.264/HEVC。
编码器10包括空间预测器21、编码模式选择器20、运动预测器36、变换处理器22、量化器24和熵编码器26。本领域普通技术人员应当认识到,编码模式选择器20确定视频源的合适编码模式,例如对象帧/切片是否是I、P或B类型,以及帧/切片内的特定编码单元(例如宏块、编码单元等)是被帧内编码还是帧间编码,即,预测是来自于运动预测器36(帧间编码)还是来自于空间预测器21(帧内编码)。变换处理器22执行对空间域数据的变换。具体地,变换处理器22应用基于块的变换来将空间域数据变换为频谱分量。例如,在许多实施例中,使用离散余弦变换(DCT)。在其他实例中可以使用其他变换,例如离散正弦变换、小波变化等。在变换单元上执行基于块的变换。变换单元可以和编码单元大小相同,或者可以将编码单元划分为多个变换单元。在H.264标准中,例如,典型的16x16宏块(编码单元)包含16个4x4的变换单元,并对4x4的块执行DCT处理。变换单元(TU)可以是其他大小。在一些情形中,TU可以是非正方形的,例如非正方形正交变换(NSQT)。
将基于块的变换应用于像素数据块得到变换域系数的集合。在该上下文中,“集合”是有序集合,在该集合中系数具有系数位置。在一些实例中,变换域系数的集合可被认为是系数的“块”或矩阵。在本文的描述中,短语“变换域系数的集合”或“变换域系数的块”互换地使用,并且用于指示变换域系数的有序集合。
量化器24对变换域系数的集合进行量化。然后,由熵编码器26对已量化的系数和相关信息进行编码。
在不参考其他帧/切片的情况下,对帧内编码的帧/切片(即,I型)进行编码。换言之,其不使用时间预测。然而,帧内编码的帧依赖于帧/图像片内的空间预测,如图1中由空间预测器21所示。也就是说,当对特定块进行编码时,可以将该块中的数据与已经针对该帧/切片编码的块内的相邻像素的数据相比较。通过使用预测操作,编码器10基于相邻像素数据创建预测块或单元。存在各种预测模式或预测方向。在一些情形中,可以使用速率失真优化来选择模式/方向。预测操作中使用相邻像素是重建像素,其先前已被编码和解码,并存储在反馈环路内的线缓存35中。块和预测块的实际像素数据之间的差是残差块,即,误差信号。对残差数据进行变换、量化和编码,以在比特流14中发送。
帧间编码的帧/块依赖于时间预测,即,使用来自其他帧/图片的重建数据对其进行预测。编码器10具有反馈环路,反馈环路包括:解量化器28、逆变换处理器30和解块处理器32。解块处理器32可以包括解块处理器和滤波处理器。这些元件反映了解码器50执行以再现帧/图像片的解码过程。使用帧存储器34来存储再现帧。通过这种方式,运动预测基于解码器50处的重建帧将是什么,而不基于原始的帧,由于编码/解码中所涉及的有损压缩,原始帧与重建帧可能不同。运动预测器36使用帧存储器34中存储的帧/切片作为源帧/图片,来与当前帧进行比较,以识别相似块。换句话说,执行运动向量搜索以识别另一帧/图片。该块是预测块/单元的源。预测块和原始块之间的差变为残差数据,残差数据然后被变换、量化和编码。
本领域普通技术人员将清楚用于实现视频编码器的细节和可能变形。
解码器50包括熵解码器52、解量化器54、逆变换处理器56和解块处理器60。解块处理器60可以包括解块和滤波处理器。当帧/图片被解码以便空间补偿器57在帧内编码中使用时,线缓存59存储重建像素数据。帧缓冲器58存储被完全重建和解块的帧以便运动补偿器62在应用运动补偿时使用。
熵解码器52接收并解码比特流14,以恢复量化后的系数。在熵解码处理期间还可以恢复边信息(包括编码模式信息),并且可以将其中的一些提供给补偿环路,以在创建预测时使用。例如,熵解码器52可以恢复用于帧间编码块的运动向量和/或参考帧信息,或者用于帧内编码块的帧内编码模式方向信息。
然后,解量化器54对量化后的系数进行解量化,以产生变换域系数,然后,逆变换处理器56对变换域系数进行逆变换,以重构/重建残差像素域数据。空间补偿器57根据预测方向信息而产生预测的块,所述预测方向信息由比特流和线缓存59中先前重建的附近像素解码而得到。根据来自相同帧的先前重建的像素数据,空间预测使用与编码器已使用的预测模式/方向相同的预测模式/方向。基于先前解码的帧/图片和从比特流解码的运动向量,通过创建预测块来重建帧间编码块。然后,将重建残差数据添加到预测块中以产生重建像素数据。本文中,空间和运动补偿二者均可以称为“预测操作”。
然后,可以对重建帧/切片应用解块/滤波处理,如解块处理器60所示。在解块/滤波后,输出帧/切片作为解码视频帧16,例如以在显示设备上显示。将理解的是,视频回放机(如计算机、机顶盒、DVD或蓝光播放器和/或移动手持设备)可以在输出设备上显示之前在存储器中缓冲解码帧。
在许多视频编码标准中,通过对若干语义元素进行编码,对系数数据进行编码.例如,在HEVC/H.265中,可以使用显著系数标志(significantcoefficientflag)对量化后的系数进行编码,以指示该系数是否非零,可以使用大于1的标志对量化后的系数进行编码,以指示该非零系数的幅值是否大于1,可以使用大于2标志对量化后的系数进行编码,以指示该非零系数的幅值是否大于2,并且当标志指示其大于2时(或在不再使用大于2标志的一些情形中,大于1时),使用指定非零系数幅值的剩余级别整数对量化后的系数进行编码。除了使用这些各种语义元素对系数幅值进行编码,还对系数的符号进行编码。
HEVC/H.265提出一般对每个系数的符号位进行编码和解码。在许多实施例中,每个系数具有相应的符号位,所述符号位在系数为正时可以设置为0,在系数为负时可以设置为1。使用不基于上下文的编码(即,使用等概率编码,有时也称为“旁路(bypass)编码”或清除式编码(clearcoding))对符号位进行编码和解码。在一些情形中,可以推测符号位,例如通过符号数据隐藏,如申请人拥有的美国专利公开2013/0188725(公开日2013年7月25日)所描述的。通过引用将美国专利公开2013/0188725的内容并入本文。
HEVC/H.265的另一个特征是变换跳过。在一些情形中,编码器可以确定跳过变换操作并简单地直接在空间域中量化残差数据将会是有益的。然后,量化后的残差数据被当作系数数据处理,并通过正常过程而编码。变换跳过标志可以用于信号发送块在何时处于变换跳过激活态。
诸如AVC/H.264和HEVC/H.265的视频编解码器提供无损编码模式,其允许绕过变换、量化和解块操作以及适当的情况下它们的相应逆操作。通过操作员指令或者通过内部判决过程,编码器可以确定调用这种模式,并在空间域中直接对未量化的残差数据进行编码。然后,未量化的残差数据被当作系数数据处理,并在正常过程中编码。已存在多种方法来信号发送该模式,例如,配置编解码器,以将使用为零的每块量化参数视为启用该行为,或备选地,通过使用标志来信号发送该行为对于块而言是激活的,对编解码器进行配置。
根据图片内容,变换跳过的效果与变换跳过模式和变换量化旁路无损模式二者相似。本说明书中,短语“在跳过变换的情况下”、“变换跳过”、“跳过变换”可互换地使用,其含义是指示跳过或绕过变换操作并导致空间域编码的方法。
发明人已发现,在跳过变换的情形下,不必坚持符号位编码过程底层的假设。具体地,发明人已发现,虽然在长序列中特定符号位的概率一般是50/50,但在个别块中存在很大程度的偏离。在正常变换块中,对符号位进行旁路编码,一部分原因是不存在主导符号,所以并不期望通过上下文自适应的编码得到改进的压缩。但在跳过变换块中,往往符号之一占据主导。以下表格提供了使用HEVC参考软件进行不同QP编码的多个标准文本序列的变换跳过块中的主导符号的概率。
表格1
很明显,个别变换块中存在较强的偏离。换句话说,就个别变换块而言,大多数非零系数具有相同符号的可能性很大。
为提高压缩效率,在块跳过变换的情形下,改变符号位的编码过程可能是有利的。在一些实施例中,这样可以导致使用更少的位来编码视频序列,从而可导致节省带宽和/或存储器使用。
以下将描述用于变换跳过块的各种符号编码过程。在一些情形中,一个或多个过程可以组合使用。
相同符号标志
在一个方案中,符号编码过程可以包括:增加语义元素以信号发送变换块中的所有非零系数都具有相同符号这一特殊情形,即每个非零系数的符号都相同。本说明书中,语义元素被标记为相同符号标志。如果所有系数都具有相同符号,则针对该块只需要发送一个符号位或符号标志,以指示非零系数的符号全部为正或全部为负。用于信号发送共同的符号是正还是负的符号标志可以是与正常符号位相区别的单独语义元素,或者替代使用单独的语义元素,编码器可以对按照扫描顺序的第一个非零系数的第一符号位进行编码,并放弃发送其他非零系数的任何其他符号位。在一些情形中,可以例如通过符号数据隐藏来推测符号标志。
现在参考图3,其以流程图的形式示出了在使用变换跳过时在视频编码器中对符号信息进行编码的示例方法100。所示出的方法100特征在于只有与符号编码直接相关的操作而不是视频编码中所有相关操作(包括预测操作、量化、或是对显著系数数据和级别信息的编码)的细节。
方法100适用于块跳过变换的情形。将要认识到,在没有使用变换跳过的情况下,包含方法100的视频编码器可以在不应用方法100的情况下对视频块进行编码。将要认识到,可以存在附加的条件或测试,用于确定何时对特定视频数据块应用该方法。
方法100开始于操作102,编码器确定是否块中的所有非零系数是否都具有共同的符号。如否,则将语义元素相同符号标志设置为0,并在操作104中编码。可以使用基于上下文的编码来对相同符号标志进行编码。在一个实施例中,使用专用上下文来对相同符号标志编码。然后,在操作106中,和往常一样,对块中的非零系数的各个符号标志进行编码。
然后在操作108中,当所有非零系数具有共同的符号时,将相同符号标志设置为1并编码。然后如操作110所示,编码器将一个语义元素编码,以信号发送所有信号是正还是负。在一个实施例中,存在被编码以信号发送该信息的单独的语义元素(系数块符号标志)。使用基于上下文的编码,可以对该元素编码,该基于上下文的编码使用其自身专用上下文。在该实施例中,非零系数的符号位都未被编码。在另一实施例中,一个非零系数(例如,按照扫描顺序的第一个系数)的符号位可以按照正常方式编码,并且剩余非零系数的符号位不被编码。
图4中以流程图的形式示出了示例解码方法120。结合方法100所述,方法120适用于变换跳过的情形。当解码器确定已对特定块应用了变换跳过时,当对该块中的非零系数的符号信息进行解码时,解码器可以使用方法120。
方法120开始于操作122,解码器对该块的相同符号标志进行解码。在一些实施例中,解码可以包括上下文自适应解码。一旦相同符号标志被解码,解码器评估该标志是1还是0,如操作124所示。如果标志是0,则不是所有符号都相同。因此,在操作126中,解码器重建该块中的每个非零系数的符号位。符号位的重建可以包括从比特流中解码符号位。在一些实例中(例如使用符号数据隐藏的一些实例中),符号位的重建可以包括推测一个或多个符号位的值。在操作128中,根据其相关联的重建的符号位,解码器使用重建的符号位来重建每个非零系数的有符号值。
重建系数的有符号值意味着产生对该系数的有符号值进行表示的重建的有符号整数。编码器通过将显著系数标志和其他级别的语义元素(例如,大于1标志、级别整数等)进行解码来重建系数的幅值。重建有符号值可以意味着,将任何重建的幅值的符号改变为负(或正),如果其重建的符号位指示这样的改变是所需要的。例如,默认,系数幅值的级别重建将获得正系数。因此,符号位指示需要使哪些非零系数为负。在其他实施方式中,可以对每个幅值应用以下操作:例如,根据相关联的重建符号位,有效地乘+1或-1。在一些情形中,用两个值的补数来对值进行表示。在其他情形中,根据实施方式的性质,可以使用不同的二进制或其他数值表示。所有这些情形都旨在包含于表述“重建系数的有符号值的”的含义中。
如果已解码的相同符号标志被设置为1,即,如果其向解码器指示块中的所有符号位都具有共同的符号,则在操作130中,解码器对符号语义元素进行解码。如上所述,根据实施方式,该元素可以是专用于在相同符号情况下信号发送符号的元素,或者其可以仅是一个非零系数的符号位。在专用语义元素的情形中,在一些实施例中,解码可以是上下文自适应解码。在正常符号位的情形中,解码可以是不基于上下文的解码。
一旦语义元素被解码,则在操作132中,解码器基于解码的符号语义元素来重建每个非零系数的有符号值。如上所述,在一些实施方式中,有符号值的重建可以意味着:改变不具有符号语义元素所指示的正确符号的任何系数的符号,并且不改变已具有符号语义元素所指示的正确符号的任何系数的符号。
还应当注意的是,当不是所有符号都相同时,即,当个别符号位被编码时,可能出现允许推测符号位的特殊情形。如果除一个符号位外的其他符号位都被解码,并且所有被解码的符号位都是相同符号,则可以推测最后一个符号位具有相反符号。因此,在该条件下,编码器和解码器可以推测该最后一个符号位,而不需要显式地对其进行解码。符号数据隐藏还可以应用于其他情况,如下文所述。
在一个非限制示例中,并且不将本公开限制为H.265或其变型,通过改变当前草案版本的H.265/HEVC语义,以下伪代码语义示出了本公开的方案的一个实施方式。
可以将残差解码的语义修改为包括以下伪代码。
在上述示例伪代码中,在块中所有符号都相同的情形中,使用元素coeff_blk_sgn_flag来信号发送符号信息。
将要理解的是,在一些实施例中,相同符号标志可以与符号数据隐藏相结合地使用。在一个示例中,相同符号标志可以用于信号发送跳过变换的块中的所有非零系数(不包括通过符号数据隐藏来推测其符号的系数)具有共同符号的特殊情形。如果所有这些系数都具有共同的符号,则针对该块只需要发送一个符号语义元素或符号位,以指示所有这样的非零系数的符号是正还是负。
在另一个示例中,相同符号标志可被用于信号发送变换跳过块中的所有非零系数都具有共同符号的特殊情形。如果所有系数都具有相同符号,则针对该块只需要发送一个符号语义元素或符号位,以指示所有非零系数的符号是正还是负。可以通过符号数据隐藏来推测符号语义元素或符号位自身。或者,在针对这样的块禁用符号数据隐藏的情形中,可以将其显式地发送。
在又一个示例中,相同符号标志可被用于信号发送变换跳过块中的所有非零系数都具有共同符号的特殊情形。如果所有系数都具有相同符号,则针对该块只需要确定或推测一个符号语义元素或符号位(例如,通过符号数据隐藏),以指示所有非零系数的符号是正还是负。否则,增加第二语义元素,以信号发送变换跳过块中的所有非零系数(不包括通过符号数据隐藏来推测其符号的系数)都具有共同符号的特殊情形。如果所有这些系数都具有相同符号,则所有这些非零系数的符号都可被推测为与通过符号数据隐藏来推测其符号的系数的符号相反的符号。
在一些实施例中,可以使用阈值来确定是否针对系数的某个块信号发送相同符号标志。在一个示例中,阈值基于块中非零系数的数量。也就是说,必然存在块中非零系数的至少一个阈值数量,其中不包括通过符号数据隐藏来推测其符号的非零系数。在一些实施例中,阈值可以设置为2。当不在比特流中信号发送相同符号标志时,可以推测该相同符号标志。例如,如果块中非零系数的数量正好为1,可以推测相同符号标志置位或者为1。在另一个示例中,如果块中非零系数的数量大于1且小于阈值,可以推测相同符号标志为0。注意,当对相同符号标志进行推测且块中非零系数的数量大于1时,在最后一个符号位之前的所有已解码符号位都是相同符号的情形中,应当禁用对最后一个符号位的推测。
变换跳过块可以包含多个子块。每个子块可以被认为是上述示例中的变换跳过块,并且可以具有自身的相同符号标志和相关的语义元素。在这些情形中,可在然后在子块级将相同符号标志与符号数据隐藏结合使用,并且可以使用阈值来确定是否针对系数的子块信号发送相同符号标志。
在变换跳过块由多个子块构成且每个子块具有其自身的相同符号标志的示例中,对子块的相同符号标志的编码可以依赖于相同变换跳过块中先前编码的子块的相同符号标志。这样的依赖性的示例包括但不限于:1)编码模式,即,是否使用基于上下文的编码;2)基于上下文的编码中使用的上下文,即,上下文可以依赖于相同变换跳过块中先前解码的相同符号标志;3)根据先前解码的相同符号标志而确定的对当前的相同符号标志的预测;4)根据先前解码的相同符号标志对当前的相同符号标志的推测;5)根据先前解码的相同符号标志,调节用于确定是否对当前的相同符号标志进行编码的阈值;或者6)上述示例的任何逻辑组合。
有限状态机
在另一个方案中,可以利用变换跳过块中所有系数有很高概率具有相同符号这一事实,来改进符号语义元素(符号位自身,或其他符号信息元素)的基于上下文的编码。具体地,已注意到,如果变换跳过块中的已编码非零系数的序列具有共同的符号,则下一个非零系数具有相同符号的可能性很高。连续的共同符号系数的序列越长,则下一个系数具有相同符号的可能性越高。相反,如果序列中具有相反符号的两个系数相遇,则后续系数的符号往往是随机的,即,每种符号出现的概率都是约0.5。上述观察可被用于建立有限状态机上下文模型。
图5a中图解示出了示例有限状态机200。有限状态机200具有初始状态0,其对应于不基于上下文的EP编码。在对变换跳过块中的第一个符号编码后,有限状态机前进至状态1。在该点之后,转变将基于序列是否保持相同符号。如果在块中的非零系数序列中继续遇到相同符号,则机器依次前进至状态2、3、4。每个状态可以对应于不同的上下文。例如,可以基于状态索引减1(例如,状态2对应于上下文1)来选择和使用上下文0-3。在该示例机器200中,状态4是最大状态。其他实施例可以具有更多或更少的状态。
在遇到和序列中先前符号位不匹配的符号位的事件中,使用当前状态的上下文对该符号位进行编码,然后,有限状态机200转变回到状态0,并在序列的持续期中保持状态0。使用FP编码(即,不基于上下文的编码)对所有后续符号位进行编码。
图5b中示出了另一示例有限状态机210。该示例有限状态机210在相同符号的轮次中断时不回到第一或初始状态,而是使用中间状态,该中间状态对应于EP或绕过编码,且如果再次遇到足够数量的连续相同符号,有可能由其转变回到基于上下文的编码。这适用于较大块的情形,尤其适用于涉及可存在多轮共同符号的帧内预测的情形。
在有限状态机210中,从第一状态至使用基于上下文的编码的第二状态进行初始转变,且从第二状态起,机器前进至另一个基于上下文的编码状态(如状态2、3、4),或者前进至对应于不基于上下文的编码的EP/绕行状态。当遇到与序列中的先前符号位不匹配的符号位并使用EP编码再次对其编码时,可以前进至一个或多个另外的中间状态(例如,EP-1)。当遇到保持相同符号的另一个符号位时,可以从上一个中间状态(该示例中,EP-1)前进至对应于基于上下文的编码的状态之一(即,状态1、2、3或者4)。然后,如上文所述,按照当前状态值对所有后续符号位进行编码。如果在中间状态评估期间的任何点处遇到与序列中先前符号位不匹配的符号位,则有限状态机转变回到初始中间状态。其他实施例可以具有更多或更少的中间状态。
在另一实施例中,可以对另一符号信号语义元素进行编码,而不是对符号位本身进行编码。例如,可以基于一个或多个先前编码的符号位来预测符号位,并且信号发送符号位的语义元素可以信号发送该预测是否为真。例如,语义元素“isNotPredSign”可以用于指示预测是否准确。在一个示例实施例中,预测基于前一已编码的符号位。
在该示例实施例中,状态1至2、2至3以及3至4的转变基于当前符号与预测符号(例如,先前编码的符号)相等,即,到目前为止,序列中的每个符号都具有相同符号。回到状态0的转变基于当前符号与预测符号不相等。
现在参考图6,其中以流程图的形式示出了用于在视频编码器中对变换跳过块的非零系数的符号信息进行编码的示例方法220。方法220开始于操作222,将状态索引初始化为状态0,并将predSign设置为指定的初始值(可以是0或1,这取决于习惯以及初始假设所认为的正或负)。操作224中,编码器评估当前符号与预测符号是否相同。如相同,则在操作226中将isNotPredSign标志设置为0。如果当前符号与预测符号不同,则在操作228中将其设置为1。
操作230中,编码器评估机器当前是否处于状态0。如是,则在操作232中对inNotPredSign进行旁路编码(不基于上下文的编码)。第一个符号的情形与机器之后在序列中回到状态0的情况相比,对状态0进行不同处理。具体地,第一个符号后机器自动从状态0变为状态1,而如果机器之后在序列中回到状态0,其不离开状态0。因此,操作234中,编码器评估刚编码的符号是否是序列中的第一个符号。如是,则在操作236中状态索引前进至状态1。否则,状态索引保持在状态0。
操作230中,如果编码器识别其不处于状态0,则其确定用于对符号进行编码的上下文。在该实施例中,通过状态索引减1得到上下文索引,如操作238所示。也就是说,状态1对应于上下文0,状态2对应于上下文1,以此类推。然后在操作240中,使用基于上下文的编码和所确定的上下文,对isNotPredSign标志进行编码。
在isNotPredSign标志的编码后,操作242中,然后编码器评估其是否处于状态0(即,状态索引≠0)以及isNotPredSign是否为0(即,当前符号与先前/预测符号相同)。如果这两个条件都满足,则操作244中,状态索引递增1,直到最大值(该示例中为4)。如果这两个条件中任一个不满足或者都不满足,则操作246中,状态被重置为0。在对块的剩余部分编码时,状态保持为0。操作248中,将预测符号设置为当前符号,并且编码器前进至对下一符号(或者更确切地说,对应于下一个符号的inNotPredSign)进行编码。如果块中没有更多的剩余符号要被编码,则方法200结束。
现在参考图7描述对应的示例解码方法250,图7中示出了示例解码方法250的流程图。和先前描述方法相同,解码方法250的前提为块是变换跳过块。方法250开始于操作252,将状态索引初始化为0,并且将predSign值(预测符号)设置为初始值。可以在首部信息(例如,序列首部或比特流中其他位置)中向解码器信号发送初始值。在一些例子中,predSign的初始值可以基于最后一个解码符号,或者基于默认设置,或者基于编码器和解码器都知道的某个其他元素。
操作254中,通过从比特流中解码isNotPredSign,解码器开始。解码的特性依赖于状态索引。如果状态索引是0,例如,当对块中按照扫描顺序的第一个符号进行解码时,则解码是不基于上下文的解码。如果状态索引不是0,则解码是基于上下文的解码,其中所述上下文是基于状态索引确定的。
一旦isNotPredSign标志被解码,解码器对第一个符号进行特殊处理,如操作256所示。如果这是块中按照扫描顺序的第一个符号,则操作258中,基于predSign值和解码的isNotPredFlag来设置第一符号位。也就是说,如果isNotPredFlag是0,即,该符号和预测相同,就将该符号位设置为等于predSign值。否则,将其设置为predSign值的相反值。然后,在操作260中,状态索引自动递增为状态1。然后,方法250回到对下一个符号进行解码的操作。
如果其不是操作256中确定的第一个符号,在操作262中,解码器评估状态是否为0且解码的isNotPredSign标志是否为0。这些条件测试机器是否处于非零状态以及当前解码的符号与预测符号是否相同。如是,则在操作264中,符号位被重建为等于predSign值,并且在操作266中,状态索引递增1,且不大于最大值(该情形中为4)。注意,在该情况下,由于predSign值和刚重建的符号位相同,所以我们不必更新predSign值。然后,方法250回到操作254,使用对应于递增后的状态索引的上下文对下一个isNotPredSign标志进行解码。
在操作262中,如果状态为0或者isNotPredSign为1,则在操作268中,基于isNotPredSign标志和predSign值来重建当前符号位。如果isNotPredSign标志为1,则将符号位重建为predSign值的相反值,并且如果isNotPredSign标志位0,则将符号位重建为与predSign值相同。然后,在操作270中将predSign值设置为等于重建的符号位,并且在操作272中将状态索引设置为0。然后,方法250回到操作254,使用不基于上下文的编码对下一个isNotPredSign标志进行解码。
将要理解的是,在一些实施例中,可以结合基于有限状态机上下文的编码过程来使用相同符号标志。
基于先前编码的标志的上下文确定
在又一个方案中,可以使用基于上下文的编码对变换跳过块中的符号位进行编码和解码,其中所述上下文基于相邻或先前编码的符号位的值。在另一个示例中,可以使用两个或更多个相邻或先前编码的系数来确定用于符号编码的上下文。
作为示例实施例,两个相邻系数可以是当前系数下方的系数和当前系数右方的系数。当前系数可以表示为X,并且两个相邻系数表示为A和B,如下所示
XA
B
系数的符号可以表示如下:
sgn(x)=1,如果x>0
0,如果x=0
-1,如果x<0
关于X的符号,可以得到以下观察:
sgn(A)+sgn(B)>0:A和B的主导符号为正,且X更可能为正
sgn(A)+sgn(B)<0:A和B的主导符号为负,且X更可能为负
sgn(A)+sgn(B)=0:A和B没有主导符号,且X的符号可能是等概率的
在sgn(A)+sgn(B)=0的情形中,X的符号没有偏好,并且可被旁路编码,即,每个符号标志1位。在sgn(A)+sgn(B)!=0的情形中,可以使用基于上下文的编码,且X的符号的示例模型如下给出:
在一个实施例中,使用以下表达式来推导上下文:
ctxInc(signofX)=sgn(A)+sgn(B)>0?2*(sgn(A)+sgn(B))-1:2*(sgn(A)+sgn(B)+2)
注意,这仅是基于先前编码的符号来推导用于系数符号编码的上下文的一个示例,其中A和B是X的两个最接近的空间相邻系数。在另一个示例中,A和B可以是按相反扫描顺序(或更一般地,系数解码顺序)的两个先前编码的系数。在又一个示例中,在上下文推导中可以使用两个以上相邻系数的符号。
基于相邻系数的预测
如上所述,取代符号位本身,可以对isNotPredSign标志进行编码,以信号发送符号位与预测是否匹配。在上述实施例中,预测基于先前编码的符号。在另一个方案中,预测可以基于相邻系数的符号和幅值,例如A+B>0。在一个示例中,相邻系数可以包括变换跳过块中的右邻和下邻。在一个示例中,预测符号predSign可被定义为:
predSign=0,如果sgn(A)+sgn(B)>=0
1,如果sgn(A)+sgn(B)<0
在另一个示例中,predSign被定义为:
predSign=0,如果sgn(A)+sgn(B)>0
1,如果sgn(A)+sgn(B)<=0
如其他实施例中所述,预测可以基于两个以上的相邻系数,或者可以基于块中按照扫描顺序的两个或两个以上的先前编码的系数。在又一个实施例中,预测可以基于按照扫描顺序的先前编码的符号值,即,仅考虑非零系数。
标志isNotPredSign可以是上下文编码的。上下文可以使用以上结合符号位描述的相同模型。也就是说,可以给出如下的上下文模型:
在sgn(A)+sgn(B)=0的情形中,isNotPredSign标志不具有偏好,并且可以被旁路编码,即,不基于上下文的编码。还观察到概率Pr{X为负|sgn(A)+sgn(B)=-a}和概率Pr{X为正|sgn(A)+sgn(B)=a}相近,其中a=1,2。这表明:
Pr{isNotPredSign=0|sgn(A)+sgn(B)=-a}≈
Pr{isNotPredSign=0|sgn(A)+sgn(B)=a}
因此,可以将条件合并以减少上下文的数量。在该情形中,当sgn(A)+sgn(B)!=0时,给出如下的用于对isNotPredSign进行编码的示例上下文模型:
ctxInc(isNotPredSign)=abs(sgn(A)+sgn(B))-1
现在参考图8,其以流程图的形式示出了用于视频编码器中对变换跳过块的符号进行编码的示例方法300。方法300开始于操作302,如上所述,基于来自变换跳过块的两个或更多个先前编码的系数,设置predSign值。块的右下方部分中的系数的符号可以具有位于块边界外的相邻系数,其中,可以假设位于块边界外的这些相邻系数为0。
操作304中,将predSign和当前符号(currSign)相比较,如果它们相同,则方法300前进至操作306,将isNotPredSign标志设置为0,以指示该标志和预测相匹配。否则,在操作308中将isNotPredSign标志设置为0。接下来,在操作310中,根据来自变换跳过块的两个或更多个先前编码的系数,确定上下文。如上所述,在一个实施例中,上下文可以基于abs(sgn(A)+sign(B))-1。在其他实施例中,可以地使用更多或更少的相邻系数来确定上下文。然后,如果块中存在要被编码的附加符号,方法300回到操作302。注意,在一些例子中,操作310可以包括确定不应使用基于上下文的编码来对isNotPredSign标志进行编码,这时,在操作312中使用不基于上下文的编码。
图9中以流程图的形式示出了用于在视频解码器中重建符号位的对应示例解码方法320。方法320包括:在操作322中,基于来自块的两个或更多个先前编码的系数设置predSign值。然后,在操作324中,根据来自块的两个或更多个先前编码的系数,确定上下文。注意,在一些实施例中,用于确定上下文的系数和用于确定预测符号的系数可以相同,并且在其他实施例中,用于确定上下文的系数和用于预测符号值的系数可以不同。
一旦已确定上下文,在操作326中,从编码视频数据的比特流中解码isNotPredSign标志。如果上下文确定导致EP旁路编码,则使用不基于上下文的解码对isNotPredSign标志进行解码。否则,将所确定的上下文用于isNotPredSign标志的基于上下文的解码。
操作328中,解码器评估已解码的isNotPredSign标志是否为0。如是,则将符号位重建为具有与predSign值相同的值,如操作332所示。否则,在操作330中,将符号位重建为具有与predSign值相反的值。
符号翻转(flipping)
在一些例子中,可以改进计算复杂性并改进上下文适应性以减少所保持和确定的上下文的数量。在另一个方案中,变换跳过块的符号编码可以使用单个上下文。在变换块的常规符号编码中,正号和负号出现的概率相等,这意味着基于上下文的编码没有增强压缩。即使在变换跳过块的情况下,对于多个变换跳过块,正号和负号出现的概率相等,虽然在个别变换跳过块的情况下,存在着针对一个符号或另一个符号的强偏离。因此,可以控制个别块的符号,以确保在符号分布中保持偏离,以使得基于上下文的编码得到更好的压缩效率。
在一个方案中,为保持偏离而指定主导符号,并且如果变换跳过块的大部分不是主导符号,则使该块的所有符号翻转。针对每个变换跳过块,引入用于信号发送符号是否已翻转的标志。本申请中使用的术语“翻转”的含义是将符号反转,即,从正到负或从负到正。
在一些例子中,符号翻转条件还允许推测符号。例如,如果主导符号为正,并且在编码/解码期间几乎大多数的负符号被编码/解码,则可以推测所有剩余符号应当为正,因而不需要对其进行编码/解码。
用于信号发送变换跳过块是否使其符号翻转的标志可被表示为flipSign标志。可以使用单个专用上下文对该标志进行上下文编码/解码。还可以使用单个专用上下文对符号位本身进行上下文编码。
现在参考图10,其以流程图的形式示出了在视频编码器中对变换跳过块的符号位进行编码的示例方法400。方法400包括在操作402中设置主导符号。可以将其作为编码在序列首部、图片首部或比特流中的其他位置的标志来信号发送。在一些实施例中,可在编码器和解码器二者中对其进行默认设置。主导符号被设置为正或负中任一个,并且指示假设哪个符号最经常出现。在一个实施例中,可以基于比特流中的其他信息来推测主导符号。例如,主导符号可以基于图片中的第一个非零系数的符号、基于图片中的第一个块(块集合)的大多数符号、或者基于可选择主导符号的任何其他此类数据。
操作404中,针对变换跳过块,编码器对正号的数量和符号的数量进行计数。然后,确定非主导符号(正或负)的数量是否大于主导符号的数量。如是,在操作408中,编码器使块中所有符号都反转。也就是说,将符号反转,使得所有正号都为负且所有负号都为正。操作410中,将flipSign标志设置为1,以信号发送符号翻转。为方便说明,操作408被示为离散符号翻转操作,实践中,翻转操作事实上可以不实现为符号翻转,然后对其进行编码;相反,翻转可以并入基于flipSign标志的编码步骤中。
操作404中,如果确定非主导符号的数量少于或等于主导符号的数量,则在操作406中,将flipSign标志设置为0。
操作412中,对flipSign标志编码。在一些实施例中,flipSign标志可以被旁路编码。在一些实施例中,可以使用基于上下文的编码来对其进行编码。在一些实施例中,可以使用专用上下文。
然后,编码器对符号位进行编码。操作414中,对块中按照扫描顺序的第一符号位进行编码。如上所讨论,专用上下文用于对符号位进行编码。操作416中,评估要被编码的剩余符号的数量加上已编码的主导符号的数量是否小于或等于已编码的非主导符号的数量加1。在该情形中,编码器知道所有剩余符号都是主导符号,因而不需要将其编码。否则,前进到操作418,评估块中是否存在更多的符号。如是,回到操作414,对按照扫描顺序的下一符号位进行编码。如否,则在操作420中,编码器前进至下一个块(如果是变换跳过块),并回到操作404。
根据上述描述将理解,使变换跳过块的符号翻转以确保主导符号仍然是块中占大多数的符号是确保符号位的出现中的偏离的方法,从而上下文编码/解码提高了压缩效率。可理解的另一种方法是:“flipSign”标志可被认为是指示每个对应变换跳过块中哪个符号占据主导的标志。然后,使用于编码的上下文适于该块不管哪个符号占主导。
处理该单上下文符号位编码方案的又一方法是,不同于反转符号本身并对其进行编码,可以反转与上下文相关联的MPS(最大概率记号,mostprobablesymbol)并将它们作为符号来进行编码。然后,flipSign标志信号发送是否翻转与上下文相关联的MPS。需要注意的是,专用上下文仅是符号位的基于上下文的编码的一个示例。在另一个示例中,可以使用多于一个的上下文。在该示例中,然后,flipSign标志信号发送是否翻转与每个上下文相关联的MPS。
现在参考图11,其示出了用于在视频解码器中重建视频的变换跳过块的符号位的示例方法450。方法450包括从变换跳过块的比特流中解码flipSign标志。然后,操作454中,解码器从比特流中解码符号位。按照块中的扫描顺序来解码符号位。在将单个专用上下文用于符号位编码的情况下,解码是基于上下文的。
操作456中,基于已解码的符号位和已解码的flipSign标志,解码器按照扫描顺序中的该位置重建非零系数的符号位。操作458中,解码器评估该块的剩余符号位的数量加上已解码的主导符号的数量是否小于或等于已解码的非主导符号的数量加1。如是,则可以假设剩余的符号是主导符号,然后如操作460所示,基于主导符号和已解码的flipSign标志,设置所有剩余非零系数的符号。也就是说,如果flipSign是0,则将符号位设置为等于主导符号。否则,将其设置为非主导符号。在任一情形中,操作462中,解码器接下来确定对于该块是否存在要被解码的更多符号。如是,回到操作454,以对下一个符号位进行解码。
现在参考图12,其中示出了编码器900的示例实施例的简化框图。编码器900包括处理器902、存储器904、和编码应用906。编码应用906可以包括存储在存储器904中并包含指令的计算机程序或应用,所述指令用于将处理器902配置为执行诸如本文描述的操作等的步骤或操作。例如,编码应用906可以编码并输出根据本文描述的过程编码的比特流。可以理解,编码应用906可以存储在计算机可读介质上,如致密盘、闪存设备、随机存取存储器、硬盘等等。
现在还参考图13,其示出了解码器1000的示例实施例的简化框图。解码器1000包括处理器1002、存储器1004、以及解码应用1006。解码应用1006可以包括存储在存储器1004中并包含指令的计算机程序或应用,所述指令用于将处理器1002配置为执行诸如本文描述的操作等的步骤或操作。可以理解,解码应用1006可以存储在计算机可读介质上,如致密盘、闪存设备、随机存取存储器、硬盘等等。
将清楚的是,根据本申请的解码器和/或编码器可以在多种计算设备中实现,包括但不限于服务器、适当编程的通用计算机、音频/视频编码和回放设备、电视机顶盒、电视广播设备和移动设备。解码器或编码器可以通过软件来实现,该软件包含用于将处理器配置为执行本文所述功能的指令。软件指令可以存储在任何合适的非瞬时计算机可读存储器上,包括CD、RAM、ROM、闪存等。
将理解的是,可以使用标准计算机编程技术和语言来实现本文描述的编码器以及实现所描述的用于配置编码器的方法/过程的模块、例程、进程、线程或其他软件组件。本申请不限于特定处理器、计算机语言、计算机编程惯例、数据结构、其他这种实现细节。本领域技术人员将认识到,可以将所描述的过程实现为存储在易失性或非易失性存储器中的计算机可执行代码的一部分、专用集成芯片(ASIC)的一部分等。
可以对所述实施例进行某种调整和修改。因此,上文讨论的实施例应被认识是说明性而非限制性的。