[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 1895, Fri Oct 15 16:20:48 2010 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.59 2010-10-15 16:20:48 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;
# Line 1969  Line 1972 
1972          26708, 29545, 29472, 26223, 30580, 29281,  8293, 29545,          26708, 29545, 29472, 26223, 30580, 29281,  8293, 29545,
1973          25632, 29285, 30313, 25701, 26144, 28530,  8301, 26740,          25632, 29285, 30313, 25701, 26144, 28530,  8301, 26740,
1974           8293, 20039,  8277, 20551,  8268, 30296, 17513, 25376,           8293, 20039,  8277, 20551,  8268, 30296, 17513, 25376,
1975          25711, 25445, 10272, 11825, 11825, 10544,  2606, 28505,          25711, 25445, 10272, 11825, 11827, 10544,  2606, 28505,
1976          29301, 29472, 26223, 30580, 29281,  8293, 26980, 29811,          29301, 29472, 26223, 30580, 29281,  8293, 26980, 29811,
1977          26994, 30050, 28532,  8306, 24936,  8307, 28532, 26400,          26994, 30050, 28532,  8306, 24936,  8307, 28532, 26400,
1978          30313,  8293, 25441, 25955, 29555, 29728,  8303, 29801,          30313,  8293, 25441, 25955, 29555, 29728,  8303, 29801,

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

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