On Fri, Apr 01, 2011 at 03:17:46AM +0200, Anton Khirnov wrote:
> 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
> ---
> 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){
> --
looks reasonable
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel