数据压缩的制作方法

文档序号:17446013发布日期:2019-04-17 05:37阅读:178来源:国知局
数据压缩的制作方法
本申请涉及数据压缩领域。
背景技术
:在数据要存储在存储器中和/或从存储器中读取的很多应用中,期望无损和有损的数据压缩二者。通过在将数据存储在存储器中之前压缩数据,可以减少传输到存储器的数据量。数据压缩特别有用的数据的示例是图像数据,诸如要存储在深度缓冲器中的深度数据、要存储在帧缓冲器中的像素数据和要存储在纹理缓冲器中的纹理数据。这些缓冲器可以是任何合适类型的存储器,诸如高速缓冲存储器、单独的存储器子系统、共享存储器系统中的存储器区域或其某种组合。图形处理单元(gpu)可以用于处理图像数据,以便确定要存储在帧缓冲器中、以输出到显示器的图像的像素值。gpu通常具有高度并行化的结构用于并行处理大块数据。使gpu(特别是那些打算在移动设备上实现的gpu)以较低的功率水平运行存在巨大的商业压力。与此相竞争的是期望在更快的gpu上使用更高质量的渲染算法,从而对相对有限的资源(存储器带宽)施加压力。然而,增加存储器子系统的带宽可能不是有吸引力的解决方案,因为将数据移入和移出gpu以及甚至在gpu内移动数据会消耗gpu的大部分功率预算。中央处理单元(cpu)也可能存在与gpu相同的问题。如上所述,减少传输到存储器的数据量的一种方式是压缩要传输到存储器和从存储器传输的数据。压缩和解压缩数据所花费的时间增加了存储器读取和写入操作的等待时间,并且因此可能影响gpu操作的速度。此外,可以允许压缩数据的速率与压缩数据被解压缩的速率不同。作为示例,通常可以允许用于压缩纹理数据的压缩过程(其通常是有损压缩过程)显著地慢于用于解压缩压缩纹理数据的解压缩过程。相反,用于压缩深度数据以便存储在深度缓冲器中或用于压缩像素数据以便存储在帧缓冲器中的压缩过程(其通常是无损压缩过程)理想地应当以与对应的解压缩过程大致相同的速率执行。英国专利no.2451911公开了一种可以压缩二维数据集的图形渲染系统。可变长度编码方案允许以如下方式压缩数据:该方式使得一些数据部分可以由比其他数据部分更少的编码位来表示,目的是跨不同的数据部分提供高水平的压缩(其可以不同)。然而,允许用于表示不同的经编码的数据值的位数变化会增加快速地解码经编码的数据的复杂性。例如,在不分析经编码的数据(例如,按顺序解码每个经编码的数据值)的情况下,可能难以确定不同的经编码的数据值之间的边界所在的位置。英国专利no.2530312描述了一种数据压缩系统,其中通过以下方式来压缩8×8块的图像数据:执行颜色解相关、空间解相关和熵编码,并且然后将所得到的经编码的数据值打包成数据包用于存储。在该专利描述的系统中,每次迭代,处理来自块的一行数据值。指数哥伦布编码的修改版本用于熵编码,其中每个系数存储前缀,以指示随后由后缀指示的值的范围。针对每个编码系数具有前缀和后缀使得同时解码多个值变得困难,因为快速地确定编码位之间的边界的位置并不简单。技术实现要素:提供本“
发明内容”是为了以简化的形式介绍一些概念,这些概念将在下面的“具体实施方式”中进一步描述。本“
发明内容”不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。在本文中描述的示例中,对数据值的集合(例如,数据值的2×2集合)执行熵编码。对于数据值的每个集合,在经编码的输出中(例如,在其报头分段中)包括指示,该指示用于指示针对表示数据值的该集合的经编码的数据值中的每个经编码的数据值,使用多少位。然后,根据所指示的位数将经编码的数据值包括在经编码的输出中。该系统意味着,简化了经编码的数据值的解码(与英国专利no.2530312的系统相比),因为简单地读取指示(例如,在报头中)允许确定不同的经编码的数据值之间的位边界。换言之,指示允许快速确定对应的经编码的数据分段的大小(例如,仅在单个时钟周期中)。提供了一种对多个数据值执行熵编码以形成经编码的数据输出的方法,经编码的数据输出多个经编码的数据值,多个经编码的数据值表示相应的多个数据值,该方法包括:接收数据值;以及针对所接收的数据值的多个集合中的每个集合:确定能够用于表示集合中的所接收的数据值中的最大值的位数;在经编码的数据输出中包括所确定的所述位数的指示;以及在经编码的数据输出中包括表示集合中的所接收的数据值的经编码的数据值,其中经编码的数据值中的每个经编码的数据值均具有所确定的所述位数。所确定的位数可以是能够用于表示集合中的所接收的数据值中的最大值的最小有效位数。作为示例,所接收的数据值中的每个数据值可以均具有n位,并且针对所接收的数据值的特定集合的所确定的最小有效位数可以是m,其中m≤n。在该示例中,特定集合中的所接收的数据值中的每个数据值均具有至少(n-m)个前导零,并且针对特定集合的经编码的数据值中的每个经编码的数据值均包括特定集合中的对应的n位所接收的数据值的m个最低有效位。提供了一种熵编码模块,被配置为对多个数据值执行熵编码,以形成经编码的数据输出,经编码的数据输出包括多个经编码的数据值,多个经编码的数据值表示相应的多个数据值,熵编码模块被配置为:接收数据值;以及针对所接收的数据值的多个集合中的每个集合:确定能够用于表示集合中的所接收的数据值中的最大值的位数;在经编码的数据输出中包括所确定的所述位数的指示;以及在经编码的数据输出中包括表示集合中的所接收的数据值的经编码的数据值,其中经编码的数据值中的每个经编码的数据值均具有所确定的所述位数。在一些示例中,提供了一种数据压缩单元,其包括如本文中描述的熵编码模块。提供了一种对经编码的数据输入执行熵解码的方法,经编码的数据输入包括:(i)多个经编码的数据值,以及(ii)针对经编码的数据值的多个集合中的每个集合,形成该集合中经编码的数据值的位数的指示,其中该方法包括:接收经编码的数据输入;读取经编码的数据输入中的指示,以标识形成经编码的数据值中的每个经编码的数据值的位数;以及基于所标识的位数来解析经编码的数据输入中的经编码的数据值,从而解释经编码的数据值。该方法还可以包括通过选择性地向经解释的经编码的数据值前置前导零来确定经解码的数据值,以使得经解码的数据值中的每个经解码的数据值均具有数目为n的位。提供了一种熵解码模块,被配置为对经编码的数据输入执行熵解码,经编码的数据输入包括:(i)多个经编码的数据值,以及(ii)针对经编码的数据值的多个集合中的每个集合,形成集合中经编码的数据值的位数的指示,该熵解码模块被配置为:接收经编码的数据输入;读取经编码的数据输入中的指示,以标识形成经编码的数据值中的每个经编码的数据值的位数;以及基于所标识的位数来解析经编码的数据输入中的经编码的数据值,从而解释经编码的数据值。在一些示例中,提供了一种数据解压缩单元,其包括如本文中描述的熵解码模块。存在多个本文中描述的不同的组件,包括熵编码模块、数据压缩单元、熵解码模块和数据解压缩单元。这些组件中的任何一个可以在集成电路上以硬件实现。可以提供一种在集成电路制造系统处制造这些组件中的任何一个的方法。可以提供集成电路定义数据集,其当在集成电路制造系统中被处理时将系统配置为制造这些组件中的任何一个。可以提供一种非暂态计算机可读存储介质,其上存储有这些组件中的任何一个的计算机可读描述,计算机可读描述当在集成电路制造系统中被处理时使得集成电路制造系统制造实施该组件的集成电路。可以提供一种集成电路制造系统,其包括:非暂态计算机可读存储介质,其上存储有这些组件中的任何一个组件的计算机可读描述;布局处理系统,被配置为处理计算机可读描述以便生成实施该组件的集成电路的电路布局描述;以及集成电路生成系统,被配置为根据电路布局描述来制造该组件。可以提供一种用于执行本文中描述的方法中的任何一种的计算机程序代码。可以提供一种其上存储有计算机可读指令的非暂态计算机可读存储介质,计算机可读指令当在计算机系统处被执行时使得计算机系统执行本文中描述的任何方法。如对技术人员将是明显的,上述特征可以适当地组合,并且可以与本文中描述的示例的任何方面组合。附图说明现在将参考附图详细描述示例,在附图中:图1示出了图形渲染系统;图2示出了数据压缩单元;图3示出了压缩数据的方法的流程图;图4示出了数据解压缩单元;图5示出了解压缩数据的方法的流程图;图6示出了空间解相关模块;图7示出了线性预测方法的图示;图8示出了空间解相关模块的处理管线的操作;图9示出了对数据值块执行空间解相关的方法的流程图;图10示出了在空间解相关过程中,针对处理行的顺序的依赖树;图11示出了要进行熵编码的数据值块;图12是对多个数据值执行熵编码的方法的流程图;图13示出了经熵编码的数据输出的示例格式;图14示出了用于图像的经编码的数据的示例格式;图15a示出了用于被熵编码的像素块的数据包的示例格式;图15b示出了被包括在数据包中的通道模式位的示例格式;图15c示出了被包括在数据包中的通道数据的三种不同的示例格式;图16示出了用于使用原始数据值的像素块的数据包的示例格式;图17示出了用于确定经编码的数据输入内的通道长度的解包单元的组件;图18是对经编码的数据输入执行熵解码的方法的流程图;图19示出了空间重新相关模块;图20示出了空间重新相关模块的处理管线的一个阶段的操作。图21示出了要进行熵编码的msaa差分数据值块;图22示出了如何将三个10位通道重新格式化为四个通道;图23a示出了当将两个零附加到6位数据值的最低有效端时数据值的分布;图23b示出了当将两个零前置到6位数据值的最高有效端时数据值的分布;图23c示出了在将有符号右移2位应用于图23a所示的数据值之后数据值的分布;图24示出了如何将16×4数据值块重新组织成8×8块;图25示出了行的右半部分中的数据值之一可以用于预测该行的左半部分中的一些数据值;图26示出了在针对16×4块的空间解相关过程中,针对处理行的顺序的依赖树;图27是示出可以针对16×4块来处理行的顺序的表格;图28示出了如何将32×2数据值块重新组织成8×8块;图29示出了行的一些分段中的数据值可以用于预测行的其他分段中的一些数据值;图30示出了在针对32×2块的空间解相关过程中,针对处理行的顺序的依赖树;图31是示出可以针对32×2块来处理行的顺序的表格;以及图32示出了用于生成实施图形处理系统的集成电路的集成电路制造系统。附图示出了各种示例。技术人员将理解,附图中示出的元素边界(例如,框、框组或其他形状)表示边界的一个示例。在一些示例中,可以将一个元素设计为多个元素,或者可以将多个元素设计为一个元素。贯穿附图,在适当处使用共同的附图标记来指示类似的特征。具体实施方式通过示例的方式呈现以下描述以使得本领域技术人员能够制造和使用本发明。本发明不限于本文中描述的实施例,并且对所公开的实施例的各种修改对于本领域技术人员来说是很清楚的。现在仅通过示例的方式描述实施例。数据压缩在各种不同场景中是有用的。本文中描述的大多数示例涉及压缩(以及解压缩)用于由gpu使用的图像数据,但是类似的原理可以应用于压缩(和解压缩)其他类型的数据(诸如音频或数字数据)和/或以供除了gpu之外的处理单元(诸如cpu)使用。图1示出了可以在诸如移动设备等电子设备中实现的图形渲染系统100。图形渲染系统100包括主cpu102、gpu104和存储器106(例如,图形存储器)。cpu102被布置为与gpu104通信。可以是经压缩的数据的数据可以在gpu104与存储器106之间在任一方向上传输。gpu104包括渲染单元110、压缩/解压缩单元112、存储器接口114和显示器接口116。系统100被布置为使得数据可以以下各项之间在任一方向上传递:(i)cpu102与渲染单元110;(ii)cpu102与存储器接口114;(iii)渲染单元110与存储器接口114;(iv)存储器接口114与存储器106;(v)渲染单元110与压缩/解压缩单元112;(vi)压缩/解压缩单元112与存储器接口114;以及(vii)存储器接口114与显示器接口。系统100还被布置为使得数据可以从压缩/解压缩单元112传递到显示器接口116。由gpu104渲染的图像可以从显示器接口116发送到显示器以在其上显示。在操作中,gpu104处理图像数据。例如,渲染单元110可以使用诸如深度测试(例如,用于隐藏表面移除)和纹理化和/或阴影化等已知技术来执行诸如三角形和线等图形基元的扫描转换。渲染单元110可以包含高速缓存单元以减少存储器流量。一些数据由渲染单元110经由存储器接口单元114(其可以包括高速缓存)读取或写入存储器106,但是对于其他数据,诸如要存储在帧缓冲器中的数据,数据优选地从渲染单元110经由压缩/解压缩单元112去往存储器接口114。压缩/解压缩单元112通过如下文更详细描述的那样对数据进行压缩,以减少将跨外部存储器总线而被传输到存储器106的数据量。显示器接口116将所完成的图像数据发送到显示器。未经压缩的图像可以直接从存储器接口单元114访问。经压缩的数据可以经由压缩/解压缩单元112来访问,并且作为未经压缩的数据发送到显示器108。在备选示例中,经压缩的数据可以直接发送到显示器108,并且显示器108可以包括如下逻辑,该逻辑用于以与压缩/解压缩单元112的解压缩等同的方式来解压缩经压缩的数据。虽然被示出为单个实体,但是出于性能增强的原因,压缩/解压缩单元112可以包含多个并行压缩和/或解压缩单元。作为一般概述,压缩系统可以遵循基本算法概要,使得能够执行以下步骤(不一定按照下面给出的顺序):1.划分成块图像数据在逻辑上被分成独立的、非交叠的矩形块,以允许随机访问经压缩的数据。块的大小和形状取决于实施方式,并且块可以是例如8×8、16×4、32×2、4×4或32×16数据值块。增加块大小倾向于提高所实现的压缩比。然而,增加块大小也会导致更大的硬件成本,而且,当访问模式变得不那么连贯时,可能会降低效率。因此,在选择块大小时需要达到平衡,这取决于实施方式并且可以例如取决于要压缩的数据类型的特性。2.格式转换一些缓冲器(例如,深度缓冲器)可以以浮点格式存储数据,但是对浮点数执行无损算术可能是有问题的。因此,浮点值可以被解释为带符号的大小整数值以允许无损计算。当数据值包括表示不同颜色分量的数据的多个通道时,也可以使用格式转换,其中通道中的值不是8位的倍数,例如rgb5:6:5或argb2:10:10:10格式。可以转换数据值的格式,使得每个通道的值为8位的倍数(例如,argb8:8:8:8格式)。格式转换步骤并不总是被包括在压缩过程中,例如,当数据已经是整数格式、或者可以执行无损运算的某个其他格式时。3.颜色通道解相关数据值可以包括表示不同颜色分量的数据的多个通道。例如,数据可以是argb8:8:8:8格式,其中存在8位来表示数据值中的每个数据值的alpha通道、红色通道、绿色通道和蓝色通道中的每个通道。在一些或所有颜色通道(例如,r、g和b通道)的值之间经常存在相当大的相关性,并且压缩算法能够利用这种相关性通过平均地减少这些通道中的一些通道的范围来压缩数据。用于利用不同颜色通道之间的相关性的合适的颜色空间变换在本领域中是已知的,例如如在gb2451911中所述,并且本文中不再详细描述。合适的颜色空间变换是无损的并且是“非扩展”的,这表示用于表示颜色值的位数不会由于颜色空间变换而增加。4.空间解相关空间解相关(也称为“预测”)移除了邻近像素之间的一些相关性,从而平均地减小了值的动态范围。下面参考图6至图10详细描述用于执行空间解相关的方法。5.熵编码熵编码利用解相关数据的统计特性来减少用于表示数据的位数。算术编码方案相对计算密集且速度慢。因此,已经使用了相对简单的可变长度编码(vlc)(例如,霍夫曼或哥伦布莱斯)或基于游程(run-length)的熵编码方案。然而,即使使用简单的vlc编码方案,也难以以高速执行熵解码。下面详细描述用于以高速和低计算复杂度来执行熵编码和解码的新的方法。6.储存最后,经压缩的数据可以存储在存储器106中。用于将数据存储在存储器106中的机制的细节对于本领域技术人员来说是已知的,并且因此本文中不再详细描述。解压缩系统可以遵循上面给出的用于压缩的基本算法概要的逆转(并非必然按照上文给出的顺序的逆转)。上面给出的一般压缩算法可以应用于压缩/解压缩单元112。图2示出了压缩/解压缩单元112的模块,当压缩/解压缩单元112作为压缩单元操作时,这些模块用于压缩包括四个8位通道的argb数据值块。在其他示例中,压缩/解压缩单元112可以用于压缩具有其他格式的数据值块。压缩单元112包括颜色解相关模块202、四个空间解相关模块2041至2044、四个熵编码模块2061至2064以及打包模块208。图3示出了压缩数据块的方法的流程图,该数据块例如可以是argb8:8:8:8格式的8×8像素数据块,其中每像素有32位。也就是说,在这个示例中,8×8块中的每个数据值包括32位:8位用于alpha通道,8位用于红色通道,8位用于绿色通道,并且8位用于蓝色通道。在步骤s302中,在压缩单元112处接收未经压缩的数据块。可以在压缩单元112处接收数据之前对数据执行上面给出的一般压缩算法的第一步骤,即划分成块。备选地,该步骤可以在压缩单元112处执行。在颜色解相关模块202处接收未经压缩的数据块。在步骤s304中,颜色解相关模块202可以如上所述将格式转换应用于数据值。注意,可以不实现格式转换步骤(例如,当数据已经是合适的格式(例如,整数格式)时),因此不需要格式转换。在步骤s304中,颜色解相关模块202将颜色解相关应用于数据值。合适的颜色解相关方法在本领域中是已知的。优选地,使用颜色解相关方法,该方法不扩展任何输出通道,即,从颜色相关模块202输出的位数不大于输入到颜色解相关模块202的位数。在其他示例中,alpha通道的数据值被发送到空间解相关模块2044,并且r通道、g通道和b通道的数据值被发送至颜色解相关模块202,从而颜色解相关模块202仅对r值、g值和b值应用颜色解相关。已经发现(例如,如gb2451911中所示)以下非常简单的颜色变换对于8位颜色值表现良好:r′=r-gmod28g′=gb′=b-gmod28a′=a其中r、g、b和a是在颜色解相关模块202处接收的通道的数据值,并且r'、g'、b'和a'是从颜色解相关模块202输出的解相关颜色通道的数据值。变换后的通道r'和b'的分布没有不类似于中心为零的(有界)拉普拉斯(laplace)分布函数。在上面所示的变换中执行模运算减小了分布的动态范围,使得与在不执行模运算的情况下使用r-g和b-g的值相比,可以使用更少的位。注意,上面给出的模运算是mod28,因为在上面给出的示例中,通道中的每个数据值包括8位。在其他示例中,每个数据值可以具有不同的位数,例如,n位,在这种情况下,模运算将相应地改变,例如,成为mod2n。红色、绿色、蓝色和alpha通道的颜色解相关值从颜色解相关模块202输出并且彼此分开,以便被传递到相应的空间解相关模块2041、2042、2043和2044。在步骤s306中,空间解相关模块204每个将空间解相关应用于相应颜色通道的数据值块,从而移除块中的像素之间的相关的显著部分。空间解相关方法的选择应当考虑相关因素之间的折衷,诸如可以实现的空间相关性的减少、空间解相关中涉及的操作的复杂性和/或等待时间、以及重新相关空间解相关值所涉及的操作的复杂性和/或等待时间。下面参考图6至图9更详细地描述由每个空间解相关模块204应用的空间解相关的示例。经空间解相关的数据值从空间解相关模块2041至2044中的每个输出,并且被提供给对应的熵编码模块2061至2064。在步骤s308中,熵编码模块206将熵编码应用于数据值。熵编码根据可变长度编码(vlc)方案来执行,使得熵编码值很可能不会全部具有相同的位数。通常,更可能的值用更少的位编码。以这种方式,可能通过熵编码来减少用于经编码的数据块中的所有数据值的总位数。存在空间解相关可以扩展数据的一些情况,并且这些情况可以被视为特殊情况(即,数据被处理为与其他情况不同)以限制扩展。vlc编码可以相当直接地以高速率执行,但是以匹配速率进行的vlc解码可能显著地更加困难,因为直到分析经编码的数据时才知晓连续存储的经编码的数据值之间的位边界,即直到分析经编码的数据时才知晓经编码的数据值的长度。特别地,当编码时,可以将多个符号独立地映射到它们的对应的代码和代码长度,并且然后合并成连续的输出位流。然而,通常在解码时,顺序检查编码位流中的每个代码以便确定其长度,进而确定下一代码的开始位置。换言之,需要找到不同经编码的数据值之间的位边界。下面参考图11至图13更详细地描述由每个熵编码模块206应用的熵编码的示例。经熵编码的数据值从每个熵编码模块206输出,并且被提供给打包模块208。在步骤s310中,打包模块根据打包方案将来自不同通道的经编码的数据值一起打包成经压缩的数据块。在步骤s312中,打包数据值作为经压缩的数据从打包模块208输出。经压缩的数据可以被发送到存储器106(例如,经由存储器接口114)以便存储在其中。针对不同的数据值块迭代图3所示的步骤。例如,可以针对数据值块(例如,8×8块)中的每个数据值并行地执行熵编码;而空间解相关可以以使得每次迭代能够处理一行数据值的方式执行。如果熵编码和空间解相关以相同的速率操作,则它简化了系统,因此在本文中描述的示例中,两者都以每次迭代处理一行数据值的(平均)速率进行操作。可以在所有四个通道上并行执行编码,其中每个通道每次迭代编码一行数据值。可以在相应的连续时钟周期上执行迭代。因此,作为示例,在块的行中存在八个数据值的情况下,每个时钟周期可以压缩八个数据值。图4示出了压缩/解压缩单元112的模块,当压缩/解压缩单元112作为解压缩单元进行操作时,这些模块被用来解压缩argb数据值的块。解压缩单元112包括颜色重新相关模块402、四个空间重新相关模块4041至4044、四个熵解码模块4061至4064和解包模块408。图5示出了解压缩数据块的方法的流程图。在步骤s502中,在解压缩单元112的解包模块408处从存储器108(例如,经由存储器接口114)以数据包接收块的经压缩的数据。经压缩的数据已经使用上面关于图2和图3描述的方法压缩。在步骤s504中,将数据包内的经压缩的数据值解包到不同的通道中。在这个示例中,不同的通道用于不同的颜色分量(例如,红色、绿色、蓝色和alpha通道),而在其他示例中,不同的通道可以表示其他事物,例如,不同的通道可以表示法向矢量的分量或较大数据值的单独部分(例如,表示深度和/或模板数据的32位数据值)。经压缩的数据根据解包方案解包,解包方案对应于在步骤s310中用于将数据值打包成经压缩的数据块的打包方案。如下所述,经编码的数据在数据包内的指定区域中(例如,在报头区域中)包括指示用于经编码的数据值的位数的指示。因此,可以读取这些指示,以便针对数据包内的每个通道确定经编码的数据中包括多少位。为了将传入数据解包到适当的通道中,解包模块408基于形成经编码的数据值的位数将数据包内的经编码的数据输入分离成相应的颜色通道,如经编码的数据输入中的指示所指示的。例如,通过读取指示并且添加指示的位数,解包模块可以在单个时钟周期中确定与数据包中的各个颜色通道相对应的每个经编码的数据输入的长度。不同通道的经编码的数据值(即,经压缩的数据)被提供给熵解码模块406中的相应熵解码模块。在步骤s506中,每个熵解码模块406向经编码的数据值应用熵解码。熵解码根据在步骤s308中用来对数据值进行编码的可变长度编码(vlc)方案来执行。下面参考图17和图18更详细地描述由每个熵解码模块406应用的熵解码的示例。经熵解码的数据值从熵解码模块4061到4064输出,并且被提供给对应的空间重新相关模块4041到4044。在步骤s508中,空间重新相关模块404每个将空间重新相关应用于相应颜色通道的经熵解码的数据值。以这种方式,在步骤s306中应用于数据值的空间解相关被逆转。r、g、b和a通道的数据值被发送到颜色重新相关模块402。在步骤s510中,颜色重新相关模块402将颜色重新相关应用于r、g、b和a通道的数据值。颜色重新相关方法被选择为上述步骤s304中使用的颜色解相关方法的逆转。在一些其他示例中,alpha通道可以绕过颜色重新相关模块402,例如,在不需要颜色重新相关的情况下。在步骤s510之后,已经解压缩了每个通道(例如,r、g、b和a通道)的数据值,并且在步骤s512中,这些数据值作为经解压缩的数据被输出。解压缩数据可以输出到设备中的任何其他元件。解压缩数据可以以任何合适的方式使用,例如,在数据是图像数据的情况下,解压缩数据可以输出到显示器接口116以输出到显示器108。在其他示例中,数据可以用作视频合成器的源或3d渲染器中的纹理。针对不同的数据值块迭代图5所示的步骤。例如,可以针对数据值块(例如,8×8块)中的每个数据值并行地执行熵解码;而空间重新相关可以以使得每次迭代能够处理一行数据值的方式执行。如果熵解码和空间重新相关以相同的速率操作,则它简化了系统,因此在本文中描述的示例中,两者都以每次迭代处理一行数据值的(平均)速率进行操作。可以在相应的连续时钟周期上执行迭代。因此,作为示例,在块的行中存在八个数据值的情况下,每个时钟周期可以解压缩八个数据值。当存在多个数据通道时,可以独立地(并行地)解压缩这些通道,其中每个通道每次迭代解码一行数据值。例如,argb系统可以每个时钟周期解压缩32(即,4×8)个数据值。允许在每个时钟周期中压缩和/或解压缩可预测数目的数据值可能是有用的。当使用可变长度熵编码时和/或当要执行2d空间解相关时,这并不必然是无关紧要的。此外,在每个时钟周期上压缩和解压缩多个数据值(例如,八个数据值)的能力允许数据块的压缩和解压缩快速地被执行,即,相比于不能在每个时钟周期中压缩和/或解压缩一样多数据值的其他压缩或解压缩方法,具有减少的时延。下面描述示出空间解相关和熵编码/解码模块如何实现上述压缩/解压缩速率的示例。图6示出了可以在任何一个数据通道中实现的空间解相关模块204中的一个。注意,在本文中描述的示例中,数据通道是颜色通道,但是在其他示例中,数据通道可以不是颜色通道,而是可以是其他类型的数据通道。在图6所示的示例中,在空间解相关模块204处接收通道的8×8数据块602。数据块602中的数据值被布置到8行(在图6中标记为0至7)和8列(在图6中标记为a至h)的二维阵列。数据值块与相应的相邻像素值块相关。在图6所示的示例中,每个数据值包括8位,使得数据块的每行包括64位。空间解相关模块204被配置为在相应的连续时钟周期上处理数据块的行,从而对来自块的数据值在两个维度上执行空间解相关。空间解相关模块204包括多个并行处理管线(6041至6048),每个管线包括第一阶段606、第二阶段608和重新映射阶段609。处理管线604的第一阶段606被配置为实现沿着数据值行的空间解相关。除了最后的处理管线6048之外的所有处理管线604的第一阶段606包括处理单元610,处理单元610被配置为确定第一系数来表示来自正在处理的行中的相应一个数据值。处理管线604的第二阶段608被配置为实现沿着数据值列的空间解相关。每个处理管线604的第二阶段608包括存储单元(例如,寄存器612)和处理单元614。在图6所示的示例中,寄存器612具有足够的容量来存储至少三个数据值,例如,每个数据值具有8位。处理管线604的重新映射阶段609包括重新映射单元618,重新映射单元618被配置为将数据值重新映射为更适合于熵编码的值。在本文中描述的示例中,重新映射左上方值(a0”),但是可以不重新映射左上方值(a0”),因为该值不在本文中描述的系统中进行熵编码。注意,在图6中,针对第一处理管线6041标记了处理单元6101、寄存器6121、处理单元6141和重新映射单元6181,但是为了清楚起见,图6中未针对其他处理管线604n标记相应的处理单元610n、寄存器612n、处理单元614n和重新映射单元618n(其中2≤n≤8)。图9示出了在空间解相关模块204处对数据值块602执行二维(2d)空间解相关的过程的流程图。在操作中,在步骤s902中,接收来自数据块602的行(例如,行0)的数据值。特别地,每个处理管线604被配置为从数据块的特定行接收一个或多个数据值。在图6所示的示例中,处理管线6041至6047的第一阶段的处理单元610从数据块602的特定行接收多于一个数据值,但是处理管线6048的第一阶段从数据块602的特定行接收仅一个数据值。在步骤s904中,每个第一阶段606确定表示特定行的数据值中的相应一个数据值的第一系数。第一系数由处理管线6041至6047的处理单元610基于在步骤s902中在处理单元610处接收数据值并且根据任何合适的预测方案(诸如基于线性预测或基于哈尔预测的方案)来确定。最后的处理管线6048的第一阶段606简单地确定第一系数与在那里接收的数据值相同。在处理管线6041至6047的每个第一阶段中,为了确定表示数据值的第一系数,使用其他数据值确定数据值的预测,并且因此第一系数基于所接收的数据值与数据值的预测之间的差异。如果预测足够准确,则第一系数值的分布(例如,每个实际数据值与预测值之间的差异)通常比实际数据值本身的分布更偏向(朝向零),并且平均而言可以使用较少的位来表示。当被认为是有符号值时,第一系数通常可以等于或几乎等于零。线性或哈尔预测方案可以包括两阶段的过程:预测并且然后更新,即,预测和误差补偿。线性和哈尔预测方案基于第二代小波。也就是说,对于行或列中的奇数编号位置处的每个数据值(其可以被称为“奇数数据值”),基于偶数位置处的一个或多个数据值(其可以称为“偶数数据值”)的某个集合来确定预测值。在哈尔预测方案中,该确定基于一个偶数数据值,并且在线性预测方案中,该确定基于两个偶数数据值。奇数数据值被替换为实际数据值与预测值之间的差异。当确定第二代小波时,然后使用少量的相邻已修改奇数值来更新偶数值。然后,在不同的尺度上重复预测以预测其他数据值,例如,更新后的偶数值被分组为一组值,被指派为交替的“偶数”和“奇数”的新的集合,并且重复该过程。更新步骤的主要目的是保留图像矩(moment)。当系数被量化为有损压缩过程的一部分时,维持这样的统计特性是有用的,但是对于无损数据压缩,如在本文中描述的示例中,不需要包括更新步骤(尽管它们可以被包括在一些示例中)。避免更新步骤:a)对平均压缩比没有显著的不利影响,b)将预测过程中的硬件操作的数目减半,以及c)大大缩短了用于编码和解码两者的计算依赖链。可以在不同的空间频率处应用线性和/或哈尔预测方案,以由此预测数据值中的不同数据值。在每个频率处,数据值的集合被用来以实际数据值与所预测的数据值之间的差异替代奇数数据值。当采用最高频率时,来自数据块的所有数据值都在所使用的数据值的该集合中。该集合中的奇数数据值p2i+1(其中i为整数)从来自具有偶数索引(例如p2i和/或p2i+2)的集合的一个或多个相邻数据值来加以预测,并且p2i+1由针对p2i+1的实际值与所预测的值之间的差异所替代。在较低频率处,该集合包括来自数据块的较少(例如一半)数据值。该过程能够在较低频率处被重复,直到一行中的数据值中的除一个数据值之外的全部数据值从该行中的一个或其他数据值被预测出。例如,参考图6,从列a和c中的数据值预测列b中的数据值;从列a和e中的数据值预测列c中的数据值;并且从列a中的数据值预测列e中的数据值。被用于使用线性和哈尔预测方案来确定用于奇数数据值p2i+1的第一系数p′2i+1的预测和替代操作被给出为:p′2i+1=p2i+1-lpredict(p2i,p2i+2)mod28(线性)(1)p′2i+1=p2i+1-p2imod28(哈尔)(2)其中函数lpredict被给出为:lpredict函数的目的是生成已经被计算模28的两个输入值的最可能的平均。参考图7,如果考虑具有256(即28)“分钟”的钟面,则存在两条路径能够采用,以从该时钟上的任何两个位置横越。因为,在图7中所示出的示例中,执行计算mod28,任何8位的值表示更大的但是有限的同余(congruent)集合中的所有值,但是假定所期待的概率分布函数严重地偏向零,具有更小量值的值更可能是实际值。作为一个示例,图7示出了在|p2i-p2i+2|≥27时lpredict函数如何能够预测用于数据值p2i+1的值。在图7中所示出的示例中,p2i=220并且p2i+2=20。如果通过确定对这些两个值取简单的平均,则结果将是120。然而,根据上文给出的等式,由于|p2i-p2i+2|≥27,则如图7中所示出的,lpredict函数的结果由给出。由于模运算,248与值-8同余。值-8比值120更为可能得多,并且如此-8(其与248同余)被确定为lpredict函数的结果。因为“比较”是两个数据值p2i和p2i+2的两个最高有效位(msb)的xor,所以lpredict函数中的“分支”实施在硬件中是无关紧要的。此外,所应用的偏移(27)再次被实施为一位xor运算。空间解相关由相应的空间解相关模块204独立地应用于不同的颜色通道。在一个示例中,每个空间解相关模块204如图6所示操作,其中8个时钟周期中的吞吐量为一个8×8数据值块,在每个时钟周期逐步步进到块的不同行。图6所示的每个处理单元(610和614)可以每时钟周期执行线性预测或者通过重复输入执行哈尔预测。在其他示例中,仅执行哈尔预测的处理单元(例如,处理单元6104、6106和6107)可能仅接收两个输入,以避免重复输入。如果在特定频率处的两个邻近的相邻数据值是可用的,则应用线性预测,而如果在特定频率处只有一个邻近的相邻数据值可用,则应用哈尔预测。在每个时钟周期,使用针对列b、d、f和c的线性预测以及针对列h、g和e的哈尔预测,在三个频率处对行进行解相关。对于8×8块,列a没有被处理单元610执行的水平预测所修改。以上针对线性和哈尔预测方案给出的等式涉及数据值包括8位的情况。对于本领域技术人员来说,如何针对具有不同位数的数据值修改这些等式将是很清楚的。例如,对于n位数据值,上述等式中28的出现将被替换为2n,并且27的出现将被替换为2n-1。由处理管线604的第一阶段606确定的第一系数从处理管线604的第一阶段输出到相应的第二阶段608。应当注意,在其中处理8×8数据块的图6所示的示例中,最后的处理管线6048不需要处理单元,因为在这种情况下,列a的数据值不变地传递通过管线6048的第一阶段606。在步骤s906中,在处理管线604的相应的第二阶段608处接收从第一阶段606输出的第一系数。具体地,在处理管线604的第二阶段608的寄存器612处接收第一系数。然后,第一系数在垂直方向上空间解相关。数据块的行按顺序输入到并行处理管线604,使得在第一行已经被第二阶段608接收并且存储在寄存器612中之后,可以基于寄存器612中存储的数据值来确定在第二阶段608处接收的块的每个后续行的第二系数。例如,如下面更详细地描述的,可以按照以下顺序将行提供给处理管线604:行0、行4、行2、行1、行3、行6、行5并且然后是行7(尽管其他顺序也有效,诸如行0、行4、行6、行7、行5、行2、行3并且然后是行1)。然后,以目标速率,利用仅最小的附加存储,在y方向(即,沿着列的垂直方向)上应用上述水平解相关的转置。特别地,如在图6和图8所示的示例(下面描述)中,寄存器612可以不需要在任何一次存储多于三个数据值。在步骤s910中,选择性地将从对应的第一阶段606接收的第一系数存储在处理管线604的每个第二阶段608的寄存器612中。也就是说,对于一些行,第一系数存储在寄存器612中,而对于其他行,第一系数不存储在寄存器612中。具体地,如果要使用这些第一系数来确定后续行的第二系数,则将第一系数存储在寄存器612中。在术语方面,参考空间解相关过程,“第一系数”是来自第一阶段606的输出(即,在水平解相关之后的值,如图6中的单虚线标签(a'到h')所指示的),并且“第二系数”是来自第二阶段608的输出(即,在水平和垂直解相关之后的值,如图6中的双虚线标签(a”到h”)所指示的)。对于每个处理管线604,寄存器612被配置为一次(例如,每时钟周期)将多至两个值输出到相应的处理单元614。在每次迭代时,从对应的处理管线604的第一阶段606接收的第一系数被传递至相应的处理单元614,并且寄存器612被配置为将存储在寄存器612中的零个、一个或两个第一系数输出到相应的处理单元614。在步骤s912中,每个处理单元614确定第二系数,以表示来自正被处理的行的数据值中的相应一个数据值。第二系数是表示块的数据值的经空间解相关的值,并且从空间解相关模块204输出。对于块的第一行的数据值,仅基于针对该行的数据值所接收的第一系数来确定第二系数。用于第一行的数据值的第一系数被存储在寄存器612中,从而对于来自该块的后续行的数据值,基于所存储的第一系数以及用于后一行的第一系数来确定第二系数。例如,对于除了块的第一行之外的所有行的数据值,基于以下各项来确定用于一行数据值的第二系数:(i)在第二阶段608处接收的用于该行的对应的第一系数,以及(ii)相应的寄存器612中存储的用于相应的至少一个其他行的至少一个第一系数。图8示出了来自8×8块的不同行的数据值被输入到处理管线604中的顺序的示例。处理管线604的第二阶段608的操作被总结在图8中所示出的表格中。能够看出,处理单元614具有图8中标记为“左”、“中间”和“右”的三个输入,由此中间输入被耦合到处理单元610的输出,而左输入和右输入被耦合到寄存器612的输出。在第一时钟周期(时钟周期c0)时,管线604的第二阶段608接收用于行0的第一系数(输入到第二阶段608的值由单撇:0'指示)并且输出用于行0的第二系数(从第二阶段608输出的值由双撇:0”指示),其中存储单元存储用于行0的第一系数(即,在时钟周期c0之后,寄存器612存储用于行0的第一系数,标示为0')。在第二时钟周期(时钟周期c1)时,管线604的第二阶段608接收用于行4的第一系数(输入到第二阶段608的值为4')并且输出用于行4的第二系数(从第二阶段608输出的值为4”)。也就是说,处理单元614接收中间输入上的4'并且接收左输入和右输入上的0',从而用于行4的第二系数(标示为4”)由处理单元614基于所接收的用于行4的第一系数(标示为4')以及所存储的用于行0的第一系数(标示为0',从寄存器612获取)来加以确定。在时钟周期c1之后,存储单元存储用于行0和行4的第一系数(即寄存器612存储用于行0和4的第一系数,标示为0'和4')。在第三时钟周期(时钟周期c2),管线604的第二阶段608接收用于行2的第一系数(输入到第二阶段608的值是2'),并且输出用于行2的第二系数(从第二阶段608输出的值是2”)。也就是说,处理单元614在中间输入上接收2',在左输入上接收0'并且在右输入上接收4',使得用于行2的第二系数(标示为2”)由处理单元614基于所接收的用于行2的第一系数(标示为2')和所存储的用于行0和行4的第一系数(标示为0'和4',从寄存器612获取)来确定。在时钟周期c2之后,存储单元存储用于行0、行4和行2的第一系数(即,寄存器612存储用于行0、行4和行2的第一系数,标示为0'、4'和2')。在第四时钟周期(时钟周期c3),管线604的第二阶段608接收用于行1的第一系数(输入到第二阶段608的值是1'),并且输出用于行1的第二系数(从第二阶段608输出的值是1”)。也就是说,处理单元614在中间输入上接收1',在左输入上接收0'并且在右输入上接收2',使得用于行1的第二系数(标示为1”)由处理单元614基于所接收的用于行1的第一系数(标示为1')和所存储的用于行0和行2的第一系数(标示为0'和2',从寄存器612获取)来确定。在时钟周期c3之后,存储单元存储用于行4和行2的第一系数(即,寄存器612存储用于行4和行2的第一系数,标示为4'和2')。用于行0的第一系数(标示为0')可以被丢弃,因为后续行不需要它,但是可能更简单的是:在寄存器612中保留0'直到它被覆盖。在第五时钟周期(时钟周期c4),管线604的第二阶段608接收用于行3的第一系数(输入到第二阶段608的值是3'),并且输出用于行3的第二系数(从第二阶段608输出的值是3”)。也就是说,处理单元614在中间输入上接收3',在左输入上接收2'并且在右输入上接收4',使得用于行3的第二系数(标示为3”)由处理单元614基于所接收的用于行3的第一系数(标示为3')和所存储的用于行2和行4的第一系数(标示为2'和4',从寄存器612获取)来确定。在时钟周期c4之后,存储单元存储用于行4的第一系数(即,寄存器612存储用于行4的第一系数,标示为4')。用于行2的第一系数(标示为2')可以被丢弃,因为后续行不需要它,但是可能更简单的是:在寄存器612中保留2'直到它被覆盖。在第六时钟周期(时钟周期c5),管线604的第二阶段608接收用于行6的第一系数(输入到第二阶段608的值是6'),并且输出用于行6的第二系数(从第二阶段608输出的值是6”)。也就是说,处理单元614在中间输入上接收6'并且在左输入和右输入上接收4',使得用于行6的第二系数(标示为6”)由处理单元614基于所接收的用于行6的第一系数(标示为6')和所存储的用于行4的第一系数(标示为4',从寄存器612获取)来确定。在时钟周期c5之后,存储单元存储用于行4和行6的第一系数(即,寄存器612存储行4和行6的第一系数,标示为4'和6')。在第七时钟周期(时钟周期c6),管线604的第二阶段608接收用于行5的第一系数(输入到第二阶段608的值是5'),并且输出用于行5的第二系数(从第二阶段608输出的值是5”)。也就是说,处理单元614在中间输入上接收5',在左输入上接收4'并且在右输入上接收6',使得用于行5的第二系数(标示为5”)由处理单元614基于所接收的用于行5的第一系数(标示为5')和所存储的用于行4和行6的第一系数(标示为4'和6',从寄存器612获取)来确定。在时钟周期c6之后,存储单元存储用于行6的第一系数(即,寄存器612存储行6的第一系数,标示为6')。用于行4的第一系数(标示为4')可以被丢弃,因为后续行不需要它,但是可能更简单的是:在寄存器612中保留4'直到它被覆盖。在第八时钟周期(时钟周期c7),管线604的第二阶段608接收用于行7的第一系数(输入到第二阶段608的值是7'),并且输出用于行7的第二系数(从第二阶段608输出的值是7”)。也就是说,处理单元614在中间输入上接收7'并且在左输入和右输入上接收6',使得用于行7的第二系数(标示为7”)由处理单元614基于所接收的用于行7的第一系数(标示为7')和所存储的用于行6的第一系数(标示为6',从寄存器612获取)来确定。在时钟周期c7之后,存储在寄存器612中的内容并不重要,因为在后续时钟周期中,该过程利用新的块而重复,因此将不使用寄存器612中用于当前块的数据。当这样的数据要存储在寄存器612中时,数据可以被用于新的块的数据所覆盖。在图8中所示出的示例中,寄存器612每个在任何给定时间存储多至三个第一系数,以便于处理来自包括八行数据值的块的数据值。一般而言,每个寄存器612将具有在任何给定时间存储多至log2(r)个第一系数的容量,其中r是数据值的块中的行数目。由处理单元614执行的处理可以是线性处理或者哈尔处理,例如,这取决于为了确定第二系数所提供的不同输入的数目。图10示出了用于在空间解相关过程中使用的行(或列)的依赖图。实线表示依赖关系。例如,行0(列a)不依赖于其他行(列);行4(列e)依赖于行0(列a);行2(列c)依赖于行0和4(列a和e);行6(列g)依赖于行4(列e);行1(列b)依赖于行0和2(列a和c);行3(列d)依赖于行2和行4(列c和e);行5(列f)依赖于行4和6(列e和g);并且行7(列h)依赖于行6(列g)。按顺序处理行(列),使得在已经处理了块的第一行(列)之后,当处理后续行(列)时,已经处理了它们所依赖的行(列)。图10中的虚线描述了在图8所示的示例中处理行(列)的顺序。最小化计算量和所要求的先前数据行的存储量是有益的,并且以尽可能接近线性的顺序输出行以增加在输出结果时保存区域的可能性也是有益的。图10中虚线所示的顺序(即,行顺序0、4、2、1、3、6、5、7)是一个不错的选项,因为如果像素数据是按照扫描顺序(即,按行顺序0、1、2、3、4、5、6、7)从其他地方(例如,存储器或另一单元)传输的,则图10所示的顺序仅需要缓冲三行传输数据。该顺序的限制因素是在第二周期输出行4,其中在输入行以扫描顺序到达的情况下,行4在行0、1、2和3之后接收,并且这表示三行数据被缓冲。然而,存在可以满足依赖性的很多不同的顺序,这对于已经查看了图10的本领域技术人员将是很清楚的。例如,可以按照以下顺序处理行:0、4、2、3、1、6、7、5;或者:0、4、6、5、7、2、1、3,仅给出两个示例。在最后的示例中,限制因素是在第三周期输出行6,其中在输入行以扫描顺序到达的情况下,行6在行0、1、2、3、4和5之后接收,所以这表示四行数据被缓冲。对于具有不同行数的块(即,不是如上面给出的示例中的八行),技术人员将知道如何相应地修改输入行的顺序,使得在每个时钟周期(除了处理块的第一行的时钟周期之外),可以基于已经存储在寄存器612中的块的先前存储的数据值行来针对一行输出数据值。来自每个管线604的空间解相关值(即,从处理单元614输出的第二系数)被传递到相应的重新映射单元618。重新映射单元618重新映射数据值,使得它们可以被后续熵编码过程更有效地编码。重新映射的数据值可以是无符号整数格式。重新映射过程根据由空间解相关模块使用的空间解相关技术来配置,使得重新映射的数据值具有特定幅度的可能性对于更大的幅度而降低。现在描述重新映射过程的示例。重新映射过程对来自处理单元614的8位值进行操作。如果数据值的最高有效位为零,则重新映射过程涉及移除最高有效位(其为零)并且向数据值的剩余位附加0。例如,00010101将被重新映射以变为00101010,并且01000100将被重新映射以变为10001000。如果数据值的最高有效位为1(使得数据值表示负数),则重新映射过程涉及移除最高有效位(其为1),补充每个剩余的位(例如,使用xor运算),并且然后向这些位附加1。例如,10010101将被重新映射以变为11010101,并且11000100将被重新映射以变为01110111。这里描述的重新映射过程非常容易实现,例如,在硬件中简单地通过重新排序一些位(例如,以将msb移动到lsb位置)并且在msb是1的情况下可选地补充其他位。表1示出了如何重新映射一些数据值的位。数据值取消映射的位重新映射的位00000000000000000-1111111110000000110000000100000010-2111111100000001120000001000000100-3111111010000010130000001100000110-4111111000000011140000010000001000表1:位的重新映射在上述示例中,线性预测方程由等式1给出,其中函数由等式3定义并且涉及向上舍入两个相邻数据值的平均值。像素值与其紧邻的邻居的平均值之间的差异(p′2i+1)最可能为零,并且因此特定差异的可能性随着差异进一步远离零而减小。函数lpredict中的差异的量化(归因于用于表示差异的有限的位数(例如,8位)和平均值的向上舍入(即,在除法运算中使用上限(ceiling)函数而不是向下舍入平均值))意味着:差异的分布在负方向上略微“移位”。注意,利用上述重新映射示例,由于在重新映射之后存储正值'x'所要求的(有效)位数偶尔大于(但绝不小于)存储重新映射值'-x'所要求的位数,所以可以理解的是,将分布偏向负方向而不是偏向正方向(这将使平均值向下舍入)导致更好的压缩。这表示,重新映射的数据值是无符号的,具有偏向零的分布。作为具体示例,结合上述函数lpredict使用该重新映射过程(其涉及向上舍入两个相邻数据值的平均值)意味着:我们更可能获取从空间解相关模块的第二阶段输出的、比“+1”系数更多的“-1”系数。根据表1所示的重新映射过程,值-1被重新映射到00000001,并且值+1被重新映射到00000010。从以下熵编码过程的描述中可以明显看出,00000001(其具有一个有效位,即,七个前导零)可以使用比00000010(其具有两个有效位,即,六个前导零)更少的位来编码。在不同的示例中,空间解相关可以将差异定义为在等式1和等式2中定义的差异的负值,其中函数lpredict使用下限(floor)操作而不是上限操作,使得平均值向下舍入而不是向上舍入。这还将导致这样的情况,其中上述简单重新映射过程将导致重新映射的数据值具有特定幅度的可能性针对较大的幅度而减小。上述空间解相关模块204被配置为在第一阶段606中沿着数据值的行实现空间解相关,并且在第二阶段608中沿着数据值的列实现空间解相关,使得一行空间解相关值可以在多个连续时钟周期中的每个时钟周期上输出。在其他示例中,可以交换行和列的处理,使得空间解相关模块204在第一阶段中沿着数据值的列并且在第二阶段中沿着数据值的行实现空间解相关,使得一列空间解相关值可以在多个连续时钟周期中的每个时钟周期上输出。空间解相关和重新映射的数据值从空间解相关模块204输出,并且被提供给对应的熵编码模块206。如上所述,熵编码模块206使用可变长度编码方案对空间解相关值应用熵编码。编码方案被选择为允许以可预测的速率快速编码,并且特别是快速解码数据值。已经实现了从空间解相关模块204输出的数据值在空间上没有被完全解相关,使得数据值不是完全独立的。因此,当输入块的局部部分中存在细节(例如,具有高空间频率的图像分量,诸如图像中的条纹区域)时,可能的是:从空间解相关模块204输出的、用于输入块的局部部分的若干相邻数据值的幅度相似。与独立处理每个数据值的过程相比,可以利用该相似性来改进熵编码过程。特别地,与在英国专利no.2530312中描述的熵编码/解码方案相比,本文中描述的方案:(i)提供了对多个经编码的数据值的更容易的并行解码,(ii)平均而言提供了稍微更好的压缩(在经编码的数据值的减少的位数方面),以及(iii)避免了明确存储经压缩的数据通道的长度的需要。特别地,在英国专利no.2530312中描述的熵编码/解码方案涉及两次存储长度信息的冗余,即,以每系数前缀数据和总长度的形式。本文中描述的熵编码/解码方案消除了这种冗余存储。图11示出了已经由空间解相关模块204之一空间解相关和重新映射的8×8数据值块1100。数据值与相应像素值相关。参考图12所示的流程图描述在熵编码模块206处对数据值块执行熵编码的方法。熵编码模块206输出经编码的数据输出1300(如图13所示),经编码的数据输出1300包括用于表示8×8块1100中的数据值的经编码的数据值。经编码的数据输出1300具有可变长度,这取决于可以通过熵编码过程实现的压缩。特别地,在块1100中的每个所接收的数据值包括8位(即,1字节)的示例中,经编码的数据输出1300包括8位(1字节)宽的参考值字段1302、48位(6字节)宽的大小指示字段1304、以及可变大小字段,在这个示例中已经被配置为保持字段的8位对齐的可变大小字段的宽度在8位(1字节)宽与448位(56字节)宽之间。如果熵编码过程在不超过经编码的数据输出1300中的可用位数(即,504位或63字节)的情况下不能无损地表示数据块1100中的数据值,则数据块1100中的数据值是以原始形式存储在经编码的数据输出中,每个数据值为8位。其中放置经编码的数据输出的数据包的报头分段具有用于指示数据包内的经编码的数据的格式的指示。例如,该指示可以包括两位,使得可以设置多达四种不同的编码模式,其可以包括原始数据格式、熵编码格式和恒定格式(其中块内的所有数据值具有相同的值,使得该值可以被存储一次(使用8位)以表示块内每个数据值的值)。在步骤s1202中,在熵编码模块206处接收数据值块。块的行和列如图11所示布置。数据值块1100包括数据值的多个集合(在这个示例中,大多数是数据值的2×2集合(与像素值的2×2集合有关),但是在其他示例中,这些集合可以是不同的形状和/或大小)。例如,数据值的集合可以是具有任何合适大小和形状的数据值的二维集合,例如,这些集合可以是数据值的p×q集合,其中p>1并且q>1。在本文中描述的主要示例中,p=q=2。在一些示例中,p可以是在范围2≤n≤4内的整数,并且q可以是在范围2≤m≤4内的整数。为了给出一些具体示例,这些集合可以是数据值的3×2集合、数据值的2×3集合、数据值的3×3集合或数据值的4×4集合,例如,其中数据值与相应像素值有关。块1100包括数据值的15个2×2集合、以及仅包括三个数据值的一个特定集合(在块的左上方)。左上方数据值(a0)不是经熵编码的,而是在步骤s1204中,位置a0处的数据值被包括在经编码的数据输出1300的参考值字段1302中。由于左上方的集合表示与块中的其他集合相比较的类似大小的集合,但减去将用作参考值的数据值,所以左上方的集合包括比每个其他集合更少(例如,3个而不是4个)的数据值。在图11所示的示例中,为了熵编码的目的,块中的行具有a”、e”、c”、g”、b”、d”、f”、h”的顺序,并且块中的列具有0、4、2、6、1、3、5、7的顺序。其他示例可以对行和列进行与图11所示的不同的排序。图11所示的示例顺序与上述空间解相关模块处理行的顺序不精确匹配(例如,行6被示出为在行1和行3上方)。除了左上方的2×2集合(其仅对三个值进行分组并且被略有不同地编码)之外,值的每个对齐的2×2集合将被一起编码。选择这个示例分组使得:(a)集合内的值属于(如果可能的话)相同的空间频率,以及(b)集合内的值来自在附近空间(如果可能的话)的像素。这样做是因为它们在大小上更可能“相似”,并且因此可以更有效地压缩集合。如上所述,数据值是无符号的,具有偏向零的分布(归因于颜色相关和空间解相关过程)。因此,数据值可能具有前导零。因此,可以简单地通过从数据值中移除一个或多个前导零(如果可能)来压缩数据值。指示用于指示已经移除多少个前导零。四个数据值的左上方集合在以下方面被不同地处理:(a)左上方的像素用作参考并且单独存储,以及(b)其余三个值具有不同的编码方案,这个编码方案已经针对图像数据的大的集合而被“训练”,使得:(i)出于对齐目的,用于表示三个值的总位数是4的倍数(这与2×2块相匹配),以及(ii)总存储量成本(用于训练图像集)已经被最小化。在s1206处理块的左上方中的数据值的特定集合。具体地,在步骤s1208,对特定集合的指示被包括在大小指示字段1304中。对于块1100中的数据值的相应集合,大小指示字段中的每个指示具有三位。该3位指示可以用作到查找表的索引,以获取特定集合中的每个数据值的位数,使得每个值的位数足以存储该值。块1100中有数据值的16个集合,使得大小指示字段包括48位(即,3×16位)或6字节。块中的四个数据值的十五个集合将利用是四的倍数的位数而被编码(因为,如下所述,四个数据值的集合中的每个经编码数据值具有相同的位数),并且在任何给定的行上,这十五个集合中的每个集合均贡献两个位的倍数。为了保持经压缩数据的便利对齐(因为限制数据的对齐可以降低硬件复杂性),限制被应用于针对仅具有3个元素的左上方的集合的可用选择。左上方的集合具有三个数据值,其中一个(e0)在行0中。为了提高硬件效率,期望一行的总数据是偶数位,因此可以用于表示该数据值的经编码数据值的可能长度仅限于偶数。类似地,用于表示该集合的另外两个数据值(a4和e4)的两个经编码数据值的组合长度相加得到偶数值。此外,在这个示例中,经编码的数据输出中的所有经编码数据值的组合长度将向上舍入到最近的字节(使得经编码的数据输出在字节边界上对齐),以及块中的数据值的所有其他集合。因此,用于经编码数据值的左上方集合的总位数也是四的倍数。利用包括三位的大小指示符,可以针对经编码数据值来设置八个集合的长度。例如,表2示出了经编码数据值的一些可能长度,其可以由针对左上方块的八个不同的大小指示来表示。表2所示的长度是通过评估图像的非常大的集合、并且(从可能组合的非常大的集合)选择导致最低的总存储成本的组合来实现。表2:左上方集合的经编码数据值的长度熵编码模块206从可能的选项(例如,如表2所示)中选择具有能够通过从数据值中移除前导零来(无损地)表示{e0,a4,e4}三元组的最小总长度的编码。在平局的情况下(例如,如果在表2所示的示例中在大小指示011与100之间决定),可以选择任一平局的代码,但是作为示例,可以选择具有最小数字编码的代码(例如,011)。在步骤s1210中,针对左上方集合的经编码数据值被包括在经编码的数据输出1300的可变大小字段1306中(例如,在可变大小字段1306的开始处)。然后处理块1100中数据值的剩余(例如,十五)集合。框s1212表示针对图11所示的剩余2×2集合中的每个集合而执行的步骤。具体地,在步骤s1214,确定用于表示数据值的集合中的最大值的位数(例如,最小位数),并且在步骤s1216中,将所确定的位数的指示包括在该集合的经编码的数据输出1300的大小指示字段1304中。步骤s1214可以通过查找该集合中的哪个数据值具有最小数目的前导零并且然后标识足够的最小可用编码来进行。注意,并非所有可能的数据长度都可以可用于编码。例如,如下面的示例中所述,7位的数据长度不可用于编码。因此,所确定的位数可以是可以用于表示该集合中的所接收的数据值中的最大值的最小“有效”位数,其中如果位数可以通过要被包括在大小指示字段1304中的指示来指示,则位数是有效的。例如,可以存在可以由所述指示(例如,如下面的表3中所列)来指示的有效位数的预定集合,并且最小有效位数可以是预定集合中足以表示该集合中的所接收的数据值中的最大值的有效位数的最小值。如上所述,有效位数的预定集合可能不包括可以用于表示在集合中的所接收的数据值中的最大值的所有可能的最小位数。可能的最小位数的范围是从0到n,其中n是在熵编码模块处接收的数据值中的位数(例如,在本文描述的示例中n=8)。换言之,可以从有效位数的预定集合中省略一个或多个可能的最小位数。在下面描述的示例中,其中n=8,从有效位数的预定集合中省略数字7,使得有效位数的预定集合仅包括数字0、1、2、3、4、5、6和8。当已经确定要用于表示集合中的每个经编码数据值的位数时,可以从集合中的数据值中的每个数据值中移除一些前导零(如果适当的话),从而确定经编码数据值,使得集合中的经编码数据值中的每个编码数据值具有针对该集合的所确定的位数。在步骤s1218中,将表示该集合中的数据值的经编码数据值包括在经编码的数据输出1300的可变大小字段(1306)中。经编码数据值被包括在可变大小字段1306中的顺序是预定的,并且对应于指示被包括在大小指示字段1304中的顺序,使得当经编码数据值被解码时,经解码数据值在块内的位置是已知的。例如,如果集合中的四个数据值是00000011、00000100、00000001和00000000,则00000100是该集合中的最大值,并且三是可以用于表示最大值的最小位数。在表3所示的示例中,三是有效位数,因为可以包括用于指示该集合的每个经编码数据值具有三位的指示。因此,可以从集合中的数据值中的每个数据值中移除五个前导零。因此,该集合的经编码数据值是011、100、001和000,并且这些经编码数据值被包括在可变大小字段1306中。用于指示三位被用于表示该集合中的每个经编码数据值的指示(例如,011)被包括在大小指示字段1304中。不同的集合(例如,2×2集合)可以针对其经编码数据值来使用不同的位数,并且每个集合在大小指示字段1304中具有其自己的指示,来指示在可变大小字段1306中针对该集合的经编码数据值使用多少位。作为示例,表3示出了针对2×2集合,指示可以如何对应于位数。大小指示每个经编码数据值的位数00000011010201131004101511061118表3:表示针对2×2集合的不同位数的指示注意,不存在用于指示七位用于每个经编码数据值的指示。因此,在这个示例中,如果集合内的最大8位值仅具有一个前导零,则可以用于表示该集合中的每个经编码数据值的最小有效位数是八(而不是七)。在针对经编码数据值的有效长度的预定集合中对七的这个省略是通过检查3位数的所有可能选择而被选择为8个选择的集合。由于有9个选项(位长0到8),因此省略了一个选项。在针对大型图像测试套评估了所有可能性(例如,试验省略0、或1或2......)之后,确认省略“7”给出最佳压缩水平。注意,数据值仅具有一个前导零的可能性很小,因为颜色解相关和空间解相关过程导致数据值偏向零。应当很清楚,本文中描述的示例涉及8位数据值,但是在其他示例中,数据值可以包括不同数目的位(例如,6位数据值),并且本领域技术人员将能够修改本文中提供的公开内容以使用这些不同的位数进行操作。例如,如果从空间解相关模块接收的每个数据值具有n位,并且针对所接收的数据值的特定集合所确定的最小有效位数是m,其中m≤n,则这个特定集合中的所接收的数据值的每个数据值具有至少(n-m)个前导零。在这种情况下,针对这个特定集合的经编码数据值中的每个经编码数据值包含这个特定集合的对应的n位所接收的数据值的m个最低有效位。参考与上面相同的示例,如果集合中的四个n位数据值(其中n=8)是00000011、00000100、00000001和00000000,则用于表示该集合的最大值的所确定的最小有效位数为m=3。每个经编码数据值的3位的数据长度是表3中的有效编码。每个数据值具有至少五个前导零。因此,该集合的m位经编码数据值是011、100、001和000。可以由熵编码模块206并行处理块1100内的不同集合。例如,通过熵编码模块206内的并行操作,可以确定针对块1100内的不同集合的指示,并且将其包括在大小指示字段1304中。然而,由于经编码数据值可以具有可变长度,因此它们以预定顺序包括在可变大小字段1306中。当块的所有经编码数据值已经被包括在经编码的数据输出1300中时,则在步骤s1220中,从熵编码模块206输出经编码的数据输出。表示像素值块的经编码的数据输出针对每个颜色通道而被提供给打包模块208,在那里它们被打包在一起。例如,打包模块208将来自不同颜色通道的数据值块的经编码的数据输出放入数据包中。换言之,针对与相同像素有关的相应的多个颜色通道来形成多个经编码的数据输出,并且将针对一组像素(例如,8×8块)的多个经编码的数据输出一起打包成数据包用于存储。然后可以发送经编码的数据块以存储在存储器106中,例如经由存储器接口114。报头与一组经编码的数据块(例如,表示图像或帧的数据块)一起存储。对于每个经编码的数据块(例如,每个8×8的经编码的数据值块),报头中包括报头指示,以指示针对相应的经编码的数据块的经压缩数据的大小。报头与经编码的数据值分开存储(例如,存储在经编码的数据输出的专用部分中),并且由于其小的大小,报头数据的绝大部分可以保持驻留在gpu内的高速缓存中。报头允许在从存储器获取经编码的数据块之前知道经编码的数据块的大小,因此可以获取经编码的数据块而不获取无关数据。这对于允许随机访问经编码的数据的不同部分非常有用。通常,可以在报头中使用任何数目的位作为针对相应经编码的数据块的报头指示,但是在下面描述的特定示例中,针对报头指示中的每个报头指示使用四位。图14示出了用于表示压缩形式的图像(或帧)的经编码的数据1400的一部分。经编码的数据1400包括报头1402和n个经编码的数据块(14040至1404n-1)。经编码的数据块根据上述技术编码,因此它们具有可变大小。每个经编码的块总是在作为距fb地址最大许可块大小的倍数的地址处开始。如果针对块的经编码的数据小于最大许可块大小,则在该经编码的块与下一经编码的块之间的地址空间中存在间隙。这些间隙在图14中用杂线示出。这样,经编码的块从可预测的地址开始(即使经编码的数据的大小是可变的),因此不需要将块所在位置的记录存储在存储器中。可以以与未被压缩的数据相同的方式来确定块的位置,并且然后可以跳转到该地址。注意,虽然这可能不是存储器空间的最佳使用,但这确实允许减少存储器带宽(即,传输到存储器/从存储器传输的数据量)。针对每个经编码的数据块1404的4位报头指示被包括在报头1402中。使用四位用于报头指示允许每个报头指示来指示十六个不同的选项之一。根据上述压缩技术,针对表示64个像素(例如,8×8块)的经编码的数据块的最大可能大小是256个字节(即,2048位),即,每个数据值高达32位。将存储经编码的数据的存储器系统将具有最小的存储器传输粒度(例如,32或64字节),因此太精细地指定经压缩的数据的大小没有什么意义。表4:报头指示解释表4示出了十六个不同报头指示的示例解释。在不同的示例中,报头指示可以被不同地解释。报头指示中的八个报头指示(表4所示的示例中msb为1的那些报头指示)指示相应的数据块是经压缩的数据,具有八个相应的不同大小范围。报头指示中的一个报头指示(表4所示的示例中的0111)指示相应的数据块是原始形式,即,它未经过熵编码,从而256个字节用于表示块中的64个数据值。在不同的示例中,不包括“1111:225..256字节”指示,而是将数据以原始模式“0111”来存储。在表4所示的示例中,报头指示中的四个报头指示(0000至0011)指示整个对应块对于一些常见情况具有预定值。在这些情况下,不为块存储另外的数据,因为块中的所有数据值具有预定值。在表4所示的示例中选择的常见颜色是透明黑色、不透明黑色、不透明白色和清除颜色。清除颜色是在清除渲染空间时要使用的可以(例如,通过提交要渲染的几何体的应用)设置的颜色。为了在3d游戏中渲染复杂场景,相对不太可能的是:整个块具有预定颜色之一,但是在一些情况下(例如,用于渲染用户界面),相对可能的是:整个块(例如,8×8像素块)具有预定颜色之一。当本发明用于压缩其他数据(即,除了颜色数据之外)(例如,深度数据、法线图或yuv数据)时,可以使用用于“预定常数”值的不同值。表4所示的示例中存在三个“其他模式”,这个示例允许以依赖于实现的方式来有效地编码其他常见情况。例如,这些其他模式可以用于定义另外的预定颜色(例如,其可以是驱动器定义的或硬连线的),或者用于定义多重采样抗混叠(msaa)模式,例如,作为2×msaa、4×msaa或8×msaa。图像的数据存储在存储器(例如,帧缓冲器)中,其具有指向存储器中的地址的指针(在图14中表示为“fb地址”),以指示帧缓冲器中经编码的数据的开始。经编码的数据从该起始地址开始向前移动通过帧缓冲器的地址空间。在图14所示的示例中,报头被存储以从相同的地址(如由fb地址指针所指示的)向后运行。换言之,报头从fb地址开始以反向位顺序存储。这表示,可以使用单个地址指针来访问报头并访问经编码的数据。使用单个指针而不是两个指针(一个用于经编码的数据,一个用于报头),或者指针和偏移值,减少了需要在整个gpu中维护或传输的数据量。为了从经编码的数据1400读取特定的经编码的数据块(例如,为了读取经编码的数据14042的块'2'),通过计算包含相应报头指示的存储器位置的地址来读取针对块2的报头指示,注意,这要求相对于fb地址的减法。经编码的数据的起始地址通过将块编号乘以未被压缩的块的大小并且将其与fb地址相加来确定,而要读取的数据的量通过解释报头指示来确定。在可以进一步减少带宽使用但仍然保持随机访问级别的备选示例中,经编码的数据被分组和打包成n个的多个集合,例如n=4。为了访问[n*k,n*k+n-1]范围内的块,比如n*k+j,将如上所述来计算块n*k的地址。为了确定块n*k+j的数据位于何处,n*k到n*k+j-1的报头指示符将被解释,以找到组中的先前块的长度以及因此到块n*k+j的位置的偏移。如前所述,针对经编码的块n*k+j的数据长度被编码在针对n*k+j的报头中。图15a示出了包括针对数据块的经编码的数据值的数据包,其中数据包被熵编码(即,在针对块的报头1402中的报头指示指示数据是压缩形式)。数据包包括针对数据块的四个通道(c0至c3)的经编码的数据值(15020至15023)。在一些示例中,数据块对应于64个像素,例如,布置成8×8块,并且四个通道是r、g、b和a。针对相应通道1502的经编码的数据的每个部分包括8到512位,这取决于如上所述的熵编码的结果。数据包包括通道打包模式部分1504。图15b示出该模式部分1504包括8位:2位用于四个通道(15060至15063)中的每个通道,以指示用于在相应的数据部分1502中表示相应通道的数据的模式。针对每个通道使用两位允许针对通道数据使用四个不同的模式,并且不同的通道可以使用不同的模式,即,它们被独立压缩,以便实现更大的压缩。例如,四种模式可以是:(i)常数、(ii)保留、(iii)熵编码,以及(iv)原始数据。如果通道的模式指示1506x指示恒定模式,则对应数据1502x具有单个数据值(例如,8位数据值),其表示通道的块中的所有数据值的值,即,通道数据值对于块是恒定的。图15c示出了数据1502在恒定模式下可以包括8位常数值(图15c中的顶行)。保留模式可以用于依赖于实现的目的。给出保留模式的两个示例用途:(i)可以使用不同的熵编码模式,其中对于每个大小指示使用不同的位数(例如,2位),使得不同数目的编码位可以被有效地编码,以及(ii)调色板编码模式,其中经编码的数据值是从已知(例如,预定)值(或“调色板”)的集合中选择的。如果通道的模式指示1506x指示熵编码模式,则根据上述熵编码过程对对应数据1502x进行编码。图15c示出了数据1502在熵编码模式下可以包括可变长度数据(图15c中的中间线)。图15c的中间线与图1相同,使得经编码的数据包括8位参考值、16个3位的大小指示(总共48位)、以及包括8位到448位之间的任意数目的位的可变长度经编码的数据值。选择该上限(448位)使得:(a)熵编码通道的总的最大长度(504位)严格小于“原始模式”(512位),以及(b)总长度在便利的8位边界处对齐。如果要考虑不同的对齐,则可以在不同的实施例中选择备选的最大长度。图16示出了包括数据块的数据值的数据包,其中数据包包括原始数据(即,针对块的报头1402中的报头指示指示数据是原始数据)。在上述示例中,原始数据是空间解相关后的数据。数据包包括针对数据块的四个通道(c0至c3)的原始数据值(16020至16023)。注意,在图16所示的示例中,第四通道的顶部字节存储在数据包的最低有效8位中(1604),即,其中模式指示1504存储在图15所示的经熵编码的数据包中。这表示,数据包中的其他通道数据与其在经熵编码的数据包中的位置相同。这可以允许在确定正在压缩的块是否需要以压缩或原始模式写入之前,实现在每个通道上顺序操作的较低成本编码器,这可以避免必须保留所有经压缩的数据和原始版本。注意,在一些其他示例中,c3原始数据的顶部字节可以存储在数据包的最高有效端。当对不同大小/形状的数据块(例如,不是8×8块)进行编码时和/或当使用不同的位数(例如,不是8位)来表示每个数据值时,可以使用与图14至图16所示的数据结构类似的数据结构。以上描述了压缩过程。现在将描述用于解压缩已经使用上述技术压缩的数据的解压缩过程。上面描述的图4和图5给出了经压缩的数据如何被解压缩的高级描述。现在提供关于拆包模块408、熵解码模块406和空间重新相关模块404如何操作的更多细节。读取经压缩的数据的报头1402以便确定数据的格式。如果数据是常数或原始格式,则解码很简单,因为数据具有已知长度和预定解释。然而,如果数据包是熵压缩格式(如报头1402中的报头指示所指示的),则数据包中的数据具有可变长度。为了将经压缩的数据包解包到适当的通道(例如,rgba)中,解包模块408基于通道打包模式字段1504中的指示1506来确定每个通道的长度,并且如果通道数据是熵编码形式,则解包模块408基于大小指示1304来确定每个通道的长度。通道数据部分1502中的常数和原始模式的大小分别是微不足道的1字节和64字节。为了确定被熵编码的通道数据部分1502的大小,对通道的大小指示1304进行解码。大小指示可以被并行解码。可以在单个时钟周期中确定通道中的位数。图17示出了其中解包模块408包括长度解码单元(17020至170215)的示例,每个长度解码单元被布置为从针对通道数据的大小指示字段1304接收相应的大小指示。在上述示例中,每个大小指示是3位,并且指示形成针对集合(例如,经编码的数据值的2×2集合)的经编码的数据值的位数,例如,根据上面给出的表3。将针对不同集合的数据值的大小传递给加法器1704,加法器1704对大小求和以确定针对通道的经编码的数据的总大小。该大小从加法器1704输出。此外,在一些示例中,每个可能的长度已经被限制为4位的倍数,这实现了加法器逻辑中的额外节省。由于长度解码单元1702可以并行操作,因此可以快速确定针对通道的经编码的数据的大小。当已经确定了数据包中针对通道的经编码的数据的大小时,将来自数据包的不同通道数据部分提供给相应的熵解码模块406。参考图18所示的流程图来描述每个熵解码模块406的操作。在步骤s1802中,在熵解码模块406处接收针对特定通道的数据块。如果数据值是原始格式,则数据值绕过熵解码过程,并且原始数据值从熵解码模块406输出到对应的逆转的空间解相关模块404。如果数据值是恒定格式,则数据值块的常数值从熵解码模块406传递到对应的空间重新相关模块404以定义a0”系数,并且针对所有其他情况发送零数据值。备选地,将常数复制到所有值,并且绕过空间解相关步骤。然而,如果所接收的数据值被熵编码(如图15b所示的对应的模式指示1506所指示的),则熵解码模块406对所接收的数据值执行熵解码,如下面参考图18的流程图中所示的步骤所描述的。在步骤s1804中,熵解码模块406读取经编码的数据输入中的指示1304,以标识形成经编码的数据值中的每个经编码的数据值的位数。在上述示例中,每个大小指示是3位,并且指示形成针对集合(例如,经编码的数据值的2×2集合)的经编码的数据值的位数,例如,根据上面给出的表3。然后,在步骤s1806中,熵解码模块406基于所标识的位数来解析经编码的数据输入的可变长度字段1306中的经编码的数据值,从而解释经编码的数据值。在步骤s1808中,熵解码模块406通过选择性地向经解释的经编码数据值前置前导零,例如使得每个经解码数据值具有n位(其中n例如可以是8)来确定经解码数据值。例如,如果经编码的数据值具有m位,则向经编码的数据值前置(n-m)个零。例如,如果针对经编码的数据值的第一2×2集合的大小指示指示该集合的每个经编码的数据值具有三位(即,m=3),并且可变长度字段1306中的经编码的数据以位011100001000开始,则对经编码的数据值进行解析(步骤s1806),以将该集合的四个经编码的数据值确定为011、100、001和000。在这个示例中,经解码数据值具有八位(即,n=8),所以向每个经编码的数据值前置五个零(n-m=5),使得经解码数据值是00000011、00000100、00000001和00000000。注意,从熵解码模块输出参考值而不改变参考值,例如,以表示块的左上方的值。在步骤s1810中,从熵解码模块406输出经解码的数据值。对于每个通道,将输出的经解码的数据值提供给对应的空间重新相关模块404。空间重新相关模块404执行上面关于图6至图10描述的空间解相关的逆转。参考图19和图20描述空间重新相关模块404的操作的示例的细节。图19示出了包括八个处理管线19021至19028的空间重新相关模块404。每个处理管线1902包括取消映射阶段1903、第一重新相关阶段1904和第二重新相关阶段1906。在每次迭代(例如,每个时钟周期)每个处理管线1902从块(例如,要在空间上重新相关的8×8数据块)的一行数据值接收经熵解码的数据值之一。出于空间重新相关模块的目的,经熵解码的数据值被认为是经空间解相关的数据值,在其上将应用空间重新相关以确定经空间重新相关的数据值。每个管线1902的取消映射阶段1903包括取消映射单元1907,取消映射单元1907在数据压缩期间应用由空间解相关模块204的重新映射单元618应用的重新映射过程的逆转。例如,如果使用上述重新映射过程(如表1中所总结的),则取消映射过程可以涉及以下过程:-如果经重新映射的数据值的最低有效位为零,则取消映射过程涉及移除最低有效位(其为零)并且向数据值的剩余位前置零。例如,00101010将被取消映射以变为00010101,并且10001000将被取消映射以变为01000100。-如果数据值的最低有效位是1(从而未被映射的数据值表示负数),则取消映射过程涉及移除最低有效位(其是1),反转剩余的位,并且然后向位前置1。例如,11010101将被取消映射以变为10010101,并且01110111将被重新映射以变为11000100。本文中描述的取消映射过程非常容易实现,例如,使用硬件简单地通过重新排序一些位(例如,将lsb移动到msb位置),并且可选地,在lsb是1的情况下通过反转(例如,使用xor操作)其他位。针对一行数据值的取消映射的值(a”到h”)被传递给第一重新相关阶段1904。每个第一重新相关阶段1904包括处理单元1908和存储1910以在垂直维度(例如,在列上)执行空间重新相关。每个第二阶段1906包括处理单元1912,以在水平维度(例如,在行上)执行空间重新相关。与图6所示的编码管线604相反,在解码管线1902的第二阶段1906中存在依赖链,由此一些管线1902的第二阶段1906使用其他管线1902的第二阶段1906的结果,如下面更详细地描述的。图20示出了处理管线1902之一的第一重新相关阶段1904在八次迭代上的操作,从而向相应的第二重新相关阶段1906输出第一系数,用于传入的经空间解相关的、经取消映射的8×8数据值块。空间重新相关模块404的第一重新相关阶段1904执行由对应的空间解相关模块204的第二阶段608执行的操作的逆操作。经空间解相关的、经取消映射的数据值块的行按照如下顺序被输入到并行处理管线1902:该顺序使得在行的第一个被第一重新相关阶段1904接收并且被存储在寄存器1910中之后,在第一重新相关阶段1904处接收的块的每个后续行的第一系数可以基于寄存器1910中的存储的第一系数来确定。例如,如下面更详细地描述的,可以按以下顺序将经空间解相关的、经取消映射的8×8数据值块的行提供给处理管线1902:行0、行4、行2、行1、行3、行6、行5并且然后是行7。与上面参考空间解相关所描述的类似,针对空间重新相关来处理行的顺序在不同的示例中可以不同,但是优选地满足图10所示的依赖树。为了给出一些其他示例,针对空间重新相关来处理行的顺序可以是0、4、2、3、1、6、7、5;或0、4、6、5、7、2、1、3;或0、4、6、7、5、2、3、1。可以看出,处理单元1908在图20中具有被标记为“输入”、“左”和“右”的三个输入,由此在输入线上接收经空间解相关的、经取消映射的数据值,而左输入和右输入耦合到寄存器1910的输出。在第一时钟周期(时钟周期c0),管线1902的第一阶段1904接收行0的经空间解相关的、经取消映射的数据值(输入到第一重新相关阶段1904的空间解相关的、经取消映射的数据值在图20中由双撇号:0”指示),并且输出行0的第一系数(从第一重新相关阶段1904输出的值在图20中由单撇号:例如0'指示),其中存储单元1910存储行0的第一系数(即,在时钟周期c0之后,寄存器1910存储行0的第一系数,标示为0')。在第二时钟周期(时钟周期c1),管线1902的第一阶段1904接收行4的经空间解相关的、经取消映射的数据值(输入到第一阶段1904的经空间解相关的、经取消映射的数据值是4”),并且输出行4的第一系数(从第一重新相关阶段1904输出的值是4')。也就是说,处理单元1908在输入线上接收4”,并且在左输入和右输入上接收0',使得行4的第一系数(标示为4')由处理单元1908基于所接收的行4的经空间解相关的、经取消映射的数据值(标示为4”)和所存储的行0的第一系数(标示为0',从寄存器1910获取)来确定。如上所述,在空间解相关中,行4的空间解相关的值被确定为4″=4′-0′mod28,所以重新布置该等式,得到:4′=4″+0′mod28。处理单元1908使用该等式以基于4”的输入值和所存储的第一系数0'来确定被标示为4'的值。在时钟周期c1之后,存储单元存储行0和行4的第一系数(标示为0'和4')。在第三时钟周期(时钟周期c2),管线1902的第一阶段1904接收行2的经空间解相关的、经取消映射的数据值(输入到第一阶段1904的值是2”),并且输出行2的第一系数(从第一阶段1904输出的值是2')。也就是说,处理单元1908在输入线上接收2”,并且在左输入上接收0',并且在右输入上接收4',使得行2的第一系数(标示为2')由处理单元1908基于所接收的行2的经空间解相关的、经取消映射的数据值(标示为2”)和所存储的行0和行4的第一系数(标示为0'和4',从寄存器1910获取)来确定。将清楚的是,值2'根据等式2′=2″+lpredict(0′,4′)mod28来确定。在时钟周期c2之后,寄存器1910存储行0、4和2的第一系数,标示为0',4'和2')。注意,可以交换“左”和“右”的赋值,因为“处理单元”操作的结果将不受影响。然而,从半导体实现中的“功率”角度来看,优选地,值从一个时钟周期到另一时钟周期尽可能少地改变。例如,在时钟周期c2和c3中,lr赋值分别为(0',4')和(0',2'),尽管将时钟周期c3的赋值修改为(2',0')将产生完全相同的结果,由于当0'输入从左输入切换到右输入时逻辑中的电压摆动次数更多,因此可能消耗更多能量。将清楚的是,在第四时钟周期(时钟周期c3),管线1902的第一阶段1904接收行1的经空间解相关的、经取消映射的数据值(标示为1”),并且输出行1的第一系数(标示为1')。也就是说,处理单元1908在输入线上接收1”,并且在左输入上接收0',并且在右输入上接收2'。值1'根据等式1′=1″+lpredict(0′,2′)mod28确定。在时钟周期c3之后,寄存器1910存储行4和行2的第一系数(标示为4'和2')。行0的第一系数(标示为0')可以被丢弃,因为后续行不需要它,但是可能更简单的是:在寄存器1910中保留0'直到它被覆盖。将清楚的是,在第五时钟周期(时钟周期c4),管线1902的第一阶段1904接收行3的经空间解相关的、经取消映射的数据值(标示为3”),并且输出行3的第一系数(标示为3')。也就是说,处理单元1908在输入线上接收3”,在左输入上接收4',并且在右输入上接收2'。值3'根据等式3′=3″+lpredict(4′,2′)mod28确定。在时钟周期c4之后,寄存器1910存储行4的第一系数(标示为4')。行2的第一系数(标示为2')可以被丢弃,因为后续行不需要它,但是可能更简单的是:在寄存器1910中保留2'直到它被覆盖。第一阶段1904在第六、第七和第八时钟周期时的操作从图19来看将是明显的,并且将遵循与上文针对前五个时钟周期所描述的相同的原理,并且所以为了简洁,我们在这里将不详细地解释这些时钟周期中的操作。注意,处理管线1902的第一阶段1904中的每个第一阶段的存储单元1910被配置为存储多至三个第一系数,并且这对于第一阶段1904中的所有行的处理是足够的,这归因于这些行被输入到空间重新相关模块404的顺序。如上文所指出的,一般而言,寄存器1910中的每个寄存器在任何给定时间将具有存储多至log2(r)个第一系数的容量,其中r是经空间解相关的数据值的块中的行数。因此,在每次迭代中,一行第一系数(在图19中标记为a'到h')被提供至处理管线1902的相应的第二重新相关阶段1906。空间重新相关模块404的第二阶段1906执行由对应的空间解相关模块204的第一阶段606所执行的操作的逆转。如上文描述的,在空间解相关中,列a的数据值与用于列a的第一系数是相同的,即a'=a。因此,在对应的空间重新相关中,在处理管线19028的第二阶段1906处接收的用于列a的第一系数在第二阶段1906的输出上不被改变,即a=a'。然而,如上文描述的,在空间解相关中,对于列e,由等式e′=e-amod28来给出第一系数e',该等式能够被写为以更加清楚地示出mod函数的操作。因为a=a',所以我们能够布置该等式以给出因此,处理管线19027中的处理单元1912使用输入a'和e'根据这一等式,输出用于列e的经空间解相关的数据值。此外,如上文描述的,在空间解相关中,对于列g,由等式:来给出第一系数g'。该等式能够被重新布置以给出因此,处理管线19026中的处理单元1912使用输入e和g'根据这个等式输出用于列g的经空间解相关的数据值,其中e的值从处理管线19027的处理单元1912的输出来加以提供。在其他实施例中,在处理管线19026的处理单元1912中(以及在处理管线19027中)可以重复e的计算(或集合合成单个评估,诸如从而处理管线19026不依赖于处理管线19027的输出。在这些其他实施例中,处理管线19026的处理单元1912可以接收a和e'值作为输入以及g'值。此外,如上文描述的,在空间解相关中,对于列c,由等式:来给出第一系数c'。使用上文给出的lpredict的定义,该等式能够被重新布置以给出:因此,处理管线19025中的处理单元1912使用输入a、c'和e根据这个等式输出用于列c的经空间解相关的数据值,其中a的值从处理管线19028的第一阶段1904的输出来加以提供,并且e的值从处理管线19027中的处理单元1912的输出来加以提供。在其他实施例中,在处理管线19025的处理单元1912中(以及在处理管线19027中)可以重复e的计算(或集合合成用于计算c的单个评估),从而处理管线19025不依赖于处理管线19027的输出,在该情况下,处理管线19025的处理单元1912可以接收e'值作为输入以及a和c'值。此外,如上文描述的,在空间解相关中,对于列b,由等式:来给出第一系数b'。该等式能够被重新布置以给出:因此,处理管线19021中的处理单元1912使用输入a、b'和c根据这个等式输出用于列b的经空间解相关的数据值。a的值从处理管线19028的第一阶段1904的输出来加以提供,并且c的值从处理管线19025中的处理单元1912的输出来加以提供。在其他实施例中,在处理管线19021的处理单元1912中(以及在处理管线19025中)可以重复c的计算(或集合合成用于计算b的单个评估),从而处理管线19021不依赖于处理管线19025的输出,在该情况下,处理管线19021的处理单元1912可以接收c'和e'值作为输入以及a和b'值。此外,如上文描述的,在空间解相关中,对于列d,由等式:来给出第一系数d'。该等式能够被重新布置以给出:因此,处理管线19022中的处理单元1912使用输入c、d'和e根据这个等式输出用于列d的经空间解相关的数据值。c的值从处理管线19025中的处理单元1912的输出来加以提供,并且e的值从处理管线19027的处理单元1912的输出来加以提供。在其他实施例中,在处理管线19022的处理单元1912中(以及在处理管线19025中)可以重复c的计算(或集合合成用于计算d的单个评估),从而处理管线19022不依赖于处理管线19025的输出。此外,在这些其他实施例中,可以在处理管线19022的处理单元1912中(以及在处理管线19027中)重复e的计算,从而处理管线19022不依赖于处理管线19027的输出。在这些其他实施例中,处理管线19022的处理单元1912可以接收a'、c'和e'值作为输入以及d'值。此外,如上文描述的,在空间解相关中,对于列f,由等式:来给出第一系数f'。该等式能够被重新布置以给出:因此,处理管线19023中的处理单元1912使用输入e、f’和g根据这个等式输出用于列f的经空间解相关的数据值。e的值从处理管线19027中的处理单元1912的输出来加以提供,并且g的值从处理管线19026中的处理单元1912的输出来加以提供。在其他实施例中,在处理管线19023的处理单元1912中(以及在处理管线19027中)可以重复e的计算(或集合合成用于计算f的单个评估),从而处理管线19023不依赖于处理管线19027的输出。此外,在这些其他实施例中,可以在处理管线19023的处理单元1912中(以及在处理管线19026中)重复g的计算,从而处理管线19023不依赖于处理管线19026的输出。在这些其他实施例中,处理管线的19023的处理单元1912可以接收a、e'和g'值作为输入以及f'值。此外,如上文描述的,在空间解相关中,对于列h,由等式:来给出第一系数h'。该等式能够被重新布置以给出:因此,处理管线19024中的处理单元1912使用输入g和h'根据这个等式输出用于列h的经空间解相关的数据值,其中g的值从处理管线19026中的处理单元1912的输出来加以提供。在其他实施例中,在处理管线19024的处理单元1912中(以及在处理管线19026中)可以重复g的计算(或集合合成用于计算h的单个评估),从而处理管线19024不依赖于处理管线19026的输出。在这些其他实施例中,处理管线的19024的处理单元1912可以接收a和e'值作为输入以及h'值。以这种方式,空间重新相关模块404能够在多次迭代(例如,时钟周期)中的每次迭代时确定一行经空间重新相关的数据值。例如,在八次迭代中能够确定8×8块的数据值。如上所述,在一些示例中,然后由颜色重新相关模块402对从空间重新相关模块404输出的r、g和b通道的数据值执行颜色重新相关,从而获取解压缩的数据值。注意,一些其他示例不具有颜色重新相关阶段或绕过它。以上描述主要涉及编码和解码8×8像素值块,其中像素值各自具有32位并且是argb8:8:8:8格式,使得它们针对四个通道(alpha、红色、绿色和蓝色)中的每个通道包括8位数据值。如下面更详细地描述的,在其他实施例中,数据值可以具有不同的格式。多重采样抗混叠多重采样抗混叠(msaa)是一种可以用于例如,通过减少混叠伪影来改善图像质量的技术。对场景进行超采样,使得对于每个像素,渲染多于一个样本,并且可以对所得到的渲染样本进行下采样以生成要在显示器上显示的像素。存在不同的msaa模式,并且msaa模式可以涉及每个像素采样不同数目的样本,例如,每个像素2或4个样本是常见的msaa模式。例如,每个像素的第一样本位置可以如上所述被编码和解码为参考图像,但是每个像素的其他样本位置可以被处理作为“msaadelta图像”,其中与参考图像的对应值相比,msaadelta图像的数据值被给出作为delta值(即,差值)。换言之,数据值表示msaa差分数据值。通常,同一像素内的不同msaa样本之间的差异将在幅度上很小。因此,不对msaadelta图像的数据值执行空间解相关(和相应的空间重新相关)处理。然而,仍然执行重新映射和取消映射过程,使得数据值处于无符号格式,其中分布偏向零(因为这提高了熵编码阶段的效率)。如上所述执行参考图像的熵编码。然而,对于msaadelta图像,熵编码略有不同,因为所有数据值(包括块的左上方数据值)的幅度都很小。图21示出了来自msaadelta图像的8×8数据块。由于尚未对数据值执行空间解相关,因此行的排序为a、b、c、d、e、f、g、h,并且列的排序为0、1、2、3、4、5、6、7。可以对块的左上方的2×2集合以与块中的其他集合相同的方式进行编码。由于没有为来自msaadelta图像的数据块存储参考值,所以额外的数据字节可以用于通道的数据中的经编码的数据值。例如,参考图13,参考值字段1302并不用于msaadelta图像的块,并且可变长度字段1306可以具有在1到57个字节之间的数据。msaadelta图像仍然使用48位用于大小指示(1304),即,对于数据值的每个2×2集合是3位,以指示该集合中的经编码的数据值的大小。在一些系统中,如果msaadelta图像的块中的所有差分数据值为零(即,如果样本位置集与针对像素块的参考样本位置集相同),则可以设置指示符以指示这种情况(例如,设置透明黑色旗帜)。这将减少用于表示这种情况的数据量,这种情况并不少见。根据以上描述,msaadelta图像的数据值的解码应当是很清楚的。考虑到经编码的数据值块不包括参考值,以使得左上方集合包括4个经编码的数据值的事实,熵解码以相同的方式发生。参考图像的数据值被空间重新相关,但msaadelta图像的数据值在空间上不被重新相关(因为它们在压缩期间没有被空间解相关)。10位数据值在一些实施例中,每个数据值具有10位(而不是如上述示例中的8位)。然而,上述系统可以用于压缩/解压缩10位数据值,而无需对熵编码/解码或空间解相关/重新相关过程进行实质性修改。可以修改解包过程以便使用被设计用于处理8位值的硬件来正确地处理10位值。例如,yuv视频格式可以针对三个通道(y、u和v通道)中的每个通道使用10位数据值。因此,在这个示例中,像素由yuv10:10:10格式的30位表示。yuv仅作为示例格式给出,但是还存在使用10位数据值的其他格式。上述系统被布置为处理每个像素的四个通道的8位数据值。可以将三个10位数据值重新格式化为四个8位通道。当处理yuv数据时,颜色解相关和颜色重新相关块可以被省略或绕过,并且可以由处理块替换/补充,处理块执行将数据值从三个输入通道重新格式化为四个输出通道,反之亦然。图22示出了一个示例,其中用于yuv通道的三个10位数据值被重新格式化为四个通道,这四个通道可以被视为使用上述系统的rgba通道。第一输入通道的数据值的八个最高有效位(例如,标示为y9到y2)被放置在第一输出通道(例如,r)中,第二输入通道的数据值的八个最高有效位(例如,标示为u9到u2)被放置在第二输出通道(例如,g)中,第三输入通道的数据值的八个最高有效位(例如,标示为v9到v2)被放置在第三输出通道(例如,r)中,并且来自每个输入通道的数据值的至少两个最低有效位被放置在第四输出通道(例如,a)中。因此,第四输出通道包括输入位中的六位。可以通过交织来自三个输入通道中的每个通道的两个最低有效位(例如,标示为y1、u1、v1、y0、u0、v0)来构造第四通道的六位数据值。在邻近像素值的最高有效位之间通常存在比在邻近像素值的最低有效位之间的空间相关性更高程度的空间相关性。因此,通过将最高有效位保持在相同的通道数据内(例如,三个输入通道的八个最高有效位形成三个相应的通道数据值),这些数据值中可能存在高度的空间相关性。与最低有效位被保持在相同的通道数据内相比,这导致更大的压缩。包括输入通道的最低有效位(y1、u1、v1、y0、u0、v0)的第四输出通道可能显示出比其他输出通道更少的空间相关性。可以如上所述处理前三个8位通道。然而,由于第四通道仅包括6位数据,因此处理稍有不同。重新格式化数据的处理块可以向另一输出通道中的数据的最低有效端添加(即,附加)两个零位以将数据填充到多达八位,使得可以使用上述被设计用于操作8位数据值的系统来处理它。将填充位添加到数据的最低有效部分意味着,每个(现在是8位的)值是4的倍数。每个数据值由位y1u1v1y0u0v000形成。此外,添加填充位意味着,数据值分布在0到255的范围内,例如,如图23a所示。由于每个可表示的数据值是4的倍数,因此可表示的数据值分布在0到255的范围内。这很有用,因为上面描述的空间解相关和空间重新相关函数涉及函数mod28,其取值的模256。通过向上填充6位数据值使得它们分布在0到255的范围内,不需要对被设计用于操作8位值的模数函数(其可以在空间解相关和空间重新相关函数的硬件功能中被设置)进行修改。注意,如果填充位被添加到6位数据值的最高有效部分,则8位数据值将被限制在0到63的范围内(即,从0到26),如图23b所示。取这些值的模256将不能提供良好的压缩。当对6位数据值执行空间解相关时,修改lpredict(如上面的等式3中所定义的),使得所得到的值的两个lsb保持为零。注意,由于所有6位数据值都是4的倍数,因此lpredict函数的结果是偶数,使得所得到的值的lsb(即,“位0”)为零。换言之,四的两倍的平均值是偶数。然而,第二最低有效位(“位1”)在上面定义的lpredict函数的结果中可以是1或0,因此进行修改使得位1为零。这可以通过简单地强制输出的“第1位”为零来实现。备选地,这可以通过在lpredict函数中移动“ceiling”运算符的输入和输出来实现。然后,该修改保证来自lpredict和哈尔函数的所得到的系数值也使其两个lsb为零。在解相关过程之后,空间解相关模块可以在“重新映射”阶段609之前执行2位带符号右移以减小值的范围,以进一步改善熵编码阶段中的压缩。例如,如果经空间解相关的数据值具有位x5x4x3x2x1x000,则执行2位带符号右移会产生x5x5x5x4x3x2x1x0。该移位将如图23a所示的数据值从0到255的范围内的4的倍数转换为如图23c所示的从-32(其等效于使用本文中描述的模256算术的无符号值224)到+31的范围内的整数值。这种格式的数据值非常适合于上述的重新映射阶段609,以产生将通过上述熵编码过程来有效压缩的值。在上述示例中,使用被布置为处理8位数据值的空间解相关模块和熵编码模块来压缩6位数据值。更一般地,可以提供一种使用被布置为处理n位数据值的空间解相关模块和被布置为处理n位数据值的熵编码模块来压缩m位数据值的方法(和数据压缩单元),其中m<n。该一般性方法包括:a.向m位数据值的最低有效端附加(n-m)位,从而形成n位数据值;b.使用空间解相关模块对n位数据值执行空间解相关过程,其涉及使用模2n函数;以及c.在所述空间解相关之后使用熵编码模块对数据值执行熵编码。可以提供处理块,其被配置为向m位数据值的最低有效端附加(n-m)位。根据该方法,模2n函数正确地操作以提供良好的空间解相关,即使输入数据值仅具有m位,其中m<n。例如,附加到m位数据值的最低有效端的(n-m)位可以是(n-m)个零。一般性方法还可以包括在所述空间解相关之后、但是在所述熵编码之前重新映射数据值,其中对经重新映射的数据值执行熵编码。一般性方法还可以包括在上述重新映射之前对经空间解相关的数据值执行(n-m)位的带符号右移。带符号右移向重新映射阶段提供数据值,其可以以与n位数据值相同的方式被重新映射(注意,压缩单元被布置用于压缩n位数据值),以提供可以通过熵编码模块有效编码的值。具体地,如上所述,可以根据空间解相关模块执行的空间解相关过程来配置重新映射,使得经重新映射的数据值具有特定幅度的可能性针对较大的幅度而降低。在本文中描述的示例中,经重新映射的数据值是无符号整数格式,并且是无符号的,具有偏向零的分布。此外,空间解相关模块可以被配置为使得经空间解相关的数据值的(n-m)个最低有效位是零。这样,(n-m)位的有符号右移会丢失零而不是一。可以应用对应的解压缩过程来解压缩经压缩的数据值,以使用被设计为对n位数据值执行操作的硬件来确定m位经解压缩的数据值(例如,其中m=6和/或n=8)。具体地,提供了一种用于解压缩经压缩的数据值以确定m位经解压缩的数据值的方法(和数据解压缩单元),其中该方法包括:a.在熵解码模块处对经熵编码的数据值执行熵解码,熵解码模块被布置为生成n位经熵解码的数据值,其中m<n;以及b.在空间重新相关模块处,在所述熵解码之后对n位数据值执行空间重新相关,其涉及使用模2n函数;c.其中m位经解压缩的数据值由n位经空间重新相关的数据值的m个最高有效位表示。该方法还可以包括从n位经空间重新相关的数据值的最低有效端移除(n-m)位,从而形成m位经解压缩的数据值。这可以通过替换上述颜色重新相关块的处理块来完成。空间重新相关模块可以被配置为在执行所述空间重新相关之前将取消映射过程应用于n位数据值。此外,空间重新相关模块可以被配置为在所述空间重新相关之前对经取消映射的数据值应用(n-m)位的左移。可以将经移位的数据值的(n-m)个最低有效位设置为对于每个数据值都相同(例如,全部设置为零),使得经移位的数据值在0到2n-1的范围内均匀分布。例如,m可以是6并且n可以是8,使得(n-m)是2,并且使得2n-1是255。参考上述yuv示例,6位经解压缩的数据值被包括在一个通道中,并且存在具有8位的经解压缩的数据值的三个其他通道。(例如,通过替换颜色重新相关块的处理块)重新格式化通道中的数据值以表示10:10:10格式的、具有三个输出数据通道的yuv数据值。8位经解压缩的数据值被放入三个输出数据通道的10位数据值的8个最高有效位位置;并且每个6位数据值均被分成三个2位部分,其中2位部分被放入相应的三个输出数据通道的10位数据值的两个最低有效位的位置中。如上所述,6位数据值中的位可以从三个不同的yuv通道交织,因此可以使用解交织过程从6位数据值向正确的yuv通道分配正确的经解压缩的位。可以输出经解压缩的数据值。不同的块大小/形状在上述示例中,块是8×8块。然而,在不同的示例中,可以使用不同大小/形状的块,诸如8×4、16×4、32×2和16×16块。这里,我们描述了如何微小修改以上针对8×8块描述的系统来允许系统处理16×4和32×2块。一般地,提供了一种用于使用空间解相关模块对j×k输入数据值块执行空间解相关的方法(和数据压缩单元),空间解相关模块被布置为处理g×h数据值块(其中块具有g列和h行,例如,8×8数据块,其中g=h=8),其中输入数据值块中的列数j是g的倍数,并且其中j×k=g×h。该方法包括:a.通过以下操作将输入数据值块重新集合织成g×h数据值块(例如,8×8块):(i)将输入块的每一行划分为多个分段,其中每个分段包括g个数据值,以及(ii)将这些分段布置成h行以形成g×h数据值块;以及b.对g×h数据值块执行空间解相关,其中g×h数据值块的行按顺序处理(例如,迭代地),使得对于输入数据值块的每一行,该行的第一分段在比该行的第二分段被处理的迭代更早的迭代中被处理,其中第一分段在该行中位于第二分段右侧,并且其中第一分段中的至少一个值被保存以在第二分段的空间解相关中使用。在本文中描述的示例中,g=h=8,使得系统被布置为处理8×8块,但是在其他示例中,可以处理不同大小/形状的块。例如,在一些其他示例中,g=h=4,使得系统被布置为处理4×4块。在其他示例中,块可以是矩形的,即,g≠h,例如,g=8,h=4。例如,输入数据块可以是16×4数据块(即,j=16列并且k=4行),使得(其中g=h=8)输入块的每一行被分成两个分段。作为另一示例,输入数据块可以是32×2数据块(即,j=32并且k=2),使得输入块的每一行被分成四个分段。如下面参考16×4和32×2示例更详细地描述的,来自第一分段的列a的数据值可以被保存,并且被用于使用利用使用两个参考值的线性预测方法来计算第二分段的列e、g和h中的经空间解相关的数据值。此外,来自第一分段的列a的数据值可以被用于使用利用一个参考值的哈尔预测方法来计算第二分段的列a中的经空间解相关的数据值。经空间解相关的数据值可以从空间解相关模块输出,并且例如被提供给熵编码模块以进行熵编码。空间解相关模块可以被配置为在所述空间解相关之后、但是在向熵编码模块提供经空间解相关的数据值之前重新映射数据值,使得对经重新映射的数据值执行熵编码。如上所述,经重新映射的数据值可以是无符号的,具有偏向零的分布。注意,在这些压缩示例中,j>g,(即,源块比目标块宽)。然而,如果引入预处理阶段以转置/旋转输入块,使得输入块的行变为列,反之亦然,则输入块(其中j<g)可以由同一系统处理。可以如本文中的示例中所述的来处理经转置的块(其具有j>g)。此外,提供了一种对g×h输入数据值块(例如,8×8的输入数据值块,其中g=h=8)执行空间重新相关,并且输出经空间重新相关的j×k输出数据值块的方法(和数据解压缩单元),其中输出数据值块中的列数j是g的倍数,其中j×k=g×h,并且其中j≠g。该方法包括:a.对g×h输入数据值块执行空间重新相关,其中g×h输入数据值块的行对应于j×k输出数据值块的行的分段,并且其中输入数据值块的行迭代地按顺序处理,使得与输出块的特定行的第一分段相对应的输入数据值块的第一行在比与输出块的特定行的第二分段相对应的输入数据值块的第二行被处理的迭代更早的迭代中被处理,其中第一分段在输出块的特定行中位于第二分段右侧,并且其中来自输入数据值块的第一行的至少一个值被保存,以在输入数据值块的第二行的空间重新相关中使用;b.通过将经空间重新相关的数据值的行布置到输出块的k行中的其对应分段中,将经空间重新相关的数据值重新组织成经空间重新相关的j×k输出数据值块;以及c.输出经空间重新相关的j×k输出数据值块。如上所述,在本文中描述的示例中,g=h=8,但是在其他示例中,g和h可以采用不同的值。在16×4块示例中,j=16并且k=4,使得(其中g=h=8)输出块的每一行包括两个分段。在32×2块示例中,j=32并且k=2,使得输出块的每一行包括四个分段。来自输入块的第一行的列a的数据值可以被保存,并且被用于基于使用两个参考值的线性预测方法来计算输入块的第二行的列e、g和h中的经空间重新相关的数据值。此外,来自输入块的第一行的列a的数据值可以被用于基于使用一个参考值的哈尔预测方法来计算输入块的第二行的列a中的经空间重新相关的数据值。如在上述示例中,可以在空间重新相关模块处、从已经对输入数据块的数据值应用了熵解码的熵解码模块接收输入数据块的数据值。注意,在这些解压缩示例中,j>g,(即,输出块比输入块宽)。然而,如果引入后处理阶段以转置/旋转输出块,使得输出块的行变为列,反之亦然,则输出块(其中j<g)可以由同一系统处理。输出块(其具有j>g)可以如本文中的示例中所描述的来生成,并且然后被转置到具有j<g的输出块中。图24中示出了16×4块的示例,其中输入数据被重新组织为8×8布置。应当注意,在其他实施例中,可以实现不同的重新组织。重新组织在空间解相关之前执行。重新组织由处理逻辑执行,处理逻辑可以被包括在空间解相关模块中或者在单独的单元中,在数据压缩单元的管线操作中,该单独的单元在空间解相关模块之前操作。在图24所示的示例中,16×4块的右半部分在逻辑上被寻址为前四行,而左半部分被寻址为后些行。这个重新组织的8×8块可以以与上述8×8块非常类似的方式进行处理,除了可以基于我们知道左行相邻于对应右行而定位的这一事实来对空间解相关/空间重新相关进行一些修改,以改善压缩结果。以这种方式,该系统旨在利用块中的像素之间的可能的空间相干性。右行的空间解相关在左行的空间解相关之前执行。右行的空间解相关以与以上针对标准8×8块的前四行所描述的相同的方式执行。然而,右行的列a的值被保存(例如,在寄存器中),以用于在左行的空间解相关中使用。对于左行,列b、c、d和f中的数据值被空间解相关,如上面关于标准8×8块所描述的。然而,左行的列e、g和h中的数据值不再仅使用哈尔小波(即,其中仅存在一个(重复的)参考值的小波)来计算,而是使用如上所述使用两个参考值的线性预测方法来计算。参考值之一是如以上关于哈尔预测所述的原始参考值,但是现在,如图25所示,参考中的另一个是来自对应的右行的列a的数据值。此外,还使用哈尔预测使左行的列a依赖于对应的右行的列a。可以将多路复用器添加到图6所示的空间解相关硬件,以允许基于当前正在处理的是左行还是右行来向a、e、g和h管线提供不同的输入。垂直处理顺序由图26所示的行依赖性确定。图26中的实线示出了标准依赖性(类似于图10所示的那些)。图26中的虚线示出左行对其对应右行的依赖性。对对应右行的依赖性在解码器中比在编码器中更重要,但是为了清楚起见,假定编码器和解码器将使用相同的行处理顺序。图26中的虚线示出了处理行的顺序。用于16×4块的行顺序与上述用于8×8块的空间解相关的行顺序相同。但是,执行的一些操作与上述8×8块略有不同。具体而言,现在使用哈尔预测而不是线性预测来预测行2和行3;并且不再使用哈尔或线性预测来预测行4。根据对空间解相关进行的修改来修改空间重新相关。16×4块的熵编码和解码以与上述8×8块相同的方式操作。图28中示出了32×2块的示例,其中输入数据被重新组织为8×8布置。应当注意,在其他实施例中,可以实现不同的重新组织。在这个示例中,每行32个数据值被分成四个分段,在图28中标记为s、t、u和v,每个分段具有8个数据值。32×2块的第一行的四个分段(s0、t0、u0和v0)在逻辑上被寻址为8×8块的前四行。32×2块的第二行的四个分段(s1、t1、u1和v1)在逻辑上被寻址为8×8块的后四行。该经重新组织的8×8块可以以与上述8×8块非常类似的方式进行处理,除了可以基于我们知道在原始32×2块中不同分段的定位的这一事实来对空间解相关/空间重新相关进行一些修改,以改善压缩结果。以这种方式,该系统旨在利用块中的像素之间的可能的空间相干性。行的空间解相关是以从右到左的分段来执行的,例如,按照v、u、t并且然后s的顺序。v分段的空间解相关以与上述标准8×8块的行相同的方式执行。然而,v分段的列a的值被保存(例如,在寄存器中),以用于在同一行的u分段的空间解相关中使用。u、t和s分段的空间解相关以与上述16×4块的左行相同的方式执行。对于u分段,列b、c、d和f中的数据值如上面关于标准8×8块所述的来被空间解相关。然而,u分段的列e、g和h中的数据值不再用哈尔预测来计算,而是用使用利用两个参考值的线性预测来计算。其中一个参考值是如以上关于哈尔预测所描述的原始参考值,但是现在,如图29所示,另一参考是来自对应行的v分段的a列的数据值。此外,使用哈尔预测,使u分段的列a依赖于对应行的v分段的列a。保存u分段的列a的值(例如,在寄存器中),以在同一行的t分段的空间解相关中使用。对于t分段,列b、c、d和f中的数据值如上面关于标准8×8块所述的来被空间解相关。然而,t分段的列e、g和h中的数据值不再用哈尔预测来计算,而是使用利用两个参考值的线性预测来计算。其中一个参考值是如以上关于哈尔预测所描述的原始参考值,但是现在,如图29所示,另一参考是来自对应行的u分段的a列的数据值。此外,使用哈尔预测,使t分段的列a依赖于对应行的u分段的列a。保存t分段的列a的值(例如,在寄存器中),以在同一行的s分段的空间解相关中使用。对于s分段,列b、c、d和f中的数据值如上面关于标准8×8块所述的来被空间解相关。然而,u分段的列e、g和h中的数据值不再用哈尔预测来计算,而是用使用两个参考值的线性预测来计算。其中一个参考值是如以上关于哈尔预测所描述的原始参考值,但是现在,如图29所示,另一参考是来自对应行的t分段的a列的数据值。此外,使用哈尔预测,使s分段的列a依赖于对应行的t分段的列a。可以将多路复用器添加到图6所示的空间解相关硬件,以允许基于当前正在处理的是v分段还是s、t或u分段之一来向a、e、g和h管线提供不同的输入。垂直处理顺序由图30所示的行依赖性确定。图30中的实线示出了标准依赖性(类似于图10所示的那些)。图30中的虚线示出了各分段对相应的行的其他分段的依赖性。行的各分段之间的依赖性在解码器中比在编码器中更重要,但是为了清楚起见,假定编码器和解码器将使用相同的行处理顺序。图30中的虚线示出了处理经重新组织的块的行的顺序。图30所示的、用于处理32×2块的行的行顺序与上述用于16×4块和8×8块的顺序不同。但是,由于32×2块的依赖性较少(与上述8×8或16×4块相比),因此选择行处理顺序的自由度更大。图31示出了寄存器的内容以及空间解相关模块的第二阶段中的处理单元的左、中和右输入的值。在这种情况下,行0、1、2和3不使用哈尔或线性预测来预测;并且行4、5、6和7使用哈尔预测来预测。这些行都不使用线性预测进行预测。根据对空间解相关进行的修改来修改空间重新相关。32×2块的熵编码和解码以与上述8×8块相同的方式操作。应当注意,数据块的“行”和“列”的以上描述不是限制性的,在其他示例中,可以如上述示例中处理行一样来处理数据块的列,并且可以如上述示例中处理列一样来处理数据块的行。组件(例如,数据压缩单元、数据解压缩单元、空间解相关模块、熵编码模块、空间重新相关模块和熵解码模块)在附图中示出并且在本文中描述为包括多个功能块。这仅是示意性的,并非旨在定义这样的实体的不同逻辑元件之间的严格划分。每个功能块可以以任何合适的方式提供。应当理解,本文中描述为由组件形成的中间值不需要由组件在任何点物理地生成,并且可以仅表示方便地描述组件在其输入与输出之间执行的处理的逻辑值。本文中描述的组件(例如,数据压缩单元、数据解压缩单元、空间解相关模块、熵编码模块、空间重新相关模块和熵解码模块)可以以硬件在集成电路上实现。本文中描述的组件可以被配置为执行本文中描述的任何方法。通常,上述任何功能、方法、技术或组件可以用软件、固件、硬件(例如,固定逻辑电路)或其任何组合而被实现。本文中可以使用术语“模块”、“功能”、“组件”、“元件”、“单元”、“块”和“逻辑”来概括地表示软件、固件、硬件或其任何组合。在软件实现方式的情况下,模块、功能、组件、元件、单元、块或逻辑表示当在处理器上执行时执行指定任务的程序代码。本文中描述的算法和方法可以由一个或多个处理器执行使得处理器执行算法/方法的代码来执行。计算机可读存储介质的示例包括随机存取存储器(ram)、只读存储器(rom)、光盘、闪存、硬盘存储器、以及可以使用磁性、光学和存储指令或其他数据的其他技术并且可以由机器访问的其他存储器设备。本文中使用的术语计算机程序代码和计算机可读指令是指用于处理器的任何种类的可执行代码,包括以机器语言、解释语言或脚本语言表示的代码。可执行代码包括二进制代码、机器代码、字节代码、定义集成电路的代码(诸如硬件描述语言或网表)、以及用诸如c、java或opencl等编程语言代码表示的代码。可执行代码可以是例如任何类型的软件、固件、脚本、模块或库,其当在虚拟机或其他软件环境处适当地执行、处理、解释、编译、执行时使得支持可执行代码的计算机系统的处理器执行由代码指定的任务。处理器、计算机或计算机系统可以是任何种类的设备、机器或专用电路、或其集合或部分,其具有处理能力使得它可以执行指令。处理器可以是任何种类的通用或专用处理器,诸如cpu、gpu、片上系统、状态机、媒体处理器、专用集成电路(asic)、可编程逻辑阵列、现场可编程门阵列(fpga)等。计算机或计算机系统可以包括一个或多个处理器。还旨在包括定义如本文所述的硬件配置的软件,诸如hdl(硬件描述语言)软件,其用于设计集成电路或用于配置可编程芯片以执行所需功能。也就是说,可以提供一种计算机可读存储介质,其上编码有集成电路定义数据集形式的计算机可读程序代码,计算机可读程序代码当在集成电路制造系统中处理(即,运行)时将该系统配置为制造被配置为执行本文中描述的任何方法的组件,或者制造包括本文中描述的任何装置的组件。集成电路定义数据集可以是例如集成电路描述。因此,可以提供一种在集成电路制造系统中制造如本文所述的组件的方法。此外,可以提供一种集成电路定义数据集,其当在集成电路制造系统中处理时使得制造组件的方法被执行。集成电路定义数据集可以是计算机代码的形式,例如作为网表,用于配置可编程芯片的代码,作为在任何级别定义适于以集成电路制造的硬件的硬件描述语言,包括作为寄存器传输级别(rtl)代码,作为高级电路表示,诸如verilog或vhdl,以及低级电路表示,诸如oasis(rtm)和gdsii。逻辑上定义适于以集成电路(诸如rtl)制造的硬件的更高级表示可以在计算机系统中处理,计算机系统被配置用于在软件环境的上下文中生成集成电路的制造定义,软件环境包括电路元件的定义和用于组合这些元件以便生成由表示定义的集成电路的制造定义的规则。软件在计算机系统中执行以便定义机器通常就是这样,可能需要一个或多个中间用户步骤(例如,提供命令、变量等),以便被配置用于生成集成电路的制造定义的计算机系统执行定义集成电路的代码以便生成该集成电路的制造定义。现在将参考图32描述在集成电路制造系统中处理集成电路定义数据集以便将系统配置为制造组件(例如,数据压缩单元、数据解压缩单元、空间解相关模块、熵编码模块、空间重新相关模块或熵解码模块)的示例。图32示出了被配置为制造如本文中的任一示例中所描述的组件的集成电路(ic)制造系统3202的示例。特别地,ic制造系统3202包括布局处理系统3204和集成电路生成系统3206。ic制造系统3202被配置为接收ic定义数据集(例如,定义如本文中的任一示例中描述的组件),处理ic定义数据集,并且根据ic定义数据集生成ic(例如,其实施如本文中的任一示例中描述的组件)。ic定义数据集的处理将ic制造系统3202配置为制造实施如本文中的任一示例中描述的组件的集成电路。布局处理系统3204被配置为接收和处理ic定义数据集以确定电路布局。从ic定义数据集确定电路布局的方法在本领域中是已知的,并且例如可以涉及合成rtl代码以确定要被生成的电路的门级表示,例如,在逻辑组件方面(例如,nand、nor、and、or、mux和flip-flop组件)。通过确定逻辑组件的位置信息,可以从电路的门级表示确定电路布局。这可以自动进行或者在用户参与下被进行,以便优化电路布局。当布局处理系统3204确定了电路布局时,它可以将电路布局定义输出到ic生成系统3206。电路布局定义可以是例如电路布局描述。如本领域中已知的,ic生成系统3206根据电路布局定义生成ic。例如,ic生成系统3206可以实现半导体器件制造工艺以生成ic,其可以涉及光刻和化学处理步骤的多步骤序列,在此期间,在由半导体材料制成的晶片上逐渐形成电子电路。电路布局定义可以是掩模的形式,其可以用于光刻工艺中,用于根据电路定义生成ic。或者,提供给ic生成系统3206的电路布局定义可以是计算机可读代码的形式,ic生成系统3206可以使用该计算机可读代码来形成用于生成ic的合适的掩模。由ic制造系统3202执行的不同过程可以全部在一个位置中被实现,例如,由一方。或者,ic制造系统3202可以是分布式系统,从而使得一些过程可以在不同位置执行,并且可以由不同方执行。例如,以下的一些阶段可以在不同的位置和/或由不同的方来执行:(i)合成表示ic定义数据集的rtl代码以形成要生成的电路的门级表示,(ii)基于门级表示来生成电路布局,(iii)根据电路布局来形成掩模,以及(iv)使用掩模制造集成电路。在其他示例中,集成电路制造系统处的集成电路定义数据集的处理可以将系统配置为制造组件,而不对ic定义数据集进行处理以便确定电路布局。例如,集成电路定义数据集可以定义可重新配置的处理器(诸如fpga)的配置,并且该数据集的处理可以将ic制造系统配置为生成具有该定义的配置的可重新配置的处理器(例如,通过将配置数据加载到fpga)。在一些实施例中,当在集成电路制造系统中处理时,集成电路制造定义数据集可以使得集成电路制造系统生成如本文所述的设备。例如,通过集成电路制造定义数据集以上面参考图32描述的方式配置集成电路制造系统可以使得制造如本文所述的设备。在一些示例中,集成电路定义数据集可以包括在数据集处定义的硬件上运行的软件,或者与在数据集处定义的硬件组合运行的软件。在图32所示的示例中,ic生成系统还可以由集成电路定义数据集配置为在制造集成电路时根据在集成电路定义数据集处定义的程序代码将固件加载到该集成电路上或者以其他方式提供带有集成电路的程序代码用于与集成电路一起使用。与已知实现方式相比,本申请中阐述的设备、装置、模块和/或系统中(以及本文中实现的方法中)阐述的概念的实现方式可以使得性能改进。性能改进可以包括增加的计算性能、减少的延时、增加的吞吐量和/或降低的功耗中的一种或多种。在制造这样的设备、装置、模块和系统(例如,集成电路)期间,性能改进可以与物理实现方式相抵消,从而改进了制造方法。例如,可以用布局区域换取性能改进,从而匹配已知实现方式的性能但使用较少的硅。例如,这可以通过以串行方式重用功能块或在设备、装置、模块和/或系统的元件之间共享功能块来进行。相反,可以用本申请中提出的使得设备、装置、模块和系统的物理实现方式中的改进(例如,减小的硅面积)的概念换取性能改进。例如,这可以通过在预定义区域预算内制造模块的多个实例来完成。申请人由此独立地公开了本文所述的每个单独的特征以及两个或更多个这样的特征的任何组合,只要这些特征或组合能够鉴于本领域技术人员的公知常识基于本说明书作为整体执行,而不管这样的特征或特征组合是否解决了本文中公开的任何问题。鉴于前面的描述,对于本领域技术人员很清楚的是,可以在本发明的范围内进行各种修改。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1