It will be made useful in the following commits.
---
 avconv.c |   62 ++++++++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 40 insertions(+), 22 deletions(-)

diff --git a/avconv.c b/avconv.c
index 84fbbaa..ebf48c5 100644
--- a/avconv.c
+++ b/avconv.c
@@ -102,9 +102,7 @@ static const OptionDef options[];
 static const char *last_asked_format = NULL;
 static AVDictionary *ts_scale;
 
-static AVFormatContext *output_files[MAX_FILES];
 static AVDictionary *output_opts[MAX_FILES];
-static int nb_output_files = 0;
 
 static StreamMap *stream_maps = NULL;
 static int nb_stream_maps;
@@ -310,11 +308,18 @@ typedef struct InputFile {
     int64_t ts_offset;
 } InputFile;
 
+typedef struct OutputFile {
+    AVFormatContext *ctx;
+} OutputFile;
+
 static InputStream *input_streams = NULL;
 static int         nb_input_streams = 0;
 static InputFile   *input_files   = NULL;
 static int         nb_input_files   = 0;
 
+static OutputFile   *output_files   = NULL;
+static int        nb_output_files   = 0;
+
 #if CONFIG_AVFILTER
 
 static int configure_video_filters(InputStream *ist, OutputStream *ost)
@@ -437,7 +442,7 @@ static int exit_program(int ret)
 
     /* close files */
     for(i=0;i<nb_output_files;i++) {
-        AVFormatContext *s = output_files[i];
+        AVFormatContext *s = output_files[i].ctx;
         if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
             avio_close(s->pb);
         avformat_free_context(s);
@@ -462,6 +467,7 @@ static int exit_program(int ret)
 
     av_freep(&input_streams);
     av_freep(&input_files);
+    av_freep(&output_files);
 
     uninit_opts();
     av_free(audio_buf);
@@ -1256,7 +1262,7 @@ static void do_video_stats(AVFormatContext *os, 
OutputStream *ost,
     }
 }
 
