From 877ba7b4bd1703500ed6e9a3f21497b34a49a2ad Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Tue, 30 Aug 2011 15:58:26 +0200 Subject: [PATCH] ffmpeg: 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 --- ffmpeg.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ffmpeg.c b/ffmpeg.c index f0374f7000..b688a8a299 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -216,7 +216,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; @@ -328,6 +328,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; @@ -2377,12 +2378,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; @@ -2412,10 +2416,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); @@ -3732,6 +3732,7 @@ static int opt_output_file(const char *opt, 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 */ @@ -3863,6 +3864,7 @@ static int opt_output_file(const char *opt, 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;