This specification defines a [[[MEDIA-SOURCE]]] [[MEDIA-SOURCE]] byte stream format specification based on MPEG-2 Transport Streams [[MPEG2TS]].

The working group maintains a list of all bug reports that the editors have not yet tried to address; there may also be related open bugs in the GitHub repository of the [[[MEDIA-SOURCE]]] specification.

Introduction

This specification defines segment formats for implementations of [[[MEDIA-SOURCE]]] [[MEDIA-SOURCE]] that choose to support MPEG-2 Transport Streams [[MPEG2TS]].

It defines the MIME-type parameters used to signal codecs, and provides the necessary format specific definitions for [=initialization segments=], [=media segments=], and [=random access points=] required by the Byte Stream Formats section of the [[[MEDIA-SOURCE]]] specification. This document also defines extra behaviors and state that only apply to this byte stream format.

MIME-type info

The MIME-type/subtype pair of "video/MP2T", as specified in [[RFC3551]], MUST be used for byte streams that conform to this specification.

The following parameter can be used in the MIME-type passed to {{MediaSource/isTypeSupported()}} or {{MediaSource/addSourceBuffer()}}.

codecs
A comma separated list of codec IDs used to specify what codecs will be used in the byte stream. Implementations SHOULD accept IDs in the form specified by [[RFC6381]].
Implementations MAY only implement a subset of the codecs and profiles mentioned in the RFC.

General Transport Stream Requirements

MPEG-2 TS [=media segments=] and [=initialization segments=] MUST conform to the MPEG-2 TS Adaptive Profile [[MPEG2TS]].

The user agent MUST run the [=append error=] algorithm if any of the following conditions are met:

  1. Segments do not contain complete MPEG-2 TS packets.
  2. Segments do not contain complete PES packets and sections.
  3. Segments contain more than one program.
  4. At least one MPEG-2 TS packet has a non-zero transport_error_indicator.

Initialization Segments

An MPEG-2 TS [=initialization segment=] consists of a single PAT and a single PMT.

The user agent MUST run the [=append error=] algorithm if any of the following conditions are met:

  1. A PAT is not present in the [=initialization segment=]
  2. A PMT is not present in the [=initialization segment=]

The user agent MUST accept and ignore other SI, such as CAT, that are invariant for all subsequent [=media segments=].

The user agent MUST source attribute values for `id`, `kind`, `label` and `language` for {{AudioTrack}}, {{VideoTrack}} and {{TextTrack}} objects as described for MPEG-2 Transport Streams in the in-band tracks spec [[INBANDTRACKS]].

Media Segments

The user agent MUST run the [=append error=] algorithm if any of the following conditions are met:

  1. A [=media segment=] relies on initialization information in another [=media segment=].
  2. At least one PES packet does not have a PTS timestamp.
  3. PCR is not present in the Segment prior to the first byte of a TS packet payload containing media data.
The user agent will accept and ignore PSI that is identical to the information in the last [=initialization segment=] which may appear repeatedly throughout the segment.

Random Access Points

A [=random access point=] as defined in this specification corresponds to Elementary Stream Random Access Point as defined in [[MPEG2TS]].

Timestamp Rollover & Discontinuities

Timestamp rollovers and discontinuities MUST be handled by the UA. The UA's MPEG-2 TS implementation MUST maintain an internal offset variable, MPEG2TS_timestampOffset, to keep track of the offset that needs to be applied to timestamps that have rolled over or are part of a discontinuity. MPEG2TS_timestampOffset is initially set to 0 when the SourceBuffer is created. This offset MUST be applied to the timestamps as part of the conversion process from MPEG-2 TS packets into [=coded frames=] for the [=coded frame processing=] algorithm. This results in the coded frame timestamps for a packet being computed by the following equations:

        Coded Frame Presentation Timestamp = (MPEG-2 TS presentation timestamp) + MPEG2TS_timestampOffset
        Coded Frame Decode Timestamp = (MPEG-2 TS decode timestamp) + MPEG2TS_timestampOffset

MPEG2TS_timestampOffset is updated in the following ways:

Acknowledgments

The editors would like to thank Alex Giladi, Bob Lund, David Singer, Duncan Rowden, Glenn Adams, Mark Vickers, and Michael Thornburgh for their contributions to this specification.