用于系数代码化的上下文推导的制作方法

文档序号:19735828发布日期:2020-01-18 04:27阅读:155来源:国知局
用于系数代码化的上下文推导的制作方法



背景技术:

数字视频流可以使用帧或静止图像的序列来表示视频。数字视频可用于各种应用,包括:例如,视频会议、高清视频娱乐、视频广告或用户生成的视频的共享。数字视频流可以包含大量数据,并且消耗用于处理、传输或存储视频数据的计算装置的大量计算或通信资源。已经提出了各种方法来减少视频流中的数据量,包括压缩和其它编码技术。



技术实现要素:

所公开的实施方式的一个方面是一种对具有变换系数的变换块进行代码化的方法。该方法包括:基于用于代码化上下文的至少一个空间模板来定义寄存器阵列,所述寄存器阵列用于每个保存关于代码化上下文(即,用于确定代码化上下文)的一个或多个存储的值,其中,该寄存器阵列至少包括具有第一大小的第一寄存器阵列和具有与该第一大小不同的第二大小的第二寄存器阵列;通过将所述存储的值设置为默认值来初始化寄存器阵列;以及以反向扫描顺序对来自变换块的变换系数的、指示所述变换系数的幅度的值进行代码化。该代码化针对一个或多个变换系数中的每一个包括:使用来自寄存器阵列的所述存储的值的至少一些来确定代码化上下文;使用代码化上下文对扫描位置处的变换系数的值进行熵代码化;并且在对变换系数的值进行熵代码化之后,更新寄存器阵列。第一寄存器阵列具有与第二寄存器阵列不同的大小,其中,例如,第一寄存器阵列的大小被设定为存储与第二寄存器阵列的大小被设定的值的基数不同的值的基数。

所公开的实施方式的另一方面是一种对具有变换系数的变换块进行代码化的设备。该设备包括:存储器;以及处理器,该处理器配置为执行存储在该存储器中的指令。该指令在被执行时使处理器基于用于代码化上下文的至少一个空间模板来定义寄存器阵列,所述寄存器阵列用于每个保存关于代码化上下文的一个或多个存储的值,其中,该寄存器阵列至少包括具有第一大小的第一寄存器阵列和具有与该第一大小不同的第二大小的第二寄存器阵列;通过将所述存储的值设置为默认值来初始化寄存器阵列;以及以反向扫描顺序对来自变换块的变换系数的、指示所述变换系数的幅度的值进行代码化。用于代码化的指令针对一个或多个变换系数中的每一个包括用于进行以下操作的指令:使用来自寄存器阵列的所述存储的值的至少一些来确定代码化上下文;使用代码化上下文对扫描位置处的变换系数的值进行熵代码化;并且在对变换系数的值进行熵代码化之后,更新寄存器阵列。

描述了另一种用于对具有变换系数的变换块进行代码化的设备,该设备包括存储器;和处理器,该处理器配置为执行存储在存储器中的指令。该指令在被执行时使处理器基于用于代码化上下文的至少一个空间模板来定义寄存器阵列,所述寄存器阵列用于每个保存关于代码化上下文的一个或多个存储的值,通过将所述存储的值设置为默认值来初始化寄存器阵列,并且以反向扫描顺序对变换块的变换系数的、指示所述变换系数的幅度的值进行代码化。代码化指令包括用于进行以下操作的指令:使用来自寄存器阵列的所述存储的值的至少一些来确定第一代码化上下文;使用该第一代码化上下文对变换系数的第一值进行熵代码化,该第一值指示变换系数的幅度,并且第一值属于正整数集合{0,…,第一最大值};使用来自寄存器阵列的所述存储的值的至少一些来确定第二代码化上下文;使用该第二代码化上下文对变换系数的第二值进行熵代码化,该第二值指示变换系数的幅度,该第二值属于正整数集合{0,…,第二最大值},并且第二最大值大于第一最大值;并且在对第一值和第二值进行熵代码化之后,更新寄存器阵列。

所公开的实施方式的另一方面是一种对具有变换系数的变换块进行代码化的方法。该方法包括:基于用于代码化上下文的至少一个空间模板来定义寄存器阵列,所述寄存器阵列用于每个保存关于代码化上下文的一个或多个存储的值,通过将所述存储的值设置为默认值来初始化寄存器阵列,并且以反向扫描顺序对变换块的变换系数的、指示所述变换系数的幅度的值进行代码化。代码化包括:使用来自寄存器阵列的所述存储的值的至少一些来确定第一代码化上下文;使用该第一代码化上下文对变换系数的第一值进行熵代码化,该第一值指示变换系数的幅度,并且第一值属于正整数集合{0,…,第一最大值};使用来自寄存器阵列的所述存储的值的至少一些来确定第二代码化上下文;使用该第二代码化上下文对变换系数的第二值进行熵代码化,该第二值指示变换系数的幅度,该第二值属于正整数集合{0,…,第二最大值},并且第二最大值大于第一最大值;并且在对第一值和第二值进行熵代码化之后,更新寄存器阵列。

在以下对实施例、所附权利要求书和附图的详细描述中公开了本公开的这些和其它方面。

附图说明

此处的描述参照了附图,其中,在多个视图中,类似的附图标记表示类似的部件。

图1是视频编码和解码系统的示意图。

图2是能实施发送站或接收站的计算装置的示例的框图。

图3是要编码且随后解码的视频流的图。

图4是根据本公开的实施方式的编码器的框图。

图5是根据本公开的实施方式的解码器的框图。

图6是示出了根据本公开的实施方式的可以在对变换系数的块进行代码化时利用的扫描顺序的图。

图7是图示了根据本公开的实施方式的使用级别图的变换系数代码化的级的图。

图8是根据本公开的实施方式的用于使用级别图对编码的视频比特流中的变换块进行编码的过程的流程图。

图9a是示出了根据本公开的实施方式的可以在基于上下文的算术代码化方法中利用的第一空间相邻模板集合的图。

图9b是示出了根据本公开的实施方式的可以在基于上下文的算术代码化方法中利用的第二空间相邻模板集合的图。

图10是示出了与水平模板对应的寄存器集合的第一示例的图。

图11是示出了与垂直模板对应的寄存器集合的第一示例的图。

图12是示出了与二维模板对应的寄存器集合的第一示例的图。

图13是示出了与水平模板对应的寄存器集合的第二示例的图。

图14是示出了与垂直模板对应的寄存器集合的第二示例的图。

图15是示出了与二维模板对应的寄存器集合的第二示例的图。

图16是示出了与水平模板对应的寄存器集合的第三示例的图。

图17是示出了与垂直模板对应的寄存器集合的第三示例的图。

图18是示出了与二维模板对应的寄存器集合的第三示例的图。

图19是根据本公开的实施方式的用于对变换块进行代码化的过程的流程图。

图20是根据本公开的实施方式的用于对变换块进行代码化的另一过程的流程图。

具体实施方式

如上文所提及,与对视频流进行编码有关的压缩方案可以包括:将图像分解成块;以及使用一种或多种技术生成数字视频输出比特流(例如,编码比特流)来限制输出比特流中所包括的信息。接收到的比特流可以被解码以根据限制信息来重新创建块和源图像。对视频流或其一部分例如帧或块进行编码可以包括在视频流中使用时间或空间相似性以提高编码效率。例如,可以基于识别先前编码的像素值之间,或者先前编码的像素值的组合与当前块中的那些之间的差(残差)来编码视频流的当前块。

使用空间相似性的编码可以被称为帧内预测。帧内预测尝试使用块外围的像素来预测视频的帧的块的像素值;也就是说,使用与块在同一帧中但在块之外的像素。由帧内预测产生的预测块在本文中被称为帧内预测器。可以沿着预测方向执行帧内预测,其中,每个方向可以与帧内预测模式对应。帧内预测模式可以由编码器用信号通知给解码器。

使用时间相似性的编码可以被称为帧间预测。帧间预测尝试使用来自一个或多个时间上邻近的帧(即,参考帧)的一个或多个可能位移的块来预测块的像素值。位移由运动矢量识别。时间上邻近的帧是在视频流中在时间上早于或晚于正在编码的块的帧而出现的帧。一些代码化器使用多达八个参考帧,这些参考帧可以存储在帧缓冲器中。运动矢量可以参考(即,使用)帧缓冲器的参考帧中的一个。同样,一个或多个参考帧可以用于对当前帧进行代码化。由帧间预测产生的预测块在本文中被称为帧间预测器。

如上文所提及,可以基于识别到先前代码化的像素值与当前块中的像素值之间的差(残差)来对视频流的当前块进行编码。按照这种方式,仅需要将残差和用于生成残差的参数添加至编码比特流中。可以使用有损量化步骤来对残差进行编码。

残差块可以在像素域中。可以将残差块变换成变换域,从而产生变换系数的变换块。在本文中,频域被用作变换域的示例,但应被解释为通常是指值在经过变换包括离散余弦变换(dct)及其变体、离散正弦变换(dst)及其变体以及恒等变换及其缩放变体后表示的域。

可以对变换系数进行量化,从而产生量化变换系数的量化变换块。可以对量化系数进行熵编码并将其添加至编码比特流。解码器可以接收编码比特流,并且对量化变换系数进行熵解码以重构原始视频帧。

熵代码化是用于“无损”编码的技术,其依赖于对在编码视频比特流中出现的值的分布进行建模的概率模型。通过使用基于测量或估计的值的分布的概率模型,熵代码化可以将表示视频数据所需的比特数目减少到接近理论最小值。实际上,表示视频数据所需的比特数目的实际减少可以是概率模型的精度、执行编码的比特数目以及用于执行编码的定点算术的计算精度的函数。

在编码视频比特流中,许多比特用于以下两种情况中的一者:内容预测(例如,帧间模式/运动矢量编码、帧内预测模式编码等)或残差编码(例如,变换系数代码化)。

针对内容预测,比特流中的比特可以针对块包括用于对块进行编码的帧内预测模式。可以使用熵代码化对帧内预测模式进行代码化(由编码器编码以及由解码器解码)。同样,为帧内预测模式确定上下文,并且将与上下文对应的概率模型用于对帧内预测模式进行代码化。

通常通过以下步骤来实现对符号序列进行熵代码化:使用概率模型来确定序列的概率,然后使用二进制算术代码化在编码器处将序列映射至二进制码字,并且在解码器处将来自二进制码字的序列进行解码。

如本文中所使用的上下文模型可以是熵代码化中的参数。上下文模型可以是影响用于熵代码化的概率估计的任何参数或方法。上下文建模的目的是为后续的熵代码化引擎诸如算术代码化、霍夫曼编码以及其它可变长度到可变长度编码引擎获得概率分布。为了实现良好的压缩性能,可能需要大量的上下文。例如,一些视频代码化系统可以包括仅用于变换系数代码化的数百个或甚至数千个上下文。每个上下文可以与概率分布对应。

残差编码涉及将视频块的残差变换为变换系数的变换块。变换块在频域中,并且可以为视频块生成一个或多个变换块。对变换系数进行量化,并将其熵代码化到编码视频比特流中。解码器使用编码变换系数和参考帧来重构块。对变换系数进行熵代码化涉及对提供用于对二进制化变换系数的二进制符号进行代码化的条件概率的估计的上下文模型(也被称为概率上下文模型或概率模型)的选择。

本文中所描述的对量化变换系数的基于模板的熵代码化的实施方式中,在熵代码化期间使用空间模板来选择被代码化的值的上下文邻居,并且使用上下文邻居来确定代码化上下文。然而,访问用于确定代码化上下文所需的值可能会导致存储瓶颈。在本文中所描述的实施方式中,将用于确定代码化上下文所需的值保存在存储器内的寄存器阵列中,并且使用最新编码值来更新寄存器阵列中的至少一些值,这减少了必须从基本信息诸如变换块或级别图中获得的信息量。在一些实施例中,可以将这些寄存器阵列组织成一个或多个寄存器集合,其中,阵列的长度(即,元素的数目或所存储的上下文邻居值)可以是不同的。寄存器阵列可以包括移位寄存器或任何其它存储器,其中,值可在阵列内和/或在阵列之间移位。

在本文中首先参考可以包含教导的系统来描述对量化变换系数的基于模板的熵代码化。

图1是视频编码和解码系统100的示意图。发送站102可以是例如具有硬件诸如图2中所描述的硬件的内部构成的计算机。然而,发送站102的其它合适的实施方式也是可能的。例如,发送站102的处理可以分布在多个装置之间。

网络104可以连接发送站102和接收站106,以对视频流进行编码和解码。具体地,可以在发送站102中对视频流进行编码,并且可以在接收站106中对编码的视频流进行解码。网络104可以是例如因特网。在该示例中,网络104还可以是局域网(lan)、广域网(wan)、虚拟专用网(vpn)、蜂窝电话网络或将视频流从发送站102传输到接收站106的任何其它方式。

在一个示例中,接收站106可以是具有硬件诸如图2中所描述的硬件的内部构成的计算机。然而,接收站106的其它合适的实施方式也是可能的。例如,接收站106的处理可以分布在多个装置之间。

视频编码和解码系统100的其它实施方式也是可能的。例如,一个实施方式可以省略网络104。在另一个实施方式中,可以对视频流进行编码,然后将其存储以在以后的时间传输到接收站106或具有存储器的任何其它装置。在一个实施方式中,接收站106(例如,经由网络104、计算机总线和/或某种通信路径)接收编码的视频流,并存储该视频流以便稍后进行解码。在示例实施方式中,实时传输协议(rtp)用于通过网络104传输编码的视频。在另一个实施方式中,可以使用除rtp以外的传输协议,例如,基于http的视频流传输协议。

例如,当在视频会议系统中使用时,发送站102和/或接收站106可以包括对视频流进行编码和解码的能力,如下所述。例如,接收站106可以是视频会议参与者,其从视频会议服务器(例如,发送站102)接收编码的视频比特流,以解码和查看并进一步编码并将其自身的视频比特流发送给视频会议服务器,供其它参与者解码和查看。

