Context
The encoder (infinite-streaming-encoder) is moving to self-describing manifests: all fragment byte-range information now lives inside playlist.m3u8 and manifest_fragmented.mpd, and the per-segment .byteranges JSON sidecars are to be removed.
Verified against the sample encode insane_fpv_shots_hydrofoil_windsurfing_p200_h264_xs (encoded 2026-08-07):
- HLS —
<rung>/playlist.m3u8 carries the full part list:
#EXT-X-PART:DURATION=0.200200,URI="segment_00001.m4s",BYTERANGE="82678@432",INDEPENDENT=YES
- DASH —
manifest_fragmented.mpd carries per-fragment ranges:
<SegmentURL media="1080p/segment_00001.m4s" mediaRange="432-150105"/>
manifest.mpd stays at segment granularity (<SegmentURL media=.../>, no range).
The sidecar content is now strictly redundant — segment_00001.m4s.byteranges holds exactly the same offsets/lengths/independent flags as the #EXT-X-PART lines.
Problem
The HLS path is already ready. The DASH path is not.
HLS — OK. Both readers prefer the manifest and only fall back to sidecars:
go-live/pkg/parser/playlist.go:126 LoadPlaylistInfoWithByteranges builds ranges from parsed segment.Parts, falling back at :170 only when no parts were found.
go-live/pkg/parser/byterange.go:31 LoadByterangesForPlaylist parses #EXT-X-PART first, falls back to sidecars at :108.
DASH — broken. go-live/pkg/dash/mpd.go:619 loadByterangesForSegment() reads only <segment>.byteranges:
byterangesPath := segmentPath + ".byteranges"
payloadBytes, err := os.ReadFile(byterangesPath)
There is no manifest-derived path. go-live writes mediaRange on output (mpd.go:1107, :1135) but never reads it, and nothing in go-live/ or go-upload/ references manifest_fragmented.mpd.
Impact — silent degradation, not a hard failure
Both call sites treat a missing sidecar as "no partials" rather than an error:
mpd.go:580 → on err != nil || len(fragments) == 0, appends a single whole-segment virtualSegment{Offset: 0, Length: 0}.
mpd.go:1070 → usePartials block is skipped entirely when the read fails.
So once the encoder stops emitting sidecars, LL-DASH and the sub-6s DASH variants will quietly drop to whole-segment granularity. No error, no log line — the manifests just stop carrying partials. This is the dangerous part: it will look like it still works.
Proposed change
- Teach
go-live/pkg/dash to source fragment ranges from manifest_fragmented.mpd (SegmentURL/@mediaRange, grouped by @media), keyed the same way loadByterangesForSegment keys today.
- Keep the sidecar read as an explicit fallback for legacy content.
- Make the "no fragment data at all" case loud — log once per content that DASH partials are unavailable, instead of silently emitting whole-segment ranges.
Acceptance criteria
Related: sidecar removal cleanup (separate issue), near-CBR + ladder validation (separate issues).
Context
The encoder (
infinite-streaming-encoder) is moving to self-describing manifests: all fragment byte-range information now lives insideplaylist.m3u8andmanifest_fragmented.mpd, and the per-segment.byterangesJSON sidecars are to be removed.Verified against the sample encode
insane_fpv_shots_hydrofoil_windsurfing_p200_h264_xs(encoded 2026-08-07):<rung>/playlist.m3u8carries the full part list:#EXT-X-PART:DURATION=0.200200,URI="segment_00001.m4s",BYTERANGE="82678@432",INDEPENDENT=YESmanifest_fragmented.mpdcarries per-fragment ranges:<SegmentURL media="1080p/segment_00001.m4s" mediaRange="432-150105"/>manifest.mpdstays at segment granularity (<SegmentURL media=.../>, no range).The sidecar content is now strictly redundant —
segment_00001.m4s.byterangesholds exactly the same offsets/lengths/independent flags as the#EXT-X-PARTlines.Problem
The HLS path is already ready. The DASH path is not.
HLS — OK. Both readers prefer the manifest and only fall back to sidecars:
go-live/pkg/parser/playlist.go:126LoadPlaylistInfoWithByterangesbuilds ranges from parsedsegment.Parts, falling back at:170only when no parts were found.go-live/pkg/parser/byterange.go:31LoadByterangesForPlaylistparses#EXT-X-PARTfirst, falls back to sidecars at:108.DASH — broken.
go-live/pkg/dash/mpd.go:619loadByterangesForSegment()reads only<segment>.byteranges:There is no manifest-derived path. go-live writes
mediaRangeon output (mpd.go:1107,:1135) but never reads it, and nothing ingo-live/orgo-upload/referencesmanifest_fragmented.mpd.Impact — silent degradation, not a hard failure
Both call sites treat a missing sidecar as "no partials" rather than an error:
mpd.go:580→ onerr != nil || len(fragments) == 0, appends a single whole-segmentvirtualSegment{Offset: 0, Length: 0}.mpd.go:1070→usePartialsblock is skipped entirely when the read fails.So once the encoder stops emitting sidecars, LL-DASH and the sub-6s DASH variants will quietly drop to whole-segment granularity. No error, no log line — the manifests just stop carrying partials. This is the dangerous part: it will look like it still works.
Proposed change
go-live/pkg/dashto source fragment ranges frommanifest_fragmented.mpd(SegmentURL/@mediaRange, grouped by@media), keyed the same wayloadByterangesForSegmentkeys today.Acceptance criteria
insane_fpv_shots_hydrofoil_windsurfing_p200_h264_xswith all.byterangesfiles deleted carry the samemediaRangevalues as they do today with sidecars present.manifest_fragmented.mpdis unchanged.Related: sidecar removal cleanup (separate issue), near-CBR + ladder validation (separate issues).