[svn] / branches / dev-api-4 / xvidcore / src / motion / motion_est.c Repository:
ViewVC logotype

Diff of /branches/dev-api-4/xvidcore/src/motion/motion_est.c

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

revision 987, Mon Apr 14 15:42:19 2003 UTC revision 1023, Wed May 14 20:23:02 2003 UTC
# Line 646  Line 646 
646  {  {
647    
648          int16_t *in = data->dctSpace, *coeff = data->dctSpace + 64;          int16_t *in = data->dctSpace, *coeff = data->dctSpace + 64;
649          int32_t bits = 0, sum;          int32_t bits = 0;
650          VECTOR * current;          VECTOR * current;
651          const uint8_t * ptr;          const uint8_t * ptr;
652          int i, cbp = 0, t, xc, yc;          int i, cbp = 0, t, xc, yc;
# Line 667  Line 667 
667          for(i = 0; i < 4; i++) {          for(i = 0; i < 4; i++) {
668                  int s = 8*((i&1) + (i>>1)*data->iEdgedWidth);                  int s = 8*((i&1) + (i>>1)*data->iEdgedWidth);
669                  transfer_8to16subro(in, data->Cur + s, ptr + s, data->iEdgedWidth);                  transfer_8to16subro(in, data->Cur + s, ptr + s, data->iEdgedWidth);
670                  fdct(in);                  bits += data->temp[i] = Block_CalcBits(coeff, in, data->iQuant, data->quant_type, &cbp, i);
                 if (data->lambda8 == 0) sum = quant_inter(coeff, in, data->lambda16);  
                 else sum = quant4_inter(coeff, in, data->lambda16);  
                 if (sum > 0) {  
                         cbp |= 1 << (5 - i);  
                         bits += data->temp[i] = CodeCoeffInter_CalcBits(coeff, scan_tables[0]);  
                 } else data->temp[i] = 0;  
671          }          }
672    
673          bits += t = d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision, 0);          bits += t = BITS_MULT*d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision, 0);
674    
675          if (bits < data->iMinSAD[0]) { // there is still a chance, adding chroma          bits += BITS_MULT*xvid_cbpy_tab[15-(cbp>>2)].len;
676    
677            if (bits >= data->iMinSAD[0]) return;
678    
679            //chroma
680                  xc = (xc >> 1) + roundtab_79[xc & 0x3];                  xc = (xc >> 1) + roundtab_79[xc & 0x3];
681                  yc = (yc >> 1) + roundtab_79[yc & 0x3];                  yc = (yc >> 1) + roundtab_79[yc & 0x3];
682    
683                  //chroma U                  //chroma U
684                  ptr = interpolate8x8_switch2(data->RefQ + 64, data->RefP[4], 0, 0, xc, yc,  data->iEdgedWidth/2, data->rounding);                  ptr = interpolate8x8_switch2(data->RefQ + 64, data->RefP[4], 0, 0, xc, yc,  data->iEdgedWidth/2, data->rounding);
685                  transfer_8to16subro(in, ptr, data->CurU, data->iEdgedWidth/2);                  transfer_8to16subro(in, ptr, data->CurU, data->iEdgedWidth/2);
686                  fdct(in);          bits += Block_CalcBits(coeff, in, data->iQuant, data->quant_type, &cbp, 4);
687                  if (data->lambda8 == 0) sum = quant_inter(coeff, in, data->lambda16);          if (bits >= data->iMinSAD[0]) return;
                 else sum = quant4_inter(coeff, in, data->lambda16);  
                 if (sum > 0) {  
                         cbp |= 1 << (5 - 4);  
                         bits += CodeCoeffInter_CalcBits(coeff, scan_tables[0]);  
                 }  
688    
                 if (bits < data->iMinSAD[0]) {  
689                          //chroma V                          //chroma V
690                          ptr = interpolate8x8_switch2(data->RefQ + 64, data->RefP[5], 0, 0, xc, yc,  data->iEdgedWidth/2, data->rounding);                          ptr = interpolate8x8_switch2(data->RefQ + 64, data->RefP[5], 0, 0, xc, yc,  data->iEdgedWidth/2, data->rounding);
691                          transfer_8to16subro(in, ptr, data->CurV, data->iEdgedWidth/2);                          transfer_8to16subro(in, ptr, data->CurV, data->iEdgedWidth/2);
692                          fdct(in);          bits += Block_CalcBits(coeff, in, data->iQuant, data->quant_type, &cbp, 5);
                         if (data->lambda8 == 0) sum = quant_inter(coeff, in, data->lambda16);  
                         else sum = quant4_inter(coeff, in, data->lambda16);  
                         if (sum > 0) {  
                                 cbp |= 1 << (5 - 5);  
                                 bits += CodeCoeffInter_CalcBits(coeff, scan_tables[0]);  
                         }  
                 }  
         }  
693    
694          bits += xvid_cbpy_tab[15-(cbp>>2)].len;          bits += BITS_MULT*mcbpc_inter_tab[(MODE_INTER & 7) | ((cbp & 3) << 3)].len;
         bits += mcbpc_inter_tab[(MODE_INTER & 7) | ((cbp & 3) << 3)].len;  