图2是能实施发送站或接收站的计算装置200的示例的框图。例如,计算装置200可以实施图1的发送站102和接收站106之一或两者。计算装置200可以是包括多个计算装置的计算系统的形式,或者是单个计算装置的形式,例如,移动电话、平板计算机、膝上型计算机、笔记本计算机、桌面型计算机等。

计算装置200中的cpu202可以是中央处理单元。可替代地,cpu202可以是任何其它类型的装置或多个装置,其能够操纵或处理现在存在或以后开发的信息。尽管所公开的实施方式可以用如图所示的单个处理器例如cpu202来实践,但是可以使用一个以上的处理器来实现速度和效率上的优势。

在实施方式中,计算装置200中的存储器204可以是只读存储器(rom)装置或随机存取存储器(ram)装置。任何其它合适类型的存储装置都可以用作存储器204。存储器204可以包括由cpu202使用总线212访问的代码和数据206。存储器204还可以包括操作系统208和应用程序210,应用程序210包括至少一个程序,该程序允许cpu202执行这里描述的方法。例如,应用程序210可以包括应用1至n,其还包括执行这里描述的方法的视频代码化应用。计算装置200还可以包括辅助存储装置214,其可以例如是与移动的计算装置200一起使用的记忆卡。由于视频通信会话可能包含大量信息,因此可以将它们全部或部分存储在辅助存储装置214中,并根据需要将其加载到存储器204中。

计算装置200还可以包括一个或多个输出装置,诸如显示器218。在一个示例中,显示器218可以是将显示器与可操作用于感测触摸输入的触敏元件组合的触敏显示器。显示器218可以经由总线212耦合到cpu202。除了显示器218之外或作为显示器218的替代,可以提供允许用户编程或使用计算装置200的其它输出装置。当输出装置是显示器或包括显示器时,则该显示器可以以各种方式实施,包括通过液晶显示器(lcd)、阴极射线管(crt)显示器或发光二极管(led)显示器诸如有机led(oled)显示器。

计算装置200还可以包括图像感测装置220例如相机、或现在存在的或以后开发的能够感测图像诸如操作计算装置200的用户的图像的任何其它图像感测装置220,或与之通信。可以将图像感测装置220定位为使其朝向操作计算机装置200的用户。在示例中,可以对图像感测装置220的位置和光轴进行配置使得视野包括与显示器218直接相邻并且从其可以看到显示器218的区域。

计算装置200还可以包括声音感测装置222例如麦克风、或现在存在的或以后开发的能够感测计算装置200附近的声音的任何其它声音感测装置,或与之通信。可以将声音感测装置222定位为使其朝向操作计算装置200的用户,并且可以将其配置为接收在用户操作计算装置200时用户发出的声音例如语音或其它话语。

尽管图2将计算装置200的cpu202和存储器204描绘为集成到单个单元中,但是可以利用其它配置。cpu202的操作可以分布在可以直接耦合或跨局域网或其它网络耦合的多个机器(每个机器具有处理器中的一个或多个)上。存储器204可以分布在多个机器之间,诸如基于网络的存储器或执行计算装置200的操作的多个机器中的存储器。尽管在这里被描绘为单个总线,但是计算装置200的总线212可以由多个总线组成。此外,辅助存储装置214可以直接耦合至计算装置200的其它组件,或者可以经由网络访问,并且可以包括单个集成单元诸如记忆卡或多个单元诸如多个记忆卡。因此,可以以多种配置来实施计算装置200。

图3是要编码且随后解码的视频流300的示例的图。视频流300包括视频序列302。在下一级别,视频序列302包括若干相邻帧304。尽管将三个帧描绘为相邻帧304,但是视频序列302可以包括任意数目的相邻帧304。然后可以将相邻帧304进一步细分为各个帧,例如帧306。在下一级别,帧306可以被分成一系列的片段308或平面。例如,片段308可以是允许并行处理的帧的子集。片段308也可以是可以将视频数据分离成单独的颜色的帧的子集。例如,彩色视频数据的帧306可以包括亮度平面和两个色度平面。可以以不同的分辨率对片段308进行采样。

不管帧306是否被划分为片段308,帧306都可以进一步细分为块310,其可以包含对应于例如帧306中的16x16像素的数据。块310也可以被布置为包括来自像素数据的一个或多个片段308的数据。块310还可以具有任何其它合适的大小,诸如4x4像素、8x8像素、16x8像素、8x16像素、16x16像素或更大。

图4是根据本公开的实施方式的编码器400的框图。如上所述,编码器400可以实施在发送站102中,诸如通过提供存储在存储器例如存储器204中的计算机软件程序来实施。计算机软件程序可以包括机器指令,该机器指令在由诸如cpu202等处理器执行时使发送站102以本文描述的方式对视频数据进行编码。编码器400也可以被实施为例如包括在发送站102中的专用硬件。编码器400具有以下级以在正向路径(由实线连接线示出)中执行各种功能来使用视频流300作为输入产生编码的或压缩的比特流420:帧内/帧间预测级402、变换级404、量化级406和熵编码级408。编码器400还可以包括重构路径(由虚线连接线示出)以重构帧以对未来的块进行编码。在图4中,编码器400具有以下级以在重构路径中执行各种功能:去量化级410、逆变换级412、重构级414和环路滤波级416。编码器400的其它结构变型可以用于对视频流300进行编码。

当呈现视频流300以进行编码时,可以以块为单位处理帧306。在帧内/帧间预测级402中,可以使用帧内预测(也称为内预测)或帧间预测(也称为间预测)或两者的组合来对块进行编码。无论如何,都可以形成预测块。在帧内预测的情况下,可以从当前帧中先前已被编码和重构的样本形成预测块的全部或一部分。在帧间预测的情况下,可以从使用运动矢量确定的一个或多个先前构造的参考帧中的样本形成预测块的全部或一部分。

接下来,仍然参照图4,可以在帧内/帧间预测级402从当前块减去预测块以产生残差块(也称为残差)。变换级404使用基于块的变换在例如频域中将残差变换为变换系数。这种基于块的变换包括:例如,dct和非对称dst。其它基于块的变换也是可能的。此外,可以将不同变换的组合应用于单个残差。在变换的应用的一个示例中,dct将残差块变换到频域,其中变换系数值基于空间频率。最低频率(dc)系数位于矩阵左上角处,且最高频率系数位于矩阵右下角处。值得注意的是,预测块的大小以及因此产生的残差块的大小可能与变换块的大小不同。例如,可以将预测块划分为对其应用单独的变换的较小的块。

量化级406使用量化器值或量化等级将变换系数转换为离散的量子值,其被称为量化变换系数。例如,可以将变换系数除以量化器值并将其截断。然后,通过熵编码级408对量化变换系数进行熵编码。可以使用包括令牌树和二叉树在内的任何数目的技术来执行熵代码化。然后,将熵编码的系数以及可以包括例如所使用的预测类型、变换类型、运动矢量和量化器值的用于解码块的其它信息一起输出至压缩比特流420。可以将用于解码块的信息熵编码为压缩比特流420内的块、帧、切片和/或节头。压缩比特流420也可以被称为编码视频流或编码视频比特流,并且这些术语在本文中将可互换地使用。

图4中的重构路径(由虚线连接线示出)可用于确保编码器400和解码器500(下面描述)都使用相同的参考帧和块来对压缩比特流420进行解码。重构路径执行与在解码过程中发生的将在下面进行更详细讨论的功能相似的功能,这些功能包括在去量化级410对量化变换系数进行去量化、以及在逆变换级412对去量化变换系数进行逆变换以产生导数残差块(也称为导数残差)。在重构级414中,可以将在帧内/帧间预测级402所预测的预测块添加到导数残差以创建重构块。可以将环路滤波级416应用于重构块,以减少诸如块效应等失真。

编码器400的其它变型可以用于编码压缩比特流420。例如,基于非变换的编码器400可以直接量化残差信号,而无需针对某些块或帧的变换级404。在另一实施方式中,编码器400可以将量化级406和去量化级410组合成单个级。

图5是根据本公开的实施方式的解码器500的框图。例如,通过提供存储在存储器204中的计算机软件程序,可以在接收站106中实施解码器500。该计算机软件程序可以包括机器指令,该机器指令在由诸如cpu202等处理器执行时使接收站106以下文描述的方式对视频数据进行解码。解码器500也可以在例如包括在发送站102或接收站106中的硬件中实施。

类似于上面讨论的编码器400的重构路径,解码器500在一个示例中包括以下级以执行各种功能以从压缩比特流420产生输出视频流516:熵解码级502、去量化级504、逆变换级506、帧内/帧间预测级508、重构级510、环路滤波级512和后滤波级514。解码器500的其它结构变型可以用于对压缩比特流420进行解码。

当呈现压缩比特流420进行解码时,压缩比特流420内的数据元素可以由熵解码级502解码以产生量化变换系数集合。去量化级504对量化变换系数进行去量化(例如,通过将量化变换系数乘以量化器值),并且逆变换级506使用选择的变换类型对去量化变换系数进行逆变换以产生可以与由编码器400中的逆变换级412所创建的导数残差相同的导数残差。使用从压缩比特流420解码的报头信息,解码器500可以使用帧内/帧间预测级508来创建与在编码器400例如在帧内/帧间预测级402中所创建的相同的预测块。在重构级510中,可以将预测块添加到导数残差以创建重构块。可以将环路滤波级512应用于重构块以减少块效应。可以将其它滤波应用于重构块。在示例中,将后滤波级514应用于重构块以减少块失真,并且将结果作为输出视频流516输出。输出视频流516也可以称为解码视频流,这些术语在本文中将可互换地使用。

解码器500的其它变型可以用于对压缩比特流420进行解码。例如,解码器500可以在没有后滤波级514的情况下产生输出视频流516。在解码器500的一些实施方式中,在环路滤波级512之前应用后滤波级514。另外,或者可替代地,编码器400除了环路滤波级416之外还包括去块滤波级。

在编码器400和解码器500中,可以通过根据变换类型对残差值进行变换来确定变换系数的块。变换类型可以是一个或多个一维变换类型,包括将恒等变换应用于列的一维水平变换类型,在本文中被称为tx_class_horiz,或将恒等变换应用于行的一维垂直变换类型,在本文中被称为tx_class_vert。在一维水平变换类型中,将恒等变换应用于列。类似地,在一维垂直变换类型中,将恒等变换应用于行。变换类型还可以是二维变换类型,在本文中被称为tx_class_2d。无论选择哪种变换类型,其都用于在编码期间将残差值变换成频域,且在解码期间从频域进行逆变换。如先前所描述的,可以对变换系数进行量化。

量化变换系数可以使用级别图进行表示,并且使用基于上下文的算术代码化方法进行编码或解码。这些代码化和操作例如在编码器400的熵编码级408和解码器500的熵解码级502中执行。基于上下文的算术代码化方法使用基于代码化上下文或仅基于上下文选择的概率模型来对值进行编码。代码化上下文包括在被代码化的值附近的空间区域内的值。考虑到在给定空间区域中通常存在代码化模式之间的高度相关性,基于代码化上下文来选择概率模型允许对概率进行更佳建模。当对来自块的变换值进行代码化时,基于模板来确定上下文。可以基于变换类型来选择模板。

在级别图代码化中,将变换块分解成多个级别图,使得级别图能够将对每个变换系数值的代码化分解(即,减少)成一系列二进制决策,这些二进制决策每个与幅度级别(即,图级别)对应。可以通过使用多次运行过程来完成分解。同样,根据等式,将变换块的变换系数分解成可以是级别二进制的一系列级别图和残差:

其中,

residue[r][c]=absolute(codfficient[r][c])-t-1;且

在以上等式中,coefficient[r][c]是在位置(行=r,列=c)处的变换块的变换系数,t是最大图级别,levelk是与图级别k对应的级别图,residual是系数残差图,且sign是变换系数的符号图。可以诸如由解码器使用相同等式从编码levelk图、残差图residue以及符号图sign来重新组合变换块的变换系数。将参考图6和图7进一步解释级别图编码。

图6是示出了根据本公开的实施方式的可以在对变换系数的块进行代码化时利用的扫描顺序的图。扫描顺序包括之字形扫描顺序601、水平扫描顺序602和垂直扫描顺序603。在所图示的示例中,块是4x4块,每个包括16个值。每个块具有四行,以从左至右的顺序标记为r0-r3,以及四列,以从上至下的顺序标记为c0-c3。每个块中的单独位置与单独变换系数对应,并且可以以[r,c]格式寻址,其中,r表示行数目,c表示列数目。之字形扫描顺序601、水平扫描顺序602和垂直扫描顺序603中的每一个从位置[0,0]开始,并且所示的数字根据扫描顺序指示在位置[0,0]之后访问/处理块中的位置的顺序。之字形扫描顺序601沿着以从左至右和从上至下的方式行进的对角线访问块中的位置。水平扫描顺序602在以从上至下的顺序行进至下一行之前沿着每一行从左至右行进。垂直扫描顺序603在以从左至右的顺序行进至下一列之前沿着每一列从上至下行进。

图7是图示了根据本公开的实施方式的使用级别图的变换系数代码化的级的图。图7示出了变换块704和表示该变换块的级别图,其包括块结束图706、非零图708、符号图710、级-1图712、2级图714以及系数残差或残差图716。

变换块704是可以从编码器的量化步骤诸如图4的编码器400的量化级406接收的变换系数的块的示例。变换块704包括零变换系数和非零变换系数。一些非零系数可以是负值。

块结束图706指示变换块704的块结束位置。块结束位置是在变换块704中不存在其它非零值的位置,如在以所使用的扫描顺序访问变换系数位置时确定的。因此,在块结束位置处及在其之后,来自变换块704的所有值均为零。在所图示的示例中,使用了之字形扫描顺序601,用零值指示除块结束位置以外的非零系数,并且用一(1)值指示块结束位置。在所图示的示例中,块结束位于由那个位置处的值一(1)指示的位置[2,2]处,其中,先前的非零值由值零指示。

