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

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

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

revision 1564, Sun Dec 5 04:53:01 2004 UTC revision 1569, Thu Dec 9 04:58:12 2004 UTC
# Line 20  Line 20 
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.9 2004-12-05 04:53:01 syskin Exp $   * $Id: estimation_rd_based.c,v 1.10 2004-12-09 04:58:12 syskin Exp $
24   *   *
25   ****************************************************************************/   ****************************************************************************/
26    
# Line 57  Line 57 
57                                  const int block,                                  const int block,
58                                  const uint16_t * scan_table,                                  const uint16_t * scan_table,
59                                  const unsigned int lambda,                                  const unsigned int lambda,
60                                  const uint16_t * mpeg_quant_matrices)                                  const uint16_t * mpeg_quant_matrices,
61                                    const unsigned int quant_sq)
62  {  {
63          int sum;          int sum;
64          int bits;          int bits;
# Line 93  Line 94 
94          }          }
95    
96    
97          return bits + (lambda*distortion)/(quant*quant);          return bits + (lambda*distortion)/quant_sq;
98  }  }
99    
100  static __inline unsigned int  static __inline unsigned int
# Line 111  Line 112 
112                                          unsigned int bits[2],                                          unsigned int bits[2],
113                                          unsigned int cbp[2],                                          unsigned int cbp[2],
114                                          unsigned int lambda,                                          unsigned int lambda,
115                                          const uint16_t * mpeg_quant_matrices)                                          const uint16_t * mpeg_quant_matrices,
116                                            const unsigned int quant_sq)
117  {  {
118          int direction;          int direction;
119          int16_t *pCurrent;          int16_t *pCurrent;
# Line 171  Line 173 
173    
174          distortion = sse8_16bit(coeff, dqcoeff, 8*sizeof(int16_t));          distortion = sse8_16bit(coeff, dqcoeff, 8*sizeof(int16_t));
175    
176          return (lambda*distortion)/(quant*quant);          return (lambda*distortion)/quant_sq;
177  }  }
178    
179    
# Line 203  Line 205 
205          for(i = 0; i < 4; i++) {          for(i = 0; i < 4; i++) {
206                  int s = 8*((i&1) + (i>>1)*data->iEdgedWidth);                  int s = 8*((i&1) + (i>>1)*data->iEdgedWidth);
207                  transfer_8to16subro(in, data->Cur + s, ptr + s, data->iEdgedWidth);                  transfer_8to16subro(in, data->Cur + s, ptr + s, data->iEdgedWidth);
208                  rd += data->temp[i] = Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, i, data->scan_table, data->lambda[i], data->mpeg_quant_matrices);                  rd += data->temp[i] = Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant,
209                                                                    data->quant_type, &cbp, i, data->scan_table, data->lambda[i],
210                                                                    data->mpeg_quant_matrices, data->quant_sq);
211          }          }
212    
213          rd += t = BITS_MULT*d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision);          rd += t = BITS_MULT*d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision);
# Line 228  Line 232 
232          /* chroma U */          /* chroma U */
233          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);
234          transfer_8to16subro(in, data->CurU, ptr, data->iEdgedWidth/2);          transfer_8to16subro(in, data->CurU, ptr, data->iEdgedWidth/2);
235          rd += Block_CalcBits(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(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type,
236                                                            &cbp, 4, data->scan_table, data->lambda[4],
237                                                            data->mpeg_quant_matrices, data->quant_sq);
238          if (rd >= data->iMinSAD[0]) return;          if (rd >= data->iMinSAD[0]) return;
239    
240          /* chroma V */          /* chroma V */
241          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);
242          transfer_8to16subro(in, data->CurV, ptr, data->iEdgedWidth/2);          transfer_8to16subro(in, data->CurV, ptr, data->iEdgedWidth/2);
243          rd += Block_CalcBits(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(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type,
244                                                            &cbp, 5, data->scan_table, data->lambda[5],
245                                                            data->mpeg_quant_matrices, data->quant_sq);
246    
247          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;
248    
# Line 268  Line 276 
276          }          }
277    
278          transfer_8to16subro(in, data->Cur, ptr, data->iEdgedWidth);          transfer_8to16subro(in, data->Cur, ptr, data->iEdgedWidth);
279          rd = Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type, &cbp, 5, data->scan_table, data->lambda[0], data->mpeg_quant_matrices);          rd = Block_CalcBits(coeff, in, data->dctSpace + 128, data->iQuant, data->quant_type,
280                                                    &cbp, 5, data->scan_table, data->lambda[0],
281                                                    data->mpeg_quant_matrices, data->quant_sq);
282          rd += BITS_MULT*d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision);          rd += BITS_MULT*d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision);
283    
284          if (rd < data->iMinSAD[0]) {          if (rd < data->iMinSAD[0]) {
# Line 491  Line 501 
501          /* chroma U */          /* chroma U */
502          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);
503          transfer_8to16subro(in, Data->CurU, ptr, Data->iEdgedWidth/2);          transfer_8to16subro(in, Data->CurU, ptr, Data->iEdgedWidth/2);
504          bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 4, Data->scan_table, Data->lambda[4], Data->mpeg_quant_matrices);          bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 4,
505                                                            Data->scan_table, Data->lambda[4], Data->mpeg_quant_matrices, Data->quant_sq);
506    
507          if (bits >= *Data->iMinSAD) return bits;          if (bits >= *Data->iMinSAD) return bits;
508    
509          /* chroma V */          /* chroma V */
510          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);
511          transfer_8to16subro(in, Data->CurV, ptr, Data->iEdgedWidth/2);          transfer_8to16subro(in, Data->CurV, ptr, Data->iEdgedWidth/2);
512          bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 5, Data->scan_table, Data->lambda[5], Data->mpeg_quant_matrices);          bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 5,
513                                                            Data->scan_table, Data->lambda[5], Data->mpeg_quant_matrices, Data->quant_sq);
514    
515          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;
516    
# Line 524  Line 536 
536    
537    
538                  distortion = Block_CalcBitsIntra(pMB, x, y, mb_width, i, in, coeff, dqcoeff,                  distortion = Block_CalcBitsIntra(pMB, x, y, mb_width, i, in, coeff, dqcoeff,
539                                                                  predictors[i], iQuant, Data->quant_type, bits, cbp, Data->lambda[i], Data->mpeg_quant_matrices);                                                                  predictors[i], iQuant, Data->quant_type, bits, cbp,
540                                                                    Data->lambda[i], Data->mpeg_quant_matrices, Data->quant_sq);
541                  bits1 += distortion + BITS_MULT * bits[0];                  bits1 += distortion + BITS_MULT * bits[0];
542                  bits2 += distortion + BITS_MULT * bits[1];                  bits2 += distortion + BITS_MULT * bits[1];
543    
# Line 538  Line 551 
551          /*chroma U */          /*chroma U */
552          transfer_8to16copy(in, Data->CurU, Data->iEdgedWidth/2);          transfer_8to16copy(in, Data->CurU, Data->iEdgedWidth/2);
553          distortion = Block_CalcBitsIntra(pMB, x, y, mb_width, 4, in, coeff, dqcoeff,          distortion = Block_CalcBitsIntra(pMB, x, y, mb_width, 4, in, coeff, dqcoeff,
554                                                                          predictors[4], iQuant, Data->quant_type, bits, cbp, Data->lambda[4], Data->mpeg_quant_matrices);                                                                          predictors[4], iQuant, Data->quant_type, bits, cbp,
555                                                                            Data->lambda[4], Data->mpeg_quant_matrices, Data->quant_sq);
556          bits1 += distortion + BITS_MULT * bits[0];          bits1 += distortion + BITS_MULT * bits[0];
557          bits2 += distortion + BITS_MULT * bits[1];          bits2 += distortion + BITS_MULT * bits[1];
558    
# Line 548  Line 562 
562          /* chroma V */          /* chroma V */
563          transfer_8to16copy(in, Data->CurV, Data->iEdgedWidth/2);          transfer_8to16copy(in, Data->CurV, Data->iEdgedWidth/2);
564          distortion = Block_CalcBitsIntra(pMB, x, y, mb_width, 5, in, coeff, dqcoeff,          distortion = Block_CalcBitsIntra(pMB, x, y, mb_width, 5, in, coeff, dqcoeff,
565                                                                          predictors[5], iQuant, Data->quant_type, bits, cbp, Data->lambda[5], Data->mpeg_quant_matrices);                                                                          predictors[5], iQuant, Data->quant_type, bits, cbp,
566                                                                            Data->lambda[5], Data->mpeg_quant_matrices, Data->quant_sq);
567    
568          bits1 += distortion + BITS_MULT * bits[0];          bits1 += distortion + BITS_MULT * bits[0];
569          bits2 += distortion + BITS_MULT * bits[1];          bits2 += distortion + BITS_MULT * bits[1];
# Line 572  Line 587 
587          for(i = 0; i < 4; i++) {          for(i = 0; i < 4; i++) {
588                  int s = 8*((i&1) + (i>>1)*Data->iEdgedWidth);                  int s = 8*((i&1) + (i>>1)*Data->iEdgedWidth);
589                  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);
590                  bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, i, Data->scan_table, Data->lambda[i], Data->mpeg_quant_matrices);                  bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, i,
591                                                                    Data->scan_table, Data->lambda[i], Data->mpeg_quant_matrices, Data->quant_sq);
592                  if (bits >= Data->iMinSAD[0]) return bits;                  if (bits >= Data->iMinSAD[0]) return bits;
593          }          }
594    
# Line 580  Line 596 
596    
597          /*chroma U */          /*chroma U */
598          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);
599          bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 4, Data->scan_table, Data->lambda[4], Data->mpeg_quant_matrices);          bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 4,
600                                                            Data->scan_table, Data->lambda[4], Data->mpeg_quant_matrices, Data->quant_sq);
601    
602          if (bits >= Data->iMinSAD[0]) return bits;          if (bits >= Data->iMinSAD[0]) return bits;
603    
604          /* chroma V */          /* chroma V */
605          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);
606          bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 5, Data->scan_table, Data->lambda[5], Data->mpeg_quant_matrices);          bits += Block_CalcBits(coeff, in, Data->dctSpace + 128, Data->iQuant, Data->quant_type, &cbp, 5,
607                                                            Data->scan_table, Data->lambda[5], Data->mpeg_quant_matrices, Data->quant_sq);
608    
609          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;
610    
# Line 617  Line 635 
635          int min_rd, intra_rd, i, cbp;          int min_rd, intra_rd, i, cbp;
636          VECTOR backup[5], *v;          VECTOR backup[5], *v;
637          Data->iQuant = iQuant;          Data->iQuant = iQuant;
638            Data->quant_sq = iQuant*iQuant;
639          Data->scan_table = VopFlags & XVID_VOP_ALTERNATESCAN ?          Data->scan_table = VopFlags & XVID_VOP_ALTERNATESCAN ?
640                                                  scan_tables[2] : scan_tables[0];                                                  scan_tables[2] : scan_tables[0];
641    
# Line 729  Line 748 
748                                                  scan_tables[2] : scan_tables[0];                                                  scan_tables[2] : scan_tables[0];
749    
750          pMB->mcsel = 0;          pMB->mcsel = 0;
751            Data->iQuant = iQuant;
752            Data->quant_sq = iQuant*iQuant;
753    
754          for (i = 0; i < 6; i++) {          for (i = 0; i < 6; i++) {
755                  /* HVS models, anyone ? */                  /* HVS models, anyone ? */

Legend:
Removed from v.1564  
changed lines
  Added in v.1569

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