一种视频解码数据的存储方法与流程

文档序号:11181029阅读:684来源:国知局
一种视频解码数据的存储方法与流程

本发明涉及视频算法处理领域,具体涉及在视频解码过程中的参考帧列表数据存储及运动向量数据机相关信息存储的方法,以及基于该方法推导运动向量数据的方法。



背景技术:

随着人们对视频图像质量的要求越来越高,分辨率也越来越大,从以往的d1,标清到现在的高清,超高清以及4k、8k发展,帧率也从以往的24fps、25fps、30fps到目前的60fps、120fps发展,这对视频解码的性能来说是一个严峻的挑战。

目前在网络上普及以及广泛使用的基本都是h.264视频标准,h.264标准为了能大幅提升压缩率,降低码率,在算法上采用了很多复杂的算法。首先,在图像结构上,除了传统的帧结构外,还采用了场结构以及帧场自适应mbaff结构,场结构时采用顶场底场分开编解码,而帧场自适应mbaff结构采用宏块对的形式编解码,颠覆了以往逐行宏块编解码的结构,导致在硬件设计中需要重新规划设计。其次,h.264标准采用3种slice类型,即islice、pslice、bslice,islice的解码只能采用帧内预测的方式,pslice和bslice既可以包含帧内预测的方式,也可以包含帧间预测的方式。帧内预测的方式主要去除空间上的冗余,即用周边的宏块预测当前宏块。帧间预测的方式主要去除时间上的冗余,即和时间轴上前面的帧和后面的帧进行块匹配。在帧间预测中,为了能有效的和前后帧进行块匹配,h.264标准采用前后2个参考帧队列,最多各有16帧32场,这2个参考帧队列在解码过程中会动态更新。由于参考帧相比以往的标准多了很多,这给硬件设计带来了很大的难度。最后,在宏块类型上,为了更精确的进行帧间匹配,h.264标准采用了更小的分块类型,包括有16x16、16x8、8x16、8x8、8x4、4x8、4x4分块类型,由于在h.264标准算法中,在解码到b帧的direct和skip宏块时需要用到对应位置co-locatedblock的运动向量等信息,这就需要解码时将当前解码帧场的每个宏块的运动向量等相关信息数据都存入到动态存储器ddr中,由于宏块类型的分块太多,如何存储以便后续高效读取访问是硬件设计需要考虑的问题。

由于h.264标准算法本身十分复杂,而又需要解码超大分辨率、高帧率视频码流,因此,对于硬件解码器来说,如何简化硬件设计的难度,提高硬件解码速度是目前迫切需要解决的问题。



技术实现要素:

本发明的主要目的是提供一种参考帧列表数据存储及访问的方法。

本发明的另一个目的是提供一种运动向量数据及相关信息存储及访问的方法。

为了实现上述的主要目的,本发明提供的参考帧列表数据存储及访问的方法包括将前向参考帧列表list0[n]和后向参考帧列表list1[n]按照规定的格式写入静态存储器sram中,参考帧队列表格中的每一个单元存储有一个参考帧对应在解码缓冲器的索引及标识顶场底场的信息。解码缓冲区所有帧的数据信息也存储在静态存储器sram中,解码缓冲区每一帧的数据信息包括有:每一个帧或帧场自适应mbaff的poc信息,如是场则是顶场和底场的poc信息,每一帧的图像结构信息(帧、场还是帧场自适应mbaff)及帧或顶场底场是否是长期参考帧、短期参考帧和不做参考,还有每一帧的亮度数据存放在动态存储器ddr中的基地址、色度数据存放在动态存储器ddr中的基地址以及帧或顶场运动向量数据存放在动态存储器ddr中的基地址,底场的运动向量数据存放在动态存储器ddr的基地址通过顶场的基地址加一个固定的偏移得到。

由上述方案可见,通过熵解码得到的参考帧索引可以通过存储在静态存储器sram中的参考帧列表得到参考帧在解码缓冲器中的索引值,然后通过此索引值访问解码缓冲区,得到参考帧的poc信息、参考帧的结构信息、参考帧是否用做参考的信息、亮度和色度以及运动向量存放在动态存储器ddr中的基地址等信息。由于参考帧列表,解码缓冲区信息数据都存储在静态存储器sram中,硬件的访问速度很快,而且通过2级访问的方式,可以大大简化硬件的设计,提升硬件解码速度。

