发明内容
本发明提供一种帧间模式选择方法,利用整像素运动估计的结果,预判断尺寸小于8×8的划分,从而减少所需分数像素运动估计的运算时间,同时编码的图像质量亦与原来的相近。
本发明的帧间模式选择方法包括下列步骤(a)~(i)。(a)划分宏块以获得尺寸16×16、16×8及8×16的宏块分割单元以及尺寸8×8的子宏块单元。(b)对每一个8×8子宏块单元进行划分以获得8×4、4×8及4×4的第一子宏块分割单元与8×8的第二子宏块分割单元。(c)对于上述每一个16×16、16×8及8×16宏块分割单元以及每一个8×4、4×8及4×4第一子宏块分割单元和每一个8×8第二子宏块分割单元,分别执行整像素运动估计。(d)基于上述整像素运动估计的结果,获得每一个8×8子宏块单元内的最佳第一子宏块分割单元。(e)对于每一个8×8子宏块单元的最佳第一子宏块分割单元执行分数像素运动估计,获得每一个每一个子宏块单元的第一代价。(f)基于上述整像素运动估计的结果,分别对于每一个8×8子宏块单元划分而得的8×8第二子宏块分割单元执行上述分数像素运动估计,以获得每一个8×8子宏块单元的第二代价。(g)基于每一个8×8子宏块单元的第一代价与第二代价,而获得以8×8子宏块单元来划分16×16宏块的最佳代价。(h)对每一个16×16、16×8及8×16宏块分割单元执行上述分数像素运动估计,获得上述尺寸16×16、16×8及8×16分别对应的多个第三代价。(i)自上述最佳代价与上述多个第三代价中选择最小值。
在本发明的一实施例中,上述步骤(d)还包括:基于上述整像素运动估计的结果,分别计算上述第一子宏块分割单元为上述尺寸4×8、8×4及4×4的多个整像素代价和SUM_IME(4×8)、SUM_IME(8×4)及SUM_IME(4×4);以及选择上述整像素代价和SUM_IME(4×8)、SUM_IME(8×4)及SUM_IME(4×4)中的最小值,以上述最小值对应的尺寸作为第一最佳尺寸,并以上述第一最佳尺寸对应的上述第一子宏块分割单元作为上述最佳第一子宏块分割单元。在此,以ImeCost_0(4×8)、ImeCost_1(4×8)表示在尺寸为4×8的两个第一子宏块分割单元的整像素代价,以ImeCost_0(8×4)、ImeCost_1(8×4)表示尺寸为8×4的两个第一子宏块分割单元的整像素代价,以ImeCost_0(4×4)~ImeCost_3(4×4)表示尺寸为4×4的四个第一子宏块分割单元的整像素代价,则SUM_IME(4×8)、SUM_IME(8×4)及SUM_IME(4×4)如下所示:
SUM_IME(4×8)=ImeCost_0(4×8)+ImeCost_1(4×8);
SUM_IME(8×4)=ImeCost_0(8×4)+ImeCost_1(8×4);以及
SUM_IME(4×4)=ImeCost_0(4×4)+ImeCost_1(4×4)+ImeCost_2(4×4)+ImeCost_3(4×4)。
在本发明的一实施例中,基于上述整像素运动估计的结果,分别计算上述第一子宏块分割单元的上述多个整像素代价和的步骤还包括:当上述帧间模式选择方法用于B帧,分别获得每一个第一子宏块分割单元在List0方向及List1方向的上述整像素代价和;以及当上述帧间模式选择方法用于P帧,获得每一个第一子宏块分割单元在List0方向的整像素代价和。
在本发明的一实施例中,上述步骤(e)包括:针对以第一最佳尺寸划分8×8子宏块单元而获得的最佳第一子宏块分割单元,执行分数像素运动估计,而获得多个分数像素代价;以及将上述多个分数像素代价相加,以获得第一代价。
在本发明的一实施例中,在上述步骤(f)中,当上述帧间模式选择方法用于B帧,对每一个8×8第二子宏块分割单元执行分数像素运动估计,获得每一个8×8第二子宏块分割单元在List0方向、List1方向以及双向三者的预测代价;以及自上述三个预测代价中选择最小值作为第二代价。另外,在上述步骤(f)中,当帧间模式选择方法用于P帧,对于每一个8×8第二子宏块分割单元执行分数像素运动估计,获得每一个8×8第二子宏块分割单元在List0方向的代价作为第二代价。
在本发明的一实施例中,上述步骤(g)包括:分别在四个8×8子宏块单元中,选择第一代价与第二代价中的最小值,藉此获得四个最小代价BestCost_0(8×8)、BestCost_1(8×8)、BestCost_2(8×8)以及BestCost_3(8×8),并将上述四个最小代价加总而获得最佳代价SumCost(8×8),即
SumCost(8×8)=BestCost_0(8×8)+BestCost_1(8×8)+BestCost_2(8×8)+BestCost_3(8×8)。
在本发明的一实施例中,上述步骤(h)包括:(h-1)基于对宏块分割单元执行分数像素运动估计的结果,分别获得每一个宏块分割单元的尺寸为16×16、16×8及8×16的最佳预测代价;以及(h-2)基于上述最佳预测代价,分别获得尺寸为16×16、16×8及8×16的宏块分割单元的第三代价3rd_cost(16×16)、3rd_cost(16×8)及3rd_cost(8×16)。在此,以block_cost(16×16)表示尺寸为16×16的一个宏块分割单元的最佳预测代价,以block_cost_0(16×8)及block_cost_1(16×8)表示尺寸为16×8的两个宏块分割单元的最佳预测代价,以block_cost_0(8×16)及block_cost_1(8×16)表示尺寸为8×16的两个宏块分割单元的最佳预测代价,则3rd_cost(16×16)、3rd_cost(16×8)及3rd_cost(8×16)如下所示:
3rd_cost(16×16)=block_cost(16×16);
3rd_cost(16×8)=block_cost_0(16×8)+block_cost_1(16×8);
3rd_cost(8×16)=block_cost_0(8×16)+block_cost_1(8×16)。
在本发明的一实施例中,在上述步骤(h-1)中,当帧间模式选择方法用于B帧,分别对尺寸为16×16、16×8及8×16的宏块分割单元执行分数像素运动估计,而分别获得每一个宏块分割单元在List0方向、List1方向以及双向三者的预测代价;以及自上述三个预测代价选择最小值作为每一个宏块分割单元的最佳预测代价。另外,在上述步骤(h-1)中,当帧间模式选择方法用于P帧,分别对尺寸为16×16、16×8及8×16的宏块分割单元执行分数像素运动估计,而获得每一个宏块分割单元在List0方向的代价作为每一个宏块分割单元的最佳预测代价。
在本发明的一实施例中,上述步骤(c)还包括:计算运动矢量预测值,以基于上述运动矢量预测值来执行上述整像素运动估计。
基于上述,在上述帧间编码中对所有尺寸的子块皆进行搜索,使得编码后的图像质量能够与原始质量的相近。并且,利用整像素运动估计的结果,预判断尺寸小于8×8的划分,进而减少在尺寸小于8×8所需分数像素运动估计的运算时间。
为让本发明的上述特征和优点能更明显易懂,下文特举实施例,并配合所附图式作详细说明如下。
具体实施方式
图1是依照本发明一实施例的帧间模式选择方法的流程图。在此,本实施例的帧间模式选择方法可藉由具有运算能力的电子装置来执行。例如,电子装置中具有一编码器,由此编码器来执行下述步骤。
在步骤S105中,划分宏块以获得多个宏块分割单元以及多个子宏块单元。并且,在步骤S110中,对各子宏块单元进行划分以获得多个第一子宏块分割单元与多个第二子宏块分割单元。在H.264编码标准中,一个宏块(macro block)能被划分成一个16×16、或两个16×8、或两个8×16、或者四个8×8的子块(sub block)。而每一个8×8的子块又可以进一步划分为一个8×8、或两个8×4、或两个4×8、或四个4×4的子块。在此,对于由宏块所划分出的子块中,将尺寸为16×16、16×8及8×16的子块称为宏块分割单元,将尺寸为8×8的子块称为子宏块单元。并且,对于进一步由子宏块单元所划分出的子块中,将尺寸为8×4、4×8及4×4的子块称为第一子宏块分割单元,将尺寸8×8的子块称为第二子宏块分割单元。
底下搭配图式来进行说明。图2是依照本发明一实施例的宏块划分的示意图。请参照图2,每一个16×16宏块,可选择以尺寸16×16、16×8及8×16进行划分而获得宏块分割单元S1~S5,以尺寸8×8进行划分而获得子宏块单元SU1~SU4。而每一个子宏块单元SU1~SU4还可以进一步以尺寸8×4、4×8及4×4进行划分而获得第一子宏块分割单元MU1~MU8,或者以尺寸8×8进行划分而获得第二子宏块分割单元MU0。
接着,在步骤S115中,对于宏块分割单元S1~S5以及每一个子宏块单元SU1~SU4的第一子宏块分割单元MU1~MU8和第二子宏块分割单元MU0,分别执行整像素运动估计(integer pixel motion estimation,IME)。具体而言,可先计算16×16宏块的运动矢量预测值(motion vector prediction,MVP),之后再基于上述运动矢量预测值来对41个子块(包括1个16×16、2个16×8与2个8×16的宏块分割单元;4个8×8的第二子宏块分割单元;以及8个8×4、8个4×8与16个4×4的第一子宏块分割单元)执行整像素运动估计。另外,当帧间模式选择方法用于B帧,则会获得82个最佳的整像素估计值和对应的代价(cost)。而当帧间模式选择方法用于P帧,则会获得41个最佳的整像素估计值和对应的代价。
在此,帧间模式的编码包括整像素运动估计(IME)和分数像素运动估计(fractional pixel motion estimation,FME)以及模式的选择(mode decision)。整像素运动估计通过比较每个搜索位置的代价,而搜索出每个子块的最佳匹配位置。而代价可以是依据绝对误差和(sum of absolute difference,SAD)与运动矢量码率失真成本(motionvector rate-distortion cost,MVCOST)而获得。例如,cost=SAD+MVCOST,然,上述仅为举例说明,并不以此为限。而分数像素运动估计在整像素搜索的基础上,可搜索周边的9个分数像素点,选择代价最小的点作为最佳的匹配位置。
在获得各个子块的整像素运动估计的结果之后,基于整像素运动估计的结果,在步骤S120~S135中判断尺寸8×8以下的划分,并且在步骤S140中判断尺寸16×16、16×8、8×16的划分。即,在步骤S120与步骤S125中求出小于8×8(不包括8×8)划分对应的代价,在步骤S130中求出8×8划分对应的代价,并且在步骤S140中求出大于8×8划分对应的代价。然而,在此并不限制步骤S120、步骤S130及步骤S140三者的执行顺序。
在步骤S120中,基于整像素运动估计的结果,获得各子宏块单元SU1~SU4内的最佳第一子宏块分割单元。接着,在步骤S125中,对于各子宏块单元SU1~SU4的最佳第一子宏块分割单元执行分数像素运动估计,获得各子宏块单元SU1~SU4的第一代价。也就是说,先基于整像素运动估计的结果来预判断小于8×8(8×4、4×8及4×4)的划分,而获得子宏块单元SU1~SU4各自的最佳第一子宏块分割单元BestSub_SU1、BestSub_SU2、BestSub_SU3、BestSub_SU4。之后,再针对各最佳第一子宏块分割单元执行分数像素运动估计,藉此来计算第一代价SU1_1stCost、SU2_1stCost、SU3_1stCost及SU4_1stCost。
而在步骤S130中,基于整像素运动估计的结果,分别对于各子宏块单元SU1~SU4内的第二子宏块分割单元MU0执行分数像素运动估计,以获得各子宏块单元SU1~SU4的第二代价SU1_2ndCost、SU2_2ndCost、SU3_2ndCost及SU4_2ndCost。
在步骤S135中,基于各子宏块单元的第一代价与第二代价,而获得以子宏块单元来划分宏块的最佳代价,例如以SumCost(8×8)代表最佳代价。
详细地说,图3是依照本发明一实施例的计算8×8子宏块单元的最佳代价的流程图。请参照图3,步骤S31~S34分别代表判断子宏块单元SU1~SU4各自最佳代价的步骤。其中,步骤S31包括步骤S311~S314,步骤S32包括步骤S321~S324,步骤33包括步骤S331~S334,步骤S34包括步骤S341~S344。
以步骤S31而言,在步骤S311中,基于整像素运动估计的结果而获得子宏块单元SU1的最佳第一子宏块分割单元BestSub_SU1。具体而言,针对子宏块单元SU1,分别计算尺寸4×8、8×4及4×4的整像素代价和SUM_IME(4×8)、SUM_IME(8×4)及SUM_IME(4×4)。自整像素代价和SUM_IME(4×8)、SUM_IME(8×4)及SUM_IME(4×4)中选择最小值,以上述最小值对应的尺寸作为第一最佳尺寸,并以上述第一最佳尺寸对应的第一子宏块分割单元作为最佳第一子宏块分割单元。整像素代价和的运算如底下式1-1所示:
(式1-1)
SUM_IME(4×8)=ImeCost_0(4×8)+ImeCost_1(4×8);
SUM_IME(8×4)=ImeCost_0(8×4)+ImeCost_1(8×4);
SUM_IME(4×4)=ImeCost_0(4×4)+ImeCost_1(4×4)+ImeCost_2(4×4)+ImeCost_3(4×4)。
上述ImeCost_0(4×8)、ImeCost_1(4×8)表示在尺寸为4×8的两个第一子宏块分割单元(MU3、MU4)的整像素代价,上述ImeCost_0(8×4)、ImeCost_1(8×4)表示尺寸为8×4的两个第一子宏块分割单元(MU1、MU2)的整像素代价,上述ImeCost_0(4×4)~ImeCost_3(4×4)表示尺寸为4×4的四个第一子宏块分割单元(MU5~MU8)的整像素代价。
上述式1-1适用于当帧间模式选择方法用于P帧的情况下,即,在P帧中,获得各第一子宏块分割单元在List0方向的整像素代价和SUM_IME(4×8)、SUM_IME(8×4)及SUM_IME(4×4),之后,选择其中的最小值对应的尺寸作为第一最佳尺寸。例如,假设SUM_IME(4×4)为最小值,则以尺寸4×4作为第一最佳尺寸。
接着,在步骤S312中,基于分数像素运动估计,获得子宏块分割单元SU1的第一代价SU1_1stCost。详细地说,针对以第一最佳尺寸划分子宏块单元SU1所获得的多个第一子宏块分割单元执行分数像素运动估计,而获得多个分数像素代价。并且,将上述多个分数像素代价相加,以获得第一代价SU1_1stCost。例如,假设第一最佳尺寸为4×4,则对第一子宏块分割单元MU5~MU8执行分数像素运动估计,而获得四个分数像素代价。之后,将这四个分数像素代价相加而获得第一代价SU1_1stCost。
另外,在步骤S313中,基于整像素运动估计的结果,对于第二子宏块分割单元MU0执行分数像素运动估计,获得第二子宏块分割单元MU0在List0方向的代价,以此代价作为子宏块单元SU1的第二代价SU1_2ndCost。
之后,在步骤S314中,自第一代价SU1_1stCost与第二代价SU1_2ndCost取出最小值作为子宏块单元SU1的最小代价BestCost_0(8×8)。
以上所述是在帧间模式选择方法用于P帧的情况下所执行。另外,倘若帧间模式选择方法用于B帧,则会针对List0方向及List1方向来进行计算。详细地说,在步骤S311中,会分别获得各第一子宏块分割单元在List0方向及List1方向的上述整像素代价和,如底下式1-2所示:
(式1-2)
SUM_IME(4×8)L0=ImeCost_0(4×8)L0+ImeCost_1(4×8)L0;
SUM_IME(4×8)L1=ImeCost_0(4×8)L1+ImeCost_1(4×8)L1;
SUM_IME(8×4)L0=ImeCost_0(8×4)L0+ImeCost_1(8×4)L0;
SUM_IME(8×4)L1=ImeCost_0(8×4)L1+ImeCost_1(8×4)L1;
SUM_IME(4×4)L0=ImeCost_0(4×4)L0+ImeCost_1(4×4)L0+ImeCost_2(4×4)L0+ImeCost_3(4×4)L0;
SUM_IME(4×4)L1=ImeCost_0(4×4)L1+ImeCost_1(4×4)L1+ImeCost_2(4×4)L1+ImeCost_3(4×4)L1。
上述式1-2中,标示有L0的值表示是在list0方向所获得,而标示有L1的值则表示在list1方向所获得。在获得整像素代价和之后,于上述六个值中选择最小值。例如,假设SUM_IME(8×4)L0为最小值,则以尺寸8×4且为list0方向的第一子宏块分割单元来作为最佳第一子宏块分割单元BestSub_SU1。接着,在步骤S312中,基于分数像素运动估计,获得子宏块分割单元SU1的第一代价SU1_1stCost。
而当帧间模式选择方法用于B帧,在步骤S313中,对第二子宏块分割单元MU0执行分数像素运动估计,获得第二子宏块分割单元MU0在List0方向、List1方向以及双向三者的预测代价,并且自三个预测代价中选择最小值作为子宏块单元SU1的第二代价SU1_2ndCost。同样地,在B帧的情况下,在步骤S314中,自第一代价SU1_1stCost与第二代价SU1_2ndCost取出最小值作为子宏块单元SU1的最小代价BestCost_0(8×8)。
以此类推,步骤S32、S33及S34的详细流程皆与步骤S31相似,关于步骤S321~S324、步骤S331~S334、步骤S341~S344的相关流程可参照上述步骤S311~S314。在步骤S321、S331、S341中分别获得子宏块单元SU2、SU3、SU4的最佳第一子宏块分割单元BestSub_SU2、BestSub_SU3、BestSub_SU4。并且,在步骤S322、S332、S342中分别获得子宏块单元SU2、SU3、SU4的第一代价SU2_1stCost、SU3_1stCost、SU4_1stCost。在步骤S323、S333、S343中分别获得子宏块单元SU2、SU3、SU4的第二代价SU2_2ndCost、SU3_2ndCost、SU4_2ndCost。据此,在步骤S324、S334、S344中,分别获得子宏块单元SU2的最小代价BestCost_1(8×8)、子宏块单元SU3的最小代价BestCost_2(8×8)、子宏块单元SU4的最小代价BestCost_3(8×8)。
然后,在步骤S35中,将上述四个最小代价加总,获得最佳代价SumCost(8×8),如底下式2所示:
(式2)
SumCost(8×8)=BestCost_0(8×8)+BestCost_1(8×8)+BestCost_2(8×8)+BestCost_3(8×8)。
返回图1,在步骤S140中,基于整像素运动估计,对各宏块分割单元执行分数像素运动估计,获得尺寸16×16、16×8及8×16分别对应的第三代价。例如,分别以3rd_cost(16×16)、3rd_cost(16×8)及3rd_cost(8×16)来表示尺寸为16×16、16×8及8×16的宏块分割单元的第三代价。
详细地说,图4是依照本发明一实施例的计算宏块分割单元的第三代价的流程图。请参照图4,在步骤S401中,基于整像素运动估计的结果,对每个宏块分割单元S1~S5执行分数像素运动估计。
接着,在步骤S411、S421、S431中,基于分数像素运动估计的结果,分别获得宏块分割单元S1、S2与S3、S4与S5的最佳预测代价。并且,在步骤S412、S422、S432中,通过加和运算,分别获得尺寸为16×16、16×8及8×16对应的第三代价3rd_cost(16×16)、3rd_cost(16×8)及3rd_cost(8×16),如底下式3所示:
(式3)
3rd_cost(16×16)=block_cost(16×16);
3rd_cost(16×8)=block_cost_0(16×8)+block_cost_1(16×8);
3rd_cost(8×16)=block_cost_0(8×16)+block_cost_1(8×16)。
上述block_cost(16×16)表示尺寸为16×16的一个宏块分割单元的最佳预测代价,block_cost_0(16×8)及block_cost_1(16×8)表示尺寸为16×8的宏块分割单元S2、S3的最佳预测代价,上述block_cost_0(8×16)及上述block_cost_1(8×16)表示尺寸为8×16的宏块分割单元S4、S5的最佳预测代价。
当帧间模式选择方法用于B帧,则对宏块分割单元S1~S5执行分数像素运动估计,而分别获得宏块分割单元S1~S5各自在List0方向、List1方向以及双向三者的预测代价,并且自上述三个预测代价选择最小值作为各宏块分割单元的最佳预测代价。当帧间模式选择方法用于P帧,分别对宏块分割单元S1~S5执行分数像素运动估计,而获得宏块分割单元S1~S5在List0方向的代价,并且以此代价作为每一上述宏块分割单元的最佳预测代价。
返回图1,在获得划分尺寸为16×16、16×8及8×16对应的第三代价3rd_cost(16×16)、3rd_cost(16×8)及3rd_cost(8×16),以及划分尺寸为8×8对应的最佳代价SumCost(8×8)之后,在步骤S145中,自最佳代价SumCost(8×8)与第三代价3rd_cost(16×16)、3rd_cost(16×8)及3rd_cost(8×16)中选择最小值,而以此最小值来作为最佳帧间模式。
综上所述,上述实施例中可对所有尺寸的子块皆进行搜索,使得编码后的图像质量能够与原始质量的相近。并且,利用整像素运动估计的结果,预判断尺寸小于8×8的划分,进而减少在尺寸小于8×8所需分数像素运动估计的运算时间。不论是在P帧或是B帧的模式下,皆可对8×8以下的子块进行编码,可支持所有尺寸子块的编码。藉此,每个宏块大概可在600个时钟周期(cycles)内完成,可实现1080p实时编码的要求,并且在画质及码率方面皆有明显的改善。并且,上述帧间模式选择方法采用分数像素运动估计的结果做模式选择,并且所有尺寸的子块皆采用绝对误差和(SAD)与运动矢量码率失真成本(MVCOST)来执行整像素运动估计及分数像素运动估计。
虽然本发明已以实施例揭露如上,然其并非用以限定本发明,任何本领域技术人员,在不脱离本发明的精神和范围内,当可作些许的更动与润饰,故本发明的保护范围当视后附的权利要求所界定者为准。