- From: Ian Hickson <ian@hixie.ch>
- Date: Tue, 18 Dec 2012 00:01:50 +0000 (UTC)
- To: Jer Noble <jer.noble@apple.com>
- Cc: whatwg@whatwg.org
On Tue, 2 Oct 2012, Jer Noble wrote: > On Sep 17, 2012, at 12:43 PM, Ian Hickson <ian@hixie.ch> wrote: > > On Mon, 9 Jul 2012, adam k wrote: > >> > >> i'm aware that crooked framerates (i.e. the notorious 29.97) were not > >> supported when frame accuracy was implemented. in my tests, 29.97DF > >> timecodes were incorrect by 1 to 3 frames at any given point. > >> > >> will there ever be support for crooked framerate accuracy? i would > >> be more than happy to contribute whatever i can to help test it and > >> make it possible. can someone comment on this? > > > > This is a Quality of Implementation issue, basically. I believe > > there's nothing inherently in the API that would make accuracy to such > > timecodes impossible. > > The nature of floating point math makes precise frame navigation > difficult, if not impossible. Rob's test is especially hairy, given > that each frame has a timing bound of [startTime, endTime), and his test > attempts to navigate directly to the startTime of a given frame, a value > which gives approximately zero room for error. > > I'm most familiar with MPEG containers, but I believe the following is > also true of the WebM container: times are represented by a rational > number, timeValue / timeScale, where both numerator and denominator are > unsigned integers. To seek to a particular media time, we must convert > a floating-point time value into this rational time format (e.g. when > calculating the 4th frame's start time, from "3 * 1/29.97" to "3 * > 1001/30000"). If there is a floating-point error in the wrong direction > (e.g., as above, a numerator of 3002 vs 3003), the end result will not > be the frame's startTime, but one timeScale before it. > > We've fixed some frame accuracy bugs in WebKit (and Chromium) by > carefully rounding the incoming floating point time value, taking into > account the media's time scale, and rounding to the nearest 1/timeScale > value. This fixes Rob's precision test, but at the expense of > precision. (I.e. in a 30 fps movie, "currentTime = 0.999999 / 30" will > navigate to the second frame, not the first, due to rounding, which is > technically incorrect.) > > This is a common problem, and Apple media frameworks (for example) > therefore provide rational time classes which provide enough accuracy > for precise navigation (e.g. QTTime, CMTime). Using a floating point > number to represent time with any precision is not generally accepted as > good practice when these rational time classes are available. That makes sense. Should we add a preciseSeek() method with two arguments that does a seek using the given rational time? -- Ian Hickson U+1047E )\._.,--....,'``. fL http://ln.hixie.ch/ U+263A /, _.. \ _\ ;`._ ,. Things that are impossible just take longer. `._.-(,_..'--(,_..'`-.;.'
Received on Tuesday, 18 December 2012 00:02:14 UTC