]> git.sesse.net Git - vlc/blobdiff - modules/demux/mkv.cpp
Do not try to precisely seek (unsing ES_OUT_SET_NEXT_DISPLAY_TIME) if it
[vlc] / modules / demux / mkv.cpp
index 04c6f1af5e2d87027632a0211ca64ef487ae81a2..2f6597b0e3ecadf62c833dc55a551c78db86122b 100644 (file)
@@ -5873,7 +5873,7 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset )
 
         if( i_track < tracks.size() )
         {
-           if( sys.i_pts >= sys.i_start_pts )
+            if( sys.i_pts >= sys.i_start_pts )
             {
                 cluster = static_cast<KaxCluster*>(ep->UnGet( i_block_pos, i_cluster_pos ));
                 i_track_skipping = 0;
@@ -5887,6 +5887,8 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset )
                 }
                 if( !tracks[i_track]->b_search_keyframe )
                 {
+                    
+            //es_out_Control( sys.demuxer.out, ES_OUT_SET_PCR, sys.i_pts );
 #if LIBMATROSKA_VERSION >= 0x000800
                     BlockDecode( &sys.demuxer, block, simpleblock, sys.i_pts, 0, i_block_ref1 >= 0 || i_block_ref2 > 0 );
 #else
@@ -5898,6 +5900,16 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset )
 
         delete block;
     }
+
+    /* FIXME current ES_OUT_SET_NEXT_DISPLAY_TIME does not work that well if
+     * the delay is too high. */
+    if( sys.i_pts + 500*1000 < sys.i_start_pts )
+    {
+        sys.i_start_pts = sys.i_pts;
+
+        for( i_track = 0; i_track < tracks.size(); i_track++ )
+            es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, tracks[i_track]->p_es, sys.i_start_pts );
+    }
 }
 
 void virtual_segment_c::Seek( demux_t & demuxer, mtime_t i_date, mtime_t i_time_offset, chapter_item_c *psz_chapter )