[vlc-commits] demux: ts: fix incorrect seek times

Francois Cartegnie git at videolan.org
Thu Jan 21 14:31:20 CET 2016


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Wed Jan 20 23:06:52 2016 +0100| [48a518b8586ed94c384376cf9ff552eeb4dbcb0f] | committer: Francois Cartegnie

demux: ts: fix incorrect seek times

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

 modules/demux/mpeg/ts.c |   19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/modules/demux/mpeg/ts.c b/modules/demux/mpeg/ts.c
index 2604253..cd0ec11 100644
--- a/modules/demux/mpeg/ts.c
+++ b/modules/demux/mpeg/ts.c
@@ -1524,11 +1524,11 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
         {
             int64_t i_time, i_length;
             if( !DVBEventInformation( p_demux, &i_time, &i_length ) &&
-                 i_length > 0 && !SeekToTime( p_demux, p_pmt, TO_SCALE(i_length) * f ) )
+                 i_length > 0 && !SeekToTime( p_demux, p_pmt, (int64_t)(TO_SCALE(i_length) * f) ) )
             {
                 ReadyQueuesPostSeek( p_demux );
                 es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME,
-                                TO_SCALE(i_length) * f );
+                                (int64_t)(TO_SCALE(i_length) * f) );
                 return VLC_SUCCESS;
             }
         }
@@ -1538,14 +1538,17 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
              p_pmt->pcr.i_first > -1 && p_pmt->i_last_dts > VLC_TS_INVALID &&
              p_pmt->pcr.i_current > -1 )
         {
-            double i_length = TimeStampWrapAround( p_pmt,
+            int64_t i_length = TimeStampWrapAround( p_pmt,
                                                    p_pmt->i_last_dts ) - p_pmt->pcr.i_first;
-            if( !SeekToTime( p_demux, p_pmt, p_pmt->pcr.i_first + i_length * f ) )
+            i64 = p_pmt->pcr.i_first + (int64_t)(i_length * f);
+            if( i64 <= p_pmt->i_last_dts )
             {
-                ReadyQueuesPostSeek( p_demux );
-                es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME,
-                                FROM_SCALE(p_pmt->pcr.i_first + i_length * f) );
-                return VLC_SUCCESS;
+                if( !SeekToTime( p_demux, p_pmt, i64 ) )
+                {
+                    ReadyQueuesPostSeek( p_demux );
+                    es_out_Control( p_demux->out, ES_OUT_SET_NEXT_DISPLAY_TIME, FROM_SCALE(i64) );
+                    return VLC_SUCCESS;
+                }
             }
         }
 



More information about the vlc-commits mailing list