[svn] / trunk / xvidcore / src / motion / estimation_rd_based_bvop.c Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/motion/estimation_rd_based_bvop.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1508, Sun Jul 18 12:22:31 2004 UTC revision 1583, Sun Dec 19 13:16:50 2004 UTC
# Line 31  Line 31 
31                                  const int block,                                  const int block,
32                                  const uint16_t * scan_table,                                  const uint16_t * scan_table,
33                                  const unsigned int lambda,                                  const unsigned int lambda,
34                                  const uint16_t * mpeg_quant_matrices)                                  const uint16_t * mpeg_quant_matrices,
35                                    const unsigned int quant_sq)
36  {  {
37          int sum;          int sum;
38          int bits;          int bits;
# Line 66  Line 67 
67                  distortion = sse8_16bit(data, zero_block, 8*sizeof(int16_t));                  distortion = sse8_16bit(data, zero_block, 8*sizeof(int16_t));
68          }          }
69    
70          return bits + (lambda*distortion)/(quant*quant);          return bits + (lambda*distortion)/quant_sq;
71  }  }
72    
73    
# Line 79  Line 80 
80                                  const int block,                                  const int block,
81                                  const uint16_t * scan_table,                                  const uint16_t * scan_table,
82                                  const unsigned int lambda,                                  const unsigned int lambda,
83                                  const uint16_t * mpeg_quant_matrices)                                  const uint16_t * mpeg_quant_matrices,
84                                    const unsigned int quant_sq)
85  {  {
86          int sum;          int sum;
87          int bits;          int bits;
# Line 114  Line 116 
116                  distortion = sse8_16bit(data, zero_block, 8*sizeof(int16_t));                  distortion = sse8_16bit(data, zero_block, 8*sizeof(int16_t));
117          }          }
118    
119          return bits + (lambda*distortion)/(quant*quant);          return bits + (lambda*distortion)/quant_sq;
 }  
   
   
 static void  
 transfer_8to16sub2ro(int16_t * const dct,  
                                          const uint8_t * const cur,  
                                          const uint8_t * ref1,  
                                          const uint8_t * ref2,  
                                          const uint32_t stride)  
 {  
         uint32_t i, j;  
   
         for (j = 0; j < 8; j++) {  
                 for (i = 0; i < 8; i++) {  
                         uint8_t c = cur[j * stride + i];  
                         int r = (ref1[j * stride + i] + ref2[j * stride + i] + 1) / 2;  
                         dct[j * 8 + i] = (int16_t) c - (int16_t) r;  
                 }  
         }  
120  }  }
121    
122  static void  static void
# Line 141  Line 124 
124  {  {
125    
126          int16_t *in = data->dctSpace, *coeff = data->dctSpace + 64;          int16_t *in = data->dctSpace, *coeff = data->dctSpace + 64;
127          int32_t rd = 3*BITS_MULT; /* note to self: 3 bits minimum, but maybe 4 if it's forward mode */          int32_t rd = (3+2)*BITS_MULT; /* 3 bits for mode + 2 for vector (minimum) */
128          VECTOR * current;          VECTOR * current;
129          const uint8_t * ptr;          const uint8_t * ptr;
130          int i, xc, yc;          int i, xc, yc;
# Line 160  Line 143 
143                  xc = x/2; yc = y/2;                  xc = x/2; yc = y/2;
144          }          }
145    
146          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)-2);
147    
148          for(i = 0; i < 4; i++) {          for(i = 0; i < 4; i++) {
149                  int s = 8*((i&1) + (i>>1)*data->iEdgedWidth);                  int s = 8*((i&1) + (i>>1)*data->iEdgedWidth);
150                  transfer_8to16subro(in, data->Cur + s, ptr + s, data->iEdgedWidth);                  transfer_8to16subro(in, data->Cur + s, ptr + s, data->iEdgedWidth);
151                  rd += Block_CalcBits_BVOP(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, i, data->scan_table, data->lambda[i], data->mpeg_quant_matrices);                  rd += Block_CalcBits_BVOP(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type,
152                                                                    &cbp, i, data->scan_table, data->lambda[i], data->mpeg_quant_matrices, data->quant_sq);
153                  if (rd >= data->iMinSAD[0]) return;                  if (rd >= data->iMinSAD[0]) return;
154          }          }
155    
# Line 176  Line 160 
160          /* chroma U */          /* chroma U */
161          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);
162          transfer_8to16subro(in, data->CurU, ptr, data->iEdgedWidth/2);          transfer_8to16subro(in, data->CurU, ptr, data->iEdgedWidth/2);
163          rd += Block_CalcBits_BVOP(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 4, data->scan_table, data->lambda[4], data->mpeg_quant_matrices);          rd += Block_CalcBits_BVOP(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type,
164                                                                    &cbp, 4, data->scan_table, data->lambda[4], data->mpeg_quant_matrices, data->quant_sq);
165          if (rd >= data->iMinSAD[0]) return;          if (rd >= data->iMinSAD[0]) return;
166    
167          /* chroma V */          /* chroma V */
168          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);
169          transfer_8to16subro(in, data->CurV, ptr, data->iEdgedWidth/2);          transfer_8to16subro(in, data->CurV, ptr, data->iEdgedWidth/2);
170          rd += Block_CalcBits_BVOP(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 5, data->scan_table, data->lambda[5], data->mpeg_quant_matrices);          rd += Block_CalcBits_BVOP(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type,
171                                                                    &cbp, 5, data->scan_table, data->lambda[5], data->mpeg_quant_matrices, data->quant_sq);
172    
173          if (cbp) rd += BITS_MULT * 7;          if (cbp) rd += BITS_MULT * 7;
174    
# Line 194  Line 180 
180          }          }
181  }  }
182    
   