非零图708是级别图,其针对变换块704中的每个位置指示对应变换系数是等于0还是为非零值。在所图示的示例中,非零图708包括在每个变换系数的具有零值且位于块结束位置之前的位置处的零,并且非零图708包括在变换块704中具有非零值的所有位置处的值一(1)。非零图708也可以被称为零级图。

符号图710针对变换块704的具有非零值的每个位置指示对应变换系数是正值还是负值。在所图示的示例中,值-1指示对应变换系数具有负值,而值一指示对应变换系数具有正值。可以利用其它符号,诸如,零和一。

非零图708、级-1图712、2级图714以及系数残差图716组合地定义了来自变换块704的变换系数的绝对值。在这些图中,非零图708、级-1图712、2级图仅使用二进制值指示来自变换块704的对应变换系数是否具有等于零、一或二或大于或等于三的绝对值。对于每个非零值,如由非零图708所指示,如果对应变换系数的绝对值等于一,那么级-1图712包括值零;如果变换系数的绝对值大于或等于1,那么级-1图712包括值1。对于在级-1图712中指示为大于或等于二的每个值,如果对应变换系数的绝对值等于二,那么2级图714包括值零,或者如果变换系数的绝对值大于或等于三,那么2级图714包括值一。

在一个可替代示例中,单个级别图可以通过如下方式替换非零图708、级-1图712和2级图:使用两位值针对来自变换块704的每个变换系数指示变换系数的绝对值是等于零、一或二还是大于或等于三。在另一可替代示例中,可以使用不同数目的级别图,在这种情况下,存在残差值的阈值将改变。

在所图示的示例中,系数残差图716包括来自变换块704的每个变换系数的残差。来自变换块704的每个变换系数的残差是变换系数的超过了级别图中的幅度的表示的幅度。在此示例中,将来自变换块704的每个变换系数的残差计算为来自变换块704的变换系数的绝对值减去三。

图8是根据本公开的实施方式的用于使用级别映射对编码的视频比特流中的变换块进行编码的过程800的流程图。过程800可以在编码器诸如编码器400中实施。编码视频比特流可以是图4的压缩比特流420。

可以例如将过程800实施为可以由计算装置诸如发送站102执行的软件程序。该软件程序可以包括机器可读指令,该机器可读指令可以存储在存储器诸如存储器204或辅助存储装置214中并且可以由处理器诸如cpu202执行以使计算装置执行过程800。在至少一些实施方式中,过程800可以全部或部分地由编码器400的熵编码级408执行。

可以使用专用硬件或固件来实施过程800。一些计算装置可以具有多个存储器、多个处理器、或两者皆有。可以使用不同的处理器、存储器或两者来分布过程800的步骤或操作。单数形式的术语“处理器”或“存储器”的使用涵盖具有一个处理器或一个存储器的计算装置以及具有多个处理器或多个存储器的装置,这些装置可用于执行一些或所有上述步骤。

过程800可以接收变换块诸如图7的变换块704。可以从编码器的量化步骤诸如图4的编码器400的量化级406接收变换块704作为输出。变换块704包括零变换系数和非零变换系数。一些非零系数可以是负值。

在操作801中,通过生成并且包括编码视频比特流中的指示块结束位置的值来对块结束位置(eob)进行编码。在过程800的实施方式中,操作802可以包括为变换块生成块结束图,如关于块结束图706所解释的。在eob处及在其之后,所有系数均为零。

在操作802中,对值bl[i]进行代码化以指示变换系数的幅度,其中,i指示扫描位置(i=0与左上角的位置对应,这通常被称为dc位置),并且bl[i]表示扫描位置i处的量化系数的幅度是0、1、2还是≥3。从块结束位置之前的位置(i=eob-1)到dc位置(i=0)以呈反向顺序的扫描顺序针对每个位置对值bl[i]进行编码(例如,0、1、2或3)。在一些实施方式中,在操作802中使用级别图诸如非零图708,级-1图712和2级图714来对值bl[i]进行编码。

在操作802中使用基于上下文的算术代码化方法将值bl[i]代码化到视频比特流中。基于上下文的算术代码化方法利用上下文模型,该上下文模型可以基于任意数目的先前编码的邻居的二进制值来确定,并且可以充分利用来自所有这些邻居的信息。先前编码的邻居可以是相同级别图或先前级别图诸如紧邻的先前级别图中的邻居。例如,级-1图712可以提供用于对2级图714进行编码的上下文信息。

在过程800的一些实施方式中,通过将块结束图706交织到非零图708中来组合操作801和操作802。

在操作803中,针对所有变换系数对被称为br[i]的残差值进行编码,这些变换系数具有幅度比由值bl[i]表示的幅度大的绝对值,在本示例中,这表示在不使用残差值的情况下具有绝对值0、1和2的量化变换系数。因此,在此示例中,对于每个量化变换系数,其绝对值的幅度大于二(例如,bl(i)=3),值br[i]表示在扫描位置i处的量化变换系数的幅度,并且等于扫描位置i的量化变换系数的幅度值减去三。

如同值bl[i],在操作803中使用基于上下文的算术代码化方法将残差值br[i]代码化到视频比特流中。基于上下文的算术代码化方法利用上下文模型,该上下文模型可以基于任意数目的先前代码化的邻居的二进制值来确定,并且可以充分利用来自所有这些邻居的信息。先前代码化的邻居可以是相同级别图或先前级别图诸如紧邻的先前级别图中的邻居。可以使用二进制代码化或多符号代码化在编码视频比特流中对残差值br[i]进行编码。可以使用拟合系数残差图的残差系数的统计的概率分布。概率分布可以是几何分布、拉普拉斯分布、帕累托分布或任何其它分布。

在操作804中,针对每个非零量化变换系数对指示量化变换系数的符号是正还是负的值进行代码化。该值可以被称为sign[i],其中,i表示扫描位置,sign[i]表示扫描位置i处的非零系数的符号。可以使用符号图710来执行操作804。可以使用基于上下文或基于非上下文的熵代码化技术来执行编码sign[i]。

在一些实施方式中,br(i)的可用值可以包括最大值。在示例中,当bl(i)等于3时,br(i)可以取从0到12的值中的任何一个。连同bl(i),这与扫描位置i处的量化变换系数的幅度l(i)的绝对值0至15对应。bl(i)的值12可以指示残差值大于或等于15。若适用(即,br(i)具有最大值且量化变换系数的幅度l(i)大于或等于15),那么在操作805中对量化变换系数的幅度减去15(l(i)-15)进行编码。可以使用二进制代码化或多符号代码化在编码视频比特流中对幅度进行编码。可以使用拟合系数残差图的残差系数的统计的概率分布。概率分布可以是几何分布、拉普拉斯分布、帕累托分布或任何其它分布。对所得的符号进行代码化可以不需要任何上下文推导。也就是说,符号可以不是上下文代码化的。

在一些实施例中,bl和br符号的代码化可以具有用于当前块的其自身的环路,随后是用于在相同块中对可应用符号和量化变换系数的幅度减去15进行代码化的另一环路。

可以使用代码化的值重构量化变换系数,以在操作805之后验证编码。

在过程800中,可以将空间相邻模板用于确定在基于上下文的算术代码化方法中使用的上下文模型。例如,在操作802中,通过使用锚定到与扫描位置i对应的块位置(r_i,c_i)的空间模板来推导用于对值bl[i]进行代码化的上下文,其中,r_i表示行索引,且c_i表示列索引。

图9a是示出了根据本公开的实施方式的可以在基于上下文的算术代码化方法中利用的第一空间相邻模板集合的图。水平模板901包括与要代码化的变换系数的位置(即,要编码或解码的变换系数,出于简洁起见,其可在本文中被称为要代码化的位置)在相同行中的多个上下文邻居以及与要代码化的位置在相同列中的一个上下文邻居。在所图示的示例中,水平模板901包括在要代码化的位置的右侧的四个上下文邻居以及在要代码化的位置的下方的一个上下文邻居。垂直模板902包括与要代码化的位置在相同行中的一个上下文邻居以及与要代码化的位置在相同列中的多个上下文邻居。在所图示的示例中,垂直模板902包括在要代码化的位置的右侧的一个上下文邻居以及在要代码化的位置的下方的四个上下文邻居。二维模板903包括锚定在要代码化的位置处的三角形图案中的上下文邻居。在所图示的示例中,二维模板903包括在要代码化的位置的右侧的两个上下文邻居、在要代码化的位置的下方的两个上下文邻居以及相对于要代码化的位置位于对角线右下方的一个上下文邻居。

可以使用图9a中图示的第一空间相邻模板集合来推导bl[i]的上下文。可以使用相同或不同的空间相邻模板集合来推导br[i]的上下文。图9b是示出了根据本公开的实施方式的可以在基于上下文的算术代码化方法中利用的第二空间相邻模板集合的图。例如,可以使用第二空间相邻模板集合来推导br[i]的上下文。

在第二空间相邻模板集合中,水平模板905包括与要代码化的位置在相同行中的多个上下文邻居以及与要代码化的位置在相同列中的一个上下文邻居。在所图示的示例中,水平模板905包括在要代码化的位置的右侧的两个上下文邻居和在要代码化的位置的下方的一个上下文邻居。垂直模板906包括与要代码化的位置在相同行中的一个上下文邻居以及与要代码化的位置在相同列中的多个上下文邻居。在所图示的示例中,垂直模板906包括在要代码化的位置的右侧的一个上下文邻居以及在要代码化的位置的下方的两个上下文邻居。二维模板907包括锚定在要代码化的位置处的三角形图案中的上下文邻居。在所图示的示例中,二维模板907包括在要代码化的位置的右侧的一个上下文邻居、在要代码化的位置的下方的一个上下文邻居以及相对于要代码化的位置位于对角线右下方的一个上下文邻居。

可以基于用于确定量化变换系数的变换类型来选择在特定编码操作中使用的空间相邻模板。例如,如果变换类型是一维水平变换(tx_class_horiz)类型,那么可以使用水平模板901和/或水平模板905。例如,如果变换类型是一维垂直变换类型(tx_class_vert),那么可以使用垂直模板902和/或垂直模板906。如果变换类型是二维变换类型(tx_class_2d),那么可以使用二维模板903和/或二维模板907。

在基于上下文的编码期间,在普通实施方式诸如通过表格查找获得所需值的实施方式中,获得要在所选择的模板中用作上下文邻居的值可能会变得成本高昂。也就是说,例如,存在三种变换类型类别,每种变换类型类别具有其自身的模板,直接的实施方式可能需要至少三个阵列来存储每个有效变换大小的邻域位置。在代码化器指定一定数目的扫描顺序的情况下,实际实施方式更加复杂。在这种情况下,可能需要基于块位置而非扫描位置来定义阵列,以避免依赖于扫描顺序。因此,表格查找可以产生性能问题,诸如,存储瓶颈。例如,当块大小较大时(例如,32x32变换块,其具有1024个位置),性能问题可能更常见。

根据本公开的实施方式,可以通过将所需信息存储在存储器寄存器阵列中或仅存储在寄存器阵列中来提高性能。为了允许出于此目的使用寄存器阵列,用于对变换系数进行代码化的扫描顺序诸如之字形扫描顺序601、水平扫描顺序602和垂直扫描顺序603共享的公共特性是按扫描顺序从左至右访问行中的系数并且从上至下访问列中的系数。换句话说,给定扫描顺序s,is[r,c]表示有效块位置[r,c]的扫描位置,其中,r表示变换块中的行索引,而c表示列索引。然后,对于任何r'>r,is[r,c]<is[r',c],且对于任何c'>c,is[r,c]<is[r,c']。因此,在级别图的代码化期间,当以反向扫描顺序进行代码化时,已经访问了用于对要代码化的当前值进行代码化所需的上下文邻居。

在本文中将描述的实施方式中,将上下文推导所需的信息存储在寄存器集合中,例如存储在包括两个或三个寄存器阵列的寄存器集合中,如最初在图10至图12的示例中所示出。图10是示出了与水平模板对应的寄存器集合的第一示例的图。图11是示出了与垂直模板对应的寄存器集合的第一示例的图。图12是示出了与二维模板对应的寄存器集合的第一示例的图。图10至图12的示例使用图9a的第一空间相邻模板集合来推导基本级别符号(即,bl[i])的上下文。

通过使用有限的存储器或寄存器阵列集合,不需要将变换块的所有位置的上下文信息保存在存储器中。寄存器阵列通过将位置的值保存在所使用的模板诸如在此示例中的水平模板901、垂直模板902和二维模板903中来实施基于模板的代码化。因此,寄存器阵列可以与所使用的模板的大小和形状对应,其中,每个寄存器值与模板中的特定空间位置(例如,上下文邻居)对应。因此,寄存器阵列内的值可以在本文中被称为上下文邻居值。在一些实施方式中,寄存器阵列至少包括具有第一大小(例如,用于存储第一数目的值)的第一寄存器阵列和具有与第一大小不同的第二大小(例如,用于存储第二数目的值)的第二寄存器阵列。

将寄存器集合中的寄存器阵列中的值初始地设置为默认值(例如,零)。每当位置[r,c]超出块边界时,都可以在该位置处使用默认值,诸如,0。一旦对值进行代码化(例如,对符号进行编码或解码),就使用被代码化的位置的值和/或从级别图获得的基本信息来更新寄存器阵列以用于对下一个值进行代码化。

