Skip to content

Commit 44b3bb0

Browse files
authored
Merge pull request #6 from gwendalsimon/main
ABR switching, SCTE-35 splice signaling, and editorial polish
2 parents 1e95f72 + 80f54fc commit 44b3bb0

1 file changed

Lines changed: 88 additions & 11 deletions

File tree

draft-gregoire-moq-msfts.md

Lines changed: 88 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ This specification does not define:
144144
stream.
145145
* A replacement for Program Association Table, Program Map Table, PCR, PTS, DTS,
146146
continuity counter, or scrambling semantics defined by {{ISO138181}}.
147-
* A mandatory ABR switching model across separately encoded transport streams.
147+
* A mandatory Adaptive Bitrate (ABR) switching model across separately encoded transport streams.
148148
* A key management protocol.
149149

150150
# Media Packaging {#media-packaging}
@@ -184,8 +184,9 @@ discontinuous at that point until it reaches a subsequent random access point.
184184
## Object Boundaries {#object-boundaries}
185185

186186
Object boundaries are packaging boundaries and do not change MPEG-2 Transport
187-
Stream semantics. Continuity counters, adaptation fields, PCR, PTS, DTS, PSI,
188-
and other transport-stream syntax remain inside the source packets.
187+
Stream semantics. Continuity counters, adaptation fields, PCR, PTS, DTS,
188+
Program Specific Information (PSI), and other transport-stream syntax remain
189+
inside the source packets.
189190

190191
A publisher SHOULD place an independently usable random access point at the
191192
first media Object of each MOQT Group. For video, this normally means that the
@@ -204,15 +205,17 @@ For live streams, publishers SHOULD start a new MOQT Group at each point where
204205
the Group content is independently decodable without reference to prior Groups.
205206
For video, a valid Group start is any intra-coded access point at which all
206207
decoder references needed by that Group are present within the Group itself.
207-
IDR frames always satisfy this condition. A CRA frame MAY serve as a Group
208-
start only if no subsequent RASL pictures in that Group reference frames from
209-
a prior Group. Publishers are not required to start a new Group at every
210-
intra-coded access point: a CRA whose following RASL pictures reference only
211-
frames present earlier in the same Group may remain interior to that Group.
208+
Instantaneous Decoder Refresh (IDR) frames always satisfy this condition.
209+
A Clean Random Access (CRA) frame MAY serve as a Group start only if no
210+
subsequent Random Access Skipped Leading (RASL) pictures in that Group
211+
reference frames from a prior Group. Publishers are not required to start a
212+
new Group at every intra-coded access point: a CRA whose following RASL
213+
pictures reference only frames present earlier in the same Group may remain
214+
interior to that Group.
212215
The Object ID MUST increase by one for each Object within a Group unless MOQT
213216
delivery semantics permit gaps that are explicitly intended by the publisher.
214217

215-
For VOD streams, Group ID and Object ID assignment SHOULD be stable for a given
218+
For video-on-demand (VOD) streams, Group ID and Object ID assignment SHOULD be stable for a given
216219
asset so that relays and subscribers can cache and request repeatable ranges.
217220

218221
## Packetization {#packetization}
@@ -236,8 +239,8 @@ multi-program transport stream (MPTS) SHOULD produce a separate m2ts track
236239
for each program it wishes to offer, filtering the source packets so that
237240
each track contains only:
238241

