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:
|