diff --git a/libavformat/utils.c b/libavformat/utils.c index 7ece0787f3..ca0bf7ec05 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+1nb_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; - 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); - } + 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; + } } static int get_std_framerate(int i){