From 65f7aee63b6283a2336d03046faa37f2391d98e0 Mon Sep 17 00:00:00 2001
From: Michael Niedermayer <michaelni@gmx.at>
Date: Thu, 27 Sep 2012 03:37:27 +0200
Subject: [PATCH] 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>
---
 ffmpeg.c     | 4 ++++
 ffmpeg.h     | 3 +++
 ffmpeg_opt.c | 5 +++++
 3 files changed, 12 insertions(+)

diff --git a/ffmpeg.c b/ffmpeg.c
index 7621e9d9971..3eb15a64944 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 85a11a01d9f..56f8dfc5f18 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 3d73564aa20..2c5fbfb6b2d 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) },
-- 
GitLab