[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.44.2.10, Thu May 22 16:35:38 2003 UTC revision 1.45, Mon Feb 24 11:15:33 2003 UTC
# Line 51  Line 51 
51    
52  #include <stdio.h>  #include <stdio.h>
53  #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  
   
54  #include "../portab.h"  #include "../portab.h"
55  #include "../global.h"  #include "../global.h"
56  #include "bitstream.h"  #include "bitstream.h"
# Line 500  Line 498 
498          {          {
499                  if ((level = qcoeff[zigzag[i++]]) != 0)                  if ((level = qcoeff[zigzag[i++]]) != 0)
500                  {                  {
501                          abs_level = abs(prev_level);                          abs_level = ABS(prev_level);
502                          abs_level = abs_level < 64 ? abs_level : 0;                          abs_level = abs_level < 64 ? abs_level : 0;
503                          code      = coeff_VLC[1][0][abs_level][prev_run].code;                          code      = coeff_VLC[1][0][abs_level][prev_run].code;
504                          len               = coeff_VLC[1][0][abs_level][prev_run].len;                          len               = coeff_VLC[1][0][abs_level][prev_run].len;
# Line 520  Line 518 
518                          run++;                          run++;
519          }          }
520    
521          abs_level = abs(prev_level);          abs_level = ABS(prev_level);
522          abs_level = abs_level < 64 ? abs_level : 0;          abs_level = abs_level < 64 ? abs_level : 0;
523          code      = coeff_VLC[1][1][abs_level][prev_run].code;          code      = coeff_VLC[1][1][abs_level][prev_run].code;
524          len               = coeff_VLC[1][1][abs_level][prev_run].len;          len               = coeff_VLC[1][1][abs_level][prev_run].len;
# Line 561  Line 559 
559          {          {
560                  if ((level = qcoeff[zigzag[i++]]) != 0)                  if ((level = qcoeff[zigzag[i++]]) != 0)
561                  {                  {
562                          abs_level = abs(prev_level);                          abs_level = ABS(prev_level);
563                          abs_level = abs_level < 64 ? abs_level : 0;                          abs_level = abs_level < 64 ? abs_level : 0;
564                          len               = coeff_VLC[1][0][abs_level][prev_run].len;                          len               = coeff_VLC[1][0][abs_level][prev_run].len;
565                          bits      += len!=128 ? len : 30;                          bits      += len!=128 ? len : 30;
# Line 574  Line 572 
572                          run++;                          run++;
573          }          }
574    
575          abs_level = abs(prev_level);          abs_level = ABS(prev_level);
576          abs_level = abs_level < 64 ? abs_level : 0;          abs_level = abs_level < 64 ? abs_level : 0;
577          len               = coeff_VLC[1][1][abs_level][prev_run].len;          len               = coeff_VLC[1][1][abs_level][prev_run].len;
578          bits      += len!=128 ? len : 30;          bits      += len!=128 ? len : 30;
# Line 629  Line 627 
627    
628  #endif  #endif
629    
   
 static int iDQtab[5] = {  
         1, 0, -1 /* no change */, 2, 3  
 };  
 #define DQ_VALUE2INDEX(value)  iDQtab[(value)+2]  
   
   
630  static __inline void  static __inline void
631  CodeBlockIntra(const FRAMEINFO * const frame,  CodeBlockIntra(const FRAMEINFO * const frame,
632                             const MACROBLOCK * pMB,                             const MACROBLOCK * pMB,
# Line 670  Line 661 
661    
662          // write dquant          // write dquant
663          if (pMB->mode == MODE_INTRA_Q)          if (pMB->mode == MODE_INTRA_Q)
664                  BitstreamPutBits(bs, DQ_VALUE2INDEX(pMB->dquant), 2);                  BitstreamPutBits(bs, pMB->dquant, 2);
665    
666          // write interlacing          // write interlacing
667          if (frame->vol_flags & XVID_VOL_INTERLACING) {          if (frame->global_flags & XVID_INTERLACING) {
668                  BitstreamPutBit(bs, pMB->field_dct);                  BitstreamPutBit(bs, pMB->field_dct);
669          }          }
670          // code block coeffs          // code block coeffs
# Line 687  Line 678 
678    
679                  if (pMB->cbp & (1 << (5 - i))) {                  if (pMB->cbp & (1 << (5 - i))) {
680                          const uint16_t *scan_table =                          const uint16_t *scan_table =
681                                  frame->vop_flags & XVID_VOP_ALTERNATESCAN ?                                  frame->global_flags & XVID_ALTERNATESCAN ?
682                                  scan_tables[2] : scan_tables[pMB->acpred_directions[i]];                                  scan_tables[2] : scan_tables[pMB->acpred_directions[i]];
683    
684                          bits = BitstreamPos(bs);                          bits = BitstreamPos(bs);
# Line 732  Line 723 
723    
724          // write dquant          // write dquant
725          if (pMB->mode == MODE_INTER_Q)          if (pMB->mode == MODE_INTER_Q)
726                  BitstreamPutBits(bs, DQ_VALUE2INDEX(pMB->dquant), 2);                  BitstreamPutBits(bs, pMB->dquant, 2);
727    
728          // interlacing          // interlacing
729          if (frame->vol_flags & XVID_VOL_INTERLACING) {          if (frame->global_flags & XVID_INTERLACING) {
730                  if (pMB->cbp) {                  if (pMB->cbp) {
731                          BitstreamPutBit(bs, pMB->field_dct);                          BitstreamPutBit(bs, pMB->field_dct);
732                          DPRINTF(XVID_DEBUG_MB,"codep: field_dct: %i\n", pMB->field_dct);                          DPRINTF(DPRINTF_MB,"codep: field_dct: %i", pMB->field_dct);
733                  }                  }
734    
735                  // if inter block, write field ME flag                  // if inter block, write field ME flag
736                  if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) {                  if (pMB->mode == MODE_INTER || pMB->mode == MODE_INTER_Q) {
737                          BitstreamPutBit(bs, pMB->field_pred);                          BitstreamPutBit(bs, pMB->field_pred);
738                          DPRINTF(XVID_DEBUG_MB,"codep: field_pred: %i\n", pMB->field_pred);                          DPRINTF(DPRINTF_MB,"codep: field_pred: %i", pMB->field_pred);
739    
740                          // write field prediction references                          // write field prediction references
741                          if (pMB->field_pred) {                          if (pMB->field_pred) {
# Line 767  Line 758 
758                  if (pMB->cbp & (1 << (5 - i)))                  if (pMB->cbp & (1 << (5 - i)))
759                  {                  {
760                          const uint16_t *scan_table =                          const uint16_t *scan_table =
761                                  frame->vop_flags & XVID_VOP_ALTERNATESCAN ?                                  frame->global_flags & XVID_ALTERNATESCAN ?
762                                  scan_tables[2] : scan_tables[0];                                  scan_tables[2] : scan_tables[0];
763    
764  #ifdef BIGLUT  #ifdef BIGLUT
# Line 1061  Line 1052 
1052                  return data;                  return data;
1053    
1054          res = BitstreamGetBits(bs, fcode - 1);          res = BitstreamGetBits(bs, fcode - 1);
1055          mv = ((abs(data) - 1) * scale_fac) + res + 1;          mv = ((ABS(data) - 1) * scale_fac) + res + 1;
1056    
1057          return data < 0 ? -mv : mv;          return data < 0 ? -mv : mv;
1058    
# Line 1162  Line 1153 
1153                  level = BitstreamGetBits(bs, 8);                  level = BitstreamGetBits(bs, 8);
1154    
1155                  if (level == 0 || level == 128)                  if (level == 0 || level == 128)
1156                          DPRINTF(XVID_DEBUG_ERROR, "Illegal LEVEL for ESCAPE mode 4: %d\n", level);                          DPRINTF(DPRINTF_ERROR, "Illegal LEVEL for ESCAPE mode 4: %d", level);
1157    
1158                  return (level << 24) >> 24;                  return (level << 24) >> 24;
1159          }          }
# Line 1218  Line 1209 
1209          do {          do {
1210                  level = get_coeff(bs, &run, &last, 1, 0);                  level = get_coeff(bs, &run, &last, 1, 0);
1211                  if (run == -1) {                  if (run == -1) {
1212                          DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run");                          DPRINTF(DPRINTF_ERROR,"fatal: invalid run");
1213                          break;                          break;
1214                  }                  }
1215                  coeff += run;                  coeff += run;
1216                  block[scan[coeff]] = level;                  block[scan[coeff]] = level;
1217    
1218                  DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i\n", scan[coeff], level);                  DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[coeff], level);
1219                  //DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i %08x\n", scan[coeff], level, BitstreamShowBits(bs, 32));                  //DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[coeff], level, BitstreamShowBits(bs, 32));
1220    
1221                  if (level < -2047 || level > 2047) {                  if (level < -2047 || level > 2047) {
1222                          DPRINTF(XVID_DEBUG_ERROR,"warning: intra_overflow %i\n", level);                          DPRINTF(DPRINTF_ERROR,"warning: intra_overflow %i", level);
1223                  }                  }
1224                  coeff++;                  coeff++;
1225          } while (!last);          } while (!last);
# Line 1251  Line 1242 
1242          do {          do {
1243                  level = get_coeff(bs, &run, &last, 0, 0);                  level = get_coeff(bs, &run, &last, 0, 0);
1244                  if (run == -1) {                  if (run == -1) {
1245                          DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run");                          DPRINTF(DPRINTF_ERROR,"fatal: invalid run");
1246                          break;                          break;
1247                  }                  }
1248                  p += run;                  p += run;
1249    
1250                  block[scan[p]] = level;                  block[scan[p]] = level;
1251    
1252                  DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i\n", scan[p], level);                  DPRINTF(DPRINTF_COEFF,"block[%i] %i", scan[p], level);
1253                  // DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i %08x\n", scan[p], level, BitstreamShowBits(bs, 32));                  // DPRINTF(DPRINTF_COEFF,"block[%i] %i %08x", scan[p], level, BitstreamShowBits(bs, 32));
1254    
1255                  if (level < -2047 || level > 2047) {                  if (level < -2047 || level > 2047) {
1256                          DPRINTF(XVID_DEBUG_ERROR,"warning: inter overflow %i\n", level);                          DPRINTF(DPRINTF_ERROR,"warning: inter overflow %i", level);
1257                  }                  }
1258                  p++;                  p++;
1259          } while (!last);          } while (!last);
1260    
1261  }  }
1262    
   
1263  /*****************************************************************************  /*****************************************************************************
1264   * VLC tables and other constant arrays   * VLC tables and other constant arrays
1265   ****************************************************************************/   ****************************************************************************/

Legend:
Removed from v.1.44.2.10  
changed lines
  Added in v.1.45

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