具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在视频编解码中,一个编解码图像通常划分成若干宏块,宏块又被划分为块。在编解码过程中,需要针对每个当前块计算出相邻块的可用性(相邻块的可用性信息简称为当前块的可用性)情况,即相邻块是否已经编解码。参见图1,当前块101需要用到的相邻块的位置分左方、上方、右上方、左上方,分别记做A、B、C、D。
当前块的相邻块可用性计算既涉及宏块的可用性判断,又涉及宏块内部的各个块之间的可用性判断,因此计算比较复杂。通常的技术方案在每个方向上的可用性计算分别进行如下操作:
通过判断当前块实际坐标位置得出当前块是位于宏块内部还是宏块边界;
如果当前块在宏块内部,进一步判断是否因为编解码顺序导致有些相邻块不可用;
如果当前块在宏块边界,则需要区分出是哪个边界,根据当前块所处宏块相邻块的可用性和边界可用性信息,得出当前块的相邻块的可用性。
以上操作在对当前块的每个方向的可用性计算上都要做一次,一共需做四次。最好的情况下得到一个方向上当前块的可用性也需要两次判断。尤其是当宏块所包含的块越多时,在每一宏块上所花费的计算量也越多。
为便于理解,现对宏块和块作进一步地解释。在视频编解码中,宏块一般为一个P16×16大小的图像块,其中的P代表像素,而块则为宏块内的树形分割得到的编解码的最小单位,相邻块的可用性是指当前块的相邻块是否已经编解码。
在H.264标准中,宏块最基本的分割为:P16×16(即本身不分割),P8×16(参见图2,在此种分割中,一个宏块中包含2个块),P16×8(参见图3,在此种分割中,一个宏块中包含2个块),P8×8(参见图4,在此种分割中,一个宏块中包含4个块),P8×4(参见图5,在此种分割中,一个宏块中包含8个块),P4×8(参见图6,在此种分割中,一个宏块中包含8个块),P4×4(参见图7,在此种分割中,一个宏块中包含16个块)。
上述P16×16、P8×16、P16×8、P8×8、P8×4、P4×8、P4×4即为块的类型。在进行编解码前,上述类型即已知,否则无法对块执行编解码。
参见图8,在编解码过程中,对宏块内各块的编解码会遵循一定的规定,比如,以A4为例,即是1-16的顺序。
那么以A4中标号为13的块作为当前块,其对应的相邻块A、B、C、D分别为块10、块7、块8和块4。根据上述编解码顺序,可知,块10、块7、块8和块4先于块13完成编解码,因此,块13所对应的相邻块A、B、C、D的可用性信息为:A、B、C、D均可用。
再以块1为例:可知,其对应的A、B、D相邻块的可用性与各自所属的A1-A3宏块的可用性一致,也即,当A所在的A3宏块已完成编解码时,A可用,否则A不可用,同理可推知相邻块B和D的可用性与宏块A2和A1的可用性一致。至于邻块C,由于与邻块B同属一个宏块,因此与B的可用性一致。
以此类推,可将当前块所对应的类别分为第零类至第七类,其中:
第零类所对应的相邻块A、B、C、D的可用性信息为:A、B、C、D均可用;
第一类所对应的相邻块A、B、C、D的可用性信息为:A、B、D的可用性与各自所属的宏块的可用性一致,C的可用性与B的可用性一致;
第二类所对应的相邻块A、B、C、D的可用性信息为:A可用,B、C的可用性与各自所属的宏块的可用性一致,D的可用性与B的可用性一致;
第三类所对应的相邻块A、B、C、D的可用性信息为:B、C可用,A可用性与其所属的宏块的可用性一致,D的可用性与A的可用性一致;
第四类所对应的相邻块A、B、C、D的可用性信息为:A、B、D均可用,C不可用;
第五类所对应的相邻块A、B、C、D的可用性信息为:B可用,C不可用,D的可用性与A的可用性一致;
第六类所对应的相邻块A、B、C、D的可用性信息为:A可用,B的可用性与其所属的宏块的可用性一致,C、D的可用性与B的可用性一致;
第七类所对应的相邻块A、B、C、D的可用性信息为:A、B、C、D的可用性与各自所属的宏块的可用性一致。
另外,宏块A4中的1-16可视为某一块相对于宏块的逻辑位置。由对图10中的块1和块13的分析可知,即使在同一类型中,块的逻辑位置不同,其相邻块的可用性信息也不同。因此,在获取当前块的相邻块可用性时,需要同时考虑当前块的逻辑位置以及其所对应的类型。块的类型以及逻辑位置可唯一地确定块的类别。
现以0-7表示上述第零至七类,则图2-7各宏块所对应的类别如图9-14所示。基于上述分析,本发明实施例提供了可减少计算量当前块的相邻块可用性获取系统。
图15示出了上述系统的一种结构,包括:
预定义单元201,用于预先定义块的类别,块的逻辑位置和类型与所述类别的关系,以及所述类别所对应的相邻块可用性信息,所述逻辑位置为块在所属宏块中的相对位置;
确定单元202,用于确定当前块的逻辑位置和类型,根据所述逻辑位置和类型确定当前块所属的类别,以及根据所述类别确定当前块的相邻块的可用性信息。
与之相对应,本发明实施例还提供了一种当前块的相邻块可用性获取方法,参见图16,该方法至少包括如下步骤S1-3:
S1、确定当前块的逻辑位置和类型;
S2、根据所述逻辑位置和类型确定当前块所属的类别;
S3、根据所述类别确定当前块的相邻块的可用性信息。
在实施上述步骤之前,预先定义了块的类别,块的逻辑位置和类型与所述类别的关系,以及所述类别所对应的相邻块可用性信息,所述逻辑位置为块在所属宏块中的相对位置。
在本发明其他实施例中,以上实施例中的方法还可包括如下步骤:
预先以表格的形式存储所述块的类别,以及块的逻辑位置和类型与所述类别的关系。
而在本发明其他实施例中,以上所有实施例中的方法还可包括如下步骤:
预先以表格的形式存储所述类别所对应的相邻块可用性信息。
可以看出,由于已经预先定义块的类别,块的逻辑位置和类型与所述类别的关系,以及所述类别所对应的相邻块可用性信息,因此在进行可用性判断时,只需根据上述关系即可得到四个方向相邻块的可用性信息,而无需每一方面上均进行计算。与传统方式相比,本发明实施例所提供的技术方案可大大减少计算量。
当然,本发明所公开之技术方案不仅仅只适用于视频编解码领域,在其他相关相似领域,需要判断相邻块可用性乃至其他时,也可将本发明之精神移植过去。并根据编解码顺序或预设处理顺序的不同,分为若干类,每一类对应不同的可用性信息,在此不作赘述。
上述对宏块的分割仅为最基础的,事实上,参见图17,可先将一宏块分割为P8×8的B1-B4四块,然后将B1和B4分为P4×4的块,而将B2分割为P8×16的块,而将B3分割为P16×8的块。
针对上述类似的情况,以B1分割块中的四块为例,该四块的类型为P4×4,其逻辑位置与P4×4(参见图18)中C1-C4的位置相对应,则其对应的类别也与P4×4中块C1-C4的位置相对应。而以B2分割块为例分析,则B2中块的类型为P8×4,其对应的类别也与图19中P8×4中块D2、D4的类别相对应。
需要说明的是,无论如何对宏块进行分割,其分割方式,也即每一块对应的类型都是预知的,否则无法进行编解码。
在本发明其他实施例中,参见图20,对块的逻辑位置可进行如下设定:
以宏块的最左端顶点为起始点,每4个像素为一刻度,则水平维度及竖直维度上具有0-3四个刻度。
当一个块对应两个刻度时,例如块E1在水平方向上即对应0,1,在竖直方向上也对应0,1,取该块左上角的顶点对应的刻度作为其逻辑位置,也即E1的逻辑位置为[0][0]。
前已述及,预先以表格的形式存储所述块的类别,块的逻辑位置和类型与所述类别的关系,可对表格进行如下初始化:
#define P8x8_AVAIL_ALL 类别0//
#define P8x8_AVAIL_ABCD_NOT 类别1//
#define P8x8_AVAIL_BCD_NOT 类别2//
#define P8x8_AVAIL_A_NOT 类别3//
#define P8x8_AVAIL_C0_D1 类别4//
#define P8x8_AVAIL_AD_NOT 类别5//
#define P8x8_AVAIL_BCD_NOT_CUP 类别6//
#define P8x8_AVAIL_ABCD 类别7//
#define P_16x8 0
#define P_8x16 1
#define P_8x8 2
#define P_8x4 3
#define P_4x8 4
#define P_4x4 5
INT16*ptr=H264DEC_P8x8_AVAILTABLE[0][0];
for(i=0;i<6*4*4;i++)
{*ptr++=P8x8_AVAIL_ALL;}
H264DEC_P8x8_AVAILTABLE[P_16x8][0][0]=P8x8_AVAIL_ABCD;
H264DEC_P8x8_AVAILTABLE[P_16x8][0][2]=P8x8_AVAIL_AD_NOT;
H264DEC_P8x8_AVAILTABLE[P_8x16][0][0]=P8x8_AVAIL_ABCD_NOT;
H264DEC_P8x8_AVAILTABLE[P_8x16][2][0]=P8x8_AVAIL_BCD_NOT;
H264DEC_P8x8_AVAILTABLE[P_8x8][0][0]=P8x8_AVAIL_ABCD_NOT;
H264DEC_P8x8_AVAILTABLE[P_8x8][2][0]=P8x8_AVAIL_BCD_NOT;
H264DEC_P8x8_AVAILTABLE[P_8x8][0][2]=P8x8_AVAIL_A_NOT;
H264DEC_P8x8_AVAILTABLE[P_8x8][2][2]=P8x8_AVAIL_C0_D1;
H264DEC_P8x8_AVAILTABLE[P_8x4][0][0]=P8x8_AVAIL_ABCD_NOT;
H264DEC_P8x8_AVAILTABLE[P_8x4][0][1]=P8x8_AVAIL_AD_NOT;
H264DEC_P8x8_AVAILTABLE[P_8x4][0][2]=P8x8_AVAIL_A_NOT;
H264DEC_P8x8_AVAILTABLE[P_8x4][0][3]=P8x8_AVAIL_AD_NOT;
H264DEC_P8x8_AVAILTABLE[P_8x4][2][0]=P8x8_AVAIL_BCD_NOT;
H264DEC_P8x8_AVAILTABLE[P_8x4][2][1]=P8x8_AVAIL_C0_D1;
H264DEC_P8x8_AVAILTABLE[P_8x4][2][2]=P8x8_AVAIL_C0_D1;
H264DEC_P8x8_AVAILTABLE[P_8x4][2][3]=P8x8_AVAIL_C0_D1;
H264DEC_P8x8_AVAILTABLE[P_4x8][0][0]=P8x8_AVAIL_ABCD_NOT;
H264DEC_P8x8_AVAILTABLE[P_4x8][0][2]=P8x8_AVAIL_A_NOT;
H264DEC_P8x8_AVAILTABLE[P_4x8][1][0]=P8x8_AVAIL_BCD_NOT_CUP;
H264DEC_P8x8_AVAILTABLE[P_4x8][2][0]=P8x8_AVAIL_BCD_NOT_CUP;
H264DEC_P8x8_AVAILTABLE[P_4x8][3][0]=P8x8_AVAIL_BCD_NOT;
H264DEC_P8x8_AVAILTABLE[P_4x8][3][2]=P8x8_AVAIL_C0_D1;
H264DEC_P8x8_AVAILTABLE[P_4x4][0][0]=P8x8_AVAIL_ABCD_NOT;
H264DEC_P8x8_AVAILTABLE[P_4x4][0][1]=P8x8_AVAIL_A_NOT;
H264DEC_P8x8_AVAILTABLE[P_4x4][0][2]=P8x8_AVAIL_A_NOT;
H264DEC_P8x8_AVAILTABLE[P_4x4][0][3]=P8x8_AVAIL_A_NOT;
H264DEC_P8x8_AVAILTABLE[P_4x4][1][0]=P8x8_AVAIL_BCD_NOT_CUP;
H264DEC_P8x8_AVAILTABLE[P_4x4][1][1]=P8x8_AVAIL_C0_D1;
H264DEC_P8x8_AVAILTABLE[P_4x4][1][3]=P8x8_AVAIL_C0_D1;
H264DEC_P8x8_AVAILTABLE[P_4x4][2][0]=P8x8_AVAIL_BCD_NOT_CUP;
H264DEC_P8x8_AVAILTABLE[P_4x4][3][0]=P8x8AVAIL_BCD_NOT;
H264DEC_P8x8_AVAILTABLE[P_4x4][3][1]=P8x8_AVAIL_C0_D1;
H264DEC_P8x8_AVAILTABLE[P_4x4][3][2]=P8x8_AVAIL_C0_D1;
H264DEC_P8x8_AVAILTABLE[P_4x4][3][3]=P8x8_AVAIL_C0_D1。
以初始化中的“H264DEC_P8x8_AVAILTABLE[P_16x8][0][0]”为例,其在“AVAILTABLE”后的[P_16x8]即为块的类型,而[0][0]即为块的逻辑位置。
经上述初始化后所形成的表格可称为第一表格,该表格可用于检索当前块的类别。
前已述及,还可预先以表格的形式存储所述类别所对应的相邻块可用性信息。存储于上述可用性信息的表格可称为第二表格。因此,在本发明其他实施例中,在得到当前块类别之后,还可通过检索第二个表格来得出当前块的相邻块的可用性。
设某一宏块的相邻宏块的可用性分别为Left_available、Up_available、UpRight_available、UpLeft_available;设可用为H264DEC_AllAvailableMB=1;设不可用为H264DEC_NoneAvailableMB=0。第二表格的一种初始化方式如下:
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_ALL][0]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_ALL][1]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_ALL][2]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_ALL][3]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x_8AVAIL_ABCD_NOT][0]=&H264DEC_LeftAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_ABCD_NOT][1]=&H264DEC_UpAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_ABCD_NOT][2]=&H264DEC_UpAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_ABCD_NOT][3]=&H264DEC_UpLeftAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_BCD_NOT][0]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_BCD_NOT][1]=&H264DEC_UpAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_BCD_NOT][2]=&H264DEC_UpRightAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_BCD_NOT][3]=&H264DEC_UpAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_A_NOT][0]=&H264DEC_LeftAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_A_NOT][1]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_A_NOT][2]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_A_NOT][3]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_C0_D1][0]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_C0_D1][1]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_C0_D1][2]=&H264DEC_NoneAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_C0_D1][3]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_AD_NOT][0]=&H264DEC_LeftAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_AD_NOT][1]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_AD_NOT][2]=&H264DEC_NoneAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_AD_NOT][3]=&H264DEC_LeftAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_BCD_NOT_CUP][0]=&H264DEC_AllAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_BCD_NOT_CUP][1]=&H264DEC_UpAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_BCD_NOT_CUP][2]=&H264DEC_UpAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_BCD_NOT_CUP][3]=&H264DEC_UpAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_ABCD][0]=&H264DEC_LeftAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_ABCD][1]=&H264DEC_UpAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_ABCD][2]=&H264DEC_UpRightAvailableMB;
H264DEC_P8x8_AVAILTABLE_INDEX[P8x8_AVAIL_ABCD][3]=&H264DEC_UpLeftAvailableMB。
在本发明其他实施例中,还可直接根据块的逻辑坐标来得到块的类别。
参见图21,以宏块的最左端顶点为起始点画X轴和Y轴,每一轴以4个像素为一刻度进行标记,这样,在X和Y方向,分别有0-4五个逻辑坐标刻度。以不同分割方式分割出的块,其顶点的逻辑坐标也不同。一个块有四个角,每一角上都有一个顶点,由于块均为长方形或正方形,因此某一块的对角线上的顶点或任意三顶点的逻辑坐标可唯一确定一个块的逻辑位置,同时也可唯一地确定一个块的分割方式,也即其对应的块的类型。因此,在本实施例中,块的逻辑位置具体为块的顶点的逻辑坐标,而逻辑坐标意为块中某一像素点在所属宏块中的相对坐标。
因此,在本发明其他实施例中,可直接定义逻辑坐标与块的类别的关系,也即,可直接预先定义块的逻辑位置与该块的类别的关系,从而进一步获得当前块的相邻块的可用性信息。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,所述程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。