--- motion_est.c 2002/11/20 15:29:07 1.44.2.22 +++ motion_est.c 2002/11/23 15:09:31 1.44.2.26 @@ -47,7 +47,7 @@ #define FINAL_SKIP_THRESH (50) #define MAX_SAD00_FOR_SKIP (20) #define MAX_CHROMA_SAD_FOR_SKIP (22) -#define SKIP_THRESH_B (25) +#define SKIP_THRESH_B (15) #define CHECK_CANDIDATE(X,Y,D) { \ (*CheckCandidate)((const int)(X),(const int)(Y), (D), &iDirection, data ); } @@ -137,7 +137,7 @@ Interpolate8x8qpel(const int x, const int y, const int block, const int dir, const SearchData * const data) { // create or find a qpel-precision reference picture; return pointer to it - uint8_t * Reference = (uint8_t *)data->RefQ; + uint8_t * Reference = (uint8_t *)data->RefQ + 16*dir; const int32_t iEdgedWidth = data->iEdgedWidth; const uint32_t rounding = data->rounding; const int halfpel_x = x/2; @@ -155,13 +155,13 @@ case 1: // x halfpel, y qpel - top or bottom during qpel refinement ref2 = GetReference(halfpel_x, y - halfpel_y, dir, data); ref2 += 8 * (block&1) + 8 * (block>>1) * iEdgedWidth; - interpolate8x8_avg2(Reference, ref1, ref2, iEdgedWidth, rounding); + interpolate8x8_avg2(Reference, ref1, ref2, iEdgedWidth, rounding, 8); break; case 2: // x qpel, y halfpel - left or right during qpel refinement ref2 = GetReference(x - halfpel_x, halfpel_y, dir, data); ref2 += 8 * (block&1) + 8 * (block>>1) * iEdgedWidth; - interpolate8x8_avg2(Reference, ref1, ref2, iEdgedWidth, rounding); + interpolate8x8_avg2(Reference, ref1, ref2, iEdgedWidth, rounding, 8); break; default: // x and y in qpel resolution - the "corners" (top left/right and @@ -182,7 +182,7 @@ Interpolate16x16qpel(const int x, const int y, const int dir, const SearchData * const data) { // create or find a qpel-precision reference picture; return pointer to it - uint8_t * Reference = (uint8_t *)data->RefQ; + uint8_t * Reference = (uint8_t *)data->RefQ + 16*dir; const int32_t iEdgedWidth = data->iEdgedWidth; const uint32_t rounding = data->rounding; const int halfpel_x = x/2; @@ -195,18 +195,18 @@ return (uint8_t *) GetReference(halfpel_x, halfpel_y, dir, data); case 1: // x halfpel, y qpel - top or bottom during qpel refinement ref2 = GetReference(halfpel_x, y - halfpel_y, dir, data); - interpolate8x8_avg2(Reference, ref1, ref2, iEdgedWidth, rounding); - interpolate8x8_avg2(Reference+8, ref1+8, ref2+8, iEdgedWidth, rounding); - interpolate8x8_avg2(Reference+8*iEdgedWidth, ref1+8*iEdgedWidth, ref2+8*iEdgedWidth, iEdgedWidth, rounding); - interpolate8x8_avg2(Reference+8*iEdgedWidth+8, ref1+8*iEdgedWidth+8, ref2+8*iEdgedWidth+8, iEdgedWidth, rounding); + interpolate8x8_avg2(Reference, ref1, ref2, iEdgedWidth, rounding, 8); + interpolate8x8_avg2(Reference+8, ref1+8, ref2+8, iEdgedWidth, rounding, 8); + interpolate8x8_avg2(Reference+8*iEdgedWidth, ref1+8*iEdgedWidth, ref2+8*iEdgedWidth, iEdgedWidth, rounding, 8); + interpolate8x8_avg2(Reference+8*iEdgedWidth+8, ref1+8*iEdgedWidth+8, ref2+8*iEdgedWidth+8, iEdgedWidth, rounding, 8); break; case 2: // x qpel, y halfpel - left or right during qpel refinement ref2 = GetReference(x - halfpel_x, halfpel_y, dir, data); - interpolate8x8_avg2(Reference, ref1, ref2, iEdgedWidth, rounding); - interpolate8x8_avg2(Reference+8, ref1+8, ref2+8, iEdgedWidth, rounding); - interpolate8x8_avg2(Reference+8*iEdgedWidth, ref1+8*iEdgedWidth, ref2+8*iEdgedWidth, iEdgedWidth, rounding); - interpolate8x8_avg2(Reference+8*iEdgedWidth+8, ref1+8*iEdgedWidth+8, ref2+8*iEdgedWidth+8, iEdgedWidth, rounding); + interpolate8x8_avg2(Reference, ref1, ref2, iEdgedWidth, rounding, 8); + interpolate8x8_avg2(Reference+8, ref1+8, ref2+8, iEdgedWidth, rounding, 8); + interpolate8x8_avg2(Reference+8*iEdgedWidth, ref1+8*iEdgedWidth, ref2+8*iEdgedWidth, iEdgedWidth, rounding, 8); + interpolate8x8_avg2(Reference+8*iEdgedWidth+8, ref1+8*iEdgedWidth+8, ref2+8*iEdgedWidth+8, iEdgedWidth, rounding, 8); break; default: // x and y in qpel resolution - the "corners" (top left/right and @@ -1368,7 +1368,7 @@ Data->min_dy *= 2; Data->referencemv = b_mb->qmvs; } else Data->referencemv = b_mb->mvs; - Data->qpel_precision = 0; // it'm a trick. it's 1 not 0, but we need 0 here + Data->qpel_precision = 0; // it's a trick. it's 1 not 0, but we need 0 here for (k = 0; k < 4; k++) { pMB->mvs[k].x = Data->directmvF[k].x = ((TRB * Data->referencemv[k].x) / TRD); @@ -1458,9 +1458,9 @@ *Data->iMinSAD += 1 * Data->lambda16; // one bit is needed to code direct mode *best_sad = *Data->iMinSAD; -// if (b_mb->mode == MODE_INTER4V) + if (b_mb->mode == MODE_INTER4V) pMB->mode = MODE_DIRECT; -// else pMB->mode = MODE_DIRECT_NO4V; //for faster compensation + else pMB->mode = MODE_DIRECT_NO4V; //for faster compensation pMB->pmvs[3] = *Data->currentMV; @@ -2037,7 +2037,7 @@ } #define INTRA_THRESH 1350 -#define INTER_THRESH 900 +#define INTER_THRESH 1200 int @@ -2070,7 +2070,7 @@ IntraThresh -= (IntraThresh * (maxIntra - 5*(maxIntra - intraCount)))/maxIntra; - InterThresh += 300 * (1 - bCount); + InterThresh += 400 * (1 - bCount); if (InterThresh < 200) InterThresh = 200; if (sadInit) (*sadInit) ();