Commit Graph
1094 Commits
Author SHA1 Message Date
Christian PillsburyandClaude Opus 4.8 0b8efb34bc refactor(spf): extract text-loader vocabulary to primitives behind a CueSink seam
Mirror of the v/a extraction for the text side. The text step vocabulary
(TextFrame/TextLoadStep/TextStepDeps/TextMessagePipelines/TextLoadTask/
TextTrackSegmentResolver + resolveCues/dispatchCues) and the cue-sink message
DTOs (AddCuesMessage/CueSegmentMeta) move out of the text loader / text-tracks
actor into primitives/. All DOM-free (generic over Cue), so they land in
primitives/ root.

The dispatch step reaches its sink through a structural CueSink seam instead of
the concrete TextTracksActor, so the pipeline names no actor; the loader keeps
only scheduling. actors/ (root) and engines/hls gain primitives references.

Net effect: relocation-pipelines now imports only core/media/primitives — zero
actors/behaviors. It's ready to move to primitives; only the DOM VTTCue in its
text step keeps it in behaviors/dom for now (slice 3).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 11:08:06 -07:00
Christian PillsburyandClaude Opus 4.8 a09473a372 refactor(spf): extract loader step vocabulary to primitives; match box-time by track_id
Bundled as one WIP checkpoint — the changes interleave in relocation-pipelines.ts
and media/types, so they can't be split per-file. To be curated before the PR.

- Match box-time by track_id: the default relocation pipeline now uses
  findMediaTrack + readBaseMediaDecodeTime (init tkhd track_id → segment tfhd
  track_id) instead of the first-traf presumptive readers, so muxed ISO-BMFF
  (e.g. a clcp caption traf) reads the media track's origin rather than relying
  on box order. Adds MediaContainerData.trackId + a caption-first-muxing test.