239-
* Null packets (PID 0x1FFF), which MAY be removed or retained at the
240-
publisher's discretion.
242+
* Null packets with Packet Identifier (PID) 0x1FFF, which MAY be removed or
243+
retained at the publisher's discretion.
241244
* Program Association Table packets (PID 0x0000), rewritten to list only the
242245
program present in this track.
243246
* Program Map Table packets for the selected program (whose PID is listed in
@@ -279,6 +282,13 @@ discontinuity. Receivers that use the MSF Media Timeline {{MSF}} for playout
279282
timing can rely on its monotonic wall-clock abstraction independently of PCR
280283
wrap-around.
281284

285+
## Splice Signaling {#splice-signaling}
286+
287+
SCTE-35 splice information is carried transparently in the TS stream as
288+
splice_info_section() messages on their designated PID. Publishers MAY surface
289+
splice events via the MSF Event Timeline {{MSF}}. This document does not
290+
specify SCTE-35 processing.
291+
282292
# Catalog {#catalog}
283293

284294
An m2ts track is described by the MSF catalog {{MSF}}. The catalog track name,
@@ -302,6 +312,7 @@ Table 1 lists the m2ts-specific fields defined within a track object.
302312
| M2TS PSI interval | m2tsPsiInterval | {{m2ts-psi-interval}} |
303313
| M2TS random access | m2tsRandomAccess | {{m2ts-random-access}} |
304314
| M2TS timestamp mode | m2tsTimestampMode | {{m2ts-timestamp-mode}} |
315+
| M2TS SCTE-35 PID | m2tsScte35Pid | {{m2ts-scte35-pid}} |
305316
| Initialization data | initData | {{init-data}} |
306317

307318
## M2TS Packet Size {#m2ts-packet-size}
@@ -372,6 +383,16 @@ arrival-time or emission-time stamp associated with the following TS packet. Th
372383
value "opaque" indicates that the timestamp prefix is carried without specified
373384
semantics. This field MUST NOT be present when `m2tsPacketSize` is 188.
374385

386+
## M2TS SCTE-35 PID {#m2ts-scte35-pid}
387+
388+
Required: Optional JSON Type: Number Location: Track Object
389+
390+
The PID carrying SCTE-35 splice_info_section() messages for this track. This
391+
field is advisory; SCTE-35 messages are also discoverable via the PMT CA/registration
392+
descriptor. When present, receivers MAY use this value to locate splice events
393+
without parsing PMT. Publishers SHOULD include this field when the track carries
394+
SCTE-35 splice signaling.
395+
375396
## Initialization Data {#init-data}
376397

377398
Required: Optional JSON Type: String Location: Track Object
@@ -519,6 +540,59 @@ used because the programs carry different content.
519540
}
520541
~~~
521542

543+
## ABR Alternate Renditions — Two Bitrate Tracks {#example-abr}
544+
545+
This example shows a catalog for a live channel published at two bitrates as
546+
alternate renditions. Both tracks are in the same `altGroup`; video tracks
547+
MUST align Group boundaries at identical presentation positions. The tracks
548+
use different PID assignments: a subscriber switching between them MUST re-parse
549+
PAT and PMT on the new track before routing packets to a decoder.
550+
551+
~~~ json
552+
{
553+
"version": 1,
554+
"generatedAt": 1746104606044,
555+
"tracks": [
556+
{
557+
"name": "video-high",
558+
"namespace": "live.example.com/channel/1",
559+
"packaging": "m2ts",
560+
"isLive": true,
561+
"targetLatency": 1000,
562+
"role": "video",
563+
"mimeType": "video/mp2t",
564+
"bitrate": 6000000,
565+
"altGroup": 1,
566+
"m2tsPacketSize": 188,
567+
"m2tsPacketsPerObject": 64,
568+
"m2tsProgramNumber": 1,
569+
"m2tsPmtPid": 256,
570+
"m2tsPcrPid": 257,
571+
"m2tsPsiInterval": 100,
572+
"m2tsRandomAccess": true
573+
},
574+
{
575+
"name": "video-low",
576+
"namespace": "live.example.com/channel/1",
577+
"packaging": "m2ts",
578+
"isLive": true,
579+
"targetLatency": 1000,
580+
"role": "video",
581+
"mimeType": "video/mp2t",
582+
"bitrate": 2000000,
583+
"altGroup": 1,
584+
"m2tsPacketSize": 188,
585+
"m2tsPacketsPerObject": 64,
586+
"m2tsProgramNumber": 1,
587+
"m2tsPmtPid": 512,
588+
"m2tsPcrPid": 513,
589+
"m2tsPsiInterval": 100,
590+
"m2tsRandomAccess": true
591+
}
592+
]
593+
}
594+
~~~
595+
522596
# Subscriber Processing {#subscriber-processing}
523597

524598
A subscriber obtains the catalog using the MSF catalog workflow and subscribes
@@ -583,6 +657,9 @@ value received on the new track as the initial reference. In addition to the
583657
Group boundary alignment requirements above, publishers providing alternate
584658
tracks SHOULD align presentation timestamps at Group boundaries across tracks
585659
to enable seamless presentation switching at the application layer.
660+
Because PID assignments need not match across alternate tracks, a receiver
661+
MUST re-parse the PAT and PMT of the new track after every track switch before
662+
routing elementary-stream packets to a decoder.
586663

587664
# Content Protection {#content-protection}
588665

0 commit comments

Comments
 (0)