avconv: factor out initializing input streams.
authorAnton Khirnov <anton@khirnov.net>
Wed, 6 Jul 2011 06:49:07 +0000 (08:49 +0200)
committerAnton Khirnov <anton@khirnov.net>
Thu, 18 Aug 2011 09:22:12 +0000 (11:22 +0200)
avconv.c

index e81e318..fb08717 100644 (file)
--- a/avconv.c
+++ b/avconv.c
@@ -1816,6 +1816,48 @@ static void print_sdp(OutputFile *output_files, int n)
     av_freep(&avc);
 }
 
+static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
+                             char *error, int error_len)
+{
+    int i;
+    InputStream *ist = &input_streams[ist_index];
+    if (ist->decoding_needed) {
+        AVCodec *codec = ist->dec;
+        if (!codec)
+            codec = avcodec_find_decoder(ist->st->codec->codec_id);
+        if (!codec) {
+            snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
+                    ist->st->codec->codec_id, ist->file_index, ist->st->index);
+            return AVERROR(EINVAL);
+        }
+
+        /* update requested sample format for the decoder based on the
+           corresponding encoder sample format */
+        for (i = 0; i < nb_output_streams; i++) {
+            OutputStream *ost = &output_streams[i];
+            if (ost->source_index == ist_index) {
+                update_sample_fmt(ist->st->codec, codec, ost->st->codec);
+                break;
+            }
+        }
+
+        if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
+            snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
+                    ist->file_index, ist->st->index);
+            return AVERROR(EINVAL);
+        }
+        assert_codec_experimental(ist->st->codec, 0);
+        assert_avoptions(ist->opts);
+    }
+
+    ist->pts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames*AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
+    ist->next_pts = AV_NOPTS_VALUE;
+    init_pts_correction(&ist->pts_ctx);
+    ist->is_start = 1;
+
+    return 0;
+}
+
 /*
  * The following code is the main loop of the file converter
  */
@@ -1824,7 +1866,7 @@ static int transcode(OutputFile *output_files,
                      InputFile *input_files,
                      int nb_input_files)
 {
-    int ret = 0, i, j;
+    int ret = 0, i;
     AVFormatContext *is, *os;
     AVCodecContext *codec, *icodec;
     OutputStream *ost;
@@ -2118,51 +2160,10 @@ static int transcode(OutputFile *output_files,
         }
     }
 
-    /* open each decoder */
-    for (i = 0; i < nb_input_streams; i++) {
-        ist = &input_streams[i];
-        if (ist->decoding_needed) {
-            AVCodec *codec = ist->dec;
-            if (!codec)
-                codec = avcodec_find_decoder(ist->st->codec->codec_id);
-            if (!codec) {
-                snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
-                        ist->st->codec->codec_id, ist->file_index, ist->st->index);
-                ret = AVERROR(EINVAL);
-                goto dump_format;
-            }
-
-            /* update requested sample format for the decoder based on the
-               corresponding encoder sample format */
-            for (j = 0; j < nb_output_streams; j++) {
-                ost = &output_streams[j];
-                if (ost->source_index == i) {
-                    update_sample_fmt(ist->st->codec, codec, ost->st->codec);
-                    break;
-                }
-            }
-
-            if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
-                snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
-                        ist->file_index, ist->st->index);
-                ret = AVERROR(EINVAL);
-                goto dump_format;
-            }
-            assert_codec_experimental(ist->st->codec, 0);
-            assert_avoptions(ost->opts);
-        }
-    }
-
-    /* init pts */
-    for (i = 0; i < nb_input_streams; i++) {
-        AVStream *st;
-        ist = &input_streams[i];
-        st= ist->st;
-        ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
-        ist->next_pts = AV_NOPTS_VALUE;
-        init_pts_correction(&ist->pts_ctx);
-        ist->is_start = 1;
-    }
+    /* init input streams */
+    for (i = 0; i < nb_input_streams; i++)
+        if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error)) < 0))
+            goto dump_format;
 
     /* open files and write file headers */
     for (i = 0; i < nb_output_files; i++) {