183  static void  static void
184  CheckCandidateRDDirect(const int x, const int y, SearchData * const data, const unsigned int Direction)  CheckCandidateRDDirect(const int x, const int y, SearchData * const data, const unsigned int Direction)
185  {  {
# Line 241  Line 226 
226                  }                  }
227    
228                  transfer_8to16sub2ro(in, data->Cur + s, ReferenceF, ReferenceB, data->iEdgedWidth);                  transfer_8to16sub2ro(in, data->Cur + s, ReferenceF, ReferenceB, data->iEdgedWidth);
229                  rd += Block_CalcBits_BVOP_direct(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, k, data->scan_table, data->lambda[k], data->mpeg_quant_matrices);                  rd += Block_CalcBits_BVOP_direct(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type,
230                                                                                    &cbp, k, data->scan_table, data->lambda[k], data->mpeg_quant_matrices, data->quant_sq);
231                  if (rd > *(data->iMinSAD)) return;                  if (rd > *(data->iMinSAD)) return;
232          }          }
233    
# Line 255  Line 241 
241          ReferenceF = interpolate8x8_switch2(data->RefQ, data->RefP[4], 0, 0, xcf, ycf, data->iEdgedWidth/2, data->rounding);          ReferenceF = interpolate8x8_switch2(data->RefQ, data->RefP[4], 0, 0, xcf, ycf, data->iEdgedWidth/2, data->rounding);
242          ReferenceB = interpolate8x8_switch2(data->RefQ + 16, data->b_RefP[4], 0, 0, xcb, ycb, data->iEdgedWidth/2, data->rounding);          ReferenceB = interpolate8x8_switch2(data->RefQ + 16, data->b_RefP[4], 0, 0, xcb, ycb, data->iEdgedWidth/2, data->rounding);
243          transfer_8to16sub2ro(in, data->CurU, ReferenceF, ReferenceB, data->iEdgedWidth/2);          transfer_8to16sub2ro(in, data->CurU, ReferenceF, ReferenceB, data->iEdgedWidth/2);
244          rd += Block_CalcBits_BVOP_direct(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 4, data->scan_table, data->lambda[4], data->mpeg_quant_matrices);          rd += Block_CalcBits_BVOP_direct(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type,
245                                                                            &cbp, 4, data->scan_table, data->lambda[4], data->mpeg_quant_matrices, data->quant_sq);
246          if (rd >= data->iMinSAD[0]) return;          if (rd >= data->iMinSAD[0]) return;
247    
248          /* chroma V */          /* chroma V */
249          ReferenceF = interpolate8x8_switch2(data->RefQ, data->RefP[5], 0, 0, xcf, ycf, data->iEdgedWidth/2, data->rounding);          ReferenceF = interpolate8x8_switch2(data->RefQ, data->RefP[5], 0, 0, xcf, ycf, data->iEdgedWidth/2, data->rounding);
250          ReferenceB = interpolate8x8_switch2(data->RefQ + 16, data->b_RefP[5], 0, 0, xcb, ycb, data->iEdgedWidth/2, data->rounding);          ReferenceB = interpolate8x8_switch2(data->RefQ + 16, data->b_RefP[5], 0, 0, xcb, ycb, data->iEdgedWidth/2, data->rounding);
251          transfer_8to16sub2ro(in, data->CurV, ReferenceF, ReferenceB, data->iEdgedWidth/2);          transfer_8to16sub2ro(in, data->CurV, ReferenceF, ReferenceB, data->iEdgedWidth/2);
252          rd += Block_CalcBits_BVOP_direct(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 5, data->scan_table, data->lambda[5], data->mpeg_quant_matrices);          rd += Block_CalcBits_BVOP_direct(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type,
253                                                                            &cbp, 5, data->scan_table, data->lambda[5], data->mpeg_quant_matrices, data->quant_sq);
254    
255          if (cbp)          if (cbp)
256                  rd += BITS_MULT * 6;                  rd += BITS_MULT * 6;
257          if (cbp || x != 0 || y != 0)          if (cbp || x != 0 || y != 0)
258                  rd += BITS_MULT * d_mv_bits(x, y, zeroMV, 1, 0, 0);                  rd += BITS_MULT * d_mv_bits(x, y, zeroMV, 1, 0);
259    
260          if (rd < *(data->iMinSAD)) {          if (rd < *(data->iMinSAD)) {
261                  *data->iMinSAD = rd;                  *data->iMinSAD = rd;
# Line 277  Line 265 
265          }          }
266  }  }
267    
   
   
   
