[cvs] / xvidcore / src / motion / estimation_common.c Repository:
ViewVC logotype

Diff of /xvidcore/src/motion/estimation_common.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1.2.2, Wed Nov 19 12:24:25 2003 UTC revision 1.2.2.2, Sun Oct 3 14:52:53 2004 UTC
# Line 331  Line 331 
331                  if (bDirection & 8) CHECK_CANDIDATE(x, y + iDiamondSize, 8);                  if (bDirection & 8) CHECK_CANDIDATE(x, y + iDiamondSize, 8);
332    
333                  /* now we're doing diagonal checks near our candidate */                  /* now we're doing diagonal checks near our candidate */
   
                 if (*iDirection) {              /* checking if anything found */  
334                          bDirection = *iDirection;                          bDirection = *iDirection;
335                          *iDirection = 0;                  if (*iDirection) {              /* checking if anything found */
336                          x = data->currentMV->x; y = data->currentMV->y;                          x = data->currentMV->x; y = data->currentMV->y;
337                          if (bDirection & 3) {   /* our candidate is left or right */                          if (bDirection & 3) {   /* our candidate is left or right */
338                                  CHECK_CANDIDATE(x, y + iDiamondSize, 8);                                  CHECK_CANDIDATE(x, y + iDiamondSize, 8);
# Line 343  Line 341 
341                                  CHECK_CANDIDATE(x + iDiamondSize, y, 2);                                  CHECK_CANDIDATE(x + iDiamondSize, y, 2);
342                                  CHECK_CANDIDATE(x - iDiamondSize, y, 1);                                  CHECK_CANDIDATE(x - iDiamondSize, y, 1);
343                          }                          }
344                          bDirection += *iDirection;                          bDirection |= *iDirection;
345                          x = data->currentMV->x; y = data->currentMV->y;                          x = data->currentMV->x; y = data->currentMV->y;
346                  }                  }
347          }          }
348          while (*iDirection);          while (bDirection);
349  }  }
350    
351  void  void
# Line 366  Line 364 
364          CHECK_CANDIDATE(centerMV.x - 1, centerMV.y - 1, 0);          CHECK_CANDIDATE(centerMV.x - 1, centerMV.y - 1, 0);
365  }  }
366    
367    void
368    SubpelRefine_Fast(SearchData * data, CheckFunc * CheckCandidate)
369    {
370    /* Do a fast q-pel refinement */
371            VECTOR centerMV;
372            VECTOR second_best;
373            int best_sad = *data->iMinSAD;
374            int xo, yo, xo2, yo2;
375            int size = 2;
376            data->iMinSAD2 = 0;
377    
378            /* check all halfpixel positions near our best halfpel position */
379            centerMV = *data->currentQMV;
380            *data->iMinSAD = 256 * 4096;
381    
382            CHECK_CANDIDATE(centerMV.x, centerMV.y - size, 0);
383            CHECK_CANDIDATE(centerMV.x + size, centerMV.y - size, 0);
384            CHECK_CANDIDATE(centerMV.x + size, centerMV.y, 0);
385            CHECK_CANDIDATE(centerMV.x + size, centerMV.y + size, 0);
386    
387            CHECK_CANDIDATE(centerMV.x, centerMV.y + size, 0);
388            CHECK_CANDIDATE(centerMV.x - size, centerMV.y + size, 0);
389            CHECK_CANDIDATE(centerMV.x - size, centerMV.y, 0);
390            CHECK_CANDIDATE(centerMV.x - size, centerMV.y - size, 0);
391    
392            second_best = *data->currentQMV;
393    
394            /* after second_best has been found, go back to the vector we began with */
395    
396            data->currentQMV[0] = centerMV;
397            *data->iMinSAD = best_sad;
398    
399            xo = centerMV.x;
400            yo = centerMV.y;
401            xo2 = second_best.x;
402            yo2 = second_best.y;
403    
404            data->iMinSAD2 = 256 * 4096;
405    
406            if (yo == yo2) {
407                    CHECK_CANDIDATE((xo+xo2)>>1, yo, 0);
408                    CHECK_CANDIDATE(xo, yo-1, 0);
409                    CHECK_CANDIDATE(xo, yo+1, 0);
410    
411                    if(best_sad <= data->iMinSAD2) return;
412    
413                    if(data->currentQMV[0].x == data->currentQMV2.x) {
414                            CHECK_CANDIDATE((xo+xo2)>>1, yo-1, 0);
415                            CHECK_CANDIDATE((xo+xo2)>>1, yo+1, 0);
416                    } else {
417                            CHECK_CANDIDATE((xo+xo2)>>1,
418                                    (data->currentQMV[0].x == xo) ? data->currentQMV[0].y : data->currentQMV2.y, 0);
419                    }
420                    return;
421            }
422    
423            if (xo == xo2) {
424                    CHECK_CANDIDATE(xo, (yo+yo2)>>1, 0);
425                    CHECK_CANDIDATE(xo-1, yo, 0);
426                    CHECK_CANDIDATE(xo+1, yo, 0);
427    
428                    if(best_sad <= data->iMinSAD2) return;
429    
430                    if(data->currentQMV[0].y == data->currentQMV2.y) {
431                            CHECK_CANDIDATE(xo-1, (yo+yo2)>>1, 0);
432                            CHECK_CANDIDATE(xo+1, (yo+yo2)>>1, 0);
433                    } else {
434                            CHECK_CANDIDATE((data->currentQMV[0].y == yo) ? data->currentQMV[0].x : data->currentQMV2.x, (yo+yo2)>>1, 0);
435                    }
436                    return;
437            }
438    
439            CHECK_CANDIDATE(xo, (yo+yo2)>>1, 0);
440            CHECK_CANDIDATE((xo+xo2)>>1, yo, 0);
441    
442            if(best_sad <= data->iMinSAD2) return;
443    
444            CHECK_CANDIDATE((xo+xo2)>>1, (yo+yo2)>>1, 0);
445    }

Legend:
Removed from v.1.1.2.2  
changed lines
  Added in v.1.2.2.2

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4