--- estimation_bvop.c 2004/07/08 07:12:54 1.7 +++ estimation_bvop.c 2004/07/18 11:48:08 1.10 @@ -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.7 2004/07/08 07:12:54 syskin Exp $ + * $Id: estimation_bvop.c,v 1.10 2004/07/18 11:48:08 syskin Exp $ * ****************************************************************************/ @@ -375,7 +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/4; + Data_d->lambda16 = lambda; Data_f->lambda16 = Data_b->lambda16 = Data_i->lambda16 = lambda; /* reset chroma-sad cache */ @@ -525,6 +525,8 @@ { 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; @@ -554,7 +556,11 @@ Data->RefP[5] + (dy/2) * stride + dx/2, Data->b_RefP[5] + (b_dy/2) * stride + b_dx/2, stride); - + + if (sum >= MAX_CHROMA_SAD_FOR_SKIP * (int)Data->iQuant) return; /* no skip */ + } else { + int sum = Data->chromaSAD; /* chroma-sad SAD caching keeps it there */ + if (sum >= MAX_CHROMA_SAD_FOR_SKIP * (int)Data->iQuant) return; /* no skip */ } @@ -938,6 +944,7 @@ const int32_t TRB = time_pp - time_bp; const int32_t TRD = time_pp; + DECLARE_ALIGNED_MATRIX(dct_space, 3, 64, int16_t, CACHE_LINE); /* some pre-inintialized data for the rest of the search */ SearchData Data_d, Data_f, Data_b, Data_i; @@ -948,6 +955,9 @@ Data_d.rounding = 0; Data_d.chroma = frame->motion_flags & XVID_ME_CHROMA_BVOP; Data_d.iQuant = frame->quant; + Data_d.dctSpace = dct_space; + Data_d.quant_type = !(pParam->vol_flags & XVID_VOL_MPEGQUANT); + Data_d.mpeg_quant_matrices = pParam->mpeg_quant_matrices; Data_d.RefQ = f_refV->u; /* a good place, also used in MC (for similar purpose) */ @@ -966,9 +976,6 @@ for (i = 0; i < pParam->mb_width; i++) { MACROBLOCK * const pMB = frame->mbs + i + j * pParam->mb_width; const MACROBLOCK * const b_mb = b_mbs + i + j * pParam->mb_width; - int interpol_search = 0; - int bf_search = 0; - int bf_thresh = 0; pMB->mode = -1; initialize_searchData(&Data_d, &Data_f, &Data_b, &Data_i, @@ -1003,22 +1010,21 @@ sad2 = best_sad; - if (Data_f.iMinSAD[0] < 2*sad2+1500) + if (Data_f.iMinSAD[0] < 2*sad2+2000) SearchBF_final(i, j, frame->motion_flags, pParam, &best_sad, &Data_f); - if (Data_b.iMinSAD[0] < 2*sad2+1500) + if (Data_b.iMinSAD[0] < 2*sad2+2000) SearchBF_final(i, j, frame->motion_flags, pParam, &best_sad, &Data_b); SearchInterpolate_initial(i, j, frame->motion_flags, pParam, &f_predMV, &b_predMV, &best_sad, &Data_i, Data_f.currentMV[0], Data_b.currentMV[0]); - if (((Data_i.iMinSAD[0] < 2*best_sad+2000) && (!(frame->motion_flags&XVID_ME_FAST_MODEINTERPOLATE)) - || Data_i.iMinSAD[0] <= best_sad)) + if (((Data_i.iMinSAD[0] < 2*best_sad+2000) && !(frame->motion_flags&XVID_ME_FAST_MODEINTERPOLATE)) + || Data_i.iMinSAD[0] <= best_sad) SearchInterpolate_final(i, j, frame->motion_flags, pParam, &best_sad, &Data_i); - - if ((Data_d.iMinSAD[0] <= best_sad) && (!(frame->motion_flags&XVID_ME_SKIP_DELTASEARCH))) + 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); @@ -1033,7 +1039,11 @@ } } - ModeDecision_BVOP_SAD(&Data_d, &Data_b, &Data_f, &Data_i, pMB, b_mb, &f_predMV, &b_predMV); + if (frame->vop_flags & XVID_VOP_RD_BVOP) + ModeDecision_BVOP_RD(&Data_d, &Data_b, &Data_f, &Data_i, + pMB, b_mb, &f_predMV, &b_predMV, frame->motion_flags, pParam, i, j); + else + ModeDecision_BVOP_SAD(&Data_d, &Data_b, &Data_f, &Data_i, pMB, b_mb, &f_predMV, &b_predMV); } }