可变长度编码打包体系结构的制作方法

文档序号:7739715阅读:261来源:国知局
专利名称:可变长度编码打包体系结构的制作方法
技术领域
本公开涉及打包(pack)可变长度二进制代码的体系结构。
背景技术
一致性编码法通常是几乎所有图像/视频/文本/数据压缩处理和国际标准的组成部分。大多数图像和视频压缩标准,包括例如用于静态连续色调图像压缩标准ISO/IEC JTC1/SC29 IS 10918的JPEG(联合图像专家组,Joint Photographic Experts Group)、用于二值图像压缩标准ISO/IECJTC1/SC2/WG9,CD 11544的JBIG(联合二值图像专家组,Joint Bi-Level Image Experts Group)、用于传真标准Hunter,et.al,InternationalDigital Facsimile Coding,Standards,Proceedings of the IEEE,Vol.68,No.7,July 1980,pp.854-867(Hunter等所著的国际数字传真编码标准,发表于IEEE文集,第68卷,第7期,1980年7月,第854~867页)的CCITT(国际电报电话咨询委员会)Group 3和Group 4、用于视频电话会议的视频压缩标准的ITU-T H.26x(例如H.261、H.163、H.263+)和用于适于存储的视频压缩标准的MPEG(运动图像专家组,Moving Picture ExpertsGroup)家族(例如MPEGISO/IEC JTC1/SC29 IS 11172、MPEGISO/IEC JTC1/SC29 IS 13818、MPEGISO/IEC JTC1/SC29/WG11N1238)等等,以及例如gzip、pkzip、UNLX压缩等等的其他文本/数据压缩处理,使用诸如霍夫曼编码的可变长度编码(VLC)。
众所周知,在VLC编码中,编码器将输入源数据映射到可变长度的二进制代码字中。使生成和/或输出这些代码字的处理变得便于或易于实现的硬件设备是我们所期望的。


