On Mon, 24 Jan 2011 21:10:21 +0100, Robert O'Callahan
<rob...@ocallahan.org> wrote:
On Mon, Jan 24, 2011 at 11:32 PM, Philip Jägenstedt
<phil...@opera.com>wrote:
On Mon, 24 Jan 2011 02:36:15 +0100, Robert O'Callahan <
rob...@ocallahan.org> wrote:
Interop problems are going to arise with approximate seeking no matter
what
we do, which is why it shouldn't be the default.
OK, let's go with that, then.
Yay! :-)
You don't want seekApproximate(T) to always land on the same T'. For
example, if a player wants to "seek forward approximately N seconds"
via
seekApproximate(currentTime + N), but the approximation to currentTime
+ N
is fixed to be some T' less than or equal to currentTime, that would be
broken.
I would say that seekApproximate(T) should be specified to aim as
close as
possible to T while being "fast", but the only guarantee is that it
seeks
somewhere after currentTime if T > currentTime, or somewhere before
currentTime if T < currentTime.
1. There's a race condition here, seekApproximate(currentTime+0.001)
will
be quite random since currentTime changes while the script is running.
Interesting. It doesn't in Firefox; script always sees a snapshot of a
consistent state until it returns to the event loop or does something
modal
(although audio, and soon video, will continue to play while script
runs).
I'm not sure if the spec should require that ... overall our APIs try
pretty
hard not to expose races to JS.
How does that work? Do you take a copy of all properties that could
possibly change during script execution, including ones that create a new
object, like buffered and seekable? If you instead only make a copy on the
first read, isn't it still possible to get an inconsistent state, e.g.
where currentTime isn't in the buffered ranges?
How about HTMLImageElement.complete, which the spec explicitly says can
change during script execution?
In any case, it sounds like either HTMLMediaElement is underspecified or
one of us has interpreted in incorrectly, some interop on this point would
be nice.
But maybe you want seekApproximateRelative(deltaT) then...
2. No media framework I've worked with seems to provide fast seeking with
any guarantee of direction, so it might be hard to actually implement
this
way on many platforms, while fast seeking in general is very easy.
Perhaps you could implement it as "seek fast to T + deltaT, then if that
didn't land us on the right side of currentTime (hopefully rare), do an
exact seek to T + deltaT"?
If approximate seeking can't be used to reliably implement "go
forward/back
a bit", then it'll be significantly less useful IMHO.
The biggest use case is clicking a seek bar and ending up somewhere close
enough, but yes, being able to do fast relative seeking is a nice bonus.
Maybe we should do what many media frameworks do and use a "reference"
parameter, defining what the seek is relative to. Usually you can seek
relative to the beginning, end and current position, but perhaps we could
reduce that to just "absolute" and "relative". That's a bit less magic
than inspecting currentTime when the method is called.
So far:
seek(t, ref, how);
ref is "absolute" (default) or "relative"
how is "accurate" (default) or "fast"
(or numeric enums, if that's what DOM interfaces usually have)
--
Philip Jägenstedt
Core Developer
Opera Software