为了实现上述的另一个目的,本发明提供的运动向量数据及相关信息存储及访问的方法采用了根据语法direct_8x8_inference_flag每个宏块固定空间的存储方式,不随宏块分块类型的变化而变化,每个宏块存储的信息有:mbinfo数据包括当前宏块是否为intra,是否是场宏块以及block0到block15的参考帧索引refidxlx是否为0,还有每个4x4小块block的运动向量数据以及当前block的参考帧在解码缓冲区的索引。

由上述方案可见,当解码到b帧的direc和skip宏块时,需要访问后向参考帧对应位置的co-locatedblock的运动向量、是否为intra块,参考帧索引refidxlx是否为0以及参考帧在解码缓冲区的索引。首先可以通过存储在静态存储器sram中的参考帧列表得到后向参考帧list1[0]在解码缓冲区的索引,然后通过此索引值访问解码缓冲区,得到参考帧的运动向量存放在动态存储器ddr中的基地址,然后从后向参考帧列表list1[0]中找到和当前block对应位置的co-locatedblock,进而可以访问得到对应位置的co-locatedblock的运动向量、是否为intra块,参考帧索引refidxlx是否为0以及参考帧在解码缓冲区的索引。采用此存储方式,将需要的信息数据全部存放在一起,硬件一次即可访问得到,极大提升了硬件解码速度,而且运动向量数据的存放采用根据direct_8x8_inference_flag每个宏块固定空间的存放方式,非常方便硬件读取对应位置的co-locatedblock的相关信息,也极大的方便了硬件设计,避免了遍历整个宏块的分块信息,简化了硬件设计。

附图说明

图1是本发明存储前后向参考帧列表结构图。

图2是本发明存储前后向参考帧列表每一单元结构图。

图3是本发明存储解码缓冲区数据信息结构图。

图4是本发明在direct_8x8_inference_flag为1时16个4x4小块存储顺序示意图。

图5是本发明在direct_8x8_inference_flag为1存储运动向量及相关信息数据结构图。

图6是本发明在direct_8x8_inference_flag为0时16个4x4小块存储顺序示意图。

图7是本发明在direct_8x8_inference_flag为0存储运动向量及相关信息数据结构图。

图8是本发明在采用周边宏块进行运动向量预测的示意图。

图9是本发明在进行亮度插值的示意图。

图10是本发明在进行色度插值的示意图。

图11是本发明在后向参考帧list[0]中查找和当前block对应位置co-locatedblock的示意图。

图12是本发明在解码b_direct或b_skip宏块采用时域预测方式的示意图。

以下结合附图及实施例对本发明做进一步的说明。

具体实施方式

由于在h.264解码过程中,当解码当前slice为pslice时,需要用到前向参考帧列表list0[n],解码bslice时,需要用到前向参考帧列表list0[n]和后向参考帧列表list1[n],当解码图像结构为帧结构或帧场自适应(mbaff)时,最多有16个参考帧,即n取值0~15;当解码图像结构为场时,最多有32个参考场,即n取值0~31。

在解码slice头信息时,会有相应的语法元素标识参考帧重排序信息,软件根据此信息对前后向参考帧列表list0[n]和list1[n]进行重排序操作,此操作完成后,软件将此重排序后的参考帧列表list0[n]和list1[n]按照图1进行排列,写入静态存储器sram中,如果当前解码图像结构为帧结构或帧场自适应(mbaff)时,前向参考帧列表list0[0]至list0[15]写入偏移地址0x0至0x3,0x4至0x7空着,后向参考帧列表list1[0]至list1[15]写入偏移地址0x8至0x0b,0xc至0xf空着;如果当前解码图像结构为场时,则将前向参考帧列表list0[0]至list0[31]写入偏移地址0x0至0x7,后向参考帧列表list1[0]至list1[31]写入偏移地址0x8至0x0f。采用此设计,可以极大方便h.264硬解码器进行参考帧数据的读取,由于存放在静态存储器中,访问速度很快,可以大大加快硬件解码速度。

