[FFmpeg-devel] [PATCH] avfilter/vf_idet: Fixes issue with idet not flushing last frame.

Pascal Massimino pascal.massimino at gmail.com
Wed Oct 22 16:43:52 CEST 2014


Hi,

On Tue, Oct 21, 2014 at 11:40 PM, Neil Birkbeck <neil.birkbeck at 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.birkbeck at 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 at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list