summaryrefslogtreecommitdiff
path: root/ffmpeg.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2011-08-30 15:58:26 +0200
committerMichael Niedermayer <michaelni@gmx.at>2011-08-30 18:08:23 +0200
commit877ba7b4bd1703500ed6e9a3f21497b34a49a2ad (patch)
tree602143fca74f08b45aa3e8f3c15ae65407cd2248 /ffmpeg.c
parentcb1343854308de5db240697734dc6542c1587fc0 (diff)
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 <alex.converse@gmail.com>
Diffstat (limited to 'ffmpeg.c')
-rw-r--r--ffmpeg.c14
1 files 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;