本发明的主旨在所附权利要求中被具体地指出和清楚地要求了。然而,关于结构和操作方法两者的所要求的主旨,连同其目的、特征和优点,当结合附图一同阅读时通过参考下面的详细描述可以最好地被理解,其中图1到图7示出位打包缓冲器的示例;图8示出可变长度位打包器的一个实施例;图9到图23更详细地示出图1到图7的示例;以及图24更详细地示出图8的实施例的一个方面;图25示出四个16×1 MUX的一种实现;以及图26示出四个16×1 MUX的另一种实现。
具体实施例方式
在下面的详细描述中,为了提供对于所要求的主旨的彻底理解,提出了许多特定的细节。但是,本领域的技术人员应当理解,所要求的主旨可以不用这些特定的细节而被实现。在其他情况中,为了不使所要求的主旨模糊,公知的方法、过程、部件和电路没有被详细描述。
如下文所更详细地描述的,公开了一种适于不同压缩处理和标准的用于可变长度位打包的有效、统一的超大规模集成电路体系结构的实施例。当然,应当理解,所要求的主旨并不限于该实施例的范围内,该特定实施例仅仅是用来提供按照所要求的主旨的一种可能的实现。举例来说,在具有多个压缩标准的系统体系结构中,该实施例可以例如是多路共用的或者与不同的其他模块相接口以遵守不同压缩标准或提供与之的兼容性。这将在下文更详细地讨论。
举例来说,将不同位串的具有变化的长度的选定部分打包成具有预定长度的单个位串的电路结构可以提供实现对于例如以下压缩标准的可变位率编码的能力CCITT Group 3、Group 4、JPEG、MPEGx、H.26x或者其他文本/数据压缩标准。实现这一点的实施例在下文中描述。为了方便起见,这种电路结构在这里称作可变长度位打包器。
为了提供一些示例,诸如CCITT Group 3、Group 4以及JPEG的图像压缩标准使用每次最高16位的可变长度位打包,但是当然所要求的主旨当然不限于这一方面的范围内。例如在CCITT Group 3和Group 4的压缩中,要被打包的位可以包括模式代码字、终止代码字(terminating codeword)、霍夫曼类构成代码字(Huffman like make-up code word)、实际位值和标记。见例如Hunter等,国际数字传真编码标准,IEEE文集,第68卷,第7期,1980年7月,第854~867页。在CCITT Group 3和Group 4解压缩中,被打包的位可以被解压成二值图像单元,它们也可以为了高性能而使用可变长度打包。在基线JPEG中,要被打包的位可以包括某些形式的象素亮度、霍夫曼代码字、标记、位填充和零字节填充。类似的位打包也发生在视频和文本编码处理中。
下文中被更详细地描述的该特定实施例具有在一个时钟周期内位打包1到16之间任何数量的位的能力。而且,该特定实施例可以容易地扩大以允许每次打包多于16个位,或者被缩小。然而,所要求的主旨并不限于这些方面的范围内。
可变长度位打包器将不同长度的位串接合在一起。一旦已经接合了预定数量的位,则该数据块即将在系统中例如为了另外的或者进一步的处理而被进一步向前传输。位打包可以以大端(big endian)、小端(littleendian)或某些混合格式来进行,这取决于应用,例如CCITT Group 3和Group 4、GZIP、JPEG、MPEG等。下面的示例示出可以在该特定实施例中被实现的位打包功能。
在下面关于示例1被描述的实施例中,可变长度位打包器包括32位缓冲器,每次可以将最多16个位打包到其中。此外,本实施例中的打包自左向右发生,最重要位在左端。然而,该体系结构既可以成比例放大也可以缩小,并且能够容易地支持自右的打包。
示例1因为本示例是自左向右打包,所以缓冲器指针从图1中的缓冲器110的左端开始。最重要位在左端。位打包器的输入信号包括16位输入流(下面叫做“输入”)和要被打包的位的数量(下面叫做“长度”)。本示例中的指针起始值是31(16进制中的1F),并且递减到在右端的16进制00,在本特定实施例中在该处,指针(pointer)然后从00h回绕到1Fh。指针按照长度值递减。
1)输入=0000000000000100长度=3pointer(4:0)=1Fh-03h=1Ch=十进制28图2示出对代码“100”位打包之后缓冲器110的内容。
2)输入=0000001110010011长度=11pointer(4:0)=1Ch-0Bh=11h=十进制17图3示出接着对上面所表示的输入位打包之后缓冲器110的内容。
3)输入=0000000000000001长度=2pointer(4:0)=11h-02h=0Fh=十进制15图4示出接着对上面所表示的输入位打包之后缓冲器110的内容。
在本实施例中,如图4所示,指针跨越了16位分界线,指向缓冲器的低16位。在本实施例中,这种对分界线的跨越则可以触发对于高16位的有效指示或者信号。指针的高位跳变示意要输出有效数据,在本特定实施例中该高位是位4。这种情况下,该位是从1跳变到0,但是所要求的主旨当然不限于这一方面的范围内。
4)输入=0111110001000100长度=15pointer(4:0)=0Fh-0Fh=00h=十进制0图5示出接着对上面所表示的输入位打包之后缓冲器110的内容。
5)输入=0011111111111100长度=16pointer(4:0)=00h-10h=10h=十进制16如图6所示,当向缓冲器110应用以上输入之后,代码“0011111111111100”的第一位“0”导致指针跨越另一个16位分界线。其他15个位“011111111111100”被存储到缓冲器的开始的最重要位的位置。缓冲器指针pointer(4:0)现在指向位置10h(十进制的16)以指示下一个输入的代码字打包从该单元开始。pointer(4)从0跳变到1,发出缓冲器中的低16位有效的信号。现在,低16位从缓冲器被输出。
在本实施例中,开始的指针值至少部分地取决于格式。举例来说,如果在大端格式中打包,则索引值从缓冲器的最重要位的单元开始。在这种情况下,指针在31或十六进制1F开始,如示例中所示。对于本实施例,如下面所更详细说明的,指针的末4位可以作为被用来促进位打包的多路选择器(MUX)的选择信号来使用。
如前例所表明的,该用于实现可变长度位打包器的实施例减少或者消除了通常被用于位打包的移位操作,从而潜在地减少了控制电路所用的门的数量。当然,所要求的主旨并不限于这方面的范围之内,而在一些实施例中,这可以提供好处。同样地,如前面所表明的,本实施例还允许在写的过程中,指针沿缓冲器环绕,这样打包也沿缓冲器环绕进行,这使得缓冲器能够在每个时钟周期接受可变长度数据。环绕的指针还允许数据在每个时钟周期被写出。如下文中所更详细描述的,该体系结构还表现了可以被再次使用来潜在地减少门的数量的MUX对称性,但是,再次,所要求的主旨并不限于这一方面的范围之内。
图7示出可变长度位打包器的实施例700的框图,但是,当然这仅仅是一个示例。在该例中,vlc(可变长度代码)是要被打包的输入数据。这里,length(长度)是要被打包的vlc位的数量。vlc长度大于零将使图7中的pointer′与pointer不同,并且因而触发链的其余部分以打包规定数量的输入位,vlc,这里是(length-1:0)。新的指针值pointer′告诉MUX链710如何排序这些位。在本实施例中MUX链720然后至少部分地根据使能位来向缓冲器提供重新排序的vlc位或者重新循环当前数据。
在本实施例中,使能位建立了16位移动窗口,其降低了改写了有效的数据的风险,如下面所示。举例来说,在本实施例中,使能位至少部分地基于前一指针值pointer(4:0)由电路产生。例如,针对示例1,对于在图3中所示的上述的(2),使能信号enable(31:0)是00011111111111111110000000000000。在本示例中,最重要的三位包括有效的数据,所以enable(31:29)=000。在本特定实施例中,使能位被用来提供MUX链720中的2选1多路选择器的选择信号。当然,再次,这仅仅是一个示例实现,而所要求的主旨并不限于这一方面的范围之内。在本实现中,如图8所示,举例来说,为零的使能位不允许对该缓冲器单元的写入。从而,对于本实施例,16个尾随零将减小并也许防止在有效的数据被输出之前对其改写的风险。
16位输出信号data_out(15:0)要么是缓冲器的上一半的内容,要么是缓冲器下一半的内容。再次,在本实施例中,是指针的最重要位pointer(4)决定缓冲器的哪一半被输出。所以,对于本实施例,如果pointer(4)是零,则缓冲器的上一半是被最后更新的。所以,上一半将被输出。
当图7中所示的数据有效信号data_valid变成高的时候,输出信号data_out(15:0)是有效的。在本实施例中,在当指针跨过16位分界线时的时钟周期,data_valid变成高。在图4中所示的上述示例1的(3)中,示出了指针跨过分界线和高16位有效的情况。
下面更详细地说明本特定实施例的细节。图8示出被用于组织数据并向缓冲器写入的多路选择器的操作。图24示出从缓冲器写出数据。图26示出在本特定实施例中使用MUX对称性。
图8的底部示出供给MUX链710的数据。在本特定实施例中,以i(n)标记的输入信号是16位输入信号或者vlc的n个位。例如i(15),它是输入信号的最重要位,被供给多路转换器15即m15的选择器单元15和m14的选择器单元14等等。由于图形大小限制,图8示出MUX链710中的5个多路选择器;当然,在本特定实施例中使用了更多的MUX。不过,下面的表1示出了对于全部16个多路转换器的输入信号以及给定任一指针值sel时它们的输出信号。图8中的多路转换器m15、m14、m8、m1和m0对应于表1中的列。
表1


