织梦CMS - 轻松建站从此开始!

罗索

MVC学习的第五周小结(2009.6.8-2009.6.14)-运动估计3

jackyhwei 发布于 2010-01-28 19:56 点击:次 
从JMVC的MbEncoder::encodeMacroblock函数往下运行,对于P帧或B帧,需要在16x16到4x4的7种宏块分块模式中按EDCost进行选择(在MVC学习的第三周小结(2009.5.25-2009.5.31)-运动估计1中已经提及相关内容)。
TAG:

1. 参考帧的选择

从JMVC的MbEncoder::encodeMacroblock函数往下运行,对于P帧或B帧,需要在16x16到4x4的7种宏块分块模式中按EDCost进行选择(在MVC学习的第三周小结(2009.5.25-2009.5.31)-运动估计1中已经提及相关内容)。现在进入这些估计函数内部,来看看他们调用运动估计的过程。在MbEncoder::xEstimateMb16x16()进行16x16的宏块RDcost计算,这里我们会看到有一段代码是判断pcMbDataAccessBase是否存在,这个变量在JMVC全部被赋值为0,不必去担心这段对于层间的参考帧初始化代码(在JSVM中会有所应用)。同样的道理if( iRefIdxTest == iBLRefIdx[uiDir] )//uiDir =0 or 1 后面跟随的代码也不会在MVC用到。去除这些,将可以减少xEstimateMb16x16()一半的代码量。然后看看剩下部分,分别是 LIST 0 PREDICTION, LIST 1 PREDICTION,BI PREDICTION这三部分,就是先分别对两边的参考帧做运动估计,然后再计算双向估计,运动估计的入口函数estimateBlockWithStart在这里被调用,其中的双向估计用到【1】中提到的叠代估计法。最后要做的事情就是判断三种方式下的RDCost,选出最小值的模式作为16x16的最佳值数输出。。。还要和16x8。。。4x4等做比较,他们每一种的逻辑过程也和16x16类似。多大的运算量啊

2. 运动估计入口函数

estimateBlockWithStart()这个函数一直被提到,在调用该函数之前,rpcMbTempData->getMbDataAccess().getMvPredictor()被计算,利用中值预测产生MVPred,这个值被输入运动估计中作为搜索起点。进入estimateBlockWithStart()后,很多过程在以前的文章中已经分析过,这里想说一下m_cParams.getSearchMode()和配置文件中的参数SearchMode是相联系的,所以按代码,可以把该项灵活配置而使用一些JMVC使用说明里没有提及的运动估计方法,甚至可以扩展自定义的方法。

对于一个宏块,以最简单的P为例,需要计算运动估计的代价是多少呢?下面给出了不同的分割对应得estimateBlockWithStart()被调用的次数。

16x16           1
16x8 or 8x16    2
8x8             4
8x4 or 4x8      8
4x4             16

如此计算,一块P宏块要调用41次运动估计入口函数。而在实际的JMVC代码实验中,是45次。JMVC有一个xEstimateMb8x8Frext()函数,也进行了4次函数调用。xEstimateMb8x8Frext()和xEstimateMb8x8()有什么区别呢?根据代码,前者会对bTrafo8x8变量赋值true而后者为false,这可以导致在xSetRdCostInterSubMb()中计算RDCost的时候,前者的残差用8x8DCT处理,而后者用4x4DCT。一般而言,8x8DCT去相关性相对优越,所以更可能得到小的RDcost,但是块效应也比较明显。

帧间(视点间)优化有很多途径,减少运动估计的次数也是非常重要的方法。在实际的工程领域,宏块分割模式的选择应该更灵活,根据实际情况和性能需求,减少运算次数。

3. xTZSearch分析

对xTZSearch()函数每周都陆陆续续在分析,根据上周的概括可以知道,在xTZSearch中实际被调用的只有xTZ8PointDiamondSearch,raster search和后面的star refinement过程。这里将要把这三个过程逐一说明。

.xTZ8PointDiamondSearch
 1 2 3           2
 4 0 5         4 0 5
 6 7 8           7
根据上面的图样,进行钻石形搜索,用搜索起点0的坐标和iDist来不断如下例代码(iDist=1)调整控制搜索点。其中有图为iDist=1的情形。
  const Int iTop        = iStartY - iDist;
  const Int iBottom     = iStartY + iDist;
  const Int iLeft       = iStartX - iDist;
  const Int iRight      = iStartX + iDist;
如下图可以看到iDist<=8的钻石形搜索点

 当iDist>8,根据实际的输出可以看到以下搜索点
(0,-16)    (-16,0)    (16,0)    (0,16)    (-4,-12)    (4,-12)    (-4,12)    (4,12)   
(-8,-8)    (8,-8)    (-8,8)    (8,8)    (-12,-4)    (12,-4)    (-12,4)    (12,4)   
(32,0)    (0,32)    (-8,-24)    (8,-24)    (-8,24)    (8,24)   
(-16,-16)    (16,-16)    (-16,16)    (16,16)    (-24,-8)    (24,-8)    (-24,8)    (24,8)   
(64,0)    (0,64)    (-16,48)    (16,48)    (32,32)    (48,-16)    (48,16)

.raster search
当cStrukt.uiBestDistance > iRaster(代码中定义为3),将进入此过程。看下面的实验数据
(-24,-24)    (-21,-24)    (-18,-24)    (-15,-24)    (-12,-24)    (-9,-24)   
(-6,-24)    (-3,-24)    (0,-24)    (3,-24)    (6,-24)    (9,-24)    (12,-24)   
(15,-24)    (18,-24)    (21,-24)    (24,-24)    (27,-24)    (30,-24)    (33,-24)   
(36,-24)    (39,-24)    (42,-24)    (45,-24)    (48,-24)    (54,-24)    (57,-24)   
(60,-24)    (63,-24)    (-24,-21)    (-21,-21)    (-18,-21)    (-15,-21)    (-12,-21)   
...   
(x,-18)  ...  (x,-15) ... (x,-12)    ...    (63,63)
这个过程以3像素为步长在搜索区域内执行光删扫描。 

.star refinement
取出前两个过程的最佳点作为提纯的起点,根据情况进行xTZ8PointDiamondSearch,或xTZ2PointSearch,直到求得cStrukt.uiBestDistance == 0为止。这里考虑到搜索范围,需要做的计算点数比(0,0)要小。

本周进一步学习运动估计参考帧和入口函数,并实验分析了xTZSearch()函数,在JMVC当前代码中,视差估计和运动估计是共用的,xTZSearch可以再实际使用中,设置一些提前终止的配置值,具体利用视差特点进行优化的过程没有见到。(难道是raster search?)

本周由于时间原因,没有对亚像素点进行学习,对于视差相关论文也只看了少数,在下周(2009.6.15-2009.6.22)要进行亚像素运动估计分析,并且分析一些视差的论文。

【参考文献】

1. Siu-Wai Wu and Allen Gersho, "Joint Estimation of Forward and Backward Motion
Vectors for Interpolative Prediction of Video"

(jacky)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201001/8430.html]
本文出处:网络博客 作者:jacky
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容