前后向参考帧列表list0[n]和list1[n]中每一个单元占用8个bit,所存储的数据如图2所示。最高位bit7在当前解码图像结构为场时有效,为0表示当前参考帧list0[x]或list1[x]是顶场(topfield),为1表示的是底场(bottomfield)。低5bitdpb_idx是当前参考帧list0[x]或list1[x]对应在解码缓冲区(decodepicturebuffer)的索引,此dpb_idx索引信息在一段时间内固定对应一帧,即和某一个参考帧是绑定的,直到此帧数据被刷出去显示,从解码缓冲区内清除。这样,虽然每解码一帧或一场,都需要对参考帧列表进行重新排序,参考帧索引ref_idx会发生变化,但每一个参考帧相对应的dpb_idx不会变化,只需要改变前后向参考帧列表list0[n]和list1[n]中对应表格每一个单元的内容即可。如解码第i帧时,list0[0]对应解码缓冲区内的第m帧,则将第m帧的dpb_idx填入bit4:0,顶底场信息填入bit7,当解码到第i+1帧时,list0[0]经过重排序后可能变为解码缓冲区的第n帧,则将第n帧的dpb_idx填入bit4:0,顶底场信息填入bit7。

在解码当前帧或场或帧场自适应mbaff时,需要用到参考帧的相关数据信息,对每一个参考帧,有下面4类信息数据会用到,具体如下:

1)参考帧的poc信息;

2)参考帧的属性,包括参考帧的图像结构,以及长期参考帧还是短期参考帧;

3)参考帧的亮度和色度数据存放在动态存储器ddr中的基地址;

4)参考帧的运动向量数据及相关信息存放到动态存储器ddr中的基地址。

为了方便硬件设计,在本发明中,将所有参考帧的4类信息进行打包,统一存放到一块静态存储器sram中,存储格式如图3所示。

h.264解码过程中,最多有16个参考帧,加上当前解码输出帧,故共有17个解码缓冲区dpb,每个解码缓冲区dpb占用5个word,偏移地址0用来存放poc信息,如果当前解码图像结构为帧或帧场自适应mbaff时,只有bit31:16用到,用于存放当前帧或帧场自适应mbaff的poc信息,如果当前解码图像结构为场时,bit31:16用于存放顶场的poc信息,bit15:0用于存放底场的poc信息。偏移地址1用于存放参考帧的属性信息,bit1:0用于表示顶场是否用于短期参考,还是长期参考以及不用做参考,bit3:2表示底场是否用于短期参考,还是长期参考以及不用做参考,bit5:4表示参考帧图像结构,是帧、场还是帧场自适应mbaff。偏移地址2用于存放参考帧的亮度数据存放在动态存储器ddr中的基地址。偏移地址3用于存放参考帧的色度数据存放在动态存储器ddr中的基地址。偏移地址4用于存放参考帧的运动向量及相关信息数据存放在动态存储器ddr中的基地址,如果参考帧图像结构是场,则底场的运动向量及相关信息数据存放在动态存储器ddr的基地址通过顶场的基地址加一个固定的偏移即可。

实施例1

本实施例实现对宏块类型为非b_direct和非b_skip的其他帧间inter宏块类型进行插值运算的计算方法。

视频图像解码时,首先进行熵解码,解码得到当前block的参考帧索引,如果当前block类型为前向宏块,则解码得到ref0_idx,如果为后向宏块,则解码得到ref1_idx,如果是双向宏块,则解码得到ref0_idx和ref1_idx。同时,根据mb类型解码得到当前宏块x分量和y分量的运动向量残差,同样,如果为前向宏块,解码得到运动向量残差mvd0_x和mvd0_y,如果为后向宏块,解码得到mvd1_x和mvd1_y,如果是双向宏块,则得到前后向运动向量残差mvd0_x、mvd0_y和mvd1_x、mvd1_y。为了描述方便,下面以当前block类型为前向宏块进行描述。

