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