diff options
author | Paul B Mahol <onemda@gmail.com> | 2020-12-27 21:01:38 +0100 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2020-12-27 21:21:08 +0100 |
commit | 89dcef90af5b444b446ed888486ea9326e9a1141 (patch) | |
tree | 85a81d68a5f9a572a0e02c2ae6f3cc1a05e0ec1b /libavfilter/vf_decimate.c | |
parent | 6d3b70c27ef1639784fdb3382e5a06b1afa3fe3e (diff) | |
download | ffmpeg-89dcef90af5b444b446ed888486ea9326e9a1141.tar.gz |
avfilter/vf_decimate: fix broken logic with ppsrc handling
Make output bit exact with VIVTC VDecimate filter.
Diffstat (limited to 'libavfilter/vf_decimate.c')
-rw-r--r-- | libavfilter/vf_decimate.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/libavfilter/vf_decimate.c b/libavfilter/vf_decimate.c index 25bd5bda57..93509d6ab3 100644 --- a/libavfilter/vf_decimate.c +++ b/libavfilter/vf_decimate.c @@ -167,11 +167,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) dm->got_frame[INPUT_MAIN] = dm->got_frame[INPUT_CLEANSRC] = 0; if (dm->ppsrc) - in = dm->clean_src[dm->fid]; + in = dm->queue[dm->fid].frame; if (in) { /* update frame metrics */ - prv = dm->fid ? (dm->ppsrc ? dm->clean_src[dm->fid - 1] : dm->queue[dm->fid - 1].frame) : dm->last; + prv = dm->fid ? dm->queue[dm->fid - 1].frame : dm->last; if (!prv) { dm->queue[dm->fid].maxbdiff = INT64_MAX; dm->queue[dm->fid].totdiff = INT64_MAX; @@ -219,8 +219,6 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) av_frame_free(&dm->queue[i].frame); } else { AVFrame *frame = dm->queue[i].frame; - if (!frame) - continue; dm->queue[i].frame = NULL; if (frame->pts != AV_NOPTS_VALUE && dm->start_pts == AV_NOPTS_VALUE) dm->start_pts = frame->pts; @@ -367,8 +365,7 @@ static int config_output(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; DecimateContext *dm = ctx->priv; - const AVFilterLink *inlink = - ctx->inputs[dm->ppsrc ? INPUT_CLEANSRC : INPUT_MAIN]; + const AVFilterLink *inlink = ctx->inputs[INPUT_MAIN]; AVRational fps = inlink->frame_rate; int max_value; const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(inlink->format); @@ -407,8 +404,13 @@ static int config_output(AVFilterLink *outlink) outlink->time_base = inlink->time_base; outlink->frame_rate = fps; outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; - outlink->w = inlink->w; - outlink->h = inlink->h; + if (dm->ppsrc) { + outlink->w = ctx->inputs[INPUT_CLEANSRC]->w; + outlink->h = ctx->inputs[INPUT_CLEANSRC]->h; + } else { + outlink->w = inlink->w; + outlink->h = inlink->h; + } dm->ts_unit = av_inv_q(av_mul_q(fps, outlink->time_base)); return 0; } |