mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-24 11:49:48 +00:00
avcodec/mpeg4videodec: move bug workaround code into seperate function
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
ee9d53e572
commit
6c9b82b6a0
@ -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.
|
||||
|
@ -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);
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user