对于tx_class_horiz中的大小为mxn的变换,寄存器集合中的寄存器阵列的数目等于行数目n。在该实施方式中,寄存器集合包括一个8位寄存器阵列和一个2位寄存器阵列,这些寄存器阵列在逐行基础上保存与水平模板901对应的值。寄存器集合用于对一行变换块中的特定值进行代码化。对于tx_class_vert中的大小为mxn的变换,寄存器集合中的寄存器阵列的数目等于列数目m。在该实施方式中,寄存器集合包括一个8位寄存器阵列和一个2位寄存器阵列,这些寄存器阵列在逐列基础上保存与垂直模板902对应的值。寄存器集合用于对一列变换块中的特定值进行代码化。对于tx_class_2d中的大小为mxn的变换,寄存器集合中的寄存器阵列的数目等于列数目m和行数目n中的较小者。在该实施方式中,寄存器集合包括两个4位寄存器阵列和一个2位寄存器阵列,这些寄存器阵列保存与二维模板903对应的值。因此,在逐列的基础或逐行的基础中任一者上(取决于变换的较小尺寸),将上下文邻居值存储在由二维模板903的形状定义的上下文邻居的寄存器集合中,并且寄存器集合用于对变换块的列或行中的特定值进行代码化。上文所描述的寄存器集合都使用2位精确度来存储值(例如,一个8位寄存器存储四个2位值,而一个2位寄存器存储一个2位值)。然而,应当理解,可以利用不同精确度的值。还应该理解,可以根据特定空间模板的几何形状来改变每个寄存器阵列中所保存的值的数目。

为了对使用tx_class_horiz和与水平模板901对应的上下文确定的变换块进行代码化,存在与行r=0至n-1对应的n个寄存器阵列。图10是示出了与水平模板901对应的寄存器集合的示例的图。每个寄存器集合包括两个寄存器阵列,包括第一寄存器阵列s0和第二寄存器阵列s1,其分别定义为:

s0[r,0]、s0[r,1]、s0[r,2]、s0[r,3]以及

s1[r,0]。

如图10所示,寄存器阵列s0存储相同行且在指示变换系数的幅度的被代码化的变换系数的一个或多个值的扫描位置i的右侧的值,并且寄存器阵列s1存储相同列且在指示变换系数的幅度的被代码化的变换系数的一个或多个值的扫描位置i的下方的一行中的单个值。在这些示例中,扫描位置i在此处和下文所讨论的图11至图15中标记为bl[i],这是因为其是正在代码化(即,编码或解码中任一者)的扫描位置i处的变换系数的值bl[i]。因此,扫描位置i可以在本文中被称为被代码化的值bl[i]的位置。

为了对使用tx_class_vert和与垂直模板902对应的上下文确定的变换块进行代码化,存在与列c=0至m-1对应的m个寄存器阵列。图11是示出了与垂直模板902对应的寄存器集合的示例的图。每个寄存器集合包括两个寄存器阵列,包括第一寄存器阵列s0和第二寄存器阵列s1,其分别定义为:

s0[c,0]、s0[c,1]、s0[c,2]、s0[c,3]以及

s1[c,0]。

如图11所示,寄存器阵列s0存储相同列且在被代码化的值bl[i]的位置的下方的值,并且寄存器阵列s1将单个值存储在相同行且在被代码化的值bl[i]的位置的右侧的一行中。

参考变换块具有比行n少的列m(即,m<n)的示例,为了对使用tx_class_2d以及使用与二维模板903对应的上下文确定的变换块进行代码化,存在与列c=0至m-1对应的m个寄存器阵列。图12是示出了与二维模板903对应的寄存器集合的示例的图。每个寄存器集合包括三个寄存器阵列,包括第一寄存器阵列s0、第二寄存器阵列s1和第三寄存器阵列s3,其分别定义为:

s0[c,0]、s0[c,1]、

s1[c,0]、s1[c,1]以及

s2[c,0]。

如图12所示,寄存器阵列s0存储与被代码化的值bl[i]的位置相同的列的值,寄存器阵列s1存储被代码化的值bl[i]的位置的右侧的一列的值,并且寄存器阵列s2存储位于被代码化的值bl[i]的位置的右侧的两列的单个值。在一些实施方式中,将每个寄存器集合组织成三个阵列,其中,第一阵列(对于s0)具有大小2(即,存储两个系数邻居值),第二阵列(对于s1)具有大小2(即,存储两个系数邻居值),并且第三阵列(对于s2)具有大小1(即,存储一个系数邻居值)。

在开始对变换块进行代码化时,根据用于确定变换块的变换系数的变换类型来定义寄存器集合,并且将寄存器集合中的所有值初始化为零。向要在扫描位置i处代码化的值bl[i]分配与由行r_i和列c_i表示的扫描位置i对应的块位置,其中bl[i]来自{0、1、2、3}。在编码时,从基本信息诸如级别图中获得值bl[i]。在解码时,输入是编码比特流的从中推导值bl[i]的部分。通过组合(例如,求和)来自寄存器阵列的值来确定用于对值bl[i]进行熵代码化的上下文,这些值根据与变换类型对应的模板来表示值bl[i]的空间上下文邻居。

如果在tx_class_horiz中变换类型为一,那么从以下内容中推导用于对值bl[i]进行代码化的上下文:

s0[r_i,0]+s0[r_i,1]+s0[r_i,2]+s0[r_i,3]+s1[r_i,0]。

在对值bl[i]进行代码化之后,寄存器阵列值更新如下:

s0[r_i,0]=bl[i],

s0[r_i,1]=s0[r_i,0],

s0[r_i,2]=s0[r_i,1],

s0[r_i,3]=s0[r_i,2],且

s1[r_i,0]=bl[is[r_i+1,c_i-1]]。

综上所述,更新寄存器阵列中的值以假定其紧邻的邻居的值,其在这种情况下是寄存器阵列中的每个值所代表的位置的最左端的位置的值。对于寄存器阵列s0,将第一值s0[r_1,0]更新为位置处的作为刚刚被代码化的bl[i]的值。寄存器阵列s0中的剩余值假定来自寄存器阵列中的先前值的值(即,将寄存器阵列中的值移位了一个位置)。对于寄存器阵列s1,使用从级别图获得的基本信息来更新唯一值,即,要针对位于刚刚被代码化的值bl[i]的位置的下方的一行以及左侧的一列的单元格代码化的值,其被标记为值bl[is[r_i+1,c_i-1]]。在更新之后,该寄存器集合准备好用于对相同行中的下一个值(即,正好位于刚刚被代码化的值bl[i]的位置的左侧的位置中的值)进行代码化。

如果在tx_class_vert中变换类型为一,那么从以下内容中推导用于对值bl[i]进行代码化的上下文:

s0[c_i,0]+s0[c_i,1]+s0[c_i,2]+s0[c_i,3]+s1[c_i,0]。

在对值bl[i]进行代码化之后,寄存器阵列更新如下:

s0[c_i,0]=bl[i],

s0[c_i,1]=s0[c_i,0],

s0[c_i,2]=s0[c_i,1],

s0[c_i,3]=s0[c_i,2],且

s1[c_i,0]=bl[is[r_i-1,c_i+1]]。

综上所述,更新寄存器阵列中的值以假定其紧邻的邻居的值,其在这种情况下是寄存器阵列中的每个值所代表的位置的正上方的位置的值。对于寄存器阵列s0,将第一值s0[c_i,0]更新为刚刚被代码化的值bl[i]。寄存器阵列s0中的剩余值假定来自寄存器阵列中的先前值的值(即,将寄存器阵列中的值移位了一个位置)。对于寄存器阵列s1,使用从级别图获得的基本信息来更新唯一值,即,要针对位于刚刚被代码化的值bl[i]的位置的上方的一行以及右侧的一列的单元格代码化的值,其是值bl[is[r_i-1,c_i+1]]。在更新之后,该寄存器集合准备好用于对相同列中的下一个值(即,位于刚刚被代码化的值bl[i]的位置的正上方的位置中的值)进行代码化。

如果在tx_class_2d中变换类型为1,继续其中变换块具有比行n少的列m(即,m<n)的示例,用以下公式推导用于对值bl[i]进行代码化的上下文:

s0[c_i,0]+s0[c_i,1]+s1[c_i,0]+s1[c_i,1]+s2[c_i,0]。

在对值bl[i]进行代码化之后,寄存器阵列更新如下:

s0[c_i,0]=bl[i],

s0[c_i,1]=s0[c_i,0],

s1[c_i,0]=bl[is[r_i-1,c_i+1]],

s1[c_i,1]=s1[c_i,0],且

s2[c_i,0]=bl[is[r_i-1,c_i+2]]。

综上所述,更新寄存器阵列中的值以假定其紧邻的邻居的值,其在这种情况下是寄存器阵列中的每个值所代表的位置的正上方的位置的值。对于寄存器阵列s0,将第一值s0[c_i,0]更新为刚刚被代码化的bl[i]的值,且寄存器阵列s0中的由s0[c_i,1]表示的第二值假定来自寄存器阵列中的先前值(即,寄存器阵列中的值移位了一个位置)的值,在此示例中,其是值s0[c_i,0]。对于第二寄存器阵列s1,使用从级别图获得的基本信息来更新第一值,即,要针对位于刚刚被代码化的值bl[i]的位置的上方的一行以及右侧的一列的单元格代码化的值,其是值bl[is[r_i-1,c_i+1]],并且第二值假定来自第二寄存器阵列s1[c_i,0]的第一值的值。对于第三寄存器阵列s2,使用从级别图获得的基本信息来更新唯一值,即,要针对位于刚刚被代码化的值bl[i]的位置的上方的一行以及右侧的两列的单元格代码化的值,其是值bl[is[r_i-1,c_i+2]]。在更新之后,该寄存器集合准备好用于对相同列中的下一个值(即,位于刚刚被代码化的值bl[i]的位置的正上方的位置中的值)进行代码化。在行数目少于列数目的示例中,相反,可以在逐行的基础上定义寄存器阵列,其中,使用每个寄存器集合来提供用于对行中的值进行代码化的上下文。

当基本范围符号(即,br[i])是上下文编码的时,可以与上文关于图10至图12所描述的用于基本级别符号的上下文相似的方式来推导上下文。可替代地,可以使用不同模板诸如图9b中所示的那些模板来推导上下文,并且寄存器阵列适合于上下文邻居的数目和位置。如同上文关于图10至图12所描述的寄存器集合,仅使用从寄存器集合获得的信息来更新第一寄存器值集合(例如,寄存器阵列),并且使用从例如级别图获得的基本信息来更新第二组寄存器值(例如,寄存器阵列)。该实施方式减少了对基本信息的依赖,这可以提高效率并且避免诸如存储瓶颈的性能问题,同时准确地对被代码化的每个值的上下文进行建模。

在图13至图15中示出了将上下文推导所需的信息存储在寄存器集合中的第二示例。图13是示出了与水平模板对应的寄存器集合的第二示例的图。图14是示出了与垂直模板对应的寄存器集合的第二示例的图。图15是示出了与二维模板对应的寄存器集合的第二示例的图。在图13至图15中,将图9a的第一模板集合用作示例。该实施方式避免了在对值bl[i]进行代码化之后访问除被代码化的值bl[i]之外的先前代码化的基本信息以更新寄存器阵列的情形。相反,不是通过寄存器阵列将其它值移位而获得的值是基于值bl[i]的。在访问基本信息的成本高昂的情况下,该实施方式可以是优选的。

对于tx_class_horiz中的大小为mxn的变换,可以定义一个8位寄存器阵列来保存每一行的四个2位值,并且可以定义一个2位寄存器阵列来保存每一列的一个2位值,从而保存在空间上与水平模板901对应的值,其中,在逐行的基础上存储被代码化的值的右侧的值,并且在逐列的基础上存储被代码化的值的下方的值。对于tx_class_vert中的大小为mxn的变换,可以定义一个8位寄存器阵列来保存每一列的四个2位值,并且可以定义一个2位寄存器阵列来保存每一行的一个2位值,其中,这些寄存器阵列保存在空间上与垂直模板902对应的值,其中,在逐列的基础上存储被代码化的值的下方的值,并且在逐行的基础上存储被代码化的值的右侧的值。对于tx_class_2d中的大小为mxn的变换,可以定义一个4位寄存器阵列来保存每一行的两个2位值,可以定义一个4位寄存器阵列来保存每一列的两个2位值,并且可以定义一个2位寄存器阵列来保存每个对角线的一个2位值,从而保存在空间上与二维模板903对应的值,其中,在逐行的基础上存储被代码化的值的右侧的值,在逐列的基础上存储被代码化的值的下方的值,在逐对角线的基础上存储被代码化的值的对角线下方以及右侧的值。前述示例利用对于每个值具有2位精确度的寄存器。然而,应当理解,可以利用不同精确度的值。还应该理解,可以根据特定空间模板的几何形状来改变每个寄存器中所保存的值的数目。

为了使用与水平模板901对应的上下文来对使用tx_class_horiz确定的大小为mxn的变换块进行代码化,为每一行(即,针对r=0、1,…,n-1)定义第一寄存器阵列s0,并且为每一列(即,针对c=0、1、......、m-1)定义第二寄存器阵列s1。将第一寄存器阵列s0和第二寄存器阵列s1分别定义为:

针对r=0、1,…,n-1,s0[r,0]、s0[r,1]、s0[r,2]、s0[r,3],且

针对c=0、1,…,m-1,s1[c,0]。

如图13所示,寄存器阵列s0包括相同行且在被代码化的值bl[i]的位置的右侧的值,并且寄存器阵列s1包括相同列且在被代码化的值bl[i]的位置的下方的一行中的单个值。

为了对使用tx_class_vert以及与垂直模板902对应的上下文确定的大小为mxn的变换块进行代码化,为每一列(即,针对c=0、1,…,m-1)定义第一寄存器阵列s0,并且为每一行(即,针对r=0、1、......、n-1)定义第二寄存器阵列s1。将第一寄存器阵列s0和第二寄存器阵列s1分别定义为:

针对c=0、1,…,m-1,s0[c,0]、s0[c,1]、s0[c,2]、s0[c,3],且

针对r=0、1,…,n-1,s1[r,0]。

如图14所示,寄存器阵列s0包括相同列且在被代码化的值bl[i]的位置的下方的值,并且寄存器阵列s1包括相同行且在被代码化的值bl[i]的位置的右侧的一列中的单个值。

