summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_mkv.c
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2009-07-09 18:13:49 +0300
committerUoti Urpala <uau@glyph.nonexistent.invalid>2009-07-09 18:13:49 +0300
commitd9977e1c818d589e83e8dc2f0da84ad2e4960d86 (patch)
treed59770ca8c54df8e2453d7f8c13a9e5d67492537 /libmpdemux/demux_mkv.c
parent87366694d82c8d4c7f0bc210e6baa0ccd651d0c2 (diff)
downloadmpv-d9977e1c818d589e83e8dc2f0da84ad2e4960d86.tar.bz2
mpv-d9977e1c818d589e83e8dc2f0da84ad2e4960d86.tar.xz
demux_mkv: Make seeks more precise in some cases
When seeking backward, after seeking to the file position specified by an index entry skip packets until the timecode of that index entry. The existence of the entry should guarantee a keyframe there before the seek target time.
Diffstat (limited to 'libmpdemux/demux_mkv.c')
-rw-r--r--libmpdemux/demux_mkv.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index 4f44646b56..e4b3540913 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -2963,6 +2963,7 @@ demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int
free_cached_dps (demuxer);
if (!(flags & SEEK_FACTOR)) /* time in secs */
{
+ mkv_index_t *index = NULL;
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
stream_t *s = demuxer->stream;
int64_t target_timecode = 0, diff, min_diff=0xFFFFFFFFFFFFFFFLL;
@@ -3032,7 +3033,6 @@ demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int
}
else
{
- mkv_index_t *index = NULL;
int seek_id = (demuxer->video->id < 0) ? demuxer->audio->id : demuxer->video->id;
/* let's find the entry in the indexes with the smallest */
@@ -3077,7 +3077,7 @@ demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int
if (flags & SEEK_FORWARD)
mkv_d->skip_to_timecode = target_timecode;
else
- mkv_d->skip_to_timecode = 0;
+ mkv_d->skip_to_timecode = index ? index->timecode : 0;
mkv_d->a_skip_to_keyframe = 1;
demux_mkv_fill_buffer(demuxer, NULL);