在熵解码得到了前向宏块的参考帧索引ref0_idx和运动向量残差mvd0_x和mvd0_y后,根据h.264运动向量预测算法,采用周边宏块进行预测见图8,从当前mb左边的宏块lefta,上边的宏块topb,上右边的宏块top_rightc以及上左边的宏块top_leftd预测得到当前宏块的运动向量预测值mvp_x和mvp_y,加上运动向量残差mvd0_x和mvd0_y,从而得到当前宏块的最终的运动向量mv_x和mv_y:

mv_x=mvd0_x+mvp_x(式1)

mv_y=mvd0_y+mvp_y(式2)

同时,根据熵解码得到的参考帧索引ref0_idx,从图1参考帧列表中找到list0[ref0_idx],进而从图2中可以得到此参考帧索引ref0_idx对应解码缓冲区的dpb_idx,进而根据dpb_idx从图3中,得到参考帧的亮度数据存放在动态存储器ddr中的基地址以及色度数据存放在动态存储器ddr中的基地址,再根据当前block的运动向量mv_x和mv_y就可以定位当前block的参考块数据,根据图9和图10,亮度和色度的插值运算算法计算得到当前block的插值结果。

根据dpb_idx得到参考帧的运动向量及相关信息数据存放在动态存储器ddr中的基地址后,就可以访问得到参考帧的运动向量及相关信息数据,参考帧的运动向量及相关信息数据根据从序列参数集sps头解码得到的语法direct_8x8_inference_flag是否为1采用下面2种格式存放。

1)direct_8x8_inference_flag为1时,为了压缩参考帧的运动向量及相关信息数据,只存储每个宏块mb的左边一列和右边一列的4x4小块block的运动向量及相关信息数据,存放顺序如图4所示,每个宏块只需要存储8个4x4小块block的运动向量及相关信息数据,相比原来每个宏块需要存储16个4x4小块block的运动向量及相关信息数据,节省了一半的存储空间,大大节省了带宽。运动向量及相关信息数据的存储格式如下图5所示。

每个宏块占用9个word,第一个word存放mbinfo数据,后面8个word存放8个4x4小块block的运动向量数据。其中mbinfo意义如下:bit0用来表示当前宏块是否为inter(如果为宏块类型为inter设置为0,否则设置为1),bit1表示当前宏块是否是场宏块(帧宏块设置为0,场宏块设置为1),bit16到bit31分别表示block0到block15的参考帧索引refidxlx是否为0(如果refidxlx为0,设置为1,否则设置为0)。8个4x4小块block的运动向量数据采用同样的格式存放,低5bit即bit4:0用来存放dpb_idx,即当前块参考帧在解码缓冲区dpb的帧索引,bit5用来进一步区分参考的是顶场还是底场,bit19:6用来存放当前4x4小块block的运动向量的x分量mv_x,bit31:20用来存放当前4x4小块block的运动向量的y分量mv_y。

2)direct_8x8_inference_flag为0时,每个宏块的16个4x4小块block的运动向量及相关信息数据都需要存储,存放顺序如图6所示。运动向量及相关信息数据的存储格式如下图7所示。

每个宏块占用17个word,第一个word存放mbinfo数据,后面16个word存放16个block的运动向量及相关信息数据。每个word的具体意义和上面相同,不再累述。

由于h.264在pslice和bslice时,宏块的分块类型非常多,包括16x16、16x8、8x16、8x8、8x4、4x8、4x4,如果根据宏块的分块类型来存储运动向量及相关信息数据,不仅要存储每个宏块的分块类型,而且由于每个宏块的分块类型不一样,导致每个宏块占用的空间不固定,在解码过程中,当解码宏块类型为b_direct或b_skip时,需要访问对应位置4x4block的运动向量及相关信息数据时会非常的麻烦,需要遍历整个宏块的分块类型,才能定位对应位置4x4block的位置,进而读取对应位置4x4block的运动向量数据等相关信息,极大增加了硬件解码的设计难度。采用上面的存储格式,在direct_8x8_inference_flag为1时每个宏块固定9个word,direct_8x8_inference_flag为0时固定17个word存放,不需要去考虑每个宏块的分块类型,当解码宏块类型为b_direct或b_skip时,硬件解码器可以很方便的根据direct_8x8_inference_flag直接访问对应位置4x4block的运动向量数据等相关信息,大大简化了硬件设计。

