Home || Architecture || Video Search || Visual Search || Scripts || Applications || 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 908 of file KfrMotionExtractor.h.

References GetMotionError16(), and MAX_DISP.

Referenced by CalcMotionVectors().

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

Here is the call graph for this function:


Generated on Fri Mar 19 11:30:23 2010 for ImpalaSrc by  doxygen 1.5.1