X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmpeg4videodec.c;h=50a6ae1cd605e79d3ac45725920f2b4891907e18;hb=453642f8afe9f979fcc813a246b1ec656ec36a93;hp=20dd14bc9e3c19d34977202f2af6d9f43074c768;hpb=9ba3fc3e3d12c9ef00dcb0222b7ea0ccb5c4a091;p=ffmpeg diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index 20dd14bc9e3..50a6ae1cd60 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -21,11 +21,14 @@ */ #include "error_resilience.h" +#include "idctdsp.h" #include "internal.h" +#include "mpegutils.h" #include "mpegvideo.h" #include "mpeg4video.h" #include "h263.h" #include "thread.h" +#include "xvididct.h" /* The defines below define the number of bits that are read at once for * reading vlc values. Changing these may improve speed and data cache needs @@ -70,11 +73,11 @@ void ff_mpeg4_pred_ac(MpegEncContext *s, int16_t *block, int n, int dir) n == 1 || n == 3) { /* same qscale */ for (i = 1; i < 8; i++) - block[s->dsp.idct_permutation[i << 3]] += ac_val[i]; + block[s->idsp.idct_permutation[i << 3]] += ac_val[i]; } else { /* different qscale, we must rescale */ for (i = 1; i < 8; i++) - block[s->dsp.idct_permutation[i << 3]] += ROUNDED_DIV(ac_val[i] * qscale_table[xy], s->qscale); + block[s->idsp.idct_permutation[i << 3]] += ROUNDED_DIV(ac_val[i] * qscale_table[xy], s->qscale); } } else { const int xy = s->mb_x + s->mb_y * s->mb_stride - s->mb_stride; @@ -85,21 +88,21 @@ void ff_mpeg4_pred_ac(MpegEncContext *s, int16_t *block, int n, int dir) n == 2 || n == 3) { /* same qscale */ for (i = 1; i < 8; i++) - block[s->dsp.idct_permutation[i]] += ac_val[i + 8]; + block[s->idsp.idct_permutation[i]] += ac_val[i + 8]; } else { /* different qscale, we must rescale */ for (i = 1; i < 8; i++) - block[s->dsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8] * qscale_table[xy], s->qscale); + block[s->idsp.idct_permutation[i]] += ROUNDED_DIV(ac_val[i + 8] * qscale_table[xy], s->qscale); } } } /* left copy */ for (i = 1; i < 8; i++) - ac_val1[i] = block[s->dsp.idct_permutation[i << 3]]; + ac_val1[i] = block[s->idsp.idct_permutation[i << 3]]; /* top copy */ for (i = 1; i < 8; i++) - ac_val1[8 + i] = block[s->dsp.idct_permutation[i]]; + ac_val1[8 + i] = block[s->idsp.idct_permutation[i]]; } /** @@ -172,7 +175,7 @@ static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *g if (w <= 0 || h <= 0) return AVERROR_INVALIDDATA; - for (i = 0; i < s->num_sprite_warping_points; i++) { + for (i = 0; i < ctx->num_sprite_warping_points; i++) { int length; int x = 0, y = 0; @@ -188,11 +191,11 @@ static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *g y = get_xbits(gb, length); skip_bits1(gb); /* marker bit */ - s->sprite_traj[i][0] = d[i][0] = x; - s->sprite_traj[i][1] = d[i][1] = y; + ctx->sprite_traj[i][0] = d[i][0] = x; + ctx->sprite_traj[i][1] = d[i][1] = y; } for (; i < 4; i++) - s->sprite_traj[i][0] = s->sprite_traj[i][1] = 0; + ctx->sprite_traj[i][0] = ctx->sprite_traj[i][1] = 0; while ((1 << alpha) < w) alpha++; @@ -240,7 +243,7 @@ static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *g ROUNDED_DIV(((h - h2) * (r * sprite_ref[0][1] - 16 * vop_ref[0][1]) + h2 * (r * sprite_ref[2][1] - 16 * vop_ref[2][1])), h); - switch (s->num_sprite_warping_points) { + switch (ctx->num_sprite_warping_points) { case 0: s->sprite_offset[0][0] = s->sprite_offset[0][1] = @@ -250,8 +253,8 @@ static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *g s->sprite_delta[0][1] = s->sprite_delta[1][0] = 0; s->sprite_delta[1][1] = a; - s->sprite_shift[0] = - s->sprite_shift[1] = 0; + ctx->sprite_shift[0] = + ctx->sprite_shift[1] = 0; break; case 1: // GMC only s->sprite_offset[0][0] = sprite_ref[0][0] - a * vop_ref[0][0]; @@ -264,8 +267,8 @@ static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *g s->sprite_delta[0][1] = s->sprite_delta[1][0] = 0; s->sprite_delta[1][1] = a; - s->sprite_shift[0] = - s->sprite_shift[1] = 0; + ctx->sprite_shift[0] = + ctx->sprite_shift[1] = 0; break; case 2: s->sprite_offset[0][0] = (sprite_ref[0][0] << (alpha + rho)) + @@ -293,8 +296,8 @@ static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *g s->sprite_delta[1][0] = (-r * sprite_ref[0][1] + virtual_ref[0][1]); s->sprite_delta[1][1] = (-r * sprite_ref[0][0] + virtual_ref[0][0]); - s->sprite_shift[0] = alpha + rho; - s->sprite_shift[1] = alpha + rho + 2; + ctx->sprite_shift[0] = alpha + rho; + ctx->sprite_shift[1] = alpha + rho + 2; break; case 3: min_ab = FFMIN(alpha, beta); @@ -329,37 +332,37 @@ static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *g s->sprite_delta[1][0] = (-r * sprite_ref[0][1] + virtual_ref[0][1]) * h3; s->sprite_delta[1][1] = (-r * sprite_ref[0][1] + virtual_ref[1][1]) * w3; - s->sprite_shift[0] = alpha + beta + rho - min_ab; - s->sprite_shift[1] = alpha + beta + rho - min_ab + 2; + ctx->sprite_shift[0] = alpha + beta + rho - min_ab; + ctx->sprite_shift[1] = alpha + beta + rho - min_ab + 2; break; } /* try to simplify the situation */ - if (s->sprite_delta[0][0] == a << s->sprite_shift[0] && + if (s->sprite_delta[0][0] == a << ctx->sprite_shift[0] && s->sprite_delta[0][1] == 0 && s->sprite_delta[1][0] == 0 && - s->sprite_delta[1][1] == a << s->sprite_shift[0]) { - s->sprite_offset[0][0] >>= s->sprite_shift[0]; - s->sprite_offset[0][1] >>= s->sprite_shift[0]; - s->sprite_offset[1][0] >>= s->sprite_shift[1]; - s->sprite_offset[1][1] >>= s->sprite_shift[1]; + s->sprite_delta[1][1] == a << ctx->sprite_shift[0]) { + s->sprite_offset[0][0] >>= ctx->sprite_shift[0]; + s->sprite_offset[0][1] >>= ctx->sprite_shift[0]; + s->sprite_offset[1][0] >>= ctx->sprite_shift[1]; + s->sprite_offset[1][1] >>= ctx->sprite_shift[1]; s->sprite_delta[0][0] = a; s->sprite_delta[0][1] = 0; s->sprite_delta[1][0] = 0; s->sprite_delta[1][1] = a; - s->sprite_shift[0] = 0; - s->sprite_shift[1] = 0; + ctx->sprite_shift[0] = 0; + ctx->sprite_shift[1] = 0; s->real_sprite_warping_points = 1; } else { - int shift_y = 16 - s->sprite_shift[0]; - int shift_c = 16 - s->sprite_shift[1]; + int shift_y = 16 - ctx->sprite_shift[0]; + int shift_c = 16 - ctx->sprite_shift[1]; for (i = 0; i < 2; i++) { s->sprite_offset[0][i] <<= shift_y; s->sprite_offset[1][i] <<= shift_c; s->sprite_delta[0][i] <<= shift_y; s->sprite_delta[1][i] <<= shift_y; - s->sprite_shift[i] = 16; + ctx->sprite_shift[i] = 16; } - s->real_sprite_warping_points = s->num_sprite_warping_points; + s->real_sprite_warping_points = ctx->num_sprite_warping_points; } return 0; @@ -493,7 +496,7 @@ static inline int get_amv(Mpeg4DecContext *ctx, int n) } else { dx = s->sprite_delta[n][0]; dy = s->sprite_delta[n][1]; - shift = s->sprite_shift[0]; + shift = ctx->sprite_shift[0]; if (n) dy -= 1 << (shift + a + 1); else @@ -925,9 +928,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 +940,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 +1155,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 +1182,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 < ctx->intra_dc_threshold; if (s->current_picture.qscale_table[xy] != s->qscale) ff_set_qscale(s, s->current_picture.qscale_table[xy]); @@ -1225,10 +1229,10 @@ static int mpeg4_decode_partitioned_mb(MpegEncContext *s, int16_t block[6][64]) if (!IS_SKIP(mb_type)) { int i; - s->dsp.clear_blocks(s->block[0]); + s->bdsp.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); @@ -1303,7 +1307,7 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) } } while (cbpc == 20); - s->dsp.clear_blocks(s->block[0]); + s->bdsp.clear_blocks(s->block[0]); dquant = cbpc & 8; s->mb_intra = ((cbpc & 4) != 0); if (s->mb_intra) @@ -1449,7 +1453,7 @@ static int mpeg4_decode_mb(MpegEncContext *s, int16_t block[6][64]) if (modb2) { cbp = 0; } else { - s->dsp.clear_blocks(s->block[0]); + s->bdsp.clear_blocks(s->block[0]); cbp = get_bits(&s->gb, 6); } @@ -1576,7 +1580,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 < ctx->intra_dc_threshold; if (dquant) ff_set_qscale(s, s->qscale + quant_tab[get_bits(&s->gb, 2)]); @@ -1584,10 +1588,10 @@ intra: if (!s->progressive_sequence) s->interlaced_dct = get_bits1(&s->gb); - s->dsp.clear_blocks(s->block[0]); + s->bdsp.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 +1600,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; } @@ -1682,7 +1686,7 @@ static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb) s->avctx->sample_aspect_ratio = ff_h263_pixel_aspect[s->aspect_ratio_info]; } - if ((s->vol_control_parameters = get_bits1(gb))) { /* vol control parameter */ + if ((ctx->vol_control_parameters = get_bits1(gb))) { /* vol control parameter */ int chroma_format = get_bits(gb, 2); if (chroma_format != CHROMA_420) av_log(s->avctx, AV_LOG_ERROR, "illegal chroma format\n"); @@ -1718,23 +1722,22 @@ static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb) check_marker(gb, "before time_increment_resolution"); - s->avctx->time_base.den = get_bits(gb, 16); - if (!s->avctx->time_base.den) { - av_log(s->avctx, AV_LOG_ERROR, "time_base.den==0\n"); - s->avctx->time_base.num = 0; + s->avctx->framerate.num = get_bits(gb, 16); + if (!s->avctx->framerate.num) { + av_log(s->avctx, AV_LOG_ERROR, "framerate==0\n"); return -1; } - ctx->time_increment_bits = av_log2(s->avctx->time_base.den - 1) + 1; + ctx->time_increment_bits = av_log2(s->avctx->framerate.num - 1) + 1; if (ctx->time_increment_bits < 1) ctx->time_increment_bits = 1; check_marker(gb, "before fixed_vop_rate"); if (get_bits1(gb) != 0) /* fixed_vop_rate */ - s->avctx->time_base.num = get_bits(gb, ctx->time_increment_bits); + s->avctx->framerate.den = get_bits(gb, ctx->time_increment_bits); else - s->avctx->time_base.num = 1; + s->avctx->framerate.den = 1; ctx->t_frame = 0; @@ -1780,12 +1783,12 @@ static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb) skip_bits(gb, 13); // sprite_top skip_bits1(gb); /* marker */ } - s->num_sprite_warping_points = get_bits(gb, 6); - if (s->num_sprite_warping_points > 3) { + ctx->num_sprite_warping_points = get_bits(gb, 6); + if (ctx->num_sprite_warping_points > 3) { av_log(s->avctx, AV_LOG_ERROR, "%d sprite_warping_points\n", - s->num_sprite_warping_points); - s->num_sprite_warping_points = 0; + ctx->num_sprite_warping_points); + ctx->num_sprite_warping_points = 0; return -1; } s->sprite_warping_accuracy = get_bits(gb, 2); @@ -1813,7 +1816,7 @@ static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb) /* load default matrixes */ for (i = 0; i < 64; i++) { - int j = s->dsp.idct_permutation[i]; + int j = s->idsp.idct_permutation[i]; v = ff_mpeg4_default_intra_matrix[i]; s->intra_matrix[j] = v; s->chroma_intra_matrix[j] = v; @@ -1833,14 +1836,14 @@ static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb) break; last = v; - j = s->dsp.idct_permutation[ff_zigzag_direct[i]]; + j = s->idsp.idct_permutation[ff_zigzag_direct[i]]; s->intra_matrix[j] = last; s->chroma_intra_matrix[j] = last; } /* replicate last value */ for (; i < 64; i++) { - int j = s->dsp.idct_permutation[ff_zigzag_direct[i]]; + int j = s->idsp.idct_permutation[ff_zigzag_direct[i]]; s->intra_matrix[j] = last; s->chroma_intra_matrix[j] = last; } @@ -1856,14 +1859,14 @@ static int decode_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb) break; last = v; - j = s->dsp.idct_permutation[ff_zigzag_direct[i]]; + j = s->idsp.idct_permutation[ff_zigzag_direct[i]]; s->inter_matrix[j] = v; s->chroma_inter_matrix[j] = v; } /* replicate last value */ for (; i < 64; i++) { - int j = s->dsp.idct_permutation[ff_zigzag_direct[i]]; + int j = s->idsp.idct_permutation[ff_zigzag_direct[i]]; s->inter_matrix[j] = last; s->chroma_inter_matrix[j] = last; } @@ -2015,10 +2018,10 @@ static int decode_user_data(Mpeg4DecContext *ctx, GetBitContext *gb) ctx->divx_version = ver; ctx->divx_build = build; s->divx_packed = e == 3 && last == 'p'; - if (s->divx_packed && !s->showed_packed_warning) { + if (s->divx_packed && !ctx->showed_packed_warning) { av_log(s->avctx, AV_LOG_WARNING, "Invalid and inefficient vfw-avi packed B frames detected\n"); - s->showed_packed_warning = 1; + ctx->showed_packed_warning = 1; } } @@ -2043,6 +2046,28 @@ static int decode_user_data(Mpeg4DecContext *ctx, GetBitContext *gb) if (e == 1) ctx->xvid_build = build; + if (ctx->xvid_build == -1 && ctx->divx_version == -1 && ctx->lavc_build == -1) { + if (s->codec_tag == AV_RL32("XVID") || + s->codec_tag == AV_RL32("XVIX") || + s->codec_tag == AV_RL32("RMP4") || + s->codec_tag == AV_RL32("ZMP4") || + s->codec_tag == AV_RL32("SIPP")) + ctx->xvid_build = 0; + } + + if (ctx->xvid_build == -1 && ctx->divx_version == -1 && ctx->lavc_build == -1) + if (s->codec_tag == AV_RL32("DIVX") && s->vo_type == 0 && + ctx->vol_control_parameters == 0) + ctx->divx_version = 400; // divx 4 + + if (ctx->xvid_build >= 0 && ctx->divx_version >= 0) { + ctx->divx_version = + ctx->divx_build = -1; + } + + if (CONFIG_MPEG4_DECODER && ctx->xvid_build >= 0) + ff_xvid_idct_init(&s->idsp, s->avctx); + return 0; } @@ -2053,8 +2078,8 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb) s->pict_type = get_bits(gb, 2) + AV_PICTURE_TYPE_I; /* pict type: I = 0 , P = 1 */ if (s->pict_type == AV_PICTURE_TYPE_B && s->low_delay && - s->vol_control_parameters == 0 && !(s->flags & CODEC_FLAG_LOW_DELAY)) { - av_log(s->avctx, AV_LOG_ERROR, "low_delay flag incorrectly, clearing it\n"); + ctx->vol_control_parameters == 0 && !(s->flags & CODEC_FLAG_LOW_DELAY)) { + av_log(s->avctx, AV_LOG_ERROR, "low_delay flag set incorrectly, clearing it\n"); s->low_delay = 0; } @@ -2072,9 +2097,7 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb) if (ctx->time_increment_bits == 0 || !(show_bits(gb, ctx->time_increment_bits + 1) & 1)) { - av_log(s->avctx, AV_LOG_ERROR, - "hmm, seems the headers are not complete, trying to guess time_increment_bits\n"); - + /* Headers seem incomplete; try to guess time_increment_bits. */ for (ctx->time_increment_bits = 1; ctx->time_increment_bits < 16; ctx->time_increment_bits++) { @@ -2086,9 +2109,6 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb) } else if ((show_bits(gb, ctx->time_increment_bits + 5) & 0x1F) == 0x18) break; } - - av_log(s->avctx, AV_LOG_ERROR, - "my guess is %d bits ;)\n", ctx->time_increment_bits); } if (IS_3IV1) @@ -2099,19 +2119,19 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb) if (s->pict_type != AV_PICTURE_TYPE_B) { s->last_time_base = s->time_base; s->time_base += time_incr; - s->time = s->time_base * s->avctx->time_base.den + time_increment; + s->time = s->time_base * s->avctx->framerate.num + time_increment; if (s->workaround_bugs & FF_BUG_UMP4) { if (s->time < s->last_non_b_time) { /* header is not mpeg-4-compatible, broken encoder, * trying to workaround */ s->time_base++; - s->time += s->avctx->time_base.den; + s->time += s->avctx->framerate.num; } } s->pp_time = s->time - s->last_non_b_time; s->last_non_b_time = s->time; } else { - s->time = (s->last_time_base + time_incr) * s->avctx->time_base.den + time_increment; + s->time = (s->last_time_base + time_incr) * s->avctx->framerate.num + time_increment; s->pb_time = s->pp_time - (s->last_non_b_time - s->time); if (s->pp_time <= s->pb_time || s->pp_time <= s->pp_time - s->pb_time || @@ -2179,7 +2199,7 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb) if (s->pict_type == AV_PICTURE_TYPE_B) skip_bits_long(gb, ctx->cplx_estimation_trash_b); - s->intra_dc_threshold = ff_mpeg4_dc_threshold[get_bits(gb, 3)]; + ctx->intra_dc_threshold = ff_mpeg4_dc_threshold[get_bits(gb, 3)]; if (!s->progressive_sequence) { s->top_field_first = get_bits1(gb); s->alternate_scan = get_bits1(gb); @@ -2188,15 +2208,15 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb) } if (s->alternate_scan) { - ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan); - ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan); - ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan); - ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); + ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_alternate_vertical_scan); + ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_alternate_vertical_scan); + ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable, ff_alternate_vertical_scan); + ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); } else { - ff_init_scantable(s->dsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct); - ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct); - ff_init_scantable(s->dsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan); - ff_init_scantable(s->dsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); + ff_init_scantable(s->idsp.idct_permutation, &s->inter_scantable, ff_zigzag_direct); + ff_init_scantable(s->idsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct); + ff_init_scantable(s->idsp.idct_permutation, &s->intra_h_scantable, ff_alternate_horizontal_scan); + ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); } if (s->pict_type == AV_PICTURE_TYPE_S && @@ -2242,9 +2262,9 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb) gb->size_in_bits, s->progressive_sequence, s->alternate_scan, s->top_field_first, s->quarter_sample ? "q" : "h", s->data_partitioning, ctx->resync_marker, - s->num_sprite_warping_points, s->sprite_warping_accuracy, + ctx->num_sprite_warping_points, s->sprite_warping_accuracy, 1 - s->no_rounding, s->vo_type, - s->vol_control_parameters ? " VOLC" : " ", s->intra_dc_threshold, + ctx->vol_control_parameters ? " VOLC" : " ", ctx->intra_dc_threshold, ctx->cplx_estimation_trash_i, ctx->cplx_estimation_trash_p, ctx->cplx_estimation_trash_b); } @@ -2265,7 +2285,7 @@ static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb) /* detect buggy encoders which don't set the low_delay flag * (divx4/xvid/opendivx). Note we cannot detect divx5 without b-frames * easily (although it's buggy too) */ - if (s->vo_type == 0 && s->vol_control_parameters == 0 && + if (s->vo_type == 0 && ctx->vol_control_parameters == 0 && ctx->divx_version == -1 && s->picture_number == 0) { av_log(s->avctx, AV_LOG_WARNING, "looks like this file was encoded with (divx4/(old)xvid/opendivx) -> forcing low_delay flag\n"); @@ -2404,26 +2424,6 @@ end: s->low_delay = 1; s->avctx->has_b_frames = !s->low_delay; - if (ctx->xvid_build == -1 && ctx->divx_version == -1 && ctx->lavc_build == -1) { - if (s->stream_codec_tag == AV_RL32("XVID") || - s->codec_tag == AV_RL32("XVID") || - s->codec_tag == AV_RL32("XVIX") || - s->codec_tag == AV_RL32("RMP4") || - s->codec_tag == AV_RL32("ZMP4") || - s->codec_tag == AV_RL32("SIPP")) - ctx->xvid_build = 0; - } - - if (ctx->xvid_build == -1 && ctx->divx_version == -1 && ctx->lavc_build == -1) - if (s->codec_tag == AV_RL32("DIVX") && s->vo_type == 0 && - s->vol_control_parameters == 0) - ctx->divx_version = 400; // divx 4 - - if (ctx->xvid_build >= 0 && ctx->divx_version >= 0) { - ctx->divx_version = - ctx->divx_build = -1; - } - if (s->workaround_bugs & FF_BUG_AUTODETECT) { if (s->codec_tag == AV_RL32("XVIX")) s->workaround_bugs |= FF_BUG_XVID_ILACE; @@ -2474,15 +2474,6 @@ end: s->workaround_bugs |= FF_BUG_HPEL_CHROMA; } -#if HAVE_MMX - if (s->codec_id == AV_CODEC_ID_MPEG4 && ctx->xvid_build >= 0 && - s->avctx->idct_algo == FF_IDCT_AUTO && - (av_get_cpu_flags() & AV_CPU_FLAG_MMX)) { - s->avctx->idct_algo = FF_IDCT_XVIDMMX; - ff_dct_common_init(s); - s->picture_number = 0; - } -#endif if (s->avctx->debug & FF_DEBUG_BUGS) av_log(s->avctx, AV_LOG_DEBUG, @@ -2541,14 +2532,19 @@ static int mpeg4_update_thread_context(AVCodecContext *dst, { Mpeg4DecContext *s = dst->priv_data; const Mpeg4DecContext *s1 = src->priv_data; + int init = s->m.context_initialized; int ret = ff_mpeg_update_thread_context(dst, src); if (ret < 0) return ret; + if (CONFIG_MPEG4_DECODER && !init && s1->xvid_build >= 0) + ff_xvid_idct_init(&s->m.idsp, dst); + s->shape = s1->shape; s->time_increment_bits = s1->time_increment_bits; + s->xvid_build = s1->xvid_build; return 0; }