[svn] / branches / release-1_3-branch / xvidcore / src / bitstream / mbcoding.c Repository:
ViewVC logotype

Diff of /branches/release-1_3-branch/xvidcore/src/bitstream/mbcoding.c

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

revision 1632, Tue Sep 13 12:12:15 2005 UTC revision 1879, Tue Nov 10 14:06:58 2009 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.52 2005-09-13 12:12:15 suxen_drol Exp $   * $Id: mbcoding.c,v 1.58 2009-11-10 14:06:58 Isibaar Exp $
23   *   *
24   ****************************************************************************/   ****************************************************************************/
25    
# Line 36  Line 36 
36    
37  #include "../utils/mbfunctions.h"  #include "../utils/mbfunctions.h"
38    
39    #ifdef _DEBUG
40    # include "../motion/estimation.h"
41    # include "../motion/motion_inlines.h"
42    # include <assert.h>
43    #endif
44    
45    
46  #define LEVELOFFSET 32  #define LEVELOFFSET 32
47    
48  /* Initialized once during xvid_global call  /* Initialized once during xvid_global call
# Line 572  Line 579 
579  #endif  #endif
580                  }                  }
581          }          }
582    
583            bits = BitstreamPos(bs);
584    
585          /* code motion vector(s) if motion is local  */          /* code motion vector(s) if motion is local  */
586          if (!pMB->mcsel)          if (!pMB->mcsel)
587                  for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) {                  for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) {
588                          CodeVector(bs, pMB->pmvs[i].x, frame->fcode);                          CodeVector(bs, pMB->pmvs[i].x, frame->fcode);
589                          CodeVector(bs, pMB->pmvs[i].y, frame->fcode);                          CodeVector(bs, pMB->pmvs[i].y, frame->fcode);
590    
591    #if 0 /* #ifdef _DEBUG */
592                            if (i == 0) /* for simplicity */ {
593                                    int coded_length = BitstreamPos(bs) - bits;
594                                    int estimated_length = d_mv_bits(pMB->pmvs[i].x, pMB->pmvs[i].y, zeroMV, frame->fcode, 0);
595                                    assert(estimated_length == coded_length);
596                                    d_mv_bits(pMB->pmvs[i].x, pMB->pmvs[i].y, zeroMV, frame->fcode, 0);
597                  }                  }
598    #endif
599                    }
600    
601            bits = BitstreamPos(bs) - bits;
602            pStat->iMVBits += bits;
603    
604          bits = BitstreamPos(bs);          bits = BitstreamPos(bs);
605    
# Line 746  Line 768 
768                  }                  }
769          }          }
770    
771            bits = BitstreamPos(bs);
772    
773          switch (mb->mode) {          switch (mb->mode) {
774                  case MODE_INTERPOLATE:                  case MODE_INTERPOLATE:
# Line 762  Line 785 
785                          CodeVector(bs, mb->pmvs[3].y, 1);       /* prediction is always (0,0) */                          CodeVector(bs, mb->pmvs[3].y, 1);       /* prediction is always (0,0) */
786                  default: break;                  default: break;
787          }          }
788            pStat->iMVBits += BitstreamPos(bs) - bits;
789    
790          bits = BitstreamPos(bs);          bits = BitstreamPos(bs);
791          for (i = 0; i < 6; i++) {          for (i = 0; i < 6; i++) {
# Line 1051  Line 1075 
1075          return (level << 20) >> 20;          return (level << 20) >> 20;
1076    
1077    error:    error:
1078          *run = VLC_ERROR;          *run = 64;
1079          return 0;          return 0;
1080  }  }
1081    
# Line 1063  Line 1087 
1087  {  {
1088    
1089          const uint16_t *scan = scan_tables[direction];          const uint16_t *scan = scan_tables[direction];
1090          int level, run, last;          int level, run, last = 0;
1091    
1092          do {          do {
1093                  level = get_coeff(bs, &run, &last, 1, 0);                  level = get_coeff(bs, &run, &last, 1, 0);
                 if (run == -1) {  
                         DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run");  
                         break;  
                 }  
1094                  coeff += run;                  coeff += run;
1095                    if (coeff & ~63) {
1096  #ifdef _DEBUG                          DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run or index");
1097                  if(coeff>=64) {                          break;
                   DPRINTF(XVID_DEBUG_ERROR,"error: overflow in coefficient index\n");  
                   return;  
1098                  }                  }
 #endif  
1099    
1100                  block[scan[coeff]] = level;                  block[scan[coeff]] = level;
1101    
# Line 1110  Line 1127 
1127          int p;          int p;
1128          int level;          int level;
1129          int run;          int run;
1130          int last;          int last = 0;
1131    
1132          p = 0;          p = 0;
1133          do {          do {
1134                  level = get_coeff(bs, &run, &last, 0, 0);                  level = get_coeff(bs, &run, &last, 0, 0);
1135                  if (run == -1) {                  p += run;
1136                          DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run");                  if (p & ~63) {
1137                            DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run or index");
1138                          break;                          break;
1139                  }                  }
                 p += run;  
   
 #ifdef _DEBUG  
                 if(p>=64)       {  
                   DPRINTF(XVID_DEBUG_ERROR,"error: overflow in coefficient index\n");  
                   return;  
                 }  
 #endif  
1140    
1141                  if (level < 0) {                  if (level < 0) {
1142                          level = level*quant_m_2 - quant_add;                          level = level*quant_m_2 - quant_add;
# Line 1152  Line 1162 
1162          int p;          int p;
1163          int level;          int level;
1164          int run;          int run;
1165          int last;          int last = 0;
1166    
1167          p = 0;          p = 0;
1168          do {          do {
1169                  level = get_coeff(bs, &run, &last, 0, 0);                  level = get_coeff(bs, &run, &last, 0, 0);
                 if (run == -1) {  
                         DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run");  
                         break;  
                 }  
1170                  p += run;                  p += run;
1171                    if (p & ~63) {
1172  #ifdef _DEBUG                          DPRINTF(XVID_DEBUG_ERROR,"fatal: invalid run or index");
1173                  if(p>=64)       {                          break;
                   DPRINTF(XVID_DEBUG_ERROR,"error: overflow in coefficient index\n");  
                   return;  
1174                  }                  }
 #endif  
1175    
1176                  if (level < 0) {                  if (level < 0) {
1177                          level = ((2 * -level + 1) * matrix[scan[p]] * quant) >> 4;                          level = ((2 * -level + 1) * matrix[scan[p]] * quant) >> 4;

Legend:
Removed from v.1632  
changed lines
  Added in v.1879

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