diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2013-11-30 02:00:50 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2013-11-30 02:12:11 +0100 |
commit | 6c9b82b6a0d5cbdf90dcbf9f4e1c77ae82c5698f (patch) | |
tree | 63f63d8d4383a2a661bd6da140f7275d6b719a29 | |
parent | ee9d53e5726250295cfe0b9e67518fdd1475390e (diff) | |
download | ffmpeg-6c9b82b6a0d5cbdf90dcbf9f4e1c77ae82c5698f.tar.gz |
avcodec/mpeg4videodec: move bug workaround code into seperate function
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavcodec/h263dec.c | 105 | ||||
-rw-r--r-- | libavcodec/mpeg4video.h | 1 | ||||
-rw-r--r-- | libavcodec/mpeg4videodec.c | 113 |
3 files changed, 115 insertions, 104 deletions
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index be37f9d601..9dc391ab14 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -491,111 +491,8 @@ retry: avctx->has_b_frames = !s->low_delay; - if (s->xvid_build == -1 && s->divx_version == -1 && s->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")) - s->xvid_build = 0; - } - - if (s->xvid_build == -1 && s->divx_version == -1 && s->lavc_build == -1) - if (s->codec_tag == AV_RL32("DIVX") && s->vo_type == 0 && - s->vol_control_parameters == 0) - s->divx_version = 400; // divx 4 - - if (s->xvid_build >= 0 && s->divx_version >= 0) { - s->divx_version = - s->divx_build = -1; - } - - if (s->workaround_bugs & FF_BUG_AUTODETECT) { - if (s->codec_tag == AV_RL32("XVIX")) - s->workaround_bugs |= FF_BUG_XVID_ILACE; - - if (s->codec_tag == AV_RL32("UMP4")) - s->workaround_bugs |= FF_BUG_UMP4; - - if (s->divx_version >= 500 && s->divx_build < 1814) - s->workaround_bugs |= FF_BUG_QPEL_CHROMA; - - if (s->divx_version > 502 && s->divx_build < 1814) - s->workaround_bugs |= FF_BUG_QPEL_CHROMA2; - - if (s->xvid_build <= 3U) - s->padding_bug_score = 256 * 256 * 256 * 64; - - if (s->xvid_build <= 1U) - s->workaround_bugs |= FF_BUG_QPEL_CHROMA; - - if (s->xvid_build <= 12U) - s->workaround_bugs |= FF_BUG_EDGE; - - if (s->xvid_build <= 32U) - s->workaround_bugs |= FF_BUG_DC_CLIP; - -#define SET_QPEL_FUNC(postfix1, postfix2) \ - s->dsp.put_ ## postfix1 = ff_put_ ## postfix2; \ - s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2; \ - s->dsp.avg_ ## postfix1 = ff_avg_ ## postfix2; - - if (s->lavc_build < 4653U) - s->workaround_bugs |= FF_BUG_STD_QPEL; - - if (s->lavc_build < 4655U) - s->workaround_bugs |= FF_BUG_DIRECT_BLOCKSIZE; - - if (s->lavc_build < 4670U) - s->workaround_bugs |= FF_BUG_EDGE; - - if (s->lavc_build <= 4712U) - s->workaround_bugs |= FF_BUG_DC_CLIP; - - if (s->divx_version >= 0) - s->workaround_bugs |= FF_BUG_DIRECT_BLOCKSIZE; - if (s->divx_version == 501 && s->divx_build == 20020416) - s->padding_bug_score = 256 * 256 * 256 * 64; - - if (s->divx_version < 500U) - s->workaround_bugs |= FF_BUG_EDGE; - - if (s->divx_version >= 0) - s->workaround_bugs |= FF_BUG_HPEL_CHROMA; - } - - if (s->workaround_bugs & FF_BUG_STD_QPEL) { - SET_QPEL_FUNC(qpel_pixels_tab[0][5], qpel16_mc11_old_c) - SET_QPEL_FUNC(qpel_pixels_tab[0][7], qpel16_mc31_old_c) - SET_QPEL_FUNC(qpel_pixels_tab[0][9], qpel16_mc12_old_c) - SET_QPEL_FUNC(qpel_pixels_tab[0][11], qpel16_mc32_old_c) - SET_QPEL_FUNC(qpel_pixels_tab[0][13], qpel16_mc13_old_c) - SET_QPEL_FUNC(qpel_pixels_tab[0][15], qpel16_mc33_old_c) - - SET_QPEL_FUNC(qpel_pixels_tab[1][5], qpel8_mc11_old_c) - SET_QPEL_FUNC(qpel_pixels_tab[1][7], qpel8_mc31_old_c) - SET_QPEL_FUNC(qpel_pixels_tab[1][9], qpel8_mc12_old_c) - SET_QPEL_FUNC(qpel_pixels_tab[1][11], qpel8_mc32_old_c) - SET_QPEL_FUNC(qpel_pixels_tab[1][13], qpel8_mc13_old_c) - SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_old_c) - } - - if (avctx->debug & FF_DEBUG_BUGS) - av_log(s->avctx, AV_LOG_DEBUG, - "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n", - s->workaround_bugs, s->lavc_build, s->xvid_build, - s->divx_version, s->divx_build, s->divx_packed ? "p" : ""); - -#if HAVE_MMX - if (s->codec_id == AV_CODEC_ID_MPEG4 && s->xvid_build >= 0 && - avctx->idct_algo == FF_IDCT_AUTO && - (av_get_cpu_flags() & AV_CPU_FLAG_MMX)) { - avctx->idct_algo = FF_IDCT_XVIDMMX; - ff_dct_common_init(s); + if (ff_mpeg4_workaround_bugs(avctx) == 1) goto retry; - } -#endif /* After H263 & mpeg4 header decode we have the height, width, * and other parameters. So then we could init the picture. diff --git a/libavcodec/mpeg4video.h b/libavcodec/mpeg4video.h index c3362e418f..93c101ecec 100644 --- a/libavcodec/mpeg4video.h +++ b/libavcodec/mpeg4video.h @@ -119,6 +119,7 @@ int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s); int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx); void ff_mpeg4_init_direct_mv(MpegEncContext *s); void ff_mpeg4videodec_static_init(void); +int ff_mpeg4_workaround_bugs(AVCodecContext *avctx); /** * diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index d5329ce7d8..1155163c1e 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -2095,6 +2095,119 @@ static int decode_user_data(MpegEncContext *s, GetBitContext *gb) return 0; } +int ff_mpeg4_workaround_bugs(AVCodecContext *avctx) +{ + Mpeg4DecContext *ctx = avctx->priv_data; + MpegEncContext *s = &ctx->m; + + if (s->xvid_build == -1 && s->divx_version == -1 && s->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")) + s->xvid_build = 0; + } + + if (s->xvid_build == -1 && s->divx_version == -1 && s->lavc_build == -1) + if (s->codec_tag == AV_RL32("DIVX") && s->vo_type == 0 && + s->vol_control_parameters == 0) + s->divx_version = 400; // divx 4 + + if (s->xvid_build >= 0 && s->divx_version >= 0) { + s->divx_version = + s->divx_build = -1; + } + + if (s->workaround_bugs & FF_BUG_AUTODETECT) { + if (s->codec_tag == AV_RL32("XVIX")) + s->workaround_bugs |= FF_BUG_XVID_ILACE; + + if (s->codec_tag == AV_RL32("UMP4")) + s->workaround_bugs |= FF_BUG_UMP4; + + if (s->divx_version >= 500 && s->divx_build < 1814) + s->workaround_bugs |= FF_BUG_QPEL_CHROMA; + + if (s->divx_version > 502 && s->divx_build < 1814) + s->workaround_bugs |= FF_BUG_QPEL_CHROMA2; + + if (s->xvid_build <= 3U) + s->padding_bug_score = 256 * 256 * 256 * 64; + + if (s->xvid_build <= 1U) + s->workaround_bugs |= FF_BUG_QPEL_CHROMA; + + if (s->xvid_build <= 12U) + s->workaround_bugs |= FF_BUG_EDGE; + + if (s->xvid_build <= 32U) + s->workaround_bugs |= FF_BUG_DC_CLIP; + +#define SET_QPEL_FUNC(postfix1, postfix2) \ + s->dsp.put_ ## postfix1 = ff_put_ ## postfix2; \ + s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2; \ + s->dsp.avg_ ## postfix1 = ff_avg_ ## postfix2; + + if (s->lavc_build < 4653U) + s->workaround_bugs |= FF_BUG_STD_QPEL; + + if (s->lavc_build < 4655U) + s->workaround_bugs |= FF_BUG_DIRECT_BLOCKSIZE; + + if (s->lavc_build < 4670U) + s->workaround_bugs |= FF_BUG_EDGE; + + if (s->lavc_build <= 4712U) + s->workaround_bugs |= FF_BUG_DC_CLIP; + + if (s->divx_version >= 0) + s->workaround_bugs |= FF_BUG_DIRECT_BLOCKSIZE; + if (s->divx_version == 501 && s->divx_build == 20020416) + s->padding_bug_score = 256 * 256 * 256 * 64; + + if (s->divx_version < 500U) + s->workaround_bugs |= FF_BUG_EDGE; + + if (s->divx_version >= 0) + s->workaround_bugs |= FF_BUG_HPEL_CHROMA; + } + + if (s->workaround_bugs & FF_BUG_STD_QPEL) { + SET_QPEL_FUNC(qpel_pixels_tab[0][5], qpel16_mc11_old_c) + SET_QPEL_FUNC(qpel_pixels_tab[0][7], qpel16_mc31_old_c) + SET_QPEL_FUNC(qpel_pixels_tab[0][9], qpel16_mc12_old_c) + SET_QPEL_FUNC(qpel_pixels_tab[0][11], qpel16_mc32_old_c) + SET_QPEL_FUNC(qpel_pixels_tab[0][13], qpel16_mc13_old_c) + SET_QPEL_FUNC(qpel_pixels_tab[0][15], qpel16_mc33_old_c) + + SET_QPEL_FUNC(qpel_pixels_tab[1][5], qpel8_mc11_old_c) + SET_QPEL_FUNC(qpel_pixels_tab[1][7], qpel8_mc31_old_c) + SET_QPEL_FUNC(qpel_pixels_tab[1][9], qpel8_mc12_old_c) + SET_QPEL_FUNC(qpel_pixels_tab[1][11], qpel8_mc32_old_c) + SET_QPEL_FUNC(qpel_pixels_tab[1][13], qpel8_mc13_old_c) + SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_old_c) + } + + if (avctx->debug & FF_DEBUG_BUGS) + av_log(s->avctx, AV_LOG_DEBUG, + "bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n", + s->workaround_bugs, s->lavc_build, s->xvid_build, + s->divx_version, s->divx_build, s->divx_packed ? "p" : ""); + +#if HAVE_MMX + if (s->codec_id == AV_CODEC_ID_MPEG4 && s->xvid_build >= 0 && + avctx->idct_algo == FF_IDCT_AUTO && + (av_get_cpu_flags() & AV_CPU_FLAG_MMX)) { + avctx->idct_algo = FF_IDCT_XVIDMMX; + ff_dct_common_init(s); + return 1; + } +#endif + return 0; +} + static int decode_vop_header(Mpeg4DecContext *ctx, GetBitContext *gb) { MpegEncContext *s = &ctx->m; |