- Rename relocation-steps → relocation-pipelines; reframe it as the
  config-supplied, loader-facing half of establishStartMediaTime (the relocation
  analog of track-switching's constraint/rule chain).

- Extract the loader step vocabulary + base steps and the SourceBuffer message
  DTOs out of the actors into primitives/, behind a structural AppendSink seam so
  the pipeline names no concrete actor; the loader actors keep only scheduling.

- Decouple the vocabulary from the DOM: add media/types SegmentData and make
  media/dom AppendData an alias, so the whole v/a load pipeline lives DOM-free in
  primitives/ root.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-15 10:55:27 -07:00
Christian PillsburyandClaude Opus 4.8 2bb375ad00 docs(plan): non-zero-PTS relocation working notes
Spike/implementation working notes and pre-PR checklist. Internal AI-agent
context; drop or compact before merge if not wanted in the PR.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 15:08:10 -07:00
Christian PillsburyandClaude Opus 4.8 490207c00e docs(spf): presentation timeline coordinate model
Design doc for the 3-coordinate model (startTime / startDate / startMediaTime)
and the timestampOffset relocation approach the reactor + steps implement.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 12:00:38 -07:00
Christian PillsburyandClaude Opus 4.8 2733cba052 feat(spf): relocate non-zero-PTS sources to a 0-based timeline
Assets whose A/V encode starts at a non-zero native PTS (Mux instant clips,
Apple bipbop @10s) are relocated onto a 0-based presentation timeline via
`SourceBuffer.timestampOffset`, so buffer / model / `currentTime` / `seekable`
stay 0-based and the adapter is untouched.

- `establishStartMediaTime` reactor establishes each track's media-timeline
  origin once per source (the DOM-free half), running an injected
  `deriveStartMediaTime` seam over discovered container data.
- Default `deriveSharedMinStartMediaTime`: relocate every track by the `min`
  across selected A/V origins — preserves real A/V skew and keeps every DTS >= 0.
  Origins below NEAR_ZERO_ORIGIN_THRESHOLD (1s) are left native (ordinary
  ~0-PTS VOD isn't perturbed).
- `relocation-steps` message pipelines discover the origin (mdhd/tfdt head-peek)
  and stamp `timestampOffset`; text cues rebase by X-TIMESTAMP-MAP − origin.
- Wired into both the default and audio-only HLS engines.

See internal/design/spf/presentation-timeline-model.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 12:00:15 -07:00
Christian PillsburyandClaude Opus 4.8 c0cad09fd5 feat(spf): recover end-of-stream stall on skewed A/V
Make a complete VOD reach native `ended` (and loop) reliably even when audio
and video tracks end a few ms apart:

1. `end-of-stream` reactor gains LAST_SEGMENT_REACHED_SLACK (0.5s) on the
   "playhead reached the last segment" gate — a tiny final segment plus Chrome's
   audio-clock freeze otherwise deadlocks endOfStream().
2. New `recover-end-stall` behavior: on `waiting`, if the MediaSource is
   'ended' and the playhead is within endStallNudgeWindow (0.2s) of the
   reachable buffered end (getMinBufferedEnd over the SourceBuffers), nudge
   currentTime = duration to force native ended. Event-driven; inert for
   live / clean-ending streams.

ADR: internal/decisions/end-of-stream-av-skew-recovery.md

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 11:59:54 -07:00
Christian PillsburyandClaude Opus 4.8 57d3cb6574 feat(spf): parse VTT X-TIMESTAMP-MAP for text-segment metadata
Parse the WebVTT X-TIMESTAMP-MAP header (MPEGTS/LOCAL) and surface it as
text-segment metadata, so text-cue relocation can align cue times to the
relocated media timeline.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 11:59:39 -07:00
Christian PillsburyandClaude Opus 4.8 2dd9304414 feat(spf): add mp4 box parser and decode-time origin extraction
Minimal fMP4 box parser (media/mp4/box.ts) plus decode-time origin extraction
(timestamp-origin.ts) reading mdhd timescale + tfdt baseMediaDecodeTime, and a
head-peek primitive to read the leading bytes of a segment stream. Foundation
for relocating non-zero-PTS sources onto a 0-based presentation timeline.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-14 11:59:26 -07:00
82b9e43bb5 fix(i18n): error text updates (#1822)
Co-authored-by: Sam Potts <sam.potts@mux.com>
2026-07-13 08:19:18 +10:00
Sam PottsandGitHub c1348eaac8 fix(core): add missing i18n translations (#1817) 2026-07-09 20:28:46 -07:00
Sam PottsandGitHub 028dadb385 feat(packages): i18n (#1708) 2026-07-10 12:58:47 +10:00
Renzo DelfinoandGitHub 5f48fcc6d6 fix(docs): split ejected React skin sample into player + component files (#1588) 2026-07-09 16:59:57 -03:00
Santiago PuppoandGitHub 1a4cdb8373 refactor(spf): Changed adapter code to recycle engine on src change (#1813) 2026-07-09 13:41:53 -03:00
258101a19a docs(site): refresh write-guides page and align docs skill Diátaxis guidance (#1809)
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-07 14:36:04 -05:00
c3d70e50ac docs(site): rework Google Cast concept page and move it in the sidebar (#1806)
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-07 14:27:30 -05:00
Wesley LuytenGitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
9850e0c346 chore: release main (#1599)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
@videojs/store@10.0.0-beta.25 @videojs/spf@10.0.0-beta.25 @videojs/react@10.0.0-beta.25 @videojs/element@10.0.0-beta.25 @videojs/skins@10.0.0-beta.25 @videojs/core@10.0.0-beta.25 @videojs/icons@10.0.0-beta.25 @videojs/cli@10.0.0-beta.25 @videojs/utils@10.0.0-beta.25 @videojs/html@10.0.0-beta.25
2026-07-07 13:08:22 -05:00
Sam PottsandGitHub cc020b4b89 docs(site): add menu reference (#1673) 2026-07-07 13:06:19 -05:00
e060cf0d54 docs(site): backfill and prose-ify beta changelogs (#1794)
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-02 16:15:18 -07:00
854df60fcb fix(ci): relay release event through workflow_dispatch for changelog prose (#1792)
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-02 11:09:01 -07:00
050d963472 feat(site): add changelog section (#1793)
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-02 11:05:41 -07:00
2a8cbd0df4 fix(site): skip docs links for features without reference pages (#1394)
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-02 11:04:31 -07:00
fb50e331f2 perf(site): migrate markdown pipeline to Sätteri (#1733)
Co-authored-by: Claude <noreply@anthropic.com>
2026-07-02 10:10:35 -07:00
Sam PottsandGitHub 47e74a139e fix(html): avoid menu item value render loop (#1791) 2026-07-02 15:11:19 +10:00
6f6657a198 fix(react): memoize Provider context value (#1787)
Co-authored-by: James <james@BlainWebDesign.com>
2026-07-01 11:57:08 -07:00
Sam PottsandGitHub 561a2f2778 fix(test): update duration selectors for time inversion feature (#1760) 2026-07-01 17:55:40 +10:00
Sam PottsandGitHub be4d5a1155 feat(packages): add time display toggle (#1669) 2026-07-01 12:27:27 +10:00
0de3fef878 fix(skin): improve buffering, overlays, and input feedback (#1547)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-01 09:49:12 +10:00
7c3be22e8a fix(site): install musl resvg binary so Netlify can bundle the OG function (#1759)
Co-authored-by: Claude <noreply@anthropic.com>
2026-06-30 15:56:54 -07:00
131e176dde feat(packages): add pauseOnDrag to time slider (#1596)
Co-authored-by: shiminshen <16914659+shiminshen@users.noreply.github.com>
2026-06-30 13:55:59 -07:00
058fb8cfdd fix(react): recover from StoreError: DESTROYED on React <Activity> hide/reveal (#1587)
Co-authored-by: Manuel Calleriza <mcalleriza@mux.com>
2026-06-30 10:48:00 -07:00
Santiago PuppoandGitHub 3f2f4a4a5a feat(core): Support AirPlay on MSE (#1692) 2026-06-30 10:31:49 -07:00
Sam PottsandGitHub 5d44c4debf feat(packages): add audio tracks menu (#1714) 2026-06-30 13:40:24 +10:00
Sam PottsandGitHub f3652bd90b fix(skin): improvements to menu styles (#1725) 2026-06-30 11:32:09 +10:00
Sam PottsandGitHub 9ab7adefb7 fix(packages): handle menu child mutations (#1739) 2026-06-30 10:20:07 +10:00
Sam PottsandGitHub a6d30a9e61 fix(skin): aspect ratio related fixes (#1726) 2026-06-30 09:57:03 +10:00
01cea7a3d1 feat: add DASH, Mux, and Vimeo as installation source types (UI + CLI) (#1732)
Co-authored-by: Claude <noreply@anthropic.com>
2026-06-26 14:32:49 -07:00
Wesley LuytenandGitHub 29b3f0f00a fix(site): resolve api reference slug mismatch on airplay and hlsjs pages (#1755) 2026-06-26 14:10:25 -07:00
Wesley LuytenandGitHub d321522cf0 refactor(packages)!: rename hls media stack to hlsjs naming (#1753) 2026-06-26 11:59:39 -07:00
f1f2129739 feat: add a CDN media-availability manifest and read it across install surfaces (#1737)
Co-authored-by: Claude <noreply@anthropic.com>
2026-06-25 11:20:45 -07:00
Santiago PuppoandGitHub a74b8c0993 refactor: Rename SPF background-looping-video into background-video (#1731) 2026-06-24 11:09:20 -03:00
a5a7953603 chore(site): upgrade to Astro 7 and consolidate on Vite 8 (#1721)
Co-authored-by: Claude <noreply@anthropic.com>
2026-06-23 14:23:21 -07:00
Wesley LuytenandGitHub 0460a48d93 fix(core): upgrade dash.js to 5.2.0 (#1724) 2026-06-23 12:59:33 -07:00
b8b1709db5 fix(site): pre-bundle react-dom so dev islands hydrate (#1711)
Co-authored-by: Claude <noreply@anthropic.com>
2026-06-22 09:43:49 -07:00
23538e3649 feat(spf): text tracks switching (#1687)
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 07:54:51 -07:00
Darius CepulisandGitHub d799be1063 feat(site): API reference pages for media elements (#1342) 2026-06-19 09:44:54 -07:00
Sam PottsandGitHub 1512729365 fix(ci): run bundle size on stacked prs (#1713) 2026-06-19 14:48:58 +10:00
Sam PottsandGitHub ff694a0dd8 fix(skin): add missing classnames to tailwind menus (#1712) 2026-06-19 14:23:24 +10:00
17d6ebfc30 fix(ci): report lazy bundle chunks separately (#1710)
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-06-19 13:42:08 +10:00
edfec1c93e revert(core): unmerge i18n stack base (#1707)
Co-authored-by: Wesley Luyten <me@wesleyluyten.com>
2026-06-18 15:20:35 -07:00
f0f9eed544 refactor(core)!: move media capability predicates to core layer (#1705)
Co-authored-by: Rahim <rahim.alwer@gmail.com>
2026-06-18 15:00:26 -07:00