diff --git a/libavcodec/mpeg4video.h b/libavcodec/mpeg4video.h index 63956a6414..4e43186753 100644 --- a/libavcodec/mpeg4video.h +++ b/libavcodec/mpeg4video.h @@ -83,6 +83,7 @@ typedef struct Mpeg4DecContext { int new_pred; int enhancement_type; int scalability; + int use_intra_dc_vlc; /* bug workarounds */ int divx_version; diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index 115fae403f..ed071d336b 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -925,9 +925,10 @@ int ff_mpeg4_decode_partitions(Mpeg4DecContext *ctx) * Decode a block. * @return <0 if an error occurred */ -static inline int mpeg4_decode_block(MpegEncContext *s, int16_t *block, +static inline int mpeg4_decode_block(Mpeg4DecContext *ctx, int16_t *block, int n, int coded, int intra, int rvlc) { + MpegEncContext *s = &ctx->m; int level, i, last, run, qmul, qadd, dc_pred_dir; RLTable *rl; RL_VLC_ELEM *rl_vlc; @@ -936,7 +937,7 @@ static inline int mpeg4_decode_block(MpegEncContext *s, int16_t *block, // Note intra & rvlc should be optimized away if this is inlined if (intra) { - if (s->use_intra_dc_vlc) { + if (ctx->use_intra_dc_vlc) { /* DC coef */ if (s->partitioned_frame) { level = s->dc_val[0][s->block_index[n]]; @@ -1151,7 +1152,7 @@ static inline int mpeg4_decode_block(MpegEncContext *s, int16_t *block, not_coded: if (intra) { - if (!s->use_intra_dc_vlc) { + if (!ctx->use_intra_dc_vlc) { block[0] = ff_mpeg4_pred_dc(s, n, block[0], &dc_pred_dir, 0); i -= i >> 31; // if (i == -1) i = 0; @@ -1178,7 +1179,7 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, int16_t block[6][64]) mb_type = s->current_picture.mb_type[xy]; cbp = s->cbp_table[xy]; - s->use_intra_dc_vlc = s->qscale < s->intra_dc_threshold; + ctx->use_intra_dc_vlc = s->qscale < s->intra_dc_threshold; if (s->current_picture.qscale_table[xy] != s->qscale) ff_set_qscale(s, s->current_picture.qscale_table[xy]); @@ -1228,7 +1229,7 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, int16_t block[6][64]) s->dsp.clear_blocks(s->block[0]); /* decode each block */ for (i = 0; i < 6; i++) { - if (mpeg4_decode_block(s, block[i], i, cbp & 32, s->mb_intra, ctx->rvlc) < 0) { + if (mpeg4_decode_block(ctx, block[i], i, cbp & 32, s->mb_intra, ctx->rvlc) < 0) { av_log(s->avctx, AV_LOG_ERROR, "texture corrupted at %d %d %d\n", s->mb_x, s->mb_y, s->mb_intra); @@ -1576,7 +1577,7 @@ intra: } cbp = (cbpc & 3) | (cbpy << 2); - s->use_intra_dc_vlc = s->qscale < s->intra_dc_threshold; + ctx->use_intra_dc_vlc = s->qscale < s->intra_dc_threshold; if (dquant) ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); @@ -1587,7 +1588,7 @@ intra: s->dsp.clear_blocks(s->block[0]); /* decode each block */ for (i = 0; i < 6; i++) { - if (mpeg4_decode_block(s, block[i], i, cbp & 32, 1, 0) < 0) + if (mpeg4_decode_block(ctx, block[i], i, cbp & 32, 1, 0) < 0) return -1; cbp += cbp; } @@ -1596,7 +1597,7 @@ intra: /* decode each block */ for (i = 0; i < 6; i++) { - if (mpeg4_decode_block(s, block[i], i, cbp & 32, 0, 0) < 0) + if (mpeg4_decode_block(ctx, block[i], i, cbp & 32, 0, 0) < 0) return -1; cbp += cbp; } diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 843970dcbf..a2897a887f 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -593,7 +593,6 @@ typedef struct MpegEncContext { int vo_type; int vol_control_parameters; ///< does the stream contain the low_delay flag, used to workaround buggy encoders int intra_dc_threshold; ///< QP above whch the ac VLC should be used for intra dc - int use_intra_dc_vlc; PutBitContext tex_pb; ///< used for data partitioned VOPs PutBitContext pb2; ///< used for data partitioned VOPs int mpeg_quant;