[FFmpeg-cvslog] lavf/subtitles: seek a little more backward when necessary.

Clément Bœsch git at videolan.org
Sun Dec 2 00:19:22 CET 2012


ffmpeg | branch: master | Clément Bœsch <ubitux at gmail.com> | Fri Nov 30 07:00:59 2012 +0100| [ad5d72b1235a58442c231c3e9b8d78fc4e7b422e] | committer: Clément Bœsch

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.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ad5d72b1235a58442c231c3e9b8d78fc4e7b422e
---

 libavformat/subtitles.c |   11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/libavformat/subtitles.c b/libavformat/subtitles.c
index 290eaa0..b264ec5 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;



More information about the ffmpeg-cvslog mailing list