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_pvop.c,v 1.1.2.9 2003-11-30 16:13:16 edgomez Exp $ |
* $Id: estimation_pvop.c,v 1.1.2.11 2003-12-18 02:02:08 Isibaar Exp $ |
25 |
* |
* |
26 |
****************************************************************************/ |
****************************************************************************/ |
27 |
|
|
207 |
data->iMinSAD[4] = data->temp[3]; data->currentMV[4].x = x; data->currentMV[4].y = y; } |
data->iMinSAD[4] = data->temp[3]; data->currentMV[4].x = x; data->currentMV[4].y = y; } |
208 |
} |
} |
209 |
|
|
|
static void |
|
|
SubpelRefine_Fast(SearchData * data, CheckFunc * CheckCandidate) |
|
|
{ |
|
|
/* Do a fast q-pel refinement */ |
|
|
VECTOR centerMV; |
|
|
VECTOR second_best; |
|
|
int best_sad = *data->iMinSAD; |
|
|
int xo, yo, xo2, yo2; |
|
|
int size = 2; |
|
|
data->iMinSAD2 = 0; |
|
|
|
|
|
/* check all halfpixel positions near our best halfpel position */ |
|
|
centerMV = *data->currentQMV; |
|
|
*data->iMinSAD = 256 * 4096; |
|
|
|
|
|
CHECK_CANDIDATE(centerMV.x, centerMV.y - size, 0); |
|
|
CHECK_CANDIDATE(centerMV.x + size, centerMV.y - size, 0); |
|
|
CHECK_CANDIDATE(centerMV.x + size, centerMV.y, 0); |
|
|
CHECK_CANDIDATE(centerMV.x + size, centerMV.y + size, 0); |
|
|
|
|
|
CHECK_CANDIDATE(centerMV.x, centerMV.y + size, 0); |
|
|
CHECK_CANDIDATE(centerMV.x - size, centerMV.y + size, 0); |
|
|
CHECK_CANDIDATE(centerMV.x - size, centerMV.y, 0); |
|
|
CHECK_CANDIDATE(centerMV.x - size, centerMV.y - size, 0); |
|
|
|
|
|
second_best = *data->currentQMV; |
|
|
|
|
|
/* after second_best has been found, go back to the vector we began with */ |
|
|
|
|
|
data->currentQMV[0] = centerMV; |
|
|
*data->iMinSAD = best_sad; |
|
|
|
|
|
xo = centerMV.x; |
|
|
yo = centerMV.y; |
|
|
xo2 = second_best.x; |
|
|
yo2 = second_best.y; |
|
|
|
|
|
data->iMinSAD2 = 256 * 4096; |
|
|
|
|
|
if (yo == yo2) { |
|
|
CHECK_CANDIDATE((xo+xo2)>>1, yo, 0); |
|
|
CHECK_CANDIDATE(xo, yo-1, 0); |
|
|
CHECK_CANDIDATE(xo, yo+1, 0); |
|
|
|
|
|
if(best_sad <= data->iMinSAD2) return; |
|
|
|
|
|
if(data->currentQMV[0].x == data->currentQMV2.x) { |
|
|
CHECK_CANDIDATE((xo+xo2)>>1, yo-1, 0); |
|
|
CHECK_CANDIDATE((xo+xo2)>>1, yo+1, 0); |
|
|
} else { |
|
|
CHECK_CANDIDATE((xo+xo2)>>1, |
|
|
(data->currentQMV[0].x == xo) ? data->currentQMV[0].y : data->currentQMV2.y, 0); |
|
|
} |
|
|
return; |
|
|
} |
|
|
|
|
|
if (xo == xo2) { |
|
|
CHECK_CANDIDATE(xo, (yo+yo2)>>1, 0); |
|
|
CHECK_CANDIDATE(xo-1, yo, 0); |
|
|
CHECK_CANDIDATE(xo+1, yo, 0); |
|
|
|
|
|
if(best_sad < data->iMinSAD2) return; |
|
|
|
|
|
if(data->currentQMV[0].y == data->currentQMV2.y) { |
|
|
CHECK_CANDIDATE(xo-1, (yo+yo2)>>1, 0); |
|
|
CHECK_CANDIDATE(xo+1, (yo+yo2)>>1, 0); |
|
|
} else { |
|
|
CHECK_CANDIDATE((data->currentQMV[0].y == yo) ? data->currentQMV[0].x : data->currentQMV2.x, (yo+yo2)>>1, 0); |
|
|
} |
|
|
return; |
|
|
} |
|
|
|
|
|
CHECK_CANDIDATE(xo, (yo+yo2)>>1, 0); |
|
|
CHECK_CANDIDATE((xo+xo2)>>1, yo, 0); |
|
|
|
|
|
if(best_sad <= data->iMinSAD2) return; |
|
|
|
|
|
CHECK_CANDIDATE((xo+xo2)>>1, (yo+yo2)>>1, 0); |
|
|
} |
|
|
|
|
210 |
int |
int |
211 |
xvid_me_SkipDecisionP(const IMAGE * current, const IMAGE * reference, |
xvid_me_SkipDecisionP(const IMAGE * current, const IMAGE * reference, |
212 |
const int x, const int y, |
const int x, const int y, |
399 |
|
|
400 |
/* intra decision */ |
/* intra decision */ |
401 |
|
|
402 |
if (iQuant > 8) InterBias += 100 * (iQuant - 8); /* to make high quants work */ |
if (iQuant > 10) InterBias += 60 * (iQuant - 10); /* to make high quants work */ |
403 |
if (y != 0) |
if (y != 0) |
404 |
if ((pMB - pParam->mb_width)->mode == MODE_INTRA ) InterBias -= 80; |
if ((pMB - pParam->mb_width)->mode == MODE_INTRA ) InterBias -= 80; |
405 |
if (x != 0) |
if (x != 0) |
718 |
bSAD = Data->iMinSAD[0]; Data->iMinSAD[0] = MV_MAX_ERROR; |
bSAD = Data->iMinSAD[0]; Data->iMinSAD[0] = MV_MAX_ERROR; |
719 |
|
|
720 |
CheckCandidate(startMV.x, startMV.y, Data, 255); |
CheckCandidate(startMV.x, startMV.y, Data, 255); |
721 |
MainSearchPtr(startMV.x, startMV.y, Data, 255, CheckCandidate); |
xvid_me_DiamondSearch(startMV.x, startMV.y, Data, 255, CheckCandidate); |
722 |
if (bSAD < Data->iMinSAD[0]) { |
if (bSAD < Data->iMinSAD[0]) { |
723 |
Data->currentMV[0] = backupMV; |
Data->currentMV[0] = backupMV; |
724 |
Data->iMinSAD[0] = bSAD; } |
Data->iMinSAD[0] = bSAD; } |
730 |
bSAD = Data->iMinSAD[0]; Data->iMinSAD[0] = MV_MAX_ERROR; |
bSAD = Data->iMinSAD[0]; Data->iMinSAD[0] = MV_MAX_ERROR; |
731 |
|
|
732 |
CheckCandidate(startMV.x, startMV.y, Data, 255); |
CheckCandidate(startMV.x, startMV.y, Data, 255); |
733 |
MainSearchPtr(startMV.x, startMV.y, Data, 255, CheckCandidate); |
xvid_me_DiamondSearch(startMV.x, startMV.y, Data, 255, CheckCandidate); |
734 |
if (bSAD < Data->iMinSAD[0]) { |
if (bSAD < Data->iMinSAD[0]) { |
735 |
Data->currentMV[0] = backupMV; |
Data->currentMV[0] = backupMV; |
736 |
Data->iMinSAD[0] = bSAD; |
Data->iMinSAD[0] = bSAD; |