diff options
-rw-r--r-- | demux/demux.c | 7 | ||||
-rw-r--r-- | demux/demux_mkv.c | 2 | ||||
-rw-r--r-- | demux/stheader.h | 2 |
3 files changed, 10 insertions, 1 deletions
diff --git a/demux/demux.c b/demux/demux.c index 019a8469c7..967b0b176f 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -1687,8 +1687,11 @@ static void adjust_seek_range_on_packet(struct demux_stream *ds, if (queue->keyframe_latest) { queue->keyframe_latest->kf_seek_pts = queue->keyframe_pts; double old_end = queue->range->seek_end; - if (queue->seek_start == MP_NOPTS_VALUE) + if (queue->seek_start == MP_NOPTS_VALUE) { queue->seek_start = queue->keyframe_pts; + if (queue->seek_start != MP_NOPTS_VALUE) + queue->seek_start += ds->sh->seek_preroll; + } if (queue->keyframe_end_pts != MP_NOPTS_VALUE) queue->seek_end = queue->keyframe_end_pts; queue->is_eof = !dp; @@ -2982,6 +2985,8 @@ static void switch_current_range(struct demux_internal *in, static struct demux_packet *find_seek_target(struct demux_queue *queue, double pts, int flags) { + pts -= queue->ds->sh->seek_preroll; + struct demux_packet *start = queue->head; for (int n = 0; n < queue->num_index; n++) { if (queue->index[n]->kf_seek_pts > pts) diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 67eb9c7af6..24279f7267 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -1836,6 +1836,8 @@ static int demux_mkv_open_audio(demuxer_t *demuxer, mkv_track_t *track) sh_a->extradata = extradata; sh_a->extradata_size = extradata_len; + sh->seek_preroll = track->codec_delay; + demux_add_sh_stream(demuxer, sh); return 0; diff --git a/demux/stheader.h b/demux/stheader.h index beca0fabf7..198f16cd49 100644 --- a/demux/stheader.h +++ b/demux/stheader.h @@ -55,6 +55,8 @@ struct sh_stream { bool missing_timestamps; + double seek_preroll; + // stream is a picture (such as album art) struct demux_packet *attached_picture; |