实施例2

本实施例实现当序列参数集sps语法direct_spatial_mv_pred_flag为1时,对宏块类型为b_direct或b_skip采用空域预测方式推导运动向量及进行插值运算的计算方法。

空域预测方式就是根据周边宏块的信息预测得到当前宏块的参考帧索引和运动向量,首先根据图8当前宏块周边a、b、c、d宏块的信息进行计算,得到refidxl0_temp和refidxl1_temp,计算公式如下:

refidxl0_temp=minpositive(refidxl0a,minpositive(refidxl0b,refidxl0c))(式3)

refidxl1_temp=minpositive(refidxl1a,minpositive(refidxl1b,refidxl1c))(式4)

其中:

上述式子中,refidxl0a、refidxl0b和refidxl0c分别表示周边宏块a、b、c的前向参考帧索引,refidxl1a、refidxl1b和refidxl1c分别表示周边宏块a、b、c的后向参考帧索引。

然后根据得到的refidxl0_temp和refidxl1_temp得到当前宏块的参考帧索引refidxl0和refidxl1,计算公式如下:

if(refidxl0_temp<0&&refidxl1_temp<0)

refidxl0=0;refidxl1=0;(式5)

else

refidxl0=refidxl0_temp;refidxl1=refidxl1_temp(式6)

下面计算当前宏块的运动向量数据。首先从后向参考帧列表list1[0]中找到和当前block对应位置的co-locatedblock,如图11所示。同时,从图2中可以得到后向参考帧list1[0]在解码缓冲区的索引dpb_idx及顶底场信息,进而根据dpb_idx从图3中,得到后向参考帧list1[0]的运动向量存放在动态存储器ddr中的基地址,以及同时得到参考帧list1[0]是否是短期参考帧,进而根据参考帧list1[0]的运动向量基地址以及得到的当前block对应位置的co-locatedblock,从图5或图7中可以得到对应位置co-locatedblock的mv_x和mv_y以及refidxlx是否为0信息。根据上面得到的信息就可以计算moving_block,moving_block在下面3个条件都满足的情况下被设置为1:

1)list1[0]是短期参考帧;

2)对应位置co-locatedblock的mv_x和mv_y均在[-1/4,+1/4]区间内;

3)对应位置co-locatedblock的refidxlx为0。

此外,还需要根据周边a、b、c、d宏块预测得到当前宏块的前向运动向量预测值mvp0_x和mvp0_y,以及后向运动向量预测值mvp1_x和mvp1_y,最后根据下面公式得到当前block的前向运动向量mv0_x和mv0_y。

if(refidxl0_temp<0)

{mv0_x=0;mv0_y=0;}(式7)

elseif(refidxl0_temp==0&moving_block)

{mv0_x=0;mv0_y=0;}(式8)

else

{mv0_x=mvp0_x;mv0_y=mvp0_y;}(式9)

后向运动向量mv1_x和mv1_y采用同样的公式得到,只需要将上式中的refidxl0_temp改为refidxl1_temp即可。

经过上面运算得到当前block的前后向参考帧索引refidxl0和refidxl1,从图1中可以得到list0[refidxl0]和list1[refidxl1],进而从图2中可以得到前向后参考帧索引refidxl0和refidxl1对应解码缓冲区的dpb_idx,进而根据dpb_idx从图3中,可以得到前后向参考帧的亮度数据存放在动态存储器ddr中的基地址以及色度数据存放在动态存储器ddr中的基地址,再根据当前block的前向运动向量mv0_x和mv0_y,以及后向运动向量mv1_x和mv1_y,就可以定位当前block的前向参考块数据和后向参考块数据,根据图9和图10,亮度和色度的插值运算算法计算得到当前block的前向插值结果和后向插值结果。最后按照h.264的标准插值运算算法得到当前block的最终插值结果。

实施例3

本实施例实现当序列参数集sps语法direct_spatial_mv_pred_flag为0时,对宏块类型为b_direct或b_skip采用时域预测方式推导运动向量及进行插值运算的计算方法。

