Home || Visual Search || Applications || Architecture || Important Messages || OGL || Src

int Impala::Core::VideoSet::KfrMotionExtractor::DiamondSearch16 ( unsigned char *  refframe,
unsigned char *  desframe,
int  framewidth,
int  frameheight,
int *  cx,
int *  cy 
) [inline]

Definition at line 915 of file KfrMotionExtractor.h.

References GetMotionError16(), and MAX_DISP.

Referenced by CalcMotionVectors().

00917     {
00918         static char FirstDiamondX[] = { 0,  0, -2,  2, -1,  1, -1,  1};
00919         static char FirstDiamondY[] = {-2,  2,  0,  0, -1, -1,  1,  1};
00920         static char FinalDiamondX[] = {-1,  0,  1,  0}; 
00921         static char FinalDiamondY[] = { 0, -1,  0,  1}; 
00922 
00923         static char CornerDiamondX[] = {0,  0,  1,   1,  2}; 
00924         static char CornerDiamondY[] = {2, -2,  1,  -1,  0}; 
00925 
00926         static char EdgeDiamondX[] = { 0,  1,  2}; 
00927         static char EdgeDiamondY[] = { 2,  1,  0}; 
00928 
00929         int minX = 0, minY = 0, minerror;
00930         int curX, curY;
00931         int error, signX, signY;
00932         int sX, sY;
00933 
00934         int i;
00935         unsigned char * block;
00936 
00937         // the postion of current block for the current frame!
00938         // this positon will not change during the search process
00939         block = desframe + * cy * framewidth + * cx; 
00940 
00941         curX = * cx; curY = * cy;
00942         if (curX < 0 || curX > framewidth - 16 || curY < 0 || curY > frameheight - 16) 
00943         {
00944             * cx = * cy = 0;
00945             return -1;
00946         }
00947 
00948         // Initialize the minerror value
00949         minerror = GetMotionError16(refframe, block, framewidth, curX, curY);
00950 
00951         sX = * cx;
00952         sY = * cy;
00953         for (i = 0; i < 8; i ++)
00954         {
00955             curX = sX + FirstDiamondX[i]; 
00956             curY = sY + FirstDiamondY[i];
00957             if (curX < 0 || curX > framewidth - 16 || curY < 0 || curY > frameheight - 16) 
00958                 continue;
00959 
00960             error = GetMotionError16(refframe, block, framewidth, curX, curY);
00961             if (error < minerror)
00962             {
00963                 minX = FirstDiamondX[i];
00964                 minY = FirstDiamondY[i];
00965                 minerror = error;
00966             }
00967         }
00968 
00969         while (1)
00970         {
00971             if (!minX && !minY) break;
00972 
00973             sX += minX;
00974             sY += minY;
00975 
00976             if (abs(sX - * cx) > MAX_DISP) break;
00977             if (abs(sY - * cy) > MAX_DISP) break;
00978             
00979             if (!minY)
00980             {
00981                 if (minX > 0) signX = 1;
00982                 else signX = -1;
00983 
00984                 minX = minY = 0;
00985                 for (i = 0; i < 5; i ++)
00986                 {
00987                     curX = sX + CornerDiamondX[i] * signX; 
00988                     curY = sY + CornerDiamondY[i];
00989                     if (curX < 0 || curX > framewidth - 16 || curY < 0 || curY > frameheight - 16) 
00990                         continue;
00991 
00992                     error = GetMotionError16(refframe, block, framewidth, curX, curY);
00993                     if (error < minerror)
00994                     {
00995                         minX = curX - sX;
00996                         minY = curY - sY;
00997                         minerror = error;
00998                     }
00999                 }
01000                 continue;
01001             }
01002             
01003             if (!minX)
01004             {
01005                 if (minY > 0) signY = 1;
01006                 else signY = -1;
01007 
01008                 minX = minY = 0;
01009                 for (i = 0; i < 5; i ++)
01010                 {
01011                     curX = sX + CornerDiamondY[i]; 
01012                     curY = sY + CornerDiamondX[i] * signY;
01013                     if (curX < 0 || curX > framewidth - 16 || curY < 0 || curY > frameheight - 16) 
01014                         continue;
01015 
01016                     error = GetMotionError16(refframe, block, framewidth, curX, curY);
01017                     if (error < minerror)
01018                     {
01019                         minX = curX - sX;
01020                         minY = curY - sY;
01021                         minerror = error;
01022                     }
01023                 }
01024                 continue;
01025             }
01026 
01027             if (minX > 0) signX = 1;
01028             else signX = -1;
01029             if (minY > 0) signY = 1;
01030             else signY = -1;
01031             
01032             minX = minY = 0;
01033             for (i = 0; i < 3; i ++)
01034             {
01035                 curX = sX + EdgeDiamondX[i] * signX; 
01036                 curY = sY + EdgeDiamondY[i] * signY;
01037                 if (curX < 0 || curX > framewidth - 16 || curY < 0 || curY > frameheight - 16) 
01038                     continue;
01039 
01040                 error = GetMotionError16(refframe, block, framewidth, curX, curY);
01041                 if (error < minerror)
01042                 {
01043                     minX = curX - sX;
01044                     minY = curY - sY;
01045                     minerror = error;
01046                 }
01047             }
01048         }
01049 
01050         for (i = 0; i < 4; i ++)
01051         {
01052             curX = sX + FinalDiamondX[i]; 
01053             curY = sY + FinalDiamondY[i];
01054             if (curX < 0 || curX > framewidth - 16 || curY < 0 || curY > frameheight - 16) 
01055                 continue;
01056 
01057             error = GetMotionError16(refframe, block, framewidth, curX, curY);
01058             if (error < minerror)
01059             {
01060                 minX = FinalDiamondX[i];
01061                 minY = FinalDiamondY[i];
01062                 minerror = error;
01063             }
01064         }
01065 
01066         * cx = sX + minX;
01067         * cy = sY + minY;
01068         return minerror;
01069 
01070     }

Here is the call graph for this function:


Generated on Thu Jan 13 09:22:01 2011 for ImpalaSrc by  doxygen 1.5.1