695    
696          if (bits < data->iMinSAD[0]) {          if (bits < data->iMinSAD[0]) {
697                  data->iMinSAD[0] = bits;                  data->iMinSAD[0] = bits;
# Line 731  Line 714 
714  {  {
715    
716          int16_t *in = data->dctSpace, *coeff = data->dctSpace + 64;          int16_t *in = data->dctSpace, *coeff = data->dctSpace + 64;
717          int32_t sum, bits;          int32_t bits;
718          VECTOR * current;          VECTOR * current;
719          const uint8_t * ptr;          const uint8_t * ptr;
720          int cbp;          int cbp = 0;
721    
722          if ( (x > data->max_dx) || (x < data->min_dx)          if ( (x > data->max_dx) || (x < data->min_dx)
723                  || (y > data->max_dy) || (y < data->min_dy) ) return;                  || (y > data->max_dy) || (y < data->min_dy) ) return;
# Line 748  Line 731 
731          }          }
732    
733          transfer_8to16subro(in, data->Cur, ptr, data->iEdgedWidth);          transfer_8to16subro(in, data->Cur, ptr, data->iEdgedWidth);
734          fdct(in);          bits = Block_CalcBits(coeff, in, data->iQuant, data->quant_type, &cbp, 5);
735          if (data->lambda8 == 0) sum = quant_inter(coeff, in, data->lambda16);          bits += BITS_MULT*d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision, 0);
         else sum = quant4_inter(coeff, in, data->lambda16);  
         if (sum > 0) {  
                 bits = CodeCoeffInter_CalcBits(coeff, scan_tables[0]);  
                 cbp = 1;  
         } else cbp = bits = 0;  
   
         bits += sum = d_mv_bits(x, y, data->predMV, data->iFcode, data->qpel^data->qpel_precision, 0);  
736    
737          if (bits < data->iMinSAD[0]) {          if (bits < data->iMinSAD[0]) {
738                  data->temp[0] = cbp;                  data->temp[0] = cbp;
# Line 966  Line 942 
942          pMB->sad16 = pMB->sad8[0] = pMB->sad8[1] = pMB->sad8[2] = pMB->sad8[3] = sad;          pMB->sad16 = pMB->sad8[0] = pMB->sad8[1] = pMB->sad8[2] = pMB->sad8[3] = sad;
943  }  }
944    
945    static __inline void
946    ModeDecision(SearchData * const Data,
947                            MACROBLOCK * const pMB,
948                            const MACROBLOCK * const pMBs,
949                            const int x, const int y,
950                            const MBParam * const pParam,
951                            const uint32_t MotionFlags,
952                            const uint32_t VopFlags,
953                            const uint32_t VolFlags,
954                            const IMAGE * const pCurrent,
955                            const IMAGE * const pRef)
956    {
957            int mode = MODE_INTER;
958            int inter4v = (VopFlags & XVID_VOP_INTER4V) && (pMB->dquant == 0);
959            const uint32_t iQuant = pMB->quant;
960    
961            const int skip_possible = (!(VolFlags & XVID_VOL_GMC)) && (pMB->dquant == 0);
962    
963            if (!(VopFlags & XVID_VOP_MODEDECISION_BITS)) { //normal, fast, SAD-based mode decision
964                    int sad;
965                    int InterBias = MV16_INTER_BIAS;
966                    if (inter4v == 0 || Data->iMinSAD[0] < Data->iMinSAD[1] + Data->iMinSAD[2] +
967                            Data->iMinSAD[3] + Data->iMinSAD[4] + IMV16X16 * (int32_t)iQuant) {
968                            mode = MODE_INTER;
969                            sad = Data->iMinSAD[0];
970                    } else {
971                            mode = MODE_INTER4V;
972                            sad = Data->iMinSAD[1] + Data->iMinSAD[2] +
973                                                    Data->iMinSAD[3] + Data->iMinSAD[4] + IMV16X16 * (int32_t)iQuant;
974                            Data->iMinSAD[0] = sad;
975                    }
976    
977                    /* final skip decision, a.k.a. "the vector you found, really that good?" */
978                    if (skip_possible && (pMB->sad16 < (int)iQuant * MAX_SAD00_FOR_SKIP))
979                            if ( (100*sad)/(pMB->sad16+1) > FINAL_SKIP_THRESH)
980                                    if (Data->chroma || SkipDecisionP(pCurrent, pRef, x, y, Data->iEdgedWidth/2, iQuant, Data->rrv)) {
981                                            mode = MODE_NOT_CODED;
982                                            sad = 0;
983                                    }
984    
985                    /* intra decision */
986    
987                    if (iQuant > 8) InterBias += 100 * (iQuant - 8); // to make high quants work
988                    if (y != 0)
989                            if ((pMB - pParam->mb_width)->mode == MODE_INTRA ) InterBias -= 80;
990                    if (x != 0)
991                            if ((pMB - 1)->mode == MODE_INTRA ) InterBias -= 80;
992    
993                    if (Data->chroma) InterBias += 50; // dev8(chroma) ???
994                    if (Data->rrv) InterBias *= 4;
995    
996                    if (InterBias < pMB->sad16) {
997                            int32_t deviation;
998                            if (!Data->rrv) deviation = dev16(Data->Cur, Data->iEdgedWidth);
999                            else deviation = dev16(Data->Cur, Data->iEdgedWidth) +
1000                                    dev16(Data->Cur+16, Data->iEdgedWidth) +
1001                                    dev16(Data->Cur + 16*Data->iEdgedWidth, Data->iEdgedWidth) +
1002                                    dev16(Data->Cur+16+16*Data->iEdgedWidth, Data->iEdgedWidth);
1003    
1004                            if (deviation < (sad - InterBias)) mode = MODE_INTRA;
1005                    }
1006    
1007            } else { // BITS
1008    
1009                    int bits, intra, i;
1010                    VECTOR backup[5], *v;
1011                    Data->iQuant = iQuant;
1012    
1013                    v = Data->qpel ? Data->currentQMV : Data->currentMV;
1014                    for (i = 0; i < 5; i++) {
1015                            Data->iMinSAD[i] = 256*4096;
1016                            backup[i] = v[i];
1017                    }
1018    
1019                    bits = CountMBBitsInter(Data, pMBs, x, y, pParam, MotionFlags);
1020                    if (bits == 0)
1021                            mode = MODE_INTER; // quick stop
1022                    else {
1023                            if (inter4v) {
1024                                    int bits_inter4v = CountMBBitsInter4v(Data, pMB, pMBs, x, y, pParam, MotionFlags, backup);
1025                                    if (bits_inter4v < bits) { Data->iMinSAD[0] = bits = bits_inter4v; mode = MODE_INTER4V; }
1026                            }
1027    
1028                            intra = CountMBBitsIntra(Data);
1029    
1030                            if (intra < bits) { *Data->iMinSAD = bits = intra; mode = MODE_INTRA; }
1031                    }
1032            }
1033    
1034            if (Data->rrv) {
1035                            Data->currentMV[0].x = RRV_MV_SCALEDOWN(Data->currentMV[0].x);
1036                            Data->currentMV[0].y = RRV_MV_SCALEDOWN(Data->currentMV[0].y);
1037            }
1038    
1039            if (mode == MODE_INTER) {
1040                    pMB->mvs[0] = pMB->mvs[1] = pMB->mvs[2] = pMB->mvs[3] = Data->currentMV[0];
1041                    pMB->sad16 = pMB->sad8[0] = pMB->sad8[1] = pMB->sad8[2] = pMB->sad8[3] = Data->iMinSAD[0];
1042    
1043                    if(Data->qpel) {
1044                            pMB->qmvs[0] = pMB->qmvs[1]
1045                                    = pMB->qmvs[2] = pMB->qmvs[3] = Data->currentQMV[0];
1046                            pMB->pmvs[0].x = Data->currentQMV[0].x - Data->predMV.x;
1047                            pMB->pmvs[0].y = Data->currentQMV[0].y - Data->predMV.y;
1048                    } else {
1049                            pMB->pmvs[0].x = Data->currentMV[0].x - Data->predMV.x;
1050                            pMB->pmvs[0].y = Data->currentMV[0].y - Data->predMV.y;
1051                    }
1052    
1053            } else if (mode == MODE_INTER4V)
1054                    pMB->sad16 = Data->iMinSAD[0];
1055            else // INTRA, NOT_CODED
1056                    SkipMacroblockP(pMB, 0);
1057    
1058            pMB->mode = mode;
1059    }
1060    
1061  bool  bool
1062  MotionEstimation(MBParam * const pParam,  MotionEstimation(MBParam * const pParam,
1063                                   FRAMEINFO * const current,                                   FRAMEINFO * const current,
# Line 1011  Line 1103 
1103          Data.chroma = MotionFlags & XVID_ME_CHROMA16;          Data.chroma = MotionFlags & XVID_ME_CHROMA16;
1104          Data.rrv = (current->vop_flags & XVID_VOP_REDUCED ? 1:0);          Data.rrv = (current->vop_flags & XVID_VOP_REDUCED ? 1:0);
1105          Data.dctSpace = dct_space;          Data.dctSpace = dct_space;
1106            Data.quant_type = !(pParam->vol_flags & XVID_VOL_MPEGQUANT);
1107    
1108          if ((current->vop_flags & XVID_VOP_REDUCED)) {          if ((current->vop_flags & XVID_VOP_REDUCED)) {
1109                  mb_width = (pParam->width + 31) / 32;                  mb_width = (pParam->width + 31) / 32;
# Line 1050  Line 1143 
1143                                  if (quant > 31) quant = 31;                                  if (quant > 31) quant = 31;
1144                                  else if (quant < 1) quant = 1;                                  else if (quant < 1) quant = 1;
1145                          }                          }
1146                          pMB->quant = current->quant;                          pMB->quant = quant;
1147    
1148  //initial skip decision  //initial skip decision
1149  /* no early skip for GMC (global vector = skip vector is unknown!)  */  /* no early skip for GMC (global vector = skip vector is unknown!)  */
# Line 1063  Line 1156 
1156                          }                          }
1157    
1158                          SearchP(pRef, pRefH->y, pRefV->y, pRefHV->y, pCurrent, x,                          SearchP(pRef, pRefH->y, pRefV->y, pRefHV->y, pCurrent, x,
1159                                                  y, MotionFlags, current->vol_flags, pMB->quant,                                          y, MotionFlags, current->vop_flags, current->vol_flags,
1160                                                  &Data, pParam, pMBs, reference->mbs,                                          &Data, pParam, pMBs, reference->mbs, pMB);
1161                                                  current->vop_flags & XVID_VOP_INTER4V, pMB);  
1162                            ModeDecision(&Data, pMB, pMBs, x, y, pParam,
1163                                                     MotionFlags, current->vop_flags, current->vol_flags,
1164                                                     pCurrent, pRef);
1165    
 /* final skip decision, a.k.a. "the vector you found, really that good?" */  
                         if (!(current->vol_flags & XVID_VOL_GMC || current->vop_flags & XVID_VOP_MODEDECISION_BITS)) {  
                                 if ( pMB->dquant == 0 && sad00 < pMB->quant * MAX_SAD00_FOR_SKIP) {  
                                         if ( (100*pMB->sad16)/(sad00+1) > FINAL_SKIP_THRESH * (Data.rrv ? 4:1) )  
                                                 if (Data.chroma || SkipDecisionP(pCurrent, pRef, x, y, iEdgedWidth/2, pMB->quant, Data.rrv))  
                                                         SkipMacroblockP(pMB, sad00);  
                                 }  
                         }  
1166                          if (pMB->mode == MODE_INTRA)                          if (pMB->mode == MODE_INTRA)
1167                                  if (++iIntra > iLimit) return 1;                                  if (++iIntra > iLimit) return 1;
1168                  }                  }
# Line 1147  Line 1235 
1235          }          }
1236  }  }
1237    
 static int  
 ModeDecision(const uint32_t iQuant, SearchData * const Data,  
                 int inter4v,  
                 MACROBLOCK * const pMB,  
                 const MACROBLOCK * const pMBs,  
                 const int x, const int y,  
                 const MBParam * const pParam,  
                 const uint32_t MotionFlags,  
                 const uint32_t VopFlags)  
 {  
   
         int mode = MODE_INTER;  
   
         if (!(VopFlags & XVID_VOP_MODEDECISION_BITS)) { //normal, fast, SAD-based mode decision  
                 int sad;  
                 int InterBias = MV16_INTER_BIAS;  
                 if (inter4v == 0 || Data->iMinSAD[0] < Data->iMinSAD[1] + Data->iMinSAD[2] +  
                         Data->iMinSAD[3] + Data->iMinSAD[4] + IMV16X16 * (int32_t)iQuant) {  
                         mode = MODE_INTER;  
                         sad = Data->iMinSAD[0];  
                 } else {  
                         mode = MODE_INTER4V;  
                         sad = Data->iMinSAD[1] + Data->iMinSAD[2] +  
                                                 Data->iMinSAD[3] + Data->iMinSAD[4] + IMV16X16 * (int32_t)iQuant;  
                         Data->iMinSAD[0] = sad;  
                 }  
   
                 /* intra decision */  
   
                 if (iQuant > 8) InterBias += 100 * (iQuant - 8); // to make high quants work  
                 if (y != 0)  
                         if ((pMB - pParam->mb_width)->mode == MODE_INTRA ) InterBias -= 80;  
                 if (x != 0)  
                         if ((pMB - 1)->mode == MODE_INTRA ) InterBias -= 80;  
   
                 if (Data->chroma) InterBias += 50; // to compensate bigger SAD  
                 if (Data->rrv) InterBias *= 4;  
   
                 if (InterBias < pMB->sad16) {  
                         int32_t deviation;  
                         if (!Data->rrv) deviation = dev16(Data->Cur, Data->iEdgedWidth);  
                         else deviation = dev16(Data->Cur, Data->iEdgedWidth) +  
                                 dev16(Data->Cur+8, Data->iEdgedWidth) +  
                                 dev16(Data->Cur + 8*Data->iEdgedWidth, Data->iEdgedWidth) +  
                                 dev16(Data->Cur+8+8*Data->iEdgedWidth, Data->iEdgedWidth);  
   
                         if (deviation < (sad - InterBias)) return MODE_INTRA;  
                 }  
                 return mode;  
   
         } else {  
   
                 int bits, intra, i;  
                 VECTOR backup[5], *v;  
                 Data->lambda16 = iQuant;  
         Data->lambda8 = (pParam->vol_flags & XVID_VOL_MPEGQUANT)?1:0;  
   
                 v = Data->qpel ? Data->currentQMV : Data->currentMV;  
                 for (i = 0; i < 5; i++) {  
                         Data->iMinSAD[i] = 256*4096;  
                         backup[i] = v[i];  
                 }  
   
                 bits = CountMBBitsInter(Data, pMBs, x, y, pParam, MotionFlags);  
                 if (bits == 0) return MODE_INTER; // quick stop  
   
                 if (inter4v) {  
                         int bits_inter4v = CountMBBitsInter4v(Data, pMB, pMBs, x, y, pParam, MotionFlags, backup);  
                         if (bits_inter4v < bits) { Data->iMinSAD[0] = bits = bits_inter4v; mode = MODE_INTER4V; }  
                 }  
   
                 intra = CountMBBitsIntra(Data);  
   
                 if (intra < bits) { *Data->iMinSAD = bits = intra; return MODE_INTRA; }  
   
                 return mode;  
         }  
 }  
   
