一种用于vp9解码器运动矢量预测的方法和装置的制造方法_4

文档序号:9353179阅读:来源:国知局
[0066]而后解码模块101对下一行或下一列的子块进行解码时,判断模块102判断下一行或一下列的子块大小是否大于预设子块的大小,若是则第一存储模块113将下一行或下一列的子块的解码数据存储到第一存储位置。如图5所示,待解码64x64宏块(相当于图4中的空白区域)的左上角有一大小为32x32的子块(以下称“块2”),其包括16个8x8大小的子块,16个8x8大小的子块分别对应的坐标为:(0,O),(1,0), (2,0), (3,0), (0,1),
(1,1), (2,1), (3,1), (0,2), (1,2), (2,2), (3,2), (0,3), (1,3), (2,3), (3,3)。当解码到块2时,首先会对块2的大小进行判断,例如在本实施方式中,预设子块的大小为32x16个像素点,当判断到块2大小(为32x32)大于预设子块的大小(32x16),则会将块2对应的的解码数据存储到第一存储位置,所述第一存储位置即为块I的解码数据对应的解码数据的存储位置,即寄存器I至16。图5中箭头方向表示块2对应的解码数据的存储位置走向,块I为已经完成解码的子块,而块2是块I下一行或下一列的待解码的子块。由于块I已经完成解码,因而块I的解码数据对应的存储位置(即编号为1-16的寄存器)可以用于存储块2的解码数据,从而提高寄存器的复用性。具体地,块2的解码数据存储于第一存储位置,可以采用如下方式进行存储:块2中坐标为(0,0)的8x8子块的解码数据存储于块I中坐标为(_3,-3)的8x8子块的解码数据对应的存储位置(即寄存器I),并覆盖原有寄存器I中所存储的解码数据;块2中坐标为(1,0)的8x8子块的解码数据存储于寄存器2中,所述寄存器2为块I中坐标为(-2,-3)的8x8子块的解码数据对应的存储位置;块2中坐标为(2,0)的解码数据存储于块I中坐标为(_1,-3)的8x8子块的解码数据对应的存储位置(即寄存器3),并覆盖原有寄存器3中所存储的解码数据;以此类推,直至块2所包含的16个8x8的解码数据全部存储完成。
[0067]当所解码的下一行或一下列的子块大小小于预设子块大小时,则第二存储模块将下一行或下一列的子块的解码数据存储到第二存储位置中。例如本实施方式中,预设子块的大小为32x16大小的子块,则其在解码小于32x16的子块(如8x8,8x16等)时,不会覆盖原有的子块的解码位置的存储位置(即第一存储位置),而是将其另外加以存储,存储于第二存储位置。以图5为例,块I为32x32的子块,其解码数据存储于寄存器I至16,当块I解码完成后,其在解码下一行或下一列的子块时,如子块的大小为8x8,则不会将该8x8子块的存储数据存储于寄存器I至16中,而是另外开辟寄存器对其加以存储,例如可以将8x8子块的存储数据存储于编号为17的寄存器,从而减少子块与第一存储位置之间的映射关系,减少了算法复杂度,提高了解码的准确性。
[0068]在本实施方式中,所述宏块的大小为64x64,则所述子块大小包括:64x32、32x64、32x32、32xl6、16x32、16xl6、16x8、8xl6、8x8中的一种或多种。所述预设子块的大小为64x32、32x64、32x32中的一种或多种。预设子块的大小可以自定义决定,例如将预设子块大小设置为32x64,则其在解码32x32、32xl6、16x32、16x8、8xl6、8x8的子块时,不会存储于第一存储位置(即原有子块的解码数据对应的存储位置),而是将其存储于第二存储位置。编码人员可以根据不同需要,选择不同的视频在解码时预设子块的大小,从而提高解码效率。
[0069]在本实施方式中,所述“对宏块中某一行或某一列的子块进行解码”包括步骤:按照Z字型的顺序对某一行或某一列的子块进行解码。VP9在视频解码过程是按照Z字型的顺序对子块进行解码的。如图3所示,为本发明一实施例所述的宏块的结构示意图,宏块的大小为64x64,从图中可以看出,所示宏块包括4个32x32的子块,将左上角的32x32的子块定义为第一 32x32子块,将右上角的32x32的子块定义为第二 32x32子块,将左下角的32x32的子块定义为第三32x32子块,将右下角的32x32的子块定义为第四32x32子块,按照Z字型的顺序进行解码是指:在解码该64x64的宏块时,首先解码第一 32x32子块,而后解码第二 32x32子块,而后解码第三32x32子块,最后解码第四32x32子块。
[0070]对于第一 32x32子块而言,从图3中可以看出,第一 32x32子块又包括4个16x16大小的子块,同理,可以将第一 32x32子块中左上角、右上角、左下角、右下角的16x16的子块分别定义为第一 16x16子块、第二 16x16子块、第三16x16子块、第四16x16子块,则在解码第一 32x32子块时,同样是按照Z字型的解码顺序进行,即首先解码第一 16x16子块,而后解码第二 16x16子块,而后解码第三16x16子块,最后解码第四16x16子块。而对于第一16x16子块而言,其又包括4个8x8的子块,在图3中数字标号为I至4,同理,在解码第一16x16子块时,也是按照Z字型的解码顺序进行解码,即先解码图3中标号为I的8x8子块,而后解码图3中标号为2的8x8子块,而后解码标号为3的8x8子块,再解码标号为4的8x8子块。
[0071]简而言之,按照Z字型解码就是对于宏块而言,其解码顺序是按照Z字型进行的,对于宏块所包括的子块而言,如果该子块包括多个更小的子块,那么在对这些更小的子块进行解码时,解码顺序也是按照Z字型进行的。如图3中的64x64的宏块,其解码顺序为先解码图中标记为I的子块,再解码图中标记为2的子块,再解码标记为3的,以此类推,最后解码标记为15的子块。对宏块中某一行或某一列的子块按照Z字型的顺序进行解码,使得对宏块的解码有迹可循,不仅可以快速高效地完成解码,同时也不易于在解码过程中出现差错。
[0072]在本实施方式中,所述方法还包括步骤:将某一行或某一列的子块与其下一行或下一列的子块交界处对应的解码数据存储于第二存储位置。VP9在解码过程中首先对某一行或者某一列中的子块进行解码,当在解码下一行或下一列的子块时,需要用到该行或该列子块的解码数据。当下一行或下一列的子块大小大于预设子块大小时,就会将下一行或下一列的子块的解码数据存至第一存储位置,即原先解码的某一行或某一列子块的存储位置,并覆盖原有的解码数据。这就容易导致问题,在子块之间交界处的更小的子块的解码数据,由于其需要同时被两个子块用到,因而如果直接采用覆盖的方式,往往会出现失帧现象。例如图5中,块I中的坐标为(3,3)的8x8的子块为交界处的子块,因而需要对坐标为(3, 3) 8x8的子块对应的解码数据单独进行存储,即将其存储至第二存储位置。再比如图6中,再替换第二个32x32子块(块3)时,其交界处的解码数据为坐标为(4,3),(5,3), (6,3),(7, 3)的8x8子块对应的解码数据,因而需要对这4个8x8子块对应的解码数据进行单独存储,直接覆盖后出现失帧。具体地,在替换第二个32x32子块时,所有8x8子块的解码数据存储位置关系如下:
[0073](4,0)->(1,-3),(5,O)->(2,-3),(6,O)-> (3,_3),(7,O)-> (4,_3)
[0074](4,1)->(1,-2),(5,I)->(2,-2),(6,I)-> (3,_2),(7,I)-> (4,_2)
[0075](4,2)->(1,-1),(5,2)->(2,-1),(6,2)-> (3,—I),(7,2)-> (4,-1)
[0076](4,3) -> (El),(5,3) -> (E2),(6,3) -> (E3),(7,3) -> (E4)
[0077]其中,E1、E2、E3、E4表示寄存器。箭头坐标左边表示第二个32x32子块所包含的8x8子块对应的左边,箭头右边表示该坐标子块对应的存储位置,例如(4,0)->(1,-3),表示将左边为(4,0)的8x8子块的解码数据存储到坐标为(1,-3)的8x8子块的解码数据对应的存储位置,并覆盖原有的坐标为(1,_3)的8x8子块的解码数据。再比如(4,3)->(Ε1),表示坐标为(4,3)的8x8子块的解码数据存储到寄存器El中。
[0078]图7与图8为
当前第4页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1