522 |
{ |
{ |
523 |
int k; |
int k; |
524 |
|
|
|
pMB->mode = MODE_DIRECT; /* just to initialize it */ |
|
|
|
|
525 |
if (!Data->chroma) { |
if (!Data->chroma) { |
526 |
int dx = 0, dy = 0, b_dx = 0, b_dy = 0; |
int dx = 0, dy = 0, b_dx = 0, b_dy = 0; |
527 |
int32_t sum; |
int32_t sum; |
564 |
for (k = 0; k < 4; k++) { |
for (k = 0; k < 4; k++) { |
565 |
pMB->qmvs[k] = pMB->mvs[k] = Data->directmvF[k]; |
pMB->qmvs[k] = pMB->mvs[k] = Data->directmvF[k]; |
566 |
pMB->b_qmvs[k] = pMB->b_mvs[k] = Data->directmvB[k]; |
pMB->b_qmvs[k] = pMB->b_mvs[k] = Data->directmvB[k]; |
567 |
|
if (Data->qpel) { |
568 |
|
pMB->mvs[k].x /= 2; pMB->mvs[k].y /= 2; /* it's a hint for future searches */ |
569 |
|
pMB->b_mvs[k].x /= 2; pMB->b_mvs[k].y /= 2; |
570 |
|
} |
571 |
} |
} |
572 |
} |
} |
573 |
|
|
627 |
return *Data->iMinSAD; /* skipped */ |
return *Data->iMinSAD; /* skipped */ |
628 |
} |
} |
629 |
|
|
630 |
|
if (Data->chroma && Data->chromaSAD >= MAX_CHROMA_SAD_FOR_SKIP * (int)Data->iQuant) /* chroma doesn't allow skip */ |
631 |
|
skip_sad = 256*4096; |
632 |
|
else |
633 |
skip_sad = 4*MAX(MAX(Data->iMinSAD[1],Data->iMinSAD[2]), MAX(Data->iMinSAD[3],Data->iMinSAD[4])); |
skip_sad = 4*MAX(MAX(Data->iMinSAD[1],Data->iMinSAD[2]), MAX(Data->iMinSAD[3],Data->iMinSAD[4])); |
|
if (Data->chroma) skip_sad += Data->chromaSAD; |
|
634 |
|
|
635 |
Data->currentMV[1].x = Data->directmvF[0].x + Data->currentMV->x; /* hints for forward and backward searches */ |
Data->currentMV[1].x = Data->directmvF[0].x + Data->currentMV->x; /* hints for forward and backward searches */ |
636 |
Data->currentMV[1].y = Data->directmvF[0].y + Data->currentMV->y; |
Data->currentMV[1].y = Data->directmvF[0].y + Data->currentMV->y; |
937 |
const IMAGE * const b_refHV) |
const IMAGE * const b_refHV) |
938 |
{ |
{ |
939 |
uint32_t i, j; |
uint32_t i, j; |
940 |
int32_t best_sad, sad2; |
int32_t best_sad = 256*4096; |
941 |
|
int32_t sad2; |
942 |
uint32_t skip_sad; |
uint32_t skip_sad; |
943 |
|
|
944 |
const MACROBLOCK * const b_mbs = b_reference->mbs; |
const MACROBLOCK * const b_mbs = b_reference->mbs; |
1030 |
if ((Data_d.iMinSAD[0] <= 2*best_sad) && (!frame->motion_flags&XVID_ME_SKIP_DELTASEARCH)) |
if ((Data_d.iMinSAD[0] <= 2*best_sad) && (!frame->motion_flags&XVID_ME_SKIP_DELTASEARCH)) |
1031 |
SearchDirect_final(frame->motion_flags, b_mb, &best_sad, &Data_d); |
SearchDirect_final(frame->motion_flags, b_mb, &best_sad, &Data_d); |
1032 |
|
|
|
|
|
1033 |
/* final skip decision */ |
/* final skip decision */ |
1034 |
if ( (skip_sad < Data_d.iQuant * MAX_SAD00_FOR_SKIP ) |
if ( (skip_sad < 2 * Data_d.iQuant * MAX_SAD00_FOR_SKIP ) |
1035 |
&& ((100*best_sad)/(skip_sad+1) > FINAL_SKIP_THRESH) ) { |
&& ((100*best_sad)/(skip_sad+1) > FINAL_SKIP_THRESH) ) { |
1036 |
|
|
1037 |
|
Data_d.chromaSAD = 0; /* green light for chroma check */ |
1038 |
|
|
1039 |
SkipDecisionB(pMB, &Data_d); |
SkipDecisionB(pMB, &Data_d); |
1040 |
|
|
1041 |
if (pMB->mode == MODE_DIRECT_NONE_MV) { /* skipped? */ |
if (pMB->mode == MODE_DIRECT_NONE_MV) { /* skipped? */ |
1042 |
pMB->sad16 = best_sad; |
pMB->sad16 = skip_sad; |
1043 |
continue; |
continue; |
1044 |
} |
} |
1045 |
} |
} |