在本实施例中,通过MUX组织数据可以通过按照表1中所示的顺序从输入位耦合或连接到MUX的给定选择器单元来实现。因而,在本实施例中并不必须在输入数据和16选1多路选择器之间使用逻辑,但是,当然,所要求的主旨并不限于这一方面的范围之内。表1示出指针=sel=12时,MUX链710的输出信号时vlc(2:0,15:3)。
图8示出16选1的MUX的一个位输出信号被连接到32位缓冲器中的位n和n+16。例如,多路选择器15(m15)的输出信号被应用于缓冲器中的位单元15和31。图8示出m15通过MUX 830和840送往缓冲器单元15和31。如所示的,MUX的输出信号至少部分地通过使能屏蔽码的相应位被控制。用于缓冲器单元31的使能信号enable(31)使m15向缓冲器的位单元31写入。使能屏蔽码允许一次向32位缓冲器写入16位。在图8所示的示例中,是位31还是位15被使能,至少部分地取决于缓冲器指针的值。
在一个实施例中,生成使能信号或者使能屏蔽码的电路包括组合逻辑,其至少部分地基于缓冲器指针的值产生32位屏蔽码。当然,再次,所要求的主旨并不限于这一反面的范围之内。当输入长度是零的时候,屏蔽码变为全部是零。在本实施例中,这保证了向缓冲器的写入发生在长度不为零并且出现要被打包的输入数据的时候。使能屏蔽码不使能对于从pointer(4:0)开始的16个尾随的缓冲器单元。如果pointer(4:0)=24,则对于缓冲器单元25至31和0至8的使能屏蔽码是零,其余的是1。在本实施例中,允许一个MUX向缓冲器的两个单元中的一个写入节省了16个MUX。
在另一个实施例中,通过向在不良数据上改写不良数据的单元添加“不关心”代替零,生成使能信号的电路可以被进一步简化。例如,如果指针指向单元30,则缓冲器buffer(15:0)已经被输出并是过期数据,因此,要被保护的位是位buffer(31)。使能位可以是01111111111111111111111111111111。如果指针=8,则buffer(31:16)已经被输出并且是过期数据,因此,buffer(15:9)要被保护。使能位可以是11111111111111110000000111111111。这种实现可以导致更小的电路,但是在一些情况下可以潜在地比先前所描述的方法产生更多的切换。再次,所要求的主旨并不限于包括两者中任一个的任何特定实现。
下面的示例被提供来举例说明本特定实施例,但是,再次,所要求的主旨并不限于下面的示例或者实现的范围之内。
示例2本示例使用先前说明过的示例1的输入和长度数据。
1)输入=0000000000000100长度=3pointer(3:0)=pointer(3:0)-length(3:0)=Fh-3h=十六进制C=十进制12如前面所描述的,pointer′(3:0)被用作MUX链710的“sel”值。MUX链710的输出信号是如图9所示的重新排序的vlc输入信号。
图9示出对于pointer′(3:0)=sel=12,从MUX链710输出的重新排序的vlc位。从MUX链710输出的重新排序的vlc的位然后被写入缓冲器的上一半或者下一半,这取决于使能位。这里的使能位enable(31:0)至少部分地基于前一指针值pointer。因为这是第一次向缓冲器写,所以pointer(3:0)=31并且enable(31:16)全是1,enable(15:0)全是零。这示出在图10中。
对于上面的输入信号,输入位2是1,其余的位是0。使能位将允许缓冲器单元31到16被写入。buffer(31:16)被写入,buffer(15:0)被再次循环。图11中的阴影部分是过期数据或者是不关心的。
当这些位依时钟被输入到缓冲器中之后,使能总线被更新以屏蔽对此刻保存了有效数据的缓冲器单元31、30和29的写入,以及对缓冲器单元12到0的写,如果要被打包的当前vlc已经从缓冲器的下一半回绕并且已经达到16位长度,单元12到0会具有有效数据。使能位的值如图12所示。被使能写入的缓冲器单元用1表示。
2)输入=0000001110010011长度=11pointer′(3:0)=Ch-Bh=十六进制1=十进制1对于pointer′(3:0)=sel=1的重新排序的vlc位单元示于图13中。如前面图12中所示,使能位屏蔽对缓冲器单元31、30和29的写入,以保护先前写入的有效数据。缓冲器单元28-14写入了vlc的位10-0和位15-11,如图14所示。阴影区域代表不关心的数据。
当这些位依时钟被写入缓冲器中之后,使能总线被更新以屏蔽对缓冲器单元31:18的写入,这些单元此刻保存了来自上面的(1)和(2)的有效数据。使能位示于图15中。
3)输入=0000000000000001长度=2pointer′(3:0)=1h-2h=十进制15图16和图17示出对于上面的(3)的重新排序的vlc位和缓冲器的内容。pointer′(4)从1跳变到0,因而触发对于buffer(31:16)的有效信号。使能位被更新,如图18所示,以防止在(4)的进行期间对buffer(31:16)的改写。
4)输入=0111110001000100长度=15pointer′(3:0)=Fh-Fh=十进制0图19和图20示出对于(4)的重新排序的vlc位和缓冲器的内容。因为有效内容先前被输出了,所以buffer(31:16)是不关心的数据。因此,图21中所示的使能位的值允许向缓冲器单元0以及31:17写入。buffer(16)也包括过期数据,但是在本实施例中,一次最多可以写16个位,所以这里通过保持16位窗口简化了使能逻辑。当然,所要求的主旨并不限于这一方面的范围之内。
5)输入=0011111111111100长度=16pointer′(3:0)=0h-0h=十进制0图22和图23示出对于(5)的重新排序的vlc位和缓冲器的内容。pointer′(4)从0跳变到1,因而触发对于buffer(15:0)的有效信号。打包以这种方式继续进行。
本特定实施例的另一个问题涉及从缓冲器写出。这个具体示例采用16位输出总线,但是,当然,所要求的主旨并不限于这一个方面的范围之内。图24示出本实施例中的32位缓冲器的输出信号由指针的高位决定。如果指针位于缓冲器的末16位,指针的位4等于0,则高16位被使能作为输出信号。如果指针位于缓冲器的高16位,指针的位4等于1,则末16位被使能用于输出。如前面所表明的,对于本特定实施例,数据输出有效位产生于跨过16位分界线的时候,这在本实施例中由指针的位4改变状态来发出信号或者指示。这可以例如通过对位(4)和延迟一个时钟周期的位(4)应用XOR(异或)操作来检测。当然,这可以用多种方法来实现,所要求的主旨也并不限于所提出的该特定方法的范围之内。
如前面所提出的,在本实施例中,多路选择器的对称性也可以提供减少硬件的机会。通常,16个执行16选1的选择操作的MUX可以用80个执行4选1的选择操作的MUX来实现。但是,用于本特定实施例的这种体系结构的对称性将其减少到32个执行4选1选择的MUX。对于本实施例,由于输入数据的连续性质,该减少变为可能。MUX接收输入信号,但是是以不同的顺序。
图25示出使用4选1的MUX对具有16选1选择能力的4个MUX的传统实现。现在参考表1,对于sel=12的行,此时检查显示出图25中的MUX m15、m11、m7和m3的输出信号与图9所示的对于sel=1100的使能位相匹配。对于本特定实施例的任何sel值,表1和图25都相匹配。
然而,图26示出使用4选1的MUX实现4个16选1的MUX的方法。本实施例的m15、m11、m7和m3是从一系列或一组MUX产生的,这样将MUX的数量从图25中所示的20个减少到图26中所示的8个。这种多路选择器共享的实现也可以被用于例如被用来实现本可变长度位打包器实施例的剩余的三组MUX。图26使用图25中所示的示例,sel=1100。当然,再次,这仅仅是一个示例,所要求的主旨并不限于该特定示例或者实现的范围之内。
如前面所表明的,按照所要求的主旨的可变长度位打包器的实施例并不限于使用这种对称性的范围之内。然而,虽然所要求的主旨并不限于先前所描述的实施例的范围之内,但是已经证明了对比传统的方法可以潜在地达到较少的门数量。另外,至少一些实施例可以包括在每个时钟周期打包预定长度的位串以及在每个时钟周期将其写出的能力。另外,对于至少一些实施例,按照需要放大或者缩小该长度的大小的能力可以是一个特性。此外,实施例可以按照需要可替换地支持小端格式或者大端格式,并且可以被用来支持例如用于JPEG、CCITT Group 3和Group 4、MPEG、GZIP等的可变长度编码。当然,所要求的主旨并不限定于使用或者实现仅仅这些压缩方法的范围之内。另外,至少一些实施例可以按照需要具有多种用途。
此外,按照所要求的主旨,可变长度位率打包器的实施例可以被使用来实现将不同位串的所选部分打包到缓冲器中。例如,虽然所要求的主旨并不限于这一方面的范围之内,但是诸如图7和图8中示出的720的MUX可以被使用来选择要在缓冲器中被打包的不同位串的部分。此外,例如710的MUX可以被使用来排序用来在特定缓冲器单元打包的所选部分的位。在这样的实施例中,对用来打包的位进行排序的MUX可以至少部分地由例如pointer(3:0)的缓冲器单元指针来控制,该指针跟踪缓冲器的有效内容,但是,再次,所要求的主旨并不限于这一方面的范围之内。另外,用来选择要被打包的希望的部分的MUX可以至少部分地由一组屏蔽位来控制,例如前面所描述的使能位。
当然,应当理解,虽然已经描述了特定的实施例,但是所要求的主旨并不限于特定的实施例或者实现的范围之内。例如,一种实施例可以是硬件中的,而另一种实施例可以是固件中的,或者例如硬件和固件的任何组合。另外,一些实施例还可以包括软件作为实现的一部分。此外,计算机系统或者平台,例如数据压缩系统,可以使得按照所要求的主旨的某种方法的实施例被执行,例如前面所描述的将不同位串的所选部分打包到缓冲器中。
虽然所要求的主旨的某些特征在这里已经被示出和描述,但是本领域的技术人员现在会想到许多修改、置换、改变和等同物。所以,应当理解所附权利要求意思是覆盖所有落入所要求主旨的真实精神之内的修改和变化。
权利要求
1.一种集成电路,包括将不同位串的所选部分打包到具有预定长度的单个位串中的电路结构。
2.根据权利要求1所述的集成电路,其中,所述电路结构包括在具有所述预定长度的连续位串之间回绕的能力。
3.根据权利要求2所述的集成电路,其中,所述预定长度是可缩放的。
4.根据权利要求1所述的集成电路,其中,所述电路结构能够在每个时钟周期打包所述预定长度的单个位串。
5.根据权利要求4所述的集成电路,其中,所述电路结构能够在每个时钟周期输出所述预定长度的单个位串。
6.根据权利要求1所述的集成电路,其中,所述电路结构能够以大端和小端数据格式实现位打包。
7.根据权利要求1所述的集成电路,其中,所述电路结构包括打包所选部分的能力,所述所选部分中的至少一些具有变化的长度。
8.一种装置,包括实现数据压缩的计算平台;所述平台包括可变长度编码硬件体系结构以将不同位串的所选部分打包到具有预定长度的单个位串中,所述所选部分具有变化的长度。
9.根据权利要求7所述的装置,其中,所述体系结构包括在具有所述预定长度的连续位串之间回绕的能力。
10.根据权利要求8所述的装置,其中,所述预定长度是可缩放的。
11.根据权利要求7所述的装置,其中,所述体系结构能够在每个时钟周期打包所述预定长度的单个位串。
12.根据权利要求10所述的装置,其中,所述体系结构能够在每个时钟周期输出所述预定长度的单个位串。
13.根据权利要求1所述的装置,其中,所述体系结构包括打包所选部分的能力,所述所选部分中的至少一些具有变化的长度。
14.一种将不同位串的所选部分打包到缓冲器中的方法,所述方法包括使用多路选择器选择要打包在所述缓冲器中的所述不同位串的希望的部分;以及使用多路选择器排序用来打包在特定缓冲器单元中的所述所选部分的位。
15.根据权利要求14所述的方法,其中,所述所选部分的至少一些具有变化的长度。
16.根据权利要求14所述的方法,其中,所述用于排序所述用来打包的位的多路选择器至少部分地由缓冲器单元指针来控制,所述指针跟踪所述缓冲器的有效内容。
17.根据权利要求14所述的方法,其中,所述用来选择要被打包的所述希望的部分的多路选择器至少部分地由一组屏蔽位来控制。
18.一种装置,包括缓冲器;多个屏蔽多路选择器;和多个排序多路选择器;其中,所述缓冲器和所述多路选择器耦合在一起,以便应用于所述多路选择器的选择器信号将不同位串的部分排序和打包在所述缓冲器中。
19.根据权利要求18所述的装置,其中,所述缓冲器和所述多路选择器进一步耦合在一起,以便应用于所述多路选择器的选择器信号将具有变化的长度的部分排序和打包在所述缓冲器中。
20.根据权利要求18所述的装置,其中,所述用于排序用来打包的位的多路选择器耦合在一起,以便至少部分地由缓冲器单元指针控制,所述指针跟踪所述缓冲器的有效内容。
21.根据权利要求18所述的装置,其中,所述用于选择要被打包的所述希望的部分的多路选择器被耦合在一起,以便至少部分地由一组屏蔽位控制。
全文摘要
本发明讨论了可变长度编码打包的实施例。使用了指针,并且可变长度位打包器减少或消除了通常被用于位打包的移位,从而潜在地减少了被用于控制电路的门的数量。
文档编号H04N7/26GK1545765SQ02816481
公开日2004年11月10日 申请日期2002年7月18日 优先权日2001年8月22日
发明者里卡多·贝克尔, 廷库·阿查里雅, 里卡多 贝克尔, 阿查里雅 申请人:英特尔公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1