--- estimation_bvop.c 2004/07/18 11:48:08 1.10 +++ estimation_bvop.c 2004/10/12 21:08:41 1.16 @@ -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_bvop.c,v 1.10 2004/07/18 11:48:08 syskin Exp $ + * $Id: estimation_bvop.c,v 1.16 2004/10/12 21:08:41 edgomez Exp $ * ****************************************************************************/ @@ -375,8 +375,7 @@ Data_d->CurU = Data_f->CurU = Data_b->CurU = Data_i->CurU = Cur[1]; Data_d->CurV = Data_f->CurV = Data_b->CurV = Data_i->CurV = Cur[2]; - Data_d->lambda16 = lambda; - Data_f->lambda16 = Data_b->lambda16 = Data_i->lambda16 = lambda; + Data_d->lambda16 = Data_f->lambda16 = Data_b->lambda16 = Data_i->lambda16 = lambda; /* reset chroma-sad cache */ Data_d->b_chromaX = Data_d->b_chromaY = Data_d->chromaX = Data_d->chromaY = Data_d->chromaSAD = 256*4096; @@ -401,11 +400,9 @@ const uint32_t mode_curr, const VECTOR hint) { - /* [0] is prediction */ - pmv[0].x = (pmv[0].x); pmv[0].y = (pmv[0].y); - - pmv[1].x = pmv[1].y = 0; /* [1] is zero */ + /* [1] is zero */ + pmv[1].x = pmv[1].y = 0; pmv[2].x = hint.x; pmv[2].y = hint.y; @@ -525,8 +522,6 @@ { int k; - pMB->mode = MODE_DIRECT; /* just to initialize it */ - if (!Data->chroma) { int dx = 0, dy = 0, b_dx = 0, b_dy = 0; int32_t sum; @@ -546,15 +541,15 @@ b_dx = (b_dx >> 3) + roundtab_76[b_dx & 0xf]; sum = sad8bi(Data->CurU, - Data->RefP[4] + (dy/2) * stride + dx/2, - Data->b_RefP[4] + (b_dy/2) * stride + b_dx/2, + Data->RefP[4] + (dy/2) * (int)stride + dx/2, + Data->b_RefP[4] + (b_dy/2) * (int)stride + b_dx/2, stride); if (sum >= MAX_CHROMA_SAD_FOR_SKIP * (int)Data->iQuant) return; /* no skip */ sum += sad8bi(Data->CurV, - Data->RefP[5] + (dy/2) * stride + dx/2, - Data->b_RefP[5] + (b_dy/2) * stride + b_dx/2, + Data->RefP[5] + (dy/2) * (int)stride + dx/2, + Data->b_RefP[5] + (b_dy/2) * (int)stride + b_dx/2, stride); if (sum >= MAX_CHROMA_SAD_FOR_SKIP * (int)Data->iQuant) return; /* no skip */ @@ -569,6 +564,10 @@ for (k = 0; k < 4; k++) { pMB->qmvs[k] = pMB->mvs[k] = Data->directmvF[k]; pMB->b_qmvs[k] = pMB->b_mvs[k] = Data->directmvB[k]; + if (Data->qpel) { + pMB->mvs[k].x /= 2; pMB->mvs[k].y /= 2; /* it's a hint for future searches */ + pMB->b_mvs[k].x /= 2; pMB->b_mvs[k].y /= 2; + } } } @@ -617,7 +616,6 @@ CheckCandidateDirect(0, 0, Data, 255); /* will also fill iMinSAD[1..4] with 8x8 SADs */ - /* initial (fast) skip decision */ if (Data->iMinSAD[1] < (int)Data->iQuant * INITIAL_SKIP_THRESH && Data->iMinSAD[2] < (int)Data->iQuant * INITIAL_SKIP_THRESH @@ -629,8 +627,10 @@ return *Data->iMinSAD; /* skipped */ } - skip_sad = 4*MAX(MAX(Data->iMinSAD[1],Data->iMinSAD[2]), MAX(Data->iMinSAD[3],Data->iMinSAD[4])); - if (Data->chroma) skip_sad += Data->chromaSAD; + if (Data->chroma && Data->chromaSAD >= MAX_CHROMA_SAD_FOR_SKIP * (int)Data->iQuant) /* chroma doesn't allow skip */ + skip_sad = 256*4096; + else + skip_sad = 4*MAX(MAX(Data->iMinSAD[1],Data->iMinSAD[2]), MAX(Data->iMinSAD[3],Data->iMinSAD[4])); Data->currentMV[1].x = Data->directmvF[0].x + Data->currentMV->x; /* hints for forward and backward searches */ Data->currentMV[1].y = Data->directmvF[0].y + Data->currentMV->y; @@ -643,6 +643,8 @@ Data->directmvB[0].y : Data->currentMV[1].y - Data->referencemv[0].y); + *best_sad = Data->iMinSAD[0]; + return skip_sad; } @@ -875,6 +877,7 @@ *f_predMV = Data_f->currentMV[0]; } pMB->mvs[0] = *Data_f->currentMV; + pMB->b_mvs[0] = *Data_b->currentMV; /* hint for future searches */ break; case MODE_BACKWARD: @@ -889,6 +892,7 @@ *b_predMV = Data_b->currentMV[0]; } pMB->b_mvs[0] = *Data_b->currentMV; + pMB->mvs[0] = *Data_f->currentMV; /* hint for future searches */ break; @@ -935,7 +939,8 @@ const IMAGE * const b_refHV) { uint32_t i, j; - int32_t best_sad, sad2; + int32_t best_sad = 256*4096; + int32_t sad2; uint32_t skip_sad; const MACROBLOCK * const b_mbs = b_reference->mbs; @@ -1001,7 +1006,7 @@ pMB->sad16 = best_sad; continue; } - + SearchBF_initial(i, j, frame->motion_flags, frame->fcode, pParam, pMB, &f_predMV, &best_sad, MODE_FORWARD, &Data_f, Data_d.currentMV[1]); @@ -1027,14 +1032,16 @@ if ((Data_d.iMinSAD[0] <= 2*best_sad) && (!frame->motion_flags&XVID_ME_SKIP_DELTASEARCH)) SearchDirect_final(frame->motion_flags, b_mb, &best_sad, &Data_d); - /* final skip decision */ - if ( (skip_sad < Data_d.iQuant * MAX_SAD00_FOR_SKIP ) + if ( (skip_sad < 2 * Data_d.iQuant * MAX_SAD00_FOR_SKIP ) && ((100*best_sad)/(skip_sad+1) > FINAL_SKIP_THRESH) ) { + Data_d.chromaSAD = 0; /* green light for chroma check */ + SkipDecisionB(pMB, &Data_d); + if (pMB->mode == MODE_DIRECT_NONE_MV) { /* skipped? */ - pMB->sad16 = best_sad; + pMB->sad16 = skip_sad; continue; } }