Hi, On Tue, Oct 21, 2014 at 11:40 PM, Neil Birkbeck <neil.birkb...@gmail.com> wrote:
> Uses a similar approach as vf_yadif to flush the last frame in idet. > > Quick test with 50 frames from vsynth1: > ./ffmpeg.old -i fate-suite/ffmpeg-synthetic/vsynth1/%02d.pgm -vf idet -f > mp4 -y /dev/null 2>&1 | grep Multi > (gives) [Parsed_idet_0 @ 0x261ebb0] Multi frame detection: TFF:0 BFF:0 > Progressive:48 Undetermined:1 > > ./ffmpeg -i fate-suite/ffmpeg-synthetic/vsynth1/%02d.pgm -vf idet -f mp4 > -y /dev/null 2>&1 | grep Multi > (gives) [Parsed_idet_0 @ 0x35a0bb0] Multi frame detection: TFF:0 BFF:0 > Progressive:49 Undetermined:1 > > Seems ok. Note that it seems to be reporting one extra frame always. E.g.: ./ffmpeg -i test.mov -vframes 3 -an -vf idet -f null /dev/null 2>&1 | grep idet [Parsed_idet_0 @ 0x7feab8500160] Single frame detection: TFF:0 BFF:0 Progressive:4 Undetermined:0 [Parsed_idet_0 @ 0x7feab8500160] Multi frame detection: TFF:0 BFF:0 Progressive:4 Undetermined:0 or, with 1 frame: ./ffmpeg -i test.mov -vframes 1 -an -vf idet -f null /dev/null 2>&1 | grep idet [Parsed_idet_0 @ 0x7fc958600c80] Single frame detection: TFF:0 BFF:0 Progressive:2 Undetermined:0 [Parsed_idet_0 @ 0x7fc958600c80] Multi frame detection: TFF:0 BFF:0 Progressive:2 Undetermined:0 > > Fate tests have been updated. > > (In testing, it seems this filter will also need a subsequent patch for > single frame input) > > Signed-off-by: Neil Birkbeck <neil.birkb...@gmail.com> > --- > libavfilter/vf_idet.c | 31 +++++++++++++++++++++++++++++++ > libavfilter/vf_idet.h | 1 + > tests/ref/fate/filter-idet | 2 +- > 3 files changed, 33 insertions(+), 1 deletion(-) > > diff --git a/libavfilter/vf_idet.c b/libavfilter/vf_idet.c > index 339f4a6..b9c4070 100644 > --- a/libavfilter/vf_idet.c > +++ b/libavfilter/vf_idet.c > @@ -191,6 +191,35 @@ static int filter_frame(AVFilterLink *link, AVFrame > *picref) > return ff_filter_frame(ctx->outputs[0], av_frame_clone(idet->cur)); > } > > +static int request_frame(AVFilterLink *link) > +{ > + AVFilterContext *ctx = link->src; > + IDETContext *idet = ctx->priv; > + > + do { > + int ret; > + > + if (idet->eof) > + return AVERROR_EOF; > + > + ret = ff_request_frame(link->src->inputs[0]); > + > + if (ret == AVERROR_EOF && idet->cur) { > + AVFrame *next = av_frame_clone(idet->next); > + > + if (!next) > + return AVERROR(ENOMEM); > + > + filter_frame(link->src->inputs[0], next); > + idet->eof = 1; > + } else if (ret < 0) { > + return ret; > + } > + } while (!idet->cur); > + > + return 0; > +} > + > static av_cold void uninit(AVFilterContext *ctx) > { > IDETContext *idet = ctx->priv; > @@ -253,6 +282,7 @@ static av_cold int init(AVFilterContext *ctx) > { > IDETContext *idet = ctx->priv; > > + idet->eof = 0; > idet->last_type = UNDETERMINED; > memset(idet->history, UNDETERMINED, HIST_SIZE); > > @@ -279,6 +309,7 @@ static const AVFilterPad idet_outputs[] = { > .name = "default", > .type = AVMEDIA_TYPE_VIDEO, > .config_props = config_output, > + .request_frame = request_frame > }, > { NULL } > }; > diff --git a/libavfilter/vf_idet.h b/libavfilter/vf_idet.h > index ef29fff..57332df 100644 > --- a/libavfilter/vf_idet.h > +++ b/libavfilter/vf_idet.h > @@ -50,6 +50,7 @@ typedef struct { > ff_idet_filter_func filter_line; > > const AVPixFmtDescriptor *csp; > + int eof; > } IDETContext; > > void ff_idet_init_x86(IDETContext *idet, int for_16b); > diff --git a/tests/ref/fate/filter-idet b/tests/ref/fate/filter-idet > index f1396c5..2f9f11c 100644 > --- a/tests/ref/fate/filter-idet > +++ b/tests/ref/fate/filter-idet > @@ -1 +1 @@ > -idet 1790336872e844c867a53150b8ee8810 > +idet 005e6ddc8a5daf11cf866a1ec76c2572 > -- > 2.1.0.rc2.206.gedb03e5 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel