Skip to content

feat(catalog): add m2tsEsPid field and ES-level carriage mode - #22

Merged
mondain merged 4 commits into
mainfrom
feat/es-level-carriage
Aug 10, 2026
Merged

feat(catalog): add m2tsEsPid field and ES-level carriage mode#22
mondain merged 4 commits into
mainfrom
feat/es-level-carriage

Conversation

@gwendalsimon

Copy link
Copy Markdown
Collaborator

Summary

Introduces ES-level carriage as a third carriage mode alongside the existing unmodified and modified modes. When m2tsEsPid is present, a track carries exactly one elementary stream or signaling table, enabling subscribers to select and recombine individual streams independently.

  • New m2tsEsPid field (Optional, Number): identifies the single PID in the track. Requires m2tsModified: true. Forbids m2tsMpts, m2tsPmtPid, m2tsSiPids, and m2tsScte35Pid on the same track.
  • New §5.5.3 Modified ES-Level Carriage: specifies track payload rules (only packets for m2tsEsPid; no PAT, PMT, or null packets), PCR cross-track reference semantics, Group boundary synchronization requirement across ES-level tracks for the same program, subscriber recombination obligations (construct PAT+PMT, interleave packets, source PCR from PCR-bearing track), and altGroup semantics for alternate audio renditions.
  • MSF role values defined for SI-table and SCTE-35 tracks: "nit", "sdt", "eit", "tdt", "scte35".
  • §5.5 intro updated to describe three modes instead of two.
  • Field definitions updated: m2tsPmtPid, m2tsPcrPid, m2tsSiPids, m2tsScte35Pid each carry new constraints and explanations specific to ES-level tracks.
  • §8 Subscriber Processing updated: adds Group alignment and recombination requirements for ES-level subscribers.
  • New catalog example: four-track program (video, audio-en, audio-es, EIT) illustrating the ES-level pattern.

Test plan

  • Verify catalog example JSON is well-formed
  • Verify all m2tsEsPid constraint cross-references are consistent (m2tsPmtPid, m2tsSiPids, m2tsScte35Pid all MUST be absent)
  • Verify §5.5.3 and §8 subscriber processing paragraphs are consistent
  • Review role value table in the field definition for accuracy against DVB fixed PID assignments

🤖 Generated with Claude Code

Introduce ES-level carriage as a third mode alongside unmodified and
modified carriage. A track with `m2tsEsPid` present carries exactly one
elementary stream or signaling table per MOQT track, enabling per-ES
subscription and subscriber-side program recombination.

* Add optional `m2tsEsPid` Number field: identifies the single PID
  carried in the track; requires m2tsModified true; forbids m2tsMpts,
  m2tsPmtPid, m2tsSiPids, and m2tsScte35Pid
* Add §5.5.3 Modified ES-Level Carriage: defines track payload rules,
  PCR cross-track reference, Group boundary synchronization requirement,
  subscriber recombination obligations, and altGroup audio semantics
* Define MSF role values for SI-table and SCTE-35 ES-level tracks:
  "nit", "sdt", "eit", "tdt", "scte35"
* Update §5.5 intro to describe three carriage modes
* Update m2tsPmtPid, m2tsPcrPid, m2tsSiPids, m2tsScte35Pid definitions
  with ES-level constraints and cross-track PCR reference semantics
* Add ES-level subscriber processing paragraph to §8
* Add catalog example: video + two alternate audio tracks + EIT track

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@gwendalsimon
gwendalsimon requested a review from mondain as a code owner August 10, 2026 11:43
gwendalsimon and others added 3 commits August 10, 2026 14:33
Drop the inline PSI interleaving option. initDataList is the sole path
for PAT/PMT delivery in ES-level tracks, consistent with the m2tsEsPid
field definition which already commits to carrying only packets for that
PID.

* §5.5.3: remove sentence permitting inline PAT/PMT interleaving;
  replace with m2tsPsiInterval MUST be absent rationale
* m2tsPsiInterval definition: add explicit MUST be absent constraint
  when m2tsEsPid is present

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
altGroup carries mutually exclusive switching semantics in §9 (PCR
discontinuity, STC re-init, PAT/PMT re-parse on switch). Simultaneous
subscription to multiple tracks in the same altGroup contradicts that
definition. Language variants are also independent services, not ABR
alternate renditions, so altGroup is the wrong mechanism.

Subscribers select the audio language of their choice among the
published ES-level tracks using m2tsProgramNumber and role; no grouping
field is required.

* §5.5.3: remove altGroup paragraph
* catalog example: remove altGroup from both audio tracks; update
  description to drop "alternate" framing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
A subscriber combining a partial ES selection computes its own target
rate; PCR remains the authoritative timing reference. Allowing
m2tsMuxRate on individual ES-level tracks would imply a whole-program
rate applies to a partial selection, which is incorrect.

* m2tsMuxRate definition: add MUST be absent when m2tsEsPid is present
* §5.5.3: remove sentence directing subscriber to use m2tsMuxRate for
  CBR restoration in combined output

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@mondain
mondain merged commit bae1d99 into main Aug 10, 2026
2 checks passed
@mondain
mondain deleted the feat/es-level-carriage branch August 10, 2026 13:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants