Please check the errata for any errors or issues reported since publication.
Copyright
©
2020
2018
W3C
®
(
MIT
,
ERCIM
,
Keio
,
Beihang
).
W3C
liability
,
trademark
and
permissive
document
license
rules
apply.
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at https://www.w3.org/TR/.
The
working
group
maintains
a
list
of
all
bug
reports
that
the
editors
have
not
yet
tried
to
address
.
Implementors
should
be
aware
that
New
features
for
this
specification
is
not
stable.
Implementors
who
are
not
taking
part
expected
to
be
incubated
in
the
discussions
are
likely
to
find
Web
Platform
Incubator
Community
Group
.
One
editorial
issue
(
removing
the
specification
changing
out
from
under
them
in
incompatible
ways.
Vendors
interested
exposure
of
createObjectURL(mediaSource)
in
implementing
workers
)
was
addressed
since
the
previous
publication.
For
the
list
of
changes
done
since
the
previous
version,
see
the
commits
.
By
publishing
this
specification
before
it
eventually
reaches
Recommendation,
W3C
expects
the
Candidate
functionality
specified
in
this
Recommendation
stage
should
will
not
be
affected
by
changes
to
File
API.
The
Working
Group
will
continue
to
track
the
GitHub
repository
and
take
part
in
the
discussions.
these
specifications.
This document was published by the HTML Media Extensions Working Group as an Editor's Draft. Comments regarding this document are welcome. Please send them to public-html-media@w3.org ( subscribe , archives ).
Please see the Working Group's implementation report .
Publication as an Editor's Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
This
document
was
produced
by
a
group
operating
under
the
1
August
2017
W3C
Patent
Policy
.
W3C
maintains
a
public
list
of
any
patent
disclosures
made
in
connection
with
the
deliverables
of
the
group;
that
page
also
includes
instructions
for
disclosing
a
patent.
An
individual
who
has
actual
knowledge
of
a
patent
which
the
individual
believes
contains
Essential
Claim(s)
must
disclose
the
information
in
accordance
with
section
6
of
the
W3C
Patent
Policy
.
This
document
is
governed
by
the
15
September
2020
1
February
2018
W3C
Process
Document
.
This
specification
extends
HTMLMediaElement
[
HTML
HTML51
]
to
allow
JavaScript
to
generate
media
streams
for
playback.
Allowing
JavaScript
to
generate
streams
facilitates
a
variety
of
use
cases
like
adaptive
streaming
and
time
shifting
live
streams.
This version of the specification is intended for incubating a new codec switching feature, as outlined in the Codec Switching Explainer .
This section is non-normative.
This
specification
allows
JavaScript
to
dynamically
construct
media
streams
for
<audio>
and
<video>.
It
defines
a
MediaSource
object
that
can
serve
as
a
source
of
media
data
for
an
HTMLMediaElement.
MediaSource
objects
have
one
or
more
SourceBuffer
objects.
Applications
append
data
segments
to
the
SourceBuffer
objects,
and
can
adapt
the
quality
of
appended
data
based
on
system
performance
and
other
factors.
Data
from
the
SourceBuffer
objects
is
managed
as
track
buffers
for
audio,
video
and
text
data
that
is
decoded
and
played.
Byte
stream
specifications
used
with
these
extensions
are
available
in
the
byte
stream
format
registry
[
MSE-REGISTRY
].
This specification was designed with the following goals in mind:
This specification defines:
The
track
buffers
that
provide
coded
frames
for
the
enabled
audioTracks
,
the
selected
videoTracks
,
and
the
"showing"
or
"hidden"
textTracks
.
All
these
tracks
are
associated
with
SourceBuffer
objects
in
the
activeSourceBuffers
list.
A
presentation
timestamp
range
used
to
filter
out
coded
frames
while
appending.
The
append
window
represents
a
single
continuous
time
range
with
a
single
start
time
and
end
time.
Coded
frames
with
presentation
timestamp
within
this
range
are
allowed
to
be
appended
to
the
SourceBuffer
while
coded
frames
outside
this
range
are
filtered
out.
The
append
window
start
and
end
times
are
controlled
by
the
appendWindowStart
and
appendWindowEnd
attributes
respectively.
A unit of media data that has a presentation timestamp , a decode timestamp , and a coded frame duration .
The duration of a coded frame . For video and text, the duration indicates how long the video frame or text SHOULD be displayed. For audio, the duration represents the sum of all the samples contained within the coded frame. For example, if an audio frame contained 441 samples @44100Hz the frame duration would be 10 milliseconds.
The sum of a coded frame presentation timestamp and its coded frame duration . It represents the presentation timestamp that immediately follows the coded frame.
A
group
of
coded
frames
that
are
adjacent
and
have
monotonically
increasing
decode
timestamps
without
any
gaps.
Discontinuities
detected
by
the
coded
frame
processing
algorithm
and
abort()
calls
trigger
the
start
of
a
new
coded
frame
group.
The decode timestamp indicates the latest time at which the frame needs to be decoded assuming instantaneous decoding and rendering of this and any dependant frames (this is equal to the presentation timestamp of the earliest frame, in presentation order , that is dependant on this frame). If frames can be decoded out of presentation order , then the decode timestamp MUST be present in or derivable from the byte stream. The user agent MUST run the append error algorithm if this is not the case. If frames cannot be decoded out of presentation order and a decode timestamp is not present in the byte stream, then the decode timestamp is equal to the presentation timestamp .
A sequence of bytes that contain all of the initialization information required to decode a sequence of media segments . This includes codec initialization data, Track ID mappings for multiplexed segments, and timestamp offsets (e.g., edit lists).
The byte stream format specifications in the byte stream format registry [ MSE-REGISTRY ] contain format specific examples.
A sequence of bytes that contain packetized & timestamped media data for a portion of the media timeline . Media segments are always associated with the most recently appended initialization segment .
The byte stream format specifications in the byte stream format registry [ MSE-REGISTRY ] contain format specific examples.
A
MediaSource
object
URL
is
a
unique
Blob
URI
[
FILE-API
]
created
by
createObjectURL()
.
It
is
used
to
attach
a
MediaSource
object
to
an
HTMLMediaElement.
These
URLs
are
the
same
as
a
Blob
URI
,
except
that
anything
in
the
definition
of
that
feature
that
refers
to
File
and
Blob
objects
is
hereby
extended
to
also
apply
to
MediaSource
objects.
The
origin
of
the
MediaSource
object
URL
is
the
relevant
settings
object
of
this
during
the
call
to
createObjectURL()
.
For example, the origin of the MediaSource object URL affects the way that the media element is consumed by canvas .
The
parent
media
source
of
a
SourceBuffer
object
is
the
MediaSource
object
that
created
it.
The presentation start time is the earliest time point in the presentation and specifies the initial playback position and earliest possible position . All presentations created using this specification have a presentation start time of 0.
For
the
purposes
of
determining
if
HTMLMediaElement.buffered
contains
a
TimeRange
that
includes
the
current
playback
position,
implementations
MAY
choose
to
allow
a
current
playback
position
at
or
after
presentation
start
time
and
before
the
first
TimeRange
to
play
the
first
TimeRange
if
that
TimeRange
starts
within
a
reasonably
short
time,
like
1
second,
after
presentation
start
time
.
This
allowance
accommodates
the
reality
that
muxed
streams
commonly
do
not
begin
all
tracks
precisely
at
presentation
start
time
.
Implementations
MUST
report
the
actual
buffered
range,
regardless
of
this
allowance.
The presentation interval of a coded frame is the time interval from its presentation timestamp to the presentation timestamp plus the coded frame's duration . For example, if a coded frame has a presentation timestamp of 10 seconds and a coded frame duration of 100 milliseconds, then the presentation interval would be [10-10.1). Note that the start of the range is inclusive, but the end of the range is exclusive.
The order that coded frames are rendered in the presentation. The presentation order is achieved by ordering coded frames in monotonically increasing order by their presentation timestamps .
A reference to a specific time in the presentation. The presentation timestamp in a coded frame indicates when the frame SHOULD be rendered.
A position in a media segment where decoding and continuous playback can begin without relying on any previous data in the segment. For video this tends to be the location of I-frames. In the case of audio, most audio frames can be treated as a random access point. Since video tracks tend to have a more sparse distribution of random access points, the location of these points are usually considered the random access points for multiplexed streams.
The
specific
byte
stream
format
specification
that
describes
the
format
of
the
byte
stream
accepted
by
a
SourceBuffer
instance.
The
byte
stream
format
specification
,
for
a
SourceBuffer
object,
is
initially
selected
based
on
the
type
passed
to
the
addSourceBuffer()
call
that
created
the
object,
and
can
be
updated
by
changeType()
calls
on
the
object.
A
specific
set
of
tracks
distributed
across
one
or
more
SourceBuffer
objects
owned
by
a
single
MediaSource
instance.
Implementations
MUST
support
at
least
1
MediaSource
object
with
the
following
configurations:
MediaSource objects MUST support each of the configurations above, but they are only required to support one configuration at a time. Supporting multiple configurations at once or additional configurations is a quality of implementation issue.
A byte stream format specific structure that provides the Track ID , codec configuration, and other metadata for a single track. Each track description inside a single initialization segment has a unique Track ID . The user agent MUST run the append error algorithm if the Track ID is not unique within the initialization segment .
A Track ID is a byte stream format specific identifier that marks sections of the byte stream as being part of a specific track. The Track ID in a track description identifies which sections of a media segment belong to that track.
The
MediaSource
object
represents
a
source
of
media
data
for
an
HTMLMediaElement.
It
keeps
track
of
the
readyState
for
this
source
as
well
as
a
list
of
SourceBuffer
objects
that
can
be
used
to
add
media
data
to
the
presentation.
MediaSource
objects
are
created
by
the
web
application
and
then
attached
to
an
HTMLMediaElement.
The
application
uses
the
SourceBuffer
objects
in
sourceBuffers
to
add
media
data
to
this
source.
The
HTMLMediaElement
fetches
this
media
data
from
the
MediaSource
object
when
it
is
needed
during
playback.
Each
MediaSource
object
has
a
live
seekable
range
variable
that
stores
a
normalized
TimeRanges
object
.
This
variable
is
initialized
to
an
empty
TimeRanges
object
when
the
MediaSource
object
is
created,
is
maintained
by
setLiveSeekableRange()
and
clearLiveSeekableRange()
,
and
is
used
in
HTMLMediaElement
Extensions
to
modify
HTMLMediaElement.seekable
behavior.
enum ReadyState {
"closed",
"open",
"ended"
};
Enumeration description | |
---|---|
closed
| Indicates the source is not currently attached to a media element. |
open
|
The
source
has
been
opened
by
a
media
element
and
is
ready
for
data
to
be
appended
to
the
SourceBuffer
objects
in
sourceBuffers
.
|
ended
|
The
source
is
still
attached
to
a
media
element,
but
endOfStream()
has
been
called.
|
Enumeration description | |
---|---|
network
|
Terminates playback and signals that a network error has occured.
Note
JavaScript applications SHOULD use this status code to terminate playback with a network error. For example, if a network error occurs while fetching media data. |
decode
|
Terminates playback and signals that a decoding error has occured.
Note
JavaScript applications SHOULD use this status code to terminate playback with a decode error. For example, if a parsing error occurs while processing out-of-band media data. |
[Constructor]
interface MediaSource : EventTarget {
readonly attribute SourceBufferList
sourceBuffers
; readonly attribute SourceBufferList
activeSourceBuffers
; readonly attribute ReadyState readyState
; attribute unrestricted double
duration
; attribute EventHandler
onsourceopen
; attribute EventHandler
onsourceended
; attribute EventHandler
onsourceclose
; SourceBuffer
addSourceBuffer
(DOMString
type); void
removeSourceBuffer
(SourceBuffer
sourceBuffer); void
endOfStream
(optional EndOfStreamError
error); void
setLiveSeekableRange
(double
start, double
end); void
clearLiveSeekableRange
(); static boolean
isTypeSupported
(DOMString
type);
};
sourceBuffers
of
type
SourceBufferList
,
readonly
SourceBuffer
objects
associated
with
this
MediaSource
.
When
readyState
equals
"closed"
this
list
will
be
empty.
Once
readyState
transitions
to
"open"
SourceBuffer
objects
can
be
added
to
this
list
by
using
addSourceBuffer()
.
activeSourceBuffers
of
type
SourceBufferList
,
readonly
Contains
the
subset
of
sourceBuffers
that
are
providing
the
selected
video
track
,
the
enabled
audio
track(s)
,
and
the
"showing"
or
"hidden"
text
track(s).
SourceBuffer
objects
in
this
list
MUST
appear
in
the
same
order
as
they
appear
in
the
sourceBuffers
attribute;
e.g.,
if
only
sourceBuffers[0]
and
sourceBuffers[3]
are
in
activeSourceBuffers
,
then
activeSourceBuffers[0]
MUST
equal
sourceBuffers[0]
and
activeSourceBuffers[1]
MUST
equal
sourceBuffers[3].
The Changes to selected/enabled track state section describes how this attribute gets updated.
readyState
of
type
ReadyState
Indicates
the
current
state
of
the
MediaSource
object.
When
the
MediaSource
is
created
readyState
MUST
be
set
to
"closed"
.
duration
of
type
unrestricted
double
Allows
the
web
application
to
set
the
presentation
duration.
The
duration
is
initially
set
to
NaN
when
the
MediaSource
object
is
created.
On getting, run the following steps:
readyState
attribute
is
"closed"
then
return
NaN
and
abort
these
steps.
On setting, run the following steps:
TypeError
exception
and
abort
these
steps.
readyState
attribute
is
not
"open"
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
updating
attribute
equals
true
on
any
SourceBuffer
in
sourceBuffers
,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
The duration change algorithm will adjust new duration higher if there is any currently buffered coded frame with a higher end time.
appendBuffer()
and
endOfStream()
can
update
the
duration
under
certain
circumstances.
onsourceopen
of
type
EventHandler
The
event
handler
for
the
sourceopen
event.
onsourceended
of
type
EventHandler
The
event
handler
for
the
sourceended
event.
onsourceclose
of
type
EventHandler
The
event
handler
for
the
sourceclose
event.
addSourceBuffer
Adds
a
new
SourceBuffer
to
sourceBuffers
.
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
type |
DOMString
| ✘ | ✘ |
SourceBuffer
When this method is invoked, the user agent must run the following steps:
TypeError
exception
and
abort
these
steps.
SourceBuffer
objects
in
sourceBuffers
,
then
throw
a
NotSupportedError
exception
and
abort
these
steps.
QuotaExceededError
exception
and
abort
these
steps.
For
example,
a
user
agent
MAY
throw
a
QuotaExceededError
exception
if
the
media
element
has
reached
the
HAVE_METADATA
readyState.
This
can
occur
if
the
user
agent's
media
engine
does
not
support
adding
more
tracks
during
playback.
readyState
attribute
is
not
in
the
"open"
state
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
SourceBuffer
object
and
associated
resources.
mode
attribute
on
the
new
object
to
"sequence"
.
mode
attribute
on
the
new
object
to
"segments"
.
sourceBuffers
and
queue
a
task
to
fire
a
simple
event
named
addsourcebuffer
at
sourceBuffers
.
removeSourceBuffer
Removes
a
SourceBuffer
from
sourceBuffers
.
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
sourceBuffer |
SourceBuffer
| ✘ | ✘ |
void
When this method is invoked, the user agent must run the following steps:
sourceBuffers
then
throw
a
NotFoundError
exception
and
abort
these
steps.
updating
attribute
equals
true,
then
run
the
following
steps:
updating
attribute
to
false.
abort
at
sourceBuffer
.
updateend
at
sourceBuffer
.
AudioTrackList
object
returned
by
sourceBuffer
.
audioTracks
.
AudioTrackList
object
returned
by
the
audioTracks
attribute
on
the
HTMLMediaElement.
AudioTrack
object
in
the
SourceBuffer
audioTracks
list
,
run
the
following
steps:
sourceBuffer
attribute
on
the
AudioTrack
object
to
null.
AudioTrack
object
from
the
HTMLMediaElement
audioTracks
list
.
This
should
trigger
AudioTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
trusted
event
named
removetrack
,
that
does
not
bubble
and
is
not
cancelable,
and
that
uses
the
TrackEvent
interface,
with
the
track
attribute
initialized
to
the
AudioTrack
object,
at
the
HTMLMediaElement
audioTracks
list
.
If
the
enabled
attribute
on
the
AudioTrack
object
was
true
at
the
beginning
of
this
removal
step,
then
this
should
also
trigger
AudioTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
simple
event
named
change
at
the
HTMLMediaElement
audioTracks
list
AudioTrack
object
from
the
SourceBuffer
audioTracks
list
.
This
should
trigger
AudioTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
trusted
event
named
removetrack
,
that
does
not
bubble
and
is
not
cancelable,
and
that
uses
the
TrackEvent
interface,
with
the
track
attribute
initialized
to
the
AudioTrack
object,
at
the
SourceBuffer
audioTracks
list
.
If
the
enabled
attribute
on
the
AudioTrack
object
was
true
at
the
beginning
of
this
removal
step,
then
this
should
also
trigger
AudioTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
simple
event
named
change
at
the
SourceBuffer
audioTracks
list
VideoTrackList
object
returned
by
sourceBuffer
.
videoTracks
.
VideoTrackList
object
returned
by
the
videoTracks
attribute
on
the
HTMLMediaElement.
VideoTrack
object
in
the
SourceBuffer
videoTracks
list
,
run
the
following
steps:
sourceBuffer
attribute
on
the
VideoTrack
object
to
null.
VideoTrack
object
from
the
HTMLMediaElement
videoTracks
list
.
This
should
trigger
VideoTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
trusted
event
named
removetrack
,
that
does
not
bubble
and
is
not
cancelable,
and
that
uses
the
TrackEvent
interface,
with
the
track
attribute
initialized
to
the
VideoTrack
object,
at
the
HTMLMediaElement
videoTracks
list
.
If
the
selected
attribute
on
the
VideoTrack
object
was
true
at
the
beginning
of
this
removal
step,
then
this
should
also
trigger
VideoTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
simple
event
named
change
at
the
HTMLMediaElement
videoTracks
list
VideoTrack
object
from
the
SourceBuffer
videoTracks
list
.
This
should
trigger
VideoTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
trusted
event
named
removetrack
,
that
does
not
bubble
and
is
not
cancelable,
and
that
uses
the
TrackEvent
interface,
with
the
track
attribute
initialized
to
the
VideoTrack
object,
at
the
SourceBuffer
videoTracks
list
.
If
the
selected
attribute
on
the
VideoTrack
object
was
true
at
the
beginning
of
this
removal
step,
then
this
should
also
trigger
VideoTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
simple
event
named
change
at
the
SourceBuffer
videoTracks
list
TextTrackList
object
returned
by
sourceBuffer
.
textTracks
.
TextTrackList
object
returned
by
the
textTracks
attribute
on
the
HTMLMediaElement.
TextTrack
object
in
the
SourceBuffer
textTracks
list
,
run
the
following
steps:
sourceBuffer
attribute
on
the
TextTrack
object
to
null.
TextTrack
object
from
the
HTMLMediaElement
textTracks
list
.
This
should
trigger
TextTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
trusted
event
named
removetrack
,
that
does
not
bubble
and
is
not
cancelable,
and
that
uses
the
TrackEvent
interface,
with
the
track
attribute
initialized
to
the
TextTrack
object,
at
the
HTMLMediaElement
textTracks
list
.
If
the
mode
attribute
on
the
TextTrack
object
was
"showing"
or
"hidden"
at
the
beginning
of
this
removal
step,
then
this
should
also
trigger
TextTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
simple
event
named
change
at
the
HTMLMediaElement
textTracks
list
.
TextTrack
object
from
the
SourceBuffer
textTracks
list
.
This
should
trigger
TextTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
trusted
event
named
removetrack
,
that
does
not
bubble
and
is
not
cancelable,
and
that
uses
the
TrackEvent
interface,
with
the
track
attribute
initialized
to
the
TextTrack
object,
at
the
SourceBuffer
textTracks
list
.
If
the
mode
attribute
on
the
TextTrack
object
was
"showing"
or
"hidden"
at
the
beginning
of
this
removal
step,
then
this
should
also
trigger
TextTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
simple
event
named
change
at
the
SourceBuffer
textTracks
list
.
activeSourceBuffers
,
then
remove
sourceBuffer
from
activeSourceBuffers
and
queue
a
task
to
fire
a
simple
event
named
removesourcebuffer
at
the
SourceBufferList
returned
by
activeSourceBuffers
.
sourceBuffers
and
queue
a
task
to
fire
a
simple
event
named
removesourcebuffer
at
the
SourceBufferList
returned
by
sourceBuffers
.
endOfStream
Signals the end of the stream.
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
error |
EndOfStreamError
| ✘ | ✔ |
void
When this method is invoked, the user agent must run the following steps:
readyState
attribute
is
not
in
the
"open"
state
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
updating
attribute
equals
true
on
any
SourceBuffer
in
sourceBuffers
,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
setLiveSeekableRange
Updates
the
live
seekable
range
variable
used
in
HTMLMediaElement
Extensions
to
modify
HTMLMediaElement.seekable
behavior.
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
start |
double
|
✘ | ✘ |
The
start
of
the
range,
in
seconds
measured
from
presentation
start
time
.
While
set,
and
if
duration
equals
positive
Infinity,
HTMLMediaElement.seekable
will
return
a
non-empty
TimeRanges
object
with
a
lowest
range
start
timestamp
no
greater
than
start
.
|
end |
double
|
✘ | ✘ |
The
end
of
range,
in
seconds
measured
from
presentation
start
time
.
While
set,
and
if
duration
equals
positive
Infinity,
HTMLMediaElement.seekable
will
return
a
non-empty
TimeRanges
object
with
a
highest
range
end
timestamp
no
less
than
end
.
|
void
When this method is invoked, the user agent must run the following steps:
readyState
attribute
is
not
"open"
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
TypeError
exception
and
abort
these
steps.
clearLiveSeekableRange
Updates
the
live
seekable
range
variable
used
in
HTMLMediaElement
Extensions
to
modify
HTMLMediaElement.seekable
behavior.
void
When this method is invoked, the user agent must run the following steps:
readyState
attribute
is
not
"open"
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
TimeRanges
object.
isTypeSupported
,
static
Check
to
see
whether
the
MediaSource
is
capable
of
creating
SourceBuffer
objects
for
the
specified
MIME
type.
If
true
is
returned
from
this
method,
it
only
indicates
that
the
MediaSource
implementation
is
capable
of
creating
SourceBuffer
objects
for
the
specified
MIME
type.
An
addSourceBuffer()
call
SHOULD
still
fail
if
sufficient
resources
are
not
available
to
support
the
addition
of
a
new
SourceBuffer
.
This
method
returning
true
implies
that
HTMLMediaElement.canPlayType()
will
return
"maybe"
or
"probably"
since
it
does
not
make
sense
for
a
MediaSource
to
support
a
type
the
HTMLMediaElement
knows
it
cannot
play.
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
type |
DOMString
| ✘ | ✘ |
boolean
When this method is invoked, the user agent must run the following steps:
Event name | Interface | Dispatched when... |
---|---|---|
sourceopen
|
Event
|
readyState
transitions
from
"closed"
to
"open"
or
from
"ended"
to
"open"
.
|
sourceended
|
Event
|
readyState
transitions
from
"open"
to
"ended"
.
|
sourceclose
|
Event
|
readyState
transitions
from
"open"
to
"closed"
or
"ended"
to
"closed"
.
|
A
MediaSource
object
can
be
attached
to
a
media
element
by
assigning
a
MediaSource
object
URL
to
the
media
element
src
attribute
or
the
src
attribute
of
a
<source>
inside
a
media
element.
A
MediaSource
object
URL
is
created
by
passing
a
MediaSource
object
to
createObjectURL()
.
If the resource fetch algorithm was invoked with a media provider object that is a MediaSource object or a URL record whose object is a MediaSource object, then let mode be local, skip the first step in the resource fetch algorithm (which may otherwise set mode to remote) and add the steps and clarifications below to the " Otherwise (mode is local) " section of the resource fetch algorithm .
The
resource
fetch
algorithm
's
first
step
is
expected
to
eventually
align
with
selecting
local
mode
for
URL
records
whose
objects
are
media
provider
objects.
The
intent
is
that
if
the
HTMLMediaElement's
src
attribute
or
selected
child
<source>
's
src
attribute
is
a
blob:
URL
matching
a
MediaSource
object
URL
when
the
respective
src
attribute
was
last
changed,
then
that
MediaSource
object
is
used
as
the
media
provider
object
and
current
media
resource
in
the
local
mode
logic
in
the
resource
fetch
algorithm
.
This
also
means
that
the
remote
mode
logic
that
includes
observance
of
any
preload
attribute
is
skipped
when
a
MediaSource
object
is
attached.
Even
with
that
eventual
change
to
[
HTML
HTML51
],
the
execution
of
the
following
steps
at
the
beginning
of
the
local
mode
logic
is
still
required
when
the
current
media
resource
is
a
MediaSource
object.
Relative to the action which triggered the media element's resource selection algorithm, these steps are asynchronous. The resource fetch algorithm is run after the task that invoked the resource selection algorithm is allowed to continue and a stable state is reached. Implementations may delay the steps in the " Otherwise " clause, below, until the MediaSource object is ready for use.
readyState
is
NOT
set
to
"closed"
readyState
attribute
to
"open"
.
sourceopen
at
the
MediaSource
.
appendBuffer()
.
MediaSource
is
attached.
An
attached
MediaSource
does
not
use
the
remote
mode
steps
in
the
resource
fetch
algorithm
,
so
the
media
element
will
not
fire
"suspend"
events.
Though
future
versions
of
this
specification
will
likely
remove
"progress"
and
"stalled"
events
from
a
media
element
with
an
attached
MediaSource,
user
agents
conforming
to
this
version
of
the
specification
may
still
fire
these
two
events
as
these
[
HTML
HTML51
]
references
changed
after
implementations
of
this
specification
stabilized.
The following steps are run in any case where the media element is going to transition to NETWORK_EMPTY and queue a task to fire a simple event named emptied at the media element. These steps SHOULD be run right before the transition.
readyState
attribute
to
"closed"
.
duration
to
NaN.
SourceBuffer
objects
from
activeSourceBuffers
.
removesourcebuffer
at
activeSourceBuffers
.
SourceBuffer
objects
from
sourceBuffers
.
removesourcebuffer
at
sourceBuffers
.
sourceclose
at
the
MediaSource
.
Going
forward,
this
algorithm
is
intended
to
be
externally
called
and
run
in
any
case
where
the
attached
MediaSource
,
if
any,
must
be
detached
from
the
media
element.
It
MAY
be
called
on
HTMLMediaElement
[
HTML
HTML51
]
operations
like
load()
and
resource
fetch
algorithm
failures
in
addition
to,
or
in
place
of,
when
the
media
element
transitions
to
NETWORK_EMPTY
.
Resource
fetch
algorithm
failures
are
those
which
abort
either
the
resource
fetch
algorithm
or
the
resource
selection
algorithm,
with
the
exception
that
the
"Final
step"
[
HTML
HTML51
]
is
not
considered
a
failure
that
triggers
detachment.
Run the following steps as part of the " Wait until the user agent has established whether or not the media data for the new playback position is available, and, if it is, until it has decoded enough data to play back that position" step of the seek algorithm :
The
media
element
looks
for
media
segments
containing
the
new
playback
position
in
each
SourceBuffer
object
in
activeSourceBuffers
.
Any
position
within
a
TimeRange
in
the
current
value
of
the
HTMLMediaElement.buffered
attribute
has
all
necessary
media
segments
buffered
for
that
position.
TimeRange
of
HTMLMediaElement.buffered
HTMLMediaElement.readyState
attribute
is
greater
than
HAVE_METADATA
,
then
set
the
HTMLMediaElement.readyState
attribute
to
HAVE_METADATA
.
Per
HTMLMediaElement
ready
states
[
HTML
HTML51
]
logic,
HTMLMediaElement.readyState
changes
may
trigger
events
on
the
HTMLMediaElement.
appendBuffer()
call
causes
the
coded
frame
processing
algorithm
to
set
the
HTMLMediaElement.readyState
attribute
to
a
value
greater
than
HAVE_METADATA
.
The
web
application
can
use
buffered
and
HTMLMediaElement.buffered
to
determine
what
the
media
element
needs
to
resume
playback.
If
the
readyState
attribute
is
"ended"
and
the
new
playback
position
is
within
a
TimeRange
currently
in
HTMLMediaElement.buffered
,
then
the
seek
operation
must
continue
to
completion
here
even
if
one
or
more
currently
selected
or
enabled
track
buffers'
largest
range
end
timestamp
is
less
than
new
playback
position
.
This
condition
should
only
occur
due
to
logic
in
buffered
when
readyState
is
"ended"
.
The
following
steps
are
periodically
run
during
playback
to
make
sure
that
all
of
the
SourceBuffer
objects
in
activeSourceBuffers
have
enough
data
to
ensure
uninterrupted
playback
.
Changes
to
activeSourceBuffers
also
cause
these
steps
to
run
because
they
affect
the
conditions
that
trigger
state
transitions.
Having
enough
data
to
ensure
uninterrupted
playback
is
an
implementation
specific
condition
where
the
user
agent
determines
that
it
currently
has
enough
data
to
play
the
presentation
without
stalling
for
a
meaningful
period
of
time.
This
condition
is
constantly
evaluated
to
determine
when
to
transition
the
media
element
into
and
out
of
the
HAVE_ENOUGH_DATA
ready
state.
These
transitions
indicate
when
the
user
agent
believes
it
has
enough
data
buffered
or
it
needs
more
data
respectively.
An
implementation
MAY
choose
to
use
bytes
buffered,
time
buffered,
the
append
rate,
or
any
other
metric
it
sees
fit
to
determine
when
it
has
enough
data.
The
metrics
used
MAY
change
during
playback
so
web
applications
SHOULD
only
rely
on
the
value
of
HTMLMediaElement.readyState
to
determine
whether
more
data
is
needed
or
not.
When
the
media
element
needs
more
data,
the
user
agent
SHOULD
transition
it
from
HAVE_ENOUGH_DATA
to
HAVE_FUTURE_DATA
early
enough
for
a
web
application
to
be
able
to
respond
without
causing
an
interruption
in
playback.
For
example,
transitioning
when
the
current
playback
position
is
500ms
before
the
end
of
the
buffered
data
gives
the
application
roughly
500ms
to
append
more
data
before
playback
stalls.
HTMLMediaElement.readyState
attribute
equals
HAVE_NOTHING
:
HTMLMediaElement.buffered
does
not
contain
a
TimeRange
for
the
current
playback
position:
HTMLMediaElement.readyState
attribute
to
HAVE_METADATA
.
Per
HTMLMediaElement
ready
states
[
HTML
HTML51
]
logic,
HTMLMediaElement.readyState
changes
may
trigger
events
on
the
HTMLMediaElement.
HTMLMediaElement.buffered
contains
a
TimeRange
that
includes
the
current
playback
position
and
enough
data
to
ensure
uninterrupted
playback
:
HTMLMediaElement.readyState
attribute
to
HAVE_ENOUGH_DATA
.
Per
HTMLMediaElement
ready
states
[
HTML
HTML51
]
logic,
HTMLMediaElement.readyState
changes
may
trigger
events
on
the
HTMLMediaElement.
HAVE_CURRENT_DATA
.
HTMLMediaElement.buffered
contains
a
TimeRange
that
includes
the
current
playback
position
and
some
time
beyond
the
current
playback
position,
then
run
the
following
steps:
HTMLMediaElement.readyState
attribute
to
HAVE_FUTURE_DATA
.
Per
HTMLMediaElement
ready
states
[
HTML
HTML51
]
logic,
HTMLMediaElement.readyState
changes
may
trigger
events
on
the
HTMLMediaElement.
HAVE_CURRENT_DATA
.
HTMLMediaElement.buffered
contains
a
TimeRange
that
ends
at
the
current
playback
position
and
does
not
have
a
range
covering
the
time
immediately
after
the
current
position:
HTMLMediaElement.readyState
attribute
to
HAVE_CURRENT_DATA
.
Per
HTMLMediaElement
ready
states
[
HTML
HTML51
]
logic,
HTMLMediaElement.readyState
changes
may
trigger
events
on
the
HTMLMediaElement.
During
playback
activeSourceBuffers
needs
to
be
updated
if
the
selected
video
track
,
the
enabled
audio
track(s)
,
or
a
text
track
mode
changes.
When
one
or
more
of
these
changes
occur
the
following
steps
need
to
be
followed.
SourceBuffer
associated
with
the
previously
selected
video
track
is
not
associated
with
any
other
enabled
tracks,
run
the
following
steps:
SourceBuffer
from
activeSourceBuffers
.
removesourcebuffer
at
activeSourceBuffers
SourceBuffer
associated
with
the
newly
selected
video
track
is
not
already
in
activeSourceBuffers
,
run
the
following
steps:
SourceBuffer
to
activeSourceBuffers
.
addsourcebuffer
at
activeSourceBuffers
SourceBuffer
associated
with
this
track
is
not
associated
with
any
other
enabled
or
selected
track,
then
run
the
following
steps:
SourceBuffer
associated
with
the
audio
track
from
activeSourceBuffers
removesourcebuffer
at
activeSourceBuffers
SourceBuffer
associated
with
this
track
is
not
already
in
activeSourceBuffers
,
then
run
the
following
steps:
SourceBuffer
associated
with
the
audio
track
to
activeSourceBuffers
addsourcebuffer
at
activeSourceBuffers
"disabled"
and
the
SourceBuffer
associated
with
this
track
is
not
associated
with
any
other
enabled
or
selected
track,
then
run
the
following
steps:
SourceBuffer
associated
with
the
text
track
from
activeSourceBuffers
removesourcebuffer
at
activeSourceBuffers
"showing"
or
"hidden"
and
the
SourceBuffer
associated
with
this
track
is
not
already
in
activeSourceBuffers
,
then
run
the
following
steps:
SourceBuffer
associated
with
the
text
track
to
activeSourceBuffers
addsourcebuffer
at
activeSourceBuffers
Follow
these
steps
when
duration
needs
to
change
to
a
new
duration
.
duration
is
equal
to
new
duration
,
then
return.
SourceBuffer
objects
in
sourceBuffers
,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
SourceBuffer
objects
in
sourceBuffers
.
This condition can occur because the coded frame removal algorithm preserves coded frames that start before the start of the removal range.
duration
to
new
duration
.
media
duration
to
new
duration
and
run
the
HTMLMediaElement
duration
change
algorithm
.
This
algorithm
gets
called
when
the
application
signals
the
end
of
stream
via
an
endOfStream()
call
or
an
algorithm
needs
to
signal
a
decode
error.
This
algorithm
takes
an
error
parameter
that
indicates
whether
an
error
will
be
signalled.
readyState
attribute
value
to
"ended"
.
sourceended
at
the
MediaSource
.
SourceBuffer
objects
in
sourceBuffers
.
This allows the duration to properly reflect the end of the appended media segments. For example, if the duration was explicitly set to 10 seconds and only media segments for 0 to 5 seconds were appended before endOfStream() was called, then the duration will get updated to 5 seconds.
"network"
HTMLMediaElement.readyState
attribute
equals
HAVE_NOTHING
HTMLMediaElement.readyState
attribute
is
greater
than
HAVE_NOTHING
"decode"
HTMLMediaElement.readyState
attribute
equals
HAVE_NOTHING
HTMLMediaElement.readyState
attribute
is
greater
than
HAVE_NOTHING
enum AppendMode {
"segments",
"sequence"
};
Enumeration description | |
---|---|
segments
|
The timestamps in the media segment determine where the coded frames are placed in the presentation. Media segments can be appended in any order. |
sequence
|
Media
segments
will
be
treated
as
adjacent
in
time
independent
of
the
timestamps
in
the
media
segment.
Coded
frames
in
a
new
media
segment
will
be
placed
immediately
after
the
coded
frames
in
the
previous
media
segment.
The
|
interface SourceBuffer : EventTarget {
attribute AppendMode
mode
;
readonly attribute boolean
updating
;
readonly attribute TimeRanges
buffered
;
attribute double
timestampOffset
;
readonly attribute AudioTrackList
audioTracks
;
readonly attribute VideoTrackList
videoTracks
;
readonly attribute TextTrackList
textTracks
;
attribute double
appendWindowStart
;
attribute unrestricted double
appendWindowEnd
;
attribute EventHandler
onupdatestart
;
attribute EventHandler
onupdate
;
attribute EventHandler
onupdateend
;
attribute EventHandler
onerror
;
attribute EventHandler
onabort
;
void
appendBuffer
(BufferSource
data);
void
abort
();
void
changeType
(DOMString
type);
void
remove
(double
start, unrestricted double
end);
};
mode
of
type
AppendMode
Controls
how
a
sequence
of
media
segments
are
handled.
This
attribute
is
initially
set
by
addSourceBuffer()
after
the
object
is
created.
created,
and
can
be
updated
by
changeType()
or
setting
this
attribute.
On getting, Return the initial value or the last value that was successfully set.
On setting, run the following steps:
sourceBuffers
attribute
of
the
parent
media
source
,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
updating
attribute
equals
true,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
"segments"
,
then
throw
a
TypeError
exception
and
abort
these
steps.
If
the
readyState
attribute
of
the
parent
media
source
is
in
the
"ended"
state
then
run
the
following
steps:
readyState
attribute
of
the
parent
media
source
to
"open"
sourceopen
at
the
parent
media
source
.
InvalidStateError
and
abort
these
steps.
"sequence"
,
then
set
the
group
start
timestamp
to
the
group
end
timestamp
.
updating
of
type
boolean
,
readonly
Indicates
whether
the
asynchronous
continuation
of
an
appendBuffer()
or
remove()
operation
is
still
being
processed.
This
attribute
is
initially
set
to
false
when
the
object
is
created.
buffered
of
type
TimeRanges
,
readonly
Indicates
what
TimeRanges
are
buffered
in
the
SourceBuffer
.
This
attribute
is
initially
set
to
an
empty
TimeRanges
object
when
the
object
is
created.
When the attribute is read the following steps MUST occur:
sourceBuffers
attribute
of
the
parent
media
source
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
SourceBuffer
object.
TimeRange
object
containing
a
single
range
from
0
to
highest
end
time
.
SourceBuffer
,
run
the
following
steps:
Text track-buffers are included in the calculation of highest end time , above, but excluded from the buffered range calculation here. They are not necessarily continuous, nor should any discontinuity within them trigger playback stall when the other media tracks are continuous over the same time range.
readyState
is
"ended"
,
then
set
the
end
time
on
the
last
range
in
track
ranges
to
highest
end
time
.
timestampOffset
of
type
double
Controls
the
offset
applied
to
timestamps
inside
subsequent
media
segments
that
are
appended
to
this
SourceBuffer
.
The
timestampOffset
is
initially
set
to
0
which
indicates
that
no
offset
is
being
applied.
On getting, Return the initial value or the last value that was successfully set.
On setting, run the following steps:
sourceBuffers
attribute
of
the
parent
media
source
,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
updating
attribute
equals
true,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
If
the
readyState
attribute
of
the
parent
media
source
is
in
the
"ended"
state
then
run
the
following
steps:
readyState
attribute
of
the
parent
media
source
to
"open"
sourceopen
at
the
parent
media
source
.
InvalidStateError
and
abort
these
steps.
mode
attribute
equals
"sequence"
,
then
set
the
group
start
timestamp
to
new
timestamp
offset
.
audioTracks
of
type
AudioTrackList
,
readonly
AudioTrack
objects
created
by
this
object.
videoTracks
of
type
VideoTrackList
,
readonly
VideoTrack
objects
created
by
this
object.
textTracks
of
type
TextTrackList
,
readonly
TextTrack
objects
created
by
this
object.
appendWindowStart
of
type
double
The presentation timestamp for the start of the append window . This attribute is initially set to the presentation start time .
On getting, Return the initial value or the last value that was successfully set.
On setting, run the following steps:
sourceBuffers
attribute
of
the
parent
media
source
,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
updating
attribute
equals
true,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
appendWindowEnd
then
throw
a
TypeError
exception
and
abort
these
steps.
appendWindowEnd
of
type
unrestricted
double
The presentation timestamp for the end of the append window . This attribute is initially set to positive Infinity.
On getting, Return the initial value or the last value that was successfully set.
On setting, run the following steps:
sourceBuffers
attribute
of
the
parent
media
source
,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
updating
attribute
equals
true,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
TypeError
and
abort
these
steps.
appendWindowStart
then
throw
a
TypeError
exception
and
abort
these
steps.
onupdatestart
of
type
EventHandler
The
event
handler
for
the
updatestart
event.
onupdate
of
type
EventHandler
The
event
handler
for
the
update
event.
onupdateend
of
type
EventHandler
The
event
handler
for
the
updateend
event.
onerror
of
type
EventHandler
The
event
handler
for
the
error
event.
onabort
of
type
EventHandler
The
event
handler
for
the
abort
event.
appendBuffer
Appends
the
segment
data
in
an
BufferSource
[
WEBIDL
]
to
the
source
buffer.
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
data |
BufferSource
| ✘ | ✘ |
void
When this method is invoked, the user agent must run the following steps:
updating
attribute
to
true.
updatestart
at
this
SourceBuffer
object.
abort
Aborts the current segment and resets the segment parser.
When this method is invoked, the user agent must run the following steps:
sourceBuffers
attribute
of
the
parent
media
source
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
readyState
attribute
of
the
parent
media
source
is
not
in
the
"open"
state
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
InvalidStateError
exception
and
abort
these
steps.
updating
attribute
equals
true,
then
run
the
following
steps:
updating
attribute
to
false.
abort
at
this
SourceBuffer
object.
updateend
at
this
SourceBuffer
object.
appendWindowStart
to
the
presentation
start
time
.
appendWindowEnd
to
positive
Infinity.
changeType
Changes
the
MIME
type
associated
with
this
object.
Subsequent
appendBuffer()
calls
will
expect
the
newly
appended
bytes
to
conform
to
the
new
type.
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
type |
DOMString
| ✘ | ✘ |
When this method is invoked, the user agent must run the following steps:
TypeError
exception
and
abort
these
steps.
sourceBuffers
attribute
of
the
parent
media
source
,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
updating
attribute
equals
true,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
SourceBuffer
objects
in
the
sourceBuffers
attribute
of
the
parent
media
source
,
then
throw
a
NotSupportedError
exception
and
abort
these
steps.
If
the
readyState
attribute
of
the
parent
media
source
is
in
the
"ended"
state
then
run
the
following
steps:
readyState
attribute
of
the
parent
media
source
to
"open"
sourceopen
at
the
parent
media
source
.
SourceBuffer
object
to
the
value
in
the
"Generate
Timestamps
Flag"
column
of
the
byte
stream
format
registry
[
MSE-REGISTRY
]
entry
that
is
associated
with
type
.
mode
attribute
on
this
SourceBuffer
object
to
"sequence"
,
including
running
the
associated
steps
for
that
attribute
being
set.
mode
attribute
on
this
SourceBuffer
object,
without
running
any
associated
steps
for
that
attribute
being
set.
remove
Removes media for a specific time range.
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
start |
double
|
✘ | ✘ | The start of the removal range, in seconds measured from presentation start time . |
end |
unrestricted
double
|
✘ | ✘ | The end of the removal range, in seconds measured from presentation start time . |
void
When this method is invoked, the user agent must run the following steps:
sourceBuffers
attribute
of
the
parent
media
source
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
updating
attribute
equals
true,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
duration
equals
NaN,
then
throw
a
TypeError
exception
and
abort
these
steps.
duration
,
then
throw
a
TypeError
exception
and
abort
these
steps.
TypeError
exception
and
abort
these
steps.
If
the
readyState
attribute
of
the
parent
media
source
is
in
the
"ended"
state
then
run
the
following
steps:
readyState
attribute
of
the
parent
media
source
to
"open"
sourceopen
at
the
parent
media
source
.
A
track
buffer
stores
the
track
descriptions
and
coded
frames
for
an
individual
track.
The
track
buffer
is
updated
as
initialization
segments
and
media
segments
are
appended
to
the
SourceBuffer
.
Each track buffer has a last decode timestamp variable that stores the decode timestamp of the last coded frame appended in the current coded frame group . The variable is initially unset to indicate that no coded frames have been appended yet.
Each track buffer has a last frame duration variable that stores the coded frame duration of the last coded frame appended in the current coded frame group . The variable is initially unset to indicate that no coded frames have been appended yet.
Each track buffer has a highest end timestamp variable that stores the highest coded frame end timestamp across all coded frames in the current coded frame group that were appended to this track buffer. The variable is initially unset to indicate that no coded frames have been appended yet.
Each track buffer has a need random access point flag variable that keeps track of whether the track buffer is waiting for a random access point coded frame . The variable is initially set to true to indicate that random access point coded frame is needed before anything can be added to the track buffer .
Each track buffer has a track buffer ranges variable that represents the presentation time ranges occupied by the coded frames currently stored in the track buffer.
For
track
buffer
ranges,
these
presentation
time
ranges
are
based
on
presentation
timestamps
,
frame
durations,
and
potentially
coded
frame
group
start
times
for
coded
frame
groups
across
track
buffers
in
a
muxed
SourceBuffer
.
For
specification
purposes,
this
information
is
treated
as
if
it
were
stored
in
a
normalized
TimeRanges
object
.
Intersected
track
buffer
ranges
are
used
to
report
HTMLMediaElement.buffered
,
and
MUST
therefore
support
uninterrupted
playback
within
each
range
of
HTMLMediaElement.buffered
.
These
coded
frame
group
start
times
differ
slightly
from
those
mentioned
in
the
coded
frame
processing
algorithm
in
that
they
are
the
earliest
presentation
timestamp
across
all
track
buffers
following
a
discontinuity.
Discontinuities
can
occur
within
the
coded
frame
processing
algorithm
or
result
from
the
coded
frame
removal
algorithm
,
regardless
of
mode
.
The
threshold
for
determining
disjointness
of
track
buffer
ranges
is
implementation-specific.
For
example,
to
reduce
unexpected
playback
stalls,
implementations
MAY
approximate
the
coded
frame
processing
algorithm
's
discontinuity
detection
logic
by
coalescing
adjacent
ranges
separated
by
a
gap
smaller
than
2
times
the
maximum
frame
duration
buffered
so
far
in
this
track
buffer
.
Implementations
MAY
also
use
coded
frame
group
start
times
as
range
start
times
across
track
buffers
in
a
muxed
SourceBuffer
to
further
reduce
unexpected
playback
stalls.
Event name | Interface | Dispatched when... |
---|---|---|
updatestart
|
Event
|
updating
transitions
from
false
to
true.
|
update
|
Event
|
The
append
or
remove
has
successfully
completed.
updating
transitions
from
true
to
false.
|
updateend
|
Event
|
The append or remove has ended. |
error
|
Event
|
An
error
occurred
during
the
append.
updating
transitions
from
true
to
false.
|
abort
|
Event
|
The
append
or
remove
was
aborted
by
an
abort()
call.
updating
transitions
from
true
to
false.
|
All SourceBuffer objects have an internal append state variable that keeps track of the high-level segment parsing state. It is initially set to WAITING_FOR_SEGMENT and can transition to the following states as data is appended.
Append state name | Description |
---|---|
WAITING_FOR_SEGMENT | Waiting for the start of an initialization segment or media segment to be appended. |
PARSING_INIT_SEGMENT | Currently parsing an initialization segment . |
PARSING_MEDIA_SEGMENT | Currently parsing a media segment . |
The
input
buffer
is
a
byte
buffer
that
is
used
to
hold
unparsed
bytes
across
appendBuffer()
calls.
The
buffer
is
empty
when
the
SourceBuffer
object
is
created.
The
buffer
full
flag
keeps
track
of
whether
appendBuffer()
is
allowed
to
accept
more
bytes.
It
is
set
to
false
when
the
SourceBuffer
object
is
created
and
gets
updated
as
data
is
appended
and
removed.
The
group
start
timestamp
variable
keeps
track
of
the
starting
timestamp
for
a
new
coded
frame
group
in
the
"sequence"
mode.
It
is
unset
when
the
SourceBuffer
object
is
created
and
gets
updated
when
the
mode
attribute
equals
"sequence"
and
the
timestampOffset
attribute
is
set,
or
the
coded
frame
processing
algorithm
runs.
The group end timestamp variable stores the highest coded frame end timestamp across all coded frames in the current coded frame group . It is set to 0 when the SourceBuffer object is created and gets updated by the coded frame processing algorithm .
The
group
end
timestamp
stores
the
highest
coded
frame
end
timestamp
across
all
track
buffers
in
a
SourceBuffer
.
Therefore,
care
should
be
taken
in
setting
the
mode
attribute
when
appending
multiplexed
segments
in
which
the
timestamps
are
not
aligned
across
tracks.
The
generate
timestamps
flag
is
a
boolean
variable
that
keeps
track
of
whether
timestamps
need
to
be
generated
for
the
coded
frames
passed
to
the
coded
frame
processing
algorithm
.
This
flag
is
set
by
addSourceBuffer()
when
the
SourceBuffer
object
is
created.
When the segment parser loop algorithm is invoked, run the following steps:
If the append state equals WAITING_FOR_SEGMENT , then run the following steps:
If the append state equals PARSING_INIT_SEGMENT , then run the following steps:
If the append state equals PARSING_MEDIA_SEGMENT , then run the following steps:
The frequency at which the coded frame processing algorithm is run is implementation-specific. The coded frame processing algorithm MAY be called when the input buffer contains the complete media segment or it MAY be called multiple times as complete coded frames are added to the input buffer.
SourceBuffer
is
full
and
cannot
accept
more
media
data,
then
set
the
buffer
full
flag
to
true.
When the parser state needs to be reset, run the following steps:
mode
attribute
equals
"sequence"
,
then
set
the
group
start
timestamp
to
the
group
end
timestamp
This algorithm is called when an error occurs during an append.
updating
attribute
to
false.
error
at
this
SourceBuffer
object.
updateend
at
this
SourceBuffer
object.
"decode"
.
When
an
append
operation
begins,
the
follow
steps
are
run
to
validate
and
prepare
the
SourceBuffer
.
SourceBuffer
has
been
removed
from
the
sourceBuffers
attribute
of
the
parent
media
source
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
updating
attribute
equals
true,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
HTMLMediaElement.error
attribute
is
not
null,
then
throw
an
InvalidStateError
exception
and
abort
these
steps.
If
the
readyState
attribute
of
the
parent
media
source
is
in
the
"ended"
state
then
run
the
following
steps:
readyState
attribute
of
the
parent
media
source
to
"open"
sourceopen
at
the
parent
media
source
.
If
the
buffer
full
flag
equals
true,
then
throw
a
QuotaExceededError
exception
and
abort
these
step.
This
is
the
signal
that
the
implementation
was
unable
to
evict
enough
data
to
accommodate
the
append
or
the
append
is
too
big.
The
web
application
SHOULD
use
remove()
to
explicitly
free
up
space
and/or
reduce
the
size
of
the
append.
When
appendBuffer()
is
called,
the
following
steps
are
run
to
process
the
appended
data.
updating
attribute
to
false.
update
at
this
SourceBuffer
object.
updateend
at
this
SourceBuffer
object.
Follow these steps when a caller needs to initiate a JavaScript visible range removal operation that blocks other SourceBuffer updates:
updating
attribute
to
true.
updatestart
at
this
SourceBuffer
object.
updating
attribute
to
false.
update
at
this
SourceBuffer
object.
updateend
at
this
SourceBuffer
object.
The following steps are run when the segment parser loop successfully parses a complete initialization segment :
Each
SourceBuffer
object
has
an
internal
first
initialization
segment
received
flag
that
tracks
whether
the
first
initialization
segment
has
been
appended
and
received
by
this
algorithm.
This
flag
is
set
to
false
when
the
SourceBuffer
is
created
and
is
updated
by
the
algorithm
below.
Each
SourceBuffer
object
has
an
internal
pending
initialization
segment
for
changeType
flag
that
tracks
whether
an
initialization
segment
is
needed
since
the
most
recent
changeType()
.
This
flag
is
set
to
false
when
the
SourceBuffer
is
created,
set
to
true
by
changeType()
and
reset
to
false
by
the
algorithm
below.
duration
attribute
if
it
currently
equals
NaN:
User
agents
MAY
consider
codecs,
that
would
otherwise
be
supported,
as
"not
supported"
here
if
the
codecs
were
not
specified
in
type
parameter
passed
to
(a)
the
most
recently
successful
changeType()
on
this
SourceBuffer
object,
or
(b)
if
no
successful
changeType()
has
yet
occurred
on
this
object,
the
addSourceBuffer()
that
created
this
SourceBuffer
object.
For
example,
if
the
most
recently
successful
changeType()
was
called
with
'video/webm'
or
'video/webm;
codecs="vp8"',
and
a
video
track
containing
vp9
appears
in
the
initialization
segment,
then
the
user
agent
MAY
use
this
step
to
trigger
a
decode
error
even
if
the
other
two
properties'
checks,
above,
pass.
Implementations
are
encouraged
to
trigger
error
in
such
cases
only
when
the
codec
is
indeed
not
supported
or
the
other
two
properties'
checks
fail.
Web
authors
are
encouraged
to
use
changeType()
,
addSourceBuffer()
and
isTypeSupported()
with
precise
codec
parameters
to
more
proactively
detect
user
agent
support.
changeType()
is
required
if
the
SourceBuffer
object's
bytestream
format
is
changing.
If the first initialization segment received flag is false, then run the following steps:
User
agents
MAY
consider
codecs,
that
would
otherwise
be
supported,
as
"not
supported"
here
if
the
codecs
were
not
specified
in
the
type
parameter
passed
to
(a)
the
most
recently
successful
changeType()
on
this
SourceBuffer
object,
or
(b)
if
no
successful
changeType()
has
yet
occurred
on
this
object,
the
addSourceBuffer()
that
created
this
.
SourceBuffer
object.
For
example,
MediaSource.isTypeSupported('video/webm;codecs="vp8,vorbis"')
may
return
true,
but
if
addSourceBuffer()
was
called
with
'video/webm;codecs="vp8"'
and
a
Vorbis
track
appears
in
the
initialization
segment
,
then
the
user
agent
MAY
use
this
step
to
trigger
a
decode
error.
Implementations
are
encouraged
to
trigger
error
in
such
cases
only
when
the
codec
is
indeed
not
supported.
Web
authors
are
encouraged
to
use
changeType()
,
addSourceBuffer()
and
isTypeSupported()
with
precise
codec
parameters
to
more
proactively
detect
user
agent
support.
changeType()
is
required
if
the
SourceBuffer
object's
bytestream
format
is
changing.
For each audio track in the initialization segment , run following steps:
AudioTrack
object.
id
property
on
new
audio
track
.
language
property
on
new
audio
track
.
label
property
on
new
audio
track
.
kind
property
on
new
audio
track
.
If
audioTracks
.
length
equals
0,
then
run
the
following
steps:
enabled
property
on
new
audio
track
to
true.
audioTracks
attribute
on
this
SourceBuffer
object.
This
should
trigger
AudioTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
trusted
event
named
addtrack
,
that
does
not
bubble
and
is
not
cancelable,
and
that
uses
the
TrackEvent
interface,
with
the
track
attribute
initialized
to
new
audio
track
,
at
the
AudioTrackList
object
referenced
by
the
audioTracks
attribute
on
this
SourceBuffer
object.
audioTracks
attribute
on
the
HTMLMediaElement.
This
should
trigger
AudioTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
trusted
event
named
addtrack
,
that
does
not
bubble
and
is
not
cancelable,
and
that
uses
the
TrackEvent
interface,
with
the
track
attribute
initialized
to
new
audio
track
,
at
the
AudioTrackList
object
referenced
by
the
audioTracks
attribute
on
the
HTMLMediaElement.
For each video track in the initialization segment , run following steps:
VideoTrack
object.
id
property
on
new
video
track
.
language
property
on
new
video
track
.
label
property
on
new
video
track
.
kind
property
on
new
video
track
.
If
videoTracks
.
length
equals
0,
then
run
the
following
steps:
selected
property
on
new
video
track
to
true.
videoTracks
attribute
on
this
SourceBuffer
object.
This
should
trigger
VideoTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
trusted
event
named
addtrack
,
that
does
not
bubble
and
is
not
cancelable,
and
that
uses
the
TrackEvent
interface,
with
the
track
attribute
initialized
to
new
video
track
,
at
the
VideoTrackList
object
referenced
by
the
videoTracks
attribute
on
this
SourceBuffer
object.
videoTracks
attribute
on
the
HTMLMediaElement.
This
should
trigger
VideoTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
trusted
event
named
addtrack
,
that
does
not
bubble
and
is
not
cancelable,
and
that
uses
the
TrackEvent
interface,
with
the
track
attribute
initialized
to
new
video
track
,
at
the
VideoTrackList
object
referenced
by
the
videoTracks
attribute
on
the
HTMLMediaElement.
For each text track in the initialization segment , run following steps:
TextTrack
object.
id
property
on
new
text
track
.
language
property
on
new
text
track
.
label
property
on
new
text
track
.
kind
property
on
new
text
track
.
mode
property
on
new
text
track
equals
"showing"
or
"hidden"
,
then
set
active
track
flag
to
true.
textTracks
attribute
on
this
SourceBuffer
object.
This
should
trigger
TextTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
trusted
event
named
addtrack
,
that
does
not
bubble
and
is
not
cancelable,
and
that
uses
the
TrackEvent
interface,
with
the
track
attribute
initialized
to
new
text
track
,
at
the
TextTrackList
object
referenced
by
the
textTracks
attribute
on
this
SourceBuffer
object.
textTracks
attribute
on
the
HTMLMediaElement.
This
should
trigger
TextTrackList
[
HTML
HTML51
]
logic
to
queue
a
task
to
fire
a
trusted
event
named
addtrack
,
that
does
not
bubble
and
is
not
cancelable,
and
that
uses
the
TrackEvent
interface,
with
the
track
attribute
initialized
to
new
text
track
,
at
the
TextTrackList
object
referenced
by
the
textTracks
attribute
on
the
HTMLMediaElement.
SourceBuffer
to
activeSourceBuffers
.
addsourcebuffer
at
activeSourceBuffers
If
the
HTMLMediaElement.readyState
attribute
is
HAVE_NOTHING
,
then
run
the
following
steps:
sourceBuffers
have
first
initialization
segment
received
flag
set
to
false,
then
abort
these
steps.
HTMLMediaElement.readyState
attribute
to
HAVE_METADATA
.
Per
HTMLMediaElement
ready
states
[
HTML
HTML51
]
logic,
HTMLMediaElement.readyState
changes
may
trigger
events
on
the
HTMLMediaElement.
This
particular
transition
should
trigger
HTMLMediaElement
logic
to
queue
a
task
to
fire
a
simple
event
named
loadedmetadata
at
the
media
element.
HTMLMediaElement.readyState
attribute
is
greater
than
HAVE_CURRENT_DATA
,
then
set
the
HTMLMediaElement.readyState
attribute
to
HAVE_METADATA
.
Per
HTMLMediaElement
ready
states
[
HTML
HTML51
]
logic,
HTMLMediaElement.readyState
changes
may
trigger
events
on
the
HTMLMediaElement.
When complete coded frames have been parsed by the segment parser loop then the following steps are run:
For each coded frame in the media segment run the following steps:
Special processing may be needed to determine the presentation and decode timestamps for timed text frames since this information may not be explicitly present in the underlying format or may be dependent on the order of the frames. Some metadata text tracks, like MPEG2-TS PSI data, may only have implied timestamps. Format specific rules for these situations SHOULD be in the byte stream format specifications or in separate extension specifications.
Implementations don't have to internally store timestamps in a double precision floating point representation. This representation is used here because it is the represention for timestamps in the HTML spec. The intention here is to make the behavior clear without adding unnecessary complexity to the algorithm to deal with the fact that adding a timestampOffset may cause a timestamp rollover in the underlying timestamp representation used by the byte stream format. Implementations can use any internal timestamp representation they wish, but the addition of timestampOffset SHOULD behave in a similar manner to what would happen if a double precision floating point representation was used.
mode
equals
"sequence"
and
group
start
timestamp
is
set,
then
run
the
following
steps:
timestampOffset
equal
to
group
start
timestamp
-
presentation
timestamp
.
If
timestampOffset
is
not
0,
then
run
the
following
steps:
timestampOffset
to
the
presentation
timestamp
.
timestampOffset
to
the
decode
timestamp
.
mode
equals
"segments"
:
mode
equals
"sequence"
:
appendWindowStart
,
then
set
the
need
random
access
point
flag
to
true,
drop
the
coded
frame,
and
jump
to
the
top
of
the
loop
to
start
processing
the
next
coded
frame.
Some
implementations
MAY
choose
to
collect
some
of
these
coded
frames
with
presentation
timestamp
less
than
appendWindowStart
and
use
them
to
generate
a
splice
at
the
first
coded
frame
that
has
a
presentation
timestamp
greater
than
or
equal
to
appendWindowStart
even
if
that
frame
is
not
a
random
access
point
.
Supporting
this
requires
multiple
decoders
or
faster
than
real-time
decoding
so
for
now
this
behavior
will
not
be
a
normative
requirement.
appendWindowEnd
,
then
set
the
need
random
access
point
flag
to
true,
drop
the
coded
frame,
and
jump
to
the
top
of
the
loop
to
start
processing
the
next
coded
frame.
Some
implementations
MAY
choose
to
collect
coded
frames
with
presentation
timestamp
less
than
appendWindowEnd
and
frame
end
timestamp
greater
than
appendWindowEnd
and
use
them
to
generate
a
splice
across
the
portion
of
the
collected
coded
frames
within
the
append
window
at
time
of
collection,
and
the
beginning
portion
of
later
processed
frames
which
only
partially
overlap
the
end
of
the
collected
coded
frames.
Supporting
this
requires
multiple
decoders
or
faster
than
real-time
decoding
so
for
now
this
behavior
will
not
be
a
normative
requirement.
In
conjunction
with
collecting
coded
frames
that
span
appendWindowStart
,
implementations
MAY
thus
support
gapless
audio
splicing.
This is to compensate for minor errors in frame timestamp computations that can appear when converting back and forth between double precision floating point numbers and rationals. This tolerance allows a frame to replace an existing one as long as it is within 1 microsecond of the existing frame's start time. Frames that come slightly before an existing frame are handled by the removal step below.
Removing all coded frames until the next random access point is a conservative estimate of the decoding dependencies since it assumes all frames between the removed frames and the next random access point depended on the frames that were removed.
The greater than check is needed because bidirectional prediction between coded frames can cause presentation timestamp to not be monotonically increasing even though the decode timestamps are monotonically increasing.
timestampOffset
equal
to
frame
end
timestamp
.
If
the
HTMLMediaElement.readyState
attribute
is
HAVE_METADATA
and
the
new
coded
frames
cause
HTMLMediaElement.buffered
to
have
a
TimeRange
for
the
current
playback
position,
then
set
the
HTMLMediaElement.readyState
attribute
to
HAVE_CURRENT_DATA
.
Per
HTMLMediaElement
ready
states
[
HTML
HTML51
]
logic,
HTMLMediaElement.readyState
changes
may
trigger
events
on
the
HTMLMediaElement.
If
the
HTMLMediaElement.readyState
attribute
is
HAVE_CURRENT_DATA
and
the
new
coded
frames
cause
HTMLMediaElement.buffered
to
have
a
TimeRange
that
includes
the
current
playback
position
and
some
time
beyond
the
current
playback
position,
then
set
the
HTMLMediaElement.readyState
attribute
to
HAVE_FUTURE_DATA
.
Per
HTMLMediaElement
ready
states
[
HTML
HTML51
]
logic,
HTMLMediaElement.readyState
changes
may
trigger
events
on
the
HTMLMediaElement.
If
the
HTMLMediaElement.readyState
attribute
is
HAVE_FUTURE_DATA
and
the
new
coded
frames
cause
HTMLMediaElement.buffered
to
have
a
TimeRange
that
includes
the
current
playback
position
and
enough
data
to
ensure
uninterrupted
playback
,
then
set
the
HTMLMediaElement.readyState
attribute
to
HAVE_ENOUGH_DATA
.
Per
HTMLMediaElement
ready
states
[
HTML
HTML51
]
logic,
HTMLMediaElement.readyState
changes
may
trigger
events
on
the
HTMLMediaElement.
duration
,
then
run
the
duration
change
algorithm
with
new
duration
set
to
the
maximum
of
the
current
duration
and
the
group
end
timestamp
.
Follow these steps when coded frames for a specific time range need to be removed from the SourceBuffer:
For each track buffer in this source buffer, run the following steps:
duration
If this track buffer has a random access point timestamp that is greater than or equal to end , then update remove end timestamp to that random access point timestamp.
Random access point timestamps can be different across tracks because the dependencies between coded frames within a track are usually different than the dependencies in another track.
For each removed frame, if the frame has a decode timestamp equal to the last decode timestamp for the frame's track, run the following steps:
mode
equals
"segments"
:
mode
equals
"sequence"
:
Removing all coded frames until the next random access point is a conservative estimate of the decoding dependencies since it assumes all frames between the removed frames and the next random access point depended on the frames that were removed.
If
this
object
is
in
activeSourceBuffers
,
the
current
playback
position
is
greater
than
or
equal
to
start
and
less
than
the
remove
end
timestamp
,
and
HTMLMediaElement.readyState
is
greater
than
HAVE_METADATA
,
then
set
the
HTMLMediaElement.readyState
attribute
to
HAVE_METADATA
and
stall
playback.
Per
HTMLMediaElement
ready
states
[
HTML
HTML51
]
logic,
HTMLMediaElement.readyState
changes
may
trigger
events
on
the
HTMLMediaElement.
This transition occurs because media data for the current position has been removed. Playback cannot progress until media for the current playback position is appended or the selected/enabled tracks change .
This algorithm is run to free up space in this source buffer when new data is appended.
Implementations
MAY
use
different
methods
for
selecting
removal
ranges
so
web
applications
SHOULD
NOT
depend
on
a
specific
behavior.
The
web
application
can
use
the
buffered
attribute
to
observe
whether
portions
of
the
buffered
data
have
been
evicted.
Follow these steps when the coded frame processing algorithm needs to generate a splice frame for two overlapping audio coded frames :
floor(x
*
sample_rate
+
0.5)
/
sample_rate
).
For example, given the following values:
presentation timestamp and decode timestamp are updated to 10.0125 since 10.01255 is closer to 10 + 100/8000 (10.0125) than 10 + 101/8000 (10.012625)
Some implementations MAY apply fades to/from silence to coded frames on either side of the inserted silence to make the transition less jarring.
This is intended to allow new coded frame to be added to the track buffer as if overlapped frame had not been in the track buffer to begin with.
If the new coded frame is less than 5 milliseconds in duration, then coded frames that are appended after the new coded frame will be needed to properly render the splice.
See the audio splice rendering algorithm for details on how this splice frame is rendered.
The following steps are run when a spliced frame, generated by the audio splice frame algorithm , needs to be rendered by the media element:
Here is a graphical representation of this algorithm.
Follow these steps when the coded frame processing algorithm needs to generate a splice frame for two overlapping timed text coded frames :
This is intended to allow new coded frame to be added to the track buffer as if it hadn't overlapped any frames in track buffer to begin with.
SourceBufferList
is
a
simple
container
object
for
SourceBuffer
objects.
It
provides
read-only
array
access
and
fires
events
when
the
list
is
modified.
interface SourceBufferList : EventTarget {
readonly attribute unsigned long
length
;
attribute EventHandler
onaddsourcebuffer
;
attribute EventHandler
onremovesourcebuffer
;
getter SourceBuffer
(unsigned long
index);
};
length
of
type
unsigned
long
,
readonly
Indicates
the
number
of
SourceBuffer
objects
in
the
list.
onaddsourcebuffer
of
type
EventHandler
The
event
handler
for
the
addsourcebuffer
event.
onremovesourcebuffer
of
type
EventHandler
The
event
handler
for
the
removesourcebuffer
event.
getter
Allows the SourceBuffer objects in the list to be accessed with an array operator (i.e., []).
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
index |
unsigned
long
|
✘ | ✘ |
SourceBuffer
When this method is invoked, the user agent must run the following steps:
length
attribute
then
return
undefined
and
abort
these
steps.
SourceBuffer
object
in
the
list.
Event name | Interface | Dispatched when... |
---|---|---|
addsourcebuffer
|
Event
|
When
a
SourceBuffer
is
added
to
the
list.
|
removesourcebuffer
|
Event
|
When
a
SourceBuffer
is
removed
from
the
list.
|
This section specifies extensions to the URL [ FILE-API ] object definition.
[Exposed=Window]
partial interface URL {
static DOMString
createObjectURL
(MediaSource
mediaSource);
};
createObjectURL
,
static
Creates
URLs
for
MediaSource
objects.
This algorithm is intended to mirror the behavior of the createObjectURL() [ FILE-API ] method, which does not auto-revoke the created URL. Web authors are encouraged to use revokeObjectURL() [ FILE-API ] for any MediaSource object URL that is no longer needed for attachment to a media element.
Parameter | Type | Nullable | Optional | Description |
---|---|---|---|---|
mediaSource |
MediaSource
| ✘ | ✘ |
DOMString
When this method is invoked, the user agent must run the following steps:
This
section
specifies
what
existing
attributes
on
the
HTMLMediaElement
MUST
return
when
a
MediaSource
is
attached
to
the
element.
The
HTMLMediaElement.seekable
attribute
returns
a
new
static
normalized
TimeRanges
object
created
based
on
the
following
steps:
duration
equals
NaN:
TimeRanges
object.
duration
equals
positive
Infinity:
HTMLMediaElement.buffered
attribute.
HTMLMediaElement.buffered
attribute
returns
an
empty
TimeRanges
object,
then
return
an
empty
TimeRanges
object
and
abort
these
steps.
HTMLMediaElement.buffered
attribute.
duration
.
The
HTMLMediaElement.buffered
attribute
returns
a
static
normalized
TimeRanges
object
based
on
the
following
steps.
TimeRanges
object.
activeSourceBuffers
.length
does
not
equal
0
then
run
the
following
steps:
buffered
for
each
SourceBuffer
object
in
activeSourceBuffers
.
TimeRange
object
containing
a
single
range
from
0
to
highest
end
time
.
SourceBuffer
object
in
activeSourceBuffers
run
the
following
steps:
buffered
attribute
on
the
current
SourceBuffer
.
readyState
is
"ended"
,
then
set
the
end
time
on
the
last
range
in
source
ranges
to
highest
end
time
.
This
section
specifies
extensions
to
the
[
HTML
]
definition.
AudioTrack
AudioTrack
partial interface AudioTrack {
readonly attribute SourceBuffer
? sourceBuffer
;
};
sourceBuffer
of
type
SourceBuffer
,
readonly
,
nullable
Returns
the
SourceBuffer
that
created
this
track.
Returns
null
if
this
track
was
not
created
by
a
SourceBuffer
or
the
SourceBuffer
has
been
removed
from
the
sourceBuffers
attribute
of
its
parent
media
source
.
This
section
specifies
extensions
to
the
[
HTML
]
definition.
VideoTrack
VideoTrack
partial interface VideoTrack {
readonly attribute SourceBuffer
? sourceBuffer
;
};
sourceBuffer
of
type
SourceBuffer
,
readonly
,
nullable
Returns
the
SourceBuffer
that
created
this
track.
Returns
null
if
this
track
was
not
created
by
a
SourceBuffer
or
the
SourceBuffer
has
been
removed
from
the
sourceBuffers
attribute
of
its
parent
media
source
.
This
section
specifies
extensions
to
the
[
HTML
]
definition.
TextTrack
TextTrack
partial interface TextTrack {
readonly attribute SourceBuffer
? sourceBuffer
;
};
sourceBuffer
of
type
SourceBuffer
,
readonly
,
nullable
Returns
the
SourceBuffer
that
created
this
track.
Returns
null
if
this
track
was
not
created
by
a
SourceBuffer
or
the
SourceBuffer
has
been
removed
from
the
sourceBuffers
attribute
of
its
parent
media
source
.
The
bytes
provided
through
appendBuffer()
for
a
SourceBuffer
form
a
logical
byte
stream.
The
format
and
semantics
of
these
byte
streams
are
defined
in
byte
stream
format
specifications
.
The
byte
stream
format
registry
[
MSE-REGISTRY
]
provides
mappings
between
a
MIME
type
that
may
be
passed
to
addSourceBuffer()
,
or
isTypeSupported()
or
changeType()
and
the
byte
stream
format
expected
by
a
SourceBuffer
created
with
using
that
MIME
type.
type
for
parsing
newly
appended
data.
Implementations
are
encouraged
to
register
mappings
for
byte
stream
formats
they
support
to
facilitate
interoperability.
The
byte
stream
format
registry
[
MSE-REGISTRY
]
is
the
authoritative
source
for
these
mappings.
If
an
implementation
claims
to
support
a
MIME
type
listed
in
the
registry,
its
SourceBuffer
implementation
MUST
conform
to
the
byte
stream
format
specification
listed
in
the
registry
entry.
The byte stream format specifications in the registry are not intended to define new storage formats. They simply outline the subset of existing storage format structures that implementations of this specification will accept.
Byte stream format parsing and validation is implemented in the segment parser loop algorithm.
This section provides general requirements for all byte stream format specifications:
AudioTrack
,
VideoTrack
,
and
TextTrack
attribute
values
from
data
in
initialization
segments
.
If the byte stream format covers a format similar to one covered in the in-band tracks spec [ INBANDTRACKS ], then it SHOULD try to use the same attribute mappings so that Media Source Extensions playback and non-Media Source Extensions playback provide the same track information.
The number and type of tracks are not consistent.
For example, if the first initialization segment has 2 audio tracks and 1 video track, then all initialization segments that follow it in the byte stream MUST describe 2 audio tracks and 1 video track.
Codecs
Unsupported
codec
changes
occur
across
initialization
segments
.
For
example,
a
byte
stream
that
starts
with
an
initialization
segment
that
specifies
a
single
AAC
track
and
later
contains
an
See
the
initialization
segment
received
algorithm
,
addSourceBuffer()
and
that
specifies
a
single
AMR-WB
track
is
not
allowed.
Support
for
multiple
codecs
is
handled
with
multiple
SourceBuffer
changeType()
for
details
and
examples
of
codec
changes.
objects.
Video frame size changes. The user agent MUST support seamless playback.
This will cause the <video> display region to change size if the web application does not use CSS or HTML attributes (width/height) to constrain the element size.
Audio channel count changes. The user agent MAY support this seamlessly and could trigger downmixing.
This is a quality of implementation issue because changing the channel count may require reinitializing the audio device, resamplers, and channel mixers which tends to be audible.
buffered
attribute.
This is intended to simplify switching between audio streams where the frame boundaries don't always line up across encodings (e.g., Vorbis).
For example, if I1 is associated with M1, M2, M3 then the above MUST hold for all the combinations I1+M1, I1+M2, I1+M1+M2, I1+M2+M3, etc.
Byte stream specifications MUST at a minimum define constraints which ensure that the above requirements hold. Additional constraints MAY be defined, for example to simplify implementation.
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The
key
words
MAY
,
MUST
,
MUST
NOT
,
SHOULD
,
and
SHOULD
NOT
in
this
document
are
to
be
interpreted
as
described
in
BCP
14
[
RFC2119
]
[
RFC8174
]
when,
and
only
when,
they
appear
in
all
capitals,
as
shown
here.
].
Example use of the Media Source Extensions
<script> function onSourceOpen(videoTag, e) { var mediaSource = e.target; if (mediaSource.sourceBuffers.length > 0) return; var sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"'); videoTag.addEventListener('seeking', onSeeking.bind(videoTag, mediaSource)); videoTag.addEventListener('progress', onProgress.bind(videoTag, mediaSource)); var initSegment = GetInitializationSegment(); if (initSegment == null) { // Error fetching the initialization segment. Signal end of stream with an error. mediaSource.endOfStream("network"); return; } // Append the initialization segment. var firstAppendHandler = function(e) { var sourceBuffer = e.target; sourceBuffer.removeEventListener('updateend', firstAppendHandler); // Append some initial media data. appendNextMediaSegment(mediaSource); }; sourceBuffer.addEventListener('updateend', firstAppendHandler); sourceBuffer.appendBuffer(initSegment); } function appendNextMediaSegment(mediaSource) { if (mediaSource.readyState == "closed") return; // If we have run out of stream data, then signal end of stream. if (!HaveMoreMediaSegments()) { mediaSource.endOfStream(); return; } // Make sure the previous append is not still pending. if (mediaSource.sourceBuffers[0].updating) return; var mediaSegment = GetNextMediaSegment(); if (!mediaSegment) { // Error fetching the next media segment. mediaSource.endOfStream("network"); return; } // NOTE: If mediaSource.readyState == “ended”, this appendBuffer() call will // cause mediaSource.readyState to transition to "open". The web application // should be prepared to handle multiple “sourceopen” events. mediaSource.sourceBuffers[0].appendBuffer(mediaSegment); } function onSeeking(mediaSource, e) { var video = e.target; if (mediaSource.readyState == "open") { // Abort current segment append. mediaSource.sourceBuffers[0].abort(); } // Notify the media segment loading code to start fetching data at the // new playback position. SeekToMediaSegmentAt(video.currentTime); // Append a media segment from the new playback position. appendNextMediaSegment(mediaSource); } function onProgress(mediaSource, e) { appendNextMediaSegment(mediaSource); } </script> <video id="v" autoplay> </video> <script> var video = document.getElementById('v'); var mediaSource = new MediaSource(); mediaSource.addEventListener('sourceopen', onSourceOpen.bind(this, video)); video.src = window.URL.createObjectURL(mediaSource); </script>
This section is non-normative.
The video playback quality metrics described in previous revisions of this specification (e.g., sections 5 and 10 of the Candidate Recommendation ) are now being developed as part of [ MEDIA-PLAYBACK-QUALITY ]. Some implementations may have implemented the earlier draft
VideoPlaybackQuality
object
and
the
HTMLVideoElement
extension
method
getVideoPlaybackQuality()
described
in
those
previous
revisions.