21 |
* along with this program ; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
22 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
23 |
* |
* |
24 |
* $Id: estimation_bvop.c,v 1.16 2004-10-12 21:08:41 edgomez Exp $ |
* $Id: estimation_bvop.c,v 1.17 2004-12-05 04:53:01 syskin Exp $ |
25 |
* |
* |
26 |
****************************************************************************/ |
****************************************************************************/ |
27 |
|
|
137 |
xcb = xb/2; ycb = yb/2; |
xcb = xb/2; ycb = yb/2; |
138 |
} |
} |
139 |
|
|
140 |
t = d_mv_bits(xf, yf, data->predMV, data->iFcode, data->qpel^data->qpel_precision, 0) |
t = d_mv_bits(xf, yf, data->predMV, data->iFcode, data->qpel^data->qpel_precision) |
141 |
+ d_mv_bits(xb, yb, data->bpredMV, data->iFcode, data->qpel^data->qpel_precision, 0); |
+ d_mv_bits(xb, yb, data->bpredMV, data->iFcode, data->qpel^data->qpel_precision); |
142 |
|
|
143 |
sad = sad16bi(data->Cur, ReferenceF, ReferenceB, data->iEdgedWidth); |
sad = sad16bi(data->Cur, ReferenceF, ReferenceB, data->iEdgedWidth); |
144 |
sad += (data->lambda16 * t * sad)>>10; |
sad += (data->lambda16 * t * sad)>>10; |
207 |
if (sad > *(data->iMinSAD)) return; |
if (sad > *(data->iMinSAD)) return; |
208 |
} |
} |
209 |
|
|
210 |
sad += (data->lambda16 * d_mv_bits(x, y, zeroMV, 1, 0, 0) * sad)>>10; |
sad += (data->lambda16 * d_mv_bits(x, y, zeroMV, 1, 0) * sad)>>10; |
211 |
|
|
212 |
if (data->chroma && sad < *data->iMinSAD) |
if (data->chroma && sad < *data->iMinSAD) |
213 |
sad += ChromaSAD2((xcf >> 3) + roundtab_76[xcf & 0xf], |
sad += ChromaSAD2((xcf >> 3) + roundtab_76[xcf & 0xf], |
265 |
|
|
266 |
done: |
done: |
267 |
sad = sad16bi(data->Cur, ReferenceF, ReferenceB, data->iEdgedWidth); |
sad = sad16bi(data->Cur, ReferenceF, ReferenceB, data->iEdgedWidth); |
268 |
sad += (data->lambda16 * d_mv_bits(x, y, zeroMV, 1, 0, 0) * sad)>>10; |
sad += (data->lambda16 * d_mv_bits(x, y, zeroMV, 1, 0) * sad)>>10; |
269 |
|
|
270 |
if (data->chroma && sad < *data->iMinSAD) |
if (data->chroma && sad < *data->iMinSAD) |
271 |
sad += ChromaSAD2((xcf >> 3) + roundtab_76[xcf & 0xf], |
sad += ChromaSAD2((xcf >> 3) + roundtab_76[xcf & 0xf], |
291 |
if ( (x > data->max_dx) || ( x < data->min_dx) |
if ( (x > data->max_dx) || ( x < data->min_dx) |
292 |
|| (y > data->max_dy) || (y < data->min_dy) ) return; |
|| (y > data->max_dy) || (y < data->min_dy) ) return; |
293 |
|
|
|
if (data->rrv && (!(x&1) && x !=0) | (!(y&1) && y !=0) ) return; /* non-zero even value */ |
|
|
|
|
294 |
if (data->qpel_precision) { /* x and y are in 1/4 precision */ |
if (data->qpel_precision) { /* x and y are in 1/4 precision */ |
295 |
Reference = xvid_me_interpolate16x16qpel(x, y, 0, data); |
Reference = xvid_me_interpolate16x16qpel(x, y, 0, data); |
296 |
current = data->currentQMV; |
current = data->currentQMV; |
301 |
xc = x; yc = y; |
xc = x; yc = y; |
302 |
} |
} |
303 |
t = d_mv_bits(x, y, data->predMV, data->iFcode, |
t = d_mv_bits(x, y, data->predMV, data->iFcode, |
304 |
data->qpel^data->qpel_precision, data->rrv); |
data->qpel^data->qpel_precision); |
305 |
|
|
306 |
sad = sad16(data->Cur, Reference, data->iEdgedWidth, 256*4096); |
sad = sad16(data->Cur, Reference, data->iEdgedWidth, 256*4096); |
307 |
sad += (data->lambda16 * t * sad)>>10; |
sad += (data->lambda16 * t * sad)>>10; |
443 |
Data->predMV = *predMV; |
Data->predMV = *predMV; |
444 |
|
|
445 |
get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 4, |
get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 4, |
446 |
pParam->width, pParam->height, iFcode - Data->qpel, 1, 0); |
pParam->width, pParam->height, iFcode - Data->qpel, 1); |
447 |
|
|
448 |
pmv[0] = Data->predMV; |
pmv[0] = Data->predMV; |
449 |
if (Data->qpel) { |
if (Data->qpel) { |
490 |
if(MotionFlags & XVID_ME_FASTREFINE16) { |
if(MotionFlags & XVID_ME_FASTREFINE16) { |
491 |
/* fast */ |
/* fast */ |
492 |
get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 4, |
get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 4, |
493 |
pParam->width, pParam->height, Data->iFcode, 2, 0); |
pParam->width, pParam->height, Data->iFcode, 2); |
494 |
FullRefine_Fast(Data, CheckCandidate16no4v, 0); |
FullRefine_Fast(Data, CheckCandidate16no4v, 0); |
495 |
|
|
496 |
} else { |
} else { |
505 |
Data->currentQMV->y = 2*Data->currentMV->y; |
Data->currentQMV->y = 2*Data->currentMV->y; |
506 |
} |
} |
507 |
get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 4, |
get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 4, |
508 |
pParam->width, pParam->height, Data->iFcode, 2, 0); |
pParam->width, pParam->height, Data->iFcode, 2); |
509 |
Data->qpel_precision = 1; |
Data->qpel_precision = 1; |
510 |
xvid_me_SubpelRefine(Data->currentQMV[0], Data, CheckCandidate16no4v, 0); /* qpel part */ |
xvid_me_SubpelRefine(Data->currentQMV[0], Data, CheckCandidate16no4v, 0); /* qpel part */ |
511 |
} |
} |
711 |
Data->currentMV[0] = startF; |
Data->currentMV[0] = startF; |
712 |
Data->currentMV[1] = startB; |
Data->currentMV[1] = startB; |
713 |
|
|
714 |
get_range(f_range, f_range+1, f_range+2, f_range+3, x, y, 4, pParam->width, pParam->height, Data->iFcode - Data->qpel, 1, 0); |
get_range(f_range, f_range+1, f_range+2, f_range+3, x, y, 4, pParam->width, pParam->height, Data->iFcode - Data->qpel, 1); |
715 |
get_range(b_range, b_range+1, b_range+2, b_range+3, x, y, 4, pParam->width, pParam->height, Data->bFcode - Data->qpel, 1, 0); |
get_range(b_range, b_range+1, b_range+2, b_range+3, x, y, 4, pParam->width, pParam->height, Data->bFcode - Data->qpel, 1); |
716 |
|
|
717 |
if (Data->currentMV[0].x > f_range[1]) Data->currentMV[0].x = f_range[1]; |
if (Data->currentMV[0].x > f_range[1]) Data->currentMV[0].x = f_range[1]; |
718 |
if (Data->currentMV[0].x < f_range[0]) Data->currentMV[0].x = f_range[0]; |
if (Data->currentMV[0].x < f_range[0]) Data->currentMV[0].x = f_range[0]; |
741 |
int i, j; |
int i, j; |
742 |
int b_range[4], f_range[4]; |
int b_range[4], f_range[4]; |
743 |
|
|
744 |
get_range(f_range, f_range+1, f_range+2, f_range+3, x, y, 4, pParam->width, pParam->height, Data->iFcode - Data->qpel, 1, 0); |
get_range(f_range, f_range+1, f_range+2, f_range+3, x, y, 4, pParam->width, pParam->height, Data->iFcode - Data->qpel, 1); |
745 |
get_range(b_range, b_range+1, b_range+2, b_range+3, x, y, 4, pParam->width, pParam->height, Data->bFcode - Data->qpel, 1, 0); |
get_range(b_range, b_range+1, b_range+2, b_range+3, x, y, 4, pParam->width, pParam->height, Data->bFcode - Data->qpel, 1); |
746 |
|
|
747 |
/* diamond */ |
/* diamond */ |
748 |
do { |
do { |
772 |
if (Data->qpel) { |
if (Data->qpel) { |
773 |
Data->qpel_precision = 1; |
Data->qpel_precision = 1; |
774 |
get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, |
get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, |
775 |
x, y, 4, pParam->width, pParam->height, Data->iFcode, 2, 0); |
x, y, 4, pParam->width, pParam->height, Data->iFcode, 2); |
776 |
|
|
777 |
Data->currentQMV[0].x = 2 * Data->currentMV[0].x; |
Data->currentQMV[0].x = 2 * Data->currentMV[0].x; |
778 |
Data->currentQMV[0].y = 2 * Data->currentMV[0].y; |
Data->currentQMV[0].y = 2 * Data->currentMV[0].y; |
783 |
xvid_me_SubpelRefine(Data->currentQMV[0], Data, CheckCandidateInt, 1); |
xvid_me_SubpelRefine(Data->currentQMV[0], Data, CheckCandidateInt, 1); |
784 |
|
|
785 |
get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, |
get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, |
786 |
x, y, 4, pParam->width, pParam->height, Data->bFcode, 2, 0); |
x, y, 4, pParam->width, pParam->height, Data->bFcode, 2); |
787 |
|
|
788 |
xvid_me_SubpelRefine(Data->currentQMV[1], Data, CheckCandidateInt, 2); |
xvid_me_SubpelRefine(Data->currentQMV[1], Data, CheckCandidateInt, 2); |
789 |
} |
} |