[FFmpeg-cvslog] ffmpeg: fix reinitializing with threads while flushing

Michael Niedermayer git at videolan.org
Mon Jun 23 00:12:17 CEST 2014


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Sun Jun 22 23:54:51 2014 +0200| [c69f7299473d9b5a0bdae7dfddf464fefc3d16af] | committer: Michael Niedermayer

ffmpeg: fix reinitializing with threads while flushing

With threads the decoder has a delay and will thus have multiple
frames at EOF left in its buffers which will be returned when flushing
the decoder. The code that extracts such frames from the decoder at the
end does not pull frames from the filtergraph, thus when one of these
frames causes the filtergraph to be reinited, the frames still inside
the graph at that point re lost

This commit changes the flushing to be more similar to normal decoding
and 1 frame at a time

Fixes hqx fate with threads

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>

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

 ffmpeg.c |   13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/ffmpeg.c b/ffmpeg.c
index 91e4734..2c17525 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -2147,6 +2147,8 @@ static int output_packet(InputStream *ist, const AVPacket *pkt)
         if (!got_output) {
             continue;
         }
+        if (got_output && !pkt)
+            break;
     }
 
     /* handle stream copy */
@@ -2185,7 +2187,7 @@ static int output_packet(InputStream *ist, const AVPacket *pkt)
         do_streamcopy(ist, ost, pkt);
     }
 
-    return 0;
+    return got_output;
 }
 
 static void print_sdp(void)
@@ -3315,12 +3317,14 @@ static int process_input(int file_index)
             if (exit_on_error)
                 exit_program(1);
         }
-        ifile->eof_reached = 1;
 
         for (i = 0; i < ifile->nb_streams; i++) {
             ist = input_streams[ifile->ist_index + i];
-            if (ist->decoding_needed)
-                output_packet(ist, NULL);
+            if (ist->decoding_needed) {
+                ret = output_packet(ist, NULL);
+                if (ret>0)
+                    return 0;
+            }
 
             /* mark all outputs that don't go through lavfi as finished */
             for (j = 0; j < nb_output_streams; j++) {
@@ -3332,6 +3336,7 @@ static int process_input(int file_index)
             }
         }
 
+        ifile->eof_reached = 1;
         return AVERROR(EAGAIN);
     }
 



More information about the ffmpeg-cvslog mailing list