From ad5d72b1235a58442c231c3e9b8d78fc4e7b422e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20B=C5=93sch?= Date: Fri, 30 Nov 2012 07:00:59 +0100 Subject: [PATCH] lavf/subtitles: seek a little more backward when necessary. If some previous subtitles are overlapping with the current time we make sure they are raised so the renderer can display them too. --- libavformat/subtitles.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/libavformat/subtitles.c b/libavformat/subtitles.c index 290eaa02aa..b264ec5e05 100644 --- a/libavformat/subtitles.c +++ b/libavformat/subtitles.c @@ -103,6 +103,7 @@ int ff_subtitles_queue_seek(FFDemuxSubtitlesQueue *q, AVFormatContext *s, int st } else { int i, idx = -1; int64_t min_ts_diff = INT64_MAX; + int64_t ts_selected; if (stream_index == -1) { AVRational time_base = s->streams[0]->time_base; ts = av_rescale_q(ts, AV_TIME_BASE_Q, time_base); @@ -124,6 +125,16 @@ int ff_subtitles_queue_seek(FFDemuxSubtitlesQueue *q, AVFormatContext *s, int st } if (idx < 0) return AVERROR(ERANGE); + /* look back in the latest subtitles for overlapping subtitles */ + ts_selected = q->subs[idx].pts; + for (i = idx - 1; i >= 0; i--) { + if (q->subs[i].duration <= 0) + continue; + if (q->subs[i].pts > ts_selected - q->subs[i].duration) + idx = i; + else + break; + } q->current_sub_idx = idx; } return 0;