背景技术
现有视频编码技术中的运动估计技术,是在编码当前帧的一个块时,利用块匹配准则,在已经编码并且重构的图像中找到与当前编码的当前块最匹配的块,作为当前块的预测过程。其中,在已经编码并且重构的图像中找到与当前编码的当前块最匹配的块的过程,称为块匹配过程。在现有的块匹配过程中,通常是在图像的整像素级做块匹配,但是为了得到更高的匹配精度与匹配效果,就需要在分像素级别上做块匹配,以便得到精度更高的运动估计效果。根据运动图象专家组(MPEG,Moving Picture Experts Group)2/4标准规定,可以对两个相邻的整像素进行双线性(1,1)插值,来获得分像素。
图1为一种32位系统中内存组织方式示意图,图1中,内存地址由低到高排列。在Windows系统中,一次取四个字节,如果当前地址是四字节对齐,取到的都是当前地址由低到高组成的一个四字节字,例如,可以分别通过以下方式读取地址空间0x4000、0x4005与0x400B上的四字节字:
addressA=0x4000;(unsigned int*)addressA=0x03020100;
addressB=0x4005;(unsigned int*)addressB=0x08070605;
addressC=0x400B;(unsigned int*)addressC=0x0E0D0C0B。
然而,在现有的一些芯片产品中,需要在高级精简指令集机器(AdvancedRISC Machines,以下简称:ARM)处理器上实现MPEG2/4编解码算法。但是,ARM系统与Windows系统在内存访问上的策略不相同。在ARM系统中,可以直接读取的四字节字所在的地址必须是四字节对齐的,例如:可以从图1中的0x4000、0x4004、0x4008、0x400C地址取出四字节字,取出的值分别是0x03020100、0x07060504、0x0B0A0908与0x0F0E0D0C。为了利用快速的四字节同时计算插值结果技术,并且在解码端,运动向量值指向的位置不一定是四字节对齐位置,因此,就需要在非四字节对齐位置读取32位整数,而ARM系统无法直接从非四字节对齐的地址读取所需的四字节字,例如:无法像windows系统中那样,从图1中的addressB或者addressC位置,直接读取到需要的四字节字。如果想要从非四字节对齐的地址读取所需的四字节字,例如:需要从非四字节对齐的地址读取所需的四字节字02,则需要依次取从02开始的四个四字节字,包括:02、03、04、05放入寄存器R0;然后依次执行如下操作:将02放入寄存器R0,将03左移8位后与R0进行或操作,将04左移8位后与R0进行或操作,将05左移8位后与R0进行或操作,最终得到所需的四字节字02。由此可见,需要通过执行11条相应指令进行相关操作,才能从非四字节对齐的地址读取所需的四字节字。
因此,在ARM系统中,从非四字节对齐的地址读取所需的四字节字的操作复杂、繁琐,而且需要较长的时间去执行相应的操作,而在运动估计技术的插值过程中,需要对每两个相邻的整像素点都做双线性(1,1)插值,若每次从非四字节对齐的地址读取一个所需的四字节字都需要执行上述繁琐操作,就使得插值过程所需周期较长,效率低下。
发明内容
本发明实施例的目的是:提供一种四字节字的读取处理方法与装置、解码器,以简化从非四字节对齐的地址读取所需的四字节字的操作,减小该操作所需的时间,从而缩短插值周期,提高插值效率。
本发明实施例提供的一种四字节字的读取处理方法,包括:
识别待读取的四字节字所在的地址是否为四字节对齐的地址;
并在待读取的四字节字所在的地址为非四字节对齐的地址N时,从所述地址N的前一相邻四字节对齐的地址空间读取第一个32位整数,从所述地址N的后一相邻四字节对齐的地址空间读取第二个32位整数,其中,N取值为1、2或3;
将第一个32位整数右移N*8位,得到第一数值,将第二个32位整数左移32-N*8位,得到第二数值;
对所述第一数值与所述第二数值进行或操作,得到作为第三个32位整数的所述待读取的四字节字。
本发明实施例提供的一种四字节字的读取处理装置,包括:
识别模块,用于识别待读取的四字节字所在的地址是否为四字节对齐的地址;
第一操作处理模块,用于根据所述识别模块的识别结果,在待读取的四字节字所在的地址为非四字节对齐的地址N时,从所述地址N的前一相邻四字节对齐的地址空间读取第一个32位整数,从所述地址N的后一相邻四字节对齐的地址空间读取第二个32位整数,其中,N取值为1、2或3;
第二操作处理模块,用于将第一个32位整数右移N*8位,得到第一数值,将第二个32位整数左移32-N*8位,得到第二数值;
第三操作处理模块,用于对所述第一数值与所述第二数值进行或操作,得到作为第三个32位整数的所述待读取的四字节字。
本发明实施例提供的一种解码器,包括熵解码模块、反扫描模块、反量化模块、反余弦变换模块、运动补偿模块与加法器,所述运动补偿模块包括本发明上述实施例提供的四字节字的读取处理装置。
基于本发明上述实施例提供的四字节字的读取处理方法与装置、解码器,在待读取的四字节字所在的地址为非四字节对齐的地址N时,将从地址N的前一相邻四字节对齐的地址空间读取的第一个32位整数右移N*8位,得到第一数值,将从地址N的后一相邻四字节对齐的地址空间读取的第二个32位整数左移32-N*8位,得到第二数值,再对第一数值与第二数值进行或操作,总共通过执行五条相应的指令就可以得到四字节字,与现有技术需要通过执行11条相应指令进行相关操作才能从非四字节对齐的地址读取所需的四字节字相比,大大简化了从非四字节对齐的地址读取所需的四字节字的操作,减小了该操作所需的时间,从而缩短了插值周期,提高了插值效率。
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图2为本发明四字节字的读取处理方法一个实施例的流程图。如图1所示,该实施例的方法包括:
步骤101,识别待读取的四字节字所在的地址是否为四字节对齐的地址。若待读取的四字节字所在的地址为非四字节对齐的地址N,执行步骤102;否则,若待读取的四字节字所在的地址为四字节对齐的地址N,不执行本实施例的后续流程。
步骤102,从地址N的前一相邻四字节对齐的地址空间读取第一个32位整数,从地址N的后一相邻四字节对齐的地址空间读取第二个32位整数,其中,N取值为1、2或3。
其中,前一相邻四字节对齐的地址空间指的是地址小的紧邻当前地址的四字节对齐位置;后一相邻四字节对齐的地址空间指的是地址大的紧邻当前地址的四字节对齐位置。
步骤103,将第一个32位整数右移N*8位,得到第一数值,将第二个32位整数左移32-N*8位,得到第二数值。
步骤104,对第一数值与第二数值进行或操作,得到作为第三个32位整数的待读取的四字节字。
本发明上述实施例提供的四字节字的读取处理方法中,在待读取的四字节字所在的地址为非四字节对齐的地址N时,将从地址N的前一相邻四字节对齐的地址空间读取的第一个32位整数右移N*8位,得到第一数值,将从地址N的后一相邻四字节对齐的地址空间读取的第二个32位整数左移32-N*8位,得到第二数值,再对第一数值与第二数值进行或操作,总共通过执行五条相应的指令就可以得到四字节字,大大简化了从非四字节对齐的地址读取所需的四字节字的操作,减小了该操作所需的时间,从而缩短了插值周期,提高了插值效率。
以下以具体实例,对图1所示实施例进行说明。例如:对于非四字节对齐的地址1,如:0x4001,取四字节字的方式为:在步骤102中,从地址空间0x4000读取第一个32位整数,得到0x03020100,该操作可以通过如下指令实现:a=(unsigned int*)0x4000=0x03020100;从地址空间0x4004读取第一个32位整数,得到0x07060504,该操作可以通过如下指令实现:b=(unsignedint*)0x4004=0x07060504。在步骤103中,将第一个32位整数a右移8位,得到第一数值,将第二个32位整数b左移24位,得到第二数值;在步骤104中,对第一数值与第二数值进行或操作,即可得到非四字节对齐的地址1读取到四字节字0x04030201。步骤103与步骤104的操作可以通过如下指令实现:val=(a>>8)|(b<<24)。其中,>>表示右移,去掉低位的00;<<表示左移,去掉高位的070605。
同理,对于非四字节对齐的地址2,如:0x4002,可以根据图1所示实施例的步骤,通过如下指令读取四字节字:
a1=(unsigned int*)0x4000=0x03020100;
b1=(unsigned int*)0x4004=0x07060504;
val=(a1>>16)|(b1<<16)。
再如:对于非四字节对齐的地址2,如:0x4003,可以根据图1所示实施例的步骤,通过如下指令读取四字节字:
a2=(unsigned int*)0x4000=0x03020100;
b2=(unsigned int*)0x4004=0x07060504;
val=(a2>>24)|(b2<<8)。
具体地,作为本发明的一个实施方式,图2所示实施例的步骤101中,可以通过如下方法识别待读取的四字节字所在的地址是否为四字节对齐的地址:
将待读取的四字节字所在的地址与4做求余操作,得到第三数值,该第三数值为0、1、2或3;
判断第三数值是否为0;
若第三数值为0,则待读取的四字节字所在的地址为四字节对齐的地址;
否则,若第三数值为1、2或3,则待读取的四字节字所在的地址为非四字节对齐的地址。
另外,作为本发明的另一个实施方式,通过图2所示实施例的步骤101,识别出待读取的四字节字所在的地址为四字节对齐的地址N时,可以像Windows系统那样,直接从地址N读取第四个32位整数。
进一步地,作为本发明的又一个实施方式,通过本发明上述实施例提供的四字节字的读取处理方法,得到待读取的四字节字之后,还可以对两个相邻的整像素A与B进行双线性(1,1)插值,例如:可以通过公式(A+B+1)/2或(A+B)/2,对两个相邻的整像素A与B进行双线性(1,1)插值,获得分像素值。其中的整像素即为32位整数像素点。
运动估计技术,即是据运动向量的指向在参考帧中得到预测值,在运动向量指向的位置为分像素位置时,需要对参考图像的整像素进行插值,得到分像素。插值过程就是利用相邻的整像素点,通过一定的运算规则得到分像素点的过程。图3为本发明实施例像素点的一个分部结构示意图。图3中,X表示整像素点,Y表示分像素点。如果当前需要插值的是水平方向上的1/2点,即图4中Y表示的点,则需要利用水平方向上最近的两个X点来插值得到,插值公式可以是(X1+X2+1)/2,其中X1表示Y点左侧最近的点,X2表示Y点右侧最近的点,由插值后得到的Y点后组成的块即为预测块。
图4为本发明四字节字的读取处理装置一个实施例的结构示意图,该实施例的四字节字的读取处理装置可用于实现本发明上述各实施例的四字节字的读取处理方法流程。如图4所示,其包括识别模块201、第一操作处理模块202、第二操作处理模块203与第三操作处理模块204。
其中,识别模块201用于识别待读取的四字节字所在的地址是否为四字节对齐的地址。第一操作处理模块202用于根据识别模块201的识别结果,在待读取的四字节字所在的地址为非四字节对齐的地址N时,从地址N的前一相邻四字节对齐的地址空间读取第一个32位整数,从地址N的后一相邻四字节对齐的地址空间读取第二个32位整数,其中,N取值为1、2或3。第二操作处理模块203用于将第一个32位整数右移N*8位,得到第一数值,将第二个32位整数左移32-N*8位,得到第二数值。第三操作处理模块204用于对第一数值与第二数值进行或操作,得到作为第三个32位整数的待读取的四字节字。
本发明上述实施例提供的四字节字的读取处理装置中,在待读取的四字节字所在的地址为非四字节对齐的地址N时,将从地址N的前一相邻四字节对齐的地址空间读取的第一个32位整数右移N*8位,得到第一数值,将从地址N的后一相邻四字节对齐的地址空间读取的第二个32位整数左移32-N*8位,得到第二数值,再对第一数值与第二数值进行或操作,总共通过执行五条相应的指令就可以得到四字节字,大大简化了从非四字节对齐的地址读取所需的四字节字的操作,减小了该操作所需的时间,从而缩短了插值周期,提高了插值效率。
进一步可选地,第一操作处理模块202还可以根据识别模块201的识别结果,在待读取的四字节字所在的地址为四字节对齐的地址N时,直接从地址N读取第四个32位整数。
作为本发明的一个实施方式,图4所示的实施例中,识别模块201可以通过如下方法识别待读取的四字节字所在的地址是否为四字节对齐的地址:将待读取的四字节字所在的地址与4做求余操作,得到第三数值,判断第三数值是否为0,若第三数值为0,则认为待读取的四字节字所在的地址为四字节对齐的地址,否则,若第三数值为1、2或3,则待读取的四字节字所在的地址为非四字节对齐的地址。图5为本发明四字节字的读取处理装置另一个实施例的结构示意图,该实施例提供的四字节字的读取处理装置可用于实现该实施方式。与图4所示的实施例相比,该实施例中,识别模块201包括操作处理单元301、判断单元302与识别单元303。其中,操作处理单元301用于将待读取的四字节字所在的地址与4做求余操作,得到第三数值。判断单元302用于判断第三数值是否为0。识别单元303用于根据判断单元302的判断结果,在第三数值为0时,识别出待读取的四字节字所在的地址为四字节对齐的地址;否则,在第三数值为1、2或3时,识别出待读取的四字节字所在的地址为非四字节对齐的地址。
图6为本发明四字节字的读取处理装置又一个实施例的结构示意图。与图4或图5所示的实施例相比,该实施例的四字节字的读取处理装置还包括插值处理模块205,用于对第一操作处理模块202和/或第三操作处理模块204处理得到的两个相邻的整像素A与B进行双线性(1,1)插值,获得分像素值。其中的整像素即为32位整数像素点。
图7为本发明解码器一个实施例的结构示意图。该实施例的解码器包括熵解码模块1、反扫描模块2、反量化模块3、反余弦变换模块4、运动补偿模块5与加法器6,其中的运动补偿模块5可以通过本发明上述任一实施例提供的四字节字的读取处理装置实现。
本发明实施例的解码器接收到P帧的压缩的视频比特流后,熵解码(EntropyDecode)模块1对该比特流进行解码,得到一系列量化系数包括:用于指示需要插值位置的运动向量(Motion Vector)值,和用于表示当前帧Fn中的当前编码宏块与参考帧Fn-1中最匹配宏块之间的残差,其中,n为大于1的整数,表示当前帧的序号。反扫描模块2、反量化模块3、反余弦变换模块4依次对残差进行重排序、反量化(Inverse Quantization,以下简称:IO)与反离散余弦变换(inverse discrete cosine transform,以下简称:IDCT),得到原始值与预测值之间的差值。运动补偿(Motion Compensate,以下简称:MC)模块5根据运动向量(Motion Vector)值在参考帧Fn-1中插值,得到所需的预测值,其中的参考帧Fn-1为已经解码完成的前一帧。加法器6将反余弦变换模块4得到的差值与运动补偿模块5得到的预测值相加,得到重构值,即:解码后当前帧Fn图像,该当前帧Fn图像作为后一帧解码的参考帧。
本发明上述实施例提供的解码器,在待读取的四字节字所在的地址为非四字节对齐的地址N时,将从地址N的前一相邻四字节对齐的地址空间读取的第一个32位整数右移N*8位,得到第一数值,将从地址N的后一相邻四字节对齐的地址空间读取的第二个32位整数左移32-N*8位,得到第二数值,再对第一数值与第二数值进行或操作,总共通过执行五条相应的指令就可以得到四字节字,大大简化了从非四字节对齐的地址读取所需的四字节字的操作,减小了该操作所需的时间,从而缩短了插值周期,提高了插值效率。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于系统实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本发明实施例提供的四字节字的读取处理方法与装置、解码器,大大简化了从非四字节对齐的地址读取所需的四字节字的操作,减小了该操作所需的时间,从而缩短了插值周期,提高了插值效率。
最后所应说明的是:以上实施例仅用以说明本发明的技术方案,而非对本发明作限制性理解。尽管参照上述较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解:其依然可以对本发明的技术方案进行修改或者等同替换,而这种修改或者等同替换并不脱离本发明技术方案的精神和范围。