summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demux_mkv.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmpdemux/demux_mkv.c')
-rw-r--r--libmpdemux/demux_mkv.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index 28e9cc8ded..3bdedb4eb6 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -28,6 +28,8 @@
#include "libass/ass.h"
#include "libass/ass_mp.h"
+#include "libavutil/common.h"
+
#ifdef USE_QTX_CODECS
#include "loader/qtx/qtxsdk/components.h"
#endif
@@ -3554,18 +3556,26 @@ demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int
diff = target_timecode + mkv_d->first_tc -
(int64_t) mkv_d->indexes[i].timecode * mkv_d->tc_scale / 1000000.0;
- if ((flags & 1 || target_timecode <= mkv_d->last_pts*1000)
- && diff >= 0 && diff < min_diff)
- {
- min_diff = diff;
- index = mkv_d->indexes + i;
- }
- else if (target_timecode > mkv_d->last_pts*1000
- && diff < 0 && -diff < min_diff)
- {
- min_diff = -diff;
- index = mkv_d->indexes + i;
- }
+ if ((flags & 1 || target_timecode <= mkv_d->last_pts*1000)) {
+ // Absolute seek or seek backward: find the last index
+ // position before target time
+ if (diff < 0 || diff >= min_diff)
+ continue;
+ }
+ else {
+ // Relative seek forward: find the first index position
+ // after target time. If no such index exists, find last
+ // position between current position and target time.
+ if (diff <= 0) {
+ if (min_diff <= 0 && diff <= min_diff)
+ continue;
+ }
+ else if (diff >= FFMIN(target_timecode - mkv_d->last_pts,
+ min_diff))
+ continue;
+ }
+ min_diff = diff;
+ index = mkv_d->indexes + i;
}
if (index) /* We've found an entry. */