您的位置:首页 > 其它

JM8.6中的运动搜索:BlockSAD数组的理解,SetupLargrBlocks函数理解

2012-07-31 15:06 316 查看
JM8.6中的运动搜索:BlockSAD数组的理解,SetupLargrBlocks函数理解

整象素搜索主要包括3个函数SetupFastFullPelSearch,SetMotionVectorPredictor,SetupLargerBlocks, 都位于文件mv_search.c中间。





int *****BlockSAD; //!< SAD for all blocksize, ref. frames and motion vectors

BlockSAD[list][ img->max_num_references+1][8][16][ max_pos]

BlockSAD用于根据4x4块来计算其他大块的SAD值

从对BlockSAD进行分配空间的函数可以看出: InitializeFastFullIntegerSearch

通过对函数void SetupLargerBlocks (int list, int refindex, int max_pos)的分析可以得到

(1) BlockSAD的初始化

InitializeFastFullIntegerSearch函数中对BlockSAD进行空间的分配



(2)BlockSAD的计算

然后再函数SetupFastFullPelSearch中进行整像素搜索,计算SAD值,即在下面的双重循环内



(3) BlockSAD的再计算

在函数SetupLargerBlocks 中,根据已经计算出的16个4x4块来组成其他大小的块,比如4x8, 8x4,8x8等等



对于BlockSAD[list][ref][8][16][maxpos]

BlockSAD[list][ref][4x4][0,1,2,3,4,5…..15][maxpos]



BlockSAD[list][ref][4x8][0,1,2,3,

8, 9, 10, 11][maxpos]



BlockSAD[list][ref][8x4][0,2,4,6

8 ,10,12,14][maxpos]



BlockSAD[list][ref][8x8][0,2

8,10 ][maxpos]



BlockSAD[list][ref][8x16][0,2][maxpos]



BlockSAD[list][ref][16x8][0,8][maxpos]



BlockSAD[list][ref][16x16][0][maxpos]



currMB->mvd[2][BLOCK_MULTIPLE][BLOCK_MULTIPLE][2]; // [forw,backw][block_y][block_x][x,y]

全局变量:motion_cost[8:blocktype][2][img->max_num_references+1][4:block8x8]

这儿的block8x8是指的blocktype所包含的块数:16x16包含一个,16x8包含2个,8x16包含2个,P8x8包含4个

BlockSAD是针对整像素的, 整像素搜索使用的是SAD为代价的,

而在分像素进行搜索时, 代价使用SATD(根据是否设置hadamard), 所以不会用到数组BlockSAD, 重新分别对9个点进行计算SATD

img: int ****cofAC; //!< AC coefficients [8x8block][4x4block][level/run][scan_pos]

int ***cofDC; //!< DC coefficients [yuv][level/run][scan_pos]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