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

Reply via email to