首页 / 专利库 / 多媒体工具与应用 / 有损压缩 / 有保证的数据压缩

有保证的数据压缩

阅读:662发布:2020-05-13

专利汇可以提供有保证的数据压缩专利检索,专利查询,专利分析的服务。并且描述了用于压缩数据的有损方法和 硬件 以及相应的解压缩方法和硬件。所述 有损压缩 方法包括将一个 像素 块 分成多个子块,然后针对每个子块进行分析,并选择一组候选有损压缩模式中的一种模式。所述分析可以例如基于所述子块中所述像素的α值。在各种示例中,所述一组候选有损压缩模式包括针对所述子块中的所有像素使用固定α通道值的至少一种模式,以及对可变α通道值进行编码的一种或多种模式。,下面是有保证的数据压缩专利的具体信息内容。

1.一种有损压缩数据的方法,包括:
将一个像素分成多个子块;以及
对于每个子块:
分析所述子块中每个像素的α通道值,以从一组候选有损压缩模式中选择一种有损压缩模式,其中所述一组候选有损压缩模式包括两种或更多种有损压缩模式,包括针对所述子块中的所有像素使用固定α通道值的至少一种压缩模式;以及
使用所选的有损压缩模式来压缩所述子块。
2.根据权利要求1所述的方法,其中分析所述子块中的每个像素的α通道值以从一组候选有损压缩模式中选择一种有损压缩模式包括:
根据所述子块中所有所述像素的所述α通道值来确定最小α通道值和最大α通道值;
响应于确定所述最大α通道值和所述最小α通道值之间的差大于某一差值,选择对所述子块中的所述像素使用可变α通道值的压缩模式;以及
响应于确定所述最大α通道值和所述最小α通道值之间的所述差不大于所述差值,选择对所述子块中的所有像素使用固定α通道值的压缩模式,并确定所述固定α通道值。
3.根据权利要求2所述的方法,其中所述差值是最大误差值。
4.根据权利要求2所述的方法,其中确定所述固定α通道值包括:
响应于确定所述最大α通道值是最大可能值,将所述固定α通道值设置为等于所述最大α通道值;
响应于确定所述最小α通道值为零,将所述固定α通道值设置为等于零;以及响应于确定所述最大α通道值不是最大可能值并且所述最小α通道值不为零两者,将所述固定α通道值设置为等于所述子块中的所有像素的所述α通道值的平均值。
5.根据权利要求2所述的方法,其中使用所选的有损压缩模式来压缩所述子块包括,对于针对所述子块中的所有像素使用固定α通道值的压缩模式:
对于所述子块中的每个所述像素,将红色通道值、绿色通道值和蓝色通道值中的每一个从8比特转换为5比特;以及
将所述子块中的所述像素的所述5比特红色、绿色和蓝色通道值以及所述固定α通道值打包在一起,以形成所述子块的压缩数据。
6.根据权利要求2所述的方法,其中使用所选的有损压缩模式来压缩所述子块包括,对于针对所述子块中的所述像素使用可变α通道值的压缩模式:
将所述子块细分为多个迷你块;
对于每个所述迷你块:
计算所述迷你块中每个像素对的色差值;
将最小的色差值与阈值进行比较;以及
响应于确定所述最小的色差值超过所述阈值,将所述迷你块中的每个像素的像素数据从第一格式转换为包括比所述第一格式少的比特数的第二格式;以及
响应于确定所述最小的所述色差值没有超过所述阈值,基于所述色差值,选择多种编码模式中的一种,为所选的编码模式确定两个或三个像素值,向所述迷你块中的每个像素分配所述像素值之一,并将所述像素值从所述第一格式转换为包括比所述第一格式少的比特数的第三格式。
7.根据权利要求2所述的方法,其中使用所选的有损压缩模式来压缩所述子块包括,对于针对所述子块中的所有像素使用固定α通道值的压缩模式:
将所述子块细分为多个迷你块;
对于每个所述迷你块:
计算所述迷你块中每个像素对的色差值;
将最小的色差值与阈值进行比较;以及
响应于确定所述最小的色差值超过所述阈值,将所述迷你块中的每个像素的像素数据从第一格式转换为包括比所述第一格式少的比特数的第二格式;以及
响应于确定所述最小的色差值没有超过所述阈值,基于所述色差值,选择多种编码模式中的一种,为所选的编码模式确定两个或三个像素值,向所述迷你块中的每个像素分配所述像素值之一,并将所述像素值从所述第一格式转换为包括比所述第一格式少的比特数的第三格式。
8.根据权利要求6所述的方法,其中基于所述色差值来选择多种编码模式中的一种,为所选的编码模式确定两个或三个像素值,向所述迷你块中的每个像素分配所述像素值之一,并将所述像素值从所述第一格式转换为包括比所述第一格式少的比特数的第三格式包括:
标识所述迷你块中的具有最小色差的像素对(908),将所述像素对表示为单个新像素值和标识所述像素对的像素图案代码,并将所述单个新像素值的像素数据以及所述迷你块中的除了所标识的像素对之外的每个其他像素的像素数据从所述第一格式转换为包括比所述第一格式少的比特数的第三格式。
9.一种数据解压缩方法,包括:
从压缩数据块解包数据以生成多个子块的压缩数据;
对于每个子块:
从所述压缩数据块内的块模式字段标识压缩模式,其中所述压缩模式是一组候选有损压缩模式中的一种模式,所述一组候选有损压缩模式包括两种或更多种有损压缩模式,包括针对所述子块中的所有像素使用固定α通道值的至少一种压缩模式;以及使用与所选的压缩模式相对应的解压缩模式来对所述子块进行解压缩。
10.一种数据压缩单元,包括:
硬件逻辑,其被布置为将一个像素块分成多个子块;
硬件逻辑,其被布置为,对于每个子块,分析所述子块中每个像素的α通道值,以从一组候选有损压缩模式中选择一种有损压缩模式,其中所述一组候选有损压缩模式包括两种或更多种有损压缩模式,包括针对所述子块中的所有像素使用固定α通道值的至少一种压缩模式;以及
数据压缩元件,其被布置为使用所选的有损压缩模式来压缩所述子块。
11.一种数据解压缩单元,包括:
硬件逻辑,其被布置为从压缩数据块解包数据以生成多个子块的压缩数据;
硬件逻辑,其被布置为,对于每个子块,从所述压缩数据块内的块模式字段标识压缩模式,其中所述压缩模式是一组候选有损压缩模式中的一种模式,所述一组候选有损压缩模式包括两种或更多种有损压缩模式,包括针对所述子块中的所有像素使用固定α通道值的至少一种压缩模式;以及
数据解压缩元件,其被布置为使用与所选的有损压缩模式相对应的解压缩模式来解压缩所述子块。
12.一种数据压缩单元,其被配置为执行根据权利要求1-8中任一项所述的方法。
13.根据权利要求12所述的数据压缩单元,其中所述数据压缩单元在集成电路上的硬件中实现。
14.一种计算机可读代码,其被配置为在运行所述代码时导致根据权利要求1-9中任一项所述的方法被执行。
15.一种计算机可读存储介质,其上编码有根据权利要求14所述的计算机可读代码。
16.一种制造方法,其使用集成电路制造系统来制造根据权利要求12所述的数据压缩单元。
17.一种集成电路定义数据集,当在集成电路制造系统中被处理时,所述集成电路定义数据集将所述集成电路制造系统配置为制造根据权利要求12所述的数据压缩单元。
18.一种非暂时性计算机可读存储介质,其上存储有集成电路的计算机可读描述,当在集成电路制造系统中被处理时,所述计算机可读描述使所述集成电路制造系统制造根据权利要求12所述的数据压缩单元。
19.一种集成电路制造系统,其被配置为制造根据权利要求12所述的数据压缩单元。
20.一种集成电路制造系统,包括:
非暂时性计算机可读存储介质,其上存储有集成电路的计算机可读描述,所述计算机可读描述对根据权利要求12所述的数据压缩单元进行描述;
布局处理系统,其被配置为处理所述集成电路描述,以便生成体现所述数据压缩单元的集成电路的电路布局描述;以及
集成电路生成系统,其被配置为根据所述电路布局描述来制造所述数据压缩单元。

说明书全文

有保证的数据压缩

背景技术

[0001] 数据压缩,无论是无损的还是有损的,在许多应用中都是人们所期望的,其中数据将被存储在存储器中和/或从存储器中读取。通过在将数据存储在存储器中之前压缩数据,可以减少传输到存储器的数据量。数据压缩对其而言特别有用的数据的示例是图像数据,诸如要存储在深度缓冲器中的深度数据,要存储在缓冲器中的像素数据和要存储在纹理缓冲器中的纹理数据。这些缓冲器可以是任何合适类型的存储器,例如高速缓冲存储器、单独的存储器子系统、共享存储器系统中的存储区域或它们的某种组合。
[0002] 图形处理单元(GPU)可以用于处理图像数据,以便确定要存储在帧缓冲器中的图像的像素值,以输出到显示器。GPU通常具有高度并行化的结构,用于并行处理大数据。要想使GPU(特别是那些打算在移动设备上实现的 GPU)以较低的功率平运行,存在着巨大的商业压。与此相悖的是,希望在更快的GPU上使用更高质量渲染算法,因而对相对有限的资源(存储器带宽)造成了压力。然而,增大存储器子系统的带宽可能不是有吸引力的解决方案,因为将数据移入和移出GPU,甚至在GPU内移动数据,会消耗GPU的大部分功率预算。对于其他处理单元,例如中央处理单元(CPU) 以及GPU,可能面临着相同的问题。
[0003] 下面描述的实施方案仅以举例的方式提供,而不构成对解决已知数据压缩方法的任何或所有缺点的实现方式的限制。发明内容
[0004] 提供本发明内容是为了以简化的形式介绍一些概念,这些概念将在下面的具体实施方式中进一步描述。本发明内容不旨在标识所要求保护的主题的关键特征或必要特征,也不旨在用于限制所要求保护的主题的范围。
[0005] 描述了用于压缩数据的有损方法和硬件以及相应的解压缩方法和硬件。有损压缩方法包括将一个像素块分成多个子块,然后针对每个子块进行分析,并选择一组候选有损压缩模式中的一种模式。分析可以例如基于子块中像素的α值。在各种示例中,所述一组候选有损压缩模式包括针对子块中的所有像素使用固定α通道值的至少一种模式,以及对可变α通道值进行编码的一种或多种模式。
[0006] 第一方面提供了一种压缩数据的有损方法,包括:将一个像素块分成多个子块;并且对于每个子块:分析子块中每个像素的α通道值,以从一组候选有损压缩模式中选择一种有损压缩模式,其中该组候选有损压缩模式包括两种或更多种有损压缩模式,包括针对子块中的所有像素使用固定α通道值的至少一种压缩模式;以及使用所选的有损压缩模式来压缩子块。
[0007] 第二方面提供了一种数据解压缩方法,包括:从压缩数据块解包数据,以生成多个子块的压缩数据;对于每个子块:从压缩数据块内的块模式字段标识压缩模式,其中压缩模式是一组候选有损压缩模式中的一种模式,该组候选有损压缩模式包括两种或更多种有损压缩模式,包括针对子块中的所有像素使用固定α通道值的至少一种压缩模式;以及使用与所选的压缩模式相对应的解压缩模式来对子块进行解压缩。
[0008] 第三方面提供了一种数据压缩单元,包括:硬件逻辑,其被布置为将一个像素块分成多个子块;硬件逻辑,其被布置为对于每个子块,分析子块中每个像素的α通道值,以从一组候选有损压缩模式中选择一种有损压缩模式,其中该组候选有损压缩模式包括两种或者更多种有损压缩模式,包括针对子块中的所有像素使用固定α通道值的至少一种压缩模式;以及数据压缩元件,其被布置为使用所选的有损压缩模式来压缩子块。
[0009] 第四方面提供了一种数据解压缩单元,包括:硬件逻辑,其被布置为从压缩数据块解包数据,以生成多个子块的压缩数据;硬件逻辑,其被布置为对于每个子块,从压缩数据块内的块模式字段标识压缩模式,其中压缩模式是一组候选有损压缩模式中的一种模式,该组候选有损压缩模式包括两种或者更多种有损压缩模式,包括针对子块中的所有像素使用固定α通道值的至少一种压缩模式;以及数据解压缩元件,其被布置为使用与所选的有损压缩模式对应的解压缩模式来对子块进行解压缩。
[0010] 如本文所述的数据压缩和/或解压缩单元可以在集成电路上的硬件中实现。可以提供一种在集成电路制造系统中制造如本文所述的数据压缩和/或解压缩单元的方法。可以提供集成电路定义数据集,当在集成电路制造系统中被处理时,该集成电路定义数据集将系统配置为制造如本文所述的数据压缩和/或解压缩单元。可以提供一种非暂时性计算机可读存储介质,其上存储有集成电路的计算机可读描述,当被处理时,该计算机可读描述使得布局处理系统生成在集成电路制造系统中使用的电路布局描述以制造如本文所述的数据压缩和/或解压缩单元。
[0011] 可以提供一种集成电路制造系统,包括:非暂时性计算机可读存储介质,其上存储有计算机可读集成电路描述,其描述了如本文所述的数据压缩和/ 或解压缩单元;布局处理系统,其被配置为处理集成电路描述,以便生成体现如本文所述的数据压缩和/或解压缩单元的集成电路的电路布局描述;以及集成电路生成系统,其被配置为根据电路布局描述来制造如本文所述的数据压缩和/或解压缩单元。
[0012] 可以提供用于执行如本文所述的任何方法的计算机程序代码。可以提供其上存储有计算机可读指令的非暂时性计算机可读存储介质,当在计算机系统处执行时,所述计算机可读指令使计算机系统执行如本文所述的任何方法。
[0013] 上述特征可以视情况加以组合,如对技术人员显而易见的那样,并且可以与如本文所述的示例的任何方面组合。附图说明
[0014] 现在将参考附图来详细描述示例,其中:
[0015] 图1示出了图形渲染系统;
[0016] 图2A、2B和2C示出了三种不同的数据压缩体系结构;
[0017] 图3A是示例有损数据压缩方法的流程图
[0018] 图3B是数据解压缩方法的流程图,该方法可用于解压缩使用图3A的方法压缩的数据;
[0019] 图4A和4B是示出了不同数据块及其细分为子块的示意图;
[0020] 图4C是示出了示例压缩数据块的示意图;
[0021] 图5A和5B示出了图3A的方法的分析阶段的两种不同示例实现方式;
[0022] 图6A是使用图3A的恒定α模式来压缩子块的第一示例方法的流程图;
[0023] 图6B、6C和6D是示出了将压缩值打包到一个数据块中的两种不同方式的示意图;
[0024] 图7A是使用图3A的恒定α模式来压缩子块的第二示例方法的流程图;
[0025] 图7B是示出了在图7A的方法中如何将一个子块中的像素分成两个子集的示例的示意图;
[0026] 图8A是使用图3A的可变α模式来压缩子块的第一示例方法的流程图;
[0027] 图8B是示出了图8A的方法的一部分的示意图;
[0028] 图9是使用图3A的可变α模式来压缩子块的第二示例方法的流程图;
[0029] 图10A是示出了可以在图9的方法中使用的编码图案的示意图;
[0030] 图10B和10C是示出了将迷你块的压缩数据打包到数据字段中的两种不同方式的示意图;
[0031] 图10D是示出了可以在图9的方法中使用的两种另外的编码图案的示意图;
[0032] 图11是使用恒定α模式来压缩子块的另一示例方法的流程图;
[0033] 图12A是将n比特数转换为m比特数的方法的流程图,其中n>m;
[0034] 图12B是图12A的方法的硬件实现方式的示意图;
[0035] 图13A是将n比特数转换为m比特数的方法的流程图,其中n<m;
[0036] 图13B是图13A的方法的硬件实现方式的示意图;
[0037] 图13C和13D是示出了图13A的方法的两个示例的示意图;
[0038] 图14是将10比特数据转换为8比特数据的第一示例方法的流程图;
[0039] 图15A、15B、15C和15D是示出了取决于是使用图9还是图11的方法,将数据打包到数据字段中的四种不同方式的示意图;
[0040] 图16是将10比特数据转换为8比特数据的第一示例方法的流程图;
[0041] 图17是示出了图16的方法的示意图;
[0042] 图18A是将图16的预处理方法与无损数据压缩方法相结合的数据压缩方法的流程图;
[0043] 图18B是可以在使用图18A的方法压缩数据的情况下使用的数据解压缩方法的流程图;
[0044] 图19A是另一示例数据压缩单元的示意图;
[0045] 图19B是图19A所示的数据压缩单元中的比特预测器元件的操作方法的流程图;
[0046] 图19C是示出了使用图19A的方法将数据打包到压缩数据块中的示例方式的示意图;
[0047] 图20A示出了另一数据压缩单元的示意图;
[0048] 图20B是无损数据压缩方法的流程图;
[0049] 图21A是使用图20A的硬件在空间上去相关和重新映射的数据块的示意图;
[0050] 图21B是示出了从图22的方法输出的编码数据的示意图;
[0051] 图22是表示熵编码方法的流程图;
[0052] 图23示出了实现数据压缩和/或解压缩单元的计算机系统;以及
[0053] 图24示出了用于生成体现如本文所述的数据压缩和/或解压缩单元的集成电路的集成电路制造系统。
[0054] 附图示出了各种示例。本领域技术人员将理解,附图中示出的元件边界 (例如,框、框组或其他形状)代表边界的一个示例。在一些示例中,可以将一个元件设计为多个元件,或者可以将多个元件设计为一个元件。在适当的情况下,在所有附图中使用共同的附图标记来表示类似的特征。

具体实施方式

[0055] 通过示例的方式呈现以下描述以使得本领域技术人员能够实施和使用本发明。本发明不限于如本文所述的实施方案,并且对所公开的实施方案的各种修改对于本领域技术人员而言是显而易见的。
[0056] 现在仅通过示例的方式来描述实施方案。
[0057] 如上所述,存储器带宽是处理单元(例如,CPU或GPU)内的相对有限的资源,类似地,存储器空间也是有限的资源,因为增大它会对器件的物理尺寸和功耗都有影响。通过在将数据存储在存储器中之前使用数据压缩,可节省存储器带宽和存储器中的空间。
[0058] 存在许多数据压缩方案,其中一些是无损的,另一些是有损的。在某些情况下,无损压缩技术可能是首选的,因为可以从压缩数据完美地重建原始数据。相反,在使用有损压缩技术的情况下,不能完美地从压缩数据重建数据,相反,解压缩数据仅是原始数据的近似值。解压缩的(并因此重建的) 数据的准确性将取决于在压缩过程中丢弃的数据的重要性。另外,与使用无损压缩技术的情况不同,使用有损压缩技术来反复压缩和解压缩数据会导致质量的逐渐降低。无损压缩技术通常用于压缩音频和图像数据,通用无损压缩技术的示例包括游程长度编码(RLE)和霍夫曼编码。
[0059] 使用无损压缩技术(例如,如编号为2530312的英国专利中所述)可以实现的压缩量取决于被压缩的数据的性质,一些数据比其他数据更容易压缩。通过压缩技术(无论是无损还是有损)实现的压缩量可以用在此称为压缩比的百分比来表示,并由下式给出:
[0060]
[0061] 应当理解,存在定义压缩比的其他方式;但是,在本文中始终使用上述约定。这意味着,压缩比为100%表示没有实现压缩,压缩比为50%表示数据已压缩到原始、未经压缩大小的一半,压缩比为25%表示数据已压缩被压缩到其原始、未经压缩大小的四分之一。有损压缩技术通常可以比无损压缩技术更大程度地压缩数据(即,实现更小的压缩比)。因此,在一些示例中,例如,在认为可实现压缩的程度比解压缩(即重建)的数据的质量更重要的情况下,相较于无损压缩技术,可能会首选有损压缩技术。在无损压缩技术和有损压缩技术之间如何进行选择是一种实现方式选择。
[0062] 可以实现的压缩量的可变性(取决于正在被压缩的实际数据的特性)对存储器带宽和存储器空间两者都有影响,并且可能意味着实现的压缩的全部好处就这两个方面中的一方面或两方面而言并不会完全实现,如下所述。
[0063] 在许多用例中,需要对原始数据进行随机访问。通常对于图像数据而言,为了实现这一点,在进行压缩之前,将图像数据分成独立的、非重叠的矩形块。如果每个压缩块的大小因块中数据的性质而变化(例如,所有相同颜色的块可能比包含大量细节的块压缩得多得多),以至于在某些情况下块可能会根本不压缩,那么,为了保持随机访问压缩数据块的能力,可以分配存储器空间,好像数据根本没有压缩一样。替代性地,有必要维护一个索引,在该索引中,有每个块的标识该块的压缩数据驻留在存储器中的位置的条目。这需要存储器空间来存储索引(可能相对较大),并且存储器访问(在索引中执行查找)会增大系统的等待时间。例如,在能够随机访问每个压缩数据块很重要以及不使用索引的系统中,即使实现50%的平均压缩比(针对所有数据块),仍然需要假定压缩比为100%来分配存储器空间,因为对于某些块,可能无法使用无损压缩技术来实现任何压缩。
[0064] 此外,由于数据到存储器的传输是以固定大小的突发脉冲(例如,以64 字节的突发脉冲形式)发生的,因此对于任何给定的块,只有一组离散的有效压缩比适用于将数据传输到存储器。例如,如果一个数据块包含256个字节并且数据传输是以64字节的突发脉冲发生的,则数据传输的有效压缩比为25%(如果块从256字节压缩到不超过64字节,因此只需要一个突发脉冲),50%(如果块被压缩成65-128字节因此需要两个突发脉冲),75%(如果块被压缩成129-192字节,因此需要三个突发脉冲)和100%(如果块根本没有压缩或被压缩成193或更多字节,因此需要四个突发脉冲)。这意味着,如果将包括256个字节的数据块压缩到129-192字节范围内的任何值,则压缩块需要三个突发脉冲,而未压缩块需要四个突发脉冲,这使得用于存储器传输的有效压缩比为75%,同时实现的实际数据压缩可以低得多(例如,如果压缩到129字节,则低至50.4%)。类似地,如果压缩只能将块压缩为 193字节,则存储器传输看不到使用数据压缩的好处,因为仍需要四个突发脉冲来将压缩数据块传输到存储器。在其他示例中,数据块可以包括不同数量的字节,并且到存储器的突发脉冲可以包括不同数量的字节。
[0065] 本文描述的是执行数据压缩的各种方法。如本文所述的一些方法提供了一种保证,即:满足一种压缩阈值,其可以根据压缩比(例如50%),压缩块大小(例如128字节)或以任何其他方式来定义。这种保证的效果是,可以减少分配的存储器空间量,同时仍然能够随机访问压缩数据块,并且还可以确保用于将压缩数据传输到存储器和从存储器传输压缩数据的存储器带宽减少。在其他示例中,压缩比可以是有针对性的(即,该方法可以被配置为在大多数情况下实现该比率),但是不能保证它将被满足。
[0066] 本文还描述了用于将10比特(例如,10∶10∶10∶2)数据转换为8比特(例如,8∶8∶8∶3)数据的方法以及用于从n比特数映射到m比特数的方法。如下所述,用于将10比特(例如10∶10∶10∶2)数据转换为8比特(例如8∶8∶8∶3 或8888)数据的方法可以用作用于执行本文所述的数据压缩方法的预处理 (或者预先编码)步骤,或者可以独立使用(例如,与另一种数据压缩方法一起使用或仅与无损压缩方法一起使用,例如下面参考图20A-B、21A-B和 22所述的方法)。通过首先使用如本文所述的方法之一来转换10比特(例如10∶10∶10∶2)数据,随后可以通过被布置对8888格式数据进行操作的方法来压缩10比特数据。转换方法对于三个通道(例如RGB数据)可能是有损的,对于第四通道可能是无损的(例如,α数据);然而,由于该格式通常用于高动态范围(HDR)数据并且大多数像素(例如75%)仍将属于低动态范围(LDR),因此可以仅以很小的精度损失来执行转换。如本文所述的用于从n比特数映射到m比特数的方法可以在如下所述的执行数据压缩的方法中使用,或者可以独立使用。通过使用这种映射方法,其他格式的数据可以随后通过被布置为对8888格式数据进行操作的方法来压缩和/或它可以用于减少内部缓冲(例如寄存器等),例如,每像素可以减少6比特(即
19%),并且这可以例如在下面描述并在图2C中示出的初始备用压缩子单元204A 中使用。
[0067] 图1示出了可以在诸如移动设备之类的电子设备中实现的图形渲染系统 100。图形渲染系统100包括主机CPU 102、GPU 104和存储器106(例如图形存储器)。CPU 102被布置为与GPU 104进行通信。可以是压缩数据的数据可以在GPU 104和存储器106之间沿任一方向传输。
[0068] GPU 104包括渲染单元110、压缩/解压缩单元112、存储器接口114和显示器接口116。系统100被布置成使得数据可以沿任一方向,在下列各项之间传递:(i)CPU 102与渲染单元110;(ii)CPU 102与存储器接口114; (iii)渲染单元110与存储器接口114;(iv)存储器接口114与存储器106; (v)渲染单元110与压缩/解压缩单元112;(vi)压缩/解压缩单元
112与存储器接口114;以及(vii)存储器接口114和显示器接口。系统100还被布置成使得数据可以从压缩/解压缩单元112传递到显示器接口116。由GPU 104渲染的图像可以从显示器接口116发送到显示器以在其上显示。
[0069] 在操作中,GPU 104对图像数据进行处理。例如,渲染单元110可以使用诸如深度测试(例如,用于隐藏表面移除)和纹理化和/或明暗运用之类的已知技术来执行诸如三形和线之类的图形基元的扫描转换。渲染单元110 可以包含高速缓存单元以减少存储器流量。一些数据由渲染单元110经由存储器接口单元114(可以包括高速缓存)读取或写入到存储器106中,但是对于其他数据,例如要存储在帧缓冲器中的数据,数据优选地从渲染单元110 经由压缩/解压缩单元112传输到存储器接口114。压缩/解压缩单元112通过压缩数据来减少要通过外部存储器总线传输到存储器106的数据量,如下面更详细描述的。
[0070] 显示器接口116将完成的图像数据发送到显示器。可以直接从存储器接口单元114访问未压缩的图像。可以经由压缩/解压缩单元112访问压缩数据,并将其作为未压缩数据发送到显示器108。在替代性示例中,压缩数据可以直接发送到显示器108,并且显示器108可以包括用于以与压缩/解压缩单元112的解压缩等效的方式来解压缩已压缩数据的逻辑。尽管示为单个实体,但是出于增强性能原因,压缩/解压缩单元112可以包含多个并行压缩和/或解压缩单元。
[0071] 在各种示例中,压缩/解压缩单元112可以实现能够保证满足压缩阈值 (可以是预定义的,并且因此是固定的,或可以是输入变量)的压缩方法(或方案)。如上所详述,压缩阈值可以例如根据压缩比(例如50%或25%),压缩块大小(例如128字节)或以任何其他方式来定义。为了提供与所提供的压缩量有关的这种保证,并且鉴于事先不知道数据的确切性质,使用无损压缩方法和有损压缩方法的组合,并且在图2A-C中示出了三个示例体系结构。在大多数情况下(如果不是所有情况),使用无损压缩技术(诸如在编号为2530312的英国专利中描述的那种技术或在下面参考图20A-B、21A-B 和22描述的那样)来压缩数据块,然后,执行测试以确定是否满足压缩阈值。在不满足压缩阈值的情况下,替代地对数据块应用有损压缩技术(诸如矢量量化(VQ)技术)或下面参考图3A和4-11的描述的将根据压缩阈值来提供有保证的压缩的方法,以实现压缩阈值。
[0072] 在图2A所示的方法中,未压缩的源数据(例如,256字节的块)被输入到主压缩单元202(其也可以被称为无损压缩单元)和备用压缩单元204 (也可以被称为有损或后备压缩单位)。因此,输入数据块使用两种不同的方法(潜在地,主压缩单元202中的无损方法和备用压缩单元204中的有损方法)独立地并行压缩。下面参考图20A-B、21A-B和22描述可以由主压缩单元202实现的无损压缩的示例方法。备用压缩单元204以这样的方式来压缩输入数据块,以便保证满足压缩阈值。然后,将压缩数据块的两个版本输入到测试和选择单元206。
该测试和选择单元206确定由主压缩单元202 生成的压缩数据块是否满足压缩阈值(例如,对于256字节输入块,它是否不大于128字节,以及50%的压缩阈值)。如果由主压缩单元202生成的压缩数据块满足压缩阈值,则将其输出,否则输出由备用压缩单元204生成的压缩数据块。在所有情况下,输出的压缩数据块都会满足压缩阈值,并且对于那些使用无损技术(在主压缩单元202中)不能适当压缩的块,通过仅使用有损压缩(在备用压缩单元204中),压缩数据的整体质量得到改善(即,由于压缩过程而丢失的数据量保持在较低的水平,同时仍满足压缩阈值)。
[0073] 在图2B所示的方法中,未压缩的源数据(例如,256字节的块)最初仅被输入到主压缩单元202,并且源数据向备用压缩单元204的输入被延迟 (例如,在延迟单元208中)。延迟量可以被布置为类似于使用无损压缩技术(在主压缩单元202中)压缩源数据块所花费的时间或者比此时间稍长,以还包括评估由主压缩单元202输出的压缩数据块的大小的所花费的时间 (在测试和判定单元210中)。由主压缩单元202输出的压缩数据块被输入到测试和判定单元210,并且如果它满足压缩阈值,则将其输出,并且不执行有损压缩。然而,如果由主压缩单元202输出的压缩数据块不满足压缩阈值(即它仍然太大),则测试和判定单元210丢弃该压缩块,并触发由备用压缩单元204对块进行的有损压缩。然后,输出由备用压缩单元204输出的压缩数据块。
[0074] 在图2C所示的方法中,备用压缩单元204被分成两个子单元:初始备用压缩子单元204A和最终备用压缩子单元204B,每个子单元都执行有损压缩方法的一部分。例如,初始备用压缩子单元204A可以将每个字节从8比特压缩到5比特(例如,使用截断或下面参考图
12A-B描述的方法)以及可以由最终备用压缩子单元204B来执行满足压缩阈值所需的任何进一步压缩。在其他示例中,备用压缩子单元204B可以执行预处理步骤(例如,如下面参考图14所述)。在另外的示例中,有损压缩方法可以以不同方式在两个备用压缩子单元204A、
204B之间分开。
[0075] 在图2C所示的方法中,未压缩的源数据(例如,256字节的块)被输入到主压缩单元202和初始备用压缩子单元204A。因此,输入数据块使用两种不同的方法(主压缩单元202中的无损方法和子单元204A中的有损方法的第一部分)独立地且并行地压缩。由主压缩单元
202输出的压缩数据块被输入到测试和判定单元210,并且如果它满足压缩阈值,则将其输出,由初始备用压缩子单元204A输出的部分地压缩数据块被丢弃,并且不对该数据块执行进一步的有损压缩。然而,如果主压缩单元202输出的压缩数据块不满足压缩阈值(即它仍然太大),则测试和判定单元210丢弃该压缩块,并触发由最终备用压缩子单元204B对由初始备用压缩子单元204A输出的块执行的有损压缩的完成。输出由最终备用压缩子单元204B输出的压缩数据块。
[0076] 在某些情况下,可以将数据块压缩得超过压缩阈值。在这种情况下,主压缩单元202可以输出始终正好满足压缩阈值的压缩数据块,或者替代性地,在这种情况下,输出压缩数据块的大小可以小于满足压缩阈值所需的大小。类似地,在图2A、2B和2C中使用的(并且在备用压缩单元204或子单元 204A、204B中实现的)有损压缩技术,可以输出始终正好满足压缩阈值的压缩数据块,或者替代性地,压缩数据块的大小可以变化,同时仍然总是满足压缩阈值。在压缩数据块小于正好满足压缩阈值所需的压缩数据块的情况下,可能仍然存在分别由固定突发脉冲大小和预分配要求引起的存储器带宽和存储器空间低效;然而,当满足压缩阈值时,总是存在与存储器带宽和存储器空间相关的改进。在各种示例中,可以使用标头来进一步减少某些块的已使用存储器带宽(例如,通过在标头中包括关于从存储器读取多少或向存储器写入多少数据的信息)。
[0077] 根据特定实现方式,可以使用图2A-C的任何体系结构。图2A中所示的布置提供了固定吞吐量和固定等待时间(这意味着不需要缓冲数据和/或在系统中稍后不会引起气泡),但是可能会增大功耗(例如,与仅让单个压缩单元执行无损或有损压缩相比)。图2B所示的布置可以具有比图2A中所示的布置更低的功耗(平均而言),因为图2B中的备用压缩单元204可以在不需要时关闭;但是,等待时间可能会有所不同,因此可能会在系统中包括缓冲区。替代性地,可以在测试和判定单元210与输出之间添加附加延迟元件208(在图2B中以虚线示出),以延迟由主压缩单元202输出的压缩数据块(例如,延迟量可以被布置为与使用备用压缩单元204中的有损压缩技术来压缩源数据块所花费的时间相当)。将该附加延迟元件208包括在图 2B的布置中,具有使该布置的等待时间固定而不是可变的效果。图2C中所示的布置也可以具有比图2A中所示的布置更低的功耗(平均而言),因为图2C中的最终备用压缩子单元204B可以在不需要时关闭;然而,在某些情况下,初始备用压缩子单元204A会丢弃将在以后有用的数据,这可能会降低解压缩数据的准确性(例如,数据最初从8比特压缩到6比特,然后,从6比特到4比特,从4比特到8比特的解压缩的情况可能会比数据直接从 8比特压缩到4比特的情况引入更多的错误)。
[0078] 上面参考图2A-C描述的方法可以与任何压缩阈值组合使用;然而,在许多示例中,压缩阈值将是50%(但这可以以另一种方式表示,例如对于 256字节数据块,128字节)。在使用除50%之外的压缩阈值的示例中,可以选择压缩阈值以与突发脉冲大小对准(例如,对于上述示例,为25%、50%或75%),当对于大多数数据块(例如,>50%)使用无损压缩可以满足该阈值并且有损压缩仅用于剩余的块时,图2A-C所示的体系结构提供了最大的效率。
[0079] 为了标识使用了哪种压缩技术(例如无损或有损),可以附加指出所使用的压缩类型的数据(例如,在标头中),或者可以将该数据合并到所使用的任何现有标头(或标头表)中,或每个压缩数据块,除了压缩数据之外,还可以包括指出所使用的压缩类型的多个比特(例如,如下面参考图3-11 所描述的)。
[0080] 在图2A-C的任何体系结构,可能存在额外的预处理步骤(图2A-C中未示出),其是有损预处理步骤,并且将源数据转换为对于主压缩单元202 和/或备用压缩单元204、204A适当的格式。该有损预处理步骤可以例如将数据的格式从10比特(例如RGBA1010102)格式改变为8比特(例如 RGBA8883或8888格式),下面参考图14和16描述了用于执行该预处理的两个示例方法。在各种示例中,图16的方法可以用作主压缩单元202的预处理步骤,图14的方法可以用作备用压缩单元204的预处理步骤,反之亦然,或者相同的方法可以用于主压缩单元和备用压缩单元两者。
[0081] 在图2A-C的体系结构中使用不同的数据格式和/或预处理步骤还可能需要修改所使用的压缩方法(例如,在主压缩单元202和/或备用压缩单元204、 204A、204B中),并且下面还描述了这些情况的一些示例。通过将有损预处理步骤与无损压缩(在主压缩单元202中实现)组合,可以理解,由主压缩单元202输出的压缩数据不再是无损的。
[0082] 参考图3-11描述了保证满足预定义的压缩阈值的有损压缩技术。该技术可以由图1中所示的压缩/解压缩单元112和/或由图2A和2B所示的备用压缩单元204来实现。如上所述,数据压缩的使用减少了对存储器存储空间和存储器带宽的要求,并且保证满足压缩阈值(如上所述,可以以任何合适的方式来定义)能够确保实现存储器存储空间和存储器带宽两方面的益处。在下面描述的示例中,压缩阈值是50%(或在每个未压缩数据块的大小为 
256字节的情况下,128字节);然而,在其他示例中,该方法可以用于不同的压缩阈值(例如,
75%或25%),并且如上所述,可以选择压缩阈值以对应于用于存储器传输的整数个突发脉冲。
[0083] 图3A所示的有损压缩方法将RGBA8888或RGBX8888格式或通道处于不同的顺序(例如ARGB或其他相应格式,例如包括四个通道,每个通道都具有8比特值)的相应格式的源数据作为输入。在各种示例中,源数据可以包括具有小于8比特的数据值的通道,并且下面描述对该方法的相应改变的示例(例如,参考图15A-D)。在源数据不是合适格式的示例中(例如,每个RGB通道都包括多于8比特的情况),可以使用预处理步骤(例如,如下面参考图14或图16所描述的)来将源数据转换为适当的格式。替代性地,图3A的方法可以用于其中通道包括多于8比特的数据(例如,10∶10∶10∶2 数据);然而,通过使用下面参考包括HDR标志的图14描述的预处理技术,有一个额外的比特可以在RGB值之间共享。以下示例涉及对图像数据(例如,RGBA格式的数据)进行压缩和解压缩,但是应该理解,可以应用相同的原理来压缩和解压缩其他格式的其他类型的数据。
[0084] 输入到图3A的方法的源数据包括数据块。对于图像数据,每个数据块都涉及像素的瓦片(或块)(例如,包括8x8像素或16x4像素的图块),并且每个块都被细分为多个子块(框302)。在各种示例中,每个数据块都被细分(在框302中)为四个子块。如果将数据块细分(在框302中)为较少数量的较大块,则可以实现的压缩量可以更大,但是随机访问更加困难,并且除非访问块中的许多像素,否则随着“每访问的像素的数据”的增加,带宽使用量增大。类似地,对于更大数量的较小块,随机访问变得更容易(并且可以减少每访问的像素的数据);但是,可以减少可以实现的数据压缩量。例如,如果数据块涉及8x8像素瓦片或16x4像素瓦片,则该块可以被细分为四个子块400,每个子块都对应于4x4像素布置,对于8x8瓦片,如图4A 所示,对于16x4瓦片,如图4B所示。子块可以表示为子块0-3。在执行该细分(在框302中)之后,独立地考虑每个子块,并且基于对子块内的像素的α值的分析结果,为每个子块选择有损压缩模式(框304)。取决于该分析的结果,所选模式可以是使用α的常数值的模式(如在框306中应用的,并且被称为恒定α模式)或者在子块中使用α的可变值的模式(如在框308 中所应用的,并且被称为可变α模式)。可以仅有两种可用模式,或者替代性地,可以存在一种或多种附加模式(例如,如框310中所应用的)。然后,将源数据块中的每个子块的压缩数据(由框306-310之一输出)打包在一起以形成相应的压缩数据块(框312)。
[0085] 图4C示出了压缩数据块402,其包括每个子块的压缩数据404和指出正在使用图3A的有损压缩方法的另一数据字段406。每个子块400的数据 404被分成两个字段:2比特块模式408和252比特块数据410。块模式比特 408指是使用可变α模式(框308),恒定α模式(框306)还是其他模式(框 310)。例如,字段值可以如下:
[0086]字段值 解释
0b00 恒定α
0b01 可变α
0b1- 其他模式(在使用时)
[0087] 图5A中详细示出了图3A中的分析阶段(框304)的示例实现方式。在此示例中,分析子块内每个像素的α值,并计算两个参数:minalpha和maxalpha,它们是子块中所有像素的α的最小值和最大值(框502)。这些可以以任何方式来确定,包括例如使用循环(如下面的伪代码示例,或其功能等同物中)或使用测试树,第一步确定像素对的最大和最小α值,然后,第二步确定第一步的输出对的最大和最小α值等。然后,在随后的决策过程中使用这两个参数(minalpha和maxalpha)(框504-508),尽管决策过程被示为以特定顺序应用,但在其他示例中,相同的测试可以以不同的顺序应用。(例如,假设alphadifftol<254,可以交换框506和508)。此外,应当理解,框504中的测试可替代性地是maxalpha>(minalpha+alphadifftol)。
[0088] 第一判定操作(框504)评估子块上的α值的范围,并确定该范围是否大于将通过使用(最佳情况)可变α模式(在框308中)引入的误差。这些误差的大小在图5A中表示为alphadifftol,该值可以是预定的。alphadifftol 的值可以通过在训练过程中比较由可变α模式中的不同方法(即带有4比特α的4色编码或带有5比特α并且带有共享相同颜色的两个像素的3色编码) 引起的质量损失来确定(因此使用上面的短语“最佳情况”)。替代性地,可以通过针对大的测试图像集来评估不同的候选值来确定alphadifftol的值(也是在训练过程中),以使用视觉比较或图像差异度量来找到提供最佳结果的候选值。alphadifftol的值可以是固定的或可以是可编程的。
[0089] 响应于确定该范围大于将通过使用(最佳情况)可变α模式引入的误差 (在框504中为“是”),对此子块应用可变α压缩模式(框308)。然而,响应于确定该范围不大于通过使用(最佳情况)可变α模式将引入的误差(在框504中为“否”),将恒定α压缩模式(框306)应用于该子块,并且使用另外两个判定操作(框506、508)来确定用于整个子块的α值。如果maxalpha 的值是alpha的最大可能值(例如,0xFF,在框506中为“是”),则将在恒定α模式中使用的α值(constalphaval)设置为该最大可能值(框510)。这确保了如果存在任何完全不透明的像素,则在压缩数据并随后解压缩之后它们保持完全不透明。如果minalpha的值为零(例如,0x00,在框508中为“是”),则将恒定α模式中使用的alpha值(constalphaval)设置为零(框512)。这确保了如果存在任何完全透明的像素,则在压缩数据并随后解压缩之后它们保持完全透明。如果这些条件都不成立(在框506和508中为“否”),则对子块中的像素计算α的平均值(框514),并且在恒定α模式中使用该平均值。
[0090] 例如,以下伪代码(或其功能等同物)可用于实现图5中所示的分析,在此代码中,P.alp是正在考虑的像素P的α值:
[0091] CONST AlphaDiffTol=4;
[0092] U8 MinAlpha:=0xFF;
[0093] U8 MaxAlpha:=0x00;
[0094] U12 AlphaSum:=0;
[0095] FOREACH Pixel,P,in the 4x4block
[0096] MinAlpha:=MIN(P.alp,MinAlpha);
[0097] MaxAlpha:=MAX(P.alp,MaxAlpha);
[0098] AlphaSum+=P.alp;
[0099] ENDFOR
[0100] IF((MaxAlpha-MinAlpha)>AlphaDiffTol)THEN
[0101] Mode:=VariableAlphaMode;
[0102] ELSEIF(MaxAlpha==0xFF)
[0103] Mode:=ConstAlphaMode;
[0104] ConstAlphaVal:=0xFF;
[0105] ELSEIF(MinAlpha==0x00)
[0106] Mode:=ConstAlphaMode;
[0107] ConstAlphaVal:=0x00;
[0108] ELSE
[0109] Mode:=ConstAlphaMode;
[0110] ConstAlphaVal:=(AlphaSum+8)>>4;
[0111] ENDIF
[0112] 图5B中示出了分析阶段(图3A中的框304)的替代性示例实现方式。在该示例中,参数constalphaval最初被设置为子块内的预定义位置处的像素的α值(框520)。例如,可以将constalphaval设置为子块左上角的像素的α值(即子块中的第一像素)。然后,将子块中的其他像素的所有α值与该 constalphaval进行比较(在框522-526中)。在所有α值都与constalphaval 非常相似的情况下(例如在±5的范围内,在框522中为“是”),则使用恒定α模式(图3A中的框306),但是如果它们的变化大于此(在框522中为“否”),则使用可变α模式(图3A中的框308)。然后,以与图5A的方法类似的方式,对于恒定α模式,参数constalphaval被设置为零(在框512中)或最大值(在框510中),其中分别是,像素都几乎完全透明(constalphaval<5,在框524中为“是”)或者几乎完全不透明(constalphaval>250,在框526中为“是”)。应当理解,图5B中用作分析的一部分的特定值(例如,在框522-526 中)仅作为示例提供,而在其他示例中,这些值可能略有不同。
[0113] 与图5A的方法相比,图5B的方法不需要确定minalpha和maxalpha,这减少了执行分析所需的计算工作量。然而,图5B的方法可能会产生一些可见伪像(例如混叠),特别是当对象在屏幕上缓慢移动,并且由于使用预定义位置作为α值的中心而不太可能检测到“恒定α”瓦片时。
[0114] 在对子块内α值的分析(在框304中,例如,如图5A或5B所示)确定要使用恒定α模式(在框306中)并且还设置参数constalphaval(在框 510-514和520之一中)的情况下,对子块的压缩如图6A或图7A所示地进行。图6A示出了使用恒定α模式(图3A的框306)来压缩子块的第一示例方法的流程图。对于每个像素,将每个RGB值从8比特压缩到5比特(框 602,例如,如下文参考图12A-B所述,或使用替代性截断方法),然后将压缩值与constalphaval的值一起打包到数据块中(框604)。因此,在此示例中,4x4子块的数据从512比特(RGBA8888格式(16*32=512比特)) 压缩到248比特(8+16*(5+5+5)=248比特)。
[0115] 图6B-6D示出了将压缩值打包成数据块的两种不同方式,但可以理解的是,压缩值也可以替代性地以其他方式打包成数据块。在第一示例中,如图 6B所示,数据块606包括三个80比特字段608-610,每个字段都包括来自三个通道之一(例如,R、G或B)的数据,以及包括8比特constalphaval (例如,如使用图5A或5B确定的)的12比特字段612,剩余的4比特可以不使用或保留以备将来使用。在每个80比特字段608-610中,子块中的每个像素都有5比特值。
[0116] 在第二示例中,如图6C-6D所示,数据的布局类似于执行可变α模式的第二种方法(如下面参考图9所述的框308),因为这会在两种方法(即,图6A和图9的方法)一起使用的情况下,导致不太复杂的硬件(以及因此具有较低功耗的较小硬件)。如图6C所示,每个子块400(例如,每个4x4 像素子块)被细分为四个迷你块650-653(例如,四个2x2像素迷你块)。
每个迷你块都具有对应的60比特数据字段660-663,其包含迷你块中的像素的RGB数据。在图6C中,迷你块及其相应的数据字段已被标记为Q、S、 U和W。8比特的constalphaval(例如,如使用图5A或5B确定的)分布在四个3比特字段670-673中。在每个迷你块数据字段660-663内,RGB数据如图6D所示分布。如果每个迷你块都包括标记为A-D的四个像素,则它们各自都由三个5比特值表示,R、G和B通道中的每一个都有一个值(例如, 5比特值RA、GA和BA表示像素A,5比特值RB、GB和BB表示像素B,等等)。
[0117] 图7A示出了使用恒定α模式(图3A的框306)来压缩子块的第二示例方法的流程图,该方法是图6A中所示方法的变体。如图7A所示,子块400 中的像素被分成两个非重叠子集,然后每个子集中的像素被压缩不同的量。在图7A所示的特定示例中,在constalphaval可以存储在少于8比特(例如恒定α<5或>250)的情况下可以使用该示例,以与图6A相同的方式来压缩第一子集中的像素,即通过将每个R、G、B值从RGB888格式转换成RGB555 格式(框602),而以不同的方式来压缩第二子集中的像素(框702),即通过将RGB数据从RGB888格式(即三个8比特值,每个通道一个)转换成RGB565格式(即对于R和B通道,5比特值,对于G通道,6比特值)。压缩可以如下面参考图12A-B所述而执行(在框602和702中),或可以使用替代性方法(例如,通过移除一个或多个LSB来截断值)。在其他示例中,可以以不同方式来压缩两个像素子集(例如,可以通过将RGB数据从 RGB888格式转换为RGB554来压缩第二子集的像素)。
[0118] 图7B示出了如何将子块中的像素分成两个子集的示例。在图7B所示的示例中,标记为A-D的4个像素形成第一子集,并且12个阴影像素形成第二子集。在其他示例中,两个子集之间的划分可以是不同的(例如,第一子集中可以存在多于或少于四个像素,其余像素形成第二子集)和/或第一子集中的像素的位置可以不同。
[0119] 在constalphaval是8比特值的示例中(例如,在恒定α不<5或>250的情况下),可以修改图7A的方法,使得第二子集中的像素以与图6A中相同的方式来压缩,即通过将R、G、B值中的每一个从RGB888格式转换为RGB555格式(框602),而以不同方式来压缩第一子集中的像素(框702),即,通过将RGB数据RGB888格式(即,三个8比特值,每个通道一个值) 转换为RGB565格式(即,对于R和B通道,5比特值,对于G通道,6比特值)。如前所述,压缩可以如下面参考图12A-B所述而执行(在框602 和702中),或可以使用替代性方法(例如,通过移除一个或多个LSB来截断值)。
[0120] 在对子块内的α值的分析(在框304中,例如如图5A或5B中所示) 确定要使用可变α模式(框308)的情况下,对子块的压缩如8A或9所示地继续进行。图8A示出了使用可变α模式(图3A的框308)来压缩子块的第一示例方法的流程图。如图8A所示,通过将RGBA8888格式(即,四个 8比特值,包括α通道的每个通道一个值)转换为RGBA5555格式(即,四个5比特值,包括α通道的每个通道一个值)来压缩子块中的每个像素的数据(框802,例如,如下面参考图12A-B所描述的)。然后,将子块400中的像素分成两个非重叠子集(例如,如上参考图7B所述),然后对第一子集中的像素(例如,图7B中的像素A-D)进行进一步压缩(框804-806),这可以参考图8B进行描述。为了进一步压缩第一子集中的像素,将这些像素中的每一个与其相邻像素进行比较,以标识哪个相邻像素最相似(框806)。可以使用色差参数来评估相似性,其中最相似的像素与特定像素具有最小色差,并且其中一个像素和相邻像素之间(即,一对像素之间)的色差可以按如下方式来计算:
[0121] |Red difference|+|Green difference|+|Blue difference|+  |Alphadifference|   (1)
[0122] 在为第一子集中的每个像素标识出最相似的相邻像素之后,使用查找表来为第一子集中的每个像素选择索引,例如:
[0123]索引 最相似的相邻像素
000 R0
001 R1
010 R2
011 R3
100 R4
[0124] 其中对相邻像素R0-R4的参考定义如图8B所示。然而,应当理解,在第一子集的像素的位置不同的情况下,可以不同地定义这些相邻像素。
[0125] 在各种示例中,可以存在在第一子集中的像素周围存在梯度的情况下使用的附加索引。在这样的示例中,例如通过添加单个附加的名义相邻像素R5来计算一个或多个附加的名义相邻像素的像素数据,其中使用以下公式来计算R5的像素数据:
[0126] R5=(R0+R1)/2
[0127] 在其他示例中,还可以考虑一个或多个其他名义相邻像素,例如,R6 和/或R7,其中R6和R7的像素数据使用以下公式来计算:
[0128] R6=(R0+R4)/2
[0129] R7=(R1+R3)/2
[0130] 在使用附加的名义相邻像素的情况下,查找表包括用于标识索引的相应附加条目,例如:
[0131]索引 最相似的相邻像素
000 R0
001 R1
010 R2
011 R3
100 R4
101 R5
110 R6
111 R7
[0132] 在各种示例中,可能存在另外的特殊情况索引,其指出相邻像素(包括所使用的任何名义相邻像素)中没有一个与特定像素足够相似。例如,这可以基于阈值来确定,并且在最接近的色差超过该阈值的情况下,可以使用索引000。在一个示例中,对于5比特值,阈值可以是31。除了使用索引000 之外,由索引000所指的像素被改变为当前像素和所指的像素之间的平均值。替代性地,在图8A的变体中,如果不执行像素数据从RGBA8888到 RGBA5555的转换(在框802中)直到数据值被打包紧之前(在框808中),以便对8比特执行比较(在框804中)值,阈值将不同(例如,对于8比特值,为255)。
[0133] 图9示出了使用可变α模式(图3A的框308)来压缩子块的第二示例方法的流程图。如图9所示,子块400(例如,每个4x4像素子块)被细分 (框902)为四个迷你块650-653(例如,2x2像素迷你块),如图6C所示。然后,每个迷你块被单独压缩,每个迷你块都具有相应的数据字段660-663,其包含迷你块中的像素的RGB数据。相应的四个3比特字段670-673不包含constalphaval,如在先前图6C的讨论中的情况,但是在使用可变α模式的情况下,这些3比特字段标识用于子块中的每个迷你块的编码(或调色板) 模式,如下所述。
[0134] 基于针对迷你块中的每个像素对所计算出的色差,为每个迷你块确定编码模式(框904)。可以使用上面的等式(1)来计算色差,并且这可以通过下面提供的伪码的功能等同物来实现,其中色差被截断到6比特(即,最大值63)。在此代码中,符号如下所示:IntermediateResult[5,0]指的是IntermediateResult 10比特值的6个LSB,red/grn/blu/alp分别指的是红色/绿色/蓝色/α)。
[0135] U6 DiffMetric(PIXEL Pix1,PIXEL Pix2)
[0136] {
[0137] U6 Result;
[0138] U10 IntermediateResult;
[0139] U8 R1:=Pix1.red;
[0140] U8 R2:=Pix2.red;
[0141] U8 G1:=Pix1.grn;
[0142] U8 G2:=Pix2.grn;
[0143] U8 B1:=Pix1.blu;
[0144] U8 B2:=Pix2.blu;
[0145] U8 A1:=Pix1.alp;
[0146] U8 A2:=Pix2.alp;
[0147] IntermediateResult:=SAD4x5(R1,R2,G1,G2,B1,B2,A1,A2);
[0148] IF((IntermediateResult>63)THEN
[0149] Result:=63;
[0150] ELSE
[0151] Result:=IntermediateResult[5..0];
[0152] ENDIF
[0153] RETURN Result;
[0154] }
[0155] 上面的伪代码包括绝对差之和(SAD)函数,并且这可以例如以任何方式来实现(例如,由逻辑综合工具来实现,或者如由Kumm等人所著的“Efficient Sum of Absolute Difference Computation on FPGAs(FPGA上的高效绝对差之和的计算)”的图2中所描述的那样)。
[0156] 在计算了色差之后(在框904中),使用迷你块中的任何像素对的最小色差来确定所使用的迷你块编码模式(框906)。根据最小色差(迷你块中的任何像素对之间)是否超过阈值(例如可以设置在范围0-50中的某个值,例如40),使用两种不同类型的迷你块编码模式。如果最小色差不超过阈值 (在框906中为“是”),则使用多个编码图案中的一个(如框908中所选择的),并且存储三个每迷你块调色板颜色(框910-914)。然而,如果最小色差确实超过阈值(在框906中为“否”),则使用四色模式(框916)。下面详细描述这些不同的迷你块模式。编码图案依赖于这样的假设:在大多数迷你块中,存在不超过三种不同的颜色,并且在这种情况下,迷你块可以由三种调色板颜色以及像素到调色板条目的分配来表示。存在四色模式以处理例外情况。
[0157] 如上所述,阈值的值可以在0-50的范围内。在各种示例中,它可以是在设计时设置的固定值。替代性地,它可以是存储在全局寄存器中的变量,并且每次在执行图9的方法时读取它。这使得阈值能够动态地或至少周期性地改变。在各种示例中,可以基于来自训练阶段的结果来设置阈值的值。训练阶段可以使用图像质量度量,例如峰值信噪比(PSNR)或结构相似性度量(SSIM)来评估一组使用三颜色方法(框908-912)或四颜色方法(框916) 中的每一种方法来压缩的图像,然后可以选择阈值,使得总体上获得最高图像质量度量。
[0158] 可以注意到,在图9的方法中使用的阈值可以具有与在图8A的方法中使用的阈值不同的值。因为两个阈值用于不同的目的,因为它们针对不同的情况并去除不同种类的伪像。在图8A的方法中,阈值用于标识像素之一何时是“孤立颜色”,因为它不能用其相邻像素之一很好地表示。相反,图9的方法中的阈值用于标识四种颜色何时彼此相差太大。
[0159] 如图9所示,如果最小色差小于或等于阈值(在框906中为“是”),以便可以使用编码图案,则基于具有最小色差的像素对(在迷你块中),从如图10A所示的一组六个分配图案中选择所使用的特定图案(框908)。在图 10A中的每个图案中,阴影所示的两个像素共享通过对两个源像素颜色求平均值而得到的调色板条目。因此,确定所选图案(从框908)的三个调色板颜色P0、P1、P2(框910)包括执行该求平均值的操作,并标识迷你块中的其他两个剩余像素的像素数据。下面提供了用于实现该选择以及三种调色板颜色的计算的示例伪代码,但是参考图10A,如果最小色差是针对像素对 AB(在伪码中表示为DiffAB),则所选择的模式是称为“顶部”的模式,并且三个调色板颜色是A和B的平均值,并且然后像素C和D的平均值。类似地,如果最小色差是针对像素对CD(在伪代码中表示为DiffCD),则所选择的模式是称为“底部”的模式,并且三个调色板颜色是C和D的平均值,然后是像素A和B的平均值。其他模式(即“左”、“右”、“Diag1”和“Diag2”模式)中的调色板颜色从图10A中显而易见。
[0160] 下表示出了每个编码模式的迷你块中每个像素A-D的对应调色板颜色,以及存储在迷你块的3比特字段670-673中的编码值(如图6C所示)的示例映射。由相同调色板颜色表示的像素以粗体和斜体显示。在该示例中,映射被布置为,使得每个像素(例如,像素A、B、C或D)仅访问两种可能的调色板颜色中的一种,并且这导致硬件实现方式比所有四个像素都可以访问三种调色板颜色中的任何一种的情况更简单。
[0161]
[0162]
[0163] 实现该表(以及图9的框908-910)的示例伪代码的一部分如下所示:
[0164] ELSIF(MinDiff==DiffAB)
[0165] MODE:=TOP;
[0166] P0full:=PixelC;
[0167] P2full:=PixelD;
[0168] Plfull:=Average(PixelA,PixelB);
[0169] ELSIF(MinDiff==DiffAC)
[0170] MODE:=LEFT;
[0171] P0full:=Average(PixelA,PixelC);
[0172] P1full:=PixelB;
[0173] P2full:=PixelD;
[0174] ELSIF...
[0175] 上面伪代码中的Average函数可以按如下方式来实现(或其功能等同物):
[0176] PIXEL Average(PIXEL Pix1,PIXEL Pix2)
[0177] {
[0178] PIXEL Result;
[0179] Result.red:=(Pix1.red+Pix2.red+1)>>1;
[0180] Result.gm:=(Pix1.gm+Pix2.grn+1)>>1;
[0181] Result.blu:=(Pix1.blu+Pix2.blu+1)>>1;
[0182] Result.alp:=(Pix1.alp+Pix2.alp+1)>>1;
[0183] Return Result;
[0184] }
[0185] 在确定了RGBA8888格式的三种调色板颜色P0、P1、P2之后,将这些值转换为RGBA5555格式(框912,例如,如下面参考图12A-B所述)。虽然分别示出和描述了生成调色板颜色(在框910中)和通过转换格式进行的压缩(在框912中)的操作,但是应当理解,这两个操作可以组合成单个步骤,这可以导致硬件不太复杂。
[0186] 如图9所示,如果最小色差不小于或等于阈值(在框906中为“否”,即超过阈值),则不能使用图10A中所示的编码图案,而是使用四色模式。在该模式下,用于表示每个通道的比特数减少(在框916中),并且在图9中所示的示例中,对于迷你块中的四个像素中的每一个,像素数据从 RGBA8888格式转换为RGBA4434格式(框916,例如,如下面参考图12A-B 所述)。用于指出正在使用该模式的编码值是不用于编码图案的值之一(如上表中详述的),并且在各种示例中,可以使用编码值111。该编码值存储在迷你块的3比特字段670-673中(如图6C所示)。
[0187] 虽然四色模式被示为使用RGBA4434格式,但是可以替代性地使用替代性压缩格式(例如RGBA4443)。可以使用RGBA4434格式,因为尽管人眼对蓝色敏感,但人类视觉系统感知不到与红色或绿色分辨率相同的颜色。另外,当使用四色模式时(例如,在框916中以及图11中的框602),还可以另外应用抖动图案。
[0188] 在使用任何一种编码图案或四色模式生成迷你块的压缩数据之后,迷你块的压缩数据被打包到迷你块的60比特数据字段660-663中,并且相应的编码值被插入相关字段670-673中(框914)。打包数据的方式根据所使用的模式而不同,这些在图10B和10C中示出。
图10B示出了使用编码图案压缩的迷你块的像素数据的打包。图10C示出了使用四色模式压缩的迷你块的像素数据的打包。
[0189] 如上所述,对于已经使用编码图案压缩的迷你块,要包括在数据字段中的数据包括RGBA5555格式的三种调色板颜色,并且这些数据可以打包到数据字段中,如图10B所示。如图所示,RGB数据可以与α通道数据分离,以便更紧密地匹配可以在恒定α模式中使用的打包布置(如图6D所示)。对于已经使用四色模式压缩的迷你块,要包括在数据字段中的数据包括四个 RGBA4434值,并且这些数据可以打包到数据字段中,如图10C所示。再次,选择所示的布置以更紧密地匹配可以在恒定α模式中使用的打包布置。用于打包每个像素的数据的布置也在图10C中示出,通过以这种方式对数据进行打包,四个α比特被分开并放置在RGB数据之间,R、G、B通道数据分别对应于图6D中所示的恒定α模式的RGB数据的四个、四个和三个MSB的位置。给定像素的α通道分布在未使用的部分,匹配LSB到MSB的顺序。
[0190] 在形成迷你块的数据字段之后(在框914中),然后将这些数据字段打包到子块中的数据字段中(框918,例如,如图6C所示)。
[0191] 尽管上面针对可变α模式描述了编码图案,但是在各种示例中,它们还可以用于提供更高精度的恒定α模式,其中恒定α值是255(或其他预定义值),如图11所示,前面描述的恒定α模式(例如,如图6A或7A所示) 用于其他恒定α值。图11示出了使用恒定α模式(图3A的框306)来压缩子块的第三示例方法的流程图,该方法是图6A和9所示的方法的变体。在该示例方法中,子块400(例如,每个4x4像素子块)被细分(框902)为四个迷你块650-653(例如,2x2像素迷你块),如图6C所示。然后,每个迷你块被单独压缩,每个迷你块都具有相应的数据字段660-663,其包含迷你块中的像素的RGB数据。对应的四个3比特字段670-673标识用于子块中的每个迷你块的编码模式。在此示例中,不包括constalphaval,因为它是已知的常数值,例如,255,可以使用专用块编码模式(例如,如上所述保留的0b1模式之一)来指出这一点。在另外的示例中,编码图案还可以另外地或替代地用于提供更高精度的恒定α模式,其中存储恒定α值并且不认为具有已知的恒定值(例如255)。在这样的示例中,可以将constalphaval与像素数据一起存储,并且为了有空间来存储constalphaval,可以修改图
11 的方法,使得三个调色板颜色从RGB888转换为RGB676(在框1112中,而不是RGB776),并且四色模式将每种颜色从RGB888转换为RGB554(在框602中,而不是RGB555)。
[0192] 然后,基于针对迷你块中的每个像素对所计算出的色差,为每个迷你块确定编码模式(框904)。可以使用上述任何方法来计算色差,但省略α通道数据。
[0193] 在计算了色差之后(在框904中),使用迷你块中的任何像素对的最小色差来确定所使用的迷你块编码模式(框906)。根据最小色差(迷你块中的任何像素对之间)是否超过阈值(例如可以设置在范围0-50中的某个值,例如40),使用两种不同类型的迷你块编码模式。如果最小色差不超过阈值 (在框906中为“是”),则使用多个编码图案中的一个(如框908中所选择的),并且存储三个每迷你块调色板颜色(框910-914)。然而,如果最小色差确实超过阈值(在框906中为“否”),则使用将每个RGB值从8比特转换为5比特的早期压缩方法(在图6A中)(框602)。如前所述,编码图案依赖于这样的假设:在大多数迷你块中,存在不超过三种不同的颜色,并且在这种情况下,迷你块可以由三种调色板颜色以及像素到调色板条目的分配来表示。先前的方法(框602)用于处理对此的例外情况。在使用编码图案的情况下,可以使用更高的精度(例如,每个颜色通道多于5比特),因为只有三种调色板颜色而不是四个像素。
[0194] 然后,如上参考图9所述,进行编码图案的选择,例外是没有要考虑的α数据(框908-910)。确定了RGB888格式的三种调色板颜色P0、P1、P2 后,将这些值转换为分辨率高于RGB555的格式,例如,RGB776或RGB666 格式(框1112,例如通过截断或如下面参考图12A-B所述)。
[0195] 生成了迷你块的压缩数据后,使用其中一种编码图案或四色模式(但在某些示例中,在α为常数值255的情况下,可能不使用此四色模式),迷你块的压缩数据将被打包到迷你块的60比特数据字段660-663中,并相应的编码值将被插入相关字段670-673中(框1114)。如上所述,在使用编码图案来提供更高精度的恒定α模式的各种示例中,也可以将constalphaval打包到60比特数据字段660-663中。在形成迷你块的数据字段之后(在框
1114 中),然后将这些数据字段打包到子块中的数据字段中(框1118,例如,如图6C所示)。
图11的方法改进了RGB精度(例如RGB776或RGB676而不是RGB555),并因此改善了图像质量。
[0196] 在上面的描述中,存在六种不同的调色板分配(或编码)模式,如图10A 所示(连同四色模式)。在各种示例中,可以存在一个或多个附加模式,如图10D所示。在这样的附加模式中,仅有两种调色板颜色(如图10D中的不同阴影所示),两种调色板颜色中的每一种都是共享相同调色板颜色的两个像素的平均值。在第一示例1001中,对像素A和C进行平均,以生成第一调色板颜色,然后将其用于替换像素A和C的数据,并且对于像素B和D类似地操作,以生成第二调色板颜色(然后,将其用于替换那些像素的数据)。在第二示例1002中,对像素A和B进行平均,以生成第一调色板颜色,并且对像素C和D进行平均,以生成第二调色板颜色。由于仅存储两种调色板颜色(与先前编码模式中的三种调色板颜色相比),调色板颜色可以以更高的精度存储(例如,对于恒定α,RGBA8888,对于可变α, RGBA7878)。
[0197] 两种调色板颜色模式中的第一种1001(如图10D所示)可以例如在像素A和C之间的色差(在上面使用的符号中为DiffAC)以及像素B和D之间的色差(DiffBD)都小于预定义阈值的情况下使用。类似地,两种调色板颜色模式中的第二种1002可以例如在像素A和B之间的色差(在上面使用的符号中为DiffAB)以及像素C和D之间的色差(DiffCD)都小于预定义阈值的情况下使用。此外,虽然图10D仅示出了两个两调色板颜色模式,但是,应当理解,在各种示例中,可以存在第三两调色板颜色模式,其中一种调色板颜色是像素A和D的平均值,而另一种调色板颜色是像素B和C的平均值。
[0198] 在使用两种调色板颜色模式的情况下,可以在图9中的框904和906之间插入针对预定义阈值(其可以与框906中使用的阈值不同)的附加测试。如果测试确定可以使用两种调色板颜色模式(如上所述),则对像素数据进行平均,以形成两种调色板颜色,然后,可以将这些调色板颜色转换为 RGB7878格式(或者对于恒定α情况,可以将它们保留为RGB888),然后,将像素数据打包到数据字段中(框914)。如果测试确定不能使用两种调色板颜色模式,则该方法前进到框906。
[0199] 如上所详述,在数据压缩中有许多操作涉及将n比特数N转换为m比特数M,其中n>m。从n比特到m比特的理想映射由下式给出:
[0200]
[0201] 例如,这可以使用包括N个条目的大查找表(LUT)来实现。替代性地,由于结果围绕一半“对称”,因为:
[0202]
[0203] 其中 表示比特数X的补码,那么LUT的大小可以减半。在这样的示例中,可以保留LUT的一半(例如,下半部分),并且可以通过反转输入端的N-1个LSB来推导出表的另一半(例如,上半部分),并且类似地,通过反转输出端的M-1个LSB(例如,通过将X-1个LSB与MSB进行XOR 运算一输入端和输出端的MSB相同)。
[0204] 图12A是执行该转换的替代性方法的流程图。通过使用图12A的方法,可提供既精确又有效的硬件实现方式(例如在硬件中,即在尺寸方面等),如图12B所示。虽然它仍使用LUT,但LUT明显小于上述LUT(但需要额外的加法元素)。虽然本文在数据压缩的上下文中描述了该方法,但是本文中参考图12A描述的方法也可以用于其他情况并且独立于如本文所述的任何其他方法。
[0205] 如图12A所示,该方法包括接收输入的n比特数N,并将该数字从n 比特截断为m比特(框1202),并且这可以在图12B中的截断硬件单元1222 中实现。然后基于输入的n比特数N来确定调整值(框1204),并且如下所述,这可以使用查找逻辑单元1224中的多个AND和OR来实现。这些 AND和OR逻辑门(或替代性地功能上等效的替代逻辑布置)将输入n比特数的比特的多个预定子集与固定功能电路中的预定值进行比较并基于比较的结果,确定调整值,然后将其添加到递增/递减单元1226中的截断值(来自框1202和截断硬件单元1222)(框1206)。调整值的值为零、一或负一。
[0206] 查找逻辑单元1224确定调整值的操作(在框1204中)可以参考这样的具体示例来描述:其中n=8和m=5以及随后的VHDL(或其功能等同物),其中“0-0-111”是预定义比特序列的示例,并将该序列与输入n比特数中的比特以及“01”与其相关的调整值进行比较:
[0207] function CorrectionsFor8to5(i:std_logic_vector(7downto 0))
[0208] return std_logic_vector is
[0209] variable results:std_logic_vector(1downto 0);
[0210] begin
[0211] results:=(others=>′0′);
[0212] if std_match(i,″00---11-″)then results:=″01″;end if;
[0213] if std_match(i,″0-0--111″)then results:=results OR″01″;end if;
[0214] if std_match(i,″000--1-1″)then results:=results OR″01″;end if;
[0215] if std_match(i,″0-00011-″)then results:=results OR″01″;end if;
[0216] if std_match(i,″0--00111″)then results:=results OR″01″;end if;
[0217] if std_match(i,″1--11000″)then results:=results OR″11″;end if;
[0218] if std_match(i,″111---0″)then results:=results OR″11″;end if;
[0219] if std_match(i,″1-1110-″)then results:=results OR″11″;end if;
[0220] if std_match(i,″11---0-″)then results:=results OR″11″;end if;
[0221] if std_match(i,″1-1--000″)then results:=results OR″11″;end if;
[0222] retum results;
[0223] end function CorrectionsFor8to5;
[0224] 在此示例中,‘std_logic_vector(7downto 0)’指的是N的所有8比特(标记为0-7,比特0是LSB,比特8是MSB),函数‘std_match’可以使用AND 门来实现,例如,‘std_match(i,″00---11-″)’可以按如下方式来实现:
[0225]
[0226] 其中by是N的比特y,∧表示逻辑AND。类似地,‘std_match(i,″11---0-″)’可以实现为:
[0227]
[0228] 此外,在此示例中,‘results’的初始值设置为N的两个LSB(即比特0 和1),并且‘results’的最终值设置为01或00或使用OR门与取决于上述‘std_match’函数的结果的2比特值的组合的结果的初始值。这假设共享共同因素。估计对于n=8且m=5,需要大约31个AND/OR门来实现查找逻辑单元1224;然而,应当理解,可以替代性地使用任何等效的逻辑功能(例如,使用NAND、NOR、XOR等来实现),例如,取决于用于制造的工艺或目标时钟速度)。
[0229] 以这种方式,查找逻辑单元1224将输入的n比特数的比特的预定子集与固定功能电路中的预定值进行比较,并根据比较的结果来设置调整值。如上所述,通过使用AND/OR门在硬件中实现从n比特数到m比特数的转换以确定要应用于n比特数的截断版本的调整值,提供了用于执行特定转换(例如,8比特值转换到5比特值)的非常有效的实现方式(例如,就硅面积、等待时间和功耗而言)。在该示例中,硬件不太灵活,因为它是在固定功能电路中使用AND和OR门来实现,以用于执行一个或多个特定转换(例如,从8比特数转换为5比特数)。如果需要不同的转换,例如不同的n和/或m 值,则可以使用不同的硬件。对这种不灵活性的一个补偿是硬件可以非常有效地实现(就硅面积、延迟和功耗而言)。由于如本文所描述的压缩过程使用8比特到5比特转换器,并且这在设计时是已知的,因此不灵活性不是大问题,而效率优势却是显著的。
[0230] 尽管上面没有描述数据解压缩,但是应当理解,将上述数据压缩操作颠倒,即可实现数据解压缩。例如,当执行数据解压缩时,颠倒图3A、6A、 7A、8A、9和11的方法。图3B示出了数据解压缩的方法,该方法与图3A 所示的数据压缩方法相反。如图3B所示,对于已压缩数据的每个子块,从块模式标识压缩模式(框322),并且根据模式,使用可变α模式(框308′,与上述框308相反),或者恒定α模式(框306′,它是上述框306相反)对压缩的子块数据进行解压缩,对于使用任何其他数据压缩模式的情况,也类似地处理(框310′)。子块的数据解压缩(在框306′、308′、310′中)可以涉及将数字从n比特转换为m比特,其中n<m(例如,在对框602、702、802、 912、916和1112的逆操作中)。这可以使用图13A中所示的方法和图13B 中所示的硬件来实现。
[0231] 如图13A所示,该方法包括接收输入的n比特数N,并使用比特复制将该数字从n比特扩展到m比特(框1302),并且这可以在图13B中的复制硬件单元1322中实现。该比特复制涉及将N中的(m-n)个MSB附加到N 的最低有效端,以生成中间m比特数R,如图13C所示。如果m>2n,则(m-n)>n,因此,必须首先将所有n比特(即整个N)附加至少一次(例如k次),然后附加N的(m-kn-n)MSB,以形成中间m比特数R,如图13D所示。替代性地,可以按如下方式来描述比特复制操作:假设(n≤m)并且定义 并且r=m mod n,形成新值R,其在MSB位置包括N的k次重复,接着,在LSB中,N的r个MSB。
[0232] 然后基于输入的n比特数N来确定调整值(框1204),并且如下所述,这可以使用查找逻辑单元1224中的多个AND和OR门来实现。这些AND 和OR逻辑门(或替代性地功能上等效的替代逻辑布置)将N的比特的多个预定子集与固定功能电路中的预定值进行比较,并基于比较的结果,确定调整值,然后将其添加到递增/递减单元1226中的复制值(来自框1302和复制硬件单元1322)(框1306)调整值的值为零、一或负一。在一些示例中,即对于n和m的值的某些组合(其中n<m),调整值总是为零,因此可以从图13B中省略递增/递减元1226和查找逻辑单元1224。
[0233] 查找逻辑单元1224确定调整值的操作(在框1204中)可以参考这样的具体示例来描述:其中n=5和m=8以及随后的VHDL(或其功能等同物):
[0234] function CorrectionsFor5to8(i:std_logic_vector(4downto 0))
[0235] return std_logic_vector is
[0236] variable results:std_logic_vector(1downto 0);
[0237] begin
[0238] results:=(others=>′0′);
[0239] if std_match(i,″00-11″)then results:=″01″;end if;
[0240] if std_match(i,″11-00″)then results:=results OR″11″;end if;
[0241] return results;
[0242] end function CorrectionsFor5to8;
[0243] 在此示例中,‘std_logic_vector(4downto 0)’指的是N的所有5比特(标记为0-4,比特0是LSB,比特4是MSB),函数‘std match’可以使用AND 门来实现,例如,‘std_match(i,″00-11″)’可以按如下方式来实现:
[0244]
[0245] 其中by是N的比特y,Λ表示逻辑AND。类似地,‘std_match(i,″11-00″)’可以实现为:
[0246]
[0247] 此外,在此示例中,‘results’的初始值设置为N的两个LSB(即比特0 和1),并且‘results’的最终值设置为01或00,或设置为使用OR门与11组合的结果的初始值。估计对于n=5和m=8,需要大约7个AND/OR门来实现查找逻辑单元1224。
[0248] 查找逻辑单元1224将输入的n比特数的比特的预定子集与固定功能电路中的预定值进行比较,并根据比较的结果来设置调整值。如上所述,通过使用上述AND和OR门的固定功能硬件,允许就硅面积、等待时间和功耗而言非常有效地实现硬件。硬件可以被配置为针对n和m的一小组不同值来执行转换。
[0249] 下面的进一步示例示出了如何针对n和m的其他值来计算调整值(在框 1204和单元1224中)。
[0250] 对于n=8且m=4,以下示例VHDL示出了如何计算调整值(在框1204 和单元1224中):
[0251] function CorrectionsFor8to4(i:std_logic_vector(7 downto 0))
[0252] return std_logic_vector is
[0253] variable results:std_logic_vector(1 downto 0);
[0254] begin
[0255] results:=(others=>′0′);
[0256] if std_match(i,″00--11--″)then results:=″01″;end if;
[0257] if std_match(i,″000-1-1-″)then results:=results OR″01″;end if;
[0258] if std_match(i,″0-0-111-″)then results:=results OR″01″;end if;
[0259] if std_match(i,″00001--1″)then results:=results OR″01″;end if;
[0260] if std_match(i,″0-0011-1″)then results:=results OR″01″;end if;
[0261] if std_match(i,″00-01-11″)then results:=results OR″01″;end if;
[0262] if std_match(i,″0--01111″)then results:=results OR″01″;end if;
[0263] if std_match(i,″1--10000″)then results:=results OR″11″;end if;
[0264] if std_match(i,″11-10-00″)then results:=results OR″11″;end if;
[0265] if std_match(i,″1-1100-0″)then results:=results OR″11″;end if;
[0266] if std_match(i,″11110--0″)then results:=results OR″11″;end if;
[0267] if std_match(i,″1-1-000-″)then results:=results OR″11″;end if;
[0268] if std_match(i,″111-0-0-″)then results:=results OR″11″;end if;
[0269] if std_match(i,″11--00--″)then results:=results OR″11″;end if;
[0270] return results;
[0271] end function CorrectionsFor8to4;
[0272] 估计对于n=8和m=4,需要大约41个AND/OR门来实现查找逻辑单元 1224。相反,对于n=4和m=8,仅需要比特复制,并且在所有情况下,调整值均为零。
[0273] 对于n=8且m=3,以下示例VHDL示出了如何计算调整值(在框1204 和单元1224中):
[0274] function CorrectionsFor8to3(i:std_logic_vector(7 downto 0))
[0275] return std_logic_vector is
[0276] variable results:std_logic_vector(1 downto 0);
[0277] begin
[0278] results:=(others=>′0′);
[0279] if std_match(i,″00-11---″)then results:=″01″;end if;
[0280] if std_match(i,″0001-1--″)then results:=results OR″01″;end if;
[0281] if std_match(i,″0-0111--″)then results:=results OR″01″;end if;
[0282] if std_match(i,″0001--11″)then results:=results OR″01″;end if;
[0283] if std_match(i,″00-1-111″)then results:=results OR″01″;end if;
[0284] if std_match(i,″11-0-000″)then results:=results OR″11″;end if;
[0285] if std_match(i,″1110--00″)then results:=results OR″11″;end if;
[0286] if std_match(i,″1-1000--″)then results:=results OR″11″;end if;
[0287] if std_match(i,″11-00---″)then results:=results OR″11″;end if;
[0288] if std_match(i,″111-0--″)then results:=results OR″11″;end if;
[0289] return results;
[0290] end function CorrectionsFor8to3;
[0291] 估计对于n=8和m=3,需要大约31个AND/OR门来实现查找逻辑单元 1224。相反,对于n=3和m=8,仅需要比特复制,并且在所有情况下,调整值均为零。
[0292] 上面参考图2A-C、3A和4-11描述的压缩方法采用RGBA8888或 RGBX8888格式的源数据或通道为不同的顺序(例如ARGB)的相应格式作为输入。如上所述,在源数据不是这种格式的示例中,可以使用预处理步骤将源数据转换为适当的格式(例如,转换为888Z,其中Z是不大于8的整数)。可以参考图14描述该预处理步骤的第一示例,将RGBA10∶10∶10∶2格式的数据值转换为RGBA8883。下面参考图16描述了用于预处理10比特数据的替代性技术。通过使用这些预处理方法中的一者或两者,增大了满足压缩阈值的可能性(并且因此使用了图2A-C中的任何一个的主压缩单元202 中的无损压缩方法);但需要对由图2A-C所示的体系结构执行的方法进行小的修改,如下所述。此外,虽然本文根据上述压缩方法的预处理步骤描述了这些转换方法,但是两种转换方法可以替代性地独立于本文所述的任何其他方法使用。还应当理解,虽然由主压缩单元202实现的压缩方法本身是无损的,但如果与图14的转换方法(这不是无损的)结合使用,则整体数据压缩方法是有损的。图16的转换方法是无损的,因此适合用作主压缩单元 202的预处理步骤,因为整个方法仍然是无损的;但是,如果已经执行了图 16的方法,丢弃来自第四伪通道的任何比特,那么,整体数据压缩方法变得有损。
[0293] 图14示出了将像素数据从RGBA10∶10∶10∶2格式转换为RGBA8883的第一示例方法的流程图。如图14所示,检查每个RGB通道的MSB(框1402),并且如果这三个MSB中的一个或多个都等于一(在框1402中为“是”),则设置标志(框1404),否则不设置标志。该标志可以被称为高动态范围(HDR) 标志,因为如果至少一个MSB等于一,那么像素数据可能是HDR数据。 HDR图像可以表示比非HDR图像更大的亮度水平范围,并且HDR图像通常通过合并多个低或标准动态范围(LDR或SDR)照片或通过使用特殊图像传感器来创建。混合对数伽玛是HDR标准,它定义了一个非线性传递函数,其中信号值的下半部分(这是该范围的SDR部分)使用x2曲线,信号值的上半部分(这是该范围的HDR部分)使用对数曲线,并且白信号标准电平设置为0.5信号值。在R/G/B数据的10比特中,最高有效比特指出值在范围的下半部分(SDR部分)还是在范围的上半部分(HDR部分)。
[0294] 除了设置标志与否之外,取决于RGB通道的一个或多个MSB是否为一,像素数据以不同的方式从10比特减少到8比特。如果三个MSB中没有一个等于一(在框1402中为“否”),则通过移除MSB(已知为零)和LSB两者来截断RGB通道的每个10比特值(框1410)。如果三个MSB中的任何一个都等于一(在框1402中为“是”),则存在两种不同的方式可以将10比特值减少到8比特(在框1406中)。在第一示例中,可以从每个10比特值中移除两个LSB,并且在第二示例中,可以使用上面参考图12A-B描述的方法。
[0295] 在使用图12A的方法的情况下,n=10并且m=8,以下示例VHDL示出了如何计算调整值(在框1204和单元1224中):
[0296] function CorrectionsFor10to8(i:std_logic_vector(9downto 0))
[0297] return std_logic_vector is
[0298] variable results:std_logic_vector(1downto 0);
[0299] begin
[0300] results:=(others=>′0′);
[0301] if std_match(i,″00------11″)then results:=″01″;end if;
[0302] if std_match(i,″0-00----11″)then results:=results OR″01″;end if;
[0303] if std_match(i,″0-0-00--11″)then results:=results OR″01″;end if;
[0304] if std_match(i,″0-0-0-0011″)then results:=results OR″01″;end if;
[0305] if std_match(i,″1-1-1-1100″)then results:=results OR″11″;end if;
[0306] if std_match(i,″1-1-11--00″)then results:=results OR″11″;end if;
[0307] if std_match(i,″1-11----00″)then results:=results OR″11″;end if;
[0308] if std_match(i,″11------00″)then results:=results OR″11″;end if;
[0309] return results;
[0310] end function CorrectionsFor10to8;
[0311] 估计对于n=10和m=8,需要大约25个AND/OR门来实现查找逻辑单元1224。
[0312] 为了颠倒该映射(例如,如图13A所示),使得n=8且m=10,以下示例VHDL示出了如何计算调整值(在框1204和单元1224中):
[0313] function CorrectionsFor8to10(i:std_logic_vector(7downto 0))
[0314] return std_logic_vector is
[0315] variable results:std_logic_vector(1 downto 0);
[0316] begin
[0317] results:=(others=>′0′);
[0318] if std_march(i,″0011----″)then results:=″01″;end if;
[0319] if std_match(i,″001-11--″)then results:=results OR″01″;end if;
[0320] if std_match(i,″001-1-11″)then results:=results OR″01″;end if;
[0321] if std_match(i,″110-0-00″)then results:=results OR″11″;end if;
[0322] if std_match(i,″110-00--″)then results:=results OR″11″;end if;
[0323] if std_match(i,″1100----″)then results:=results OR″11″;end if;
[0324] return results;
[0325] end function CorrectionsFor8to10;
[0326] 估计对于n=8和m=10,需要大约19个AND/OR门来实现查找逻辑单元1224。
[0327] 不管像素的RGB通道的三个MSB的值如何,以相同的方式修改2比特α通道值。如图14所示,HDR标志被附加到现有的2比特值(框1408),使得输出α通道值为3比特。
[0328] 图14的方法可以每个像素地实现,但是在该方法的变体中,导致设置 HDR块的判定(在框1402中)可以替代性地执行得不太频繁,例如,子块或迷你块地。
[0329] 如上所述,在图14的方法被用作预处理步骤的情况下,在图2A-C所示的体系结构中实现的方法可以被稍微修改。具体地,测试和选择单元206(在图2A中)或测试和判定单元210(在图2B-C中)使用的压缩阈值是在预处理之前基于原始数据的大小来计算的,或者替代性地,可以修改阈值以考虑源数据中的α通道值的减小的大小(即3比特而不是8比特)。这意味着,例如,不是根据比率来定义压缩阈值,而是可以根据压缩数据块的大小(例如128字节)而不是比率来定义所使用的阈值。另外,在备用压缩单元204 实现上面参考图3A和4-11描述的方法的情况下,这种有损压缩方法也被修改,如下所述,因为α值的结果仅包括3比特,其中一个是HDR标志。
[0330] 在图3A的有损压缩方法的第一变体中,可以存在三个恒定α模式(在框306中)可与可变的α模式(在框308中)一起使用。这是因为只有四个可能的α值A(而不是其中α是8比特值的256个值),因此可以以比上面参考图5A-B所述的方式更简单的方式确定模式。每个恒定α模式都具有不同的预定义的constalphaval值,其可以通过使用插入块模式比特408(在图 4C中)的不同字段值来指定,因此constalphaval的值不需要单独存储(例如,如前面描述中的情况,在字段670-673中)。如下所述,在α值为零的情况下,它与可变α使用相同的字段值;然而,由于这样的块是完全透明的,因此RGB可能不如对于其他α值重要,并且在该模式中,数据被编码为好像α每个像素地可变。
[0331]
[0332] 然后,使用图11的方法来实现恒定α模式(框306),即,使用编码图案和三种调色板颜色;然而,在这种情况下,调色板颜色中每种颜色都表示为RGB676加上1比特HDR标志,因此块1112涉及与上述不同的转换。为了执行该转换,对于G通道,该值被截断,并且对于R和B通道,可以再次使用上面参考图12A-B描述的方法,其中n=8并且m=6,或者替代性地,可以简单地截断值。
[0333] 可以根据以下示例VHDL(或其功能等同物)来确定n=8和m=6的调整值(在框1204和查找逻辑单元1224中):
[0334] function CorrectionsFor8to6(i:std_logic_vector(7downto 0))
[0335] return std_logic_vector is
[0336] variable results:std_logic_vector(1 downto 0);
[0337] begin
[0338] results:=(others=>′0′);
[0339] if std_match(i,″0----11″)then results:=″01″;end if;
[0340] if std_match(i,″0-00--11″)then results:=results OR″01″;end if;
[0341] if std_match(i,″0-0-0011″)then results:=results OR″01″;end if;
[0342] if std_match(i,″1-1-1100″)then results:=results OR″11″;end if;
[0343] if std_match(i,″1-11--00″)then results:=results OR″11″;end if;
[0344] if std_match(i,″11----00″)then results:=results OR″11″;end if;
[0345] return results;
[0346] end function CorrectionsFor8to6;
[0347] 估计对于n=8和m=6,需要大约19个AND/OR门来实现查找逻辑单元 1224。
[0348] 可以根据以下示例VHDL(或其功能等同物)来实现反向映射(例如,如图13A所示),使得n=6且m=8:
[0349] function CorrectionsFor6to8(i:std_logic_vector(5downto0))
[0350] return std_logic_vector is
[0351] variable results:std_logic_vector(1 downto 0);
[0352] begin
[0353] results:=(others=>′0′);
[0354] if std_match(i,″0011--″)then results:=″01″;end if;
[0355] if std_match(i,″001-11″)then results:=results OR″01″;end if;
[0356] if std_match(i,″110-00″)then results:=results OR″11″;end if;
[0357] if std_match(i,″110--″)then results:=results OR″1 1″;end if;
[0358] return results;
[0359] end function CorrectionsFor6to8;
[0360] 此外,修改四色模式(在图11中),使得像素被表示为RGB554(而不是如上所述的RGB555,如在框602中)以及1比特HDR标志。可以如上所述(例如,参考图12A-B)执行将比特值从8比特减少到5比特或4比特的操作。
[0361] 在数据格式方面的类似修改也对可变α模式进行,如上面参考图9所述。特别地,三个调色板条目用1比特HDR标志,2个α比特和RGB665来编码(在框910-912中),并且四色模式使用1比特HDR标志,2个α比特和 RGB444(在框916中)。
[0362] 作为所使用的不同数据格式的结果,数据以与上述方式稍微不同的方式被打包到数据字段(即,如图6C所示的60比特数据字段660-663)中,这可以参考图15A-D来描述。图15A和15B涉及恒定α模式(如图11的框 1114中打包的),图15C和15D涉及可变α模式(如图9的框914中打包的)。图15A和15C示出了使用四色模式(框916和602)的打包。图15B 和15D示出了使用编码图案(框908-912和1112)的打包。图15C中所示的打包布置替换了图10C中所示并且如上所述的打包布置。图15D中所示的打包布置替换了图10B所示并且如上所述的打包布置。
[0363] 图16示出了将像素数据从10比特(例如RGBA10∶10∶10∶2)格式转换为8比特格式(例如8888格式)的第二示例方法的流程图。例如,该方法可以在RGBA10∶10∶10∶2格式数据被输入到主压缩单元202之前用作预处理步骤。可以参考图17中的示意图来描述图16中的示意图。如图17所示,输入像素数据包括四个输入通道1702-1708,这里称为RGBA通道,但该数据可以替代性地表示其他通道。该方法的输出是四个8比特伪通道。
[0364] RGB输入通道1702-1706中每个都包括10比特,并且A(α)输入通道 1708包括两比特。通过移除一个或多个LSB来截断每个RGB通道(框1602),并且在所示的方法中,通过从每个通道1711、1715和G通道移除三个比特,将R和B通道截断为7比特1710、1714,通过移除两个比特1713,将G通道截断为8比特1712。通过截断G通道形成的8比特通道1712,形成了四个输出伪通道之一(框1604)。
[0365] 在将一个比特1716作为新的MSB附加到截断的R数据1710上以形成四个输出伪通道1720中的另一个之前,可选地对α通道数据进行格雷编码 (框1606),并且将来自(可选地格雷编码的)α通道数据的另一个比特1718 作为新的MSB附加到截断的B数据1714上以形成四个输出伪通道1722中的再一个(框1608)。
[0366] 四个输出伪通道1730中的第四个由误差值形成。在一个示例中,为了生成误差值,复制截断的RGB787数据1710、1712、1714,使得每个通道都包括10比特1724、1726、1728(框1610)。如图17所示,该比特复制涉及复制三个(对于R和B)或两个(对于G)MSB,并将它们作为新LSB 附加到已截断的数据。然后,将更新的10∶10∶10数据的这些新LSB与输入数据通道
1711、1713、1715的相应数量的原始LSB组合以生成误差值(框 1612)。组合这三个或两个比特值的一种方法是使用减法运算(对于R和B,模8,对于G,模4),如下所示:
[0367] Red error=(3new red LSBs-3LSBs ofinput red data)mod 8
[0368] Green error=(2new green LSBs-2LSBs of input green data)mod 4
[0369] Blue error=(3new blue LSBs-3LSBs of input blue data)mod 8
[0370] 但是,通过使用XOR,如图17所示,可提供更紧凑的硬件实现方式。在其他示例中,可以使用任何可逆函数。在替代性示例中,在框1612中,代替执行将MSB作为新的LSB比特复制到截断数据的操作,截断RGB787 数据的三个(对于R和B)和两个(对于G)MSB可以直接与输入数据通道1711、1713、1715的原始LSB组合,以生成误差值。如上所述,该组合可以通过减法、XOR或任何合适的可逆函数来实现。
[0371] 生成了三个误差值(在框1612中)后,将它们打包在一起以形成第四伪通道1730(框1614)。这可以通过连接三个误差值来形成,或者替代性地,来自误差值的比特可以被交织,使得伪通道1730的三个LSB 1732包括来自三个误差值中的每一个的LSB,伪通道1730的两个MSB 1734包括来自红色和蓝色误差值中的每一个的MSB,并且中间三个比特1736包括剩余的三个比特,三个误差值中的每一个各有一个,如图17所示。通过使用第四伪通道1730中的这种比特布置,最小化了由丢弃这些比特中的一个或多个而导致的图像质量的降低(例如,如下面参考图18A所述)。例如,如果丢弃第四伪通道1730的3个LSB,则会导致每个RGB通道的误差值的单个 MSB丢失,而不是丢失其中一个通道(例如,B通道)的整个误差值。
[0372] 以下伪代码(或其功能等同物)可用于实现图16的方法:
[0373] r′[9:0]:=Replicate(Truncate(r[9:0],10,7),7,10);
[0374] g′[9:0]:=Replicate(Truncate(g[9:0],10,8),8,10);
[0375] b′[9:0]:=Replicate(Truncate(b[9:0],10,7),7,10);
[0376] r_x[2:0]:=r′[2:0]xor r[2:0];
[0377] g_x[1:0]:=g′[1:0]xorg[1:0];
[0378] b_x[2:0]:=b′[2:0]xor b[2:0];
[0379] a’[1:0]:={a[1],a[1]xor a[0]}
[0380] ch0Red:={a’[0],r′[9:3]}
[0381] ch1_Gm:=g′[9:2]
[0382] ch2Blu:={a’[1],b′[9:3]}
[0383] ch3Lsb:={r_x[2],b_x[2],r_x[1],g_x[1],b_x[1],r_x[0],g_x[0],b_x[0]}[0384] 虽然图16和17以及上面的伪代码示出了来自α通道的比特被作为MSB 附加在截断的R和B通道数据上(在框1608中),在其他示例中,α比特可以插入在不同的位置(例如,作为LSB或插入在截断的7比特数据中间)。然而,当将该方法与无损压缩技术结合使用时,可以通过作为MSB定位α比特来改进可以实现的数据压缩。
[0385] 然后,使用图16的方法生成的四个8比特伪通道1720、1712、1722、 1730可以被馈送到被设计为对RGBX8888数据进行操作的数据压缩方法中,例如由图2中的主压缩单元202实现的无损压缩方法。
[0386] 如上所述,使用对α通道的格雷编码(框1606)是可选的。通过使用格雷编码(其中当值增大一时仅一个比特改变),可以使用无损压缩方法(例如下面参考图20A-B、21A-B和22描述和/或在编号为GB2530312的英国专利中描述的)来实现的数据压缩量增大(例如增大1-2%)。这是因为它减少了α通道对颜色和/或空间去相关步骤的影响,α通道通常与R、G或B数据不相关,而颜色和/或空间去相关步骤是无损压缩中常见的第一(或早期) 步骤。颜色通道去相关通常使用颜色变换,例如:
[0387] R*=R-Gmod28
[0388] G*=G
[0389] B*=B-Gmod28
[0390] A*=A
[0391] 在已经执行了图16的预处理的情况下,伪通道不对应于原始颜色数据,而是将α数据组合到红色和蓝色通道中。在α值发生变化的情况下,R*和 B*的值可以从一个像素到下一个像素显著变化,使数据更难压缩;但是,通过使用格雷编码,任何单个值变化仅影响R*或B*,而不会同时影响两者。
[0392] 如同图14的方法的情况,如果图16的方法被用作预处理步骤,则在图 2A-C所示的体系结构中实现的方法可以被稍微修改。特别地,在图16的方法被用作主压缩单元202的预处理步骤的情况下,图2A中的测试和选择单元206或者图2B或2C中的测试和判定单元210可以考虑附加选项。在上述方法中,这些测试和判定/选择单元206、210将由主压缩单元202生成的压缩数据与压缩阈值进行比较,如果满足压缩阈值,则输出由主压缩单元202 生成的压缩数据。如果不满足阈值,则替代地输出由备用压缩单元204(或子单元204A、204B)压缩的数据。在使用图16的预处理方法的情况下,如果由主压缩单元202生成的压缩数据不满足压缩阈值,则可以通过丢弃对应于第四伪通道1730(即,由误差值形成的伪通道)的所有数据来进一步减小压缩数据的大小。在这种实现方式中,只有在丢弃了对应于第四伪通道的全部数据之后,压缩阈值仍未满足时,才输出由备用压缩单元204(或子单元 204A、204B)生成的压缩数据。这减少了在数据压缩中丢失的数据量(因为较少使用备用压缩单元204中的有损压缩方法),因此改善了随后解压缩数据的质量。
[0393] 代替丢弃整个第四伪通道,下面参考图19A描述的比特预测技术可以替代地用于在压缩之前部分地丢弃比特。在进一步的变体中,可以丢弃第四伪通道的比特的子集,然后可以将数据反馈到主压缩单元202中。
[0394] 图18A示出了数据压缩方法的流程图,该方法将图16的预处理方法(框 1802)与例如GB2530312所描述的和/或下文参考图20A-B、21A-B和22所描述的无损数据压缩方法(框1804)相结合。如上所述,可以丢弃第四伪通道中的一些或全部(在框1804中)以增大数据压缩量。如上所述,可以实现该丢弃,以确保满足压缩阈值(如图2A-C中所示),或者可以实现该丢弃以改进压缩但没有任何定义的阈值或测试和判定过程。为了使解压缩硬件能够以相同的方式操作而不管是否丢弃了部分或全部第四伪通道数据(在框 1804中),当丢弃该数据时,可以为该通道保留一个或多个零(例如,包含全零的单字节数据)或另一个恒定的、预定义的比特序列。替代性地,可以使用特殊的打包代码或其他装置来向解压缩器指出已经丢弃了第四伪通道数据。然后,可以如下面参考图18B所述进行解压缩。
[0395] 如图18B所示,首先使用在压缩数据(在框1802中)时使用的无损压缩方法的逆来对压缩数据进行解压缩(框1810)。该操作以888X格式输出数据,因为第四通道可以是8比特或更少,取决于丢弃了多少数据(如上所述)并且可以完全不存在。然后,重建第四通道,使得其包括用于像素的8 比特(框1812),并且这可以通过添加零或另一预定义比特序列来实现。如上所述,一个或多个零或比特序列可以存在于压缩数据中并用于重建(在框 1812中),或者替代性地,重建可以基于已知约定进行,而不需要与压缩数据中的第四通道相关的任何比特。
[0396] 然后,可以通过从第一和第三通道中移除MSB并将它们连接起来(随后是可选的格雷解码,这用于数据压缩)来提取(框1814)α通道数据,留下787格式数据,其通过比特复制扩展为10∶10∶10格式(框1816)。然后,应用来自第四伪通道的误差值,这是使用用于生成这些误差值的函数的逆来进行的(在框1612中)。在图18B所示的示例中,使用XOR逻辑门或等效逻辑块,将来自每个通道的LSB(例如,来自第一和第三通道的3个比特和来自第二通道的两个比特)与来自第四通道的相应比特组合(框1818)。在先前丢弃来自第四通道的任何比特的情况下,与零的XOR将不会改变LSB 的值。在重建中使用不包括全零的预定义比特序列的示例中,可以使用替代性函数来在压缩数据时生成误差值(在框1612)和在解压缩数据时应用误差值(在框1818)。
[0397] 在示例实现方式中,可以使用图14和16的预处理方法两者。在这样的示例中,图14所示和上述的预处理方法可以用于在RGBA10∶10∶10∶2格式数据被输入到备用压缩单元204之前预处理这种格式的数据,或者可以在初始备用压缩子单元204A之前实现或由该初始备用压缩子单元实现。图16所示和上述的预处理方法可用于在RGBA10∶10∶10∶2格式数据被输入到主压缩单元202之前对其进行预处理。
[0398] 上面描述的方法是参考RGBA或RGBX数据描述的,但如上所述,这些方法也可以用于除图像数据之外的数据,其中四个通道中的三个(例如上面的RGB通道)在一些通道中以某种方式相互关联(例如颜色或空间相关)。对于某些类型的数据,例如YUV或YCbCr数据(其中YCbCr数据是数字亮度和两个色度分量,YUV是其模拟对应物,但它也可以用于表示YCbCr),它们通常以两种或三种平面格式排列(例如,取决于U和V数据是分开的还是交织的),在数据块内的通道之间可能存在很少相关性或没有相关性,因为通道通常是通过聚集不相交的(尽管是相邻的)单通道或双通道像素块来组装的,例如只有Y、只有U或只有V或只有UV的多个瓦片被打包为块的通道。结果,虽然可以使用上述压缩方法,并且尽管有损压缩方法的调色板模式(例如,如上参考图9的框908-912所述)在数据具有强空间以及在通道之间存在良好相关性的情况下有效,但是它们不适用于YUV或 YCbCr数据(或其他不相关的数据类型),因为难以根据其邻居来预测值,因此它过分依赖于四色模式(图9的框916)。
[0399] 图19A是数据压缩单元的示意图,与仅实现无损压缩方法的主压缩单元 202相比,该数据压缩单元增大了所实现的压缩量,所述无损压缩方法是例如在编号为GB2530312的英国专利中描述的方法或下面参考图20A-B、 21A-B和22描述的方法。图19A中所示的数据压缩单元可以用作图2A-C 中任何一个的体系结构中的主压缩单元202,特别是在输入数据不跨通道相关并且因此不能从颜色去相关或调色板中大大受益的情况下。此外,由于图 19A的数据压缩单元可以对每个通道单独操作,所以它可以在主压缩单元 202中仅针对通道的子集(例如,针对使用图16的方法创建的α通道或第四伪通道)来实现,同时使用无损压缩方法来压缩剩余的通道,所述无损压缩方法是例如在编号为GB2530312的英国专利中描述的方法或下面参考图 20A-B、21A-B和22描述的方法。在图19的数据压缩单元被用作图
2A-C 中任一个的体系结构中的主压缩单元202的示例中,对备用压缩单元204的依赖较少,这可能会涉及更严重的量化,因此导致图像质量的更大降低。
[0400] 图19A所示的数据压缩单元可替代性地与图2A-C所示的体系结构分开使用,即没有任何测试和选择/判定单元206、210或备用压缩单元206,并且不需要保证满足压缩阈值。相反,通过使用图19A所示的数据压缩单元,可以增大总体实现的数据压缩量,并且可以针对特定的压缩比。图19A中所示的数据压缩单元也可以与不同于在编号为GB2530312的英国专利中描述的压缩方法或以下参考图20A-B、21A-B和22描述的方法一起使用,和/或用于压缩除图像数据之外的数据(例如,用于压缩具有压缩算法以及多级量化的任何数据,其中进一步量化提高了压缩算法的效率)。
[0401] 如图19A所示,源数据块(出于以下描述的目的,假设为8888格式) 被分割,并且每个通道可以被单独考虑(如图19A中的虚线框所示)。替代性地,可以一起考虑两个或更多个通道(或通道的任何子集)(并且在这种情况下,确定的总大小涉及一起考虑的所有通道)。例如,可以一起考虑 RGB数据,在三个颜色通道上均匀地选择单个量化水平(即单个映射参数)。以下描述仅通过示例的方式来分别考虑每个通道。
[0402] 单个通道的数据被输入到比特预测器元件1902和x比特重新映射元件 1904。基于来自比特预测器元件1902的输入-称为映射参数,来控制x比特重新映射元件的操作。该映射参数指定由x比特重新映射元件1904执行的数据转换或截断操作,特别地,该映射参数指定值x。通过选择较低的x 值,增大了所实现的数据压缩量,然而,由于重新映射是有损操作,因此精度降低。由x比特重新映射元件1904执行的数据转换操作还可以包括诸如低通滤波之类的操作,其中映射参数x确定数据的滤波程度。
[0403] 比特预测器元件1902的操作在图19B中示出。比特预测器元件1902获取通道的数据(例如,数据块中的每个像素的每像素8比特),使用与数据压缩元件1906中使用的相同数据压缩方法对其进行压缩(框1922),然而,可以省略数据压缩方法的一些操作(例如,在熵编码之后的那些操作)。例如,比特预测器元件1902可以不将压缩数据打包到压缩数据块中,而是可以仅确定压缩数据的总大小(框1924)。然后,将该总大小与多个阈值(例如,AY、BY、CY、DY,其可以例如存储在查找表中)进行比较,并且基于比较,确定并输出映射参数(即,量化水平,并因此确定x的值)(框1926)。
[0404] 在比特预测器元件1902内的数据压缩是使用无损压缩方法来执行的示例中,所述无损压缩方法是例如在编号为GB2530312的英国专利中描述的方法或者下面参考图20A-B、21A-B和22描述的方法,比特预测器元件1902 可以使用小波变换、符号重新映射和组长度生成来压缩数据(在框1922中);然而,分组长度代码、打包模式代码和数据的实际打包可以省略,因为它们不是生成压缩块大小所必需的。在这样的示例中,通道的压缩数据的总大小可以由通道的可变长度数据的大小给出(参见下面的图20A-B、21A-B和22 的描述)。可以通过将除了左上角之外的每个组(其包括2x2组值)的系数长度的四倍相加来计算该大小。可以通过将相邻值组合成四个值一组的组,来确定组大小,然后将编码其中最大值所需的比特数用作组比特深度,并且在块中编码。组的大小是该比特深度的四倍。左上组的处理方式不同,因为参考值始终以完全精度存储,其大小可以根据查找表来确定。在其他示例中,可以在比特预测器元件1902和数据压缩元件1906内使用任何合适的数据压缩方法。
[0405] 与多个阈值的比较(在框1926中)可以例如按如以下伪代码(或其功能等同物)中所示的方式来实现,其中Chan Size是通道的压缩数据的总大小:
[0406] If(Chan Size≤AY)x=8
[0407] Else if(Chan Size≤BY)x=7
[0408] Else if(Chan Size≤CY)x=6
[0409] Else if(Chan Size≤DY)x=5
[0410] Else x=4
[0411] 在各种示例中,可以使用查找表。伪代码(或查找表)包括至少两行但可包括更多行。此外,虽然x的值在本文中被描述为指实际比特深度,但是在其他示例中,映射参数x可以对应于一组不同的量化。
[0412] 比特预测器元件1902使用的多个阈值(例如,AY、BY、CY、DY)中的每一个的值可以通过使用不同的阈值配置来多次压缩大的训练图像集并且分析所得到的压缩数据的大小或给定目标压缩比的图像质量度量的分数来确定。阈值可以被设置为实现特定的压缩阈值或目标压缩比,或者可以被校准以最小化有损压缩的某些伪象,例如块伪象或条带。还可以设置阈值,以便仅对那些不能很好地压缩的块进行量化。
[0413] 在比特预测器元件1902确定了映射参数(即x的值)之后,x比特重新映射元件1904将输入数据从其原始格式转换为每像素x比特,其中x是映射参数,原始格式可以是每像素8比特。该转换例如可以使用截断,或者可以替代性地使用上面参考图12A-B描述的方法。如上所述,在其他示例中,映射参数可以对应于一组不同的量化而不是实际的比特深度,并且在这样的示例中,重新映射元件1904基于映射参数来转换输入数据。在其他示例中,可以不改变比特深度,而是可以在映射参数x的控制下,通过低通滤波来减少信息内容。替代性地,可以采用滤波和比特精度降低两者的组合。
[0414] 由x比特重新映射元件1904生成的数据被输入到数据压缩元件1906,然后,数据压缩元件使用数据压缩方法来压缩数据,数据压缩方法是例如在编号为GB2530312的英国专利中描述的无损压缩方法或下面参考图20A-B、 21A-B和22所描述的方法。应当理解,虽然该方法可以被描述为无损的,并且可以基于输入到数据压缩元件1906的数据而无损,但是,由于x比特映射元件1904执行的转换可能是有损的,因此所得到的压缩数据相对于源数据不是无损的。
[0415] 为了随后可以解压缩数据,必须以某种方式将x的值包括在压缩数据中,以便可以使用正确的逆映射。图19C示出了可以将四个通道的数据打包到压缩数据块中的方式的示例(在框1910中)。如图19C所示,在数据压缩方法包括熵编码的情况下,每个通道1930-1933的数据大小可以不同。8比特模式字段1940包括每个通道的2比特打包模式。可能的打包模式之一可用于指出x<8;然而,给定可用的比特数,在不增大模式字段1940的大小的情况下,不可能在打包模式中包括通道的x值。因此,比特深度编码元件1908 可以在由数据压缩元件1906生成的数据中对x的值(其中它小于8)进行编码。例如,x的值可以在压缩通道的参考值字段内被编码,例如,通过将最低有效未使用比特从0改变为1,即一元编码。如下面参考20A-B、21A-B 和22所述,参考值是未被熵编码但包括在编码数据的指定参考值字段中的数据值(由数据压缩元件1906生成)。例如,可以修改该参考值以按如下方式对x的值进行编码(其中‘0b′是二进制值指示符,并且e、f、g、h、i、 j、k用于标识用于编码参考值的比特):
[0416]X 原始值 编码
7 0b0efghijk 0b1efghijk
6 0b00fghijk 0b01fghijk
5 0b000ghijk 0b001ghijk
4 0b0000hijk 0b0001hijk
[0417] 如果压缩数据没有可被利用的冗余,则值x可以替代地与压缩数据一起打包,例如,占用标头字节。可以在解压缩时读取它,以确定在对块进行解压缩之后要执行哪个逆映射,以便将数据映射回其原始精度。
[0418] 图19A还示出了可选的v比特重新映射元件1912。这可以用于减少比特预测器元件1902使用的通道的源数据中的每像素的比特数。y比特重新映射元件1912可以使用截断或上面参考图12A-B描述的方法来减少源数据的比特深度。比特深度,即y的值,可以是4到8之间的值,其中y=8提供最准确的预测(即,在选择x的值以满足总体压缩阈值或目标方面)但是在比特预测器元件1912执行的操作方面是最昂贵的。y=4的值提供最不准确的预测,但在由比特预测器元件1902实现的硬件和操作方面最便宜。类似于值x,值y可以对应于某种其他类型的量化,例如,低通滤波器。通过从数据中去除噪声,可以提高预测器结果的准确性,并且由于原始数据中的小扰动,可能更不易于改变。
[0419] 应当理解,虽然上面的图19A-C的描述指的是每个通道每像素包括8 比特的源数据,也可以使用这样的方法,其中每个通道每个像素有更多或更少的比特,例如,10个,这可能导致使用更多或更少的阈值(在框1926中)。
[0420] 在源数据是10比特数据而不是8888数据的示例中,数据压缩单元可以包括附加的预处理元件,图19A中未示出。该预处理元件可以执行类似于上面参考图16和17描述的数据转换。截断10比特值,然后使用比特复制,将其扩展回10比特值,从而生成新的LSB,并通过将每个原始10比特值的 LSB与相应截断的扩展值的新LSB进行XOR,来生成误差值。三个瓦片(对应于三个输入声道)的8个MSB形成第一、第二和第三伪声道,而误差值被打包到第四伪声道中,如上所述并在图17中示出。然后,在比特预测器元件1902中对前三个伪通道使用一组阈值,并且这些阈值可以与用于8888 数据的阈值不同。第二组阈值(也可以与用于8888数据的阈值不同)用于第四伪通道,并且可以减少量化选项,例如,仅限6比特和3比特。
在图19A 的数据压缩单元被用作图2A-C的任何体系结构中的主数据压缩单元202的情况下,测试和选择/判定单元也不同地操作。最初检查所有四个伪通道是否适合目标大小,在这种情况下它们被包括在内。如果它们都不合适,则检查前三个伪通道是否适合单个附加字节,如果是,则第四个伪通道被恒定零通道替换(占用单个字节)。如果此测试仍不满足目标压缩阈值,则使用备用压缩单元的输出。随后可以使用上面参考图18B描述的方法的修改版本来解压缩数据。
[0421] 在图19A中示出的数据压缩单元以特定压缩比(例如50%)为目标并使用编号为GB2530312的英国专利中描述的无损压缩方法或下面参考图 20A-B、21A-B和22描述的方法的示例中,压缩方法的RAW模式可以被修改以不同精度存储数据,例如4比特而不是8比特。
[0422] 图19A中所示的数据压缩单元是能够压缩多种类型的数据,例如YUM、 RGB(A)、非图像数据等的通用单元。它适用于量化/有损压缩的各种组合,并且可用于提高压缩比或针对特定压缩比。可以校准所使用的阈值以产生期望的属性,例如最小化块伪象或条带或优化给定的度量分数,并且可以保守地设置阈值,以便最小化执行有损压缩的备用压缩单元的使用(如果提供)。数据压缩单元也是高度可配置的,并且可以在比特预测器元件1902的成本/ 复杂性与数据压缩的准确性和性能之间进行权衡。另外,它是高度可扩展的,并且可以例如仅应用于数据的子集,例如,仅应用于α通道。
[0423] 无损压缩方法的第一示例可以在主压缩单元202(图2A-C中示出并且如上所述)中以及在图19A中所示的数据压缩单元(例如在编号为2530312 英国专利所描述的比特预测器元件1902和数据压缩元件1906内)内实现。编号为2530312的英国专利描述了一种数据压缩系统,其中通过执行颜色去相关、空间去相关和熵编码来压缩8x8块图像数据,然后将得到的编码数据值打包成数据包以便存储。在该专利中描述的系统中,每次迭代都处理来自块的一行数据值。指数哥伦布编码的修改版本用于熵编码,其中每个系数都存储一个前缀以指出随后由后缀标识的值的范围。对于每个编码系数都具有前缀和后缀,使得同时解码多个值变得困难,因为快速确定编码比特之间的边界的位置并不简单。
[0424] 可以在主压缩单元202(图2A-C中示出并且如上所述)中实现的无损压缩方法的第二示例可以参考图20A-B、21A-B和22描述。如编号为2530312 的英国专利中所述并在图20A-B中示出,数据压缩可以包括以下步骤(不一定按此顺序):分成块,格式转换(框2024),颜色通道去相关(框2024,例如如上所述),空间去相关(框2026),熵编码(方框2028),然后存储。
[0425] 根据可变长度编码(VLC)方案来执行熵编码(在框2028中),使得熵编码值很可能不会全部具有相同数量的比特。通常,更可能的值用更少的比特来编码。以这种方式,可能通过熵编码来减少用于编码数据块中的所有数据值的总比特数。在某些情况下,空间去相关可以扩展数据,并且这些情况可以被视为特殊情况(即,与其他情况不同地处理数据)以限制扩展。
[0426] VLC编码可以合理地直接以高速率执行,但是以匹配速率进行VLC解码可能明显更加困难,因为在分析编码数据之前,连续存储的编码数据值之间的比特边界是未知的,即,在分析编码数据之前,不知道编码数据值的长度。特别是,当编码时,可以将多个符号独立地映射到它们对应的代码和代码长度,然后合并成连续的输出比特流。然而,通常在解码时,顺序检查编码比特流中的每个代码,以便确定其长度,进而确定下一个代码的开始位置。换句话说,需要找到不同编码数据值之间的比特边界。
[0427] 在该第二示例方法中,对多组数据值(例如,2x2组数据值)执行熵编码。对于每组数据值,在编码输出中(例如,在其标头部分中)包括指示,以指出对表示该组数据值的每个编码数据值使用了多少比特。然后,根据指出的比特数,将编码数据值包括在编码输出中。该系统意味着,简化了编码数据值的解码(与编号为2530312的英国专利的系统相比),因为简单地读取指示(例如在标头中)允许确定不同编码数据值之间的比特边界。换句话说,指示允许快速确定相应编码数据部分的大小(例如,仅在单个时钟周期内)。下面将参考图
21A-B和22来更详细地描述这一点。
[0428] 图21A示出了8x8数据值块2100,其已被空间去相关模块2004之一空间去相关并重新映射。数据值涉及相应像素值。参考图22中所示的流程图描述了在熵编码模块2006处对数据值块执行熵编码的方法。熵编码模块 2006输出编码数据输出2110(如图21B所示),其包括编码数据值以表示 8x8块2100中的数据值。编码数据输出2110具有可变长度,这取决于可以通过熵编码过程实现的压缩。特别地,在块2100中的每个接收到的数据值包括8比特(即1字节)的示例中,编码数据输出2110包括8比特(1字节) 宽的参考值字段2112,48比特(6字节)宽的大小指示字段2114,以及在该示例中,已被配置为保持字段的8比特对齐的可变大小字段,是在8比特 (1字节)和448比特(56字节)宽之间的任一值。如果熵编码过程不能无损地表示数据块2100中的数据值而不超过编码数据输出2110中可用的比特数(即504比特或63字节),则数据块2100中的数据值是以原始形式存储在编码数据输出中,每个数据值有8比特。其中放置了编码数据输出的数据包的标头部分具有指出数据包内的编码数据的格式的指示。例如,该指示可以包括两个比特,以便可以设置多达四种不同的编码模式,其可以包括原始数据格式、熵编码格式和恒定格式(其中块内的所有数据值都具有相同的值,使得该值可以存储一次(使用8比特)以表示块内每个数据值的值。
[0429] 在熵编码模块2006处接收数据值块(框2202)。块的行和列如图21A 所示排列。数据值块2100包括多组数据值(在该示例中,大多数是2x2组数据值(与2x2像素值组相关),但在其他示例中,这些组可以是不同形状和/或大小)。块2100包括十五个2x2组数据值,以及一个特别组(在块的左上方),其仅包括三个数据值。左上的数据值(A0)不是熵编码的,而是位置A0处的数据值被包括在编码数据输出2110的参考值字段2112中(框 2204)。由于左上角的组表示与块中的其他组相比的类似大小的组,但是减去将用作参考值的数据值,因此左上角的组包括比其他组中的每一个组更少的(例如3个而不是4个)数据值。
[0430] 在图21A所示的示例中,出于熵编码的目的,块中的行具有顺序A″、 E″、C″、G″、B″、D″、F″、H″,并且块中的列具有顺序0、4、2、6、1、3、 5、7。其他示例可以以不同于图21A所示的方式对行和列排序。图21A所示的示例顺序与空间去相关模块处理行的顺序不完全匹配(例如,行6显示在行1和3上方)。除了左上角2x2组(仅对三个值进行分组并且编码略有不同)之外,每个对齐的2x2值的组将被一起编码。这样选择此示例分组,以便:(a)组中的值属于(如果可能)相同的空间频率,以及(b)组中的值来自可能空间上在附近的像素。这样做是因为它们更可能在幅度上“相似”,因此可以更有效地压缩组。
[0431] 如上所述,数据值是无符号的,其分布偏向零(由于颜色相关和空间去相关过程)。因此,数据值可能具有前导零。因此,可以简单地通过从数据值中移除一个或多个前导零(如果可能)来压缩数据值。使用指示来指出已移除多少个前导零。
[0432] 左上角的四个数据值的组的处理方式不同:(a)左上角像素用作参考并单独存储,以及(b)其余三个值具有不同的编码方案,该方案已针对大的一组图像数据“训练”,以便:(i)为了对齐目的,用于表示三个值的总比特数是4的倍数(这与2x2块匹配),以及(ii)总存储成本(用于训练图像组)已被最小化。处理块的左上方的特定数据值组(框2206)。具体地,特定组的指示被包括在大小指示字段2114中(框2208)。对于块2100中的相应数据值组,大小指示字段中的每个指示都具有三个比特。该3比特指示可以用作查找表的索引,以检索特定组中的每个数据值的多个比特,使得每个值的比特数足以存储该值。块2100中有十六组数据值,使得大小指示字段包括48比特(即3*16比特)或6字节。一个块中的十五组数据值(四个数据值一组)将被编码为是四的倍数的比特数(因为,如下所述,一组(四个数据值)中的每个编码数据值都具有相同的比特数),并且在任何给定的行上,这十五个组中的每一个都贡献两比特的倍数。为了保持压缩数据的方便对齐(因为限制数据对齐可以降低硬件复杂性),对仅具有3个元素的左上方的组可用的选项应用限制。左上角的组有三个数据值,其中一个(E0) 在行0中。为了硬件效率,期望行的总数据是偶数比特,因此可用于表示该数据值的编码数据值的可能长度被限制为偶数。类似地,用于表示该组的另外两个数据值(A4和E4)的两个编码数据值的组合长度总和为偶数值。此外,在此示例中,编码数据输出中所有编码数据值的组合长度将向上舍入到最近的字节(以便编码数据输出在字节边界上对齐),以及块中所有其他数据值的组。因此,用于编码左上方数据值组的总比特数也是四的倍数。
[0433] 利用包括三比特的大小指示符,可以设置用于编码数据值的八组长度。例如,下表显示了编码数据值的一些可能长度,这些长度可以由左上块的八个不同大小指示来表示。下表中显示的长度是通过评估非常大的一组图像并选择导致最低的总存储成本的组合(从非常大的一组可能组合)来实现的。
[0434]大小指示 E0 A4 E4 总长度
000 0 0 0 0
001 2 1 1 4
010 2 3 3 8
011 4 3 5 12
100 4 5 3 12
101 6 5 5 16
110 6 7 7 20
111 8 8 8 24
[0435]  熵编码模块2006通过从数据值中去除前导零,来从可能的选项(例如,如上表中所示)中选择具有能够(无损地)表示{E0,A4,E4}三元组的最小总长度的编码。在不分胜负的情况下(例如,如果在上表中示出的示例中在大小指示011和100之间进行决定),可以选择不分胜负代码中的任何一个,但是作为示例,可以选择具有最小数字编码的代码(例如,011)。
[0436] 左上组的编码数据值被包括在编码数据输出2110的可变大小字段2116 中(例如,在可变大小字段2116的开始处)(框2210)。
[0437] 然后,处理块2100中的剩余(例如十五个)数据值组(框2212)。具体地,确定用于表示一组的数据值的最大值的多个比特(例如,最小比特数) (框2214),并且在该组的编码数据输出2110的大小指示字段2114中包括所确定的比特数的指示(框2216)。框2214可以通过以下方式实现:找到该组中的哪个数据值具有最小数量的前导零,然后标识将足够的最小可用编码。注意,并非所有可能的数据长度都可用于被编码。例如,如下面的示例中所述,七比特的数据长度不可用于被编码。因此,所确定的比特数可以是最小“有效”比特数,其可以用于表示该组中的接收到的数据值的最大值,其中如果可以由要包括在大小指示字段2114中的指示来指出比特数是有效的,则它是有效的。例如,可以有一组预定的有效比特数,其可以由所述指示来指出(例如,如上表中所列),并且最小有效比特数可以是预定组中有效比特数的最小值,其足以表示该组中接收到的数据值的最大值。
[0438] 当已经确定要用于表示一组中的每个编码数据值的比特数时,可以从该组中的每个数据值中移除一些前导零(如果适当的话),从而确定编码数据值,使得该组中的每个编码数据值都具有该组的确定比特数。
[0439] 表示该组中的数据值的编码数据值被包括在编码数据输出2110的可变大小字段2116中(框2218)。编码数据值被包括在可变大小字段2116中的顺序是预定的,并且与指示被包括在大小指示字段2114中的顺序相对应,使得当编码数据值被解码时,块内的解码数据值是已知的。
[0440] 例如,如果一组中的四个数据值是00000011、00000100、00000001和 00000000,则00000100是该组中的最大值,三是可用于表示最大值的最小比特数。三是在上表中示出的示例中的有效比特数,从这个意义上来说,可以包括一个指示以指出该组的每个编码数据值都具有三个比特。因此,可以从该组中的每个数据值中移除五个前导零。因此,该组的编码数据值是011、 100、001和000,并且这些编码数据值被包括在可变大小字段2116中。指出三个比特用于表示该组中的每个编码数据值的指示(例如011)被包括在大小指示字段2114中。不同的组(例如,2x2组)可以对其编码数据值使用不同数量的比特,并且每个组都在大小指示字段1304中具有其自己的指示,以指出在可变大小字段2116中针对该组的编码数据值使用了多少比特。
[0441] 作为示例,下表示出了指示如何对应于2x2组的比特数。
[0442]
[0443]
[0444] 注意,没有指出对每个编码数据值使用七个比特的指示。因此,在该示例中,如果一组内的最大8比特值仅具有一个前导零,则可用于表示该组中的每个编码数据值的最小有效比特数是八(而不是七)。通过检查3个比特数的所有可能选择,8个选择一组,来选择从编码数据值的预定有效长度组中省略7。由于有9个选项(位长0到8),因此一个选项被省略。在针对图像的大的测试组评估了所有可能性(例如,试验省略0,或1或2...)之后,确认省略“7”给出最佳压缩水平。注意,仅具有一个前导零的数据值的可能性很小,因为颜色去相关和空间去相关过程会导致数据值偏向零。
[0445] 显而易见的是,本文所述的示例涉及8比特数据值,但是在其他示例中,数据值可以包括不同数量的比特(例如,6比特数据值),并且本领域技术人员将能够修改本文提供的公开内容以使用这些不同数量的比特进行操作。
[0446] 例如,如果从空间去相关模块接收到的每个数据值都具有n个比特,并且对于特定的一组接收到的数据值确定的最小有效比特数是m,其中m≤n,那么特定组的每个接收到的数据值至少具有(n-m)个前导零。在这种情况下,特定组的每个编码数据值由该特定组的相应n比特接收到的数据值的m 个最低有效比特组成。参考与上面相同的示例,如果一组中的四个n比特数据值(其中n=8)是00000011、00000100、00000001和00000000,则确定的表示该组的最大值的最小有效比特数m=3。每个编码数据值的3比特的数据长度都是来自上表的有效编码。每个数据值都至少有五个前导零。因此,该组的m比特编码数据值是011、100、001和000。
[0447] 可以通过熵编码模块2006来并行处理块2100内的不同组。例如,可以确定块2100内的不同组的指示,并在熵编码模块2006内的并行操作中将其包括在大小指示字段2114中。然而,由于编码数据值可以具有可变长度,因此它们以预定顺序包括在可变大小字段2116中。
[0448] 当块的所有编码数据值已被包括在编码数据输出2110中时,则编码数据输出从熵编码模块2006输出(框2220)。对于每个颜色通道,表示像素值块的编码数据输出被提供给打包模块2008,在那里,它们被打包在一起。例如,打包模块2008将来自不同颜色通道的数据值块的编码数据输出放入数据包中。换句话说,为与相同像素相关的相应多个颜色通道形成多个编码数据输出,并且将一组像素(例如,8x8块)的多个编码数据输出一起打包成数据包,用于存储。然后可以将编码数据块发送到存储器106中进行存储,例如,通过存储器接口114(如图1所示)。
[0449] 标头与一组编码数据块一起存储,例如,表示图像或帧的数据块。对于每个编码数据块(例如,编码数据值的每个8x8块),标头中包括标头指示以指出相应编码数据块的压缩数据的大小。标头与编码数据值分开存储(例如,在编码数据输出的专用部分中),并且由于其小的大,标头数据的重要部分可以驻留在GPU内的高速缓存中。标头允许在从存储器检索编码数据块之前知道编码数据块的大小,因此可以检索编码数据块而不检索无关数据。这对于允许随机访问编码数据的不同部分非常有用。通常,可以在标头中使用任何数量的比特作为相应编码数据块的标头指示,但是在下面描述的特定示例中,每个标头指示都使用四个比特。
[0450] 如上所述,虽然以上参考图20A-B、21A-B和22描述的方法和编号为 2530312的英国专利中描述的方法两者都是固有无损的,但是如果任一种方法与有损预处理步骤结合使用(例如,当来自第四伪信道的一个或多个比特被丢弃时,如上参考图14或参考图16和18A所述),所得到的压缩数据不再是无损的。
[0451] 对上面的特定逻辑门的任何引用(例如,OR、AND门等)仅作为示例,并且应当理解,它们可以由提供相同功能的逻辑元件代替,并且可以更广泛地称为逻辑块。
[0452] 以上说明描述了许多不同的方法,包括数据压缩的方法(例如,图2A-C、 3A、4-11和19A),比特映射的方法(例如图12A-12B),包括从10比特到8比特格式的转换(例如图14和16)。这些方法可以单独使用,或者这些方法中的两种或更多种可以以各种组合一起使用,并且上面描述了几个示例。上面还描述了相反的操作(例如,数据压缩,逆映射和从8比特到
10 比特格式的转换)以及用于实现这些方法中的任何一种或这些方法的任何组合的硬件。
[0453] 图23示出了计算机系统,其中可以实现本文所述的数据压缩和解压缩方法和装置。计算机系统包括CPU 2302、GPU 2304、存储器2306和其他设备2314,例如显示器2316、扬声器2318和摄像头2320。在GPU 2304上实现数据压缩和/或解压缩块2321(其可以实现如本文所述的任何方法)。在其他示例中,数据压缩和/或解压缩块2321可以在CPU 2302上实现。计算机系统的部件可以通过通信总线2322彼此进行通信。
[0454] 图2A-C、12B和13B的数据压缩硬件被示为包括多个功能块。这仅是示意图,并不旨在定义这些实体的不同逻辑元件之间的严格划分。可以以任何合适的方式提供每个功能块。应当理解,本文所述的由数据压缩硬件形成的中间值不需要由数据压缩硬件在任何时间点物理地生成,并且可以仅表示方便地描述数据压缩硬件在其输入和输出之间执行的处理的逻辑值。
[0455] 本文所述的数据压缩和解压缩硬件(包括被布置为实现上述任何方法的任何硬件)可以在集成电路上的硬件中实现。本文所述的数据压缩和解压缩硬件可以被配置为执行如本文所述的任何方法。通常,上述任何功能、方法、技术或部件可以用软件固件、硬件(例如,固定逻辑电路)或其任何组合来实现。本文可以使用术语“模块”、“功能”、“部件”、“元件”、“单元”、“块”和“逻辑”来概括地表示软件、固件、硬件或其任何组合。在软件实现方式的情况下,模块、功能、部件、元件、单元、块或逻辑表示程序代码,当程序代码在处理器上执行时执行指定任务。本文描述的算法和方法可以由执行代码的一个或多个处理器执行,代码使处理器执行算法/方法。计算机可读存储介质的示例包括随机存取存储器(RAM)、只读存储器(ROM)、光盘、闪存、硬盘存储器以及可以使用磁性、光学和其他技术来存储指令或可由机器访问的其他数据的存储器设备。
[0456] 本文使用的术语“计算机程序代码”和“计算机可读指令”是指供处理器执行的任何种类的可执行代码,包括以机器语言、解释语言或脚本语言表示的代码。可执行代码包括二进制代码、机器代码、字节代码、定义集成电路的代码(例如硬件描述语言或网表),以及用诸如C、Java或OpenCL之类的编程语言代码表示的代码。可执行代码可以是,例如,任何种类的软件、固件、脚本、模块或库,当在虚拟机或其他软件环境中被适当地执行、处理、解释、编译时,这些软件、固件、脚本、模块或库使得支持可执行代码的计算机系统的处理器执行由代码指定的任务。
[0457] 处理器、计算机或计算机系统可以是任何种类的设备、机器或专用电路,或其集合或一部分,它具有处理能力,使得它可以执行指令。处理器可以是任何种类的通用或专用处理器,例如CPU、GPU、片上系统、状态机、媒体处理器、专用集成电路(ASIC)、可编程逻辑阵列、现场可编程门阵列(FPGA)、物理处理单元(PPU)、无线电处理单元(RPU)、数字信号处理器(DSP)、通用处理器(例如通用GPU)、微处理器、旨在加速CPU之外的任务的任何处理单元等。计算机或计算机系统可包括一个或多个处理器。本领域技术人员将认识到,这种处理能力被结合到许多不同的设备中,因此术语“计算机”包括机顶盒、媒体播放器、数字收音机、PC、服务器移动电话个人数字助理和许多其他设备。
[0458] 本发明还旨在包括定义如本文所述的硬件配置的软件,例如HDL(硬件描述语言)软件,用于设计集成电路或用于配置可编程芯片以执行所需功能。也就是说,可以提供一种计算机可读存储介质,其上编码有集成电路定义数据集形式的计算机可读程序代码,当被在集成电路制造系统中处理(即运行)时,这种集成电路定义数据集将该系统配置为制造被配置为执行如本文所述的任何方法的数据压缩和/或解压缩硬件,或者制造包括如本文所述的任何装置的数据压缩和/或解压缩硬件。集成电路定义数据集可以是例如集成电路描述。
[0459] 因此,可以提供一种在集成电路制造系统中制造如本文所述的数据压缩和/或解压缩硬件的方法。此外,还可以提供集成电路定义数据集,当在集成电路制造系统中被处理时,该集成电路定义数据集使得制造数据压缩和/或解压缩硬件的方法被执行。
[0460] 集成电路定义数据集可以是计算机代码的形式,例如作为网表,用于配置可编程芯片的代码,作为定义任何级别的集成电路的硬件描述语言,包括作为寄存器传输级(RTL)代码,作为高级电路表示,如Verilog或VHDL,以及作为低级电路表示,如OASIS(RTM)和GDSII。逻辑上定义集成电路的更高级表示(例如RTL)可以在计算机系统上被处理,该计算机系统被配置用于在软件环境的上下文中生成集成电路的制造定义,该软件环境包括电路元件的定义和用于组合这些元件以生成由该表示定义的集成电路的制造定义的规则。如通常软件在计算机系统上执行以便定义机器的情况一样,可能需要一个或多个中间用户步骤(例如,提供命令、变量等),以便将计算机系统配置为用于生成集成电路的制造定义,以执行定义集成电路的代码,以便生成该集成电路的制造定义。
[0461] 现在将参考图24描述在集成电路制造系统处处理集成电路定义数据集以便将该系统配置为制造数据压缩和/或解压缩硬件的示例。
[0462] 图24示出了集成电路(IC)制造系统2402的示例,其被配置为制造如本文任一示例中所描述的数据压缩和/或解压缩硬件。特别地,IC制造系统 2402包括布局处理系统2404和集成电路生成系统2406。IC制造系统2402 被配置为接收IC定义数据集(例如,定义如本文的任何示例中描述的数据压缩和/或解压缩硬件),处理IC定义数据集,并根据IC定义数据集来生成 IC(例如,其体现如本文任何示例中所述的数据压缩和/或解压缩硬件)。通过对IC定义数据集的处理,将IC制造系统2402配置为制造体现如本文任何示例中描述的数据压缩和/或解压缩硬件的集成电路。
[0463] 布局处理系统2404被配置为接收和处理IC定义数据集以确定电路布局。根据IC定义数据集来确定电路布局的方法在本领域是已知的,并且例如可以包括合成RTL代码以确定要生成的电路的门级表示,例如,就逻辑部件而言(例如,NAND、NOR、AND、OR、MUX和FLIP-FLOP部件)。通过确定逻辑部件的位置信息,可以根据电路的门级表示来确定电路布局。这可以自动完成或者在用户参与下完成,以优化电路布局。当布局处理系统 2404确定了电路布局时,它可以将电路布局定义输出到IC生成系统2406。电路布局定义可以是例如电路布局描述。
[0464] 如本领域已知的,IC生成系统2406根据电路布局定义来生成IC。例如, IC生成系统2406可以实现生成IC的半导体器件制造工艺,其可以包括光刻和化学处理步骤的多步骤序列,在此期间,在由半导体材料制成的晶片上逐渐形成电子电路。电路布局定义可以是掩模的形式,其可以在光刻工艺中用于根据电路定义来生成IC。替代性地,提供给IC生成系统2406的电路布局定义可以是计算机可读代码的形式,IC生成系统2406可以使用该计算机可读代码来形成用于生成IC的合适光掩模。
[0465] 由IC制造系统2402执行的不同处理可以全部在一个位置实现,例如,由一方。替代性地,IC制造系统2402可以是分布式系统,使得一些过程可以在不同位置执行,并且可以由不同方执行。例如,以下的一些阶段:(i) 合成表示IC定义数据集的RTL代码,以形成要生成的电路的门级表示,(ii) 基于门级表示来生成电路布局,(iii)根据电路布局来形成光掩模,(iv) 使用光掩模来制造集成电路,可以在不同的位置和/或由不同的方执行。
[0466] 在其他示例中,通过在集成电路制造系统处对集成电路定义数据集的处理,可以将系统配置为制造数据压缩和/或解压缩硬件,而不对IC定义数据集进行处理以便确定电路布局。例如,集成电路定义数据集可以定义可重新配置处理器(例如FPGA)的配置,并且通过对该数据集的处理,可以配置 IC制造系统以生成具有该所定义配置的可重新配置处理器(例如,通过将配置数据加载到FPGA)。
[0467] 在一些实施方案中,当在集成电路制造系统中被处理时,集成电路制造定义数据集可以使集成电路制造系统生成如本文所述的设备。例如,通过集成电路制造定义数据集,以上面参考图24描述的方式对集成电路制造系统的配置,可以制造出如本文所述的设备。
[0468] 在一些示例中,集成电路定义数据集可以包括在由数据集定义的硬件上运行的软件,或者与由数据集定义的硬件组合运行的软件。在图24所示的示例中,IC生成系统还可以由集成电路定义数据集进一步配置,以在制造集成电路时,根据在集成电路定义数据集中定义的程序代码,将固件加载到该集成电路上,或者以其他方式向集成电路提供与集成电路一起使用的程序代码。
[0469] 本领域技术人员将认识到,用于存储程序指令的存储设备可以分布在网络上。例如,远程计算机可以存储被描述为软件的过程的示例。本地或终端计算机可以访问远程计算机并下载部分或全部软件以运行该程序。替代性地,本地计算机可以根据需要下载软件的片段,或者在本地终端处执行一些软件指令,而在远程计算机(或计算机网络)处执行另一些软件指令。本领域技术人员还将认识到,通过利用本领域技术人员已知的常规技术,软件指令的全部或一部分可以由诸如DSP、可编程逻辑阵列之类的专用电路等等来执行。
[0470] 申请人在此独立地公开了本文描述的每个单独的特征以及两个或多个这样的特征的任意组合,在某种程度上,这样的特征或组合能够根据本领域技术人员的普通常识,基于本说明书整体来执行,而不管这样的特征或特征的组合是否解决本文公开的任何问题。鉴于前面的描述,对于本领域技术人员显而易见的是,可以在本发明的范围内进行各种修改。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