--- decoder.c 2002/12/14 09:39:42 1.37.2.22 +++ decoder.c 2003/01/04 06:14:32 1.37.2.26 @@ -55,7 +55,7 @@ * 22.12.2001 lock based interpolation * 01.12.2001 inital version; (c)2001 peter ross * - * $Id: decoder.c,v 1.37.2.22 2002/12/14 09:39:42 suxen_drol Exp $ + * $Id: decoder.c,v 1.37.2.26 2003/01/04 06:14:32 suxen_drol Exp $ * *************************************************************************/ @@ -68,6 +68,7 @@ #include "xvid.h" #include "portab.h" +#include "global.h" #include "decoder.h" #include "bitstream/bitstream.h" @@ -384,10 +385,6 @@ - -#define SIGN(X) (((X)>0)?1:-1) -#define ABS(X) (((X)>0)?(X):-(X)) - // decode an inter macroblock void @@ -915,7 +912,7 @@ } else if (gmc_mv) /* not coded S_VOP macroblock */ { - mb->mode = MODE_NOT_CODED; + mb->mode = MODE_NOT_CODED_GMC; mb->mvs[0].x = mb->mvs[1].x = mb->mvs[2].x = mb->mvs[3].x = gmc_sanitize(gmc_mv[0].x, dec->quarterpel, fcode); mb->mvs[0].y = mb->mvs[1].y = mb->mvs[2].y = mb->mvs[3].y = gmc_sanitize(gmc_mv[0].y, dec->quarterpel, fcode); decoder_mbinter(dec, mb, x, y, 0, 0, bs, quant, rounding, reduced_resolution); @@ -1467,7 +1464,9 @@ mb->b_mvs[0] = mb->b_mvs[1] = mb->b_mvs[2] = mb->b_mvs[3] = mb->mvs[0] = mb->mvs[1] = mb->mvs[2] = mb->mvs[3] = zeromv; - // the last P_VOP is skip macroblock ? + // skip if the co-located P_VOP macroblock is not coded + // note: gmc+not_coded isn't skipped + if (last_mb->mode == MODE_NOT_CODED) { //DEBUG2("Skip MB in B-frame at (X,Y)=!",x,y); mb->cbp = 0; @@ -1651,6 +1650,9 @@ dec->low_delay_default = (frame->general & XVID_DEC_LOWDELAY); dec->out_frm = (frame->colorspace == XVID_CSP_EXTERN) ? frame->image : NULL; + if ((frame->general & XVID_DEC_DISCONTINUITY)) + dec->frames = 0; + if (frame->length < 0) /* decoder flush */ { /* if not decoding "low_delay/packed", and this isn't low_delay and @@ -1700,6 +1702,7 @@ if (vop_type == - 1) { if (success) goto done; + emms(); return XVID_ERR_FAIL; } @@ -1720,6 +1723,7 @@ stats->data.vol.par_width = dec->par_width; stats->data.vol.par_height = dec->par_height; frame->length = BitstreamPos(&bs) / 8; + emms(); return XVID_ERR_OK; } goto repeat; @@ -1835,6 +1839,7 @@ { /* output the recently decoded frame */ decoder_output(dec, &dec->refn[0], dec->last_mbs, frame, dec->last_reduced_resolution); + output = 1; } else { @@ -1846,7 +1851,6 @@ decoder_output(dec, &dec->cur, NULL, frame, 1 /*disable pp*/); } - output = 1; } frame->length = BitstreamPos(&bs) / 8;