1238  static void  static void
1239  SearchP(const IMAGE * const pRef,  SearchP(const IMAGE * const pRef,
1240                  const uint8_t * const pRefH,                  const uint8_t * const pRefH,
# Line 1236  Line 1245 
1245                  const int y,                  const int y,
1246                  const uint32_t MotionFlags,                  const uint32_t MotionFlags,
1247                  const uint32_t VopFlags,                  const uint32_t VopFlags,
1248                  const uint32_t iQuant,                  const uint32_t VolFlags,
1249                  SearchData * const Data,                  SearchData * const Data,
1250                  const MBParam * const pParam,                  const MBParam * const pParam,
1251                  const MACROBLOCK * const pMBs,                  const MACROBLOCK * const pMBs,
1252                  const MACROBLOCK * const prevMBs,                  const MACROBLOCK * const prevMBs,
                 int inter4v,  
1253                  MACROBLOCK * const pMB)                  MACROBLOCK * const pMB)
1254  {  {
1255    
1256          int i, iDirection = 255, mask, threshA;          int i, iDirection = 255, mask, threshA;
1257          VECTOR pmv[7];          VECTOR pmv[7];
1258            int inter4v = (VopFlags & XVID_VOP_INTER4V) && (pMB->dquant == 0);
1259    
1260          get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 16,          get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 16,
1261                                                  pParam->width, pParam->height, Data->iFcode - Data->qpel, 0, Data->rrv);                                                  pParam->width, pParam->height, Data->iFcode - Data->qpel, 0, Data->rrv);
# Line 1266  Line 1275 
1275          Data->RefP[4] = pRef->u + (x + y * (Data->iEdgedWidth/2)) * 8*i;          Data->RefP[4] = pRef->u + (x + y * (Data->iEdgedWidth/2)) * 8*i;
1276          Data->RefP[5] = pRef->v + (x + y * (Data->iEdgedWidth/2)) * 8*i;          Data->RefP[5] = pRef->v + (x + y * (Data->iEdgedWidth/2)) * 8*i;
1277    
1278          Data->lambda16 = lambda_vec16[iQuant];          Data->lambda16 = lambda_vec16[pMB->quant];
1279          Data->lambda8 = lambda_vec8[iQuant];          Data->lambda8 = lambda_vec8[pMB->quant];
1280          Data->qpel_precision = 0;          Data->qpel_precision = 0;
1281    
         if (pMB->dquant != 0) inter4v = 0;  
   