时域预测方式就是根据时间轴上后向参考帧和前向参考帧的相关信息推导得到当前宏块的参考帧索引和运动向量。首先从后向参考帧列表list1[0]中找到和当前block对应位置的co-locatedblock,如图6所示。同时,从图2中可以得到后向参考帧list1[0]在解码缓冲区的索引dpb_idx及顶底场信息,进而根据dpb_idx从图3中,可以得到后向参考帧list1[0]的运动向量存放在动态存储器ddr中的基地址,以及同时得到参考帧list1[0]的poc(如果当前解码图像结构为帧或帧场自适应mbaff或是场且list1[0]的bit7为0,则取帧或顶场的poc,如果如果当前解码图像结构为场且list1[0]的bit7为1,则取底场的poc),标记为poc1,进而根据参考帧list1[0]的运动向量基地址以及找到的当前block对应位置的co-locatedblock,从图5或图7中可以得到对应位置co-locatedblock的运动向量等信息,包括是否是intra宏块、是否是场、运动向量数据mv_x和mv_y,以及参考解码缓冲器索引dpb_idx和顶场底场信息。如果对应位置co-locatedblock是intra宏块,则当前block的前后向参考帧索引refidxl0和refidxl1均为0,前向运动向量mv0_x和mv0_y和后向运动向量mv1_x和mv1_y也均为0;否则,如果对应位置co-locatedblock不是intra宏块,首先根据已经得到的对应位置co-locatedblock的dpb_idx和顶场底场信息,从图3中可以得到相应对应位置co-locatedblock的参考帧的poc信息,标记为refidxcol_poc,同时得到此参考帧是否为长期参考帧,然后从前向参考帧列表list0[32]中找出其poc信息和refidxcol_poc相同的参考帧,将其参考帧索引号标记为refidx_map,至此,当前block的前向参考帧索引refidxl0即为refidx_map,后向参考帧索引refidxl1为0。

下面计算当前block的前向运动向量mv0_x和mv0_y和后向运动向量mv1_x和mv1_y。上面描述中已经得到后向参考帧refidxl1的poc为poc1,前向参考帧refidxl0的poc为refidxcol_poc,且同时得到了前向参考帧refidxl0是否为长期参考帧,如果poc1和refidxcol_poc之间的差值为0或者前向参考帧refidxl0为长期参考帧,则前向运动向量mv0_x和mv0_y即为对应位置co-locatedblock的运动向量数据mv_x和mv_y,后向运动向量mv1_x和mv1_y均为0。否则,如图12采用下面计算公式计算得到前后向运动向量:

tx=(16384+abs(td/2))/td(式10)

distscalefactor=clip3(-1024,1023,(tb*tx+32)>>6)(式11)

mv0_x=(distscalefactor*mvcol_x+128)>>8(式12)

mv1_x=mv0_x–mvcol_x(式13)

mv0_y=(distscalefactor*mvcol_y+128)>>8(式14)

mv1_y=mv0_y–mvcol_y(式15)

其中:

tb=clip3(-128,127,(currpic_poc-refidxcol_poc))(式16)

td=clip3(-128,127,(poc1-refidxcol_poc))(式17)

mvcol_x,mvcol_y为对应位置co-locatedblock的运动向量数据,currpic_poc为当前解码图像的poc。

经过上面运算得到当前block的前后向参考帧索引refidxl0和refidxl1,从图1中可以得到list0[refidxl0]和list1[refidxl1],进而从图2中可以得到此前向后参考帧索引refidxl0和refidxl1对应解码缓冲区的dpb_idx,进而根据dpb_idx从图3中,可以得到前后向参考帧的亮度数据存放在动态存储器ddr中的基地址以及色度数据存放在动态存储器ddr中的基地址,再根据当前block的前向运动向量mv0_x和mv0_y,以及后向运动向量mv1_x和mv1_y,就可以定位当前block的前向参考块数据和后向参考块数据,根据图9和图10,亮度和色度的插值运算算法得到当前block的前向插值结果和后向插值结果。最后按照h.264的标准插值运算算法得到当前block的最终插值结果。

最后需要强调的是,本发明不限于上述实现方式,如参考帧列表的存放格式变化,参考帧信息数据存放格式变化,运动向量数据存放格式的变化等都应该包含在本发明权利要求的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1