选择参考场及获取时域运动矢量的方法
技术领域
本发明涉及一种在跳过或直接模式中选择参考场及时域运动矢量预测的方法。
背景技术
AVS1-P2是我国2006年2月批准的先进视音频编解码标准中的视频部分。在视频编码中,隔行扫描信号的编码通常要采用和逐行扫描不同的编码模式以提高编码效率。这些隔行编码模式通常分为基于宏块的隔行编码模式和基于场的隔行编码模式。AVS1-P2提供了基于场的隔行编码模式。
在视频编码中,B帧通过使用前后参考帧,能够获得比P帧更高的编码效率。特别是B帧中的直接和跳过模式能够提供非常高的压缩比率,但其能否发挥作用直接取决于运动矢量预测的准确性。一般运动矢量的预测分为空域预测和时域预测两种。空域预测使用的是同一帧或场的相邻运动矢量来预测当前块的运动矢量,时域预测是指通过时间轴上后续参考帧相同位置宏块的运动矢量进行预测。
在AVS1-P2编解码标准中,P帧的跳过模式使用了空域预测,而B帧的直接和跳过模式使用了时域预测。但是,AVS1-P2中的B帧直接和跳过模式运动矢量预测方法在进行场编码时,底场的运动矢量预测只使用了后参考帧的底场。而后参考帧底场的预测在经过率失真优化后绝大部分宏块会选择使用同一帧的顶场作为参考,因此其运动矢量在时域跨度上只有一场。这样便造成了使用短运动矢量来预测长运动矢量,意味着参考运动矢量的误差会被放大,当帧编码模式在I/P帧间使用两个B帧时,误差放大便达到4倍,造成了压缩效率的明显下降。而且这种运动矢量噪声在直接模式下没有残差补偿,码率较低时会产生明显可见的抖动,使主观质量评价大幅下降。
发明内容
有鉴于此,有必要针对AVS视频编码器B帧底场编码在直接和跳过模式中运动矢量预测误差较大的问题,提供一种选择参考场及获取时域运动矢量的方法。
一种选择参考场及获取时域运动矢量的方法,具体包括:
如果当前宏块类型为B_Skip或B_Direct_16*16,或当前子块类型为SB_Direct_8*8,对每个8*8块分别进行如下操作:
第一步:
(1)、如果后向参考图像中与当前8*8块的左上角样本位置对应的样本所在的编码宏块类型为I_8*8,则当前块的前后向参考图像均为缺省参考图像;
(2)、否则,如果当前块所在图像的图像结构等于1,当前块的前后向参考图像均为缺省参考图像,其前后向距离索引分别为DistanceIndexFw和DistanceIndexBw,当前块的前后向块距离分别为BlockDistanceFw和BlockDistanceBw;在后向参考图像中与当前块的左上角样本位置对应的样本所在的编码块的运动矢量mvRef为(mvRef_x,mvRef_y),该编码块的距离索引为DistanceIndexCol,该运动矢量指向的参考块的距离索引为DistanceIndexRef;
(3)、否则,如果当前块所在图像的图像结构等于0,当前块的前向参考索引为0和1的参考场中的参考块的距离索引分别为DistanceIndexFw0和DistanceIndexFw1;如果DistanceIndexRef等于DistanceIndexFw0,则当前块的前向参考索引为0,DistanceIndexFw等于DistanceIndexFw0;否则当前块的前向参考索引为1,DistanceIndexFw等于DistanceIndexFw1;当前块的后向参考索引为0和1的参考场中的参考块的距离索引分别为DistanceIndexBw0和DistanceIndexBw1;如果当前块的MbIndex<MbWidth*MbHeight/2,其中MbIndex为宏块索引,MbWidth为图像以宏块表达的宽度,MbHeight为图像以宏块表达的高度,则当前块的后向参考场是参考索引标记为0的场,DistanceIndexBw等于DistanceIndexBw0;
(4)、判断当前块后向参考索引标记为1的场的对应参考块的参考索引是否为0,如果为0,则当前块的后向参考场是参考索引标记为0的场,参考块相对应的宏块位置由MbIndex-(MbWidth*MbHeight/2)得出,DistanceIndexBw等于DistanceIndexBw0;否则,当前块的后向参考场是参考索引标记为1的场,DistanceIndexBw等于DistanceIndexBw1;
(5)、对场垂直矢量偏移补偿delta1和delta2定义如下:
如果当前块所在的场为顶场,并且mvRef指向的场为底场,则delta1=2;
如果当前块所在的场为底场,并且mvRef指向的场为顶场,则delta1=-2;
如果当前块所在的场为顶场,并且mvFw/mvBw指向的场为底场,则delta2=2;
如果当前块所在的场为底场,并且mvFw/mvBw指向的场为顶场,则delta2=-2;
其中mvFw为当前块的前向运动矢量,mvBw为当前块的后向运动矢量;
第二步:
(1)、
BlockDistanceRef=(DistanceIndexCol-DistanceIndexRef+512)%512;
BlockDistanceFw=(DistanceIndexCur-DistanceIndexFw+512)%512;
BlockDistanceBw=(DistanceIndexBw-DistanceIndexCur+512)%512;
其中,DistanceIndexCol为后向参考帧中与当前块同位的块的距离索引,DistanceIndexRef为后向参考帧中同位块的运动矢量指向的块的距离索引,DistanceIndexCur为当前块的距离索引,DistanceIndexFw为当前块的前向参考块的距离索引,DistanceIndexBw为当前块的后向参考块的距离索引,BlockDistanceRef为后向参考块与其自身参考块的块距离,BlockDistanceFw为当前块与其前向参考块的块距离,BlockDistanceBw为当前块与其后向参考块的块距离;
(2)、如果当前块所在图像的图像结构等于1,并且后向参考图像的图像结构等于0,则mvRef_y=mvRef_y*2;
(3)、如果当前块所在图像的图像结构等于0,并且后向参考图像的图像结构等于1,则mvRef_y=mvRef_y/2;
第三步:
(1)、当前块的前向运动矢量mvFw为(mvFw_x,mvFw_y);
如果mvRef_x小于0,则
mvFw_x=-(((16384/BlockDistanceRef)*(1-mvRef_x*BlockDistanceFw)-1)>>14);否则
mvFw_x=((16384/BlockDistanceRef)*(1+mvRef_x*BlockDistanceFw)-1)>>14;
如果(mvRef_y+delta1)小于0,则
mvFw_y=-(((16384/BlockDistanceRef)*(1-(mvRef_y+delta1)*BlockDistanceFw)-1)>>14)-delta2;否则
mvFw_y=(((16384/BlockDistanceRef)*(1+(mvRef_y+delta1)*BlockDistanceFw)-1)>>14)-delta2;
(2)、当前块的后向运动矢量mvBw为(mvBw_x,mvBw_y);
如果mvRef_x小于0,则
mvBw_x=((16384/BlockDistanceRef)*(1-mvRef_x*BlockDistanceBw)-1)>>14;否则
mvBw_x=-(((16384/BlockDistanceRef)*(1+mvRef_x*BlockDistanceBw)-1)>>14);
如果(mvRef_y+delta1)小于0,则
mvBw_y=(((16384/BlockDistanceRef)*(1-(mvRef_y+delta1)*BlockDistanceBw)-1)>>14)-delta2;
否则
mvBw_y=-(((16384/BlockDistanceRef)*(1+(mvRef_y+delta1)*BlockDistanceBw)-1)>>14-delta2。
对于典型的隔行视频序列,当直接和跳过模式较适用时,本发明能从总体提高编码效率10%到20%,效果非常显著。现有技术的基准算法在低码率会造成低场视频的严重跳动失真,而本发明能消除这种跳动,大幅提高原有AVS基准档次场编码码流的主观评价得分。
附图说明
图1是参考索引标记方法的示意图。
图2是亮度块E和相邻块的空间关系示意图。
图3和图4是本发明与AVS基准算法进行效果对比的率失真图。
具体实施方式
本发明的目的是提供一种能有效避免AVS视频编码器B帧底场编码在直接和跳过模式中运动矢量预测误差较大的方法。在保持客观质量不变的情况下,能够有效降低编码比特率,并能明显提高主观质量。
为了达到上述目的,本发明提供了一种获取时域运动矢量的方法。
具体实现步骤如下:
如果当前宏块类型为B_Skip或B_Direct_16*16,或当前子块类型为SB_Direct_8*8,对每个8*8块分别进行如下操作:
第一步:
(1)、如果后向参考图像中与当前8*8块的左上角样本位置对应的样本所在的编码宏块类型为“I_8*8”,则当前块的前后向参考图像均为缺省参考图像,即图1中标记为0的图像(引用自GB/T20090.2-2006),当前块的前后向运动矢量是直接根据原国家标准GB/T20090.2-2006中章节9.4.4得到的当前块所在宏块(图2中块E为当前块所在宏块)的前后向运动矢量预测值。
(2)、否则,如果当前块所在图像的PictureStructure(图像结构,值为0时是场编码模式,即当前图像的两场编码数据依次出现,值为1是帧编码模式,表示当前图像的两场编码数据交融出现)等于1(帧编码模式),当前块的前后向参考图像均为缺省参考图像,即图1(e)中标记为0的图像,其前后向DistanceIndex(距离索引)分别为DistanceIndexFw(前向距离索引)和DistanceIndexBw(后向距离索引);当前块的前后向BlockDistance(块距离)分别为BlockDistanceFw(前向块距离)和BlockDistanceBw(后向块距离);在后向参考图像中与当前块的左上角样本位置对应的样本所在的编码块的运动矢量为mvRef(mvRef_x,mvRef_y),该编码块的距离索引为DistanceIndexCol,该运动矢量指向的参考块的距离索引为DistanceIndexRef。
(3)、否则,如果当前块所在图像的PictureStructure(图像结构)等于0(场编码模式),在后向参考图像中与当前块的左上角样本位置对应的样本所在的编码块的运动矢量为mvRef(mvRef_x,mvRef_y),该编码块的距离索引为DistanceIndexCol,该运动矢量指向的参考块的距离索引为DistanceIndexRef;当前块的前向参考索引为0和1的参考场中的参考块的距离索引分别为DistanceIndexFw0和DistanceIndexFw1。如果DistanceIndexRef等于DistanceIndexFw0,则当前块的前向参考索引为0,DistanceIndexFw等于DistanceIndexFw0;否则当前块的前向参考索引为1,DistanceIndexFw等于DistanceIndexFw1;当前块的后向参考索引为0和1的参考场中的参考块的距离索引分别为DistanceIndexBw0和DistanceIndexBw1。如果当前块的MbIndex<MbWidth*MbHeight/2(MbIndex为宏块索引,MbWidth为图像以宏块表达的宽度,MbHeight为图像以宏块表达的高度),则当前块的后向参考场是参考索引标记为0的场,DistanceIndexBw等于DistanceIndexBw0;如果MbIndex>=MbWidth*MbHeight/2,判断当前块后向参考索引标记为1的场的对应参考块的参考索引是否为0,如果为0,则当前块的后向参考场是参考索引标记为0的场,参考块相对应的宏块位置由MbIndex-(MbWidth*MbHeight/2)得出,DistanceIndexBw等于DistanceIndexBw0;否则,当前块的后向参考场是参考索引标记为1的场,DistanceIndexBw等于DistanceIndexBw1。
(4)、为配合本发明可使用不同空间位置场作为参考场的特点,在运动矢量预测中统一使用场垂直矢量偏移补偿(delta1和delta2),并定义delta1和delta2如下:
如果当前块所在的场为顶场,并且mvRef指向的场为底场,则delta1=2;
如果当前块所在的场为底场,并且mvRef指向的场为顶场,则delta1=-2;
如果当前块所在的场为顶场,并且mvFw/mvBw指向的场为底场,则delta2=2;
如果当前块所在的场为底场,并且mvFw/mvBw指向的场为顶场,则delta2=-2。
其中mvFw为当前块的前向运动矢量,mvBw为当前块的后向运动矢量。
第二步:
(1)、BlockDistanceRef=(DistanceIndexCol-DistanceIndexRef+512)%512设当前块的距离索引为DistanceIndexCur,则
BlockDistanceFw=(DistanceIndexCur-DistanceIndexFw+512)%512;
BlockDistanceBw=(DistanceIndexBw-DistanceIndexCur+512)%512;
其中%符号代表模运算,也即求余运算。
(2)、如果当前块所在图像的PictureStructure等于1(帧图像),并且后向参考图像的PictureStructure等于0(场图像),则mvRef_y=mvRef_y*2;
(3)、如果当前块所在图像的PictureStructure等于0(场图像),并且后向参考图像的PictureStructure等于1(帧图像),则mvRef_y=mvRef_y/2。
第三步:
(1)、当前块的前向运动矢量mvFw(mvFw_x,mvFw_y)为:
如果mvRef_x小于0,则
mvFw_x=-(((16384/BlockDistanceRef)*(1-mvRef_x*BlockDistanceFw)-1)>>14);否则
mvFw_x=((16384/BlockDistanceRef)*(1+mvRef_x*BlockDistanceFw)-1)>>14。
如果(mvRef_y+delta1)小于0,则
mvFw_y=-(((16384/BlockDistanceRef)*(1-(mvRef_y+delta1)*BlockDistanceFw)-1)>>14)-delta2;否则
mvFw_y=(((16384/BlockDistanceRef)*(1+(mvRef_y+delta1)*BlockDistanceFw)-1)>>14)-delta2。
(2)、当前块的后向运动矢量mvBw(mvBw_x,mvBw_y)为:
如果mvRef_x小于0,则
mvBw_x=((16384/BlockDistanceRef)*(1-mvRef_x*BlockDistanceBw)-1)>>14;
否则
mvBw_x=-(((16384/BlockDistanceRef)*(1+mvRef_x*BlockDistanceBw)-1)>>14);
如果(mvRef_y+delta1)小于0,则
mvBw_y=(((16384/BlockDistanceRef)*(1-(mvRef_y+delta1)*BlockDistanceBw)-1)>>14)-delta2;
否则
mvBw_y=-(((16384/BlockDistanceRef)*(1+(mvRef_y+delta1)*BlockDistanceBw)-1)>>14-delta2。
采用率失真图表对本发明与AVS基准算法的效果进行了对比,如图3和图4所示,其中X轴为码率(kbps),Y轴为PSNR(dB),由率失真图表可见,对于典型的隔行视频序列,当直接和跳过模式较适用时,本发明能从总体提高编码效率10%到20%,效果非常显著。
本发明更为重要但又无法从率失真图表体现出来的优势是人眼的主观感觉,原基准算法在低码率会造成低场视频的严重跳动失真,而本发明能消除这种跳动,大幅提高原有AVS基准档次场编码码流的主观评价得分。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。