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

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 ,根据已经计算出的164x4块来组成其他大小的块,比如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]

 

posted @ 2012-07-31 15:06  Mr.Rico  阅读(...)  评论(...编辑  收藏