-static void print_report(AVFormatContext **output_files,
+static void print_report(OutputFile *output_files,
                          OutputStream **ost_table, int nb_ostreams,
                          int is_last_report)
 {
@@ -1284,7 +1290,7 @@ static void print_report(AVFormatContext **output_files,
     }
 
 
-    oc = output_files[0];
+    oc = output_files[0].ctx;
 
     total_size = avio_size(oc->pb);
     if(total_size<0) // FIXME improve avio_size() so it works with non 
seekable output too
@@ -1593,7 +1599,7 @@ static int output_packet(InputStream *ist, int ist_index,
                     if (ost->picref)
                         ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, 
AV_TIME_BASE_Q);
 #endif
-                    os = output_files[ost->file_index];
+                    os = output_files[ost->file_index].ctx;
 
                     /* set the input output pts pairs */
                     //ost->sync_ipts = (double)(ist->pts + 
input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
@@ -1707,7 +1713,7 @@ static int output_packet(InputStream *ist, int ist_index,
             ost = ost_table[i];
             if (ost->source_index == ist_index) {
                 AVCodecContext *enc= ost->st->codec;
-                os = output_files[ost->file_index];
+                os = output_files[ost->file_index].ctx;
 
                 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && 
enc->frame_size <=1)
                     continue;
@@ -1788,19 +1794,27 @@ static int output_packet(InputStream *ist, int 
ist_index,
     return 0;
 }
 
-static void print_sdp(AVFormatContext **avc, int n)
+static void print_sdp(OutputFile *output_files, int n)
 {
     char sdp[2048];
+    int i;
+    AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
+
+    if (!avc)
+        exit_program(1);
+    for (i = 0; i < n; i++)
+        avc[i] = output_files[i].ctx;
 
     av_sdp_create(avc, n, sdp, sizeof(sdp));
     printf("SDP:\n%s\n", sdp);
     fflush(stdout);
+    av_freep(&avc);
 }
 
 /*
  * The following code is the main loop of the file converter
  */
-static int transcode(AVFormatContext **output_files,
+static int transcode(OutputFile *output_files,
                      int nb_output_files,
                      InputFile *input_files,
                      int nb_input_files)
@@ -1822,9 +1836,9 @@ static int transcode(AVFormatContext **output_files,
     /* output stream init */
     nb_ostreams = 0;
     for(i=0;i<nb_output_files;i++) {
-        os = output_files[i];
+        os = output_files[i].ctx;
         if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
-            av_dump_format(output_files[i], i, output_files[i]->filename, 1);
+            av_dump_format(os, i, os->filename, 1);
             fprintf(stderr, "Output file #%d does not contain any stream\n", 
i);
             ret = AVERROR(EINVAL);
             goto fail;
@@ -1837,7 +1851,7 @@ static int transcode(AVFormatContext **output_files,
         goto fail;
     n = 0;
     for(k=0;k<nb_output_files;k++) {
-        os = output_files[k];
+        os = output_files[k].ctx;
         for (i = 0; i < os->nb_streams; i++, n++)
             ost_table[n] = output_streams_for_file[k][i];
     }
@@ -1845,7 +1859,7 @@ static int transcode(AVFormatContext **output_files,
     /* for each output stream, we compute the right encoding parameters */
     for(i=0;i<nb_ostreams;i++) {
         ost = ost_table[i];
-        os = output_files[ost->file_index];
+        os = output_files[ost->file_index].ctx;
         ist = &input_streams[ost->source_index];
 
         codec = ost->st->codec;
@@ -2154,15 +2168,15 @@ static int transcode(AVFormatContext **output_files,
     }
 
     /* open files and write file headers */
-    for(i=0;i<nb_output_files;i++) {
-        os = output_files[i];
+    for (i = 0; i < nb_output_files; i++) {
+        os = output_files[i].ctx;
         if (avformat_write_header(os, &output_opts[i]) < 0) {
             snprintf(error, sizeof(error), "Could not write header for output 
file #%d (incorrect codec parameters ?)", i);
             ret = AVERROR(EINVAL);
             goto dump_format;
         }
         assert_avoptions(output_opts[i]);
-        if (strcmp(output_files[i]->oformat->name, "rtp")) {
+        if (strcmp(os->oformat->name, "rtp")) {
             want_sdp = 0;
         }
     }
@@ -2171,7 +2185,7 @@ static int transcode(AVFormatContext **output_files,
     /* dump the file output parameters - cannot be done before in case
        of stream copy */
     for(i=0;i<nb_output_files;i++) {
-        av_dump_format(output_files[i], i, output_files[i]->filename, 1);
+        av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 
1);
     }
 
     /* dump the stream mapping */
@@ -2225,7 +2239,7 @@ static int transcode(AVFormatContext **output_files,
         for(i=0;i<nb_ostreams;i++) {
             double ipts, opts;
             ost = ost_table[i];
-            os = output_files[ost->file_index];
+            os = output_files[ost->file_index].ctx;
             ist = &input_streams[ost->source_index];
             if(ist->is_past_recording_time || no_packet[ist->file_index])
                 continue;
@@ -2258,7 +2272,7 @@ static int transcode(AVFormatContext **output_files,
         }
 
         /* finish if limit size exhausted */
-        if (limit_filesize != 0 && limit_filesize <= 
avio_tell(output_files[0]->pb))
+        if (limit_filesize != 0 && limit_filesize <= 
avio_tell(output_files[0].ctx->pb))
             break;
 
         /* read a frame from it and output it in the fifo */
@@ -2359,7 +2373,7 @@ static int transcode(AVFormatContext **output_files,
 
     /* write the trailer if needed and close file */
     for(i=0;i<nb_output_files;i++) {
-        os = output_files[i];
+        os = output_files[i].ctx;
         av_write_trailer(os);
     }
 
@@ -3365,7 +3379,7 @@ static int opt_streamid(const char *opt, const char *arg)
 static int copy_chapters(int infile, int outfile)
 {
     AVFormatContext *is = input_files[infile].ctx;
-    AVFormatContext *os = output_files[outfile];
+    AVFormatContext *os = output_files[outfile].ctx;
     int i;
 
     for (i = 0; i < is->nb_chapters; i++) {
@@ -3557,7 +3571,11 @@ static void opt_output_file(const char *filename)
     av_dict_free(&metadata);
 
     av_dict_copy(&output_opts[nb_output_files], format_opts, 0);
-    output_files[nb_output_files++] = oc;
+
+    if (nb_output_files == MAX_FILES)
+        exit_program(1);                /* a temporary hack until all the 
other MAX_FILES-sized arrays are removed */
+    output_files = grow_array(output_files, sizeof(*output_files), 
&nb_output_files, nb_output_files + 1);
+    output_files[nb_output_files - 1].ctx       = oc;
 
     /* check filename in case of an image number is expected */
     if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
-- 
1.7.5.4

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to