[FFmpeg-devel] [PATCH 1/2] avfilter/yadif_common: Add field type tracking to help bwdif

Thomas Mundt tmundt75 at gmail.com
Sun Nov 11 19:12:27 EET 2018


Am Sa., 10. Nov. 2018 um 18:47 Uhr schrieb Philip Langdale <
philipl at overt.org>:

> The bwdif filter can use common yadif frame management if we track
> when a field is the first or last field in a sequence. While this
> information is not used by yadif, the added benefit of removing the
> duplicated frame management logic makes it worth tracking this state
> in the common code.
> ---
>  libavfilter/yadif.h        | 14 ++++++++++++++
>  libavfilter/yadif_common.c | 12 +++++++++---
>  2 files changed, 23 insertions(+), 3 deletions(-)
>
> diff --git a/libavfilter/yadif.h b/libavfilter/yadif.h
> index 32d6f4a0d4..02240a4dac 100644
> --- a/libavfilter/yadif.h
> +++ b/libavfilter/yadif.h
> @@ -41,6 +41,12 @@ enum YADIFDeint {
>      YADIF_DEINT_INTERLACED = 1, ///< only deinterlace frames marked as
> interlaced
>  };
>
> +enum YADIFCurrentField {
> +    YADIF_FIELD_LAST   = -1, ///< The last field in a sequence
> +    YADIF_FIELD_FIRST  =  0, ///< The first field in a sequence
> +    YADIF_FIELD_NORMAL =  1, ///< A normal field in the middle of a
> sequence
> +};
>

These names are confusing for the bwdif code.
current_field == 0 means first or last field detected.
current_field == -1 means last frame detected.
Suggestion:
YADIF_FIELD_BACK_END = -1, /// <The last frame in a sequence
YADIF_FIELD_END = 0, /// <The first or last field in a sequence
YADIF_FIELD_NORMAL = 1, /// <A normal field in the middle of a sequence

+
>  typedef struct YADIFContext {
>      const AVClass *class;
>
> @@ -70,6 +76,14 @@ typedef struct YADIFContext {
>      int eof;
>      uint8_t *temp_line;
>      int temp_line_size;
> +
> +    /*
> +     * An algorithm that treats first and/or last fields in a sequence
> +     * differently can use this to detect those cases. It is the
> algorithm's
> +     * responsibility to set the value to YADIF_FIELD_NORMAL after
> processing
> +     * the first field.
> +     */
> +    int current_field;  ///< YADIFCurrentField
>  } YADIFContext;
>
>  void ff_yadif_init_x86(YADIFContext *yadif);
> diff --git a/libavfilter/yadif_common.c b/libavfilter/yadif_common.c
> index 19e8ac5281..213eca5396 100644
> --- a/libavfilter/yadif_common.c
> +++ b/libavfilter/yadif_common.c
> @@ -44,6 +44,8 @@ static int return_frame(AVFilterContext *ctx, int
> is_second)
>
>          av_frame_copy_props(yadif->out, yadif->cur);
>          yadif->out->interlaced_frame = 0;
> +        if (yadif->current_field == YADIF_FIELD_LAST)
> +            yadif->current_field = YADIF_FIELD_FIRST;
>      }
>
>      yadif->filter(ctx, yadif->out, tff ^ !is_second, tff);
> @@ -103,9 +105,12 @@ int ff_yadif_filter_frame(AVFilterLink *link, AVFrame
> *frame)
>      yadif->cur  = yadif->next;
>      yadif->next = frame;
>
> -    if (!yadif->cur &&
> -        !(yadif->cur = av_frame_clone(yadif->next)))
> -        return AVERROR(ENOMEM);
> +    if (!yadif->cur) {
> +        yadif->cur = av_frame_clone(yadif->next);
> +        if (!yadif->cur)
> +            return AVERROR(ENOMEM);
> +        yadif->current_field = YADIF_FIELD_FIRST;
> +    }
>
>      if (checkstride(yadif, yadif->next, yadif->cur)) {
>          av_log(ctx, AV_LOG_VERBOSE, "Reallocating frame due to differing
> stride\n");
> @@ -173,6 +178,7 @@ int ff_yadif_request_frame(AVFilterLink *link)
>          if (!next)
>              return AVERROR(ENOMEM);
>
> +        yadif->current_field = YADIF_FIELD_LAST;
>          next->pts = yadif->next->pts * 2 - yadif->cur->pts;
>
>          ff_yadif_filter_frame(ctx->inputs[0], next);
> --
> 2.19.1
>


More information about the ffmpeg-devel mailing list