--- mbcoding.c 2005/04/04 23:49:37 1.51 +++ mbcoding.c 2007/04/28 16:30:20 1.54 @@ -19,7 +19,7 @@ * along with this program ; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: mbcoding.c,v 1.51 2005/04/04 23:49:37 edgomez Exp $ + * $Id: mbcoding.c,v 1.54 2007/04/28 16:30:20 syskin Exp $ * ****************************************************************************/ @@ -36,6 +36,13 @@ #include "../utils/mbfunctions.h" +#ifdef _DEBUG +# include "../motion/estimation.h" +# include "../motion/motion_inlines.h" +# include +#endif + + #define LEVELOFFSET 32 /* Initialized once during xvid_global call @@ -572,13 +579,28 @@ #endif } } + + bits = BitstreamPos(bs); + /* code motion vector(s) if motion is local */ if (!pMB->mcsel) for (i = 0; i < (pMB->mode == MODE_INTER4V ? 4 : 1); i++) { CodeVector(bs, pMB->pmvs[i].x, frame->fcode); CodeVector(bs, pMB->pmvs[i].y, frame->fcode); + +#ifdef _DEBUG + if (i == 0) /* for simplicity */ { + int coded_length = BitstreamPos(bs) - bits; + int estimated_length = d_mv_bits(pMB->pmvs[i].x, pMB->pmvs[i].y, zeroMV, frame->fcode, 0); + assert(estimated_length == coded_length); + d_mv_bits(pMB->pmvs[i].x, pMB->pmvs[i].y, zeroMV, frame->fcode, 0); + } +#endif } + bits = BitstreamPos(bs) - bits; + pStat->iMVBits += bits; + bits = BitstreamPos(bs); /* code block coeffs */ @@ -746,6 +768,7 @@ } } + bits = BitstreamPos(bs); switch (mb->mode) { case MODE_INTERPOLATE: @@ -762,6 +785,7 @@ CodeVector(bs, mb->pmvs[3].y, 1); /* prediction is always (0,0) */ default: break; } + pStat->iMVBits += BitstreamPos(bs) - bits; bits = BitstreamPos(bs); for (i = 0; i < 6; i++) { @@ -1072,6 +1096,14 @@ break; } coeff += run; + +#ifdef _DEBUG + if(coeff>=64) { + DPRINTF(XVID_DEBUG_ERROR,"error: overflow in coefficient index\n"); + return; + } +#endif + block[scan[coeff]] = level; DPRINTF(XVID_DEBUG_COEFF,"block[%i] %i\n", scan[coeff], level); @@ -1113,6 +1145,13 @@ } p += run; +#ifdef _DEBUG + if(p>=64) { + DPRINTF(XVID_DEBUG_ERROR,"error: overflow in coefficient index\n"); + return; + } +#endif + if (level < 0) { level = level*quant_m_2 - quant_add; block[scan[p]] = (level >= -2048 ? level : -2048); @@ -1148,6 +1187,13 @@ } p += run; +#ifdef _DEBUG + if(p>=64) { + DPRINTF(XVID_DEBUG_ERROR,"error: overflow in coefficient index\n"); + return; + } +#endif + if (level < 0) { level = ((2 * -level + 1) * matrix[scan[p]] * quant) >> 4; block[scan[p]] = (level <= 2048 ? -level : -2048);