20 |
* along with this program ; if not, write to the Free Software |
* along with this program ; if not, write to the Free Software |
21 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
22 |
* |
* |
23 |
* $Id: estimation_rd_based.c,v 1.1.2.2 2003-09-28 16:12:32 syskin Exp $ |
* $Id: estimation_rd_based.c,v 1.1.2.7 2003-10-07 13:02:35 edgomez Exp $ |
24 |
* |
* |
25 |
****************************************************************************/ |
****************************************************************************/ |
26 |
|
|
40 |
#include "motion.h" |
#include "motion.h" |
41 |
#include "sad.h" |
#include "sad.h" |
42 |
#include "../bitstream/zigzag.h" |
#include "../bitstream/zigzag.h" |
43 |
#include "../quant/quant_mpeg4.h" |
#include "../quant/quant.h" |
|
#include "../quant/quant_h263.h" |
|
44 |
#include "../bitstream/vlc_codes.h" |
#include "../bitstream/vlc_codes.h" |
45 |
#include "../dct/fdct.h" |
#include "../dct/fdct.h" |
46 |
#include "motion_inlines.h" |
#include "motion_inlines.h" |
54 |
int16_t * const dqcoeff, |
int16_t * const dqcoeff, |
55 |
const uint32_t quant, const int quant_type, |
const uint32_t quant, const int quant_type, |
56 |
uint32_t * cbp, |
uint32_t * cbp, |
57 |
const int block) |
const int block, |
58 |
|
const uint16_t * scan_table) |
59 |
{ |
{ |
60 |
int sum; |
int sum; |
61 |
int bits; |
int bits; |
64 |
|
|
65 |
fdct(data); |
fdct(data); |
66 |
|
|
67 |
if (quant_type) sum = quant_inter(coeff, data, quant); |
if (quant_type) sum = quant_h263_inter(coeff, data, quant); |
68 |
else sum = quant4_inter(coeff, data, quant); |
else sum = quant_mpeg_inter(coeff, data, quant); |
69 |
|
|
70 |
if (sum > 0) { |
if (sum > 0) { |
71 |
*cbp |= 1 << (5 - block); |
*cbp |= 1 << (5 - block); |
72 |
bits = BITS_MULT * CodeCoeffInter_CalcBits(coeff, scan_tables[0]); |
bits = BITS_MULT * CodeCoeffInter_CalcBits(coeff, scan_table); |
73 |
|
|
74 |
if (quant_type) dequant_inter(dqcoeff, coeff, quant); |
if (quant_type) dequant_h263_inter(dqcoeff, coeff, quant); |
75 |
else dequant4_inter(dqcoeff, coeff, quant); |
else dequant_mpeg_inter(dqcoeff, coeff, quant); |
76 |
|
|
77 |
for (i = 0; i < 64; i++) |
for (i = 0; i < 64; i++) |
78 |
distortion += (data[i] - dqcoeff[i])*(data[i] - dqcoeff[i]); |
distortion += (data[i] - dqcoeff[i])*(data[i] - dqcoeff[i]); |
93 |
const uint32_t quant, const int quant_type, |
const uint32_t quant, const int quant_type, |
94 |
uint32_t * cbp, |
uint32_t * cbp, |
95 |
const int block, |
const int block, |
96 |
int * dcpred) |
int * dcpred, |
97 |
|
const uint16_t * scan_table) |
98 |
{ |
{ |
99 |
int bits, i; |
int bits, i; |
100 |
int distortion = 0; |
int distortion = 0; |
104 |
fdct(data); |
fdct(data); |
105 |
data[0] -= 1024; |
data[0] -= 1024; |
106 |
|
|
107 |
if (quant_type) quant_intra(coeff, data, quant, iDcScaler); |
if (quant_type) quant_h263_intra(coeff, data, quant, iDcScaler); |
108 |
else quant4_intra(coeff, data, quant, iDcScaler); |
else quant_mpeg_intra(coeff, data, quant, iDcScaler); |
109 |
|
|
110 |
b_dc = coeff[0]; |
b_dc = coeff[0]; |
111 |
if (block < 4) { |
if (block < 4) { |
113 |
*dcpred = b_dc; |
*dcpred = b_dc; |
114 |
} |
} |
115 |
|
|
116 |
bits = BITS_MULT*CodeCoeffIntra_CalcBits(coeff, scan_tables[0]); |
bits = BITS_MULT*CodeCoeffIntra_CalcBits(coeff, scan_table); |
117 |
if (bits != 0) *cbp |= 1 << (5 - block); |
if (bits != 0) *cbp |= 1 << (5 - block); |
118 |
|
|
119 |
if (block < 4) bits += BITS_MULT*dcy_tab[coeff[0] + 255].len; |
if (block < 4) bits += BITS_MULT*dcy_tab[coeff[0] + 255].len; |
120 |
else bits += BITS_MULT*dcc_tab[coeff[0] + 255].len; |
else bits += BITS_MULT*dcc_tab[coeff[0] + 255].len; |
121 |
|
|
122 |
coeff[0] = b_dc; |
coeff[0] = b_dc; |
123 |
if (quant_type) dequant_intra(dqcoeff, coeff, quant, iDcScaler); |
if (quant_type) dequant_h263_intra(dqcoeff, coeff, quant, iDcScaler); |
124 |
else dequant4_intra(dqcoeff, coeff, quant, iDcScaler); |
else dequant_mpeg_intra(dqcoeff, coeff, quant, iDcScaler); |
125 |
|
|
126 |
for (i = 0; i < 64; i++) |
for (i = 0; i < 64; i++) |
127 |
distortion += (data[i] - dqcoeff[i])*(data[i] - dqcoeff[i]); |
distortion += (data[i] - dqcoeff[i])*(data[i] - dqcoeff[i]); |
155 |
for(i = 0; i < 4; i++) { |
for(i = 0; i < 4; i++) { |
156 |
int s = 8*((i&1) + (i>>1)*data->iEdgedWidth); |
int s = 8*((i&1) + (i>>1)*data->iEdgedWidth); |
157 |
transfer_8to16subro(in, data->Cur + s, ptr + s, data->iEdgedWidth); |
transfer_8to16subro(in, data->Cur + s, ptr + s, data->iEdgedWidth); |
158 |
rd += data->temp[i] = Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, i); |
rd += data->temp[i] = Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, i, data->scan_table); |
159 |
} |
} |
160 |
|
|
161 |
rd += t = BITS_MULT*d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision, 0); |
rd += t = BITS_MULT*d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision, 0); |
180 |
/* chroma U */ |
/* chroma U */ |
181 |
ptr = interpolate8x8_switch2(data->RefQ, data->RefP[4], 0, 0, xc, yc, data->iEdgedWidth/2, data->rounding); |
ptr = interpolate8x8_switch2(data->RefQ, data->RefP[4], 0, 0, xc, yc, data->iEdgedWidth/2, data->rounding); |
182 |
transfer_8to16subro(in, data->CurU, ptr, data->iEdgedWidth/2); |
transfer_8to16subro(in, data->CurU, ptr, data->iEdgedWidth/2); |
183 |
rd += Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 4); |
rd += Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 4, data->scan_table); |
184 |
if (rd >= data->iMinSAD[0]) return; |
if (rd >= data->iMinSAD[0]) return; |
185 |
|
|
186 |
/* chroma V */ |
/* chroma V */ |
187 |
ptr = interpolate8x8_switch2(data->RefQ, data->RefP[5], 0, 0, xc, yc, data->iEdgedWidth/2, data->rounding); |
ptr = interpolate8x8_switch2(data->RefQ, data->RefP[5], 0, 0, xc, yc, data->iEdgedWidth/2, data->rounding); |
188 |
transfer_8to16subro(in, data->CurV, ptr, data->iEdgedWidth/2); |
transfer_8to16subro(in, data->CurV, ptr, data->iEdgedWidth/2); |
189 |
rd += Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 5); |
rd += Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 5, data->scan_table); |
190 |
|
|
191 |
rd += BITS_MULT*mcbpc_inter_tab[(MODE_INTER & 7) | ((cbp & 3) << 3)].len; |
rd += BITS_MULT*mcbpc_inter_tab[(MODE_INTER & 7) | ((cbp & 3) << 3)].len; |
192 |
|
|
220 |
} |
} |
221 |
|
|
222 |
transfer_8to16subro(in, data->Cur, ptr, data->iEdgedWidth); |
transfer_8to16subro(in, data->Cur, ptr, data->iEdgedWidth); |
223 |
rd = Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 5); |
rd = Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 5, data->scan_table); |
224 |
rd += BITS_MULT*d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision, 0); |
rd += BITS_MULT*d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision, 0); |
225 |
|
|
226 |
if (rd < data->iMinSAD[0]) { |
if (rd < data->iMinSAD[0]) { |
319 |
Data8->RefP[2] = Data->RefP[2] + 8*((i&1) + (i>>1)*Data->iEdgedWidth); |
Data8->RefP[2] = Data->RefP[2] + 8*((i&1) + (i>>1)*Data->iEdgedWidth); |
320 |
Data8->RefP[1] = Data->RefP[1] + 8*((i&1) + (i>>1)*Data->iEdgedWidth); |
Data8->RefP[1] = Data->RefP[1] + 8*((i&1) + (i>>1)*Data->iEdgedWidth); |
321 |
Data8->RefP[3] = Data->RefP[3] + 8*((i&1) + (i>>1)*Data->iEdgedWidth); |
Data8->RefP[3] = Data->RefP[3] + 8*((i&1) + (i>>1)*Data->iEdgedWidth); |
322 |
*Data8->cbp = (Data->cbp[1] & (1<<(5-i))) ? 1:0; // copy corresponding cbp bit |
*Data8->cbp = (Data->cbp[1] & (1<<(5-i))) ? 1:0; /* copy corresponding cbp bit */ |
323 |
|
|
324 |
if(Data->qpel) { |
if(Data->qpel) { |
325 |
Data8->predMV = get_qpmv2(pMBs, pParam->mb_width, 0, x, y, i); |
Data8->predMV = get_qpmv2(pMBs, pParam->mb_width, 0, x, y, i); |
422 |
/* chroma U */ |
/* chroma U */ |
423 |
ptr = interpolate8x8_switch2(Data->RefQ + 64, Data->RefP[4], 0, 0, sumx, sumy, Data->iEdgedWidth/2, Data->rounding); |
ptr = interpolate8x8_switch2(Data->RefQ + 64, Data->RefP[4], 0, 0, sumx, sumy, Data->iEdgedWidth/2, Data->rounding); |
424 |
transfer_8to16subro(in, Data->CurU, ptr, Data->iEdgedWidth/2); |
transfer_8to16subro(in, Data->CurU, ptr, Data->iEdgedWidth/2); |
425 |
bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 4); |
bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 4, Data->scan_table); |
426 |
|
|
427 |
if (bits >= *Data->iMinSAD) return bits; |
if (bits >= *Data->iMinSAD) return bits; |
428 |
|
|
429 |
/* chroma V */ |
/* chroma V */ |
430 |
ptr = interpolate8x8_switch2(Data->RefQ + 64, Data->RefP[5], 0, 0, sumx, sumy, Data->iEdgedWidth/2, Data->rounding); |
ptr = interpolate8x8_switch2(Data->RefQ + 64, Data->RefP[5], 0, 0, sumx, sumy, Data->iEdgedWidth/2, Data->rounding); |
431 |
transfer_8to16subro(in, Data->CurV, ptr, Data->iEdgedWidth/2); |
transfer_8to16subro(in, Data->CurV, ptr, Data->iEdgedWidth/2); |
432 |
bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 5); |
bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 5, Data->scan_table); |
433 |
|
|
434 |
bits += BITS_MULT*mcbpc_inter_tab[(MODE_INTER4V & 7) | ((cbp & 3) << 3)].len; |
bits += BITS_MULT*mcbpc_inter_tab[(MODE_INTER4V & 7) | ((cbp & 3) << 3)].len; |
435 |
|
|
447 |
for(i = 0; i < 4; i++) { |
for(i = 0; i < 4; i++) { |
448 |
int s = 8*((i&1) + (i>>1)*Data->iEdgedWidth); |
int s = 8*((i&1) + (i>>1)*Data->iEdgedWidth); |
449 |
transfer_8to16copy(in, Data->Cur + s, Data->iEdgedWidth); |
transfer_8to16copy(in, Data->Cur + s, Data->iEdgedWidth); |
450 |
bits += Block_CalcBitsIntra(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, i, &dc); |
bits += Block_CalcBitsIntra(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, i, &dc, Data->scan_table); |
451 |
|
|
452 |
if (bits >= Data->iMinSAD[0]) return bits; |
if (bits >= Data->iMinSAD[0]) return bits; |
453 |
} |
} |
456 |
|
|
457 |
/*chroma U */ |
/*chroma U */ |
458 |
transfer_8to16copy(in, Data->CurU, Data->iEdgedWidth/2); |
transfer_8to16copy(in, Data->CurU, Data->iEdgedWidth/2); |
459 |
bits += Block_CalcBitsIntra(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 4, &dc); |
bits += Block_CalcBitsIntra(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 4, &dc, Data->scan_table); |
460 |
|
|
461 |
if (bits >= Data->iMinSAD[0]) return bits; |
if (bits >= Data->iMinSAD[0]) return bits; |
462 |
|
|
463 |
/* chroma V */ |
/* chroma V */ |
464 |
transfer_8to16copy(in, Data->CurV, Data->iEdgedWidth/2); |
transfer_8to16copy(in, Data->CurV, Data->iEdgedWidth/2); |
465 |
bits += Block_CalcBitsIntra(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 5, &dc); |
bits += Block_CalcBitsIntra(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 5, &dc, Data->scan_table); |
466 |
|
|
467 |
bits += BITS_MULT*mcbpc_inter_tab[(MODE_INTRA & 7) | ((cbp & 3) << 3)].len; |
bits += BITS_MULT*mcbpc_inter_tab[(MODE_INTRA & 7) | ((cbp & 3) << 3)].len; |
468 |
|
|
479 |
for(i = 0; i < 4; i++) { |
for(i = 0; i < 4; i++) { |
480 |
int s = 8*((i&1) + (i>>1)*Data->iEdgedWidth); |
int s = 8*((i&1) + (i>>1)*Data->iEdgedWidth); |
481 |
transfer_8to16subro(in, Data->Cur + s, vGMC->y + s + 16*(x+y*Data->iEdgedWidth), Data->iEdgedWidth); |
transfer_8to16subro(in, Data->Cur + s, vGMC->y + s + 16*(x+y*Data->iEdgedWidth), Data->iEdgedWidth); |
482 |
bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, i); |
bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, i, Data->scan_table); |
483 |
if (bits >= Data->iMinSAD[0]) return bits; |
if (bits >= Data->iMinSAD[0]) return bits; |
484 |
} |
} |
485 |
|
|
487 |
|
|
488 |
/*chroma U */ |
/*chroma U */ |
489 |
transfer_8to16subro(in, Data->CurU, vGMC->u + 8*(x+y*(Data->iEdgedWidth/2)), Data->iEdgedWidth/2); |
transfer_8to16subro(in, Data->CurU, vGMC->u + 8*(x+y*(Data->iEdgedWidth/2)), Data->iEdgedWidth/2); |
490 |
bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 4); |
bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 4, Data->scan_table); |
491 |
|
|
492 |
if (bits >= Data->iMinSAD[0]) return bits; |
if (bits >= Data->iMinSAD[0]) return bits; |
493 |
|
|
494 |
/* chroma V */ |
/* chroma V */ |
495 |
transfer_8to16subro(in, Data->CurV , vGMC->v + 8*(x+y*(Data->iEdgedWidth/2)), Data->iEdgedWidth/2); |
transfer_8to16subro(in, Data->CurV , vGMC->v + 8*(x+y*(Data->iEdgedWidth/2)), Data->iEdgedWidth/2); |
496 |
bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 5); |
bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 5, Data->scan_table); |
497 |
|
|
498 |
bits += BITS_MULT*mcbpc_inter_tab[(MODE_INTER & 7) | ((cbp & 3) << 3)].len; |
bits += BITS_MULT*mcbpc_inter_tab[(MODE_INTER & 7) | ((cbp & 3) << 3)].len; |
499 |
|
|
525 |
VECTOR backup[5], *v; |
VECTOR backup[5], *v; |
526 |
Data->iQuant = iQuant; |
Data->iQuant = iQuant; |
527 |
Data->cbp = c; |
Data->cbp = c; |
528 |
|
Data->scan_table = VopFlags & XVID_VOP_ALTERNATESCAN ? |
529 |
|
scan_tables[2] : scan_tables[0]; |
530 |
|
|
531 |
pMB->mcsel = 0; |
pMB->mcsel = 0; |
532 |
|
|
589 |
pMB->pmvs[0].y = Data->currentMV[0].y - Data->predMV.y; |
pMB->pmvs[0].y = Data->currentMV[0].y - Data->predMV.y; |
590 |
} |
} |
591 |
|
|
592 |
} else if (mode == MODE_INTER ) { // but mcsel == 1 |
} else if (mode == MODE_INTER ) { /* but mcsel == 1 */ |
593 |
|
|
594 |
pMB->mcsel = 1; |
pMB->mcsel = 1; |
595 |
if (Data->qpel) { |
if (Data->qpel) { |
633 |
int InterBias = MV16_INTER_BIAS; |
int InterBias = MV16_INTER_BIAS; |
634 |
int thresh = 0; |
int thresh = 0; |
635 |
int top = 0, top_right = 0, left = 0; |
int top = 0, top_right = 0, left = 0; |
636 |
|
Data->scan_table = VopFlags & XVID_VOP_ALTERNATESCAN ? |
637 |
|
scan_tables[2] : scan_tables[0]; |
638 |
|
|
639 |
pMB->mcsel = 0; |
pMB->mcsel = 0; |
640 |
|
|
739 |
thresh = 0; |
thresh = 0; |
740 |
|
|
741 |
if((x > 0) && (y > 0) && (x < (int32_t) pParam->mb_width)) { |
if((x > 0) && (y > 0) && (x < (int32_t) pParam->mb_width)) { |
742 |
left = (&pMBs[(x-1) + y * pParam->mb_width])->sad16; // left |
left = (&pMBs[(x-1) + y * pParam->mb_width])->sad16; /* left */ |
743 |
top = (&pMBs[x + (y-1) * pParam->mb_width])->sad16; // top |
top = (&pMBs[x + (y-1) * pParam->mb_width])->sad16; /* top */ |
744 |
top_right = (&pMBs[(x+1) + (y-1) * pParam->mb_width])->sad16; // top right |
top_right = (&pMBs[(x+1) + (y-1) * pParam->mb_width])->sad16; /* top right */ |
745 |
|
|
746 |
if(((&pMBs[(x-1) + y * pParam->mb_width])->mode != MODE_INTRA) && |
if(((&pMBs[(x-1) + y * pParam->mb_width])->mode != MODE_INTRA) && |
747 |
((&pMBs[x + (y-1) * pParam->mb_width])->mode != MODE_INTRA) && |
((&pMBs[x + (y-1) * pParam->mb_width])->mode != MODE_INTRA) && |
849 |
pMB->pmvs[0].y = Data->currentMV[0].y - Data->predMV.y; |
pMB->pmvs[0].y = Data->currentMV[0].y - Data->predMV.y; |
850 |
} |
} |
851 |
|
|
852 |
} else if (mode == MODE_INTER ) { // but mcsel == 1 |
} else if (mode == MODE_INTER ) { /* but mcsel == 1 */ |
853 |
|
|
854 |
pMB->mcsel = 1; |
pMB->mcsel = 1; |
855 |
if (Data->qpel) { |
if (Data->qpel) { |