[vlc-commits] mux: ps: fix scr backjump

Francois Cartegnie git at videolan.org
Mon Jan 8 22:27:53 CET 2018


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Mon Jan  8 22:20:44 2018 +0100| [be2caa1a492bfa5685c3eac1d091f1c4f7aaa2f6] | committer: Francois Cartegnie

mux: ps: fix scr backjump

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

 modules/mux/mpeg/ps.c | 47 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 32 insertions(+), 15 deletions(-)

diff --git a/modules/mux/mpeg/ps.c b/modules/mux/mpeg/ps.c
index bba06f824d..142b498b31 100644
--- a/modules/mux/mpeg/ps.c
+++ b/modules/mux/mpeg/ps.c
@@ -103,6 +103,7 @@ typedef struct ps_stream_s
 
     /* Language is iso639-2T */
     uint8_t lang[3];
+    int64_t i_dts;
 
 } ps_stream_t;
 
@@ -270,6 +271,7 @@ static int AddStream( sout_mux_t *p_mux, sout_input_t *p_input )
     if( unlikely(p_input->p_sys == NULL) )
         return VLC_ENOMEM;
     p_stream->i_stream_type = 0x81;
+    p_stream->i_dts = -1;
 
     /* Init this new stream */
     switch( p_input->p_fmt->i_codec )
@@ -468,28 +470,43 @@ static int Mux( sout_mux_t *p_mux )
         p_stream = (ps_stream_t*)p_input->p_sys;
         p_ps     = NULL;
 
+        p_stream->i_dts = i_dts;
+
         /* Write regulary PackHeader */
         if( p_sys->i_pes_count % 30 == 0)
         {
-            /* Update the instant bitrate every second or so */
-            if( p_sys->i_instant_size &&
-                i_dts - p_sys->i_instant_dts > 1000000 )
+            int64_t i_mindts = INT64_MAX;
+            for( size_t i=0; i<p_mux->i_nb_inputs; i++ )
             {
-                int64_t i_instant_bitrate = p_sys->i_instant_size * 8000000 /
-                    ( i_dts - p_sys->i_instant_dts );
-
-                p_sys->i_instant_bitrate += i_instant_bitrate;
-                p_sys->i_instant_bitrate /= 2;
-
-                p_sys->i_instant_size = 0;
-                p_sys->i_instant_dts = i_dts;
+                ps_stream_t *p_s = (ps_stream_t*)p_input->p_sys;
+                if( p_input->p_fmt->i_cat == SPU_ES && p_mux->i_nb_inputs > 1 )
+                    continue;
+                if( p_s->i_dts >= 0 && i_mindts > p_s->i_dts )
+                    i_mindts = p_s->i_dts;
             }
-            else if( !p_sys->i_instant_size )
+
+            if( i_mindts > p_sys->i_instant_dts )
             {
-                p_sys->i_instant_dts = i_dts;
+                /* Update the instant bitrate every second or so */
+                if( p_sys->i_instant_size &&
+                    i_dts - p_sys->i_instant_dts > 1000000 )
+                {
+                    int64_t i_instant_bitrate = p_sys->i_instant_size * 8000000 /
+                            ( i_dts - p_sys->i_instant_dts );
+
+                    p_sys->i_instant_bitrate += i_instant_bitrate;
+                    p_sys->i_instant_bitrate /= 2;
+
+                    p_sys->i_instant_size = 0;
+                    p_sys->i_instant_dts = i_dts;
+                }
+                else if( !p_sys->i_instant_size )
+                {
+                    p_sys->i_instant_dts = i_dts;
+                }
+
+                MuxWritePackHeader( p_mux, &p_ps, i_dts );
             }
-
-            MuxWritePackHeader( p_mux, &p_ps, i_dts );
         }
 
         /* Write regulary SystemHeader */



More information about the vlc-commits mailing list