[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