发明内容
本发明所要解决的技术问题是提供一种帧宽高为非16整数倍的视频编码方法及编码器,以解决现有的编码器对宽高为非16整数倍的视频帧编码效率低的问题。
为了解决上述问题,本发明公开了一种帧宽高为非16整数倍的视频编码方法,包括:
将宽或高为非16整数倍的原始视频帧大小扩充为16的整数倍;
将原始视频帧中与扩充区域相邻的相同大小的连续行或列值拷贝并填充到相应的扩充区域;
对填充后的视频帧进行编码。
优选的,所述将原始视频帧中与扩充区域相邻的相同大小的连续行或列值拷贝并填充到相应的扩充区域,包括:针对原始视频帧的左侧或右侧扩充区域,从原始视频帧的左侧或右侧边缘开始将与扩充区域相同大小的连续列值拷贝并填充到左侧或右侧扩充区域。
优选的,所述将原始视频帧中与扩充区域相邻的相同大小的连续行或列值拷贝并填充到相应的扩充区域,包括:针对原始视频帧的上方或下方扩充区域,从原始视频帧的上方或下方边缘开始将与扩充区域相同大小的连续行值拷贝并填充到上方或下方扩充区域。
优选的,所述对填充后的视频帧进行编码,包括:当进行帧内预测编码时,对于扩充区域中划分出的完整子块,直接将拷贝内容的编码结果作为所述子块的编码结果;对于扩充区域中不能划分成完整子块的残缺子块,则与原始视频帧的边界像素联合形成完整子块进行编码。
优选的,所述对填充后的视频帧进行编码,包括:当进行帧间预测编码时,对于扩充区域中划分出的完整子块,直接将拷贝内容的编码结果作为所述子块的编码结果;对于扩充区域中不能划分成完整子块的残缺子块,则与原始视频帧的边界像素联合形成完整子块进行编码。
本发明还提供了一种视频编码器,包括:
填充单元,用于将宽或高为非16整数倍的原始视频帧大小扩充为16的整数倍,并将原始视频帧中与扩充区域相邻的相同大小的连续行或列值拷贝并填充到相应的扩充区域;
编码单元,用于对填充后的视频帧进行编码。
优选的,所述填充单元包括:列填充子单元,用于针对原始视频帧的左侧或右侧扩充区域,从原始视频帧的左侧或右侧边缘开始将与扩充区域相同大小的连续列值拷贝并填充到左侧或右侧扩充区域。
优选的,所述填充单元还包括:行填充子单元,用于针对原始视频帧的上方或下方扩充区域,从原始视频帧的上方或下方边缘开始将与扩充区域相同大小的连续行值拷贝并填充到上方或下方扩充区域。
优选的,所述编码单元包括:帧内预测编码子单元,用于当进行帧内预测编码时,对于扩充区域中划分出的完整子块,直接将拷贝内容的编码结果作为所述子块的编码结果;对于扩充区域中不能划分成完整子块的残缺子块,则与原始视频帧的边界像素联合形成完整子块进行编码。
优选的,所述编码单元还包括:帧间预测编码子单元,用于当进行帧间预测编码时,对于扩充区域中划分出的完整子块,直接将拷贝内容的编码结果作为所述子块的编码结果;对于扩充区域中不能划分成完整子块的残缺子块,则与原始视频帧的边界像素联合形成完整子块进行编码。
与现有技术相比,本发明具有以下优点:
首先,本发明针对宽或高为非16整数倍的原始视频帧编码时,首先扩充为16的整数倍,即扩充后的视频帧可以形成16x16的宏块,然后将原始视频帧中与扩充区域相邻的相同大小的连续行或列值拷贝并填充到相应的扩充区域,再按照H.264、MPEG-4等标准进行编码。本发明所述的填充方法,增加了填充内容与原始视频帧内容之间的相关性,因此提高了编码效率。
其次,本发明对扩充区域中能够形成和不能形成4x4以上的完整子块分别采用不同的编码策略,即:对于能够形成4x4以上的完整子块,直接将拷贝内容的编码结果作为所述子块的编码结果,而对于不能形成的残缺子块,则与原始视频帧的边界像素联合形成完整子块并按照标准进行编码。由于能够形成4x4以上的子块无需再做编码,因此进一步提高了编码效率。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
针对宽或高为非16整数倍的视频帧编码,本发明提供了一种方法,可以提高编码效率,下面通过实施例进行详细说明。
参照图2,是本发明实施例所述一种帧宽高为非16整数倍的视频编码方法流程图。
步骤201,将宽或高为非16整数倍的原始视频帧大小扩充为16的整数倍;
如果待编码的原始视频帧不能划分成16x16的完整宏块,则需要进行扩充。其中,如果仅是宽为非16整数倍,则只对宽进行扩充;如果仅是高为非16整数倍,则只对高进行扩充;如果宽和高都为非16整数倍,则对宽和高都做扩充。通常,填充是在原始视频帧的右侧和下方进行,因此以下内容将以右侧和下方的填充为例进行说明。
参照图3所示,是本发明实施例中宽和高为非16整数倍的视频帧填充示意图。与图1类似,粗实线表示原始待编码视频帧的大小,宽和高也分别设为a和b,由于a和b都不是16的整数倍,因此需要对宽和高都做扩充。扩充的范围如细实线所示,分别为a1和b1,满足(a+a1)%16=0,(b+b1)%16=0,其中“%”表示除法取整运算。扩充后的视频帧可以划分出完整的16x16宏块。
此外,本实施例是对原始视频帧的右侧边缘和下方边缘进行扩充,因此图中扩充的区域分别位于原始视频帧的右侧和下方,当然也可以对左侧和上方边缘进行扩充。
步骤202,将原始视频帧中与扩充区域相邻的相同大小的连续行或列值拷贝并填充到相应的扩充区域;
确定扩充范围之后,就需要对扩充区域进行像素值的填充。本实施例采用的填充方法是:对扩充区域填充相同大小的相邻连续的行或者列,区别于现有技术填充最边缘的行或者列。
如图3示例所示,对于原始视频帧的右侧扩充区域,从原始视频帧的右侧边缘开始将与扩充区域相同大小的连续列值拷贝并填充到右侧扩充区域;对于原始视频帧的下方扩充区域,从原始视频帧的下方边缘开始将与扩充区域相同大小的连续行值拷贝并填充到下方扩充区域。
例如,假设右侧扩充区域需要填充4列像素值,则将原始视频帧中与右侧扩充区域相邻的连续4列像素值复制到右侧扩充区域中,如图中水平双向箭头所示,原始视频帧的右侧边缘线正好位于水平双向箭头的中间位置。同样,假设下方扩充区域也需要填充4行像素值,则将原始视频帧中与下方扩充区域相邻的连续4行像素值复制到下方扩充区域中,如图中竖直双向箭头所示,原始视频帧的下方边缘线正好位于竖直双向箭头的中间位置。
而对于扩充区域右下角的小块区域,由于其上方和左侧的填充内容相同,所以可以将上方或左侧的填充内容同样复制到该小块区域中。
通过以上填充,扩充区域中填充的内容与原始视频帧中相同大小的相邻边界的内容相同,而不仅仅是与最边缘的行或列相同,所以填充的内容与原始视频帧内容之间的相关性较高,可以避免填0操作做编码预测的影响,避免引入误差,从而可以提高编码效率。
步骤203,对填充后的视频帧进行编码。
按照上述方法进行填充之后,编码器就可以按照正常的视频帧大小进行编码,编码方法可参考H.264、MPEG-4等标准。
优选的,根据上述填充的特点,本实施对扩充区域中能够形成和不能形成4x4以上的子块分别采用不同的编码策略,以进一步提高填充内容的编码效率。其中,所述子块是对16x16的宏块进行划分的结果,根据标准的不同,可以划分成4x4、4x8或8x4等多种分块模式的子块。例如,H.264标准中形成的块可以是4x4、4x8、8x4、8x8,16x8(下方)和8x16(右方),其中帧内预测只有形成4x4的块有效(因为帧内模式只有4x4和16x16两种,而16x16不可能形成),帧间模式除了16x16都可能有效。而MPEG-4标准中一个宏块只能形成8x8和16x16两种块划分。
以H.264标准为例,具体如下:
对于H.264的帧内预测编码:
1)如果扩充区域正好可以划分成完整的4x4子块,即原始视频帧的边界正好位于完整子块的边界,则由于扩充区域的子块内容与原始视频帧的子块内容完全相同,因此可以直接将原始视频帧中拷贝内容的编码结果作为所述子块的编码结果,无需再做编码操作。其中,所述编码结果包括预测模式(Intra Mode)、残差等数据。
参照图4.1所示,图中的粗实线表示原始视频帧的边界,细虚线表示子块划分结果,边界左侧为原始视频帧的部分子块,边界的右侧为填充的子块。由图可知,填充的子块全部为完整子块,填充子块的大小与边界左侧原始视频帧的子块大小相同,均为4x4像素。此种情况下,边界右侧的所有填充子块可以沿用原始视频帧中拷贝子块的编码结果。
2)如果扩充区域不能全部划分成完整的4x4的残缺子块,而存在部分子块的大小不是4x4,这些不完整的残缺子块需要与原始视频帧联合才能构成完整的子块。参照图4.2所示,图中的粗实线仍表示原始视频帧的边界,细虚线表示子块划分结果,边界左侧为原始视频帧的部分子块,边界的右侧为填充的子块。由图可知,原始视频帧边界处的子块与相邻扩充区域的子块联合构成完整的4x4子块。但是,扩充区域中还存在完整划分出的4x4子块。
对于这种情况,扩充区域中划分出的4x4的完整子块,可以按照上述1)的方法直接将拷贝内容的编码结果作为所述子块的编码结果;而对于扩充区域中不能划分成4x4的子块,则与原始视频帧的边界像素联合形成4x4的子块进行编码,编码方法可参考H.264、标准。
此外,对于帧内预测,扩充区域子块的边缘参考像素值(如上方或者左侧)与原始视频帧中子块的边缘参考像素也相同,才可以能拷贝原始块的编码结果。
对于H.264的帧间预测编码,也可以采用与帧内预测编码相同的方式,即:对于扩充区域中划分出的4x4以上的完整子块,可以直接将拷贝内容的编码结果作为所述子块的编码结果,无需再做编码操作;对于扩充区域中不能划分成4x4以上的残缺子块,则与原始视频帧的边界像素联合形成4x4、4x8或8x4的子块进行编码。其中,所述4x4以上的子块包括4x4、4x8、8x4、8x8,16x8和8x16的子块。
上述优化后的编码方法可以对4x4以上的完整子块不做编码,从而进一步提高了视频帧的编码效率。
此外,关于与编码相对应的解码,可以按照H.264、MPEG-4等解码标准进行。
基于上述内容,本发明还提供了相应的编码器实施例。
参照图5,是本发明实施例所述一种视频编码器的结构图。
所述编码器可以包括填充单元51和编码单元52,其中,所述填充单元51用于将宽或高为非16整数倍的原始视频帧大小扩充为16的整数倍,并将原始视频帧中与扩充区域相邻的相同大小的连续行或列值拷贝并填充到相应的扩充区域;所述编码单元52用于对填充后的视频帧进行编码。
具体的,所述填充单元51可以包括:
列填充子单元511,用于针对原始视频帧的左侧或右侧扩充区域,从原始视频帧的左侧或右侧边缘开始将与扩充区域相同大小的连续列值拷贝并填充到左侧或右侧扩充区域;
以及,行填充子单元512,用于针对原始视频帧的上方或下方扩充区域,从原始视频帧的上方或下方边缘开始将与扩充区域相同大小的连续行值拷贝并填充到上方或下方扩充区域。
所述编码器在对宽或高为非16整数倍的原始视频帧进行扩充的过程中,通过将原始视频帧中与扩充区域大小相同的内容拷贝到扩去区域进行填充,增加了填充内容与原始视频帧内容之间的相关性,因此提高了编码效率。
优选的,所述编码单元52可以包括:
帧内预测编码子单元521,用于当进行帧内预测编码时,对于扩充区域中划分出的完整子块,直接将拷贝内容的编码结果作为所述子块的编码结果;对于扩充区域中不能划分成完整子块的残缺子块,则与原始视频帧的边界像素联合形成完整子块进行编码;
帧间预测编码子单元522,用于当进行帧间预测编码时,对于扩充区域中划分出的完整子块,直接将拷贝内容的编码结果作为所述子块的编码结果;对于扩充区域中不能划分成完整子块的残缺子块,则与原始视频帧的边界像素联合形成完整子块进行编码。
所述编码单元52可以对扩充区域形成的4x4以上的子块不做编码而直接沿用拷贝内容的编码结果,进一步提高了编码结果。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于解码器实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上对本发明所提供的一种帧宽高为非16整数倍的视频编码方法及编码器,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。