[FFmpeg-devel] [PATCH] lavf/utils: update stream duration only if it is not set or 0

Matthieu Bouron matthieu.bouron at gmail.com
Tue Jul 4 18:40:06 EEST 2017


On Tue, Jul 04, 2017 at 05:24:45PM +0200, Matthieu Bouron wrote:
> On Tue, Jul 04, 2017 at 12:31:59PM +0200, Michael Niedermayer wrote:
> > On Mon, Jul 03, 2017 at 02:02:24PM +0200, Matthieu Bouron wrote:
> > > ---
> > > 
> > > The following patch makes lavf/utils only update stream duration only if it is
> > > not set or 0 in fill_all_stream_timings (which is called by
> > > avformat_find_stream_info).
> > > 
> > > In the context of mov demuxing, the patch makes the last packet duration the
> > > same as the one declared in the stts table for example (ie: we trust what the
> > > demuxer reports).
> > > 
> > > The patch passes fate, however it might not be valid but I would like to
> > > understand what is the purpose / use-case of the update_stream_timing /
> > > fill_all_stream_timings functions which are not too well documented.
> > 
> > I think these functions were mostly for filling in values that
> > have not been set otherwise
> > as in stream timings <-> file timings, that way demuxers can just
> > export what is stored in a file and teh rest is set from that
> > 
> > 
> > > 
> > > Thanks.
> > > 
> > > ---
> > >  libavformat/utils.c | 3 ++-
> > >  1 file changed, 2 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/libavformat/utils.c b/libavformat/utils.c
> > > index 38d247c6cd..00adf026e6 100644
> > > --- a/libavformat/utils.c
> > > +++ b/libavformat/utils.c
> > > @@ -2654,7 +2654,8 @@ static void fill_all_stream_timings(AVFormatContext *ic)
> > >              if (ic->start_time != AV_NOPTS_VALUE)
> > >                  st->start_time = av_rescale_q(ic->start_time, AV_TIME_BASE_Q,
> > >                                                st->time_base);
> > > -            if (ic->duration != AV_NOPTS_VALUE)
> > > +            if (ic->duration != AV_NOPTS_VALUE &&
> > > +                (st->duration == 0 || st->duration == AV_NOPTS_VALUE))
> > >                  st->duration = av_rescale_q(ic->duration, AV_TIME_BASE_Q,
> > >                                              st->time_base);
> > >          }
> > 
> > can a inconsistency occur from setting start_time and duration from
> > different sources ?
> 
> Probably. Maybe the patch should *not* update the timings if both
> start_time and duration are already set ?

Nevermind, we only enter this block of code if st->start_time ==
AV_NOPTS_VALUE.

> 
> -- 
> Matthieu B.

-- 
Matthieu B.


More information about the ffmpeg-devel mailing list