summaryrefslogtreecommitdiff
path: root/libavfilter/yadif_common.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavfilter/yadif_common.c')
-rw-r--r--libavfilter/yadif_common.c12
1 files changed, 9 insertions, 3 deletions
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);