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]
整象素搜索主要包括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]
相关文章推荐
- 【JM8.6】运动估计的几个函数分析
- 理解 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
- 指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针的理解
- 理解 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
- 如何利用JM8.6解码器提取码流中P帧宏块(第一个4*4块)的运动矢量(考虑B帧,设x264编码的12帧为IDR BBPBBPBBPBP)
- 如何理解数组作为函数参数时,数组名就是指针?
- PHP 在数组中搜索给定的简单实例 array_search 函数
- 个人理解:关于指针数组、数组指针、函数指针、函数指针数组、函数指针数组指针
- 如何利用JM8.6解码器提取码流中P帧宏块的运动矢量(假设编码不用B帧,仅为IDR P P)
- 深入理解指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针
- 指针数组、数组指针、函数指针、函数指针数组……概念理解
- JavaScript数组的快速克隆(slice()函数)和数组的排序、乱序和搜索(sort()函数)
- JAVA函数与事件编程,数组,搜索与排序
- C语言 函数理解(以数组做参数)
- 理解指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针
- 如何理解数组作为函数参数时,数组名就是指针?
- JM8.6编码器中的Configure函数究竟做了什么?(编程思想:抽象,间接)
- 深入理解PHP 数组之count 函数
- 理解 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
- 深入理解指针数组 ,数组指针 ,函数指针 ,函数指针数组 ,指向函数指针数组的指针