[svn] / trunk / xvidcore / src / bitstream / mbcoding.c Repository:
ViewVC logotype

Diff of /trunk/xvidcore/src/bitstream/mbcoding.c

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

revision 1537, Sun Aug 22 13:16:12 2004 UTC revision 1677, Thu Jan 19 22:25:23 2006 UTC
# Line 19  Line 19 
19   *  along with this program ; if not, write to the Free Software   *  along with this program ; if not, write to the Free Software
20   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21   *   *
22   * $Id: mbcoding.c,v 1.48 2004-08-22 13:16:12 edgomez Exp $   * $Id: mbcoding.c,v 1.53 2006-01-19 22:25:23 Isibaar Exp $
23   *   *
24   ****************************************************************************/   ****************************************************************************/
25    
# Line 199  Line 199 
199  static __inline void  static __inline void
200  CodeVector(Bitstream * bs,  CodeVector(Bitstream * bs,
201                     int32_t value,                     int32_t value,
202                     int32_t f_code,                     int32_t f_code)
                    Statistics * pStat)  
203  {  {
204    
205          const int scale_factor = 1 << (f_code - 1);          const int scale_factor = 1 << (f_code - 1);
# Line 212  Line 211 
211          if (value > (cmp - 1))          if (value > (cmp - 1))
212                  value -= 64 * scale_factor;                  value -= 64 * scale_factor;
213    
         pStat->iMvSum += value * value;  
         pStat->iMvCount++;  
   
214          if (value == 0) {          if (value == 0) {
215                  BitstreamPutBits(bs, mb_motion_table[32].code,                  BitstreamPutBits(bs, mb_motion_table[32].code,
216                                                   mb_motion_table[32].len);                                                   mb_motion_table[32].len);
# Line 576  Line 572 
572  #endif  #endif
573                  }                  }
574          }          }
575    
576            bits = BitstreamPos(bs);
577    
578          /* code motion vector(s) if motion is local  */          /* code motion vector(s) if motion is local  */
579          if (!pMB->mcsel)          if (!pMB->mcsel)
580                  for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) {                  for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) {
581                          CodeVector(bs, pMB->pmvs[i].x, frame->fcode, pStat);                          CodeVector(bs, pMB->pmvs[i].x, frame->fcode);
582                          CodeVector(bs, pMB->pmvs[i].y, frame->fcode, pStat);                          CodeVector(bs, pMB->pmvs[i].y, frame->fcode);
583                  }                  }
584    
585            bits = BitstreamPos(bs) - bits;
586            pStat->iMVBits += bits;
587    
588          bits = BitstreamPos(bs);          bits = BitstreamPos(bs);
589    
590          /* code block coeffs */          /* code block coeffs */
# Line 610  Line 612 
612          if (frame->coding_type != I_VOP)          if (frame->coding_type != I_VOP)
613                          BitstreamPutBit(bs, 0); /* not_coded */                          BitstreamPutBit(bs, 0); /* not_coded */
614    
615            if (frame->vop_flags & XVID_VOP_GREYSCALE) {
616                    pMB->cbp &= 0x3C;               /* keep only bits 5-2 */
617                    qcoeff[4*64+0]=0;               /* for INTRA DC value is saved */
618                    qcoeff[5*64+0]=0;
619            }
620    
621          if (pMB->mode == MODE_INTRA || pMB->mode == MODE_INTRA_Q)          if (pMB->mode == MODE_INTRA || pMB->mode == MODE_INTRA_Q)
622                  CodeBlockIntra(frame, pMB, qcoeff, bs, pStat);                  CodeBlockIntra(frame, pMB, qcoeff, bs, pStat);
623          else          else
# Line 696  Line 704 
704                  scan_tables[2] : scan_tables[0];                  scan_tables[2] : scan_tables[0];
705          int bits;          int bits;
706    
   
