aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2011-04-01 03:02:02 +0200
committerAnton Khirnov <anton@khirnov.net>2011-04-01 19:53:55 +0200
commitab11317c1f97db19eddebe1bc5d4cb5a53718c9f (patch)
tree95a3cb482de100573925dc0cc374b19ef16518f3
parent0e635f3e86956bd85896831f3c7e6dfaef97bf7d (diff)
downloadffmpeg-ab11317c1f97db19eddebe1bc5d4cb5a53718c9f.tar.gz
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
-rw-r--r--libavformat/utils.c27
1 files changed, 14 insertions, 13 deletions
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+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){