为了对使用tx_class_2d以及与二维模板903对应的上下文确定的大小为mxn的变换块进行代码化,为每一列(即,针对c=0、1,…,m-1)定义第一寄存器阵列s0,为每一行(即,针对r=0、1、......、n-1)定义第二寄存器阵列s1,并且为每一对角线定义第三寄存器阵列s2。将第一寄存器阵列s0、第二寄存器阵列s1和第三寄存器阵列s2分别定义为:

针对c=0、1,…,m-1,s0[c,0]、s0[c,1]

针对r=0、1、...…、n-1,s1[r,0]、s1[r,1]且

针对d=0、1,…,m+n-2,s2[d,0]。

在第三寄存器阵列s2的前述定义中,d是对角线的索引,并且可以基于行索引[r]和列索引[c]确定如下:

若(r=c),则d=0,且

若(r≠c),则d=2*abs(r-c)+(r<c)。

在定义索引d时,代码(r<c)在r<c为假时评估为零,且在r<c为真时评估为一。注意,(r-c)到{0、1,…,m+n-2}的任何双射映射都可以用于定义索引d。在允许使用负索引的情况下,可以将r-c或c-r直接用作索引d的定义。如图15所示,第一寄存器阵列s0包括相同列且在被代码化的值bl[i]的位置的下方的值,第二寄存器阵列s1包括相同行且在被代码化的值bl[i]的位置的右侧的值,并且第三寄存器阵列s2包括位于被代码化的值bl[i]的位置的对角线下方以及右侧的单个值。

在开始对变换块进行代码化时,根据用于确定变换块的变换系数的变换类型来定义寄存器集合,并且将寄存器阵列中的所有值初始化为零。被代码化的值bl[i]用于扫描位置i,其中,值bl[i]是来自{0、1、2、3}的整数。如同先前的示例一样,与扫描位置i对应的块位置由行r_i和列c_i表示。在编码时,从基本信息诸如级别图中获得值bl[i]。在解码时,使用上下文从编码比特流的一部分中推导值bl[i]。通过对来自寄存器阵列的值进行求和来确定用于对值bl[i]进行代码化的上下文,这些值根据与变换类型对应的模板来表示值bl[i]的空间上下文邻居。

参考图13,如果在tx_class_horiz中变换类型为一,那么从以下内容中推导用于对值bl[i]进行代码化的上下文:

s0[r_i,0]+s0[r_i,1]+s0[r_i,2]+s0[r_i,3]+s1[c_i,0]。

在对值bl[i]进行代码化之后,寄存器阵列更新如下:

s0[r_i,0]=bl[i],

s0[r_i,1]=s0[r_i,0],

s0[r_i,2]=s0[r_i,1],

s0[r_i,3]=s0[r_i,2],且

s1[c_i,0]=bl[i]。

对于寄存器阵列s0,将第一值s0[r_i,0]更新为刚刚被代码化的值bl[i]。寄存器阵列s0中的剩余值假定来自寄存器阵列中的先前值的值(即,将寄存器阵列中的值移位了一个位置)。对于寄存器阵列s1,将唯一值更新为刚刚被代码化的值bl[i]。

参考图14,如果在tx_class_vert中变换类型为一,那么从以下内容中推导用于对值bl[i]进行代码化的上下文:

s0[c_i,0]+s0[c_i,1]+s0[c_i,2]+s0[c_i,3]+s1[r_i,0]。

在对值bl[i]进行代码化之后,寄存器阵列更新如下:

s0[c_i,0]=bl[i],

s0[c_i,1]=s0[c_i,0],

s0[c_i,2]=s0[c_i,1],

s0[c_i,3]=s0[c_i,2],且

s1[r_i,0]=bl[i]。

对于寄存器阵列s0,将第一值s0[c_i,0]更新为刚刚被代码化的值bl[i]。寄存器阵列s0中的剩余值假定来自寄存器阵列中的先前值的值(即,将寄存器阵列中的值移位了一个位置)。换言之,通过移出最旧的值并且将值bl[i]添加为最新条目来以先进先出(fifo)方式更新寄存器阵列s0。对于寄存器阵列s1,将唯一值更新为刚刚被代码化的值bl[i]。

如果在tx_class_2d中变换类型为一,那么从以下内容中推导用于对值bl[i]进行代码化的上下文:

s0[c_i,0]+s0[c_i,1]+s1[r_i,0]+s1[r_i,1]+s2[d_i,0]。

在对值bl[i]进行代码化之后,寄存器阵列更新如下:

s0[c_i,0]=bl[i],

s0[c_i,1]=s0[c_i,0],

s1[r_i,0]=bl[i],

s1[r_i,1]=s1[r_i,0],且

s2[d_i,0]=bl[i],其中,

若(r_i==c_i),则d_i=0,且

若(r_i!=c_i),则d_i=2*abs(r_i-c_i)+(r_i<c_i)。

在定义索引d时,代码(r_i<c_i)在r_i<c_i为假时评估为零,且在r_i<c_i为真时评估为一。

对于第一寄存器阵列s0,将第一值s0[c_i,0]更新为刚刚被代码化的值bl[i],并且将第二值s0[c_i,1]更新为寄存器阵列中的第一值的先前值(即,该值已移位)。对于第二寄存器阵列s1,将第一值s1[r_i,0]更新为刚刚被代码化的值bl[i],并且将第二值s1[r_i,1]更新为寄存器阵列中的第一值的先前值(即,该值已移位)。对于寄存器阵列s2,将唯一值更新为刚刚被代码化的bl的值bl[i]。

在图16至图18中示出了将上下文推导所需的信息存储在寄存器集合中的第三示例。图16是示出了与水平模板对应的寄存器集合的第三示例的图。图17是示出了与垂直模板对应的寄存器集合的第三示例的图。图18是示出了与二维模板对应的寄存器集合的第三示例的图。图16至图18的示例使用图9b的第二空间相邻模板集合来推导范围级别符号(即,bl[i])的上下文。该实施方式避免了如下情形:在对值br[i]进行代码化之后访问除被代码化的值br[i]之外的先前代码化的基本信息以更新寄存器集合。相反,不是通过寄存器阵列将其它值移位而获得的值是基于值br[i]的。在访问基本信息的成本高昂的情况下,该实施方式可以是优选的。

对于tx_class_horiz中的大小为mxn的变换,可以定义一个8位寄存器阵列来保存每一行的两个4位值,并且可以定义一个4位寄存器阵列来保存每一列的一个4位值,从而保存在空间上与水平模板905对应的值,其中,在逐行的基础上存储被代码化的值的右侧的值,并且在逐列的基础上存储被代码化的值的下方的值。对于tx_class_vert中的大小为mxn的变换,可以定义一个8位寄存器阵列来保存每一列的四个4位值,并且可以定义一个4位寄存器阵列来保存每一行的一个4位值,其中,这些寄存器阵列保存在空间上与垂直模板906对应的值,其中,在逐列的基础上存储被代码化的值的下方的值,并且在逐行的基础上存储被代码化的值的右侧的值。对于tx_class_2d中的大小为mxn的变换,可以定义一个4位寄存器阵列来保存每一行的一个4位值,可以定义一个4位寄存器阵列来保存每一列的一个4位值,并且可以定义一个4位寄存器阵列来保存每个对角线的一个4位值,从而保存在空间上与二维模板907对应的值,其中,在逐行的基础上存储被代码化的值的右侧的值,在逐列的基础上存储被代码化的值的下方的值,在逐对角线的基础上存储被代码化的值的对角线下方以及右侧的值。前述示例利用对于每个值具有4位精确度的寄存器阵列。然而,应当理解,可以利用不同精确度的值。还应该理解,可以根据特定空间模板的几何形状来改变每个寄存器阵列中所保存的值的数目。

为了对使用tx_class_horiz以及与水平模板905对应的上下文确定的大小为mxn的变换块进行代码化,为每一行(即,针对r=0、1,…,n-1)定义第一寄存器阵列s0,并且为每一列(即,针对c=0、1、......、m-1)定义第二寄存器阵列s1。将第一寄存器阵列s0和第二寄存器阵列s1分别定义为:

针对r=0、1、...…、n-1,s0[r,0]、s0[r,1],且

针对c=0、1,…,m-1,s1[c,0]。

如图16所示,寄存器阵列s0包括相同行且在指示变换系数的幅度的被代码化的变换系数的一个或多个值的扫描位置i的右侧的值,并且寄存器阵列s1包括相同列且在指示变换系数的幅度的被代码化的变换系数的一个或多个值的扫描位置i的下方的一行中的单个值。在这些示例中,扫描位置i在此处以及在图17和图18中标记为br[i],这是因为其是正在代码化(即,编码或解码中任一者)的扫描位置i处的变换系数的值br[i]。因此,扫描位置i可以在本文中被称为被代码化的值br[i]的位置。

为了对使用tx_class_vert以及与垂直模板906对应的上下文确定的大小为mxn的变换块进行代码化,为每一列(即,针对c=0、1,…,m-1)定义第一寄存器阵列s0,并且为每一行(即,针对r=0、1、......、n-1)定义第二寄存器阵列s1。将第一寄存器阵列s0和第二寄存器阵列s1分别定义为:

针对c=0、1,…,m-1,s0[c,0]、s0[c,1],且

针对r=0、1,…,n-1,s1[r,0]。

如图17所示,寄存器阵列s0包括相同列且在被代码化的值br[i]的位置的下方的值,并且寄存器阵列s1包括相同行且在被代码化的值br[i]的位置的右侧的一列中的单个值。

为了对使用tx_class_2d以及与二维模板907对应的上下文确定的大小为mxn的变换块进行代码化,为每一列(即,针对c=0、1,…,m-1)定义第一寄存器阵列s0,为每一行(即,针对r=0、1、......、n-1)定义第二寄存器阵列s1,并且为每一对角线定义第三寄存器阵列s2。将第一寄存器阵列s0、第二寄存器阵列s1和第三寄存器阵列s2分别定义为:

针对c=0、1,…,m-1,s0[c,0]

针对r=0、1,…,n-1,s1[r,0],且

针对d=0、1,…,m+n-2,s2[d,0]。

在第三寄存器阵列s2的前述定义中,d是对角线的索引,并且可以基于行索引[r]和列索引[c]确定如下:

若r等于c,则d=0,且

若r不等于c,d=2*abs(r-c)+(r<c)。

在定义索引d时,代码(r<c)在r<c为假时评估为零,且在r<c为真时评估为一。注意,(r-c)到{0、1,…,m+n-2}的任何双射映射都可以用于定义索引d。在允许使用负索引的情况下,可以将r-c或c-r直接用作索引d的定义。

如图18所示,第一寄存器阵列s0包括相同列且在被代码化的值br[i]的位置的下方的值,第二寄存器阵列s1包括相同行且在被代码化的值br[i]的位置的右侧的值,并且第三寄存器阵列s2包括位于被代码化的值br[i]的位置的对角线下方以及右侧的单个值。

在开始对变换块进行代码化时,根据用于确定变换块的变换系数的变换类型来定义寄存器集合。与上文关于图10至图15的描述类似,将针对被编码或解码的当前块的寄存器集合的寄存器阵列中的值初始化设置为默认值(例如,零)。扫描位置i处的变换系数的值br[i]是来自{0、1、2、…...12}的值。与扫描位置i对应的块位置由行r_i和列c_i表示。在编码时,从基本信息诸如级别图中获得被代码化的值br[i]。在解码时,使用熵代码化从编码比特流中推导被代码化的值br[i]。通过对来自寄存器阵列的值进行求和来确定用于对值br[i]进行代码化的上下文,这些值根据与变换类型对应的模板来表示值br[i]的位置的空间上下文邻居。

参考图16,如果在tx_class_horiz中变换类型为一,那么从以下内容中推导用于对值bl[i]进行代码化的上下文:

s0[r_i,0]+s0[r_i,1]+s1[c_i,0]。

在对值br[i]进行代码化之后,寄存器阵列更新如下:

s0[r_i,0]=br[i],

s0[r_i,1]=s0[r_i,0],且

s1[c_i,0]=br[i]。

对于寄存器阵列s0,将第一值s0[r_i,0]更新为刚刚被代码化的值br[i]。寄存器阵列s0中的剩余值假定来自寄存器阵列中的先前值的值(即,将寄存器阵列中的值移位了一个位置)。对于寄存器阵列s1,将唯一值更新为刚刚被代码化的值br[i]。

参考图17,如果在tx_class_vert中变换类型为一,那么从以下内容中推导用于对值br[i]进行代码化的上下文:

s0[c_i,0]+s0[c_i,1]+s1[r_i,0]。

在对值br[i]进行代码化之后,寄存器阵列更新如下:

s0[c_i,0]=br[i],

s0[c_i,1]=s0[c_i,0],且

s1[r_i,0]=br[i]。

对于寄存器阵列s0,将第一值s0[c_i,0]更新为刚刚被代码化的值br[i]。寄存器阵列s0中的剩余值假定来自寄存器阵列中的先前值的值(即,将寄存器阵列中的值移位了一个位置)。换言之,通过移出最旧的值并且将值br[i]添加为最新条目来以先进先出(fifo)方式更新寄存器阵列s0。对于寄存器阵列s1,将唯一值更新为刚刚被代码化的值br[i]。

如果在tx_class_2d中变换类型为一,那么从以下内容中推导用于对值br[i]进行代码化的上下文:

s0[c_i,0]+s1[r_i,0]+s2[d_i,0]。

在对值br[i]进行代码化之后,寄存器阵列更新如下:

s0[c_i,0]=br[i],

s1[r_i,0]=br[i],且

s2[d_i,0]=br[i],其中,

若(r_i==c_i),则d_i=0,且

若(r_i!=c_i),则d_i=2*abs(r_i-c_i)+(r_i<c_i)。

在定义索引d时,代码(r_i<c_i)在r_i<c_i为假时评估为零,且在r_i<c_i为真时评估为一。

