--- estimation_common.c 2004/03/22 22:36:24 1.2 +++ estimation_common.c 2004/11/24 22:14:11 1.2.2.4 @@ -21,7 +21,7 @@ * along with this program ; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: estimation_common.c,v 1.2 2004/03/22 22:36:24 edgomez Exp $ + * $Id: estimation_common.c,v 1.2.2.4 2004/11/24 22:14:11 edgomez Exp $ * ****************************************************************************/ @@ -269,14 +269,14 @@ CHECK_CANDIDATE(x + iDiamondSize, y - iDiamondSize, 2 + 4); break; case 2 + 8: - CHECK_CANDIDATE(x - iDiamondSize, y - iDiamondSize, 1 + 4); - CHECK_CANDIDATE(x - iDiamondSize, y + iDiamondSize, 1 + 8); + CHECK_CANDIDATE(x + iDiamondSize, y - iDiamondSize, 2 + 4); CHECK_CANDIDATE(x + iDiamondSize, y + iDiamondSize, 2 + 8); + CHECK_CANDIDATE(x - iDiamondSize, y + iDiamondSize, 1 + 8); break; case 1 + 8: - CHECK_CANDIDATE(x + iDiamondSize, y - iDiamondSize, 2 + 4); - CHECK_CANDIDATE(x + iDiamondSize, y + iDiamondSize, 2 + 8); + CHECK_CANDIDATE(x - iDiamondSize, y - iDiamondSize, 1 + 4); CHECK_CANDIDATE(x - iDiamondSize, y + iDiamondSize, 1 + 8); + CHECK_CANDIDATE(x + iDiamondSize, y + iDiamondSize, 2 + 8); break; default: /* 1+2+4+8 == we didn't find anything at all */ CHECK_CANDIDATE(x - iDiamondSize, y - iDiamondSize, 1 + 4); @@ -323,31 +323,29 @@ unsigned int * const iDirection = &data->dir; - do { + for (;;) { *iDirection = 0; if (bDirection & 1) CHECK_CANDIDATE(x - iDiamondSize, y, 1); if (bDirection & 2) CHECK_CANDIDATE(x + iDiamondSize, y, 2); if (bDirection & 4) CHECK_CANDIDATE(x, y - iDiamondSize, 4); if (bDirection & 8) CHECK_CANDIDATE(x, y + iDiamondSize, 8); + if (*iDirection == 0) + break; + /* now we're doing diagonal checks near our candidate */ - - if (*iDirection) { /* checking if anything found */ - bDirection = *iDirection; - *iDirection = 0; - x = data->currentMV->x; y = data->currentMV->y; - if (bDirection & 3) { /* our candidate is left or right */ - CHECK_CANDIDATE(x, y + iDiamondSize, 8); - CHECK_CANDIDATE(x, y - iDiamondSize, 4); - } else { /* what remains here is up or down */ - CHECK_CANDIDATE(x + iDiamondSize, y, 2); - CHECK_CANDIDATE(x - iDiamondSize, y, 1); - } - bDirection += *iDirection; - x = data->currentMV->x; y = data->currentMV->y; + bDirection = *iDirection; + x = data->currentMV->x; y = data->currentMV->y; + if (bDirection & 3) { /* our candidate is left or right */ + CHECK_CANDIDATE(x, y + iDiamondSize, 8); + CHECK_CANDIDATE(x, y - iDiamondSize, 4); + } else { /* what remains here is up or down */ + CHECK_CANDIDATE(x + iDiamondSize, y, 2); + CHECK_CANDIDATE(x - iDiamondSize, y, 1); } + bDirection |= *iDirection; + x = data->currentMV->x; y = data->currentMV->y; } - while (*iDirection); } void @@ -427,7 +425,7 @@ CHECK_CANDIDATE(xo-1, yo, 0); CHECK_CANDIDATE(xo+1, yo, 0); - if(best_sad < data->iMinSAD2) return; + if(best_sad <= data->iMinSAD2) return; if(data->currentQMV[0].y == data->currentQMV2.y) { CHECK_CANDIDATE(xo-1, (yo+yo2)>>1, 0);