- From: Dave Singer <singer@apple.com>
- Date: Thu, 18 Sep 2008 17:39:05 -0700
- To: public-html@w3.org
- Cc: Ian Hickson <ian@hixie.ch>
<http://www.w3.org/html/wg/html5/#media>
We've been discussing these states with other
implementors (including Philip Jägenstedt at
Opera, for example), and we think these really
could do with some refining.
In particular, we think that
a) the state called 'network state' is actually a
mix of the state of the network and the state of
the media
b) the media state needs to be described in terms
of what can be done with the media, not what it
has in hand, as what is in hand differs between
various protocols;
c) the difference between whether play/pause is
*requested* and happening needs to be clearer:
-- in a download protocol, play can stall if data is unavailable
-- in a streaming protocol, there is an
initial buffering period in which play is
requested but time is not advancing
So, here is a brief revision, obviously derived
from the existing document but, we hope, avoiding
these issues and supporting more (we hope, all)
protocols:
Network state: documents whether the network is
being used (e.g. for a network activity indicator)
Empty: initial state, or state when there is a
failure that'll need some action to escape from
Idle: the URI is known, but the UA has no need
to use the network right now (e.g. download
resource for which 'enough' is cached, streaming
resource which is not active...)
Loading: the network is being used right now (you
can show an activity indicator)
Loaded: for a loadable resource, we've both
loaded it all and don't intend to unload it (you
could disconnect and walk away)
There is an event, Stalled, which is fired once
during Loading if data doesn't seem to be
arriving after a reasonable timeout (as now).
Media state: documents what you can do with the
media. (Each state is a superset of the one
preceding).
Empty: initial state
Metadata_loaded: enough data has been loaded
that a well-defined set of questions can now be
answered as well as they ever could be (e.g.
duration, width/height, codecs used, and so on).
Can_display (or Can_display_at_current_time;
currently called can_display_current_frame): the
UA has done all it can or intends to do for the
media resource to be displayable at the
current_time. For a downloadable resource, this
means that the current video frame (if
applicable) can be painted, at least one sample
of audio (if applicable) played, and so on. For
a streaming resource, it may mean very little
more than that if you are waiting for something
before you displayed the media element, stop
waiting: it won't get any more displayable.
Can_play: if playback were requested, the UA
expects it would be able to actually start within
a reasonable period and play a reasonable amount
(before a stall, for example). For a
downloadable protocol, that means that at least
some data ahead of current_time is available;
for a streaming protocol, that if playback was
requested, playback would start 'soon'.
Can_play_through: if playback was requested, the
UA is reasonably confident that it could play to
the end without a playback stall. (This state
might never get entered if the network bandwidth
is insufficient and the resource cannot be
cached, either because of cache limitations or
because it's a streaming service)
Play_request state: documents what has been
asked of the media. We need state+events for
this because UAs can display a play/pause
controller that the scripts cannot 'see'.
Empty: initial state
Pause_requested: the UA has been asked to pause playback
Play_requested: the UA has been asked to play
(This could probably be a single boolean if we
don't need the empty initial state).
Actual playing is reflected by the is_playing
property and the Rate_changed event.
Rate_changed gets dispatched if either of
a) is_playing changes value (between true and false)
or
b) is_playing is true and the current playback rate changes
Specifically:
a) for a streaming protocol, after a
play_request, the network connection is opened,
data is requested, some amount of de-jitter
buffer accumulated, and then is_playing changes
to true and a Rate_changed event happens
b) for a download or streaming protocol, if the
buffer runs dry while playing, is_playing changes
to false and the Rate_changed event is dispatched.
So, some examples.
Download, initially:
Network state changes from empty to loading
If auto_play was requested, the play_request state enters Play_requested
Some time later, Media state changes to
metadata_loaded, and then Can_display, and then
Can_play
As it enters Can_play or Can_play_through (UA
discretion), if Auto_play was requested,
is_playing changes to true and a Rate_changed
event happens
RTSP/RTP Streaming, initially:
If auto_play was requested, the play_request state enters Play_requested
Network state goes briefly to loading as the
server is contacted and the media setup
Media state then goes straight to Can_play or even Can_play_through
If auto_play was requested, the UA accumulates a
de-jitter buffer and then is_playing changes to
true and a Rate_changed event dispatched
On a download stall, where there is no data ahead
of current_time, is_playing spontaneously drops
to false and rate_changed is dispatched, and the
media_state drops from Can_play to Can_display.
If data arrives and the UA thinks it a good idea,
then while play_requested remains true, it can
re-start playback, setting is_playing to true and
dispatching rate_changed.
And so on.
--
David Singer
Apple/QuickTime
Received on Friday, 19 September 2008 00:41:11 UTC