aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-09-27 03:37:27 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-09-27 03:52:31 +0200
commit65f7aee63b6283a2336d03046faa37f2391d98e0 (patch)
tree4d4e8cceeb08c916f0b6d73a032a8ccc9f10be26
parentd37044647f83f53a1cb711ea4655b944ff4af0e5 (diff)
downloadffmpeg-65f7aee63b6283a2336d03046faa37f2391d98e0.tar.gz
ffmpeg: add option to control copying of frames prior to start.
Normally we discard things prior to the intended start for stream copy this is not always possible, and its not done by default this option allows discarding to be enabled this is primarely usefull when transcoding a video and stream copying an audio stream. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--ffmpeg.c4
-rw-r--r--ffmpeg.h3
-rw-r--r--ffmpeg_opt.c5
3 files changed, 12 insertions, 0 deletions
diff --git a/ffmpeg.c b/ffmpeg.c
index 7621e9d997..3eb15a6494 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -1340,6 +1340,10 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
!ost->copy_initial_nonkeyframes)
return;
+ if (!ost->frame_number && ist->pts < of->start_time &&
+ !ost->copy_prior_start)
+ return;
+
if (of->recording_time != INT64_MAX &&
ist->pts >= of->recording_time + of->start_time) {
close_output_stream(ost);
diff --git a/ffmpeg.h b/ffmpeg.h
index 85a11a01d9..56f8dfc5f1 100644
--- a/ffmpeg.h
+++ b/ffmpeg.h
@@ -157,6 +157,8 @@ typedef struct OptionsContext {
int nb_presets;
SpecifierOpt *copy_initial_nonkeyframes;
int nb_copy_initial_nonkeyframes;
+ SpecifierOpt *copy_prior_start;
+ int nb_copy_prior_start;
SpecifierOpt *filters;
int nb_filters;
SpecifierOpt *fix_sub_duration;
@@ -326,6 +328,7 @@ typedef struct OutputStream {
int stream_copy;
const char *attachment_filename;
int copy_initial_nonkeyframes;
+ int copy_prior_start;
int keep_pix_fmt;
} OutputStream;
diff --git a/ffmpeg_opt.c b/ffmpeg_opt.c
index 3d73564aa2..2c5fbfb6b2 100644
--- a/ffmpeg_opt.c
+++ b/ffmpeg_opt.c
@@ -960,6 +960,9 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
ost->max_frames = INT64_MAX;
MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
+ ost->copy_prior_start = -1;
+ MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
+
MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
while (bsf) {
if (next = strchr(bsf, ','))
@@ -2316,6 +2319,8 @@ const OptionDef options[] = {
"exit on error", "error" },
{ "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(copy_initial_nonkeyframes) },
"copy initial non-keyframes" },
+ { "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(copy_prior_start) },
+ "copy or discard frames before start time" },
{ "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, { .off = OFFSET(max_frames) },
"set the number of frames to record", "number" },
{ "tag", OPT_STRING | HAS_ARG | OPT_SPEC | OPT_EXPERT,{ .off = OFFSET(codec_tags) },