1282          memset(Data->currentMV, 0, 5*sizeof(VECTOR));          memset(Data->currentMV, 0, 5*sizeof(VECTOR));
1283    
1284          if (Data->qpel) Data->predMV = get_qpmv2(pMBs, pParam->mb_width, 0, x, y, 0);          if (Data->qpel) Data->predMV = get_qpmv2(pMBs, pParam->mb_width, 0, x, y, 0);
# Line 1309  Line 1316 
1316    
1317          if ((Data->iMinSAD[0] <= threshA) ||          if ((Data->iMinSAD[0] <= threshA) ||
1318                          (MVequal(Data->currentMV[0], (prevMBs+x+y*pParam->mb_width)->mvs[0]) &&                          (MVequal(Data->currentMV[0], (prevMBs+x+y*pParam->mb_width)->mvs[0]) &&
1319                          (Data->iMinSAD[0] < (prevMBs+x+y*pParam->mb_width)->sad16))) {                          (Data->iMinSAD[0] < (prevMBs+x+y*pParam->mb_width)->sad16)))
1320                  if (!(VopFlags & XVID_VOP_MODEDECISION_BITS)) inter4v = 0;      }                  inter4v = 0;
1321          else {          else {
1322    
1323                  MainSearchFunc * MainSearchPtr;                  MainSearchFunc * MainSearchPtr;
# Line 1363  Line 1370 
1370                  Data->currentQMV[i].y = 2 * Data->currentMV[i].y;                  Data->currentQMV[i].y = 2 * Data->currentMV[i].y;
1371          }          }
1372    
1373          if (MotionFlags & XVID_ME_QUARTERPELREFINE16) {          if (Data->qpel) {
   
1374                  get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 16,                  get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 16,
1375                                  pParam->width, pParam->height, Data->iFcode, 1, 0);                                  pParam->width, pParam->height, Data->iFcode, 1, 0);
1376                  Data->qpel_precision = 1;                  Data->qpel_precision = 1;
1377                    if (MotionFlags & XVID_ME_QUARTERPELREFINE16)
1378                  SubpelRefine(Data);                  SubpelRefine(Data);
1379          }          }
1380    
1381          if ((!(VopFlags & XVID_VOP_MODEDECISION_BITS)) && (Data->iMinSAD[0] < (int32_t)iQuant * 30)) inter4v = 0;          if (Data->iMinSAD[0] < (int32_t)pMB->quant * 30)
1382                    inter4v = 0;
1383    
1384          if (inter4v) {          if (inter4v) {
1385                  SearchData Data8;                  SearchData Data8;
# Line 1383  Line 1391 
1391                  Search8(Data, 2*x + 1, 2*y + 1, MotionFlags, pParam, pMB, pMBs, 3, &Data8);                  Search8(Data, 2*x + 1, 2*y + 1, MotionFlags, pParam, pMB, pMBs, 3, &Data8);
1392    
1393                  if ((Data->chroma) && (!(VopFlags & XVID_VOP_MODEDECISION_BITS))) {                  if ((Data->chroma) && (!(VopFlags & XVID_VOP_MODEDECISION_BITS))) {
1394                          // chroma is only used for comparsion to INTER. if the comparsion will be done in BITS domain, there is no reason to compute it                          // chroma is only used for comparsion to INTER. if the comparsion will be done in BITS domain, it will not be used
1395                          int sumx = 0, sumy = 0;                          int sumx = 0, sumy = 0;
                         const int div = Data->qpel ? 2 : 1;  
                         const VECTOR * const mv = Data->qpel ? pMB->qmvs : pMB->mvs;  
1396    
1397                          for (i = 0; i < 4; i++) {                          if (Data->qpel)
1398                                  sumx += mv[i].x / div;                                  for (i = 1; i < 5; i++) {
1399                                  sumy += mv[i].y / div;                                          sumx += Data->currentQMV[i].x/2;
1400                                            sumy += Data->currentQMV[i].y/2;
1401                                    }
1402                            else
1403                                    for (i = 1; i < 5; i++) {
1404                                            sumx += Data->currentMV[i].x;
1405                                            sumy += Data->currentMV[i].y;
1406                          }                          }
1407    
1408                          Data->iMinSAD[1] += ChromaSAD(  (sumx >> 3) + roundtab_76[sumx & 0xf],                          Data->iMinSAD[1] += ChromaSAD(  (sumx >> 3) + roundtab_76[sumx & 0xf],
1409                                                                                          (sumy >> 3) + roundtab_76[sumy & 0xf], Data);                                                                                          (sumy >> 3) + roundtab_76[sumy & 0xf], Data);
1410                  }                  }
1411          }          } else Data->iMinSAD[1] = 4096*256;
   
         inter4v = ModeDecision(iQuant, Data, inter4v, pMB, pMBs, x, y, pParam, MotionFlags, VopFlags);  
   
         if (Data->rrv) {  
                         Data->currentMV[0].x = RRV_MV_SCALEDOWN(Data->currentMV[0].x);  
                         Data->currentMV[0].y = RRV_MV_SCALEDOWN(Data->currentMV[0].y);  
         }  
   
         if (inter4v == MODE_INTER) {  
                 pMB->mode = MODE_INTER;  
                 pMB->mvs[0] = pMB->mvs[1] = pMB->mvs[2] = pMB->mvs[3] = Data->currentMV[0];  
                 pMB->sad16 = pMB->sad8[0] = pMB->sad8[1] = pMB->sad8[2] = pMB->sad8[3] = Data->iMinSAD[0];  
   
                 if(Data->qpel) {  
                         pMB->qmvs[0] = pMB->qmvs[1]  
                                 = pMB->qmvs[2] = pMB->qmvs[3] = Data->currentQMV[0];  
                         pMB->pmvs[0].x = Data->currentQMV[0].x - Data->predMV.x;  
                         pMB->pmvs[0].y = Data->currentQMV[0].y - Data->predMV.y;  
                 } else {  
                         pMB->pmvs[0].x = Data->currentMV[0].x - Data->predMV.x;  
                         pMB->pmvs[0].y = Data->currentMV[0].y - Data->predMV.y;  
                 }  
   
         } else if (inter4v == MODE_INTER4V) {  
                 pMB->mode = MODE_INTER4V;  
                 pMB->sad16 = Data->iMinSAD[0];  
         } else { // INTRA mode  
                 SkipMacroblockP(pMB, 0); // not skip, but similar enough  
                 pMB->mode = MODE_INTRA;  
         }  
   