对于第一寄存器阵列s0,将唯一值s0[c_i,0]更新为刚刚被代码化的值br[i]。对于第二寄存器阵列s1,将唯一值s1[r_i,0]更新为刚刚被代码化的值br[i]。对于寄存器阵列s2,将唯一值更新为刚刚被代码化的值br[i]。

如先前所提及,关于图13至图18描述的实施方式避免了访问除被代码化的值bl[i]或br[i]之外的先前代码化的基本信息,以在代码化之后更新移位寄存器。与图10至图12的实施方式相比,这消除了对基本信息的潜在成本高昂的访问。为了进一步减少处理,适合于所有变换大小和类似地不依赖于级别图的扫描顺序的单个寄存器集合是所需变化。

根据此另一实施方式,可以选择用于确定量化变换系数的上下文邻居的一个或多个空间模板。选择一个或多个空间模板可以包括:确定可用于在正在被代码化的变换块中生成量化变换系数的(多种)变换类型。也就是说,变换类型指示什么空间模板可以用于选择上下文邻居以代码化表示变换系数的幅度的一个或多个值,此处为值bl(i)以及可选地值br(i)。根据本文中所描述的示例,变换类型可以是一维水平变换类型,诸如来自tx_class_horiz的一维水平变换类型;一维垂直变换类型,诸如来自tx_class_vert的一维垂直变换类型;以及二维变换类型,诸如来自tx_class_2d的二维变换类型。可以在该示例中使用图9a和图9b的空间模板。

一个或多个空间模板可以用于定义寄存器阵列。在图9a和图9b的空间模板可用于被代码化的变换块的示例中,定义了5个寄存器阵列的寄存器集合,以推导基本级别符号(即,bl[i])和基本范围符号(即,br[i])的上下文。定义寄存器集合包括确定形成寄存器集合的寄存器阵列的数目和大小。可以基于空间模板的大小和形状以及变换块的最大预期大小mxn来定义寄存器阵列的数目和大小。通常,阵列的基数(即,数目)可以等于在空间模板中定义的上下文邻居的数目。寄存器阵列的基数可以包括一加上一个或多个空间模板的行或列中的上下文邻居的最大数目。在所图示的示例中,沿着垂直维度或水平维度的上下文邻居的最大数目是4,并且模板903、907包括对角线上下文。因此,寄存器集合包括5个寄存器阵列。

变换块的最大预期大小mxn可以用于定义寄存器阵列的大小。例如,最大预期大小的最大尺寸可以用作4个寄存器阵列(其中,4是空间模板的最大垂直维度或水平维度)的元素数目(即,上下文邻居值)。在最大预期大小(也被称为最大变换大小)为32x32的示例中,5个寄存器阵列中的4个分别具有32个元素。第五最终阵列的元素数目(即,上下文邻居值)是基于最大变换大小的对角元素的预期数目的。在此示例中,根据r-c+31,剩余阵列具有在范围{0、1,…,62}内的63个元素,其中,r包括在范围(0、1,…,31)内被代码化的值bl或br的行位置,并且c包括要在范围(0、1、......、31)内代码化的值bl或br的列位置。在一些情况下(例如,在与硬件实施方式相反的软件实施方式中),剩余阵列可以具有64个元素(更一般地,2个元素的倍数),而非63个元素。更一般地,寄存器阵列中的单个寄存器阵列具有足以存储与最大可用变换大小的对角线中的值的数目对应的存储的值的数目(即,基数)的大小,并且寄存器阵列中的剩余寄存器阵列具有足以存储与最大可用变换大小的最大尺寸对应的存储的值的数目的阵列大小。

在一个示例硬件实施方式中,五个寄存器阵列定义如下:

uai4reg32_0[32],

uai4reg32_1[32],

uai4reg32_2[32],

uai4reg32_3[32],且

uai4reg64[63]。

在前述内容中,uai4指示无符号的4位整数类型。在软件实施方式中,可以用无符号的char或无符号的8位整数类型替换uai4。也就是说,寄存器阵列中的每个元素的大小被设定为支持至少一个值,其中,该值是要代码化的最大预期值。在本文中的示例中,值bl的最大预期值为3,并且值br的最大预期值为12。因此,可以使用4位寄存器阵列元素来存储一个值,并且可以使用8位寄存器阵列元素来存储两个值。

如同本文中所描述的其它实施方式一样,在开始对变换单元(或块)进行代码化时,将寄存器阵列初始化为默认值,期望地为0。推导或确定用于对变换系数的一个或多个值进行代码化的代码化上下文,这些值指示在扫描位置i处的变换系数的幅度,其中,(r_i,c_i)表示与遵循给定扫描顺序的扫描位置i对应的块位置,可以使用定义的寄存器集合来实现。也就是说,可以使用来自寄存器集合的寄存器阵列的所存储的值中的至少一个来确定代码化上下文。

在此示例中,寄存器集合的寄存器阵列可以用于计算两个幅度值mag和br_mag,这两个值又分别用于推导值bl[i]和值br[i]的代码化上下文。可以基于被代码化的变换块的变换类型来确定幅度值mag和br_mag。

如果在tx_class_horiz中变换类型为一,可以根据以下伪代码来确定幅度值:

mag=min(reg32_0[r_i],uai4(3))+min(reg32_1[r_i],uai4(3))+min(reg32_2[r_i],uai4(3))+min(reg32_3[r_i],uai4(3))+min(reg64[c_i],uai4(3));且

br_mag=reg32_0[r_i]+reg32_1[r_i]+reg64[c_i];

mag=min((mag+1)>>1,4);

br_mag=min((br_mag+1)>>1,6)。

函数reg32_0[r_i]返回与行r_i对应的阵列位置处的第一寄存器阵列reg32_0中的值,函数reg32_1[r_i]返回与行值r_i对应的阵列位置处第二寄存器阵列reg32_1中的值,函数reg32_2[r_i]返回与行值r_i对应的阵列位置处的第三寄存器阵列reg32_2中的值,并且函数reg32_3[r_i]返回与行值r_i对应的阵列位置处的第四寄存器阵列reg32_3中的值。类似地,函数reg64[c_i]返回与列值c_i对应的阵列位置处的第五寄存器阵列reg64中的值。例如,如果扫描位置i在块位置(4,0)处,那么第一寄存器阵列reg32_0、第二寄存器阵列reg32_1、第三寄存器阵列reg32_2以及第四寄存器阵列reg32_3中的每一个中的阵列位置4处的值分别由函数reg32_0[r_i]、函数reg32_1[r_i]、函数reg32_2[r_i]以及函数reg32_3[r_i]返回。类似地,函数reg64[c_i]返回第五寄存器阵列reg64中的阵列位置0处的值。

函数uai4(3)返回4个位即0011中的3个的二进制值。使用值3,这是因为其是bl的最高值,且因此,其是bl(i)的上下文邻居的最高值。在可替代实施方式中,该值可以是不同的。函数min(a,b)返回a与b之间的较小值。函数运算符“>>”将值右移指定的位数(此处为1位)。计算mag=min((mag+1)>>1,4)和br_mag=min((br_mag+1)>>1,6)归一化不同变换类型的幅度值。

使用与如上所述相同的示例且紧接在初始化(例如,使得阵列中的所有值均为0)之后,幅度值mag计算如下:

mag=min(0,0011)+min(0,0011)+min(0,0011)+min(0,0011)+min(0,0011)=0;

mag=min((0+1)>>1,4);

mag=min(0,4);且

mag=0;且

幅度值br_mag计算如下:

br_mag=0+0+0=0;

br_mag=min((0+1)>>1,6);

br_mag=min(0,6);且

br_mag=0。

如果在tx_class_vert中变换类型为一,可以根据以下伪代码来确定幅度值:

mag=min(reg32_0[c_i],uai4(3))+min(reg32_1[c_i],uai4(3))+min(reg32_2[c_i],uai4(3))+min(reg32_3[c_i],uai4(3))+min(reg64[r_i],uai4(3));

br_mag=reg32_0[c_i]+reg32_1[c_i]+reg64[r_i];

mag=min((mag+1)>>1,4);

br_mag=min((br_mag+1)>>1,6)。

函数reg32_0[c_i]返回与列值c_i对应的阵列位置处的第一寄存器阵列reg32_0中的值,函数reg32_1[c_i]返回与列值c_i对应的阵列位置处第二寄存器阵列reg32_1中的值,函数reg32_2[c_i]返回与列值c_i对应的阵列位置处的第三寄存器阵列reg32_2中的值,并且函数reg32_3[c_i]返回与列值c_i对应的阵列位置处的第四寄存器阵列reg32_3中的值。类似地,函数reg64[r_i]返回与行值r_i对应的阵列位置处的第五寄存器阵列reg64中的值。例如,如果扫描位置i在块位置(6,2)处,那么第一寄存器阵列reg32_0、第二寄存器阵列reg32_1、第三寄存器阵列reg32_2以及第四寄存器阵列reg32_3中的每一个中的阵列位置6处的值(例如,第七值)分别由函数reg32_0[c_i]、函数reg32_1[c_i]、函数reg32_2[c_i]以及函数reg32_3[c_i]返回。类似地,函数reg64[r_i]返回第五寄存器阵列reg64中的阵列位置2(例如,第三值)处的值。

使用被代码化的值bl[i]和br[i]的块位置是(6,2)的示例,并且假定reg32_0[c_i]=reg32_0[2]=4和reg32_1[c_i]=reg32_1[2]=4处的值,并且剩余阵列位置处的值具有值0,幅度值mag计算如下:

mag=min(0100,0011)+min(0100,0011)+min(0,0011)+min(0,0011)+min(0,0011);

mag=0011+0011+0+0+0=0110;

mag=min((0110+1)>>1,4);

mag=min(0111>>1,4);

mag=min(0011,4);且

mag=0011=3;且

幅度值br_mag计算如下:

br_mag=0100+0100+0=1000;

br_mag=min((1000+1)>>1,6);

br_mag=min((1001)>>1,6);

br_mag=min(0100,6);且

br_mag=0100=4。

如果在tx_class_2d中变换类型为一,可以根据以下伪代码来确定幅度值:

mag=min(reg32_0[c_i],uai4(3))+min(reg32_1[c_i],uai4(3))+min(reg32_2[r_i],uai4(3))+min(reg32_3[r_i],uai4(3))+min(reg64[diag],uai4(3));

br_mag=reg32_0[c_i]+reg32_2[r_i]+reg64[diag];

mag=min((mag+1)>>1,4);

br_mag=min((br_mag+1)>>1,6)。

在前述内容中,diag=r_i–c_i+31,且为第五寄存器阵列reg64的索引。因此,函数reg64[diag]返回与索引值diag对应的阵列位置处的第五寄存器阵列中的值。与在tx_class_horiz或tx_class_vert中变换类型为一的情况下的计算类似地执行计算。

综上所述,使用所述存储的值的至少一些来确定代码化上下文包括:基于用于变换块的变换类型,使用扫描位置的列和/或行来确定每个寄存器阵列的相应索引。然后,使用每个寄存器阵列的相应索引来选择来自每个寄存器阵列的用于确定代码化上下文的存储值。对来自每个寄存器阵列的选择的所存储的值进行求和以生成第一幅度值(例如,mag),同时在求和时将每个选择的所存储的值限制到第一最大值(例如,3)。然后,归一化第一幅度值。类似地,对来自少于每个寄存器阵列的所存储的值进行求和以生成第二幅度值(例如,br_mag)。然后,归一化第二幅度值。随后且如下所述,可以使用所归一化的第一幅度值来确定用于对变换系数(例如,bl[i])的第一值进行熵代码化的第一代码化上下文,该第一值指示变换系数的不大于第一最大值(例如,3)的幅度;并且使用所归一化的第二幅度值来确定用于对变换系数的第二值(例如,br[i])进行熵代码化的第二代码化上下文,该第二值指示变化系数的多达第二最大值(例如,12)的幅度。

一旦获得幅度值mag,就同样可以基于变换类型来确定用于对值bl[i]进行代码化的上下文偏移ctx_offset。如果在tx_class_2d中变换类型为一,那么以下伪代码可用于确定ctx_offset:

if(r_i==0&&c_i==0)ctx_offset=0;

elseif(w<h&&r_i<2)ctx_offset=11+mag;

elseif(w>h&&c_i<2)ctx_offset=16+mag;

elseif(r_i+c_i<2)ctx_offset=mag+1;

elseif(r_i+c_i<4)ctx_offset=5+mag+1;

elsectx_offset=21+mag。

在本文中,w是被代码化的变换块的宽度,h是被代码化的变换块的高度,==是布尔运算符,使得当a=b时,(a==b)评估为真,否则评估为假,且&&是布尔运算符,使得当a和b为真时,(a&&b)评估为真,而当a或b为假时,(a&&b)评估为假。因此,ctx_offset的值基于r_i和c_i的值。ctx_offset的值基于被代码化的变换块的宽度和高度。如果r_i和c_i都等于0,那么ctx_offset等于零。如果r_i或c_i或两者都不等于0,那么按顺序考虑剩余条件。一旦响应于条件确定了ctx_offset的值,那么条件的进一步处理结束。例如,如果w小于h,但r_i不小于2,那么考虑下一个条件(即,(w>h&&c_i<2)是否评估为真)。另一方面,如果w小于h,并且r_i小于2,那么ctx_offset等于11+mag。不考虑下一个条件(即,(w>h&&c_i<2)是否评估为真),也不考虑后续条件。

如果在tx_class_vert中变换类型为一,那么以下伪代码可用于确定ctx_offset:

if(r_i==0)ctx_offset=26+mag;

elseif(r_i<2)ctx_offset=26+5+mag;

elsectx_offset=26+10+mag。

如果在tx_class_horiz中变换类型为一,那么以下伪代码可用于确定ctx_offset:

if(c_i==0)ctx_offset=26+mag;

elseif(c_i<2)ctx_offset=26+5+mag;

elsectx_offset=26+10+mag。

