55 |
interpolate8x8_halfpel_hv |
interpolate8x8_halfpel_hv |
56 |
}; |
}; |
57 |
|
|
58 |
|
if (data->chromaX == fx && data->chromaY == fy && |
59 |
|
data->b_chromaX == bx && data->b_chromaY == by) |
60 |
|
return data->chromaSAD; |
61 |
|
|
62 |
offset = (fx>>1) + (fy>>1)*stride; |
offset = (fx>>1) + (fy>>1)*stride; |
63 |
filter = ((fx & 1) << 1) | (fy & 1); |
filter = ((fx & 1) << 1) | (fy & 1); |
64 |
|
|
65 |
if (filter != 0) { |
if (filter != 0) { |
66 |
f_refu = data->RefQ; |
f_refu = data->RefQ; |
67 |
f_refv = data->RefQ + 8; |
f_refv = data->RefQ + 8; |
68 |
|
if (data->chromaX != fx || data->chromaY != fy) { |
69 |
interpolate8x8_halfpel[filter](f_refu, data->RefP[4] + offset, stride, data->rounding); |
interpolate8x8_halfpel[filter](f_refu, data->RefP[4] + offset, stride, data->rounding); |
70 |
interpolate8x8_halfpel[filter](f_refv, data->RefP[5] + offset, stride, data->rounding); |
interpolate8x8_halfpel[filter](f_refv, data->RefP[5] + offset, stride, data->rounding); |
71 |
|
} |
72 |
} else { |
} else { |
73 |
f_refu = (uint8_t*)data->RefP[4] + offset; |
f_refu = (uint8_t*)data->RefP[4] + offset; |
74 |
f_refv = (uint8_t*)data->RefP[5] + offset; |
f_refv = (uint8_t*)data->RefP[5] + offset; |
75 |
} |
} |
76 |
|
data->chromaX = fx; data->chromaY = fy; |
77 |
|
|
78 |
offset = (bx>>1) + (by>>1)*stride; |
offset = (bx>>1) + (by>>1)*stride; |
79 |
filter = ((bx & 1) << 1) | (by & 1); |
filter = ((bx & 1) << 1) | (by & 1); |
81 |
if (filter != 0) { |
if (filter != 0) { |
82 |
b_refu = data->RefQ + 16; |
b_refu = data->RefQ + 16; |
83 |
b_refv = data->RefQ + 24; |
b_refv = data->RefQ + 24; |
84 |
|
if (data->b_chromaX != bx || data->b_chromaY != by) { |
85 |
interpolate8x8_halfpel[filter](b_refu, data->b_RefP[4] + offset, stride, data->rounding); |
interpolate8x8_halfpel[filter](b_refu, data->b_RefP[4] + offset, stride, data->rounding); |
86 |
interpolate8x8_halfpel[filter](b_refv, data->b_RefP[5] + offset, stride, data->rounding); |
interpolate8x8_halfpel[filter](b_refv, data->b_RefP[5] + offset, stride, data->rounding); |
87 |
|
} |
88 |
} else { |
} else { |
89 |
b_refu = (uint8_t*)data->b_RefP[4] + offset; |
b_refu = (uint8_t*)data->b_RefP[4] + offset; |
90 |
b_refv = (uint8_t*)data->b_RefP[5] + offset; |
b_refv = (uint8_t*)data->b_RefP[5] + offset; |
91 |
} |
} |
92 |
|
data->b_chromaX = bx; data->b_chromaY = by; |
93 |
|
|
94 |
sad = sad8bi(data->CurU, b_refu, f_refu, stride); |
sad = sad8bi(data->CurU, b_refu, f_refu, stride); |
95 |
sad += sad8bi(data->CurV, b_refv, f_refv, stride); |
sad += sad8bi(data->CurV, b_refv, f_refv, stride); |
96 |
|
|
97 |
|
data->chromaSAD = sad; |
98 |
return sad; |
return sad; |
99 |
} |
} |
100 |
|
|
197 |
ReferenceF = xvid_me_interpolate8x8qpel(mvs.x, mvs.y, k, 0, data); |
ReferenceF = xvid_me_interpolate8x8qpel(mvs.x, mvs.y, k, 0, data); |
198 |
ReferenceB = xvid_me_interpolate8x8qpel(b_mvs.x, b_mvs.y, k, 1, data); |
ReferenceB = xvid_me_interpolate8x8qpel(b_mvs.x, b_mvs.y, k, 1, data); |
199 |
|
|
200 |
sad += sad8bi(data->Cur + 8*(k&1) + 8*(k>>1)*(data->iEdgedWidth), |
sad += data->iMinSAD[k+1] = |
201 |
|
sad8bi(data->Cur + 8*(k&1) + 8*(k>>1)*(data->iEdgedWidth), |
202 |
ReferenceF, ReferenceB, data->iEdgedWidth); |
ReferenceF, ReferenceB, data->iEdgedWidth); |
203 |
if (sad > *(data->iMinSAD)) return; |
if (sad > *(data->iMinSAD)) return; |
204 |
} |
} |
570 |
Data->max_dy = k * (pParam->height - y * 16); |
Data->max_dy = k * (pParam->height - y * 16); |
571 |
Data->min_dx = -k * (16 + x * 16); |
Data->min_dx = -k * (16 + x * 16); |
572 |
Data->min_dy = -k * (16 + y * 16); |
Data->min_dy = -k * (16 + y * 16); |
573 |
|
Data->chromaX = Data->chromaY = Data->b_chromaX = Data->b_chromaY = 256*4096; |
574 |
|
|
575 |
Data->referencemv = Data->qpel ? b_mb->qmvs : b_mb->mvs; |
Data->referencemv = Data->qpel ? b_mb->qmvs : b_mb->mvs; |
576 |
Data->qpel_precision = 0; |
Data->qpel_precision = 0; |
598 |
} |
} |
599 |
} |
} |
600 |
|
|
601 |
CheckCandidate = b_mb->mode == MODE_INTER4V ? CheckCandidateDirect : CheckCandidateDirectno4v; |
CheckCandidateDirect(0, 0, Data, 255); /* will also fill iMinSAD[1..4] with 8x8 SADs */ |
|
|
|
|
CheckCandidate(0, 0, Data, 255); |
|
602 |
|
|
603 |
/* initial (fast) skip decision */ |
/* initial (fast) skip decision */ |
604 |
if (*Data->iMinSAD < (int)Data->iQuant * INITIAL_SKIP_THRESH) { |
if (Data->iMinSAD[1] < (int)Data->iQuant * INITIAL_SKIP_THRESH |
605 |
|
&& Data->iMinSAD[2] < (int)Data->iQuant * INITIAL_SKIP_THRESH |
606 |
|
&& Data->iMinSAD[3] < (int)Data->iQuant * INITIAL_SKIP_THRESH |
607 |
|
&& Data->iMinSAD[4] < (int)Data->iQuant * INITIAL_SKIP_THRESH) { |
608 |
/* possible skip */ |
/* possible skip */ |
609 |
SkipDecisionB(pCur, f_Ref, b_Ref, pMB, x, y, Data); |
SkipDecisionB(pCur, f_Ref, b_Ref, pMB, x, y, Data); |
610 |
if (pMB->mode == MODE_DIRECT_NONE_MV) return *Data->iMinSAD; /* skipped */ |
if (pMB->mode == MODE_DIRECT_NONE_MV) |
611 |
|
return *Data->iMinSAD; /* skipped */ |
612 |
} |
} |
613 |
|
|
614 |
*Data->iMinSAD += Data->lambda16; |
skip_sad = 4*MAX(MAX(Data->iMinSAD[1],Data->iMinSAD[2]), MAX(Data->iMinSAD[3],Data->iMinSAD[4])); |
615 |
skip_sad = *Data->iMinSAD; |
if (Data->chroma) skip_sad += Data->chromaSAD; |
616 |
|
|
617 |
|
CheckCandidate = b_mb->mode == MODE_INTER4V ? CheckCandidateDirect : CheckCandidateDirectno4v; |
618 |
|
|
619 |
if (!(MotionFlags & XVID_ME_SKIP_DELTASEARCH)) { |
if (!(MotionFlags & XVID_ME_SKIP_DELTASEARCH)) { |
620 |
if (MotionFlags & XVID_ME_USESQUARES16) MainSearchPtr = xvid_me_SquareSearch; |
if (MotionFlags & XVID_ME_USESQUARES16) MainSearchPtr = xvid_me_SquareSearch; |
626 |
xvid_me_SubpelRefine(Data, CheckCandidate, 0); |
xvid_me_SubpelRefine(Data, CheckCandidate, 0); |
627 |
} |
} |
628 |
|
|
629 |
|
*Data->iMinSAD += Data->lambda16; |
630 |
*best_sad = *Data->iMinSAD; |
*best_sad = *Data->iMinSAD; |
631 |
|
|
632 |
if (Data->qpel || b_mb->mode == MODE_INTER4V) pMB->mode = MODE_DIRECT; |
if (Data->qpel || b_mb->mode == MODE_INTER4V) pMB->mode = MODE_DIRECT; |
715 |
Data->b_RefP[4] = b_Ref->u + (x + (Data->iEdgedWidth/2) * y) * 8; |
Data->b_RefP[4] = b_Ref->u + (x + (Data->iEdgedWidth/2) * y) * 8; |
716 |
Data->b_RefP[5] = b_Ref->v + (x + (Data->iEdgedWidth/2) * y) * 8; |
Data->b_RefP[5] = b_Ref->v + (x + (Data->iEdgedWidth/2) * y) * 8; |
717 |
|
|
718 |
|
Data->chromaX = Data->chromaY = 256*4096; |
719 |
|
|
720 |
Data->predMV = *f_predMV; |
Data->predMV = *f_predMV; |
721 |
Data->bpredMV = *b_predMV; |
Data->bpredMV = *b_predMV; |
722 |
|
|
968 |
} |
} |
969 |
|
|
970 |
/* final skip decision */ |
/* final skip decision */ |
971 |
if ( (skip_sad < Data.iQuant * MAX_SAD00_FOR_SKIP * (Data.chroma ? 3:2) ) |
if ( (skip_sad < Data.iQuant * MAX_SAD00_FOR_SKIP ) |
972 |
&& ((100*best_sad)/(skip_sad+1) > FINAL_SKIP_THRESH) ) |
&& ((100*best_sad)/(skip_sad+1) > FINAL_SKIP_THRESH) ) |
973 |
|
|
974 |
SkipDecisionB(&frame->image, f_ref, b_ref, pMB, i, j, &Data); |
SkipDecisionB(&frame->image, f_ref, b_ref, pMB, i, j, &Data); |