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

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

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

revision 1.46, Mon Mar 22 22:36:23 2004 UTC revision 1.49, Wed Dec 8 12:43:48 2004 UTC
# Line 38  Line 38 
38    
39  #define LEVELOFFSET 32  #define LEVELOFFSET 32
40    
41    /* Initialized once during xvid_global call
42     * RO access is thread safe */
43  static REVERSE_EVENT DCT3D[2][4096];  static REVERSE_EVENT DCT3D[2][4096];
44  static VLC coeff_VLC[2][2][64][64];  static VLC coeff_VLC[2][2][64][64];
45    
# Line 197  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 210  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 453  Line 451 
451          return bits;          return bits;
452  }  }
453    
454  static int iDQtab[5] = {  static const int iDQtab[5] = {
455          1, 0, -1 /* no change */, 2, 3          1, 0, -1 /* no change */, 2, 3
456  };  };
457  #define DQ_VALUE2INDEX(value)  iDQtab[(value)+2]  #define DQ_VALUE2INDEX(value)  iDQtab[(value)+2]
# Line 577  Line 575 
575          /* code motion vector(s) if motion is local  */          /* code motion vector(s) if motion is local  */
576          if (!pMB->mcsel)          if (!pMB->mcsel)
577                  for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) {                  for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) {
578                          CodeVector(bs, pMB->pmvs[i].x, frame->fcode, pStat);                          CodeVector(bs, pMB->pmvs[i].x, frame->fcode);
579                          CodeVector(bs, pMB->pmvs[i].y, frame->fcode, pStat);                          CodeVector(bs, pMB->pmvs[i].y, frame->fcode);
580                  }                  }
581    
582          bits = BitstreamPos(bs);          bits = BitstreamPos(bs);
# Line 746  Line 744 
744    
745          switch (mb->mode) {          switch (mb->mode) {
746                  case MODE_INTERPOLATE:                  case MODE_INTERPOLATE:
747                          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 */
748                          CodeVector(bs, mb->pmvs[1].y, vcode, pStat);                          CodeVector(bs, mb->pmvs[1].y, vcode);
749                  case MODE_BACKWARD:                  case MODE_BACKWARD:
750                          vcode = bcode;                          vcode = bcode;
751                  case MODE_FORWARD:                  case MODE_FORWARD:
752                          CodeVector(bs, mb->pmvs[0].x, vcode, pStat);                          CodeVector(bs, mb->pmvs[0].x, vcode);
753                          CodeVector(bs, mb->pmvs[0].y, vcode, pStat);                          CodeVector(bs, mb->pmvs[0].y, vcode);
754                          break;                          break;
755                  case MODE_DIRECT:                  case MODE_DIRECT:
756                          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 */
757                          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) */
758                  default: break;                  default: break;
759          }          }
760    
# Line 958  Line 956 
956    
957  }  }
958    
959    #define GET_BITS(cache, n) ((cache)>>(32-(n)))
960    
961  static __inline int  static __inline int
962  get_coeff(Bitstream * bs,  get_coeff(Bitstream * bs,
963                    int *run,                    int *run,
# Line 970  Line 970 
970          int32_t level;          int32_t level;
971          REVERSE_EVENT *reverse_event;          REVERSE_EVENT *reverse_event;
972    
973            uint32_t cache = BitstreamShowBits(bs, 32);
974    
975          if (short_video_header)         /* inter-VLCs will be used for both intra and inter blocks */          if (short_video_header)         /* inter-VLCs will be used for both intra and inter blocks */
976                  intra = 0;                  intra = 0;
977    
978          if (BitstreamShowBits(bs, 7) != ESCAPE) {          if (GET_BITS(cache, 7) != ESCAPE) {
979                  reverse_event = &DCT3D[intra][BitstreamShowBits(bs, 12)];                  reverse_event = &DCT3D[intra][GET_BITS(cache, 12)];
980    
981                  if ((level = reverse_event->event.level) == 0)                  if ((level = reverse_event->event.level) == 0)
982                          goto error;                          goto error;
# Line 982  Line 984 
984                  *last = reverse_event->event.last;                  *last = reverse_event->event.last;
985                  *run  = reverse_event->event.run;                  *run  = reverse_event->event.run;
986    
987                  BitstreamSkip(bs, reverse_event->len);                  /* Don't forget to update the bitstream position */
988                    BitstreamSkip(bs, reverse_event->len+1);
989    
990                  return BitstreamGetBits(bs, 1) ? -level : level;                  return (GET_BITS(cache, reverse_event->len+1)&0x01) ? -level : level;
991          }          }
992    
993          BitstreamSkip(bs, 7);          /* flush 7bits of cache */
994            cache <<= 7;
995    
996          if (short_video_header) {          if (short_video_header) {
997                  /* escape mode 4 - H.263 type, only used if short_video_header = 1  */                  /* escape mode 4 - H.263 type, only used if short_video_header = 1  */
998                  *last = BitstreamGetBit(bs);                  *last =  GET_BITS(cache, 1);
999                  *run = BitstreamGetBits(bs, 6);                  *run  = (GET_BITS(cache, 7) &0x3f);
1000                  level = BitstreamGetBits(bs, 8);                  level = (GET_BITS(cache, 15)&0xff);
1001    
1002                  if (level == 0 || level == 128)                  if (level == 0 || level == 128)
1003                          DPRINTF(XVID_DEBUG_ERROR, "Illegal LEVEL for ESCAPE mode 4: %d\n", level);                          DPRINTF(XVID_DEBUG_ERROR, "Illegal LEVEL for ESCAPE mode 4: %d\n", level);
1004    
1005                    /* We've "eaten" 22 bits */
1006                    BitstreamSkip(bs, 22);
1007    
1008                  return (level << 24) >> 24;                  return (level << 24) >> 24;
1009          }          }
1010    
1011          mode = BitstreamShowBits(bs, 2);          if ((mode = GET_BITS(cache, 2)) < 3) {
1012                    const int skip[3] = {1, 1, 2};
1013          if (mode < 3) {                  cache <<= skip[mode];
                 BitstreamSkip(bs, (mode == 2) ? 2 : 1);  
1014    
1015                  reverse_event = &DCT3D[intra][BitstreamShowBits(bs, 12)];                  reverse_event = &DCT3D[intra][GET_BITS(cache, 12)];
1016    
1017                  if ((level = reverse_event->event.level) == 0)                  if ((level = reverse_event->event.level) == 0)
1018                          goto error;                          goto error;
# Line 1014  Line 1020 
1020                  *last = reverse_event->event.last;                  *last = reverse_event->event.last;
1021                  *run  = reverse_event->event.run;                  *run  = reverse_event->event.run;
1022    
1023                  BitstreamSkip(bs, reverse_event->len);                  if (mode < 2) {
1024                            /* first escape mode, level is offset */
                 if (mode < 2)                   /* first escape mode, level is offset */  
1025                          level += max_level[intra][*last][*run];                          level += max_level[intra][*last][*run];
1026                  else                                    /* second escape mode, run is offset */                  } else {
1027                            /* second escape mode, run is offset */
1028                          *run += max_run[intra][*last][level] + 1;                          *run += max_run[intra][*last][level] + 1;
1029                    }
1030    
1031                  return BitstreamGetBits(bs, 1) ? -level : level;                  /* Update bitstream position */
1032                    BitstreamSkip(bs, 7 + skip[mode] + reverse_event->len + 1);
1033    
1034                    return (GET_BITS(cache, reverse_event->len+1)&0x01) ? -level : level;
1035          }          }
1036    
1037          /* third escape mode - fixed length codes */          /* third escape mode - fixed length codes */
1038          BitstreamSkip(bs, 2);          cache <<= 2;
1039          *last = BitstreamGetBits(bs, 1);          *last =  GET_BITS(cache, 1);
1040          *run = BitstreamGetBits(bs, 6);          *run  = (GET_BITS(cache, 7)&0x3f);
1041          BitstreamSkip(bs, 1);           /* marker */          level = (GET_BITS(cache, 20)&0xfff);
1042          level = BitstreamGetBits(bs, 12);  
1043          BitstreamSkip(bs, 1);           /* marker */          /* Update bitstream position */
1044            BitstreamSkip(bs, 30);
1045    
1046          return (level << 20) >> 20;          return (level << 20) >> 20;
1047    
# Line 1072  Line 1083 
1083  }  }
1084    
1085  void  void
1086  get_inter_block(Bitstream * bs,  get_inter_block_h263(
1087                    Bitstream * bs,
1088                                  int16_t * block,                                  int16_t * block,
1089                                  int direction)                  int direction,
1090                    const int quant,
1091                    const uint16_t *matrix)
1092  {  {
1093    
1094          const uint16_t *scan = scan_tables[direction];          const uint16_t *scan = scan_tables[direction];
1095            const uint16_t quant_m_2 = quant << 1;
1096            const uint16_t quant_add = (quant & 1 ? quant : quant - 1);
1097          int p;          int p;
1098          int level;          int level;
1099          int run;          int run;
# Line 1092  Line 1108 
1108                  }                  }
1109                  p += run;                  p += run;
1110    
1111                  block[scan[p]] = level;                  if (level < 0) {
1112                            level = level*quant_m_2 - quant_add;
1113                            block[scan[p]] = (level >= -2048 ? level : -2048);
1114                    } else {
1115                            level = level * quant_m_2 + quant_add;
1116                            block[scan[p]] = (level <= 2047 ? level : 2047);
1117                    }
1118                    p++;
1119            } while (!last);
1120    }
1121    
1122    void
1123    get_inter_block_mpeg(
1124                    Bitstream * bs,
1125                    int16_t * block,
1126                    int direction,
1127                    const int quant,
1128                    const uint16_t *matrix)
1129    {
1130            const uint16_t *scan = scan_tables[direction];
1131            uint32_t sum = 0;
1132            int p;
1133            int level;
1134            int run;
1135            int last;
1136    
1137                  DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i\n", scan[p], level);          p = 0;
1138                  /* DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i %08x\n", scan[p], level, BitstreamShowBits(bs, 32)); */          do {
1139                    level = get_coeff(bs, &run, &last, 0, 0);
1140                    if (run == -1) {
1141                            DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run");
1142                            break;
1143                    }
1144                    p += run;
1145    
1146                  if (level < -2047 || level > 2047) {                  if (level < 0) {
1147                          DPRINTF(XVID_DEBUG_ERROR,"warning: inter overflow %i\n", level);                          level = ((2 * -level + 1) * matrix[scan[p]] * quant) >> 4;
1148                            block[scan[p]] = (level <= 2048 ? -level : -2048);
1149                    } else {
1150                            level = ((2 *  level + 1) * matrix[scan[p]] * quant) >> 4;
1151                            block[scan[p]] = (level <= 2047 ? level : 2047);
1152                  }                  }
1153    
1154                    sum ^= block[scan[p]];
1155    
1156                  p++;                  p++;
1157          } while (!last);          } while (!last);
1158    
1159            /*      mismatch control */
1160            if ((sum & 1) == 0) {
1161                    block[63] ^= 1;
1162            }
1163  }  }
1164    
1165    

Legend:
Removed from v.1.46  
changed lines
  Added in v.1.49

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