In yadif filter, use current frame when previous is missing,
[ffmpeg.git] / libavfilter / vf_yadif.c
index b2b2fe5..fe4cb96 100644 (file)
@@ -167,7 +167,7 @@ static AVFilterBufferRef *get_video_buffer(AVFilterLink *link, int perms, int w,
 static void return_frame(AVFilterContext *ctx, int is_second){
     YADIFContext *yadif = ctx->priv;
     AVFilterLink *link= ctx->outputs[0];
 static void return_frame(AVFilterContext *ctx, int is_second){
     YADIFContext *yadif = ctx->priv;
     AVFilterLink *link= ctx->outputs[0];
-    int tff = yadif->parity == -1 ? yadif->cur->video->top_field_first : yadif->parity;
+    int tff = yadif->parity == -1 ? yadif->cur->video->top_field_first : (yadif->parity^1);
 
     if(is_second)
         yadif->out = avfilter_get_video_buffer(link, AV_PERM_WRITE | AV_PERM_PRESERVE |
 
     if(is_second)
         yadif->out = avfilter_get_video_buffer(link, AV_PERM_WRITE | AV_PERM_PRESERVE |
@@ -197,13 +197,12 @@ static void start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
     yadif->cur  = yadif->next;
     yadif->next = picref;
 
     yadif->cur  = yadif->next;
     yadif->next = picref;
 
-    if (!yadif->prev)
-        yadif->prev = avfilter_get_video_buffer(link, AV_PERM_WRITE | AV_PERM_PRESERVE |
-                                                AV_PERM_REUSE, link->w, link->h);
-
     if(!yadif->cur)
         return;
 
     if(!yadif->cur)
         return;
 
+    if (!yadif->prev)
+        yadif->prev = avfilter_ref_buffer(yadif->cur, AV_PERM_READ);
+
     yadif->out = avfilter_get_video_buffer(ctx->outputs[0], AV_PERM_WRITE | AV_PERM_PRESERVE |
                                        AV_PERM_REUSE, link->w, link->h);
 
     yadif->out = avfilter_get_video_buffer(ctx->outputs[0], AV_PERM_WRITE | AV_PERM_PRESERVE |
                                        AV_PERM_REUSE, link->w, link->h);