[FFmpeg-cvslog] lavf: make compute_chapters_end less picky.

Anton Khirnov git at videolan.org
Sat Apr 2 02:02:21 CEST 2011


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Fri Apr  1 03:02:02 2011 +0200| [ab11317c1f97db19eddebe1bc5d4cb5a53718c9f] | committer: Anton Khirnov

lavf: make compute_chapters_end less picky.

In particular, now it assumes that
a) chapters are chronologically ordered
b) chapters have the same timebases
c) duration of the stream is known
and asserts if any of these is not met.

Make it properly deal with harsher conditions.

fixes issue2320

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

 libavformat/utils.c |   27 ++++++++++++++-------------
 1 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/libavformat/utils.c b/libavformat/utils.c
index 7ece078..ca0bf7e 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2168,22 +2168,23 @@ enum CodecID av_codec_get_id(const AVCodecTag * const *tags, unsigned int tag)
 
 static void compute_chapters_end(AVFormatContext *s)
 {
-    unsigned int i;
+    unsigned int i, j;
+    int64_t max_time = s->duration + (s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time;
 
-    for (i=0; i+1<s->nb_chapters; i++)
+    for (i = 0; i < s->nb_chapters; i++)
         if (s->chapters[i]->end == AV_NOPTS_VALUE) {
-            assert(s->chapters[i]->start <= s->chapters[i+1]->start);
-            assert(!av_cmp_q(s->chapters[i]->time_base, s->chapters[i+1]->time_base));
-            s->chapters[i]->end = s->chapters[i+1]->start;
+            AVChapter *ch = s->chapters[i];
+            int64_t   end = max_time ? av_rescale_q(max_time, AV_TIME_BASE_Q, ch->time_base)
+                                     : INT64_MAX;
+
+            for (j = 0; j < s->nb_chapters; j++) {
+                AVChapter *ch1 = s->chapters[j];
+                int64_t next_start = av_rescale_q(ch1->start, ch1->time_base, ch->time_base);
+                if (j != i && next_start > ch->start && next_start < end)
+                    end = next_start;
+            }
+            ch->end = (end == INT64_MAX) ? ch->start : end;
         }
-
-    if (s->nb_chapters && s->chapters[i]->end == AV_NOPTS_VALUE) {
-        assert(s->start_time != AV_NOPTS_VALUE);
-        assert(s->duration > 0);
-        s->chapters[i]->end = av_rescale_q(s->start_time + s->duration,
-                                           AV_TIME_BASE_Q,
-                                           s->chapters[i]->time_base);
-    }
 }
 
 static int get_std_framerate(int i){



More information about the ffmpeg-cvslog mailing list