Re: New Matroska field: Timescale

wm4 <[email protected]> Thu, 24 Sep 2015 13:38:30 +0200
Newsgroups gmane.comp.multimedia.matroska.devel
Message-ID <20150924133830.31bc42bd@debian>
On Thu, 24 Sep 2015 11:09:48 +0200
Jerome Martinez <[email protected]> wrote:

> Le 23/09/2015 17:43, Steve Lhomme a écrit :
> > Following this week-end's VDD15 (Videolan Dev Days) we have some
> > productive talks with Dave Rice (working on the IETF specifications)
> > and a guy from YouTube on how we could improve Matroska for long term
> > storage/archival and also new features in video.
> >
> > There are a few fields that would need to be added to reach this goal.
> > I'll send an email for each (family of) field so the discussions are
> > easy to follow.
> >
> > One of the most common drawback mentioned when Matroska comes to mind
> > is the inaccurate approach for timestamps (that should not be called
> > timecodes which is something different in the video world).
> 
> It would be great to replace "timecode" by "timestamp" everywhere in the 
> documentation.
> 
> >   The proper
> > way to do it, at least for clock accurate digital sources should be
> > using a fraction format (numerator/denominator).
> >
> > See this page for own the basic math works:
> > http://matroska.org/technical/specs/notes.html#TimecodeScale
> >
> > (1233 + 564264) * 1000000 = 565497000000
> >       = 565497 ms
> >       = 565.497s
> >
> > With a numerator/denominator approach this example would become:
> > (1233 + 564264) * 1 / 1000 = 565.497s
> >
> > A NSTC movie (29.76fps) could have a better accuracy using 30000/1001
> > (or 30/1001 if you want a large range of values in your block).
> >
> > One of the drawback (and why it was not adopted in the first place) is
> > that when you mix heterogeneous sources you need to find a common
> > fraction that works for all tracks and still get enough range within
> > the 16 bits possible for a Block timecode. It was less of a problem
> > when we had TrackTimecodeScale to account for each track specifics,
> > but that element is deprecated.
> 
> Why is TrackTimecodeScale deprecated? This is actually the right method 
> from my point of view (but it is now too late for having it without 
> breaking compatibility) because a scale is per track.
> 
> >
> > If we decide to use fractions, it should be possible to keep backward
> > compatibility. The current TimecodeScale would be an approximation of
> > the fraction in nanoseconds. New players would take advantage of the
> > new fields as they are upgraded.
> 
> Nanoseconds would not resolve the main issue: it is not accurate.
> It would be more accurate than today with a timescale of 1000000:
> - at 29700/1000, first frame is at 33366700 nanoseconds
> - at 30000/1001, first frame is at 33366667 nanoseconds
> so we can detect this difference, but FFmpeg will still not put 
> 29700/1000 or 30000/1001 because Matroska does not say that this is the 
> real frame rate.
> 
> So we may need to provide the time scale with a fraction, per track, 
> without changing something else.
> With it, I think it is not necessary to use nanoseconds, and:
> - players not supporting frame rate info per track with a fraction would 
> use TimeCode field as today (33ms will stay 33ms)
> - players supporting frame rate info per track with a fraction would 
> "convert" TimeCode field to the nearest real frame rate (33ms with a 
> time scale of 1001/30000 will be converted to 33.366667ms because it is 
> the nearest "valid" value, 21ms with a timescale of 1024/48000 will be 
> converted to 21.333333ms because it is the nearest "valid" value)

It's very hard to design this in a backwards compatible and robust way.

If you define a per-track framerate to which timestamps should be
fixed, you won't support VFR. (Yes, such files exist.) Also, doesn't
default-duration already define such a per-track framerate? It works
badly, because OF COURSE some muxers  write broken framerates. In one
case, the framerate was based on a single _rounded_ frame duration,
even though the actual framerate was different (other frames had a
different frame duration).

We could store 2 timestamps per packet. But you bet there will be at
least 1 muxer which writes two completely different timestamps (one of
them broken), so users will consider a player broken, depending whether
it interprets the broken timestamp.

We could somehow store the difference between the rounded timestamp and
the real timestamp per packet - this might be somewhat more robust, as
even with broken timestamps, the difference will be at most +/- 1 ms,
but it sounds complex and messy.

And last but not least, we have to store other timestamp fields
correctly, like in the seek index, chapter index, etc.
_______________________________________________
Matroska-devel mailing list
[email protected]
http://lists.matroska.org/cgi-bin/mailman/listinfo/matroska-devel
Read Matroska-Devel on GMane: http://dir.gmane.org/gmane.comp.multimedia.matroska.devel