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]