[FFmpeg-cvslog] avfilter/yadif_common: Add field type tracking to help bwdif

Philip Langdale git at videolan.org
Thu Nov 15 05:43:56 EET 2018


ffmpeg | branch: master | Philip Langdale <philipl at overt.org> | Sun Nov  4 10:02:07 2018 -0800| [fa74e4aef2103e27424d2cfae3f142149b6a3b36] | committer: Philip Langdale

avfilter/yadif_common: Add field type tracking to help bwdif

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.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=fa74e4aef2103e27424d2cfae3f142149b6a3b36
---

 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..c928911b35 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_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..a10cf7a17f 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_BACK_END)
+            yadif->current_field = YADIF_FIELD_END;
     }
 
     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_END;
+    }
 
     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_BACK_END;
         next->pts = yadif->next->pts * 2 - yadif->cur->pts;
 
         ff_yadif_filter_frame(ctx->inputs[0], next);



More information about the ffmpeg-cvslog mailing list