[FFmpeg-cvslog] avconv: split checking for active outputs out of transcode().

Anton Khirnov git at videolan.org
Mon Jun 4 23:05:10 CEST 2012


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Fri Jun  1 10:44:11 2012 +0200| [2f51ec2b9438e211f5b8abb2fcf5d8be678e7e8c] | committer: Anton Khirnov

avconv: split checking for active outputs out of transcode().

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

 avconv.c |   51 +++++++++++++++++++++++++++++++++------------------
 1 file changed, 33 insertions(+), 18 deletions(-)

diff --git a/avconv.c b/avconv.c
index cbf66c4..1ecd62f 100644
--- a/avconv.c
+++ b/avconv.c
@@ -2855,6 +2855,35 @@ static int transcode_init(void)
     return 0;
 }
 
+/**
+ * @return 1 if there are still streams where more output is wanted,
+ *         0 otherwise
+ */
+static int need_output(void)
+{
+    int i;
+
+    for (i = 0; i < nb_output_streams; i++) {
+        OutputStream *ost    = output_streams[i];
+        OutputFile *of       = output_files[ost->file_index];
+        AVFormatContext *os  = output_files[ost->file_index]->ctx;
+
+        if (ost->is_past_recording_time ||
+            (os->pb && avio_tell(os->pb) >= of->limit_filesize))
+            continue;
+        if (ost->frame_number > ost->max_frames) {
+            int j;
+            for (j = 0; j < of->ctx->nb_streams; j++)
+                output_streams[of->ost_index + j]->is_past_recording_time = 1;
+            continue;
+        }
+
+        return 1;
+    }
+
+    return 0;
+}
+
 /*
  * The following code is the main loop of the file converter
  */
@@ -2881,31 +2910,17 @@ static int transcode(void)
     timer_start = av_gettime();
 
     for (; received_sigterm == 0;) {
-        int file_index, ist_index, past_recording_time = 1;
+        int file_index, ist_index;
         AVPacket pkt;
         int64_t ipts_min;
 
         ipts_min = INT64_MAX;
 
         /* check if there's any stream where output is still needed */
-        for (i = 0; i < nb_output_streams; i++) {
-            OutputFile *of;
-            ost = output_streams[i];
-            of  = output_files[ost->file_index];
-            os  = output_files[ost->file_index]->ctx;
-            if (ost->is_past_recording_time ||
-                (os->pb && avio_tell(os->pb) >= of->limit_filesize))
-                continue;
-            if (ost->frame_number > ost->max_frames) {
-                int j;
-                for (j = 0; j < of->ctx->nb_streams; j++)
-                    output_streams[of->ost_index + j]->is_past_recording_time = 1;
-                continue;
-            }
-            past_recording_time = 0;
-        }
-        if (past_recording_time)
+        if (!need_output()) {
+            av_log(NULL, AV_LOG_VERBOSE, "No more output streams to write to, finishing.\n");
             break;
+        }
 
         /* select the stream that we must read now by looking at the
            smallest output pts */



More information about the ffmpeg-cvslog mailing list