707  /*      ------------------------------------------------------------------  /*      ------------------------------------------------------------------
708                  when a block is skipped it is decoded DIRECT(0,0)                  when a block is skipped it is decoded DIRECT(0,0)
709                  hence is interpolated from forward & backward frames                  hence is interpolated from forward & backward frames
# Line 745  Line 752 
752                  }                  }
753          }          }
754    
755            bits = BitstreamPos(bs);
756    
757          switch (mb->mode) {          switch (mb->mode) {
758                  case MODE_INTERPOLATE:                  case MODE_INTERPOLATE:
759                          CodeVector(bs, mb->pmvs[1].x, vcode, pStat); /* forward vector of interpolate mode */                          CodeVector(bs, mb->pmvs[1].x, vcode); /* forward vector of interpolate mode */
760                          CodeVector(bs, mb->pmvs[1].y, vcode, pStat);                          CodeVector(bs, mb->pmvs[1].y, vcode);
761                  case MODE_BACKWARD:                  case MODE_BACKWARD:
762                          vcode = bcode;                          vcode = bcode;
763                  case MODE_FORWARD:                  case MODE_FORWARD:
764                          CodeVector(bs, mb->pmvs[0].x, vcode, pStat);                          CodeVector(bs, mb->pmvs[0].x, vcode);
765                          CodeVector(bs, mb->pmvs[0].y, vcode, pStat);                          CodeVector(bs, mb->pmvs[0].y, vcode);
766                          break;                          break;
767                  case MODE_DIRECT:                  case MODE_DIRECT:
768                          CodeVector(bs, mb->pmvs[3].x, 1, pStat);        /* fcode is always 1 for delta vector */                          CodeVector(bs, mb->pmvs[3].x, 1);       /* fcode is always 1 for delta vector */
769                          CodeVector(bs, mb->pmvs[3].y, 1, pStat);        /* prediction is always (0,0) */                          CodeVector(bs, mb->pmvs[3].y, 1);       /* prediction is always (0,0) */
770                  default: break;                  default: break;
771          }          }
772            pStat->iMVBits += BitstreamPos(bs) - bits;
773    
774          bits = BitstreamPos(bs);          bits = BitstreamPos(bs);
775          for (i = 0; i < 6; i++) {          for (i = 0; i < 6; i++) {
# Line 1071  Line 1080 
1080                          break;                          break;
1081                  }                  }
1082                  coeff += run;                  coeff += run;
1083    
1084    #ifdef _DEBUG
1085                    if(coeff>=64) {
1086                      DPRINTF(XVID_DEBUG_ERROR,"error: overflow in coefficient index\n");
1087                      return;
1088                    }
1089    #endif
1090    
1091                  block[scan[coeff]] = level;                  block[scan[coeff]] = level;
1092    
1093                  DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i\n", scan[coeff], level);                  DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i\n", scan[coeff], level);
# Line 1112  Line 1129 
1129                  }                  }
1130                  p += run;                  p += run;
1131    
1132    #ifdef _DEBUG
1133                    if(p>=64)       {
1134                      DPRINTF(XVID_DEBUG_ERROR,"error: overflow in coefficient index\n");
1135                      return;
1136                    }
1137    #endif
1138    
1139                  if (level < 0) {                  if (level < 0) {
1140                          level = level*quant_m_2 - quant_add;                          level = level*quant_m_2 - quant_add;
1141                          block[scan[p]] = (level >= -2048 ? level : -2048);                          block[scan[p]] = (level >= -2048 ? level : -2048);
# Line 1147  Line 1171 
1171                  }                  }
1172                  p += run;                  p += run;
1173    
1174    #ifdef _DEBUG
1175                    if(p>=64)       {
1176                      DPRINTF(XVID_DEBUG_ERROR,"error: overflow in coefficient index\n");
1177                      return;
1178                    }
1179    #endif
1180    
1181                  if (level < 0) {                  if (level < 0) {
1182                          level = ((2 * -level + 1) * matrix[scan[p]] * quant) >> 4;                          level = ((2 * -level + 1) * matrix[scan[p]] * quant) >> 4;
1183                          block[scan[p]] = (level <= 2048 ? -level : -2048);                          block[scan[p]] = (level <= 2048 ? -level : -2048);
# Line 1943  Line 1974 
1974  };  };
1975    
1976  short const dc_threshold[] = {  short const dc_threshold[] = {
1977          21514, 26984,  8307, 28531, 29798, 24951, 25970, 26912,          26708, 29545, 29472, 26223, 30580, 29281,  8293, 29545,
1978           8307, 25956, 26994, 25974,  8292, 29286, 28015, 29728,          25632, 29285, 30313, 25701, 26144, 28530,  8301, 26740,
1979          25960, 18208, 21838, 18208, 19536, 22560, 26998,  8260,           8293, 20039,  8277, 20551,  8268, 30296, 17513, 25376,
1980          28515, 25956,  8291, 25640, 30309, 27749, 11817, 22794,          25711, 25445, 10272, 11825, 11825, 10544,  2606, 28505,
1981          30063,  8306, 28531, 29798, 24951, 25970, 25632, 29545,          29301, 29472, 26223, 30580, 29281,  8293, 26980, 29811,
1982          29300, 25193, 29813, 29295, 26656, 29537, 29728,  8303,          26994, 30050, 28532,  8306, 24936,  8307, 28532, 26400,
1983          26983, 25974, 24864, 25443, 29541,  8307, 28532, 26912,          30313,  8293, 25441, 25955, 29555, 29728,  8303, 29801,
1984          29556, 29472, 30063, 25458,  8293, 28515, 25956,  2606           8307, 28531, 29301, 25955, 25376, 25711, 11877,    10
1985  };  };
1986    
1987  VLC const dc_lum_tab[] = {  VLC const dc_lum_tab[] = {

Legend:
Removed from v.1537  
changed lines
  Added in v.1677

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