@videojs/spf 10.0.0-beta.3 → 10.0.0-beta.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -38
- package/dist/default/core/actors/create-machine-actor.js +91 -0
- package/dist/default/core/actors/create-machine-actor.js.map +1 -0
- package/dist/default/core/actors/create-transition-actor.js +46 -0
- package/dist/default/core/actors/create-transition-actor.js.map +1 -0
- package/dist/default/core/composition/create-composition.js +85 -0
- package/dist/default/core/composition/create-composition.js.map +1 -0
- package/dist/default/core/composition/share-signals.js +39 -0
- package/dist/default/core/composition/share-signals.js.map +1 -0
- package/dist/default/core/machine.js +26 -0
- package/dist/default/core/machine.js.map +1 -0
- package/dist/default/core/reactors/create-machine-reactor.js +83 -0
- package/dist/default/core/reactors/create-machine-reactor.js.map +1 -0
- package/dist/default/core/signals/effect.js +41 -0
- package/dist/default/core/signals/effect.js.map +1 -0
- package/dist/default/core/signals/primitives.js +54 -0
- package/dist/default/core/signals/primitives.js.map +1 -0
- package/dist/default/core/signals/when.js +38 -0
- package/dist/default/core/signals/when.js.map +1 -0
- package/dist/default/core/tasks/delayed-reschedule.js +31 -0
- package/dist/default/core/tasks/delayed-reschedule.js.map +1 -0
- package/dist/default/core/tasks/task.js +321 -0
- package/dist/default/core/tasks/task.js.map +1 -0
- package/dist/default/dom.js +9 -0
- package/dist/default/hls-audio.js +3 -0
- package/dist/default/hls-background-video.js +3 -0
- package/dist/default/hls-video.js +4 -0
- package/dist/default/hls.js +8 -0
- package/dist/default/index.js +23 -0
- package/dist/default/index.js.map +1 -0
- package/dist/default/media/abr/quality-selection.js +21 -0
- package/dist/default/media/abr/quality-selection.js.map +1 -0
- package/dist/default/media/buffer/back-buffer.js +46 -0
- package/dist/default/media/buffer/back-buffer.js.map +1 -0
- package/dist/default/media/buffer/forward-buffer.js +119 -0
- package/dist/default/media/buffer/forward-buffer.js.map +1 -0
- package/dist/default/media/dom/capabilities.js +72 -0
- package/dist/default/media/dom/capabilities.js.map +1 -0
- package/dist/default/media/dom/mse/append-segment.js +60 -0
- package/dist/default/media/dom/mse/append-segment.js.map +1 -0
- package/dist/default/media/dom/mse/buffer-flusher.js +55 -0
- package/dist/default/media/dom/mse/buffer-flusher.js.map +1 -0
- package/dist/default/media/dom/mse/duration.js +95 -0
- package/dist/default/media/dom/mse/duration.js.map +1 -0
- package/dist/default/media/dom/mse/end-of-stream.js +20 -0
- package/dist/default/media/dom/mse/end-of-stream.js.map +1 -0
- package/dist/default/media/dom/mse/mediasource-setup.js +242 -0
- package/dist/default/media/dom/mse/mediasource-setup.js.map +1 -0
- package/dist/default/media/dom/screen.js +112 -0
- package/dist/default/media/dom/screen.js.map +1 -0
- package/dist/default/media/dom/text/resolve-vtt-segment.js +50 -0
- package/dist/default/media/dom/text/resolve-vtt-segment.js.map +1 -0
- package/dist/default/media/dom/text/text-track-slots.js +69 -0
- package/dist/default/media/dom/text/text-track-slots.js.map +1 -0
- package/dist/default/media/errors.js +69 -0
- package/dist/default/media/errors.js.map +1 -0
- package/dist/default/media/hls/parse-attributes.js +148 -0
- package/dist/default/media/hls/parse-attributes.js.map +1 -0
- package/dist/default/media/hls/parse-media-playlist.js +261 -0
- package/dist/default/media/hls/parse-media-playlist.js.map +1 -0
- package/dist/default/media/hls/parse-multivariant.js +234 -0
- package/dist/default/media/hls/parse-multivariant.js.map +1 -0
- package/dist/default/media/hls/reload-policy.js +71 -0
- package/dist/default/media/hls/reload-policy.js.map +1 -0
- package/dist/default/media/hls/resolve-url.js +11 -0
- package/dist/default/media/hls/resolve-url.js.map +1 -0
- package/dist/default/media/live-window.js +36 -0
- package/dist/default/media/live-window.js.map +1 -0
- package/dist/default/media/media-tracks/media-tracks.js +101 -0
- package/dist/default/media/media-tracks/media-tracks.js.map +1 -0
- package/dist/default/media/mp4/box.js +58 -0
- package/dist/default/media/mp4/box.js.map +1 -0
- package/dist/default/media/mp4/timestamp-origin.js +107 -0
- package/dist/default/media/mp4/timestamp-origin.js.map +1 -0
- package/dist/default/media/primitives/resolution.js +29 -0
- package/dist/default/media/primitives/resolution.js.map +1 -0
- package/dist/default/media/primitives/select-tracks.js +107 -0
- package/dist/default/media/primitives/select-tracks.js.map +1 -0
- package/dist/default/media/text/parse-vtt-timestamp-map.js +42 -0
- package/dist/default/media/text/parse-vtt-timestamp-map.js.map +1 -0
- package/dist/default/media/text/resolve-vtt-metadata.js +23 -0
- package/dist/default/media/text/resolve-vtt-metadata.js.map +1 -0
- package/dist/default/media/types/index.js +50 -0
- package/dist/default/media/types/index.js.map +1 -0
- package/dist/default/media/utils/cdn.js +56 -0
- package/dist/default/media/utils/cdn.js.map +1 -0
- package/dist/default/media/utils/preload.js +22 -0
- package/dist/default/media/utils/preload.js.map +1 -0
- package/dist/default/media/utils/track-selection.js +47 -0
- package/dist/default/media/utils/track-selection.js.map +1 -0
- package/dist/default/media/utils/tracks.js +144 -0
- package/dist/default/media/utils/tracks.js.map +1 -0
- package/dist/default/media-tracks.js +2 -0
- package/dist/default/mux-audio.js +3 -0
- package/dist/default/mux-background-video.js +3 -0
- package/dist/default/mux-video.js +3 -0
- package/dist/default/network/bandwidth-estimator.js +96 -0
- package/dist/default/network/bandwidth-estimator.js.map +1 -0
- package/dist/default/network/chunked-stream-iterable.js +49 -0
- package/dist/default/network/chunked-stream-iterable.js.map +1 -0
- package/dist/default/network/ewma.js +71 -0
- package/dist/default/network/ewma.js.map +1 -0
- package/dist/default/network/fetch.js +115 -0
- package/dist/default/network/fetch.js.map +1 -0
- package/dist/default/playback/actors/dom/segment-loader.js +249 -0
- package/dist/default/playback/actors/dom/segment-loader.js.map +1 -0
- package/dist/default/playback/actors/dom/source-buffer.js +139 -0
- package/dist/default/playback/actors/dom/source-buffer.js.map +1 -0
- package/dist/default/playback/actors/dom/text-tracks.js +46 -0
- package/dist/default/playback/actors/dom/text-tracks.js.map +1 -0
- package/dist/default/playback/actors/text-track-segment-loader.js +149 -0
- package/dist/default/playback/actors/text-track-segment-loader.js.map +1 -0
- package/dist/default/playback/adapters/hls-audio/adapter.js +186 -0
- package/dist/default/playback/adapters/hls-audio/adapter.js.map +1 -0
- package/dist/default/playback/adapters/hls-audio/media.js +9 -0
- package/dist/default/playback/adapters/hls-audio/media.js.map +1 -0
- package/dist/default/playback/adapters/hls-background-video/adapter.js +211 -0
- package/dist/default/playback/adapters/hls-background-video/adapter.js.map +1 -0
- package/dist/default/playback/adapters/hls-background-video/host.js +60 -0
- package/dist/default/playback/adapters/hls-background-video/host.js.map +1 -0
- package/dist/default/playback/adapters/hls-background-video/media.js +21 -0
- package/dist/default/playback/adapters/hls-background-video/media.js.map +1 -0
- package/dist/default/playback/adapters/hls-video/adapter.js +316 -0
- package/dist/default/playback/adapters/hls-video/adapter.js.map +1 -0
- package/dist/default/playback/adapters/hls-video/error-surface.js +51 -0
- package/dist/default/playback/adapters/hls-video/error-surface.js.map +1 -0
- package/dist/default/playback/adapters/hls-video/media-tracks.js +126 -0
- package/dist/default/playback/adapters/hls-video/media-tracks.js.map +1 -0
- package/dist/default/playback/adapters/hls-video/media.js +11 -0
- package/dist/default/playback/adapters/hls-video/media.js.map +1 -0
- package/dist/default/playback/adapters/mux-audio/media.js +26 -0
- package/dist/default/playback/adapters/mux-audio/media.js.map +1 -0
- package/dist/default/playback/adapters/mux-video/adapter.js +105 -0
- package/dist/default/playback/adapters/mux-video/adapter.js.map +1 -0
- package/dist/default/playback/adapters/mux-video/media.js +23 -0
- package/dist/default/playback/adapters/mux-video/media.js.map +1 -0
- package/dist/default/playback/behaviors/calculate-presentation-duration.js +36 -0
- package/dist/default/playback/behaviors/calculate-presentation-duration.js.map +1 -0
- package/dist/default/playback/behaviors/collect-errors.js +111 -0
- package/dist/default/playback/behaviors/collect-errors.js.map +1 -0
- package/dist/default/playback/behaviors/derive-cdn-priority.js +68 -0
- package/dist/default/playback/behaviors/derive-cdn-priority.js.map +1 -0
- package/dist/default/playback/behaviors/dom/airplay.js +211 -0
- package/dist/default/playback/behaviors/dom/airplay.js.map +1 -0
- package/dist/default/playback/behaviors/dom/apply-start-position.js +93 -0
- package/dist/default/playback/behaviors/dom/apply-start-position.js.map +1 -0
- package/dist/default/playback/behaviors/dom/end-of-stream.js +102 -0
- package/dist/default/playback/behaviors/dom/end-of-stream.js.map +1 -0
- package/dist/default/playback/behaviors/dom/load-segments.js +181 -0
- package/dist/default/playback/behaviors/dom/load-segments.js.map +1 -0
- package/dist/default/playback/behaviors/dom/recover-end-stall.js +77 -0
- package/dist/default/playback/behaviors/dom/recover-end-stall.js.map +1 -0
- package/dist/default/playback/behaviors/dom/seek-to-live-edge.js +132 -0
- package/dist/default/playback/behaviors/dom/seek-to-live-edge.js.map +1 -0
- package/dist/default/playback/behaviors/dom/setup-buffer-actors.js +205 -0
- package/dist/default/playback/behaviors/dom/setup-buffer-actors.js.map +1 -0
- package/dist/default/playback/behaviors/dom/setup-mediasource.js +114 -0
- package/dist/default/playback/behaviors/dom/setup-mediasource.js.map +1 -0
- package/dist/default/playback/behaviors/dom/setup-text-track-actors.js +40 -0
- package/dist/default/playback/behaviors/dom/setup-text-track-actors.js.map +1 -0
- package/dist/default/playback/behaviors/dom/sync-live-seekable-range.js +26 -0
- package/dist/default/playback/behaviors/dom/sync-live-seekable-range.js.map +1 -0
- package/dist/default/playback/behaviors/dom/sync-text-tracks.js +124 -0
- package/dist/default/playback/behaviors/dom/sync-text-tracks.js.map +1 -0
- package/dist/default/playback/behaviors/dom/track-current-time.js +52 -0
- package/dist/default/playback/behaviors/dom/track-current-time.js.map +1 -0
- package/dist/default/playback/behaviors/dom/track-load-triggers.js +94 -0
- package/dist/default/playback/behaviors/dom/track-load-triggers.js.map +1 -0
- package/dist/default/playback/behaviors/dom/track-playback-rate.js +37 -0
- package/dist/default/playback/behaviors/dom/track-playback-rate.js.map +1 -0
- package/dist/default/playback/behaviors/dom/track-player-resolution.js +57 -0
- package/dist/default/playback/behaviors/dom/track-player-resolution.js.map +1 -0
- package/dist/default/playback/behaviors/dom/track-screen-resolution.js +29 -0
- package/dist/default/playback/behaviors/dom/track-screen-resolution.js.map +1 -0
- package/dist/default/playback/behaviors/dom/update-mediasource-duration.js +113 -0
- package/dist/default/playback/behaviors/dom/update-mediasource-duration.js.map +1 -0
- package/dist/default/playback/behaviors/establish-start-media-time.js +197 -0
- package/dist/default/playback/behaviors/establish-start-media-time.js.map +1 -0
- package/dist/default/playback/behaviors/resolve-presentation.js +85 -0
- package/dist/default/playback/behaviors/resolve-presentation.js.map +1 -0
- package/dist/default/playback/behaviors/resolve-track.js +141 -0
- package/dist/default/playback/behaviors/resolve-track.js.map +1 -0
- package/dist/default/playback/behaviors/select-tracks.js +216 -0
- package/dist/default/playback/behaviors/select-tracks.js.map +1 -0
- package/dist/default/playback/behaviors/setup-failover-monitor.js +66 -0
- package/dist/default/playback/behaviors/setup-failover-monitor.js.map +1 -0
- package/dist/default/playback/behaviors/sync-preload.js +59 -0
- package/dist/default/playback/behaviors/sync-preload.js.map +1 -0
- package/dist/default/playback/behaviors/track-switching.js +391 -0
- package/dist/default/playback/behaviors/track-switching.js.map +1 -0
- package/dist/default/playback/engines/hls/engine-audio-only.js +98 -0
- package/dist/default/playback/engines/hls/engine-audio-only.js.map +1 -0
- package/dist/default/playback/engines/hls/engine-background-video.js +92 -0
- package/dist/default/playback/engines/hls/engine-background-video.js.map +1 -0
- package/dist/default/playback/engines/hls/engine.js +147 -0
- package/dist/default/playback/engines/hls/engine.js.map +1 -0
- package/dist/default/playback/primitives/error-messages.js +51 -0
- package/dist/default/playback/primitives/error-messages.js.map +1 -0
- package/dist/default/playback/primitives/failover-fetch.js +42 -0
- package/dist/default/playback/primitives/failover-fetch.js.map +1 -0
- package/dist/default/playback/primitives/head-peek.js +44 -0
- package/dist/default/playback/primitives/head-peek.js.map +1 -0
- package/dist/default/playback/primitives/live-window.js +66 -0
- package/dist/default/playback/primitives/live-window.js.map +1 -0
- package/dist/default/playback/primitives/relocation-pipelines.js +203 -0
- package/dist/default/playback/primitives/relocation-pipelines.js.map +1 -0
- package/dist/default/playback/primitives/report-track-conditions.js +86 -0
- package/dist/default/playback/primitives/report-track-conditions.js.map +1 -0
- package/dist/default/playback/primitives/segment-load-pipeline.js +96 -0
- package/dist/default/playback/primitives/segment-load-pipeline.js.map +1 -0
- package/dist/default/playback/primitives/selection-rules.js +86 -0
- package/dist/default/playback/primitives/selection-rules.js.map +1 -0
- package/dist/default/playback/primitives/text-segment-load-pipeline.js +37 -0
- package/dist/default/playback/primitives/text-segment-load-pipeline.js.map +1 -0
- package/dist/default/playback/primitives/track-types.js +61 -0
- package/dist/default/playback/primitives/track-types.js.map +1 -0
- package/dist/dev/core/actors/actor.d.ts +26 -0
- package/dist/dev/core/actors/actor.d.ts.map +1 -0
- package/dist/dev/core/actors/create-machine-actor.d.ts +128 -0
- package/dist/dev/core/actors/create-machine-actor.d.ts.map +1 -0
- package/dist/dev/core/actors/create-machine-actor.js +91 -0
- package/dist/dev/core/actors/create-machine-actor.js.map +1 -0
- package/dist/dev/core/actors/create-transition-actor.d.ts +41 -0
- package/dist/dev/core/actors/create-transition-actor.d.ts.map +1 -0
- package/dist/dev/core/actors/create-transition-actor.js +46 -0
- package/dist/dev/core/actors/create-transition-actor.js.map +1 -0
- package/dist/dev/core/composition/create-composition.d.ts +273 -0
- package/dist/dev/core/composition/create-composition.d.ts.map +1 -0
- package/dist/dev/core/composition/create-composition.js +85 -0
- package/dist/dev/core/composition/create-composition.js.map +1 -0
- package/dist/dev/core/composition/share-signals.d.ts +46 -0
- package/dist/dev/core/composition/share-signals.d.ts.map +1 -0
- package/dist/dev/core/composition/share-signals.js +39 -0
- package/dist/dev/core/composition/share-signals.js.map +1 -0
- package/dist/dev/core/machine.d.ts +21 -0
- package/dist/dev/core/machine.d.ts.map +1 -0
- package/dist/dev/core/machine.js +26 -0
- package/dist/dev/core/machine.js.map +1 -0
- package/dist/dev/core/reactors/create-machine-reactor.d.ts +93 -0
- package/dist/dev/core/reactors/create-machine-reactor.d.ts.map +1 -0
- package/dist/dev/core/reactors/create-machine-reactor.js +83 -0
- package/dist/dev/core/reactors/create-machine-reactor.js.map +1 -0
- package/dist/dev/core/signals/effect.d.ts +15 -0
- package/dist/dev/core/signals/effect.d.ts.map +1 -0
- package/dist/dev/core/signals/effect.js +41 -0
- package/dist/dev/core/signals/effect.js.map +1 -0
- package/dist/dev/core/signals/primitives.d.ts +46 -0
- package/dist/dev/core/signals/primitives.d.ts.map +1 -0
- package/dist/dev/core/signals/primitives.js +54 -0
- package/dist/dev/core/signals/primitives.js.map +1 -0
- package/dist/dev/core/signals/when.js +38 -0
- package/dist/dev/core/signals/when.js.map +1 -0
- package/dist/dev/core/tasks/delayed-reschedule.js +31 -0
- package/dist/dev/core/tasks/delayed-reschedule.js.map +1 -0
- package/dist/dev/core/tasks/task.d.ts +166 -0
- package/dist/dev/core/tasks/task.d.ts.map +1 -0
- package/dist/dev/core/tasks/task.js +321 -0
- package/dist/dev/core/tasks/task.js.map +1 -0
- package/dist/dev/dom.d.ts +9 -0
- package/dist/dev/dom.js +9 -0
- package/dist/dev/hls-audio.d.ts +3 -0
- package/dist/dev/hls-audio.js +3 -0
- package/dist/dev/hls-background-video.d.ts +4 -0
- package/dist/dev/hls-background-video.js +3 -0
- package/dist/dev/hls-video.d.ts +5 -0
- package/dist/dev/hls-video.js +4 -0
- package/dist/dev/hls.d.ts +9 -0
- package/dist/dev/hls.js +8 -0
- package/dist/dev/index.d.ts +24 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +23 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/media/abr/quality-selection.d.ts +22 -0
- package/dist/dev/media/abr/quality-selection.d.ts.map +1 -0
- package/dist/dev/media/abr/quality-selection.js +21 -0
- package/dist/dev/media/abr/quality-selection.js.map +1 -0
- package/dist/dev/media/buffer/back-buffer.d.ts +14 -0
- package/dist/dev/media/buffer/back-buffer.d.ts.map +1 -0
- package/dist/dev/media/buffer/back-buffer.js +46 -0
- package/dist/dev/media/buffer/back-buffer.js.map +1 -0
- package/dist/dev/media/buffer/forward-buffer.d.ts +14 -0
- package/dist/dev/media/buffer/forward-buffer.d.ts.map +1 -0
- package/dist/dev/media/buffer/forward-buffer.js +119 -0
- package/dist/dev/media/buffer/forward-buffer.js.map +1 -0
- package/dist/dev/media/dom/capabilities.js +72 -0
- package/dist/dev/media/dom/capabilities.js.map +1 -0
- package/dist/dev/media/dom/mse/append-segment.d.ts +18 -0
- package/dist/dev/media/dom/mse/append-segment.d.ts.map +1 -0
- package/dist/dev/media/dom/mse/append-segment.js +60 -0
- package/dist/dev/media/dom/mse/append-segment.js.map +1 -0
- package/dist/dev/media/dom/mse/buffer-flusher.d.ts +24 -0
- package/dist/dev/media/dom/mse/buffer-flusher.d.ts.map +1 -0
- package/dist/dev/media/dom/mse/buffer-flusher.js +55 -0
- package/dist/dev/media/dom/mse/buffer-flusher.js.map +1 -0
- package/dist/dev/media/dom/mse/duration.js +95 -0
- package/dist/dev/media/dom/mse/duration.js.map +1 -0
- package/dist/dev/media/dom/mse/end-of-stream.js +20 -0
- package/dist/dev/media/dom/mse/end-of-stream.js.map +1 -0
- package/dist/dev/media/dom/mse/mediasource-setup.js +242 -0
- package/dist/dev/media/dom/mse/mediasource-setup.js.map +1 -0
- package/dist/dev/media/dom/screen.d.ts +7 -0
- package/dist/dev/media/dom/screen.d.ts.map +1 -0
- package/dist/dev/media/dom/screen.js +112 -0
- package/dist/dev/media/dom/screen.js.map +1 -0
- package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts +6 -0
- package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts.map +1 -0
- package/dist/dev/media/dom/text/resolve-vtt-segment.js +50 -0
- package/dist/dev/media/dom/text/resolve-vtt-segment.js.map +1 -0
- package/dist/dev/media/dom/text/text-track-slots.d.ts +30 -0
- package/dist/dev/media/dom/text/text-track-slots.d.ts.map +1 -0
- package/dist/dev/media/dom/text/text-track-slots.js +69 -0
- package/dist/dev/media/dom/text/text-track-slots.js.map +1 -0
- package/dist/dev/media/errors.d.ts +82 -0
- package/dist/dev/media/errors.d.ts.map +1 -0
- package/dist/dev/media/errors.js +69 -0
- package/dist/dev/media/errors.js.map +1 -0
- package/dist/dev/media/hls/parse-attributes.js +148 -0
- package/dist/dev/media/hls/parse-attributes.js.map +1 -0
- package/dist/dev/media/hls/parse-media-playlist.js +261 -0
- package/dist/dev/media/hls/parse-media-playlist.js.map +1 -0
- package/dist/dev/media/hls/parse-multivariant.js +234 -0
- package/dist/dev/media/hls/parse-multivariant.js.map +1 -0
- package/dist/dev/media/hls/reload-policy.js +71 -0
- package/dist/dev/media/hls/reload-policy.js.map +1 -0
- package/dist/dev/media/hls/resolve-url.js +11 -0
- package/dist/dev/media/hls/resolve-url.js.map +1 -0
- package/dist/dev/media/live-window.js +36 -0
- package/dist/dev/media/live-window.js.map +1 -0
- package/dist/dev/media/media-tracks/media-tracks.d.ts +51 -0
- package/dist/dev/media/media-tracks/media-tracks.d.ts.map +1 -0
- package/dist/dev/media/media-tracks/media-tracks.js +101 -0
- package/dist/dev/media/media-tracks/media-tracks.js.map +1 -0
- package/dist/dev/media/mp4/box.js +58 -0
- package/dist/dev/media/mp4/box.js.map +1 -0
- package/dist/dev/media/mp4/timestamp-origin.js +107 -0
- package/dist/dev/media/mp4/timestamp-origin.js.map +1 -0
- package/dist/dev/media/primitives/resolution.d.ts +24 -0
- package/dist/dev/media/primitives/resolution.d.ts.map +1 -0
- package/dist/dev/media/primitives/resolution.js +29 -0
- package/dist/dev/media/primitives/resolution.js.map +1 -0
- package/dist/dev/media/primitives/select-tracks.js +107 -0
- package/dist/dev/media/primitives/select-tracks.js.map +1 -0
- package/dist/dev/media/text/parse-vtt-timestamp-map.js +42 -0
- package/dist/dev/media/text/parse-vtt-timestamp-map.js.map +1 -0
- package/dist/dev/media/text/resolve-vtt-metadata.js +23 -0
- package/dist/dev/media/text/resolve-vtt-metadata.js.map +1 -0
- package/dist/dev/media/types/index.d.ts +377 -0
- package/dist/dev/media/types/index.d.ts.map +1 -0
- package/dist/dev/media/types/index.js +50 -0
- package/dist/dev/media/types/index.js.map +1 -0
- package/dist/dev/media/utils/cdn.d.ts +13 -0
- package/dist/dev/media/utils/cdn.d.ts.map +1 -0
- package/dist/dev/media/utils/cdn.js +56 -0
- package/dist/dev/media/utils/cdn.js.map +1 -0
- package/dist/dev/media/utils/preload.js +22 -0
- package/dist/dev/media/utils/preload.js.map +1 -0
- package/dist/dev/media/utils/track-selection.js +47 -0
- package/dist/dev/media/utils/track-selection.js.map +1 -0
- package/dist/dev/media/utils/tracks.js +144 -0
- package/dist/dev/media/utils/tracks.js.map +1 -0
- package/dist/dev/media-tracks.d.ts +3 -0
- package/dist/dev/media-tracks.js +2 -0
- package/dist/dev/mux-audio.d.ts +4 -0
- package/dist/dev/mux-audio.js +3 -0
- package/dist/dev/mux-background-video.d.ts +4 -0
- package/dist/dev/mux-background-video.js +3 -0
- package/dist/dev/mux-video.d.ts +4 -0
- package/dist/dev/mux-video.js +3 -0
- package/dist/dev/network/bandwidth-estimator.d.ts +50 -0
- package/dist/dev/network/bandwidth-estimator.d.ts.map +1 -0
- package/dist/dev/network/bandwidth-estimator.js +96 -0
- package/dist/dev/network/bandwidth-estimator.js.map +1 -0
- package/dist/dev/network/chunked-stream-iterable.js +49 -0
- package/dist/dev/network/chunked-stream-iterable.js.map +1 -0
- package/dist/dev/network/ewma.js +71 -0
- package/dist/dev/network/ewma.js.map +1 -0
- package/dist/dev/network/fetch.js +115 -0
- package/dist/dev/network/fetch.js.map +1 -0
- package/dist/dev/playback/actors/dom/segment-loader.d.ts +48 -0
- package/dist/dev/playback/actors/dom/segment-loader.d.ts.map +1 -0
- package/dist/dev/playback/actors/dom/segment-loader.js +249 -0
- package/dist/dev/playback/actors/dom/segment-loader.js.map +1 -0
- package/dist/dev/playback/actors/dom/source-buffer.d.ts +47 -0
- package/dist/dev/playback/actors/dom/source-buffer.d.ts.map +1 -0
- package/dist/dev/playback/actors/dom/source-buffer.js +139 -0
- package/dist/dev/playback/actors/dom/source-buffer.js.map +1 -0
- package/dist/dev/playback/actors/dom/text-tracks.d.ts +3 -0
- package/dist/dev/playback/actors/dom/text-tracks.js +46 -0
- package/dist/dev/playback/actors/dom/text-tracks.js.map +1 -0
- package/dist/dev/playback/actors/text-track-segment-loader.d.ts +54 -0
- package/dist/dev/playback/actors/text-track-segment-loader.d.ts.map +1 -0
- package/dist/dev/playback/actors/text-track-segment-loader.js +149 -0
- package/dist/dev/playback/actors/text-track-segment-loader.js.map +1 -0
- package/dist/dev/playback/actors/text-tracks.d.ts +33 -0
- package/dist/dev/playback/actors/text-tracks.d.ts.map +1 -0
- package/dist/dev/playback/adapters/hls-audio/adapter.d.ts +54 -0
- package/dist/dev/playback/adapters/hls-audio/adapter.d.ts.map +1 -0
- package/dist/dev/playback/adapters/hls-audio/adapter.js +186 -0
- package/dist/dev/playback/adapters/hls-audio/adapter.js.map +1 -0
- package/dist/dev/playback/adapters/hls-audio/media.d.ts +10 -0
- package/dist/dev/playback/adapters/hls-audio/media.d.ts.map +1 -0
- package/dist/dev/playback/adapters/hls-audio/media.js +9 -0
- package/dist/dev/playback/adapters/hls-audio/media.js.map +1 -0
- package/dist/dev/playback/adapters/hls-background-video/adapter.d.ts +77 -0
- package/dist/dev/playback/adapters/hls-background-video/adapter.d.ts.map +1 -0
- package/dist/dev/playback/adapters/hls-background-video/adapter.js +211 -0
- package/dist/dev/playback/adapters/hls-background-video/adapter.js.map +1 -0
- package/dist/dev/playback/adapters/hls-background-video/host.d.ts +38 -0
- package/dist/dev/playback/adapters/hls-background-video/host.d.ts.map +1 -0
- package/dist/dev/playback/adapters/hls-background-video/host.js +60 -0
- package/dist/dev/playback/adapters/hls-background-video/host.js.map +1 -0
- package/dist/dev/playback/adapters/hls-background-video/media.d.ts +20 -0
- package/dist/dev/playback/adapters/hls-background-video/media.d.ts.map +1 -0
- package/dist/dev/playback/adapters/hls-background-video/media.js +21 -0
- package/dist/dev/playback/adapters/hls-background-video/media.js.map +1 -0
- package/dist/dev/playback/adapters/hls-video/adapter.d.ts +63 -0
- package/dist/dev/playback/adapters/hls-video/adapter.d.ts.map +1 -0
- package/dist/dev/playback/adapters/hls-video/adapter.js +316 -0
- package/dist/dev/playback/adapters/hls-video/adapter.js.map +1 -0
- package/dist/dev/playback/adapters/hls-video/error-surface.d.ts +18 -0
- package/dist/dev/playback/adapters/hls-video/error-surface.d.ts.map +1 -0
- package/dist/dev/playback/adapters/hls-video/error-surface.js +51 -0
- package/dist/dev/playback/adapters/hls-video/error-surface.js.map +1 -0
- package/dist/dev/playback/adapters/hls-video/media-tracks.d.ts +22 -0
- package/dist/dev/playback/adapters/hls-video/media-tracks.d.ts.map +1 -0
- package/dist/dev/playback/adapters/hls-video/media-tracks.js +126 -0
- package/dist/dev/playback/adapters/hls-video/media-tracks.js.map +1 -0
- package/dist/dev/playback/adapters/hls-video/media.d.ts +10 -0
- package/dist/dev/playback/adapters/hls-video/media.d.ts.map +1 -0
- package/dist/dev/playback/adapters/hls-video/media.js +11 -0
- package/dist/dev/playback/adapters/hls-video/media.js.map +1 -0
- package/dist/dev/playback/adapters/mux-audio/media.d.ts +28 -0
- package/dist/dev/playback/adapters/mux-audio/media.d.ts.map +1 -0
- package/dist/dev/playback/adapters/mux-audio/media.js +26 -0
- package/dist/dev/playback/adapters/mux-audio/media.js.map +1 -0
- package/dist/dev/playback/adapters/mux-video/adapter.d.ts +34 -0
- package/dist/dev/playback/adapters/mux-video/adapter.d.ts.map +1 -0
- package/dist/dev/playback/adapters/mux-video/adapter.js +105 -0
- package/dist/dev/playback/adapters/mux-video/adapter.js.map +1 -0
- package/dist/dev/playback/adapters/mux-video/media.d.ts +24 -0
- package/dist/dev/playback/adapters/mux-video/media.d.ts.map +1 -0
- package/dist/dev/playback/adapters/mux-video/media.js +23 -0
- package/dist/dev/playback/adapters/mux-video/media.js.map +1 -0
- package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts +26 -0
- package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/calculate-presentation-duration.js +36 -0
- package/dist/dev/playback/behaviors/calculate-presentation-duration.js.map +1 -0
- package/dist/dev/playback/behaviors/collect-errors.js +111 -0
- package/dist/dev/playback/behaviors/collect-errors.js.map +1 -0
- package/dist/dev/playback/behaviors/derive-cdn-priority.js +68 -0
- package/dist/dev/playback/behaviors/derive-cdn-priority.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/airplay.js +211 -0
- package/dist/dev/playback/behaviors/dom/airplay.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/apply-start-position.js +93 -0
- package/dist/dev/playback/behaviors/dom/apply-start-position.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/end-of-stream.js +102 -0
- package/dist/dev/playback/behaviors/dom/end-of-stream.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/load-segments.d.ts +72 -0
- package/dist/dev/playback/behaviors/dom/load-segments.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/dom/load-segments.js +181 -0
- package/dist/dev/playback/behaviors/dom/load-segments.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/recover-end-stall.js +77 -0
- package/dist/dev/playback/behaviors/dom/recover-end-stall.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/seek-to-live-edge.js +132 -0
- package/dist/dev/playback/behaviors/dom/seek-to-live-edge.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js +205 -0
- package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/setup-mediasource.js +114 -0
- package/dist/dev/playback/behaviors/dom/setup-mediasource.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts +28 -0
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js +40 -0
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/sync-live-seekable-range.js +26 -0
- package/dist/dev/playback/behaviors/dom/sync-live-seekable-range.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/sync-text-tracks.js +124 -0
- package/dist/dev/playback/behaviors/dom/sync-text-tracks.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-current-time.d.ts +33 -0
- package/dist/dev/playback/behaviors/dom/track-current-time.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-current-time.js +52 -0
- package/dist/dev/playback/behaviors/dom/track-current-time.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts +47 -0
- package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-load-triggers.js +94 -0
- package/dist/dev/playback/behaviors/dom/track-load-triggers.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts +33 -0
- package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-playback-rate.js +37 -0
- package/dist/dev/playback/behaviors/dom/track-playback-rate.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-player-resolution.d.ts +8 -0
- package/dist/dev/playback/behaviors/dom/track-player-resolution.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-player-resolution.js +57 -0
- package/dist/dev/playback/behaviors/dom/track-player-resolution.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/track-screen-resolution.js +29 -0
- package/dist/dev/playback/behaviors/dom/track-screen-resolution.js.map +1 -0
- package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js +113 -0
- package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js.map +1 -0
- package/dist/dev/playback/behaviors/establish-start-media-time.d.ts +36 -0
- package/dist/dev/playback/behaviors/establish-start-media-time.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/establish-start-media-time.js +197 -0
- package/dist/dev/playback/behaviors/establish-start-media-time.js.map +1 -0
- package/dist/dev/playback/behaviors/resolve-presentation.d.ts +8 -0
- package/dist/dev/playback/behaviors/resolve-presentation.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/resolve-presentation.js +85 -0
- package/dist/dev/playback/behaviors/resolve-presentation.js.map +1 -0
- package/dist/dev/playback/behaviors/resolve-track.js +141 -0
- package/dist/dev/playback/behaviors/resolve-track.js.map +1 -0
- package/dist/dev/playback/behaviors/select-tracks.d.ts +72 -0
- package/dist/dev/playback/behaviors/select-tracks.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/select-tracks.js +216 -0
- package/dist/dev/playback/behaviors/select-tracks.js.map +1 -0
- package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts +14 -0
- package/dist/dev/playback/behaviors/setup-failover-monitor.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/setup-failover-monitor.js +66 -0
- package/dist/dev/playback/behaviors/setup-failover-monitor.js.map +1 -0
- package/dist/dev/playback/behaviors/sync-preload.js +59 -0
- package/dist/dev/playback/behaviors/sync-preload.js.map +1 -0
- package/dist/dev/playback/behaviors/track-switching.js +391 -0
- package/dist/dev/playback/behaviors/track-switching.js.map +1 -0
- package/dist/dev/playback/engines/hls/engine-audio-only.d.ts +173 -0
- package/dist/dev/playback/engines/hls/engine-audio-only.d.ts.map +1 -0
- package/dist/dev/playback/engines/hls/engine-audio-only.js +98 -0
- package/dist/dev/playback/engines/hls/engine-audio-only.js.map +1 -0
- package/dist/dev/playback/engines/hls/engine-background-video.d.ts +158 -0
- package/dist/dev/playback/engines/hls/engine-background-video.d.ts.map +1 -0
- package/dist/dev/playback/engines/hls/engine-background-video.js +92 -0
- package/dist/dev/playback/engines/hls/engine-background-video.js.map +1 -0
- package/dist/dev/playback/engines/hls/engine.d.ts +329 -0
- package/dist/dev/playback/engines/hls/engine.d.ts.map +1 -0
- package/dist/dev/playback/engines/hls/engine.js +147 -0
- package/dist/dev/playback/engines/hls/engine.js.map +1 -0
- package/dist/dev/playback/primitives/derive-start-media-time.d.ts +16 -0
- package/dist/dev/playback/primitives/derive-start-media-time.d.ts.map +1 -0
- package/dist/dev/playback/primitives/error-messages.js +51 -0
- package/dist/dev/playback/primitives/error-messages.js.map +1 -0
- package/dist/dev/playback/primitives/failover-fetch.js +42 -0
- package/dist/dev/playback/primitives/failover-fetch.js.map +1 -0
- package/dist/dev/playback/primitives/head-peek.js +44 -0
- package/dist/dev/playback/primitives/head-peek.js.map +1 -0
- package/dist/dev/playback/primitives/live-window.js +66 -0
- package/dist/dev/playback/primitives/live-window.js.map +1 -0
- package/dist/dev/playback/primitives/relocation-pipelines.js +203 -0
- package/dist/dev/playback/primitives/relocation-pipelines.js.map +1 -0
- package/dist/dev/playback/primitives/report-track-conditions.d.ts +11 -0
- package/dist/dev/playback/primitives/report-track-conditions.d.ts.map +1 -0
- package/dist/dev/playback/primitives/report-track-conditions.js +86 -0
- package/dist/dev/playback/primitives/report-track-conditions.js.map +1 -0
- package/dist/dev/playback/primitives/segment-load-pipeline.d.ts +2 -0
- package/dist/dev/playback/primitives/segment-load-pipeline.js +96 -0
- package/dist/dev/playback/primitives/segment-load-pipeline.js.map +1 -0
- package/dist/dev/playback/primitives/selection-rules.d.ts +38 -0
- package/dist/dev/playback/primitives/selection-rules.d.ts.map +1 -0
- package/dist/dev/playback/primitives/selection-rules.js +86 -0
- package/dist/dev/playback/primitives/selection-rules.js.map +1 -0
- package/dist/dev/playback/primitives/source-buffer-messages.d.ts +43 -0
- package/dist/dev/playback/primitives/source-buffer-messages.d.ts.map +1 -0
- package/dist/dev/playback/primitives/text-segment-load-pipeline.d.ts +65 -0
- package/dist/dev/playback/primitives/text-segment-load-pipeline.d.ts.map +1 -0
- package/dist/dev/playback/primitives/text-segment-load-pipeline.js +37 -0
- package/dist/dev/playback/primitives/text-segment-load-pipeline.js.map +1 -0
- package/dist/dev/playback/primitives/text-track-messages.d.ts +14 -0
- package/dist/dev/playback/primitives/text-track-messages.d.ts.map +1 -0
- package/dist/dev/playback/primitives/track-types.js +61 -0
- package/dist/dev/playback/primitives/track-types.js.map +1 -0
- package/package.json +63 -26
- package/dist/adapter-CMw-rvbk.js +0 -3512
- package/dist/adapter-CMw-rvbk.js.map +0 -1
- package/dist/adapter-l8iJN_GI.d.ts +0 -689
- package/dist/adapter-l8iJN_GI.d.ts.map +0 -1
- package/dist/dom/index.d.ts +0 -243
- package/dist/dom/index.d.ts.map +0 -1
- package/dist/dom/index.js +0 -38
- package/dist/dom/index.js.map +0 -1
- package/dist/dom/playback-engine/index.d.ts +0 -2
- package/dist/dom/playback-engine/index.js +0 -4
- package/dist/index.d.ts +0 -13
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -3
- package/dist/src-DRsS_H80.js +0 -14
- package/dist/src-DRsS_H80.js.map +0 -1
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { AudioTrack, CanPlayTrack, MaybeResolvedPresentation, MediaContainerData } from "../../../media/types/index.js";
|
|
2
|
+
import { Composition, ContextSignals, StateSignals } from "../../../core/composition/create-composition.js";
|
|
3
|
+
import { ShareSignalsConfig } from "../../../core/composition/share-signals.js";
|
|
4
|
+
import { BackBufferConfig } from "../../../media/buffer/back-buffer.js";
|
|
5
|
+
import { ForwardBufferConfig } from "../../../media/buffer/forward-buffer.js";
|
|
6
|
+
import { SourceBufferActor } from "../../actors/dom/source-buffer.js";
|
|
7
|
+
import { SegmentLoaderActor } from "../../actors/dom/segment-loader.js";
|
|
8
|
+
import { SvtaError } from "../../../media/errors.js";
|
|
9
|
+
import { GetCdnId } from "../../../media/utils/cdn.js";
|
|
10
|
+
import { PresentationDurationResolver } from "../../behaviors/calculate-presentation-duration.js";
|
|
11
|
+
import { DeriveStartMediaTime } from "../../primitives/derive-start-media-time.js";
|
|
12
|
+
import "../../behaviors/establish-start-media-time.js";
|
|
13
|
+
import { ParsePresentation } from "../../behaviors/resolve-presentation.js";
|
|
14
|
+
import { FailoverMonitorConfig } from "../../behaviors/setup-failover-monitor.js";
|
|
15
|
+
import { ReportUnsupportedTrackConditions } from "../../primitives/report-track-conditions.js";
|
|
16
|
+
//#region src/playback/engines/hls/engine-audio-only.d.ts
|
|
17
|
+
/**
|
|
18
|
+
* State shape for the audio-only HLS playback engine.
|
|
19
|
+
*
|
|
20
|
+
* Subset of `HlsVideoEngineState` covering only the slots written and read
|
|
21
|
+
* by audio-side behaviors. Video and text-track slots are absent —
|
|
22
|
+
* subtractive composition removes the behaviors that declare them.
|
|
23
|
+
*/
|
|
24
|
+
interface HlsAudioEngineState {
|
|
25
|
+
presentation?: MaybeResolvedPresentation;
|
|
26
|
+
preload?: 'auto' | 'metadata' | 'none';
|
|
27
|
+
selectedAudioTrackId?: string;
|
|
28
|
+
mediaContainerData?: Record<string, MediaContainerData>;
|
|
29
|
+
/**
|
|
30
|
+
* Consumer-driven constraint narrowing the audio candidate set. Sibling
|
|
31
|
+
* of `userVideoTrackSelection` in the default engine. Partial-track
|
|
32
|
+
* shape — `{ language: 'es' }`, `{ id: 'audio-en' }`, etc.
|
|
33
|
+
* `selectAudioTrack` reads this and re-picks when it changes.
|
|
34
|
+
* Multi-language-audio Tier 2 programmatic-write path.
|
|
35
|
+
*/
|
|
36
|
+
userAudioTrackSelection?: Partial<AudioTrack>;
|
|
37
|
+
/**
|
|
38
|
+
* The CDNs the source is served from, in manifest priority order (mirrors
|
|
39
|
+
* HLS content steering's `PATHWAY-PRIORITY`). Owned by `deriveCdnPriority`,
|
|
40
|
+
* read by `track-switching`'s `preferActiveCdn` scope. Only meaningful for
|
|
41
|
+
* redundant-stream sources; a single-CDN source has one entry.
|
|
42
|
+
*/
|
|
43
|
+
cdnPriority?: string[];
|
|
44
|
+
/**
|
|
45
|
+
* CDN ids currently in failover cooldown — read by `track-switching`'s
|
|
46
|
+
* `excludeFailedCdns` constraint, which prunes their tracks so the active-CDN
|
|
47
|
+
* scope falls to the next CDN. Empty / absent means all CDNs are eligible.
|
|
48
|
+
*/
|
|
49
|
+
failedCdns?: string[];
|
|
50
|
+
/**
|
|
51
|
+
* Conditions reported during playback, in order — appended by whichever
|
|
52
|
+
* behavior detects one, owned and cleared per source by `collectErrors`.
|
|
53
|
+
* Severity is decided above the engine. Audio-only makes an all-audio-pruned
|
|
54
|
+
* source unrecoverable: there's no video fallback to fall back to.
|
|
55
|
+
*/
|
|
56
|
+
errors?: SvtaError[];
|
|
57
|
+
currentTime?: number;
|
|
58
|
+
loadActivated?: boolean;
|
|
59
|
+
/**
|
|
60
|
+
* One-shot command: start the current source at this position
|
|
61
|
+
* (presentation-timeline seconds). Written by consumers or by
|
|
62
|
+
* `setupAirPlay`'s session-end snapshot; consumed (cleared) by
|
|
63
|
+
* `applyStartPosition` once the element seeks. See
|
|
64
|
+
* `behaviors/dom/apply-start-position.ts`.
|
|
65
|
+
*/
|
|
66
|
+
startPosition?: number;
|
|
67
|
+
/**
|
|
68
|
+
* Intent-level loading policy: initiate no new loading work while `true`.
|
|
69
|
+
* Written by `setupAirPlay` (the only behavior declaring the key) while a
|
|
70
|
+
* remote-playback session owns presentation; observed by `loadAudioSegments`
|
|
71
|
+
* (parks in `'dormant'`) and by `setupMediaSource` (a pending rebuild
|
|
72
|
+
* waits). See `SegmentLoadingState['loadingSuspended']`.
|
|
73
|
+
*/
|
|
74
|
+
loadingSuspended?: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* Author intent for the AirPlay/remote-playback picker, written by the media
|
|
77
|
+
* adapter's `disableRemotePlayback` IDL property. `true` is an explicit
|
|
78
|
+
* opt-out: `setupAirPlay` reads it at attach and sets nothing up, leaving the
|
|
79
|
+
* element's remote playback disabled. Distinct from the underlying media
|
|
80
|
+
* element's own `disableRemotePlayback`, which stays programmatically managed
|
|
81
|
+
* (ManagedMediaSource / AirPlay).
|
|
82
|
+
*/
|
|
83
|
+
disableRemotePlayback?: boolean;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Context shape for the audio-only HLS playback engine.
|
|
87
|
+
*
|
|
88
|
+
* Subset of `HlsVideoEngineContext` covering only the platform objects and
|
|
89
|
+
* actor refs managed by audio-side behaviors.
|
|
90
|
+
*/
|
|
91
|
+
interface HlsAudioEngineContext {
|
|
92
|
+
mediaElement?: HTMLMediaElement | undefined;
|
|
93
|
+
mediaSource?: MediaSource;
|
|
94
|
+
audioBufferActor?: SourceBufferActor;
|
|
95
|
+
audioSegmentLoaderActor?: SegmentLoaderActor;
|
|
96
|
+
}
|
|
97
|
+
type HlsAudioEngineSignals = {
|
|
98
|
+
state: StateSignals<HlsAudioEngineState>;
|
|
99
|
+
context: ContextSignals<HlsAudioEngineContext>;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Configuration for the audio-only HLS playback engine.
|
|
103
|
+
*
|
|
104
|
+
* Subset of `HlsVideoEngineConfig` — video-quality, bandwidth-estimator,
|
|
105
|
+
* and text-track config fields are omitted (no behavior consumes them).
|
|
106
|
+
*/
|
|
107
|
+
interface HlsAudioEngineConfig extends ShareSignalsConfig<HlsAudioEngineState, HlsAudioEngineContext> {
|
|
108
|
+
preferredAudioLanguage?: string;
|
|
109
|
+
/**
|
|
110
|
+
* Codec capability probe read by `track-switching`'s `excludeUnplayableTracks`
|
|
111
|
+
* constraint. Defaults to the `MediaSource.isTypeSupported`-backed
|
|
112
|
+
* `canPlayTrack`; override to force-exclude a codec. Mirrors the default
|
|
113
|
+
* engine — without it, capability probing (and TS / raw-AAC detection) would
|
|
114
|
+
* be inert for audio-only playback.
|
|
115
|
+
*/
|
|
116
|
+
canPlayTrack?: CanPlayTrack;
|
|
117
|
+
/**
|
|
118
|
+
* Conditions reported about each rendition as it resolves — the *causes* behind
|
|
119
|
+
* a later verdict, and the copy a verdict reuses when they agree. Defaults to
|
|
120
|
+
* {@link reportUnsupportedTrackConditions}, which reports non-fMP4 containers
|
|
121
|
+
* and encryption; supply your own to report a different set (a provider that
|
|
122
|
+
* never ships MPEG-TS can drop that check) or `() => []` to report nothing.
|
|
123
|
+
*/
|
|
124
|
+
reportUnsupportedTrackConditions?: ReportUnsupportedTrackConditions;
|
|
125
|
+
resolveDuration?: PresentationDurationResolver;
|
|
126
|
+
parsePresentation?: ParsePresentation;
|
|
127
|
+
forwardBuffer?: Partial<ForwardBufferConfig>;
|
|
128
|
+
backBuffer?: Partial<BackBufferConfig>;
|
|
129
|
+
/** Multi-CDN failover monitor tuning. Defaults: `DEFAULT_FAILOVER_MONITOR_CONFIG`. */
|
|
130
|
+
failover?: Partial<FailoverMonitorConfig>;
|
|
131
|
+
/**
|
|
132
|
+
* Derive a CDN grouping key from a track URL (used by `cdnPriority`, the
|
|
133
|
+
* failover trip, and the track-switching CDN rules — one function read by all).
|
|
134
|
+
* Defaults to the URL origin; override to key on e.g. Mux's `cdn=` param.
|
|
135
|
+
*/
|
|
136
|
+
getCdnId?: GetCdnId;
|
|
137
|
+
/** Non-zero-PTS relocation (spike): the reduce seam (tier knob); defaults to per-track own. */
|
|
138
|
+
deriveStartMediaTime?: DeriveStartMediaTime;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Create an audio-only HLS playback engine.
|
|
142
|
+
*
|
|
143
|
+
* Subtractive composition variant of `createHlsVideoEngine`: omits
|
|
144
|
+
* video-side behaviors (`resolveVideoTrack`, `switchVideoTrack`,
|
|
145
|
+
* `setupVideoBufferActors`, `loadVideoSegments`) and text-track behaviors
|
|
146
|
+
* (`switchTextTrack`, `resolveTextTrack`, `syncTextTracks`,
|
|
147
|
+
* `setupTextTrackActors`, `loadTextTrackSegments`). The remaining audio
|
|
148
|
+
* pipeline composes unchanged.
|
|
149
|
+
*
|
|
150
|
+
* Handles both truly audio-only HLS sources (no video stream-inf) and
|
|
151
|
+
* mixed-AV HLS sources where the audio rendition is selected and video /
|
|
152
|
+
* subtitle renditions are ignored at composition time. The variant decision
|
|
153
|
+
* is encoded by adapter choice; this engine does not branch on source
|
|
154
|
+
* shape.
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```ts
|
|
158
|
+
* let signals: HlsAudioEngineSignals;
|
|
159
|
+
* const engine = createHlsAudioEngine({
|
|
160
|
+
* preferredAudioLanguage: 'en',
|
|
161
|
+
* onSignalsReady: (refs) => {
|
|
162
|
+
* signals = refs;
|
|
163
|
+
* },
|
|
164
|
+
* });
|
|
165
|
+
*
|
|
166
|
+
* signals.context.mediaElement.set(audioEl);
|
|
167
|
+
* signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
declare function createHlsAudioEngine(config?: HlsAudioEngineConfig): Composition<HlsAudioEngineState, HlsAudioEngineContext>;
|
|
171
|
+
//#endregion
|
|
172
|
+
export { HlsAudioEngineConfig, HlsAudioEngineContext, HlsAudioEngineSignals, HlsAudioEngineState, createHlsAudioEngine };
|
|
173
|
+
//# sourceMappingURL=engine-audio-only.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-audio-only.d.ts","names":[],"sources":["../../../../../src/playback/engines/hls/engine-audio-only.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;UAgEiB;EACf,eAAe;EACf;EACA;EAGA,qBAAqB,eAAe;;;;;;;;EAQpC,0BAA0B,QAAQ;;;;;;;EAOlC;;;;;;EAMA;;;;;;;EAOA,SAAS;EACT;EACA;;;;;;;;EAQA;;;;;;;;EAQA;;;;;;;;;EASA;;;;;;;;UASe;EACf,eAAe;EACf,cAAc;EACd,mBAAmB;EACnB,0BAA0B;;KAGhB;EACV,OAAO,aAAa;EACpB,SAAS,eAAe;;;;;;;;UAST,6BAA6B,mBAAmB,qBAAqB;EACpF;;;;;;;;EAQA,eAAe;;;;;;;;EAQf,mCAAmC;EACnC,kBAAkB;EAClB,oBAAoB;EACpB,gBAAgB,QAAQ;EACxB,aAAa,QAAQ;;EAErB,WAAW,QAAQ;;;;;;EAMnB,WAAW;;EAEX,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+CT,qBACd,SAAQ,uBACP,YAAY,qBAAqB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { createComposition } from "../../../core/composition/create-composition.js";
|
|
2
|
+
import { makeShareSignals } from "../../../core/composition/share-signals.js";
|
|
3
|
+
import { loadAudioSegments } from "../../behaviors/dom/load-segments.js";
|
|
4
|
+
import { trackCurrentTime } from "../../behaviors/dom/track-current-time.js";
|
|
5
|
+
import { trackLoadTriggers } from "../../behaviors/dom/track-load-triggers.js";
|
|
6
|
+
import { deriveSharedMinStartMediaTime, establishStartMediaTime } from "../../behaviors/establish-start-media-time.js";
|
|
7
|
+
import { attachMediaSourceAsSourceElement } from "../../../media/dom/mse/mediasource-setup.js";
|
|
8
|
+
import { canPlayTrack } from "../../../media/dom/capabilities.js";
|
|
9
|
+
import { parseMultivariantPlaylist } from "../../../media/hls/parse-multivariant.js";
|
|
10
|
+
import { getResolvedSelectedTrackDuration } from "../../../media/utils/track-selection.js";
|
|
11
|
+
import { calculatePresentationDuration } from "../../behaviors/calculate-presentation-duration.js";
|
|
12
|
+
import { collectErrors } from "../../behaviors/collect-errors.js";
|
|
13
|
+
import { deriveCdnPriority } from "../../behaviors/derive-cdn-priority.js";
|
|
14
|
+
import { setupAirPlay } from "../../behaviors/dom/airplay.js";
|
|
15
|
+
import { applyStartPosition } from "../../behaviors/dom/apply-start-position.js";
|
|
16
|
+
import { endOfStream } from "../../behaviors/dom/end-of-stream.js";
|
|
17
|
+
import { recoverEndStall } from "../../behaviors/dom/recover-end-stall.js";
|
|
18
|
+
import { setupAudioBufferActors } from "../../behaviors/dom/setup-buffer-actors.js";
|
|
19
|
+
import { setupMediaSource } from "../../behaviors/dom/setup-mediasource.js";
|
|
20
|
+
import { updateMediaSourceDuration } from "../../behaviors/dom/update-mediasource-duration.js";
|
|
21
|
+
import { resolvePresentation } from "../../behaviors/resolve-presentation.js";
|
|
22
|
+
import { resolveAudioTrack } from "../../behaviors/resolve-track.js";
|
|
23
|
+
import { setupFailoverMonitor } from "../../behaviors/setup-failover-monitor.js";
|
|
24
|
+
import { syncPreload } from "../../behaviors/sync-preload.js";
|
|
25
|
+
import { switchAudioTrack } from "../../behaviors/track-switching.js";
|
|
26
|
+
import { relocationPipelinesFor } from "../../primitives/relocation-pipelines.js";
|
|
27
|
+
import { reportUnsupportedTrackConditions } from "../../primitives/report-track-conditions.js";
|
|
28
|
+
//#region src/playback/engines/hls/engine-audio-only.ts
|
|
29
|
+
const shareSignals = makeShareSignals(["userAudioTrackSelection", "disableRemotePlayback"]);
|
|
30
|
+
/**
|
|
31
|
+
* Create an audio-only HLS playback engine.
|
|
32
|
+
*
|
|
33
|
+
* Subtractive composition variant of `createHlsVideoEngine`: omits
|
|
34
|
+
* video-side behaviors (`resolveVideoTrack`, `switchVideoTrack`,
|
|
35
|
+
* `setupVideoBufferActors`, `loadVideoSegments`) and text-track behaviors
|
|
36
|
+
* (`switchTextTrack`, `resolveTextTrack`, `syncTextTracks`,
|
|
37
|
+
* `setupTextTrackActors`, `loadTextTrackSegments`). The remaining audio
|
|
38
|
+
* pipeline composes unchanged.
|
|
39
|
+
*
|
|
40
|
+
* Handles both truly audio-only HLS sources (no video stream-inf) and
|
|
41
|
+
* mixed-AV HLS sources where the audio rendition is selected and video /
|
|
42
|
+
* subtitle renditions are ignored at composition time. The variant decision
|
|
43
|
+
* is encoded by adapter choice; this engine does not branch on source
|
|
44
|
+
* shape.
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* let signals: HlsAudioEngineSignals;
|
|
49
|
+
* const engine = createHlsAudioEngine({
|
|
50
|
+
* preferredAudioLanguage: 'en',
|
|
51
|
+
* onSignalsReady: (refs) => {
|
|
52
|
+
* signals = refs;
|
|
53
|
+
* },
|
|
54
|
+
* });
|
|
55
|
+
*
|
|
56
|
+
* signals.context.mediaElement.set(audioEl);
|
|
57
|
+
* signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
function createHlsAudioEngine(config = {}) {
|
|
61
|
+
const deriveStartMediaTime = config.deriveStartMediaTime ?? deriveSharedMinStartMediaTime;
|
|
62
|
+
const finalConfig = {
|
|
63
|
+
...config,
|
|
64
|
+
deriveStartMediaTime,
|
|
65
|
+
attachMediaSource: attachMediaSourceAsSourceElement,
|
|
66
|
+
canPlayTrack: config.canPlayTrack ?? canPlayTrack,
|
|
67
|
+
reportUnsupportedTrackConditions: config.reportUnsupportedTrackConditions ?? reportUnsupportedTrackConditions,
|
|
68
|
+
resolveDuration: config.resolveDuration ?? getResolvedSelectedTrackDuration,
|
|
69
|
+
parsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,
|
|
70
|
+
audioMessagePipelines: relocationPipelinesFor("audio", deriveStartMediaTime)
|
|
71
|
+
};
|
|
72
|
+
return createComposition([
|
|
73
|
+
syncPreload,
|
|
74
|
+
trackLoadTriggers,
|
|
75
|
+
resolvePresentation,
|
|
76
|
+
deriveCdnPriority,
|
|
77
|
+
setupFailoverMonitor,
|
|
78
|
+
collectErrors,
|
|
79
|
+
switchAudioTrack,
|
|
80
|
+
resolveAudioTrack,
|
|
81
|
+
calculatePresentationDuration,
|
|
82
|
+
setupMediaSource,
|
|
83
|
+
updateMediaSourceDuration,
|
|
84
|
+
establishStartMediaTime,
|
|
85
|
+
setupAudioBufferActors,
|
|
86
|
+
setupAirPlay,
|
|
87
|
+
trackCurrentTime,
|
|
88
|
+
applyStartPosition,
|
|
89
|
+
loadAudioSegments,
|
|
90
|
+
endOfStream,
|
|
91
|
+
recoverEndStall,
|
|
92
|
+
shareSignals
|
|
93
|
+
], { config: finalConfig });
|
|
94
|
+
}
|
|
95
|
+
//#endregion
|
|
96
|
+
export { createHlsAudioEngine };
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=engine-audio-only.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-audio-only.js","names":[],"sources":["../../../../../src/playback/engines/hls/engine-audio-only.ts"],"sourcesContent":["import {\n type Composition,\n type ContextSignals,\n createComposition,\n type StateSignals,\n} from '../../../core/composition/create-composition';\nimport { makeShareSignals, type ShareSignalsConfig } from '../../../core/composition/share-signals';\nimport type { BackBufferConfig } from '../../../media/buffer/back-buffer';\nimport type { ForwardBufferConfig } from '../../../media/buffer/forward-buffer';\nimport { canPlayTrack } from '../../../media/dom/capabilities';\nimport { attachMediaSourceAsSourceElement } from '../../../media/dom/mse/mediasource-setup';\nimport type { SvtaError } from '../../../media/errors';\nimport { parseMultivariantPlaylist } from '../../../media/hls/parse-multivariant';\nimport type { AudioTrack, CanPlayTrack, MaybeResolvedPresentation, MediaContainerData } from '../../../media/types';\nimport type { GetCdnId } from '../../../media/utils/cdn';\nimport { getResolvedSelectedTrackDuration } from '../../../media/utils/track-selection';\nimport type { SegmentLoaderActor } from '../../actors/dom/segment-loader';\nimport type { SourceBufferActor } from '../../actors/dom/source-buffer';\nimport {\n calculatePresentationDuration,\n type PresentationDurationResolver,\n} from '../../behaviors/calculate-presentation-duration';\nimport { collectErrors } from '../../behaviors/collect-errors';\nimport { deriveCdnPriority } from '../../behaviors/derive-cdn-priority';\nimport { setupAirPlay } from '../../behaviors/dom/airplay';\nimport { applyStartPosition } from '../../behaviors/dom/apply-start-position';\nimport { endOfStream } from '../../behaviors/dom/end-of-stream';\nimport { loadAudioSegments } from '../../behaviors/dom/load-segments';\nimport { recoverEndStall } from '../../behaviors/dom/recover-end-stall';\nimport { setupAudioBufferActors } from '../../behaviors/dom/setup-buffer-actors';\nimport { setupMediaSource } from '../../behaviors/dom/setup-mediasource';\nimport { trackCurrentTime } from '../../behaviors/dom/track-current-time';\nimport { trackLoadTriggers } from '../../behaviors/dom/track-load-triggers';\nimport { updateMediaSourceDuration } from '../../behaviors/dom/update-mediasource-duration';\n// Non-zero-PTS relocation (spike): remove this import, the composed reactor, the\n// `audioMessagePipelines` finalConfig entry, the `mediaContainerData` state slot,\n// and the `deriveStartMediaTime` config field to drop relocation from audio-only.\nimport {\n type DeriveStartMediaTime,\n deriveSharedMinStartMediaTime,\n establishStartMediaTime,\n} from '../../behaviors/establish-start-media-time';\nimport { type ParsePresentation, resolvePresentation } from '../../behaviors/resolve-presentation';\nimport { resolveAudioTrack } from '../../behaviors/resolve-track';\nimport { type FailoverMonitorConfig, setupFailoverMonitor } from '../../behaviors/setup-failover-monitor';\nimport { syncPreload } from '../../behaviors/sync-preload';\nimport { switchAudioTrack } from '../../behaviors/track-switching';\nimport { relocationPipelinesFor } from '../../primitives/relocation-pipelines';\nimport {\n type ReportUnsupportedTrackConditions,\n reportUnsupportedTrackConditions,\n} from '../../primitives/report-track-conditions';\n\n// ============================================================================\n// Audio-Only HLS Engine State & Context\n// ============================================================================\n\n/**\n * State shape for the audio-only HLS playback engine.\n *\n * Subset of `HlsVideoEngineState` covering only the slots written and read\n * by audio-side behaviors. Video and text-track slots are absent —\n * subtractive composition removes the behaviors that declare them.\n */\nexport interface HlsAudioEngineState {\n presentation?: MaybeResolvedPresentation;\n preload?: 'auto' | 'metadata' | 'none';\n selectedAudioTrackId?: string;\n // Non-zero-PTS relocation (spike): transient per-track container data owned by\n // `establishStartMediaTime`. Remove with the composed reactor.\n mediaContainerData?: Record<string, MediaContainerData>;\n /**\n * Consumer-driven constraint narrowing the audio candidate set. Sibling\n * of `userVideoTrackSelection` in the default engine. Partial-track\n * shape — `{ language: 'es' }`, `{ id: 'audio-en' }`, etc.\n * `selectAudioTrack` reads this and re-picks when it changes.\n * Multi-language-audio Tier 2 programmatic-write path.\n */\n userAudioTrackSelection?: Partial<AudioTrack>;\n /**\n * The CDNs the source is served from, in manifest priority order (mirrors\n * HLS content steering's `PATHWAY-PRIORITY`). Owned by `deriveCdnPriority`,\n * read by `track-switching`'s `preferActiveCdn` scope. Only meaningful for\n * redundant-stream sources; a single-CDN source has one entry.\n */\n cdnPriority?: string[];\n /**\n * CDN ids currently in failover cooldown — read by `track-switching`'s\n * `excludeFailedCdns` constraint, which prunes their tracks so the active-CDN\n * scope falls to the next CDN. Empty / absent means all CDNs are eligible.\n */\n failedCdns?: string[];\n /**\n * Conditions reported during playback, in order — appended by whichever\n * behavior detects one, owned and cleared per source by `collectErrors`.\n * Severity is decided above the engine. Audio-only makes an all-audio-pruned\n * source unrecoverable: there's no video fallback to fall back to.\n */\n errors?: SvtaError[];\n currentTime?: number;\n loadActivated?: boolean;\n /**\n * One-shot command: start the current source at this position\n * (presentation-timeline seconds). Written by consumers or by\n * `setupAirPlay`'s session-end snapshot; consumed (cleared) by\n * `applyStartPosition` once the element seeks. See\n * `behaviors/dom/apply-start-position.ts`.\n */\n startPosition?: number;\n /**\n * Intent-level loading policy: initiate no new loading work while `true`.\n * Written by `setupAirPlay` (the only behavior declaring the key) while a\n * remote-playback session owns presentation; observed by `loadAudioSegments`\n * (parks in `'dormant'`) and by `setupMediaSource` (a pending rebuild\n * waits). See `SegmentLoadingState['loadingSuspended']`.\n */\n loadingSuspended?: boolean;\n /**\n * Author intent for the AirPlay/remote-playback picker, written by the media\n * adapter's `disableRemotePlayback` IDL property. `true` is an explicit\n * opt-out: `setupAirPlay` reads it at attach and sets nothing up, leaving the\n * element's remote playback disabled. Distinct from the underlying media\n * element's own `disableRemotePlayback`, which stays programmatically managed\n * (ManagedMediaSource / AirPlay).\n */\n disableRemotePlayback?: boolean;\n}\n\n/**\n * Context shape for the audio-only HLS playback engine.\n *\n * Subset of `HlsVideoEngineContext` covering only the platform objects and\n * actor refs managed by audio-side behaviors.\n */\nexport interface HlsAudioEngineContext {\n mediaElement?: HTMLMediaElement | undefined;\n mediaSource?: MediaSource;\n audioBufferActor?: SourceBufferActor;\n audioSegmentLoaderActor?: SegmentLoaderActor;\n}\n\nexport type HlsAudioEngineSignals = {\n state: StateSignals<HlsAudioEngineState>;\n context: ContextSignals<HlsAudioEngineContext>;\n};\n\n/**\n * Configuration for the audio-only HLS playback engine.\n *\n * Subset of `HlsVideoEngineConfig` — video-quality, bandwidth-estimator,\n * and text-track config fields are omitted (no behavior consumes them).\n */\nexport interface HlsAudioEngineConfig extends ShareSignalsConfig<HlsAudioEngineState, HlsAudioEngineContext> {\n preferredAudioLanguage?: string;\n /**\n * Codec capability probe read by `track-switching`'s `excludeUnplayableTracks`\n * constraint. Defaults to the `MediaSource.isTypeSupported`-backed\n * `canPlayTrack`; override to force-exclude a codec. Mirrors the default\n * engine — without it, capability probing (and TS / raw-AAC detection) would\n * be inert for audio-only playback.\n */\n canPlayTrack?: CanPlayTrack;\n /**\n * Conditions reported about each rendition as it resolves — the *causes* behind\n * a later verdict, and the copy a verdict reuses when they agree. Defaults to\n * {@link reportUnsupportedTrackConditions}, which reports non-fMP4 containers\n * and encryption; supply your own to report a different set (a provider that\n * never ships MPEG-TS can drop that check) or `() => []` to report nothing.\n */\n reportUnsupportedTrackConditions?: ReportUnsupportedTrackConditions;\n resolveDuration?: PresentationDurationResolver;\n parsePresentation?: ParsePresentation;\n forwardBuffer?: Partial<ForwardBufferConfig>;\n backBuffer?: Partial<BackBufferConfig>;\n /** Multi-CDN failover monitor tuning. Defaults: `DEFAULT_FAILOVER_MONITOR_CONFIG`. */\n failover?: Partial<FailoverMonitorConfig>;\n /**\n * Derive a CDN grouping key from a track URL (used by `cdnPriority`, the\n * failover trip, and the track-switching CDN rules — one function read by all).\n * Defaults to the URL origin; override to key on e.g. Mux's `cdn=` param.\n */\n getCdnId?: GetCdnId;\n /** Non-zero-PTS relocation (spike): the reduce seam (tier knob); defaults to per-track own. */\n deriveStartMediaTime?: DeriveStartMediaTime;\n}\n\n// ============================================================================\n// Audio-Only HLS Playback Engine\n// ============================================================================\n\n// Materializes input slots no composed behavior produces — `userAudioTrackSelection`\n// (switchAudioTrack only reads it) and `disableRemotePlayback` (setupAirPlay only\n// reads it) — in addition to forwarding refs. `failedCdns` is owned by\n// `setupFailoverMonitor`, so it's already materialized and reachable on the\n// `onSignalsReady` refs without being listed here.\nconst shareSignals = makeShareSignals<HlsAudioEngineState, HlsAudioEngineContext>([\n 'userAudioTrackSelection',\n 'disableRemotePlayback',\n]);\n\n/**\n * Create an audio-only HLS playback engine.\n *\n * Subtractive composition variant of `createHlsVideoEngine`: omits\n * video-side behaviors (`resolveVideoTrack`, `switchVideoTrack`,\n * `setupVideoBufferActors`, `loadVideoSegments`) and text-track behaviors\n * (`switchTextTrack`, `resolveTextTrack`, `syncTextTracks`,\n * `setupTextTrackActors`, `loadTextTrackSegments`). The remaining audio\n * pipeline composes unchanged.\n *\n * Handles both truly audio-only HLS sources (no video stream-inf) and\n * mixed-AV HLS sources where the audio rendition is selected and video /\n * subtitle renditions are ignored at composition time. The variant decision\n * is encoded by adapter choice; this engine does not branch on source\n * shape.\n *\n * @example\n * ```ts\n * let signals: HlsAudioEngineSignals;\n * const engine = createHlsAudioEngine({\n * preferredAudioLanguage: 'en',\n * onSignalsReady: (refs) => {\n * signals = refs;\n * },\n * });\n *\n * signals.context.mediaElement.set(audioEl);\n * signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });\n * ```\n */\nexport function createHlsAudioEngine(\n config: HlsAudioEngineConfig = {}\n): Composition<HlsAudioEngineState, HlsAudioEngineContext> {\n const deriveStartMediaTime = config.deriveStartMediaTime ?? deriveSharedMinStartMediaTime;\n const finalConfig = {\n ...config,\n deriveStartMediaTime,\n // Baked (not user-overridable): this engine composes `setupAirPlay`,\n // whose native fallback `<source>` requires the MSE attachment to keep\n // sibling source alternatives part of resource selection. The helper's\n // `video/mp4` source type is inert here — resource selection probes it\n // with `canPlayType`, which answers `'maybe'` on an audio element too.\n attachMediaSource: attachMediaSourceAsSourceElement,\n canPlayTrack: config.canPlayTrack ?? canPlayTrack,\n reportUnsupportedTrackConditions: config.reportUnsupportedTrackConditions ?? reportUnsupportedTrackConditions,\n resolveDuration: config.resolveDuration ?? getResolvedSelectedTrackDuration,\n parsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,\n // Non-zero-PTS relocation (spike): pair the audio loader with the relocation steps\n // `establishStartMediaTime` derives from; same `deriveStartMediaTime` seam. Remove\n // with the reactor.\n audioMessagePipelines: relocationPipelinesFor('audio', deriveStartMediaTime),\n };\n\n return createComposition(\n [\n syncPreload,\n trackLoadTriggers,\n resolvePresentation,\n\n // Session-level CDN priority for redundant-stream sources. Owns\n // `cdnPriority`; switchAudioTrack's preferActiveCdn scope reads it. No-op\n // for single-CDN sources.\n //\n // With a single track type there's no cross-type coherence to enforce and\n // the first pick is the primary CDN regardless, so composition order is\n // not load-bearing here today. It earns its place for forward-consistency\n // with the default engine and for future failover / steering, where the\n // active CDN changes dynamically (and selection stays reactive either way).\n deriveCdnPriority,\n\n // CDN failover cooldown: watches `failedCdns` (tripped directly by audio\n // track resolution on a failed media-playlist fetch) and removes each CDN\n // once its cooldown lapses.\n setupFailoverMonitor,\n\n // Owns `errors` and its per-source lifecycle; reporters append into it.\n collectErrors,\n\n // Audio track selection — slot owner with filter reactivity.\n // Mid-stream flush on language switch is handled in segment-loader's\n // planTasks, not here.\n switchAudioTrack,\n\n // Resolve selected tracks — audio only.\n resolveAudioTrack,\n\n // Presentation duration\n calculatePresentationDuration,\n\n // MSE setup. Single audio buffer; no video buffer to coordinate with,\n // so the Firefox `mozHasAudio` registration ordering is moot here.\n setupMediaSource,\n updateMediaSourceDuration,\n\n // Non-zero-PTS relocation (spike): establishes per-track startMediaTime;\n // MUST precede setupAudioBufferActors. Remove this line + the import + the\n // finalConfig/state entries to drop relocation. (Selection is optional in the\n // reactor, so it works with only audio in scope.)\n establishStartMediaTime,\n\n setupAudioBufferActors,\n\n // AirPlay/MSE bridge (WebKit only; no-op elsewhere). Audio-only sources\n // AirPlay to audio receivers (HomePod, AirPlay speakers) through the same\n // native-HLS fallback `<source>`; `webkitCurrentPlaybackTargetIsWireless`\n // and the picker are HTMLMediaElement-level, so an `<audio>` host is\n // AirPlay-capable on the same terms as a `<video>` one.\n setupAirPlay,\n\n // Playback tracking\n trackCurrentTime,\n // After trackCurrentTime: the one-shot currentTime seed must land after\n // the mirror's attach-time sync (see apply-start-position.ts).\n applyStartPosition,\n\n // Segment loading — audio only.\n loadAudioSegments,\n\n // End of stream coordination. `endOfStream` iterates buffer actors via\n // `[videoBufferActor, audioBufferActor].filter(Boolean)` and reads\n // `mediaSource.sourceBuffers` aggregately — composes unchanged with\n // only audio in scope.\n endOfStream,\n // Force native `ended` if Chrome freezes the playhead short of the buffered end\n // after `endOfStream`. Inert for a clean-ending single-track source.\n recoverEndStall,\n\n // Adapter signal callback.\n shareSignals,\n ],\n {\n config: finalConfig,\n }\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmMA,MAAM,eAAe,iBAA6D,CAChF,2BACA,uBACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCD,SAAgB,qBACd,SAA+B,CAAC,GACyB;CACzD,MAAM,uBAAuB,OAAO,wBAAwB;CAC5D,MAAM,cAAc;EAClB,GAAG;EACH;EAMA,mBAAmB;EACnB,cAAc,OAAO,gBAAgB;EACrC,kCAAkC,OAAO,oCAAoC;EAC7E,iBAAiB,OAAO,mBAAmB;EAC3C,mBAAmB,OAAO,qBAAqB;EAI/C,uBAAuB,uBAAuB,SAAS,oBAAoB;CAC7E;CAEA,OAAO,kBACL;EACE;EACA;EACA;EAWA;EAKA;EAGA;EAKA;EAGA;EAGA;EAIA;EACA;EAMA;EAEA;EAOA;EAGA;EAGA;EAGA;EAMA;EAGA;EAGA;CACF,GACA,EACE,QAAQ,YACV,CACF;AACF"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { CanPlayTrack, MaybeResolvedPresentation } from "../../../media/types/index.js";
|
|
2
|
+
import { Composition, ContextSignals, StateSignals } from "../../../core/composition/create-composition.js";
|
|
3
|
+
import { ShareSignalsConfig } from "../../../core/composition/share-signals.js";
|
|
4
|
+
import { SourceBufferActor } from "../../actors/dom/source-buffer.js";
|
|
5
|
+
import { SegmentLoaderActor } from "../../actors/dom/segment-loader.js";
|
|
6
|
+
import { SvtaError } from "../../../media/errors.js";
|
|
7
|
+
import { ParsePresentation } from "../../behaviors/resolve-presentation.js";
|
|
8
|
+
import { ReportUnsupportedTrackConditions } from "../../primitives/report-track-conditions.js";
|
|
9
|
+
import { ScreenResolution } from "../../../media/dom/screen.js";
|
|
10
|
+
import { SelectVideoTrackConfig } from "../../behaviors/select-tracks.js";
|
|
11
|
+
//#region src/playback/engines/hls/engine-background-video.d.ts
|
|
12
|
+
/**
|
|
13
|
+
* State shape for the background-video playback engine.
|
|
14
|
+
*
|
|
15
|
+
* Mostly narrower than `HlsVideoEngineState`: audio/text track slots are absent
|
|
16
|
+
* because their selection/resolution behaviors are subtracted. `bandwidthState`
|
|
17
|
+
* is present because `setupVideoBufferActors` declares it and `loadVideoSegments`
|
|
18
|
+
* samples into it (wasted work in this variant — a Phase 3 alt-impl will skip
|
|
19
|
+
* sampling).
|
|
20
|
+
*
|
|
21
|
+
* `screenResolution` is the one slot this variant has and the HLS video engine
|
|
22
|
+
* doesn't, because the screen-size cap is being built here first. It generalizes
|
|
23
|
+
* — the cap is a selection rule both engines can compose — so expect the slot to
|
|
24
|
+
* appear there too rather than staying variant-specific.
|
|
25
|
+
*/
|
|
26
|
+
interface BackgroundVideoEngineState {
|
|
27
|
+
/**
|
|
28
|
+
* The presentation being played. A caller writes `{ url }`;
|
|
29
|
+
* `resolvePresentation` parses the manifest and populates the rest.
|
|
30
|
+
*/
|
|
31
|
+
presentation?: MaybeResolvedPresentation;
|
|
32
|
+
preload?: 'auto' | 'metadata' | 'none';
|
|
33
|
+
selectedVideoTrackId?: string;
|
|
34
|
+
loadActivated?: boolean;
|
|
35
|
+
/**
|
|
36
|
+
* The screen's pixel dimensions, or `undefined` where there is none to read.
|
|
37
|
+
* Written by `trackScreenResolution`, read by the `screenResolutionCap`
|
|
38
|
+
* selection rule — which treats `undefined` as "don't cap".
|
|
39
|
+
*/
|
|
40
|
+
screenResolution?: ScreenResolution;
|
|
41
|
+
/**
|
|
42
|
+
* Conditions reported while this source is loaded — the per-rendition causes
|
|
43
|
+
* `resolveVideoTrack` reports and the verdict `selectVideoTrack` reports when
|
|
44
|
+
* the constraints prune every rendition. Owned and cleared per source by
|
|
45
|
+
* `collectErrors`; the adapter derives which are fatal.
|
|
46
|
+
*/
|
|
47
|
+
errors?: SvtaError[];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Context shape for the background-video engine.
|
|
51
|
+
*/
|
|
52
|
+
interface BackgroundVideoEngineContext {
|
|
53
|
+
mediaElement?: HTMLMediaElement | undefined;
|
|
54
|
+
mediaSource?: MediaSource;
|
|
55
|
+
videoBufferActor?: SourceBufferActor;
|
|
56
|
+
videoSegmentLoaderActor?: SegmentLoaderActor;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The composition signal refs handed to `onSignalsReady` callers — the
|
|
60
|
+
* canonical way to drive the engine externally (writes) or observe its
|
|
61
|
+
* state (reads) without touching `composition.state` / `composition.context`
|
|
62
|
+
* directly.
|
|
63
|
+
*/
|
|
64
|
+
type BackgroundVideoEngineSignals = {
|
|
65
|
+
state: StateSignals<BackgroundVideoEngineState>;
|
|
66
|
+
context: ContextSignals<BackgroundVideoEngineContext>;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Configuration for the background-video engine.
|
|
70
|
+
*
|
|
71
|
+
* Each option is consumed by the appropriate behavior — the engine itself
|
|
72
|
+
* has no config beyond what its behaviors read. Compared to
|
|
73
|
+
* `HlsVideoEngineConfig`, audio/text/ABR/bandwidth/quality knobs are
|
|
74
|
+
* dropped: the variant subtracts the behaviors that read them.
|
|
75
|
+
*/
|
|
76
|
+
interface BackgroundVideoEngineConfig extends ShareSignalsConfig<BackgroundVideoEngineState, BackgroundVideoEngineContext> {
|
|
77
|
+
/**
|
|
78
|
+
* Hard-constraint pre-pass handed to `selectVideoTrack`. Defaults to
|
|
79
|
+
* `[excludeUnplayableTracks, reportAbsentTrackType(2011)]` — prune the renditions
|
|
80
|
+
* this environment can't decode, then report 2011 if nothing is left (this engine
|
|
81
|
+
* composes only video, so a source with none playable can never play).
|
|
82
|
+
*/
|
|
83
|
+
constraints?: SelectVideoTrackConfig['constraints'];
|
|
84
|
+
/**
|
|
85
|
+
* Selection-rule chain handed to `selectVideoTrack`. Defaults to
|
|
86
|
+
* `[screenResolutionCap, preferHighestResolution]` — narrows to the renditions
|
|
87
|
+
* that fit the screen, takes the largest of those, and pins it for the session.
|
|
88
|
+
*
|
|
89
|
+
* The cap sits ahead of the ranker because a scope that narrows first wins over
|
|
90
|
+
* one applied later; pass `[preferHighestResolution]` alone to opt out and always
|
|
91
|
+
* pin the largest rendition on offer.
|
|
92
|
+
*/
|
|
93
|
+
rules?: readonly NonNullable<SelectVideoTrackConfig['rules']>[number][];
|
|
94
|
+
/**
|
|
95
|
+
* Manifest parser handed to `resolvePresentation`. Defaults to the HLS
|
|
96
|
+
* multivariant-playlist parser.
|
|
97
|
+
*/
|
|
98
|
+
parsePresentation?: ParsePresentation;
|
|
99
|
+
/**
|
|
100
|
+
* Whether `state.screenResolution` is reported in device pixels. Read by
|
|
101
|
+
* `trackScreenResolution`; defaults to `true`.
|
|
102
|
+
*/
|
|
103
|
+
useDevicePixelRatio?: boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Codec/container capability probe read by `selectVideoTrack`'s constraint
|
|
106
|
+
* pre-pass. Defaults to the DOM `canPlayTrack`; override to force-exclude a
|
|
107
|
+
* codec.
|
|
108
|
+
*/
|
|
109
|
+
canPlayTrack?: CanPlayTrack;
|
|
110
|
+
/**
|
|
111
|
+
* Per-rendition condition reporting, called by `resolveVideoTrack` once a
|
|
112
|
+
* media playlist parses. Defaults to
|
|
113
|
+
* {@link reportUnsupportedTrackConditions}, which reports non-fMP4 containers
|
|
114
|
+
* (1004) and encryption (4008).
|
|
115
|
+
*/
|
|
116
|
+
reportUnsupportedTrackConditions?: ReportUnsupportedTrackConditions;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create a background-video playback engine.
|
|
120
|
+
*
|
|
121
|
+
* Subtractive composition over the HLS engine baseline:
|
|
122
|
+
* audio-side, text-side, ABR-driven, preload-monitoring, and play/seek
|
|
123
|
+
* load-trigger behaviors are removed. `selectVideoTrack` (with a
|
|
124
|
+
* highest-resolution rule by default) replaces `switchVideoQuality`, pinning
|
|
125
|
+
* a single rendition for the session. The initial state seeds
|
|
126
|
+
* `loadActivated: true` so the composition behaves as if preload has
|
|
127
|
+
* already been activated — appropriate for ambient / hero / GIF-replacement
|
|
128
|
+
* surfaces that should start loading the moment a src is set.
|
|
129
|
+
*
|
|
130
|
+
* Error reporting is *not* subtracted: `collectErrors` owns the sequence,
|
|
131
|
+
* `resolveVideoTrack` reports per-rendition causes, and `selectVideoTrack`
|
|
132
|
+
* reports the video verdict when nothing survives its constraints. Without them
|
|
133
|
+
* every unplayable source here is a silent stall — an unsupported container,
|
|
134
|
+
* encryption this engine can't decrypt, and an undecodable codec all leave
|
|
135
|
+
* `HTMLMediaElement.error` null on both Chromium and WebKit.
|
|
136
|
+
*
|
|
137
|
+
* Native `loop` / `muted` / `autoplay` are adapter concerns and live on
|
|
138
|
+
* `HlsBackgroundVideoMediaElement` rather than the engine.
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* ```ts
|
|
142
|
+
* let signals: BackgroundVideoEngineSignals;
|
|
143
|
+
* const engine = createBackgroundVideoEngine({
|
|
144
|
+
* onSignalsReady: (refs) => {
|
|
145
|
+
* signals = refs;
|
|
146
|
+
* },
|
|
147
|
+
* });
|
|
148
|
+
*
|
|
149
|
+
* signals.context.mediaElement.set(videoEl);
|
|
150
|
+
* signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });
|
|
151
|
+
*
|
|
152
|
+
* await engine.destroy();
|
|
153
|
+
* ```
|
|
154
|
+
*/
|
|
155
|
+
declare function createBackgroundVideoEngine(config?: BackgroundVideoEngineConfig): Composition<BackgroundVideoEngineState, BackgroundVideoEngineContext>;
|
|
156
|
+
//#endregion
|
|
157
|
+
export { BackgroundVideoEngineConfig, BackgroundVideoEngineContext, BackgroundVideoEngineSignals, BackgroundVideoEngineState, createBackgroundVideoEngine };
|
|
158
|
+
//# sourceMappingURL=engine-background-video.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-background-video.d.ts","names":[],"sources":["../../../../../src/playback/engines/hls/engine-background-video.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;UAwDiB;;;;;EAKf,eAAe;EACf;EACA;EACA;;;;;;EAMA,mBAAmB;;;;;;;EAOnB,SAAS;;;;;UAMM;EACf,eAAe;EACf,cAAc;EACd,mBAAmB;EACnB,0BAA0B;;;;;;;;KAShB;EACV,OAAO,aAAa;EACpB,SAAS,eAAe;;;;;;;;;;UAWT,oCACP,mBAAmB,4BAA4B;;;;;;;EAOvD,cAAc;;;;;;;;;;EAUd,iBAAiB,YAAY;;;;;EAK7B,oBAAoB;;;;;EAKpB;;;;;;EAMA,eAAe;;;;;;;EAOf,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8CrB,4BACd,SAAQ,8BACP,YAAY,4BAA4B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { createComposition } from "../../../core/composition/create-composition.js";
|
|
2
|
+
import { makeShareSignals } from "../../../core/composition/share-signals.js";
|
|
3
|
+
import { loadVideoSegments } from "../../behaviors/dom/load-segments.js";
|
|
4
|
+
import { trackCurrentTime } from "../../behaviors/dom/track-current-time.js";
|
|
5
|
+
import "../../../media/errors.js";
|
|
6
|
+
import { excludeUnplayableTracks } from "../../primitives/selection-rules.js";
|
|
7
|
+
import { preferHighestResolution, screenResolutionCap, selectVideoTrack } from "../../behaviors/select-tracks.js";
|
|
8
|
+
import { canPlayTrack } from "../../../media/dom/capabilities.js";
|
|
9
|
+
import { parseMultivariantPlaylist } from "../../../media/hls/parse-multivariant.js";
|
|
10
|
+
import { getResolvedSelectedTrackDuration } from "../../../media/utils/track-selection.js";
|
|
11
|
+
import { calculatePresentationDuration } from "../../behaviors/calculate-presentation-duration.js";
|
|
12
|
+
import { collectErrors, reportAbsentTrackType } from "../../behaviors/collect-errors.js";
|
|
13
|
+
import { endOfStream } from "../../behaviors/dom/end-of-stream.js";
|
|
14
|
+
import { setupVideoBufferActors } from "../../behaviors/dom/setup-buffer-actors.js";
|
|
15
|
+
import { setupMediaSource } from "../../behaviors/dom/setup-mediasource.js";
|
|
16
|
+
import { updateMediaSourceDuration } from "../../behaviors/dom/update-mediasource-duration.js";
|
|
17
|
+
import { resolvePresentation } from "../../behaviors/resolve-presentation.js";
|
|
18
|
+
import { resolveVideoTrack } from "../../behaviors/resolve-track.js";
|
|
19
|
+
import { reportUnsupportedTrackConditions } from "../../primitives/report-track-conditions.js";
|
|
20
|
+
import { trackScreenResolution } from "../../behaviors/dom/track-screen-resolution.js";
|
|
21
|
+
//#region src/playback/engines/hls/engine-background-video.ts
|
|
22
|
+
const shareSignals = makeShareSignals();
|
|
23
|
+
/**
|
|
24
|
+
* Create a background-video playback engine.
|
|
25
|
+
*
|
|
26
|
+
* Subtractive composition over the HLS engine baseline:
|
|
27
|
+
* audio-side, text-side, ABR-driven, preload-monitoring, and play/seek
|
|
28
|
+
* load-trigger behaviors are removed. `selectVideoTrack` (with a
|
|
29
|
+
* highest-resolution rule by default) replaces `switchVideoQuality`, pinning
|
|
30
|
+
* a single rendition for the session. The initial state seeds
|
|
31
|
+
* `loadActivated: true` so the composition behaves as if preload has
|
|
32
|
+
* already been activated — appropriate for ambient / hero / GIF-replacement
|
|
33
|
+
* surfaces that should start loading the moment a src is set.
|
|
34
|
+
*
|
|
35
|
+
* Error reporting is *not* subtracted: `collectErrors` owns the sequence,
|
|
36
|
+
* `resolveVideoTrack` reports per-rendition causes, and `selectVideoTrack`
|
|
37
|
+
* reports the video verdict when nothing survives its constraints. Without them
|
|
38
|
+
* every unplayable source here is a silent stall — an unsupported container,
|
|
39
|
+
* encryption this engine can't decrypt, and an undecodable codec all leave
|
|
40
|
+
* `HTMLMediaElement.error` null on both Chromium and WebKit.
|
|
41
|
+
*
|
|
42
|
+
* Native `loop` / `muted` / `autoplay` are adapter concerns and live on
|
|
43
|
+
* `HlsBackgroundVideoMediaElement` rather than the engine.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* let signals: BackgroundVideoEngineSignals;
|
|
48
|
+
* const engine = createBackgroundVideoEngine({
|
|
49
|
+
* onSignalsReady: (refs) => {
|
|
50
|
+
* signals = refs;
|
|
51
|
+
* },
|
|
52
|
+
* });
|
|
53
|
+
*
|
|
54
|
+
* signals.context.mediaElement.set(videoEl);
|
|
55
|
+
* signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });
|
|
56
|
+
*
|
|
57
|
+
* await engine.destroy();
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
function createBackgroundVideoEngine(config = {}) {
|
|
61
|
+
const finalConfig = {
|
|
62
|
+
...config,
|
|
63
|
+
constraints: config.constraints ?? [excludeUnplayableTracks, reportAbsentTrackType(2011)],
|
|
64
|
+
rules: config.rules ?? [screenResolutionCap, preferHighestResolution],
|
|
65
|
+
parsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,
|
|
66
|
+
resolveDuration: getResolvedSelectedTrackDuration,
|
|
67
|
+
canPlayTrack: config.canPlayTrack ?? canPlayTrack,
|
|
68
|
+
reportUnsupportedTrackConditions: config.reportUnsupportedTrackConditions ?? reportUnsupportedTrackConditions
|
|
69
|
+
};
|
|
70
|
+
return createComposition([
|
|
71
|
+
resolvePresentation,
|
|
72
|
+
calculatePresentationDuration,
|
|
73
|
+
collectErrors,
|
|
74
|
+
selectVideoTrack,
|
|
75
|
+
resolveVideoTrack,
|
|
76
|
+
loadVideoSegments,
|
|
77
|
+
setupMediaSource,
|
|
78
|
+
updateMediaSourceDuration,
|
|
79
|
+
setupVideoBufferActors,
|
|
80
|
+
trackCurrentTime,
|
|
81
|
+
trackScreenResolution,
|
|
82
|
+
endOfStream,
|
|
83
|
+
shareSignals
|
|
84
|
+
], {
|
|
85
|
+
config: finalConfig,
|
|
86
|
+
initialState: { loadActivated: true }
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
//#endregion
|
|
90
|
+
export { createBackgroundVideoEngine };
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=engine-background-video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-background-video.js","names":[],"sources":["../../../../../src/playback/engines/hls/engine-background-video.ts"],"sourcesContent":["import {\n type Composition,\n type ContextSignals,\n createComposition,\n type StateSignals,\n} from '../../../core/composition/create-composition';\nimport { makeShareSignals, type ShareSignalsConfig } from '../../../core/composition/share-signals';\nimport { canPlayTrack } from '../../../media/dom/capabilities';\nimport type { ScreenResolution } from '../../../media/dom/screen';\nimport { SVTA_NO_SUPPORTED_VIDEO_TRACK, type SvtaError } from '../../../media/errors';\nimport { parseMultivariantPlaylist } from '../../../media/hls/parse-multivariant';\nimport type { CanPlayTrack, MaybeResolvedPresentation } from '../../../media/types';\nimport { getResolvedSelectedTrackDuration } from '../../../media/utils/track-selection';\nimport type { SegmentLoaderActor } from '../../actors/dom/segment-loader';\nimport type { SourceBufferActor } from '../../actors/dom/source-buffer';\nimport { calculatePresentationDuration } from '../../behaviors/calculate-presentation-duration';\nimport { collectErrors, reportAbsentTrackType } from '../../behaviors/collect-errors';\nimport { endOfStream } from '../../behaviors/dom/end-of-stream';\nimport { loadVideoSegments } from '../../behaviors/dom/load-segments';\nimport { setupVideoBufferActors } from '../../behaviors/dom/setup-buffer-actors';\nimport { setupMediaSource } from '../../behaviors/dom/setup-mediasource';\nimport { trackCurrentTime } from '../../behaviors/dom/track-current-time';\nimport { trackScreenResolution } from '../../behaviors/dom/track-screen-resolution';\nimport { updateMediaSourceDuration } from '../../behaviors/dom/update-mediasource-duration';\nimport { type ParsePresentation, resolvePresentation } from '../../behaviors/resolve-presentation';\nimport { resolveVideoTrack } from '../../behaviors/resolve-track';\nimport {\n preferHighestResolution,\n type SelectVideoTrackConfig,\n screenResolutionCap,\n selectVideoTrack,\n} from '../../behaviors/select-tracks';\nimport {\n type ReportUnsupportedTrackConditions,\n reportUnsupportedTrackConditions,\n} from '../../primitives/report-track-conditions';\nimport { excludeUnplayableTracks } from '../../primitives/selection-rules';\n\n// ============================================================================\n// Background-video engine state & context\n// ============================================================================\n\n/**\n * State shape for the background-video playback engine.\n *\n * Mostly narrower than `HlsVideoEngineState`: audio/text track slots are absent\n * because their selection/resolution behaviors are subtracted. `bandwidthState`\n * is present because `setupVideoBufferActors` declares it and `loadVideoSegments`\n * samples into it (wasted work in this variant — a Phase 3 alt-impl will skip\n * sampling).\n *\n * `screenResolution` is the one slot this variant has and the HLS video engine\n * doesn't, because the screen-size cap is being built here first. It generalizes\n * — the cap is a selection rule both engines can compose — so expect the slot to\n * appear there too rather than staying variant-specific.\n */\nexport interface BackgroundVideoEngineState {\n /**\n * The presentation being played. A caller writes `{ url }`;\n * `resolvePresentation` parses the manifest and populates the rest.\n */\n presentation?: MaybeResolvedPresentation;\n preload?: 'auto' | 'metadata' | 'none';\n selectedVideoTrackId?: string;\n loadActivated?: boolean;\n /**\n * The screen's pixel dimensions, or `undefined` where there is none to read.\n * Written by `trackScreenResolution`, read by the `screenResolutionCap`\n * selection rule — which treats `undefined` as \"don't cap\".\n */\n screenResolution?: ScreenResolution;\n /**\n * Conditions reported while this source is loaded — the per-rendition causes\n * `resolveVideoTrack` reports and the verdict `selectVideoTrack` reports when\n * the constraints prune every rendition. Owned and cleared per source by\n * `collectErrors`; the adapter derives which are fatal.\n */\n errors?: SvtaError[];\n}\n\n/**\n * Context shape for the background-video engine.\n */\nexport interface BackgroundVideoEngineContext {\n mediaElement?: HTMLMediaElement | undefined;\n mediaSource?: MediaSource;\n videoBufferActor?: SourceBufferActor;\n videoSegmentLoaderActor?: SegmentLoaderActor;\n}\n\n/**\n * The composition signal refs handed to `onSignalsReady` callers — the\n * canonical way to drive the engine externally (writes) or observe its\n * state (reads) without touching `composition.state` / `composition.context`\n * directly.\n */\nexport type BackgroundVideoEngineSignals = {\n state: StateSignals<BackgroundVideoEngineState>;\n context: ContextSignals<BackgroundVideoEngineContext>;\n};\n\n/**\n * Configuration for the background-video engine.\n *\n * Each option is consumed by the appropriate behavior — the engine itself\n * has no config beyond what its behaviors read. Compared to\n * `HlsVideoEngineConfig`, audio/text/ABR/bandwidth/quality knobs are\n * dropped: the variant subtracts the behaviors that read them.\n */\nexport interface BackgroundVideoEngineConfig\n extends ShareSignalsConfig<BackgroundVideoEngineState, BackgroundVideoEngineContext> {\n /**\n * Hard-constraint pre-pass handed to `selectVideoTrack`. Defaults to\n * `[excludeUnplayableTracks, reportAbsentTrackType(2011)]` — prune the renditions\n * this environment can't decode, then report 2011 if nothing is left (this engine\n * composes only video, so a source with none playable can never play).\n */\n constraints?: SelectVideoTrackConfig['constraints'];\n /**\n * Selection-rule chain handed to `selectVideoTrack`. Defaults to\n * `[screenResolutionCap, preferHighestResolution]` — narrows to the renditions\n * that fit the screen, takes the largest of those, and pins it for the session.\n *\n * The cap sits ahead of the ranker because a scope that narrows first wins over\n * one applied later; pass `[preferHighestResolution]` alone to opt out and always\n * pin the largest rendition on offer.\n */\n rules?: readonly NonNullable<SelectVideoTrackConfig['rules']>[number][];\n /**\n * Manifest parser handed to `resolvePresentation`. Defaults to the HLS\n * multivariant-playlist parser.\n */\n parsePresentation?: ParsePresentation;\n /**\n * Whether `state.screenResolution` is reported in device pixels. Read by\n * `trackScreenResolution`; defaults to `true`.\n */\n useDevicePixelRatio?: boolean;\n /**\n * Codec/container capability probe read by `selectVideoTrack`'s constraint\n * pre-pass. Defaults to the DOM `canPlayTrack`; override to force-exclude a\n * codec.\n */\n canPlayTrack?: CanPlayTrack;\n /**\n * Per-rendition condition reporting, called by `resolveVideoTrack` once a\n * media playlist parses. Defaults to\n * {@link reportUnsupportedTrackConditions}, which reports non-fMP4 containers\n * (1004) and encryption (4008).\n */\n reportUnsupportedTrackConditions?: ReportUnsupportedTrackConditions;\n}\n\n// ============================================================================\n// Background-video playback engine\n// ============================================================================\n\nconst shareSignals = makeShareSignals<BackgroundVideoEngineState, BackgroundVideoEngineContext>();\n\n/**\n * Create a background-video playback engine.\n *\n * Subtractive composition over the HLS engine baseline:\n * audio-side, text-side, ABR-driven, preload-monitoring, and play/seek\n * load-trigger behaviors are removed. `selectVideoTrack` (with a\n * highest-resolution rule by default) replaces `switchVideoQuality`, pinning\n * a single rendition for the session. The initial state seeds\n * `loadActivated: true` so the composition behaves as if preload has\n * already been activated — appropriate for ambient / hero / GIF-replacement\n * surfaces that should start loading the moment a src is set.\n *\n * Error reporting is *not* subtracted: `collectErrors` owns the sequence,\n * `resolveVideoTrack` reports per-rendition causes, and `selectVideoTrack`\n * reports the video verdict when nothing survives its constraints. Without them\n * every unplayable source here is a silent stall — an unsupported container,\n * encryption this engine can't decrypt, and an undecodable codec all leave\n * `HTMLMediaElement.error` null on both Chromium and WebKit.\n *\n * Native `loop` / `muted` / `autoplay` are adapter concerns and live on\n * `HlsBackgroundVideoMediaElement` rather than the engine.\n *\n * @example\n * ```ts\n * let signals: BackgroundVideoEngineSignals;\n * const engine = createBackgroundVideoEngine({\n * onSignalsReady: (refs) => {\n * signals = refs;\n * },\n * });\n *\n * signals.context.mediaElement.set(videoEl);\n * signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });\n *\n * await engine.destroy();\n * ```\n */\nexport function createBackgroundVideoEngine(\n config: BackgroundVideoEngineConfig = {}\n): Composition<BackgroundVideoEngineState, BackgroundVideoEngineContext> {\n const finalConfig = {\n ...config,\n constraints: config.constraints ?? [excludeUnplayableTracks, reportAbsentTrackType(SVTA_NO_SUPPORTED_VIDEO_TRACK)],\n rules: config.rules ?? [screenResolutionCap, preferHighestResolution],\n parsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,\n resolveDuration: getResolvedSelectedTrackDuration,\n canPlayTrack: config.canPlayTrack ?? canPlayTrack,\n reportUnsupportedTrackConditions: config.reportUnsupportedTrackConditions ?? reportUnsupportedTrackConditions,\n };\n\n return createComposition(\n [\n resolvePresentation,\n // Presentation duration\n calculatePresentationDuration,\n\n // Owns `errors` and its per-source lifecycle; reporters append into it.\n collectErrors,\n\n // Track selection - pinned single-rendition pick on presentation resolve,\n // unpinned again if the constraint pre-pass later prunes every rendition\n // (which is how a container relabel reaches a pick already made).\n selectVideoTrack,\n // Resolve selected video track (fetch its media playlist)\n resolveVideoTrack,\n // Segment loading — video-only.\n loadVideoSegments,\n\n // MSE setup — video-only.\n setupMediaSource,\n updateMediaSourceDuration,\n setupVideoBufferActors,\n\n // Playback tracking\n trackCurrentTime,\n\n // Environment tracking — the signal source for a screen-size rendition\n // cap. Independent of the presentation, so it sits outside the\n // resolve/select/load sequence above.\n trackScreenResolution,\n\n // End of stream coordination\n endOfStream,\n\n // Behavior whose sole purpose is to expose signal refs via a callback\n // (e.g. to an adapter). Listed last so initial signal setup has run\n // before the callback fires.\n shareSignals,\n ],\n {\n config: finalConfig,\n initialState: {\n // Note: Set to true until we add preload configuration\n loadActivated: true,\n },\n }\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA6JA,MAAM,eAAe,iBAA2E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuChG,SAAgB,4BACd,SAAsC,CAAC,GACgC;CACvE,MAAM,cAAc;EAClB,GAAG;EACH,aAAa,OAAO,eAAe,CAAC,yBAAyB,sBAAA,IAAmD,CAAC;EACjH,OAAO,OAAO,SAAS,CAAC,qBAAqB,uBAAuB;EACpE,mBAAmB,OAAO,qBAAqB;EAC/C,iBAAiB;EACjB,cAAc,OAAO,gBAAgB;EACrC,kCAAkC,OAAO,oCAAoC;CAC/E;CAEA,OAAO,kBACL;EACE;EAEA;EAGA;EAKA;EAEA;EAEA;EAGA;EACA;EACA;EAGA;EAKA;EAGA;EAKA;CACF,GACA;EACE,QAAQ;EACR,cAAc,EAEZ,eAAe,KACjB;CACF,CACF;AACF"}
|