一旦获得幅度值br_mag,即可确定用于对br[i]进行代码化的上下文偏移br_ctx_offset。如果r_i和c_i都等于零,那么将上下文系数br_ctx_offset设置为等于幅度值br_mag。否则,上下文系数br_ctx_offset是基于变换类型的。如果在tx_class_2d中变换类型为一,那么在r_i和c_i都小于2的情况下,将上下文系数br_ctx_offset设置为br_mag+7。否则,将上下文系数br_ctx_offset设置为br_mag+14。如果在tx_class_horiz中变换类型为一,那么在c_i等于0的情况下,将上下文系数br_ctx_offset设置为br_mag+7。否则,将上下文参数br_ctx_offset设置为br_mag+14。最后,如果在tx_class_vert中变换类型为一,那么在r_i等于0的情况下,将上下文系数br_ctx_offset设置为br_mag+7。否则,将上下文系数br_ctx_offset设置为br_mag+14。

使用上下文偏移ctx_offset以及其它信息比如变换大小以及变换块是亮度块还是色度块来确定值bl[i]的上下文。如常规的,上下文指定在算术代码化中使用的概率分布。在值bl[i]的情况下,概率分布是4元组。在编码器侧,算术编码通过使用由上下文给出的概率分布将值bl[i]代码化为二进制码字。在解码器侧,算术解码从二进制码字和概率分布中对值bl[i]进行解码。上下文偏移br_ctx_offset类似地用于确定值br[i]的上下文。

在对值bl[i]和br[i]进行代码化之后,如果i>0,那么更新寄存器阵列以准备在扫描位置i-1处进行上下文推导。在下文中,如果bl[i]<3,那么级别=bl[i],且如果bl[i]=3,那么级别=3+br[i]。根据变换块的变换类型,可以如以下伪代码所示的一样更新寄存器阵列:

在tx_class_horiz中变换类型为一的情况下:

reg32_3[r_i]=reg32_2[r_i];

reg32_2[r_i]=reg32_1[r_i];

reg32_1[r_i]=reg32_0[r_i];

reg32_0[r_i]=级别;

reg64[c_i]=级别;

在tx_class_vert中变换类型为一的情况下:

reg32_3[c_i]=reg32_2[c_i];

reg32_2[c_i]=reg32_1[c_i];

reg32_1[c_i]=reg32_0[c_i];

reg32_0[c_i]=级别;

reg64[r_i]=级别;

在tx_class_2d中变换类型为一的情况下:

reg32_1[c_i]=reg32_0[c_i];

reg32_0[c_i]=级别;

reg32_3[r_i]=reg32_2[r_i];

reg32_2[r_i]=级别;

reg64[diag]=级别。

总之,在变换类型是tx_class_horiz的一的情况下,将位置r_i处的第一寄存器阵列reg32_0[r_i]和位置c_i处的第五寄存器阵列reg64[c_i]中的值更新为级别,其值基于如上所述那样刚刚被代码化的值bl[i]。将位置r_i处的第二寄存器阵列reg32_1[r_i]中的值更新为位置r_i处的第一寄存器阵列reg32_0[r_i]中的值。在位置r_i处的剩余寄存器阵列中的剩余值假定来自位置r_i处的先前寄存器阵列的值。也就是说,将寄存器阵列中的值移位一个阵列位置。在先前所描述的实施方式中,阵列位置移位是阵列内的位置的移位。在该实施方式中,阵列位置偏移是阵列之间的位置的移位。

类似地,在变换类型是tx_class_vert的一的情况下,将位置c_i处的第一寄存器阵列reg32_0[c_i]和位置r_i处的第五寄存器阵列reg64[r_i]中的值更新为级别,该值是基于位置处的如上所述那样刚刚被代码化的值bl[i]的值的。将位置c_i处的第二寄存器阵列reg32_1[c_i]中的值更新为位置c_i处的第一寄存器阵列reg32_0[r_i]中的值。在位置c_i处的剩余寄存器阵列中的剩余值假定来自位置c_i处的先前寄存器阵列的值(即,将寄存器阵列中的值移位一个阵列位置)。

最后,在变换类型是tx_class_2d的一的情况下,将位置c_i处的第一寄存器阵列reg32_0[c_i]、位置r_i处的第三寄存器阵列以及位置diag处的第五寄存器阵列reg64[diag]中的值更新为级别,该值基于如上所述那样刚刚被代码化的值bl[i]。将位置c_i处的第二寄存器阵列reg32_1[c_i]中的值更新为位置c_i处的第一寄存器阵列reg32_0[r_i]中的值。位置r_i处的第四寄存器阵列中的剩余值假定来自位置r_i处的先前(第三)寄存器阵列reg32_2[r_i]的值。如同其它变换类型,将寄存器阵列中的值移位一个阵列位置。

注意,在可以将该解决方案应用于任何变换大小和任何扫描顺序的意义上,可以将该解决方案描述为通用的。利用该解决方案,也不需要填充变换(在右侧和下方)以在存储邻域位置时按需要推导变换的右侧边界和底部边界处的符号的上下文——通过仅将阵列初始化为0来替换填充。

图19是根据本公开的实施方式的用于对变换块进行代码化的过程的流程图。可以在编码器诸如编码器400中实施过程1900。在一个实施方式中,在过程800中利用过程1900,例如以在操作802中实施对值bl[i]的代码化、在操作803中实施对值br[i]的代码化或实施两者。

可以例如将过程1900实施为可以由计算装置诸如发送站102执行的软件程序。该软件程序可以包括机器可读指令,该机器可读指令可以存储在存储器诸如存储器204或辅助存储装置214中并且可以由处理器诸如cpu202执行以使计算装置执行过程1900。在至少一些实施方式中,过程1900可以全部或部分地由编码器400的熵编码级408执行。

可以使用专用硬件或固件来实施过程1900。一些计算装置可以具有多个存储器、多个处理器、或两者皆有。可以使用不同的处理器、存储器或两者来分布过程1900的步骤或操作。单数形式的术语“处理器”或“存储器”的使用涵盖具有一个处理器或一个存储器的计算装置以及具有多个处理器或多个存储器的装置,这些装置可用于执行一些或所有上述步骤。

过程1900可以接收描述了变换系数的幅度的信息。例如,过程1900可以接收变换块诸如变换块704或接收表示来自变换块704的值的级别图,诸如,非零图708、级-1图712和2级图714。

在操作1901中,可以确定或选择用于代码化上下文的一个或多个空间模板。可以基于用于确定正在被代码化的变换块中的量化变换系数的变换类型来做出确定。空间模板是锚定在当前扫描位置处被代码化的值处的单元格的空间布置,由此确定代码化上下文。模板可以是水平模板、垂直模板或二维模板,其是分别基于使用一维水平变换类型诸如来自tx_class_horiz的一维水平变换类型、一维垂直变换类型诸如来自tx_class_vert的一维垂直变换类型或二维变换类型诸如来自tx_class_2d的二维变换类型来选择的。因此,多种不同变换类型中的每一种可以与对不同空间模板的选择对应。在操作1901中可以选择的空间模板的示例包括水平模板901、905;垂直模板902、906以及二维模板903、907。

在一些实施方式中,用于代码化上下文的空间模板与包括来自至少两行的位置和来自至少两列的位置的区域对应,且空间模板的左上角的位置与扫描位置对应。变换类型可以是水平变换类型、垂直变换类型、二维变换类型或它们的任何组合。

在实施方式诸如关于图10至图18描述的那些实施方式中,仅可以针对用于对值bl、且若适用值br进行代码化的上下文的每个确定选择一个模板。在诸如上述通用解决方案的实施方式中,可以选择所有可用模板。根据该实施方式的变型,可以选择仅用于变换类型的所有可用模板。在例如使用所有可用模板的情况下,可以省略1901处的对一个或多个模板的选择,这是由于模板可以是先验的。

当变换类型是水平变换类型时,在操作1901中确定的空间模板可以包括来自与扫描位置相同的行的多个值和来自与扫描位置相同的列的单个值。当变换类型是垂直变换类型时,在操作1901中选择的空间模板可以包括来自与扫描位置相同的列的多个值和来自与扫描位置相同的行的单个值。当变换类型是二维变换类型时,在操作1901中选择的空间模板可以包括来自与扫描位置相同的列的多个值、来自与扫描位置相同的行的多个值以及来自与扫描位置相同的对角线的单个值。

在操作1902中,将寄存器阵列定义为保存代码化上下文的值。在寄存器阵列中所保存的值在本文中可以被称为所存储的值。至少部分地基于在操作1901中选择的空间模板的几何形状来定义寄存器阵列。例如,寄存器阵列中的值可每个与在操作1901中选择的空间模板中的位置对应。通过定义寄存器阵列以与空间模板的几何布置对应,来自寄存器阵列的所存储的值将每个与来自空间模板的相应位置对应,并且因此,每个寄存器阵列位置中的特定值将与空间模板内的特定空间位置对应。将空间模板的值存储在两个或更多个寄存器阵列中,这些寄存器阵列分别可以保存空间模板的单个行、列或对角线的值。寄存器阵列可以每个与变换块的列索引、行索引或对角线索引对应。例如,可以定义寄存器阵列,如参考图10至图18中所示的示例所描述。

可以在操作1902处基于空间模板的几何形状并且基于最大可用变换大小来定义寄存器阵列。如先前所描述,最大可用变换大小可以为32x32。寄存器阵列的基数或数目可以由具有足以存储与最大可用变换大小的对角线中的最大数目的值对应的值的数目的大小的阵列以及与在1901处确定的空间模板的最大列数目或最大行数目的最大数目对应的阵列定义的数目,其中,后者的寄存器阵列中的每一个具有足以存储与最大可用变换大小的最大列数目或最大行数目中的较大者对应的值的数目的阵列大小。在最大可用变换大小为32x32且空间模板中的最大列数目和最大行数目均等于4的示例中,存在五个寄存器阵列——4个寄存器阵列的阵列大小(元素数目)为32,而一个寄存器阵列的阵列大小为63(或64,其中,处理使2n的阵列大小为符合需要的)。

在操作1903中,初始化寄存器阵列。初始化寄存器阵列可以包括:将寄存器阵列中的所有值设置为默认值,诸如,零。

在操作1904中,通过将扫描位置设置为要代码化的下一位置、在本文中被称为扫描位置i,开始对指示来自变换块的变换系数的幅度的变换系数的值进行熵代码化。各种扫描顺序可以用于预测用于产生变换块的块。使用该扫描顺序的反向(在本文中被称为反向扫描顺序)来执行熵代码化。因此,要代码化的第一位置与以反向扫描顺序出现的第一非零值对应。在后续迭代中,在操作1904中对扫描位置进行减量,使得能够再次执行操作1905至1908,这会继续进行,直到对来自变换块的所有值进行代码化为止。

在操作1905中,获得被代码化的变换系数的值。该值指示在被代码化的当前变换块内的当前扫描位置i处的变换系数的幅度。可以从变换块704和/或从表示变换块的级别图获得此值。例如,被代码化的值可以是与bl或br对应的单个值,或可以是与bl和br对应的两个值。

在操作1906中,使用来自寄存器阵列的值来确定代码化上下文。作为示例,如参考图10至图18所描述的,可以通过对来自寄存器阵列的值进行求和来确定代码化上下文。在另一示例诸如上文所描述的示例中,可以在将来自寄存器阵列的值与bl的最高值进行比较之后通过对这些值进行求和来确定bl的代码化上下文。对来自每次比较的较小值进行求和,并且使用这些较小值来生成用于生成代码化上下文、上下文偏移ctx_offset的幅度值mag。可以通过对来自少于所有寄存器阵列的值进行求和来确定br的代码化上下文,然后使用该总和来生成用于生成代码化上下文、上下文偏移br_ctx_offset的幅度值br_mag。代码化上下文ctx_offset和br_ctx_offset也取决于扫描位置(r_i、c_i或两者)。当在tx_class_2d中变换类型为一时,代码化上下文ctx_offset也可以取决于变换块的尺寸(宽度、高度或两者)。

在一些实施方式中,在操作1906中,使用来自寄存器阵列的所存储的值来确定代码化上下文包括:选择与扫描位置的列索引、行索引或对角线索引对应的一个或多个寄存器阵列位置。

操作1907包括使用在操作1906中确定的代码化上下文对一个或多个值(bl、br或两者)进行熵代码化。具体地,使用代码化上下文来选择统计模型以供用于熵代码化,然后执行熵代码化,例如,如关于编码器400的熵编码级408所描述的。可以将操作1907的输出插入到编码比特流中。

在操作1907中对值进行熵代码化之后,在操作1908中更新寄存器阵列中的所述存储的值的至少一些。更新寄存器阵列中的所述存储的值的至少一些可以包括将一个或多个值移位一个寄存器阵列位置。这种移位可以出现在单个寄存器阵列内的寄存器阵列位置之间。该移位可以出现在两个寄存器阵列的寄存器阵列位置之间。两个寄存器阵列的寄存器阵列位置在两个寄存器阵列中可以是相同的位置(例如,公共索引或相同寄存器索引)。也就是说,例如,将一个或多个所存储的值移位可以包括:将一个或多个所存储的值从第一寄存器阵列内的索引处的阵列位置移位至第二寄存器阵列内的公共索引处的阵列位置。

更新寄存器阵列中的所述存储的值的至少一些可以包括将寄存器阵列中的一个或多个值设置为等于在操作1907中代码化的值。在使用单个寄存器阵列集合来确定扫描位置i处的值bl[i]和br[i]二者的代码化上下文的情况下,更新寄存器阵列中的所述存储的值的至少一些可以包括:只要值bl[i]小于bl[i]的最大值(例如,3),将寄存器阵列中的一个或多个值设置为等于在操作1907中代码化的值bl[i],否则将寄存器阵列中的一个或多个值设置为等于值br[i]加上值bl[i]的最大值。