1412  }  }
1413    
1414  static void  static void
# Line 1793  Line 1774 
1774          CheckCandidate(0, 0, 255, &k, Data);          CheckCandidate(0, 0, 255, &k, Data);
1775    
1776  // initial (fast) skip decision  // initial (fast) skip decision
1777          if (*Data->iMinSAD < pMB->quant * INITIAL_SKIP_THRESH * (2 + Data->chroma?1:0)) {          if (*Data->iMinSAD < pMB->quant * INITIAL_SKIP_THRESH * (Data->chroma?3:2)) {
1778                  //possible skip                  //possible skip
1779                  if (Data->chroma) {                  if (Data->chroma) {
1780                          pMB->mode = MODE_DIRECT_NONE_MV;                          pMB->mode = MODE_DIRECT_NONE_MV;
# Line 2178  Line 2159 
2159          }          }
2160  }  }
2161    
2162  #define INTRA_THRESH    2050  #define INTRA_THRESH    1700
2163  #define INTER_THRESH    1200  #define INTER_THRESH    1200
2164    
2165  int  int
# Line 2207  Line 2188 
2188          Data.temp = temp;          Data.temp = temp;
2189          CheckCandidate = CheckCandidate32I;          CheckCandidate = CheckCandidate32I;
2190    
2191          if (intraCount != 0 && intraCount < 10) // we're right after an I frame          if (intraCount != 0) {
2192                  IntraThresh += 8 * (intraCount - 10) * (intraCount - 10);                  if (intraCount < 10) // we're right after an I frame
2193                            IntraThresh += 15* (intraCount - 10) * (intraCount - 10);
2194          else          else
2195                  if ( 5*(maxIntra - intraCount) < maxIntra) // we're close to maximum. 2 sec when max is 10 sec                  if ( 5*(maxIntra - intraCount) < maxIntra) // we're close to maximum. 2 sec when max is 10 sec
2196                          IntraThresh -= (IntraThresh * (maxIntra - 5*(maxIntra - intraCount)))/maxIntra;                                  IntraThresh -= (IntraThresh * (maxIntra - 8*(maxIntra - intraCount)))/maxIntra;
2197            }
2198    
2199          InterThresh -= (350 - 8*b_thresh) * bCount;          InterThresh -= (350 - 8*b_thresh) * bCount;
2200          if (InterThresh < 300 + 5*b_thresh) InterThresh = 300 + 5*b_thresh;          if (InterThresh < 300 + 5*b_thresh) InterThresh = 300 + 5*b_thresh;
# Line 2252  Line 2235 
2235          }          }
2236    
2237          sSAD /= blocks;          sSAD /= blocks;
         s = (10*s) / blocks;  
