[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 1485, Sat Jul 10 17:42:18 2004 UTC revision 1486, Sat Jul 10 17:49:31 2004 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.46 2004-03-22 22:36:23 edgomez Exp $   * $Id: mbcoding.c,v 1.47 2004-07-10 17:49:31 edgomez Exp $
23   *   *
24   ****************************************************************************/   ****************************************************************************/
25    
# Line 958  Line 958 
958    
959  }  }
960    
961    #define GET_BITS(cache, n) ((cache)>>(32-(n)))
962    
963  static __inline int  static __inline int
964  get_coeff(Bitstream * bs,  get_coeff(Bitstream * bs,
965                    int *run,                    int *run,
# Line 970  Line 972 
972          int32_t level;          int32_t level;
973          REVERSE_EVENT *reverse_event;          REVERSE_EVENT *reverse_event;
974    
975            uint32_t cache = BitstreamShowBits(bs, 32);
976    
977          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 */
978                  intra = 0;                  intra = 0;
979    
980          if (BitstreamShowBits(bs, 7) != ESCAPE) {          if (GET_BITS(cache, 7) != ESCAPE) {
981                  reverse_event = &DCT3D[intra][BitstreamShowBits(bs, 12)];                  reverse_event = &DCT3D[intra][GET_BITS(cache, 12)];
982    
983                  if ((level = reverse_event->event.level) == 0)                  if ((level = reverse_event->event.level) == 0)
984                          goto error;                          goto error;
# Line 982  Line 986 
986                  *last = reverse_event->event.last;                  *last = reverse_event->event.last;
987                  *run  = reverse_event->event.run;                  *run  = reverse_event->event.run;
988    
989                  BitstreamSkip(bs, reverse_event->len);                  /* Don't forget to update the bitstream position */
990                    BitstreamSkip(bs, reverse_event->len+1);
991    
992                  return BitstreamGetBits(bs, 1) ? -level : level;                  return (GET_BITS(cache, reverse_event->len+1)&0x01) ? -level : level;
993          }          }
994    
995          BitstreamSkip(bs, 7);          /* flush 7bits of cache */
996            cache <<= 7;
997    
998          if (short_video_header) {          if (short_video_header) {
999                  /* 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  */
1000                  *last = BitstreamGetBit(bs);                  *last =  GET_BITS(cache, 1);
1001                  *run = BitstreamGetBits(bs, 6);                  *run  = (GET_BITS(cache, 7) &0x3f);
1002                  level = BitstreamGetBits(bs, 8);                  level = (GET_BITS(cache, 15)&0xff);
1003    
1004                  if (level == 0 || level == 128)                  if (level == 0 || level == 128)
1005                          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);
1006    
1007                    /* We've "eaten" 22 bits */
1008                    BitstreamSkip(bs, 22);
1009    
1010                  return (level << 24) >> 24;                  return (level << 24) >> 24;
1011          }          }
1012    
1013          mode = BitstreamShowBits(bs, 2);          if ((mode = GET_BITS(cache, 2)) < 3) {
1014                    const int skip[3] = {1, 1, 2};
1015                    cache <<= skip[mode];
1016    
1017          if (mode < 3) {                  reverse_event = &DCT3D[intra][GET_BITS(cache, 12)];
                 BitstreamSkip(bs, (mode == 2) ? 2 : 1);  
   
                 reverse_event = &DCT3D[intra][BitstreamShowBits(bs, 12)];  
1018    
1019                  if ((level = reverse_event->event.level) == 0)                  if ((level = reverse_event->event.level) == 0)
1020                          goto error;                          goto error;
# Line 1014  Line 1022 
1022                  *last = reverse_event->event.last;                  *last = reverse_event->event.last;
1023                  *run  = reverse_event->event.run;                  *run  = reverse_event->event.run;
1024    
1025                  BitstreamSkip(bs, reverse_event->len);                  if (mode < 2) {
1026                            /* first escape mode, level is offset */
                 if (mode < 2)                   /* first escape mode, level is offset */  
1027                          level += max_level[intra][*last][*run];                          level += max_level[intra][*last][*run];
1028                  else                                    /* second escape mode, run is offset */                  } else {
1029                            /* second escape mode, run is offset */
1030                          *run += max_run[intra][*last][level] + 1;                          *run += max_run[intra][*last][level] + 1;
1031                    }
1032    
1033                    /* Update bitstream position */
1034                    BitstreamSkip(bs, 7 + skip[mode] + reverse_event->len + 1);
1035    
1036                  return BitstreamGetBits(bs, 1) ? -level : level;                  return (GET_BITS(cache, reverse_event->len+1)&0x01) ? -level : level;
1037          }          }
1038    
1039          /* third escape mode - fixed length codes */          /* third escape mode - fixed length codes */
1040          BitstreamSkip(bs, 2);          cache <<= 2;
1041          *last = BitstreamGetBits(bs, 1);          *last =  GET_BITS(cache, 1);
1042          *run = BitstreamGetBits(bs, 6);          *run  = (GET_BITS(cache, 7)&0x3f);
1043          BitstreamSkip(bs, 1);           /* marker */          level = (GET_BITS(cache, 20)&0xfff);
1044          level = BitstreamGetBits(bs, 12);  
1045          BitstreamSkip(bs, 1);           /* marker */          /* Update bitstream position */
1046            BitstreamSkip(bs, 30);
1047    
1048          return (level << 20) >> 20;          return (level << 20) >> 20;
1049    
# Line 1072  Line 1085 
1085  }  }
1086    
1087  void  void
1088  get_inter_block(Bitstream * bs,  get_inter_block_h263(
1089                    Bitstream * bs,
1090                                  int16_t * block,                                  int16_t * block,
1091                                  int direction)                  int direction,
1092                    const int quant,
1093                    const uint16_t *matrix)
1094  {  {
1095    
1096          const uint16_t *scan = scan_tables[direction];          const uint16_t *scan = scan_tables[direction];
1097            const uint16_t quant_m_2 = quant << 1;
1098            const uint16_t quant_add = (quant & 1 ? quant : quant - 1);
1099          int p;          int p;
1100          int level;          int level;
1101          int run;          int run;
# Line 1092  Line 1110 
1110                  }                  }
1111                  p += run;                  p += run;
1112    
1113                  block[scan[p]] = level;                  if (level < 0) {
1114                            level = level*quant_m_2 - quant_add;
1115                            block[scan[p]] = (level >= -2048 ? level : -2048);
1116                    } else {
1117                            level = level * quant_m_2 + quant_add;
1118                            block[scan[p]] = (level <= 2047 ? level : 2047);
1119                    }
1120                    p++;
1121            } while (!last);
1122    }
1123    
1124    void
1125    get_inter_block_mpeg(
1126                    Bitstream * bs,
1127                    int16_t * block,
1128                    int direction,
1129                    const int quant,
1130                    const uint16_t *matrix)
1131    {
1132            const uint16_t *scan = scan_tables[direction];
1133            uint32_t sum = 0;
1134            int p;
1135            int level;
1136            int run;
1137            int last;
1138    
1139                  DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i\n", scan[p], level);          p = 0;
1140                  /* DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i %08x\n", scan[p], level, BitstreamShowBits(bs, 32)); */          do {
1141                    level = get_coeff(bs, &run, &last, 0, 0);
1142                    if (run == -1) {
1143                            DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run");
1144                            break;
1145                    }
1146                    p += run;
1147    
1148                  if (level < -2047 || level > 2047) {                  if (level < 0) {
1149                          DPRINTF(XVID_DEBUG_ERROR,"warning: inter overflow %i\n", level);                          level = ((2 * -level + 1) * matrix[scan[p]] * quant) >> 4;
1150                            block[scan[p]] = (level <= 2048 ? -level : -2048);
1151                    } else {
1152                            level = ((2 *  level + 1) * matrix[scan[p]] * quant) >> 4;
1153                            block[scan[p]] = (level <= 2047 ? level : 2047);
1154                  }                  }
1155    
1156                    sum ^= block[scan[p]];
1157    
1158                  p++;                  p++;
1159          } while (!last);          } while (!last);
1160    
1161            /*      mismatch control */
1162            if ((sum & 1) == 0) {
1163                    block[63] ^= 1;
1164            }
1165  }  }
1166    
1167    

Legend:
Removed from v.1485  
changed lines
  Added in v.1486

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