mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-08 13:22:53 +02:00
avcodec/mpeg4videodec: Workaround interlaced mpeg4 edge MC bug
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
85407c7e63
commit
2c9106257f
@ -2878,6 +2878,7 @@ typedef struct AVCodecContext {
|
||||
#define FF_BUG_DC_CLIP 4096
|
||||
#define FF_BUG_MS 8192 ///< Work around various bugs in Microsoft's broken decoders.
|
||||
#define FF_BUG_TRUNCATED 16384
|
||||
#define FF_BUG_IEDGE 32768
|
||||
|
||||
/**
|
||||
* strictly follow the standard (MPEG-4, ...).
|
||||
|
@ -2195,6 +2195,13 @@ int ff_mpeg4_workaround_bugs(AVCodecContext *avctx)
|
||||
if (ctx->lavc_build <= 4712U)
|
||||
s->workaround_bugs |= FF_BUG_DC_CLIP;
|
||||
|
||||
if ((ctx->lavc_build&0xFF) >= 100) {
|
||||
if (ctx->lavc_build > 3621476 && ctx->lavc_build < 3752552 &&
|
||||
(ctx->lavc_build < 3752037 || ctx->lavc_build > 3752191) // 3.2.1+
|
||||
)
|
||||
s->workaround_bugs |= FF_BUG_IEDGE;
|
||||
}
|
||||
|
||||
if (ctx->divx_version >= 0)
|
||||
s->workaround_bugs |= FF_BUG_DIRECT_BLOCKSIZE;
|
||||
if (ctx->divx_version == 501 && ctx->divx_build == 20020416)
|
||||
|
@ -2117,6 +2117,8 @@ static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
|
||||
if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
|
||||
uint8_t *ubuf = s->sc.edge_emu_buffer + 18 * s->linesize;
|
||||
uint8_t *vbuf =ubuf + 10 * s->uvlinesize;
|
||||
if (s->workaround_bugs & FF_BUG_IEDGE)
|
||||
vbuf -= s->uvlinesize;
|
||||
s->vdsp.emulated_edge_mc(ubuf, ptr_cb,
|
||||
uvlinesize >> field_based, uvlinesize >> field_based,
|
||||
9, 9 + field_based,
|
||||
|
@ -327,6 +327,8 @@ void mpeg_motion_internal(MpegEncContext *s,
|
||||
if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
|
||||
uint8_t *ubuf = s->sc.edge_emu_buffer + 18 * s->linesize;
|
||||
uint8_t *vbuf = ubuf + 10 * s->uvlinesize;
|
||||
if (s->workaround_bugs & FF_BUG_IEDGE)
|
||||
vbuf -= s->uvlinesize;
|
||||
uvsrc_y = (unsigned)uvsrc_y << field_based;
|
||||
s->vdsp.emulated_edge_mc(ubuf, ptr_cb,
|
||||
s->uvlinesize, s->uvlinesize,
|
||||
@ -550,6 +552,8 @@ static inline void qpel_motion(MpegEncContext *s,
|
||||
if (!CONFIG_GRAY || !(s->avctx->flags & AV_CODEC_FLAG_GRAY)) {
|
||||
uint8_t *ubuf = s->sc.edge_emu_buffer + 18 * s->linesize;
|
||||
uint8_t *vbuf = ubuf + 10 * s->uvlinesize;
|
||||
if (s->workaround_bugs & FF_BUG_IEDGE)
|
||||
vbuf -= s->uvlinesize;
|
||||
s->vdsp.emulated_edge_mc(ubuf, ptr_cb,
|
||||
s->uvlinesize, s->uvlinesize,
|
||||
9, 9 + field_based,
|
||||
|
@ -163,6 +163,7 @@ static const AVOption avcodec_options[] = {
|
||||
{"dc_clip", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_DC_CLIP }, INT_MIN, INT_MAX, V|D, "bug"},
|
||||
{"ms", "work around various bugs in Microsoft's broken decoders", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_MS }, INT_MIN, INT_MAX, V|D, "bug"},
|
||||
{"trunc", "truncated frames", 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_TRUNCATED}, INT_MIN, INT_MAX, V|D, "bug"},
|
||||
{"iedge", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_BUG_IEDGE }, INT_MIN, INT_MAX, V|D, "bug"},
|
||||
{"strict", "how strictly to follow the standards", OFFSET(strict_std_compliance), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, A|V|D|E, "strict"},
|
||||
{"very", "strictly conform to a older more strict version of the spec or reference software", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_VERY_STRICT }, INT_MIN, INT_MAX, A|V|D|E, "strict"},
|
||||
{"strict", "strictly conform to all the things in the spec no matter what the consequences", 0, AV_OPT_TYPE_CONST, {.i64 = FF_COMPLIANCE_STRICT }, INT_MIN, INT_MAX, A|V|D|E, "strict"},
|
||||
|
Loading…
Reference in New Issue
Block a user