[vlc-commits] mux: avformat: add an option to reset timestamps

Thomas Guillem git at videolan.org
Wed Jan 16 13:03:38 CET 2019


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Tue Jan 15 13:24:30 2019 +0100| [25d263a6613a7e856999033b0c69026f6da20c4f] | committer: Steve Lhomme

mux: avformat: add an option to reset timestamps

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=25d263a6613a7e856999033b0c69026f6da20c4f
---

 modules/codec/avcodec/avcommon.h  |  3 +++
 modules/demux/avformat/avformat.c |  1 +
 modules/demux/avformat/mux.c      | 11 ++++++++++-
 3 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/modules/codec/avcodec/avcommon.h b/modules/codec/avcodec/avcommon.h
index 9e43db4360..d2f5630acb 100644
--- a/modules/codec/avcodec/avcommon.h
+++ b/modules/codec/avcodec/avcommon.h
@@ -60,6 +60,9 @@
 #define AV_OPTIONS_TEXT     N_("Advanced options")
 #define AV_OPTIONS_LONGTEXT N_("Advanced options, in the form {opt=val,opt2=val2}.")
 
+#define AV_RESET_TS_TEXT     N_("Reset timestamps")
+#define AV_RESET_TS_LONGTEXT N_("The muxed content will start near a 0 timestamp.")
+
 static inline void vlc_av_get_options(const char *psz_opts, AVDictionary** pp_dict)
 {
     config_chain_t *cfg = NULL;
diff --git a/modules/demux/avformat/avformat.c b/modules/demux/avformat/avformat.c
index 8025a898b6..12d3881a21 100644
--- a/modules/demux/avformat/avformat.c
+++ b/modules/demux/avformat/avformat.c
@@ -57,6 +57,7 @@ vlc_module_begin ()
     add_string( "sout-avformat-mux", NULL, MUX_TEXT, MUX_LONGTEXT, true )
     add_obsolete_string("ffmpeg-mux") /* removed since 2.1.0 */
     add_string( "sout-avformat-options", NULL, AV_OPTIONS_TEXT, AV_OPTIONS_LONGTEXT, true )
+    add_bool( "sout-avformat-reset-ts", false, AV_RESET_TS_TEXT, AV_RESET_TS_LONGTEXT, true )
     set_callbacks( avformat_OpenMux, avformat_CloseMux )
 #endif
 #ifndef MERGE_FFMPEG
diff --git a/modules/demux/avformat/mux.c b/modules/demux/avformat/mux.c
index 215bcfb0a8..9b9d6c07f1 100644
--- a/modules/demux/avformat/mux.c
+++ b/modules/demux/avformat/mux.c
@@ -45,7 +45,7 @@
 //#define AVFORMAT_DEBUG 1
 
 static const char *const ppsz_mux_options[] = {
-    "mux", "options", NULL
+    "mux", "options", "reset-ts", NULL
 };
 
 /*****************************************************************************
@@ -65,6 +65,7 @@ typedef struct
 #if LIBAVFORMAT_VERSION_CHECK( 57, 7, 0, 40, 100 )
     bool     b_header_done;
 #endif
+    bool     b_reset_ts;
 } sout_mux_sys_t;
 
 /*****************************************************************************
@@ -151,6 +152,7 @@ int avformat_OpenMux( vlc_object_t *p_this )
     p_sys->io->write_data_type = IOWriteTyped;
     p_sys->b_header_done = false;
 #endif
+    p_sys->b_reset_ts = var_GetBool( p_mux, "sout-avformat-reset-ts" );
 
     /* Fill p_mux fields */
     p_mux->pf_control   = Control;
@@ -371,8 +373,15 @@ static int MuxBlock( sout_mux_t *p_mux, sout_input_t *p_input )
     }
 
     if( p_data->i_pts > 0 )
+    {
+        if( p_sys->b_reset_ts )
+        {
+            p_sys->oc->output_ts_offset = -p_data->i_pts;
+            p_sys->b_reset_ts = false;
+        }
         pkt.pts = TO_AV_TS(p_data->i_pts * p_stream->time_base.den /
             CLOCK_FREQ / p_stream->time_base.num);
+    }
     if( p_data->i_dts > 0 )
         pkt.dts = TO_AV_TS(p_data->i_dts * p_stream->time_base.den /
             CLOCK_FREQ / p_stream->time_base.num);



More information about the vlc-commits mailing list