268  static void  static void
269  CheckCandidateRDInt(const int x, const int y, SearchData * const data, const unsigned int Direction)  CheckCandidateRDInt(const int x, const int y, SearchData * const data, const unsigned int Direction)
270  {  {
# Line 322  Line 307 
307                  xcb = xb/2; ycb = yb/2;                  xcb = xb/2; ycb = yb/2;
308          }          }
309    
310          rd += BITS_MULT * (d_mv_bits(xf, yf, data->predMV, data->iFcode, data->qpel^data->qpel_precision, 0)          rd += BITS_MULT * (d_mv_bits(xf, yf, data->predMV, data->iFcode, data->qpel^data->qpel_precision)
311                                          + 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));
   
312    
313          for(i = 0; i < 4; i++) {          for(i = 0; i < 4; i++) {
314                  int s = 8*((i&1) + (i>>1)*data->iEdgedWidth);                  int s = 8*((i&1) + (i>>1)*data->iEdgedWidth);
315                  if (rd >= *data->iMinSAD) return;                  if (rd >= *data->iMinSAD) return;
316                  transfer_8to16sub2ro(in, data->Cur + s, ReferenceF + s, ReferenceB + s, data->iEdgedWidth);                  transfer_8to16sub2ro(in, data->Cur + s, ReferenceF + s, ReferenceB + s, data->iEdgedWidth);
317                  rd += Block_CalcBits_BVOP(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, i, data->scan_table, data->lambda[i], data->mpeg_quant_matrices);                  rd += Block_CalcBits_BVOP(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp,
318                                                                    i, data->scan_table, data->lambda[i], data->mpeg_quant_matrices, data->quant_sq);
319          }          }
320    
321          /* chroma */          /* chroma */
# Line 343  Line 328 
328          ReferenceF = interpolate8x8_switch2(data->RefQ, data->RefP[4], 0, 0, xcf, ycf, data->iEdgedWidth/2, data->rounding);          ReferenceF = interpolate8x8_switch2(data->RefQ, data->RefP[4], 0, 0, xcf, ycf, data->iEdgedWidth/2, data->rounding);
329          ReferenceB = interpolate8x8_switch2(data->RefQ + 16, data->b_RefP[4], 0, 0, xcb, ycb, data->iEdgedWidth/2, data->rounding);          ReferenceB = interpolate8x8_switch2(data->RefQ + 16, data->b_RefP[4], 0, 0, xcb, ycb, data->iEdgedWidth/2, data->rounding);
330          transfer_8to16sub2ro(in, data->CurU, ReferenceF, ReferenceB, data->iEdgedWidth/2);          transfer_8to16sub2ro(in, data->CurU, ReferenceF, ReferenceB, data->iEdgedWidth/2);
331          rd += Block_CalcBits_BVOP(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 4, data->scan_table, data->lambda[4], data->mpeg_quant_matrices);          rd += Block_CalcBits_BVOP(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp,
332                                                                    4, data->scan_table, data->lambda[4], data->mpeg_quant_matrices, data->quant_sq);
333          if (rd >= data->iMinSAD[0]) return;          if (rd >= data->iMinSAD[0]) return;
334    
335    
# Line 351  Line 337 
337          ReferenceF = interpolate8x8_switch2(data->RefQ, data->RefP[5], 0, 0, xcf, ycf, data->iEdgedWidth/2, data->rounding);          ReferenceF = interpolate8x8_switch2(data->RefQ, data->RefP[5], 0, 0, xcf, ycf, data->iEdgedWidth/2, data->rounding);
338          ReferenceB = interpolate8x8_switch2(data->RefQ + 16, data->b_RefP[5], 0, 0, xcb, ycb, data->iEdgedWidth/2, data->rounding);          ReferenceB = interpolate8x8_switch2(data->RefQ + 16, data->b_RefP[5], 0, 0, xcb, ycb, data->iEdgedWidth/2, data->rounding);
339          transfer_8to16sub2ro(in, data->CurV, ReferenceF, ReferenceB, data->iEdgedWidth/2);          transfer_8to16sub2ro(in, data->CurV, ReferenceF, ReferenceB, data->iEdgedWidth/2);
340          rd += Block_CalcBits_BVOP(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 5, data->scan_table, data->lambda[5], data->mpeg_quant_matrices);          rd += Block_CalcBits_BVOP(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp,
341                                                                    5, data->scan_table, data->lambda[5], data->mpeg_quant_matrices, data->quant_sq);
342    
343          if (cbp) rd += BITS_MULT * 7;          if (cbp) rd += BITS_MULT * 7;
344    
# Line 375  Line 362 
362          Data->iMinSAD[0] = *best_sad;          Data->iMinSAD[0] = *best_sad;
363    
364          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,
365                  x, y, 4, pParam->width, pParam->height, Data->iFcode, 1 + Data->qpel, 0);                  x, y, 4, pParam->width, pParam->height, Data->iFcode, 1 + Data->qpel);
366    
367          Data->qpel_precision = Data->qpel;          Data->qpel_precision = Data->qpel;
368    
# Line 418  Line 405 
405          Data->iMinSAD[0] = *best_sad;          Data->iMinSAD[0] = *best_sad;
406    
407          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,
408                  x, y, 4, pParam->width, pParam->height, Data->iFcode, 1 + Data->qpel, 0);                  x, y, 4, pParam->width, pParam->height, Data->iFcode, 1 + Data->qpel);
409    
410          Data->qpel_precision = Data->qpel;          Data->qpel_precision = Data->qpel;
411    
# Line 460  Line 447 
447                                           VECTOR * b_predMV,                                           VECTOR * b_predMV,
448                                           const uint32_t MotionFlags,                                           const uint32_t MotionFlags,
449                                           const MBParam * const pParam,                                           const MBParam * const pParam,
450                                           int x, int y)                                           int x, int y,
451                                             int best_sad)
452  {  {
453          int mode = MODE_DIRECT, k;          int mode = MODE_DIRECT, k;
454          int f_rd, b_rd, i_rd, d_rd, best_rd;          int f_rd, b_rd, i_rd, d_rd, best_rd;
# Line 468  Line 456 
456          const uint32_t iQuant = Data_d->iQuant;          const uint32_t iQuant = Data_d->iQuant;
457          int i;          int i;
458          int ref_quant = b_mb->quant;          int ref_quant = b_mb->quant;
459            int no_of_checks = 0;
460    
461          int order[4] = {MODE_DIRECT, MODE_FORWARD, MODE_BACKWARD, MODE_INTERPOLATE};          int order[4] = {MODE_DIRECT, MODE_FORWARD, MODE_BACKWARD, MODE_INTERPOLATE};
462    
463          Data_d->scan_table = Data_b->scan_table = Data_f->scan_table = Data_i->scan_table          Data_d->scan_table = Data_b->scan_table = Data_f->scan_table = Data_i->scan_table
464                  = /*VopFlags & XVID_VOP_ALTERNATESCAN ? scan_tables[2] : */scan_tables[0];                  = /*VopFlags & XVID_VOP_ALTERNATESCAN ? scan_tables[2] : */scan_tables[0];
465            *Data_f->cbp = *Data_b->cbp = *Data_i->cbp = *Data_d->cbp = 63;
466    
467          f_rd = b_rd = i_rd = d_rd = best_rd = 256*4096;          f_rd = b_rd = i_rd = d_rd = best_rd = 256*4096;
468    
# Line 500  Line 490 
490                  }                  }
491          }          }
492    
493            for(i = 0; i < 4; i++)
494                    if (get_sad_for_mode(order[i], Data_d, Data_b, Data_f, Data_i) < 2*best_sad)
495                            no_of_checks++;
496    
497            if (no_of_checks > 1) {
498          /* evaluate cost of all modes */          /* evaluate cost of all modes */
499          for (i = 0; i < 4; i++) {                  for (i = 0; i < no_of_checks; i++) {
500                  int rd;                  int rd;
501                            if (2*best_sad < get_sad_for_mode(order[i], Data_d, Data_b, Data_f, Data_i))
502                                    break; /* further SADs are too big */
503    
504                  switch (order[i]) {                  switch (order[i]) {
505                  case MODE_DIRECT:                  case MODE_DIRECT:
# Line 524  Line 521 
521                          best_rd = rd;                          best_rd = rd;
522                  }                  }
523          }          }
524            } else {
525                    /* only 1 mode is below the threshold */
526                    mode = order[0];
527                    best_rd = 0;
528            }
529    
530          pMB->sad16 = best_rd;          pMB->sad16 = best_rd;
531          pMB->mode = mode;          pMB->mode = mode;
# Line 576  Line 578 
578                  }                  }
579                  pMB->mvs[0] = *Data_f->currentMV;                  pMB->mvs[0] = *Data_f->currentMV;
580                  pMB->cbp = *Data_f->cbp;                  pMB->cbp = *Data_f->cbp;
581                    pMB->b_mvs[0] = *Data_b->currentMV; /* hint for future searches */
582                  break;                  break;
583    
584          case MODE_BACKWARD:          case MODE_BACKWARD:
# Line 591  Line 594 
594                  }                  }
595                  pMB->b_mvs[0] = *Data_b->currentMV;                  pMB->b_mvs[0] = *Data_b->currentMV;
596                  pMB->cbp = *Data_b->cbp;                  pMB->cbp = *Data_b->cbp;
597                    pMB->mvs[0] = *Data_f->currentMV; /* hint for future searches */
598                  break;                  break;
599    
600    

Legend:
Removed from v.1508  
changed lines
  Added in v.1583

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4