2238    
2239          if (s > 4) sSAD += (s - 2) * (160 - 2*b_thresh); //static block - looks bad when in bframe...          if (b_thresh < 20) {
2240                    s = (10*s) / blocks;
2241                    if (s > 4) sSAD += (s - 2) * (40 - 2*b_thresh); //static block - looks bad when in bframe...
2242            }
2243    
2244          if (sSAD > InterThresh ) return P_VOP;          if (sSAD > InterThresh ) return P_VOP;
2245          emms();          emms();
# Line 2465  Line 2450 
2450                  Data->qpel_precision = 1;                  Data->qpel_precision = 1;
2451                  CheckCandidateBits16(Data->currentQMV[0].x, Data->currentQMV[0].y, 255, &iDirection, Data);                  CheckCandidateBits16(Data->currentQMV[0].x, Data->currentQMV[0].y, 255, &iDirection, Data);
2452    
                 //checking if this vector is perfect. if it is, we stop.  
                 if (Data->temp[0] == 0 && Data->temp[1] == 0 && Data->temp[2] == 0 && Data->temp[3] == 0)  
                         return 0; //quick stop  
   
2453                  if (MotionFlags & (XVID_ME_HALFPELREFINE16_BITS | XVID_ME_EXTSEARCH_BITS)) { //we have to prepare for halfpixel-precision search                  if (MotionFlags & (XVID_ME_HALFPELREFINE16_BITS | XVID_ME_EXTSEARCH_BITS)) { //we have to prepare for halfpixel-precision search
2454                          for(i = 0; i < 5; i++) bsad[i] = Data->iMinSAD[i];                          for(i = 0; i < 5; i++) bsad[i] = Data->iMinSAD[i];
2455                          get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 16,                          get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 16,
# Line 2481  Line 2462 
2462          } else { // not qpel          } else { // not qpel
2463    
2464                  CheckCandidateBits16(Data->currentMV[0].x, Data->currentMV[0].y, 255, &iDirection, Data);                  CheckCandidateBits16(Data->currentMV[0].x, Data->currentMV[0].y, 255, &iDirection, Data);
                 //checking if this vector is perfect. if it is, we stop.  
                 if (Data->temp[0] == 0 && Data->temp[1] == 0 && Data->temp[2] == 0 && Data->temp[3] == 0) {  
                         return 0; //inter  
                 }  
2465          }          }
2466    
2467          if (MotionFlags&XVID_ME_EXTSEARCH_BITS) SquareSearch(Data->currentMV->x, Data->currentMV->y, Data, iDirection);          if (MotionFlags&XVID_ME_EXTSEARCH_BITS) SquareSearch(Data->currentMV->x, Data->currentMV->y, Data, iDirection);
# Line 2514  Line 2491 
2491          return Data->iMinSAD[0];          return Data->iMinSAD[0];
2492  }  }
2493    
   