在一些实施方式中,更新移位寄存器中的所述存储的值的至少一些包括:从指示来自变换块的变换系数的幅度的值中获得信息。这些值(比如,值bl和br)可以是变换系数值本身、变换系数的绝对值和/或来自级别图的值。该值可以是数字或可以是表达式,诸如,布尔表达式。例如,这些值可以指示每个变换系数的绝对值是等于零,等于一、等于二还是大于或等于三。

在操作1909中,对关于是否仍有更多的值要进行代码化做出确定。例如,如果最新操作1907对扫描位置i=0进行了代码化,那么可以确定没有更多的值要进行代码化,并且过程1900针对当前变换块结束。否则,过程返回到操作1904,在该操作中,将扫描位置设置为反向扫描顺序中的下一位置,并且针对新扫描位置的值再次执行操作1905至1909。可以针对帧的多个变换块重复过程1900。

从对操作1905和1907的描述中可清楚看出,过程1900可以用于对变换块的变换系数进行熵代码化。图20是根据本公开的另一实施方式的用于对变换块进行代码化的过程的流程图。可以在解码器诸如解码器500中实施过程2000。在实施方式中,在过程800中利用过程2000,例如以在操作802中实施对值bl[i]的代码化、在操作803中实施对值br[i]的代码化或实施两者。

可以例如将过程2000实施为可以由计算装置诸如接收站106执行的软件程序。该软件程序可以包括机器可读指令,该机器可读指令可以存储在存储器诸如存储器204或辅助存储装置214中并且可以由处理器诸如cpu202执行以使计算装置执行过程2000。在至少一些实施方式中,过程1900可以全部或部分地由解码器500的熵解码级502执行。

可以使用专用硬件或固件来实施过程2000。一些计算装置可以具有多个存储器、多个处理器、或两者皆有。可以使用不同的处理器、存储器或两者来分布过程2000的步骤或操作。

过程2000可以接收描述了变换系数的幅度的信息。例如,过程2000可以接收包括编码变换块诸如变换块704的编码比特流的一部分,或接收表示来自变换块704的值的编码级别图,诸如,非零图708、级-1图712和2级图714。

在操作2001中,确定或选择用于代码化上下文的一个或多个空间模板。操作2001可以与上文所描述的操作1901相同。

在操作2002中,将寄存器阵列定义为保存代码化上下文的所存储的值。操作2002可以与上文所描述的操作1902相同。

在操作2003中,初始化寄存器阵列。初始化寄存器阵列可以包括将寄存器阵列中的所有值设置为默认值诸如零,如上文关于操作1903所描述的。

在操作2004中,通过将扫描位置设置为下一位置(例如,如关于操作1904所描述的,以从第一非零值开始的反向扫描顺序),开始对指示来自变换块的变换系数的幅度的变换系数的值进行熵代码化。

在操作2006中,使用来自寄存器阵列的值来确定代码化上下文。操作2006可以与上文所描述的操作1906相同。

操作2007包括对在操作2004处设置的扫描位置i处的变换系数的一个或多个值(bl、br或两者)进行熵代码化。使用在操作2006中以编码比特流诸如压缩比特流420作为输入确定的代码化上下文来执行熵代码化。使用代码化上下文以及其它信息诸如变换块大小、预测模式等来选择统计模型以供用于熵代码化。例如,可以执行熵代码化,如关于编码器400的熵解码级502所描述的。操作2007的输出是在扫描位置i处的变换系数的一个或多个值。例如,过程2000可以用于对值bl和br进行代码化,如在操作802和803中所描述的,一旦针对变换系数完成了过程800,将这些值组合以产生变换系数。

在操作2007中对变换系数的一个或多个值进行熵代码化之后,在操作2008中更新寄存器阵列中的所述存储的值的至少一些。在操作2008中更新寄存器阵列中的所述存储的值的至少一些可以与上文所描述的操作1908中的更新以相同方式执行。

在操作2009中,对关于是否仍有更多的值要进行代码化做出确定。例如,如果最新操作2007对在扫描位置i=0处的值进行了代码化,那么过程2000针对当前变换块结束。否则,过程2000返回到操作2004,在该操作中,将扫描位置设置为反向扫描顺序中的下一位置。针对新扫描位置的变换系数的值再次执行操作2006至2009。可以针对帧的多个变换块重复过程2000。

上面描述的编码和解码方面说明了一些编码和解码技术。然而,应当理解,编码和解码、如在权利要求中使用的那些术语可以表示对数据的压缩、解压缩、变换或任何其它处理或改变。

词语“示例”或“实施方式”在本文中用来表示充当示例、实例或说明。本文作为“示例”或者“实施方式”描述的任何方面或者设计不必理解为比其它方面或者设计更优选或有利。相反,词语“示例”或“实施方式”的使用旨在以具体方式呈现构思。如本申请中所使用的,术语“或”旨在表示包括性的“或”而不是排它性的“或”。也就是说,除非另有说明或从上下文可以清楚地看出,“x包括a或b”旨在表示任何自然的包含性排列。也就是说,如果x包括a;x包括b;或x包括a和b,则在任何上述情况下均满足“x包括a或b”。另外,在本申请和所附权利要求书中使用的冠词“一”和“一个”通常应被解释为意指“一个或多个”,除非另有说明或从上下文清楚地指向单数形式。此外,贯穿全文,除非如此描述,否则术语“实施方式”或者“一个实施方式”并不旨在表示相同的实施例或实施方式。

发送站102和/或接收站106的实施方式(以及存储在其上和/或由其执行包括由编码器400和解码器500执行的算法、方法、指令等)可以用硬件、软件、或其任何组合来实现。硬件可以包括:例如,计算机、知识产权(ip)内核、专用集成电路(asic)、可编程逻辑阵列、光学处理器、可编程逻辑控制器、微代码、微控制器、服务器、微处理器、数字信号处理器或任何其它合适的电路。在权利要求中,术语“处理器”应被理解为单独地或组合地包括任何前述硬件。术语“信号”和“数据”可互换使用。此外,发送站102和接收站106的部分不必一定要以相同的方式实施。

此外,在一个方面中,例如,可以使用具有计算机程序的通用计算机或通用处理器来实施发送站102或接收站106,该计算机程序在被执行时执行本文描述的各种方法、算法和/或指令中的任何一种。另外或可替代地,例如,可以利用专用计算机/处理器,其可以包含用于执行本文描述的任何方法、算法或指令的其它硬件。

例如,发送站102和接收站106可以在视频会议系统中的计算机上实施。可替代地,发送站102可以在服务器上实施,而接收站106可以在与服务器分离的装置例如手持通信装置上实施。在这种情况下,发送站102可以使用编码器400将内容编码成编码视频信号,并且将编码视频信号发送到通信装置。继而,通信装置然后可以使用解码器500对编码视频信号进行解码。可替代地,通信装置可以对本地存储在通信装置上的内容进行解码,例如,不是由发送站102发送的内容。其它发送站102和接收站106实施方案也是可用的。例如,接收站106可以是大体上固定的个人计算机,而不是便携式通信装置,和/或包括编码器400的装置也可以包括解码器500。

此外,本公开的全部或部分实施方式可以采取可从例如有形计算机可用或计算机可读介质访问的计算机程序产品的形式。计算机可用或计算机可读介质可以是例如可以有形地包含、存储、通信或传输程序以供任何处理器使用或与其结合使用的任何装置。介质可以是例如电子、磁性、光学、电磁或半导体装置。也可以使用其它合适的介质。

在以下示例中概述了其它实施方式:

示例1:一种对具有变换系数的变换块进行代码化的方法,该方法包括:基于用于变换块的变换类型来为代码化上下文选择空间模板;定义移位寄存器,用于每个保存关于代码化上下文的一个或多个所存储的值;通过将所述存储的值设置为默认值来初始化移位寄存器;并且以反向扫描顺序对指示来自变换块的变换系数的幅度的值进行代码化针对一个或多个值中的每一个包括:获得要在扫描位置处代码化的值,使用来自移位寄存器的所存储的值来确定代码化上下文,使用代码化上下文对要代码化的值进行熵代码化,并且在对要代码化的值进行熵代码化之后,更新移位寄存器中的所述存储的值的至少一些。

示例2:根据示例1的方法,其中,将移位寄存器定义为与空间模板的几何布置对应,使得来自移位寄存器的所存储的值能够每个与来自空间模板的相应位置对应。

示例3:根据示例1或2的方法,其中,移位寄存器至少包括具有第一大小的第一移位寄存器和具有与该第一大小不同的第二大小的第二移位寄存器。

示例4:根据示例1至3中任一项的方法,其中,移位寄存器每个与变换块的列索引、行索引或对角线索引对应。

示例5:根据示例4的方法,其中,使用来自移位寄存器的所存储的值来确定代码化上下文包括选择与扫描位置的列索引、行索引或对角线索引对应的移位寄存器中的一个或多个。

示例6:根据示例1至5中任一项的方法,其中,更新移位寄存器中的所述存储的值的至少一些包括将一个或多个值移位一个位置。

示例7:根据示例1至6中任一项的方法,其中,更新移位寄存器中的所述存储的值的至少一些包括将移位寄存器中的一个或多个值设置为等于要代码化的值。

示例8:根据示例1至7中任一项的方法,其中,更新移位寄存器中的所述存储的值的至少一些包括从指示来自变换块的变换系数的幅度的值中获得信息。

示例9:根据示例1至8中任一项的方法,其中,用于代码化上下文的空间模板与包括来自至少两行的位置和来自至少两列的位置的区域对应,且空间模板的左上角的位置与扫描位置对应。

示例10:根据权利要求1至9中任一项的方法,其中,变换类型是水平变换类型、垂直变换类型或二维变换类型中的一种,当变换类型是水平变换类型时,空间模板包括来自与扫描位置相同的行的多个值和来自与扫描位置相同的列的单个值,并且当变换类型是垂直变换类型时,空间模板包括来自与扫描位置相同的列的多个值和来自与扫描位置相同的行的单个值,并且当变换类型是二维变换类型时,空间模板包括来自与扫描位置相同的列的多个值、来自与扫描位置相同的行的多个值以及来自与扫描位置相同的对角线的单个值。

示例11:一种用于对具有变换系数的变换块进行代码化的设备,该设备包括:存储器;以及处理器,该处理器配置为执行存储在该存储器中的用于进行以下操作的指令:基于用于变换块的变换类型来为代码化上下文选择空间模板;定义移位寄存器,用于每个保存关于代码化上下文的一个或多个所存储的值;通过将所述存储的值设置为默认值来初始化移位寄存器;并且以反向扫描顺序对指示来自变换块的变换系数的幅度的值进行代码化,其中,该指令进一步使处理器针对一个或多个值中的每一个进行以下操作:获得要在扫描位置处代码化的值,使用来自移位寄存器的所存储的值来确定代码化上下文,使用代码化上下文对要代码化的值进行熵代码化,并且在对要代码化的值进行熵代码化之后,更新移位寄存器中的所述存储的值的至少一些。

示例12:根据示例11的设备,其中,将移位寄存器定义为与空间模板的几何布置对应,使得来自移位寄存器的所存储的值能够每个与来自空间模板的相应位置对应。

示例13:根据示例11或12的设备,其中,移位寄存器至少包括具有第一大小的第一移位寄存器和具有小于该第一大小的第二大小的第二移位寄存器。

示例14:根据示例11至13中任一项的设备,其中,移位寄存器每个与变换块的列索引、行索引或对角线索引对应,并且指令进一步使处理器使用来自移位寄存器的所存储的值确定代码化上下文包括:选择与扫描位置的列索引、行索引或对角线索引中的一个对应的移位寄存器中的一个或多个。

示例15:根据示例11至14中任一项的设备,其中,该指令使处理器更新移位寄存器中的所述存储的值的至少一些包括:将一个或多个值移位一个位置,并且该指令使处理器更新移位寄存器中的所述存储的值的至少一些包括:将移位寄存器中的一个或多个值设置为等于要代码化的值。

示例16:根据示例11至15中任一项的设备,其中,该指令使处理器更新移位寄存器中的所述存储的值的至少一些包括从指示来自变换块的变换系数的幅度的值中获得信息。

示例17:根据示例11至16中任一项的设备,其中,用于代码化上下文的空间模板与包括来自至少两行的位置和来自至少两列的位置的区域对应,且空间模板的左上角的位置与扫描位置对应。

示例18:一种包括可由一个或多个处理器执行的程序指令的非暂时性计算机可读存储装置,该程序指令在被执行时使一个或多个处理器执行用于对具有变换系数的变换块进行代码化的操作,该操作包括:基于用于变换块的变换类型来为代码化上下文选择空间模板;定义移位寄存器,用于每个保持关于代码化上下文的一个或多个所存储的值;通过将所述存储的值设置为默认值来初始化移位寄存器;并且以反向扫描顺序对指示来自变换块的变换系数的幅度的值进行代码化针对一个或多个值中的每一个包括:获得要在扫描位置处代码化的值,使用来自移位寄存器的所存储的值来确定代码化上下文,使用代码化上下文对要代码化的值进行熵代码化,并且在对要代码化的值进行熵代码化之后,更新移位寄存器中的所述存储的值的至少一些。

示例19:根据示例18的非暂时性计算机可读存储装置,其中,移位寄存器每个与变换块的列索引、行索引或对角线索引对应,并且使用来自移位寄存器的所存储的值确定代码化上下文包括选择与扫描位置的列索引、行索引或对角线索引中的一个对应的移位寄存器中的一个或多个。

示例20:根据示例18或19的非暂时性计算机可读存储装置,其中,更新移位寄存器中的所述存储的值的至少一些包括将一个或多个值移位一个位置,并且更新移位寄存器中的所述存储的值的至少一些包括将移位寄存器中的一个或多个值设置为等于要代码化的值。

已经描述了上述实施例、实施方式和方面,以便容易地理解本公开并且不限制本公开。相反,本公开旨在覆盖包括在所附权利要求的范围内的各种修改和等效布置,该范围应被赋予最广泛的解释,以涵盖法律允许的所有此类修改和等效结构。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1