vlc/vlc-2.0 | branch: master | Denis Charmet <[email protected]> | Sat Feb 18 14:35:46 2012 +0100| [779e24dcad1ba1d5f7ed069a9f0d1b5c3624aada] | committer: Jean-Baptiste Kempf
Fix seek in mka Fix #6078 Signed-off-by: Jean-Baptiste Kempf <[email protected]> (cherry picked from commit 7098f40219523ba072997c9e86f3b2c626caddda) Signed-off-by: Jean-Baptiste Kempf <[email protected]> > http://git.videolan.org/gitweb.cgi/vlc/vlc-2.0.git/?a=commit;h=779e24dcad1ba1d5f7ed069a9f0d1b5c3624aada --- modules/demux/mkv/matroska_segment.cpp | 50 +++++++++++++++++++------------- 1 files changed, 30 insertions(+), 20 deletions(-) diff --git a/modules/demux/mkv/matroska_segment.cpp b/modules/demux/mkv/matroska_segment.cpp index c0a0d03..c6e6993 100644 --- a/modules/demux/mkv/matroska_segment.cpp +++ b/modules/demux/mkv/matroska_segment.cpp @@ -690,6 +690,7 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset, int64_t i_ mtime_t i_pts = 0; spoint *p_first = NULL; spoint *p_last = NULL; + int i_cat; if( i_global_position >= 0 ) { @@ -772,33 +773,42 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset, int64_t i_ es_out_Control( sys.demuxer.out, ES_OUT_SET_NEXT_DISPLAY_TIME, i_date ); /* now parse until key frame */ - for( i_track = 0; i_track < tracks.size(); i_track++ ) + const int es[3] = { VIDEO_ES, AUDIO_ES, SPU_ES }; + for( int i = 0, i_cat = es[0]; i < 2; i_cat = es[++i] ) { - if( tracks[i_track]->fmt.i_cat == VIDEO_ES ) + for( i_track = 0; i_track < tracks.size(); i_track++ ) { - spoint * seekpoint = new spoint(i_track, i_seek_time, i_seek_position, i_seek_position); - if( unlikely( !seekpoint ) ) + if( tracks[i_track]->fmt.i_cat == i_cat ) { - for( spoint * sp = p_first; sp; ) + spoint * seekpoint = new spoint(i_track, i_seek_time, i_seek_position, i_seek_position); + if( unlikely( !seekpoint ) ) { - spoint * tmp = sp; - sp = sp->p_next; - delete tmp; + for( spoint * sp = p_first; sp; ) + { + spoint * tmp = sp; + sp = sp->p_next; + delete tmp; + } + return; + } + if( unlikely( !p_first ) ) + { + p_first = seekpoint; + p_last = seekpoint; + } + else + { + p_last->p_next = seekpoint; + p_last = seekpoint; } - return; - } - if( unlikely( !p_first ) ) - { - p_first = seekpoint; - p_last = seekpoint; - } - else - { - p_last->p_next = seekpoint; - p_last = seekpoint; } } + if( likely( p_first ) ) + break; } + /*Neither video nor audio track... no seek further*/ + if( unlikely( !p_first ) ) + return; while( i_pts < i_date ) { @@ -825,7 +835,7 @@ void matroska_segment_c::Seek( mtime_t i_date, mtime_t i_time_offset, int64_t i_ i_pts = sys.i_chapter_time + block->GlobalTimecode() / (mtime_t) 1000; if( i_track < tracks.size() ) { - if( tracks[i_track]->fmt.i_cat == VIDEO_ES && b_key_picture ) + if( tracks[i_track]->fmt.i_cat == i_cat && b_key_picture ) { /* get the seekpoint */ spoint * sp; _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