2494  static int  static int
2495  CountMBBitsInter4v(const SearchData * const Data,  CountMBBitsInter4v(const SearchData * const Data,
2496                                          MACROBLOCK * const pMB, const MACROBLOCK * const pMBs,                                          MACROBLOCK * const pMB, const MACROBLOCK * const pMBs,
# Line 2527  Line 2503 
2503          SearchData Data2, *Data8 = &Data2;          SearchData Data2, *Data8 = &Data2;
2504          int sumx = 0, sumy = 0;          int sumx = 0, sumy = 0;
2505          int16_t *in = Data->dctSpace, *coeff = Data->dctSpace + 64;          int16_t *in = Data->dctSpace, *coeff = Data->dctSpace + 64;
2506            uint8_t * ptr;
2507    
2508          memcpy(Data8, Data, sizeof(SearchData));          memcpy(Data8, Data, sizeof(SearchData));
2509          CheckCandidate = CheckCandidateBits8;          CheckCandidate = CheckCandidateBits8;
2510    
2511          for (i = 0; i < 4; i++) {          for (i = 0; i < 4; i++) { //for all luma blocks
2512    
2513                  Data8->iMinSAD = Data->iMinSAD + i + 1;                  Data8->iMinSAD = Data->iMinSAD + i + 1;
2514                  Data8->currentMV = Data->currentMV + i + 1;                  Data8->currentMV = Data->currentMV + i + 1;
2515                  Data8->currentQMV = Data->currentQMV + i + 1;                  Data8->currentQMV = Data->currentQMV + i + 1;
# Line 2554  Line 2532 
2532                  get_range(&Data8->min_dx, &Data8->max_dx, &Data8->min_dy, &Data8->max_dy, 2*x + (i&1), 2*y + (i>>1), 8,                  get_range(&Data8->min_dx, &Data8->max_dx, &Data8->min_dy, &Data8->max_dy, 2*x + (i&1), 2*y + (i>>1), 8,
2533                                          pParam->width, pParam->height, Data8->iFcode, Data8->qpel, 0);                                          pParam->width, pParam->height, Data8->iFcode, Data8->qpel, 0);
2534    
2535                  *Data8->iMinSAD += t;                  *Data8->iMinSAD += BITS_MULT*t;
2536    
2537                  Data8->qpel_precision = Data8->qpel;                  Data8->qpel_precision = Data8->qpel;
2538                  // checking the vector which has been found by SAD-based 8x8 search (if it's different than the one found so far)                  // checking the vector which has been found by SAD-based 8x8 search (if it's different than the one found so far)
2539                  {                  {
2540                          VECTOR *v = Data8->qpel ? Data8->currentQMV : Data8->currentMV;                          VECTOR *v = Data8->qpel ? Data8->currentQMV : Data8->currentMV;
2541                          if (!( (v->x == backup[i+1].x) && (v->y == backup[i+1].y) ))                          if (!MVequal (*v, backup[i+1]) )
2542                                  CheckCandidateBits8(backup[i+1].x, backup[i+1].y, 255, &iDirection, Data8);                                  CheckCandidateBits8(backup[i+1].x, backup[i+1].y, 255, &iDirection, Data8);
2543                  }                  }
2544    
# Line 2579  Line 2557 
2557                                  if (MotionFlags & XVID_ME_EXTSEARCH8 && MotionFlags & XVID_ME_EXTSEARCH_BITS)                                  if (MotionFlags & XVID_ME_EXTSEARCH8 && MotionFlags & XVID_ME_EXTSEARCH_BITS)
2558                                          SquareSearch(Data8->currentMV->x, Data8->currentMV->x, Data8, 255);                                          SquareSearch(Data8->currentMV->x, Data8->currentMV->x, Data8, 255);
2559    
2560                                  if (MotionFlags & XVID_ME_HALFPELREFINE8_BITS) SubpelRefine(Data8);                                  if (MotionFlags & XVID_ME_HALFPELREFINE8_BITS)
2561                                            SubpelRefine(Data8);
2562    
2563                                  if(s > *Data8->iMinSAD) { //we have found a better match                                  if(s > *Data8->iMinSAD) { //we have found a better match
2564                                          Data8->currentQMV->x = 2*Data8->currentMV->x;                                          Data8->currentQMV->x = 2*Data8->currentMV->x;
# Line 2593  Line 2572 
2572                          }                          }
2573                          if (MotionFlags & XVID_ME_QUARTERPELREFINE8_BITS) SubpelRefine(Data8);                          if (MotionFlags & XVID_ME_QUARTERPELREFINE8_BITS) SubpelRefine(Data8);
2574    
2575                  } else // not qpel                  } else { // not qpel
2576                          if (MotionFlags & XVID_ME_HALFPELREFINE8_BITS) SubpelRefine(Data8); //halfpel mode, halfpel refinement  
2577                            if (MotionFlags & XVID_ME_EXTSEARCH8 && MotionFlags & XVID_ME_EXTSEARCH_BITS) //extsearch
2578                                    SquareSearch(Data8->currentMV->x, Data8->currentMV->x, Data8, 255);
2579    
2580                            if (MotionFlags & XVID_ME_HALFPELREFINE8_BITS)
2581                                    SubpelRefine(Data8); //halfpel refinement
2582                    }
2583    
2584                  //checking vector equal to predicion                  //checking vector equal to predicion
2585                  if (i != 0 && MotionFlags & XVID_ME_CHECKPREDICTION_BITS) {                  if (i != 0 && MotionFlags & XVID_ME_CHECKPREDICTION_BITS) {
2586                          const VECTOR * v = Data->qpel ? Data8->currentQMV : Data8->currentMV;                          const VECTOR * v = Data->qpel ? Data8->currentQMV : Data8->currentMV;
2587                          if (!(Data8->predMV.x == v->x && Data8->predMV.y == v->y))                          if (!MVequal(*v, Data8->predMV))
2588                                  CheckCandidateBits8(Data8->predMV.x, Data8->predMV.y, 255, &iDirection, Data8);                                  CheckCandidateBits8(Data8->predMV.x, Data8->predMV.y, 255, &iDirection, Data8);
2589                  }                  }
2590    
2591                  bits += *Data8->iMinSAD;                  bits += *Data8->iMinSAD;
2592                  if (bits >= Data->iMinSAD[0]) break; // no chances for INTER4V                  if (bits >= Data->iMinSAD[0]) return bits; // no chances for INTER4V
2593    
2594                  // MB structures for INTER4V mode; we have to set them here, we don't have predictor anywhere else                  // MB structures for INTER4V mode; we have to set them here, we don't have predictor anywhere else
2595                  if(Data->qpel) {                  if(Data->qpel) {
# Line 2622  Line 2607 
2607                  pMB->mvs[i] = *Data8->currentMV;                  pMB->mvs[i] = *Data8->currentMV;
2608                  pMB->sad8[i] = 4 * *Data8->iMinSAD;                  pMB->sad8[i] = 4 * *Data8->iMinSAD;
2609                  if (Data8->temp[0]) cbp |= 1 << (5 - i);                  if (Data8->temp[0]) cbp |= 1 << (5 - i);
         }  
2610    
2611          if (bits < *Data->iMinSAD) { // there is still a chance for inter4v mode. let's check chroma          } // /for all luma blocks
2612                  const uint8_t * ptr;  
2613            bits += BITS_MULT*xvid_cbpy_tab[15-(cbp>>2)].len;
2614    
2615            // let's check chroma
2616                  sumx = (sumx >> 3) + roundtab_76[sumx & 0xf];                  sumx = (sumx >> 3) + roundtab_76[sumx & 0xf];
2617                  sumy = (sumy >> 3) + roundtab_76[sumy & 0xf];                  sumy = (sumy >> 3) + roundtab_76[sumy & 0xf];
2618    
2619                  //chroma U                  //chroma U
2620                  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);
2621                  transfer_8to16subro(in, Data->CurU, ptr, Data->iEdgedWidth/2);                  transfer_8to16subro(in, Data->CurU, ptr, Data->iEdgedWidth/2);
2622                  fdct(in);          bits += Block_CalcBits(coeff, in, Data->iQuant, Data->quant_type, &cbp, 4);
2623                  if (Data->lambda8 == 0) i = quant_inter(coeff, in, Data->lambda16);  
2624                  else i = quant4_inter(coeff, in, Data->lambda16);          if (bits >= *Data->iMinSAD) return bits;
                 if (i > 0) {  
                         bits += CodeCoeffInter_CalcBits(coeff, scan_tables[0]);  
                         cbp |= 1 << (5 - 4);  
                 }  
2625    
                 if (bits < *Data->iMinSAD) { // still possible  
2626                          //chroma V                          //chroma V
2627                          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);
2628                          transfer_8to16subro(in, Data->CurV, ptr, Data->iEdgedWidth/2);                          transfer_8to16subro(in, Data->CurV, ptr, Data->iEdgedWidth/2);
2629                          fdct(in);          bits += Block_CalcBits(coeff, in, Data->iQuant, Data->quant_type, &cbp, 5);
2630                          if (Data->lambda8 == 0) i = quant_inter(coeff, in, Data->lambda16);  
2631                          else i = quant4_inter(coeff, in, Data->lambda16);          bits += BITS_MULT*mcbpc_inter_tab[(MODE_INTER4V & 7) | ((cbp & 3) << 3)].len;
                         if (i > 0) {  
                                 bits += CodeCoeffInter_CalcBits(coeff, scan_tables[0]);  
                                 cbp |= 1 << (5 - 5);  
                         }  
                         bits += xvid_cbpy_tab[15-(cbp>>2)].len;  
                         bits += mcbpc_inter_tab[(MODE_INTER4V & 7) | ((cbp & 3) << 3)].len;  
                 }  
         }  
