summaryrefslogtreecommitdiffstats
path: root/demux/demux_mkv.c
diff options
context:
space:
mode:
Diffstat (limited to 'demux/demux_mkv.c')
-rw-r--r--demux/demux_mkv.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c
index 8b49169423..79e62a112c 100644
--- a/demux/demux_mkv.c
+++ b/demux/demux_mkv.c
@@ -2716,25 +2716,28 @@ static struct mkv_index *seek_with_cues(struct demuxer *demuxer, int seek_id,
if (flags & SEEK_SUBPREROLL) {
uint64_t prev_target = 0;
for (size_t i = 0; i < mkv_d->num_indexes; i++) {
- uint64_t index_pos = mkv_d->indexes[i].filepos;
- if (index_pos > prev_target && index_pos < seek_pos)
- prev_target = index_pos;
+ if (seek_id < 0 || mkv_d->indexes[i].tnum == seek_id) {
+ uint64_t index_pos = mkv_d->indexes[i].filepos;
+ if (index_pos > prev_target && index_pos < seek_pos)
+ prev_target = index_pos;
+ }
}
if (mkv_d->index_has_durations) {
- // If there are no earlier subtitles overlapping with the
- // target cluster, then disable preroll-seeking.
- bool overlap = false;
+ // Find the earliest cluster that is not before prev_target,
+ // but contains subtitle packets overlapping with the cluster
+ // at seek_pos.
+ uint64_t target = seek_pos;
for (size_t i = 0; i < mkv_d->num_indexes; i++) {
struct mkv_index *cur = &mkv_d->indexes[i];
- overlap = cur->timecode <= index->timecode &&
- cur->timecode + cur->duration > index->timecode &&
- cur->filepos >= prev_target &&
- cur->filepos != seek_pos;
- if (overlap)
- break;
+ if (cur->timecode <= index->timecode &&
+ cur->timecode + cur->duration > index->timecode &&
+ cur->filepos >= prev_target &&
+ cur->filepos < target)
+ {
+ target = cur->filepos;
+ }
}
- if (!overlap)
- prev_target = 0;
+ prev_target = target;
}
if (prev_target)
seek_pos = prev_target;