diff options
author | Anton Khirnov <anton@khirnov.net> | 2011-08-19 17:52:44 +0200 |
---|---|---|
committer | Alex Converse <alex.converse@gmail.com> | 2011-08-19 15:34:24 -0700 |
commit | f21f294e05a6f0a06910236707bdfc82b4432487 (patch) | |
tree | 3d5cae06918fb4e6b9de3bd19c17e05ebf82173d /avconv.c | |
parent | e6d2b73784e5488d95c1ab76287f2eba9ca94d7d (diff) | |
download | ffmpeg-f21f294e05a6f0a06910236707bdfc82b4432487.tar.gz |
avconv: rescue poor abused limit_filesize global.
Keep a per-OutputFile instance of it, thus making -fs work with multiple
output files.
Signed-off-by: Alex Converse <alex.converse@gmail.com>
Diffstat (limited to 'avconv.c')
-rw-r--r-- | avconv.c | 14 |
1 files changed, 8 insertions, 6 deletions
@@ -197,7 +197,7 @@ static int64_t extra_size = 0; static int nb_frames_dup = 0; static int nb_frames_drop = 0; static int input_sync; -static uint64_t limit_filesize = 0; +static uint64_t limit_filesize = UINT64_MAX; static int force_fps = 0; static char *forced_key_frames = NULL; @@ -303,6 +303,7 @@ typedef struct OutputFile { int ost_index; /* index of the first stream in output_streams */ int64_t recording_time; /* desired length of the resulting file in microseconds */ int64_t start_time; /* start time in microseconds */ + uint64_t limit_filesize; } OutputFile; static InputStream *input_streams = NULL; @@ -2246,12 +2247,15 @@ static int transcode(OutputFile *output_files, smallest output pts */ file_index = -1; for (i = 0; i < nb_output_streams; i++) { + OutputFile *of; int64_t ipts; double opts; ost = &output_streams[i]; + of = &output_files[ost->file_index]; os = output_files[ost->file_index].ctx; ist = &input_streams[ost->source_index]; - if(ost->is_past_recording_time || no_packet[ist->file_index]) + if (ost->is_past_recording_time || no_packet[ist->file_index] || + (os->pb && avio_tell(os->pb) >= of->limit_filesize)) continue; opts = ost->st->pts.val * av_q2d(ost->st->time_base); ipts = ist->pts; @@ -2281,10 +2285,6 @@ static int transcode(OutputFile *output_files, break; } - /* finish if limit size exhausted */ - 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 */ is = input_files[file_index].ctx; ret= av_read_frame(is, &pkt); @@ -3568,6 +3568,7 @@ static void opt_output_file(const char *filename) output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams; output_files[nb_output_files - 1].recording_time = recording_time; output_files[nb_output_files - 1].start_time = start_time; + output_files[nb_output_files - 1].limit_filesize = limit_filesize; av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0); /* check filename in case of an image number is expected */ @@ -3695,6 +3696,7 @@ static void opt_output_file(const char *filename) chapters_input_file = INT_MAX; recording_time = INT64_MAX; start_time = 0; + limit_filesize = UINT64_MAX; av_freep(&meta_data_maps); nb_meta_data_maps = 0; |