使用数字信号处理器进行分数像素精度运动估计的方法
技术领域
本发明涉及视频编码技术中分数像素精度运动估计的实现方法,具体地,涉及使用数字信号处理器(Digital Signal Processor,简称为DSP)进行分数像素精度运动估计的方法。。
背景技术
随着视频编码技术的发展,运动补偿和运动矢量的精度不断提高:H.261为整像素,MPEG-1、MPEG-2、和MPEG-4第一版本为半像素,至MPEG-4第二版本、最新H.264及其国内版本AVS已经达到1/4像素。由于分数像素精度运动补偿和运动矢量的引入以及精度不断提高,一方面使视频编解码的图像块帧间位移突破图像空间取样网格的限制而达到更高精度;另一方面使信号在空间域拉伸变宽,其频谱相应收缩变窄,改善了低通性质,从中可以提取低通性质更好的样点,从而构成帧间预测效率更高的预测图像块。但其代价是实现复杂度大幅提高。
相应地,分数像素精度运动估计过程被解释为围绕整像素精度运动估计过程所确定的最佳整像素位置来搜索帧间位移精确化位置或最佳低通滤波位置。常用的1/4像素精度运动估计方法是图1所示的逐级8邻点搜索:在最佳整像素位置周围8个半像素位置邻点中搜索最佳位置,接着在最佳半像素位置周围8个1/4像素位置邻点中搜索寻找最佳位置,得到最后结果。最佳运动估计准则是可实现码率与失真度双目标同时优化的Lagrangian代价J=D+λ×R。其中,λ为Lagrangian乘子,R为运动矢量预测差值所对应的变长码长,D为过去帧参考图像与当前帧原始图像之差的绝对值和(Sum ofAbsolute Differences,SAD)。
数字信号处理器芯片(Digital Signal Processor,DSP)的结构决定了它特别适合于巨大吞吐量的数字信号处理和实时应用。目前能够实现大分辨率高复杂度实时视频编码的DSP为荷兰飞利浦公司TriMedia/Nexperia系列处理器和美国德克萨斯仪器公司TMS320C64x/TMS320DM64x系列处理器。两种DSP均包含特别有助于视频编解码的结构,包括大容量片内高速缓存器Cache、大量寄存器、多指令并行处理的超长指令字VLIW结构、以及众多的运算功能单元、32位单指令多数据(Single Instruction Multiple Data,SIMD)处理的运算功能单元及指令集。
运动估计在整个视频编码中占据超过60%的CPU时钟周期。对于以巨大运算量为代价获得编码效率显著提高的H.264及其国内版本AVS(Advanced Audio-Video System,中国的先进音视频编码系统),运动估计所占比例进一步增大。利用DSP加速运动估计对提高编码速度达到实时至关重要,在视频编码的产品化进程中,是最需要关注及最值得投入的地方。
运动估计的主要运算是过去帧参考图像块与当前帧原始图像块之差的SAD的计算。加速运动估计的关键之一是加速SAD计算。许多面向多媒体应用的处理器都提供了专门加速SAD计算的指令。如TriMedia的UME8UU指令,可以算出4个连续位置上的SAD值,用C64x的SUBABS4指令结合DOTPUT4指令也可得到相同结果。
运动估计还需要读取大量参考图像与原始图像数据。加速运动估计的另一个关键是提高数据传输效率。DSP的数据传输包括从片外SDRAM传输至片内Cache和从片内Cache传输至寄存器。图像数据为8位无符号数。TriMedia的32位读指令可从数据Cache中读入首地址对齐的4个图像数据至一个寄存器;C64x的64位读指令可从一级Cache中读入首地址任意的8个图像数据至一个寄存器对(由两个32位寄存器组成)。TriMedia和C64x都拥有大容量Cache:在慢速DRAM和快速CPU之间插入速度较快的SRAM,起缓冲作用,使CPU既可较快存取SRAM,又不至于使系统成本上升过高。TriMedia1500系列拥有全速且分离的16K字节数据Cache和64K字节指令Cache,Cache块(内存中首地址对齐的连续数据段,在一个内存读写周期内整段读写)长64字节。C64x含两级片内存储器结构。其中,全速的一级存储器分为16K字节数据Cache(L1D)和16K字节指令Cache(L1P),L1D块长64字节;半速的二级存储器容量更大(256K~1M字节),由用户随意配置为数据与指令共用的二级Cache或可编程存取的片内SRAM,其中,L2Cache块长128字节。CPU读内存数据时,如果在Cache中找到寻址数据,成为Cache hit,就直接从Cache把数据装入寄存器,不需要启动内存读周期。只有当Cache中没有寻址数据时,才需要启动内存读周期装载整个Cache块,成为Cache miss。首先装入Cache的数据是Cache块首地址数据。期间CPU处于停顿状况而不能执行后续指令,直到寻址数据装入寄存器为止。这个时长为Cache miss停顿时钟周期数。CPU恢复运行后,Cache块的后续数据继续装入Cache,类似于独立于数据处理的后台操作。显然Cache miss数越少,CPU存取内存的效率越高。因为C64x的全速L1D与半速二级存储器之间的传输总线达256位,所以C64x的内存传输效率主要取决于L2Cache的Cache miss数。
由此得出运动估计的DSP优化措施为:用32位读指令读4个图像数据(TriMedia)或64位读指令读8个图像数据(C64x);用UME8UU(TriMedia)、SUBABS4和DOTPUT4(C64x)等SIMD指令计算SAD值;尽量增加内存中同一Cache块参考图像数据在多个搜索位置上重复读取的机会,以便提高Cache hit机会,降低Cachemiss数。对于整像素精度运动估计,参考帧数据存储方法是图像平面内按光栅扫描顺序存储图像数据,存储位置为二维坐标的行数乘以宽再加列数的一维表示,这些DSP优化措施可以直接实现。然而,对于分数像素精度运动估计,1/4像素精度的参考帧图像为整像素参考帧图像经过二维四倍内插放大后生成的16:1图像,如何存储参考帧不同分数位置数据以适应分数像素运动估计成为一个关键而又棘手的问题。下面分析现有的两种1/4像素精度参考帧图像数据存储方法。
图2所示的参考帧一是最简单的1/4像素精度参考帧图像数据存储方法,就是在16:1的1/4像素精度参考帧图像平面内按照一维光栅扫描顺序存储图像数据,存储位置为二维坐标的行数乘以宽再加列数的一维表示。如下,
1/4像素精度参考帧图像平面内坐标为(pic_pix_y,pic_pix_x)的一个像素在存储空间的位置:行位置:pic_pix_y;列位置:pic_pix_x;
像素存储位置=存储空间首地址+行位置×(图像宽度+水平外延长度)×4+列位置。
在该参考帧中,同一分数位置的像素被三个其他分数位置的像素分隔开来,如两个顺序相接的整像素之间隔了一个1/4像素、一个半像素、和一个3/4像素,...由此类推。这样就不能在分数像素精度运动估计中直接使用多读多操作SIMD指令—每次只能读入一个参考帧图像数据至寄存器;例如,如果使用UME8UU、SUBABS4和DOTPUT4等指令计算SAD值,需要把分开读入的4个参考图像数据拼装成一个32位字。这样,运算效率和从片内Cache传输数据至寄存器的效率比较低。
图3所示的参考帧二的1/4像素精度参考帧图像数据存储方法为标题为“插值图像内存组织、分数像素生成及预测误差指标计算方法”,申请号200410076759.4,公开号CN1750659A的专利技术,与文献一(李春林,李国兵,“基于PC的SIMD技术在1/4像素精度运动预测中的应用”,重庆邮电学院学报,第17卷第1期,2005年2月,46~49页)和文献二(张剑,“一种适合SIMD并行运算的参考图像组织优化算法”,微型机与应用,2005年第6期,49~51页)的方法完全一致。该方法针对处理器提供的SIMD指令优化1/4像素精度运动估计的SAD计算。该方法把不同分数位置的像素分开,相同分数位置的像素组成一个1:1图像平面,于是16:1的1/4像素精度参考帧图像分成16个1:1子图像;在系统主内存中为每个子图像分配一段连续的存储空间;子图像存储空间的排列方法可以是4x4二维空间的一维光栅扫描顺序(上述专利技术提供了三种排列方法),16个子图像存储空间又形成一段连续的存储空间;在子图像平面内按照一维光栅扫描顺序存储图像数据,并且像素在子图像内的坐标位置与其存储位置一致。
上述参考帧图像数据存储方法的特征在于,通过以下公式唯一确定1/4像素精度参考帧图像平面内坐标为(pic_pix_y,pic_pix_x)的一个像素在存储空间的位置:
子图像行属性:pic_pix_y&3;子图像列属性:pic_pix_y&3
子图像行位置:pic_pix_y>>2;子图像列位置:pic_pix_x>>2
像素存储位置=由子图像行与列属性确定的存储空间首地址+子图像行位置×(图像宽度+水平外延长度)+子图像列位置。
这样就可以在计算参考图像块与原始图像块SAD值时使用多读多操作SIMD指令,从而显著提高运算效率和从片内Cache传输至寄存器数据的传输效率。在TriMedia开发板上H.264编码速度从使用参考帧一的1帧/3秒提高到了使用参考帧二的1帧/秒。
然而,使用参考帧二于1/4像素精度运动估计引起过量数据Cache miss。如用TriMedia1300开发板编码300帧CIF格式Foreman测试序列,额定码率768Kbps,硬件Profile显示计算SAD部分模块总时间3899111单位(每单位1000时钟周期),指令执行时间590555单位,数据Cache miss停顿时间达3191295单位,占81.85%。意味着在运动估计(包括整像素精度和分数像素精度的运动估计)中CPU因为数据Cache miss停顿下来等待从片外SDRAM装载数据的时间占81.85%。经过分析,其中绝大多数数据Cache miss停顿时间出现在分数像素精度运动估计中。在DM642上运行也出现相同情况:在TI Code Composer Studio3.1开发环境中软件仿真H.264编码,运行环境设置为600MHz主频DM642处理器,SDRAM存取速度133MHz,编码300帧CIF格式Foreman测试序列,额定码率768Kbps,计算SAD部分模块总时间2739616933个时钟周期,CPU执行时间613651067个时钟周期,L1D miss停顿时间2091360100个时钟周期,占76.34%。
过量数据Cache miss反映出数据传输效率低下和处理器处于不良工作状况。1/4像素精度运动估计需要搜索图1所示的8个半像素位置和8个1/4像素位置。使用图2所示的参考帧二时,这些搜索位置的数据位于11个1:1存储图像平面内:8个半像素位置数据在3个1:1存储图像平面内,8个1/4像素位置数据在另外8个1:1存储图像平面内。在不同搜索位置上,如果读入的参考帧数据位于不同1:1存储图像平面内,则数据间无关联与重叠。分辨率大于QCIF时,对于长64字节或128字节的Cache块,参考图像块的不同行间也无重叠。这样在当前搜索位置上为读入参考图像块的一行数据所装载的1~2个Cache块不能为以后的运动搜索重复利用。每个Cache块的数据利用率最大只有16/64(Cache块长64字节)或16/128(Cache块长128字节)。完成一个16x16方块在16个分数位置上的1/4像素精度运动估计,最少需要从SDRAM装载16+17+17+8x16=178个Cache块,最多需要装载178x2=356个Cache块。相比之下,使用图1所示的参考帧一时,在不同搜索位置上读入的参考帧数据同处于一个16:1存储图像平面内,并且交错融合在一起,在当前搜索位置上装载的1~2个Cache块可为以后的运动搜索重复利用。每个Cache块的数据利用率最大达到64/64(Cache块长64字节)或64/128(Cache块长128字节)。完成一个16x16方块的1/4像素精度运动估计,最少需要从SDRAM装载(16+17)x2+2x16=98个Cache块,最多需要装载(16+17+2x16)x2=130个Cache块。
从另外一个角度考虑,在图1所示的逐级8邻点搜索的1/4像素精度运动估计中,应用参考帧一时,被读取的参考帧图像数据的分布接近于DSP内部数据Cache的结构,在整像素搜索中装载入数据Cache的参考帧数据能够被后面的半像素搜索和1/4像素搜索所利用,所以从片外SDRAM至片内cache的传输效率较高,虽然从片内cache至寄存器的传输效率非常低并且非常费时;应用参考帧二时,被读取的参考帧图像数据的分布与DSP内部数据Cache的结构相差甚远,在整像素搜索中装载到数据Cache的参考帧数据完全不能被后面的半像素搜索和1/4像素搜索所利用,所以从片外SDRAM至片内cache的传输效率非常低。
于是,可以认为,分数像素精度运动估计的DSP优化方法最后归结为分数像素精度参考帧图像数据的存储形式。合适的存储形式可显著提高运算效率和数据传输效率,从而实现高效率的分数像素精度运动估计,但是目前所采用的参考帧图像数据存储形式显然无法做到这一点。
发明内容
考虑到相关技术中存在的上述问题而提出本发明。为此,本发明旨在提供一种使用数字信号处理器进行分数像素精度运动估计的方案,其采用更为合适的分数像素精度参考帧图像数据存储形式,可以实现高效率的分数像素精度运动估计。
根据本发明实施例,提供了一种使用数字信号处理器进行分数像素精度运动估计的方法,其中,数字信号处理器的数据Cache块长64字节,寄存器读写数据最大位长32。
该方法包括:步骤S402,在系统主内存为视频信源编码的每个1/4像素精度的亮度分量参考帧分配一段连续存储空间;步骤S404,在1/4像素精度参考帧图像平面内,按照从左到右、自上而下的顺序存储图像数据,每个8位像素数据存放到连续存储空间的一个字节位置上;步骤S406,在1/4像素精度参考帧图像平面内的每一行上,对于相同水平分数位置的像素,每4个水平坐标顺序相接的像素数据合并为一个32位字,存储到连续存储空间的一个4字节对齐的字位置上,字的存储顺序为4个像素中为首的像素水平坐标值除4再加上分数值,由此存储完1/4像素精度参考帧图像平面内的一行图像数据;步骤S408,在1/4像素精度参考帧图像平面内按垂直坐标顺序一行接一行地存储数据,由此存储完1/4像素精度参考帧图像平面内的全部图像数据。
其中,在步骤S402中,分配的连续存储空间的大小为:16×(图像宽度+水平外延长度)×(图像高度+垂直外延长度)字节。
另外,根据以下公式唯一确定1/4像素精度参考帧图像平面内的坐标为(pic_pix_y,pic_pix_x)的像素在连续存储空间中的位置:
行位置:pic_pix_y;
列位置:
(pic_pix_x&0xFFFFFFF0)+((pic_pix_x>>2)&3)+((pic_pix_x&3)<<2)
存储位置=参考帧存储空间首地址+行位置×(图像宽度+水平外延长度)×4+列位置。
根据本发明实施例,提供了另外一种使用数字信号处理器进行分数像素精度运动估计的方法,其中,数字信号处理器的数据Cache块长128字节,寄存器读写数据最大位长64。
该方法包括:步骤S502,在系统主内存为视频信源编码的每个1/4像素精度的亮度分量参考帧分配一段连续存储空间;步骤S504,在1/4像素精度参考帧图像平面内,按照从左到右、自上而下的顺序存储图像数据,每个8位像素数据存放到连续存储空间的一个字节位置上;步骤S506,在1/4像素精度参考帧图像平面内的每一行上,对于相同水平分数位置的像素,每4个水平坐标顺序相接的像素数据合并为一个32位字;在垂直分数位置相同并且垂直坐标顺序相接的两行上,两行四列的8个像素合并成的两个32位字再构成一个64位双字,存储到连续存储空间的一个8字节对齐的双字位置上,其中,低垂直坐标行的字位于双字的低字位,双字的存储顺序为低垂直坐标行上4个像素中为首的像素水平坐标值除4再加上分数值,由此存储完1/4像素精度参考帧图像平面内的两行图像数据;步骤S508,在1/4像素精度参考帧图像平面内按垂直坐标顺序两行接两行地存储数据,由此存储完1/4像素精度参考帧图像平面内的全部图像数据。
其中,在步骤S502中,分配的连续存储空间的大小为:16×(图像宽度+水平外延长度)×(图像高度+垂直外延长度)字节。
另外,根据以下公式唯一确定1/4像素精度参考帧图像平面内的坐标为(pic_pix_y,pic_pix_x)的像素在连续存储空间中的位置:
行位置:((pic_pix_y&0xFFFFFFF8)>>1)+(pic_pix_y&3)
列位置:
(pic_pix_y&4)+((pic_pix_x&0xFFFFFFF0)<<1)+((pic_pix_x>>2)&3)+((pic_pix_x&3)<<3)
存储位置=参考帧存储空间首地址+行位置×(图像宽度+水平外延长度)×8+列位置。
本发明提供的两种使用数字信号处理器进行分数像素精度运动估计的方法在各自的DSP硬件平台上执行1/4像素精度运动估计时,一方面允许直接使用DSP提供的多读多操作SIMD指令,最大限度发挥DSP的处理能力以加速运动估计中的SAD计算;另一方面;使得在图1所示的逐级8邻点搜索的1/4像素精度运动估计中被读取的参考帧图像数据的分布更加接近于各自DSP内部数据Cache的结构,显著提高了数据Cache hit的概率,大幅度降低了数据Cache miss的概率,有效提高了数据传输效率。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据相关技术的1/4精度分数像素运动估计的搜索路径示意图;
图2是根据相关技术的参考帧一的示意图;
图3是根据相关技术的参考帧二的示意图;
图4是根据本发明实施例一的使用DSP进行分数像素精度运动估计的方法的流程图;
图5是根据本发明实施例二的使用DSP进行分数像素精度运动估计的方法的流程图;
图6是图4所示的方法中的参考帧三的示意图;以及
图7是图5所示的方法中的参考帧四的示意图。
具体实施方式
如上所述,分数像素精度运动估计的DSP优化方法最后归结为分数像素精度参考帧图像数据的存储形式,在本发明实施例提供的分数像素精度运动估计方案中,根据DSP内部结构安排合适的分数像素精度参考帧图像数据存储形式,从而实现高运算效率和高数据传输效率的分数像素精度运动估计。
以下将参照附图来详细描述本发明实施例,其中,给出以下实施例以提供对本发明的全面和透彻理解,而不是对本发明进行任何限制。
实施例一
根据本发明实施例,提供了一种使用数字信号处理器进行分数像素精度运动估计的方法,其中,数字信号处理器的数据Cache块长64字节,寄存器读写数据最大位长32,典型型号为荷兰飞利浦公司TriMedia/Nexperia处理器。
如图4所示,按以下步骤(步骤S402-步骤S408)存储参考帧图像数据:
步骤S402,在系统主内存为视频信源编码的每个1/4像素精度的亮度分量参考帧分配一段连续存储空间;其中,分配的连续存储空间的大小为:16×(图像宽度+水平外延长度)×(图像高度+垂直外延长度)个字节;
步骤S404,在1/4像素精度参考帧图像平面内,按照从左到右、自上而下的顺序存储图像数据,每个8位像素数据存放到连续存储空间的一个字节位置上;
步骤S406,在1/4像素精度参考帧图像平面内的每一行上,对于相同水平分数位置的像素,每4个水平坐标顺序相接的像素数据合并为一个32位字,存储到连续存储空间的一个4字节对齐的字位置上,字的存储顺序为4个像素中为首的像素水平坐标值除4再加上分数值,由此存储完1/4像素精度参考帧图像平面内的一行图像数据;
例如,每行水平坐标为16n、16n+4、16n+8、16n+12的4个整像素数据合并为一个32位字,存储顺序为4n;水平坐标为16n+1、16n+5、16n+9、16n+13的4个1/4像素数据合并为一个32位字,存储顺序为4n+1;水平坐标16n+2、16n+6、16n+10、16n+14的4个半像素数据合并为一个32位字,存储顺序为4n+2;水平坐标16n+3、16n+7、16n+11、16n+15的4个3/4像素数据合并为一个32位字,存储顺序为4n+3;
步骤S408,在1/4像素精度参考帧图像平面内按垂直坐标顺序一行接一行地存储数据,由此存储完1/4像素精度参考帧图像平面内的全部图像数据。
在上述处理中,根据以下公式唯一确定1/4像素精度参考帧图像平面内的坐标为(pic_pix_y,pic_pix_x)的像素在连续存储空间中的位置:
行位置:pic_pix_y;
列位置:
(pic_pix_x&0xFFFFFFF0)+((pic_pix_x>>2)&3)+((pic_pix_x&3)<<2)
存储位置=参考帧存储空间首地址+行位置×(图像宽度+水平外延长度)×4+列位置。(公式一)
以下进一步具体描述根据本发明实施例一的分数像素精度运动估计过程。
把参考帧一中每行图像数据重新组织,每4个同分数位置的水平坐标顺序相接的图像数据合并成为一个32位的字,存储于存储图像平面内4字节对齐的字位置,不同分数位置的字交错排列且保持与坐标一致的顺序,两个相同分数位置的顺序相接的字被其它三个分数位置的字隔开,构成图6的参考帧三。图6只示意性地示出水平方向上一行图像数据排列方法。垂直方向上列的排列方法按垂直坐标排列,与参考帧一的列排列方法一致。
其中,从整像素值经过二维四倍内插生成1/4像素精度的15个分数像素值的算法属于标准化内容,取决于视频编码、解码所采用的具体一种标准,包括MPEG-4第二版本、H.264及其国内版本AVS。从整像素值生成15个分数像素值的实现方法不为本发明的说明所关注。
其中,16:1的1/4像素精度参考帧图像的存储方法及步骤如上参照图4所述。
应用图6的参考帧三于由荷兰飞利浦公司TriMedia/Nexperia处理器运行的实时视频编解码。
虽然图6的参考帧三的存储位置表达式显得比图2的参考帧一和图3的参考帧二的表达式复杂,但是在实际应用中所增加的运算量可以忽略不计。因为现存所有视频编码标准均采用块匹配的运动估计与补偿方法,存取参考帧数据的单位是块而非像素,对于一个图像块仅需要通过本实施例给出的上述公式一计算出块左上顶点的存储位置便可正确存取。如果该存储位置恰好4字节对齐,用4条32位读指令(TriMedia一个时钟周期并发两条读写指令)就可读入参考图像块一行最多16个图像数据;否则,先用5条读指令读入,再根据不对齐的3个位置分3种情况处理,分别用TriMedia的FUNSHIFT3、FUNSHIFT2和FUNSHIFT1双字移位指令从5个字中提取出所需的4个字。
图6所示的参考帧三克服了参考帧一的不能直接运用多读多操作SIMD指令和参考帧二的数据cache利用率低的缺陷,同时又兼具参考帧一的数据cache利用率高和参考帧二的能够直接运用多读多操作SIMD指令的优点。在TriMedia上使用参考帧三执行1/4像素精度运动估计时,每个cache块的数据利用率最大达到64/64。完成一个16x16方块的1/4像素精度运动估计,最少需要从SDRAM装载98个cache块,最多需要装载130个cache块,与参考帧一的情况相同。从另外一个角度考虑,在图1所示的逐级8邻点搜索的1/4像素精度运动估计中,应用参考帧三时,被读取的参考帧图像数据的分布接近于DSP内部数据Cache的结构,在整像素搜索中装载入数据Cache的参考帧数据能够被后面的半像素搜索和1/4像素搜索所利用,所以从片外SDRAM至片内cache的传输效率较高。同样用TriMedia1300开发板编码300帧CIF格式Foreman测试序列,额定码率768Kbps,硬件Profile显示计算SAD部份模块总时间995907单位,指令执行时间544161单位,数据cache miss停顿时间减少至373179单位,占37.47%。与使用参考帧二的编码结果相比,指令执行时间相差无几590555:544161,因为数据cache miss停顿时间从3191295单位减少至373179单位,只有原来的1/8.55,所以总时间只有原来的1/3.92,处理速度提高至近4倍。
实施例二
根据本发明实施例,提供了另外一种使用数字信号处理器进行分数像素精度运动估计的方法,其中,数字信号处理器的数据Cache块长128字节,寄存器读写数据最大位长64,典型型号为美国德克萨斯仪器公司TMS320C64x/TMS320DM64x处理器。
如图5所示,按以下步骤(步骤S502-步骤S508)存储参考帧图像数据:
步骤S502,在系统主内存为视频信源编码的每个1/4像素精度的亮度分量参考帧分配一段连续存储空间;其中,分配的连续存储空间的大小为:16×(图像宽度+水平外延长度)×(图像高度+垂直外延长度)个字节;
步骤S504,在1/4像素精度参考帧图像平面内,按照从左到右、自上而下的顺序存储图像数据,每个8位像素数据存放到连续存储空间的一个字节位置上;
步骤S506,在1/4像素精度参考帧图像平面内的每一行上,对于相同水平分数位置的像素,每4个水平坐标顺序相接的像素数据合并为一个32位字;在垂直分数位置相同并且垂直坐标顺序相接的两行上,两行四列的8个像素合并成的两个32位字再构成一个64位双字,存储到连续存储空间的一个8字节对齐的双字位置上,其中,低垂直坐标行的字位于双字的低字位,双字的存储顺序为低垂直坐标行上4个像素中为首的像素水平坐标值除4再加上分数值,由此存储完1/4像素精度参考帧图像平面内的两行图像数据;
例如,4m+k(k=0,1,2,3)行水平坐标为16n、16n+4、16n+8、16n+12的4个整像素数据合并为一个32位字,与4m+k+4行水平坐标为16n、16n+4、16n+8、16n+12的4个整像素数据所合并成的一个32位字再合并为一个64位双字,存储顺序为4n;4m+k行水平坐标为16n+1、16n+5、16n+9、16n+13的4个1/4像素数据合并为一个32位字,与4m+k+4行水平坐标为16n+1、16n+5、16n+9、16n+13的4个1/4像素数据所合并成的一个32位字再合并为一个64位双字,存储顺序为4n+1;4m+k行水平坐标为16n+2、16n+6、16n+10、16n+14的4个半像素数据合并为一个32位字,与4m+k+4行水平坐标为16n+2、16n+6、16n+10、16n+14的4个半像素数据所合并成的一个32位字再合并为一个64位双字,存储顺序为4n+2;4m+k行水平坐标为16n+3、16n+7、16n+11、16n+15的4个3/4像素数据合并为一个32位字,与4m+k+4行水平坐标为16n+3、16n+7、16n+11、16n+15的4个3/4像素数据所合并成的一个32位字再合并为一个64位双字,存储顺序为4n+3;
步骤S508,在1/4像素精度参考帧图像平面内按垂直坐标顺序两行接两行地存储数据,由此存储完1/4像素精度参考帧图像平面内的全部图像数据。
在上述处理中,根据以下公式唯一确定1/4像素精度参考帧图像平面内的坐标为(pic_pix_y,pic_pix_x)的像素在连续存储空间中的位置:
行位置:((pic_pix_y&0xFFFFFFF8)>>1)+(pic_pix_y&3)
列位置:
(pic_pix_y&4)+((pic_pix_x&0xFFFFFFF0)<<1)+((pic_pix_x>>2)&3)+((pic_pix_x&3)<<3)
存储位置=参考帧存储空间首地址+行位置×(图像宽度+水平外延长度)×8+列位置。
以下进一步具体描述根据本发明实施例二的分数像素精度运动估计过程。
在美国德克萨斯仪器公司TMS320C64x/TMS320DM64x处理器上使用参考帧三于1/4像素精度运动估计,处理速度虽然优于使用参考帧一和参考帧二的速度,但是还是不尽人意。因为参考帧三并没有针对C64x的64位读指令和cache块长128字节的L2cache优化。在C64x上使用参考帧三执行1/4像素精度运动估计时,每个L2cache块的数据利用率最大只有64/128。完成一个16x16方块的1/4像素精度运动估计,最少需要从SDRAM装载65个cache块,最多需要装载130个cache块。
为了在C64x上实现更高效率的1/4像素精度运动估计,在参考帧三的基础上,把垂直方向上相同分数位置且垂直坐标顺序相接的两行合并为一行,(垂直坐标/4)=偶数的行内每个字与(垂直坐标/4)=奇数的行的同水平位置字合并成为一个64位双字,不同水平分数位置的双字交错排列且保持与坐标一致的顺序,构成图7所示的参考帧四。图7只示意性的示出水平方向上一行图像数据排列方法。
其中,从整像素值经过二维四倍内插生成1/4像素精度的15个分数像素值的算法属于标准化内容,取决于视频编码、解码所采用的具体一种标准。
其中,16:1的1/4像素精度参考帧图像的存储方法及步骤如上参照图5所述。
对于一个16x16块,如果参考帧坐标pic_pix_y/4为偶数,可以完全用64位读指令读入每个搜索位置上8行双字;否则,只能用64位读指令读入每个搜索位置上7行双字,用32位读指令读入最顶和最低两行字。如果参考图像块左上顶点的存储位置恰好4字节对齐,用4条64位读指令(C64x一个时钟周期并发两条64位读写指令)就可读入参考图像块两行32个图像数据;否则,先用5条64位读指令读入,再根据不对齐的3个位置分3种情况处理,分别用C64x的SHRMB、PACKLH2和SHLMB双字移位指令(分别对应于TriMedia的FUNSHIFT3、FUNSHIFT2和FUNSHIFT1双字移位指令,结果一致)从每行5个字中提取出所需的4个字。
使用图7所示的参考帧四执行1/4像素精度运动估计时,每个L2cache块的数据利用率最大达到128/128。完成一个16x16方块的1/4像素精度运动估计,最少需要从SDRAM装载60个cache块,最多需要装载72个cache块。此外在1/4像素精度运动估计中应用参考帧四时,被读取的参考帧图像数据的分布亦接近于DSP内部数据Cache的结构。同样在TI Code Composer Studio3.1开发环境中软件仿真H.264编码,运行环境设置为600MHz主频DM642处理器,SDRAM存取速度133MHz,编码300帧CIF格式Foreman测试序列,额定码率768Kbps,计算SAD部份模块总时间2432427794个时钟周期,CPU执行时间1277413540个时钟周期,L1D miss停顿时间1078711438个时钟周期,占44.35%。与使用参考帧二的编码结果相比,CPU执行时间从613651067个时钟周期延长到1277413540个时钟周期,L1D miss停顿时间从2091360100个时钟周期缩短到1078711438个时钟周期,只有原来的1/1.94,总时间只有原来的1/1.13。通过深入优化(主要是TI C6000正规汇编语言优化)可以进一步缩短CPU执行时间,获得更快的处理速度。
因此,综上所述,本发明通过采用更为合适的分数像素精度参考帧图像数据存储形式,相比于相关技术,实现了高效率的分数像素精度运动估计。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。