--- estimation_common.c 2004/04/20 06:10:40 1.4 +++ estimation_common.c 2004/11/22 05:30:08 1.9 @@ -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.4 2004/04/20 06:10:40 syskin Exp $ + * $Id: estimation_common.c,v 1.9 2004/11/22 05:30:08 syskin 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,38 +323,35 @@ 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 -xvid_me_SubpelRefine(SearchData * const data, CheckFunc * const CheckCandidate, int dir) +xvid_me_SubpelRefine(VECTOR centerMV, SearchData * const data, CheckFunc * const CheckCandidate, int dir) { /* Do a half-pel or q-pel refinement */ - const VECTOR centerMV = data->qpel_precision ? *data->currentQMV : *data->currentMV; CHECK_CANDIDATE(centerMV.x, centerMV.y - 1, dir); CHECK_CANDIDATE(centerMV.x + 1, centerMV.y - 1, dir);