2632    
2633          return bits;          return bits;
2634  }  }
2635    
   
2636  static int  static int
2637  CountMBBitsIntra(const SearchData * const Data)  CountMBBitsIntra(const SearchData * const Data)
2638  {  {
2639          int bits = 1; //this one is ac/dc prediction flag. always 1.          int bits = BITS_MULT*1; //this one is ac/dc prediction flag bit
2640          int cbp = 0, i, t, dc = 1024, b_dc;          int cbp = 0, i, dc = 0;
         const uint32_t iQuant = Data->lambda16;  
2641          int16_t *in = Data->dctSpace, * coeff = Data->dctSpace + 64;          int16_t *in = Data->dctSpace, * coeff = Data->dctSpace + 64;
         uint32_t iDcScaler = get_dc_scaler(iQuant, 1);;  
2642    
2643          for(i = 0; i < 4; i++) {          for(i = 0; i < 4; i++) {
2644                  int s = 8*((i&1) + (i>>1)*Data->iEdgedWidth);                  int s = 8*((i&1) + (i>>1)*Data->iEdgedWidth);
2645                  transfer_8to16copy(in, Data->Cur + s, Data->iEdgedWidth);                  transfer_8to16copy(in, Data->Cur + s, Data->iEdgedWidth);
2646                  fdct(in);                  bits += Block_CalcBitsIntra(coeff, in, Data->iQuant, Data->quant_type, &cbp, i, &dc);
2647                  b_dc = in[0];  
2648                  in[0] -= dc;                  if (bits >= Data->iMinSAD[0]) return bits;
                 dc = b_dc;  
                 if (Data->lambda8 == 0) quant_intra(coeff, in, iQuant, iDcScaler);  
                 else quant4_intra(coeff, in, iQuant, iDcScaler);  
   
                 bits += t = CodeCoeffIntra_CalcBits(coeff, scan_tables[0]) + dcy_tab[coeff[0] + 255].len;;  
                 Data->temp[i] = t;  
                 if (t != 0)  cbp |= 1 << (5 - i);  
                 if (bits >= Data->iMinSAD[0]) break;  
2649          }          }
2650    
2651          if (bits < Data->iMinSAD[0]) { // INTRA still looks good, let's add chroma          bits += BITS_MULT*xvid_cbpy_tab[cbp>>2].len;
2652                  iDcScaler = get_dc_scaler(iQuant, 0);  
2653                  //chroma U                  //chroma U
2654                  transfer_8to16copy(in, Data->CurU, Data->iEdgedWidth/2);                  transfer_8to16copy(in, Data->CurU, Data->iEdgedWidth/2);
2655                  fdct(in);          bits += Block_CalcBitsIntra(coeff, in, Data->iQuant, Data->quant_type, &cbp, 4, &dc);
                 in[0] -= 1024;  
                 if (Data->lambda8 == 0) quant_intra(coeff, in, iQuant, iDcScaler);  
                 else quant4_intra(coeff, in, iQuant, iDcScaler);  
2656    
2657                  bits += t = CodeCoeffIntra_CalcBits(coeff, scan_tables[0]) + dcc_tab[coeff[0] + 255].len;          if (bits >= Data->iMinSAD[0]) return bits;
                 if (t != 0) cbp |= 1 << (5 - 4);  
2658    
                 if (bits < Data->iMinSAD[0]) {  
2659                          //chroma V                          //chroma V
2660                          transfer_8to16copy(in, Data->CurV, Data->iEdgedWidth/2);                          transfer_8to16copy(in, Data->CurV, Data->iEdgedWidth/2);
2661                          fdct(in);          bits += Block_CalcBitsIntra(coeff, in, Data->iQuant, Data->quant_type, &cbp, 5, &dc);
                         in[0] -= 1024;  
                         if (Data->lambda8 == 0) quant_intra(coeff, in, iQuant, iDcScaler);  
                         else quant4_intra(coeff, in, iQuant, iDcScaler);  
2662    
2663                          bits += t = CodeCoeffIntra_CalcBits(coeff, scan_tables[0]) + dcc_tab[coeff[0] + 255].len;          bits += BITS_MULT*mcbpc_inter_tab[(MODE_INTRA & 7) | ((cbp & 3) << 3)].len;
                         if (t != 0) cbp |= 1 << (5 - 5);  
2664    
                         bits += xvid_cbpy_tab[cbp>>2].len;  
                         bits += mcbpc_inter_tab[(MODE_INTRA & 7) | ((cbp & 3) << 3)].len;  
                 }  
         }  
2665          return bits;          return bits;
2666  }  }

Legend:
Removed from v.987  
changed lines
  Added in v.1023

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