@videojs/spf 10.0.0-beta.24 → 10.0.0-beta.26
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 +5 -0
- package/dist/default/background-video.js +3 -0
- package/dist/default/core/actors/create-machine-actor.js.map +1 -1
- package/dist/default/core/actors/create-transition-actor.js.map +1 -1
- package/dist/default/core/composition/create-composition.js +2 -2
- package/dist/default/core/composition/create-composition.js.map +1 -1
- package/dist/default/core/composition/share-signals.js +13 -11
- package/dist/default/core/composition/share-signals.js.map +1 -1
- package/dist/default/core/machine.js.map +1 -1
- package/dist/default/core/reactors/create-machine-reactor.js.map +1 -1
- package/dist/default/core/signals/effect.js.map +1 -1
- package/dist/default/core/signals/primitives.js.map +1 -1
- package/dist/default/core/tasks/task.js.map +1 -1
- package/dist/default/hls.js +4 -1
- package/dist/default/media/abr/quality-selection.js +6 -68
- package/dist/default/media/abr/quality-selection.js.map +1 -1
- package/dist/default/media/buffer/back-buffer.js.map +1 -1
- package/dist/default/media/buffer/forward-buffer.js +37 -3
- package/dist/default/media/buffer/forward-buffer.js.map +1 -1
- package/dist/default/media/dom/capabilities.js +70 -0
- package/dist/default/media/dom/capabilities.js.map +1 -0
- package/dist/default/media/dom/mse/append-segment.js.map +1 -1
- package/dist/default/media/dom/mse/buffer-flusher.js.map +1 -1
- package/dist/default/media/dom/mse/duration.js +27 -10
- package/dist/default/media/dom/mse/duration.js.map +1 -1
- package/dist/default/media/dom/mse/end-of-stream.js.map +1 -1
- package/dist/default/media/dom/mse/mediasource-setup.js +68 -17
- package/dist/default/media/dom/mse/mediasource-setup.js.map +1 -1
- package/dist/default/media/dom/text/resolve-vtt-segment.js +1 -7
- package/dist/default/media/dom/text/resolve-vtt-segment.js.map +1 -1
- package/dist/default/media/dom/text/text-track-slots.js +3 -3
- package/dist/default/media/dom/text/text-track-slots.js.map +1 -1
- package/dist/default/media/hls/parse-attributes.js +17 -3
- package/dist/default/media/hls/parse-attributes.js.map +1 -1
- package/dist/default/media/hls/parse-media-playlist.js +29 -1
- package/dist/default/media/hls/parse-media-playlist.js.map +1 -1
- package/dist/default/media/hls/parse-multivariant.js +15 -6
- package/dist/default/media/hls/parse-multivariant.js.map +1 -1
- package/dist/default/media/hls/resolve-url.js.map +1 -1
- 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/select-tracks.js +98 -13
- package/dist/default/media/primitives/select-tracks.js.map +1 -1
- 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.map +1 -1
- 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.map +1 -1
- package/dist/default/media/utils/track-selection.js +1 -1
- package/dist/default/media/utils/track-selection.js.map +1 -1
- package/dist/default/media/utils/tracks.js +31 -4
- package/dist/default/media/utils/tracks.js.map +1 -1
- package/dist/default/media-tracks.js +2 -0
- package/dist/default/network/bandwidth-estimator.js.map +1 -1
- package/dist/default/network/chunked-stream-iterable.js.map +1 -1
- package/dist/default/network/ewma.js +1 -1
- package/dist/default/network/ewma.js.map +1 -1
- package/dist/default/network/fetch.js +7 -1
- package/dist/default/network/fetch.js.map +1 -1
- package/dist/default/playback/actors/dom/segment-loader.js +103 -106
- package/dist/default/playback/actors/dom/segment-loader.js.map +1 -1
- package/dist/default/playback/actors/dom/source-buffer.js +3 -1
- package/dist/default/playback/actors/dom/source-buffer.js.map +1 -1
- package/dist/default/playback/actors/dom/text-tracks.js.map +1 -1
- package/dist/default/playback/actors/text-track-segment-loader.js +30 -16
- package/dist/default/playback/actors/text-track-segment-loader.js.map +1 -1
- package/dist/default/playback/behaviors/calculate-presentation-duration.js +21 -43
- package/dist/default/playback/behaviors/calculate-presentation-duration.js.map +1 -1
- 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 +25 -102
- package/dist/default/playback/behaviors/dom/end-of-stream.js.map +1 -1
- package/dist/default/playback/behaviors/dom/load-segments.js +6 -2
- package/dist/default/playback/behaviors/dom/load-segments.js.map +1 -1
- 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/setup-buffer-actors.js +50 -18
- package/dist/default/playback/behaviors/dom/setup-buffer-actors.js.map +1 -1
- package/dist/default/playback/behaviors/dom/setup-mediasource.js +36 -11
- package/dist/default/playback/behaviors/dom/setup-mediasource.js.map +1 -1
- package/dist/default/playback/behaviors/dom/setup-text-track-actors.js +11 -25
- package/dist/default/playback/behaviors/dom/setup-text-track-actors.js.map +1 -1
- package/dist/default/playback/behaviors/dom/sync-text-tracks.js +43 -18
- package/dist/default/playback/behaviors/dom/sync-text-tracks.js.map +1 -1
- package/dist/default/playback/behaviors/dom/track-current-time.js +6 -0
- package/dist/default/playback/behaviors/dom/track-current-time.js.map +1 -1
- package/dist/default/playback/behaviors/dom/track-load-triggers.js +4 -4
- package/dist/default/playback/behaviors/dom/track-load-triggers.js.map +1 -1
- package/dist/default/playback/behaviors/dom/track-playback-rate.js.map +1 -1
- package/dist/default/playback/behaviors/dom/update-mediasource-duration.js +3 -2
- package/dist/default/playback/behaviors/dom/update-mediasource-duration.js.map +1 -1
- package/dist/default/playback/behaviors/establish-start-media-time.js +123 -0
- package/dist/default/playback/behaviors/establish-start-media-time.js.map +1 -0
- package/dist/default/playback/behaviors/resolve-presentation.js.map +1 -1
- package/dist/default/playback/behaviors/resolve-track.js +45 -22
- package/dist/default/playback/behaviors/resolve-track.js.map +1 -1
- package/dist/default/playback/behaviors/select-tracks.js +46 -77
- package/dist/default/playback/behaviors/select-tracks.js.map +1 -1
- 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.map +1 -1
- package/dist/default/playback/behaviors/track-switching.js +403 -0
- package/dist/default/playback/behaviors/track-switching.js.map +1 -0
- package/dist/default/playback/engines/background-video/adapter.js +158 -0
- package/dist/default/playback/engines/background-video/adapter.js.map +1 -0
- package/dist/default/playback/engines/background-video/engine.js +75 -0
- package/dist/default/playback/engines/background-video/engine.js.map +1 -0
- package/dist/default/playback/engines/hls/adapter-audio-only.js +124 -0
- package/dist/default/playback/engines/hls/adapter-audio-only.js.map +1 -0
- package/dist/default/playback/engines/hls/adapter.js +20 -11
- package/dist/default/playback/engines/hls/adapter.js.map +1 -1
- package/dist/default/playback/engines/hls/engine-audio-only.js +94 -0
- package/dist/default/playback/engines/hls/engine-audio-only.js.map +1 -0
- package/dist/default/playback/engines/hls/engine.js +38 -8
- package/dist/default/playback/engines/hls/engine.js.map +1 -1
- 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/relocation-pipelines.js +203 -0
- package/dist/default/playback/primitives/relocation-pipelines.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/text-segment-load-pipeline.js +37 -0
- package/dist/default/playback/primitives/text-segment-load-pipeline.js.map +1 -0
- package/dist/{dev/playback/behaviors → default/playback/primitives}/track-types.js +1 -1
- package/dist/default/playback/primitives/track-types.js.map +1 -0
- package/dist/dev/background-video.d.ts +3 -0
- package/dist/dev/background-video.js +3 -0
- package/dist/dev/core/actors/actor.d.ts +0 -1
- package/dist/dev/core/actors/actor.d.ts.map +1 -1
- package/dist/dev/core/actors/create-machine-actor.d.ts +9 -6
- package/dist/dev/core/actors/create-machine-actor.d.ts.map +1 -1
- package/dist/dev/core/actors/create-machine-actor.js.map +1 -1
- package/dist/dev/core/actors/create-transition-actor.d.ts +0 -1
- package/dist/dev/core/actors/create-transition-actor.d.ts.map +1 -1
- package/dist/dev/core/actors/create-transition-actor.js.map +1 -1
- package/dist/dev/core/composition/create-composition.d.ts +10 -11
- package/dist/dev/core/composition/create-composition.d.ts.map +1 -1
- package/dist/dev/core/composition/create-composition.js +2 -2
- package/dist/dev/core/composition/create-composition.js.map +1 -1
- package/dist/dev/core/composition/share-signals.d.ts +11 -10
- package/dist/dev/core/composition/share-signals.d.ts.map +1 -1
- package/dist/dev/core/composition/share-signals.js +13 -11
- package/dist/dev/core/composition/share-signals.js.map +1 -1
- package/dist/dev/core/machine.d.ts +1 -0
- package/dist/dev/core/machine.d.ts.map +1 -1
- package/dist/dev/core/machine.js.map +1 -1
- package/dist/dev/core/reactors/create-machine-reactor.d.ts +2 -2
- package/dist/dev/core/reactors/create-machine-reactor.d.ts.map +1 -1
- package/dist/dev/core/reactors/create-machine-reactor.js.map +1 -1
- package/dist/dev/core/signals/effect.d.ts.map +1 -1
- package/dist/dev/core/signals/effect.js.map +1 -1
- package/dist/dev/core/signals/primitives.d.ts +1 -2
- package/dist/dev/core/signals/primitives.d.ts.map +1 -1
- package/dist/dev/core/signals/primitives.js.map +1 -1
- package/dist/dev/core/tasks/task.d.ts +2 -2
- package/dist/dev/core/tasks/task.d.ts.map +1 -1
- package/dist/dev/core/tasks/task.js.map +1 -1
- package/dist/dev/hls.d.ts +5 -1
- package/dist/dev/hls.js +4 -1
- package/dist/dev/index.d.ts +0 -1
- package/dist/dev/index.d.ts.map +1 -1
- package/dist/dev/media/abr/quality-selection.d.ts.map +1 -1
- package/dist/dev/media/abr/quality-selection.js +6 -68
- package/dist/dev/media/abr/quality-selection.js.map +1 -1
- package/dist/dev/media/buffer/back-buffer.d.ts.map +1 -1
- package/dist/dev/media/buffer/back-buffer.js.map +1 -1
- package/dist/dev/media/buffer/forward-buffer.d.ts.map +1 -1
- package/dist/dev/media/buffer/forward-buffer.js +37 -3
- package/dist/dev/media/buffer/forward-buffer.js.map +1 -1
- package/dist/dev/media/dom/capabilities.js +70 -0
- package/dist/dev/media/dom/capabilities.js.map +1 -0
- package/dist/dev/media/dom/mse/append-segment.d.ts +3 -9
- package/dist/dev/media/dom/mse/append-segment.d.ts.map +1 -1
- package/dist/dev/media/dom/mse/append-segment.js.map +1 -1
- package/dist/dev/media/dom/mse/buffer-flusher.d.ts.map +1 -1
- package/dist/dev/media/dom/mse/buffer-flusher.js.map +1 -1
- package/dist/dev/media/dom/mse/duration.js +27 -10
- package/dist/dev/media/dom/mse/duration.js.map +1 -1
- package/dist/dev/media/dom/mse/end-of-stream.js.map +1 -1
- package/dist/dev/media/dom/mse/mediasource-setup.js +68 -17
- package/dist/dev/media/dom/mse/mediasource-setup.js.map +1 -1
- package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts +0 -6
- package/dist/dev/media/dom/text/resolve-vtt-segment.d.ts.map +1 -1
- package/dist/dev/media/dom/text/resolve-vtt-segment.js +1 -7
- package/dist/dev/media/dom/text/resolve-vtt-segment.js.map +1 -1
- package/dist/dev/media/dom/text/text-track-slots.d.ts +0 -1
- package/dist/dev/media/dom/text/text-track-slots.d.ts.map +1 -1
- package/dist/dev/media/dom/text/text-track-slots.js +3 -3
- package/dist/dev/media/dom/text/text-track-slots.js.map +1 -1
- package/dist/dev/media/hls/parse-attributes.js +17 -3
- package/dist/dev/media/hls/parse-attributes.js.map +1 -1
- package/dist/dev/media/hls/parse-media-playlist.js +29 -1
- package/dist/dev/media/hls/parse-media-playlist.js.map +1 -1
- package/dist/dev/media/hls/parse-multivariant.js +15 -6
- package/dist/dev/media/hls/parse-multivariant.js.map +1 -1
- package/dist/dev/media/hls/resolve-url.js.map +1 -1
- 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/select-tracks.d.ts +35 -0
- package/dist/dev/media/primitives/select-tracks.d.ts.map +1 -0
- package/dist/dev/media/primitives/select-tracks.js +98 -13
- package/dist/dev/media/primitives/select-tracks.js.map +1 -1
- 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 +69 -2
- package/dist/dev/media/types/index.d.ts.map +1 -1
- package/dist/dev/media/types/index.js.map +1 -1
- 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.map +1 -1
- package/dist/dev/media/utils/track-selection.js +1 -1
- package/dist/dev/media/utils/track-selection.js.map +1 -1
- package/dist/dev/media/utils/tracks.js +31 -4
- package/dist/dev/media/utils/tracks.js.map +1 -1
- package/dist/dev/media-tracks.d.ts +3 -0
- package/dist/dev/media-tracks.js +2 -0
- package/dist/dev/network/bandwidth-estimator.d.ts.map +1 -1
- package/dist/dev/network/bandwidth-estimator.js.map +1 -1
- package/dist/dev/network/chunked-stream-iterable.js.map +1 -1
- package/dist/dev/network/ewma.js +1 -1
- package/dist/dev/network/ewma.js.map +1 -1
- package/dist/dev/network/fetch.js +7 -1
- package/dist/dev/network/fetch.js.map +1 -1
- package/dist/dev/playback/actors/dom/segment-loader.d.ts +16 -4
- package/dist/dev/playback/actors/dom/segment-loader.d.ts.map +1 -1
- package/dist/dev/playback/actors/dom/segment-loader.js +103 -106
- package/dist/dev/playback/actors/dom/segment-loader.js.map +1 -1
- package/dist/dev/playback/actors/dom/source-buffer.d.ts +10 -25
- package/dist/dev/playback/actors/dom/source-buffer.d.ts.map +1 -1
- package/dist/dev/playback/actors/dom/source-buffer.js +3 -1
- package/dist/dev/playback/actors/dom/source-buffer.js.map +1 -1
- package/dist/dev/playback/actors/dom/text-tracks.d.ts +3 -1
- package/dist/dev/playback/actors/dom/text-tracks.js.map +1 -1
- package/dist/dev/playback/actors/text-track-segment-loader.d.ts +7 -12
- package/dist/dev/playback/actors/text-track-segment-loader.d.ts.map +1 -1
- package/dist/dev/playback/actors/text-track-segment-loader.js +30 -16
- package/dist/dev/playback/actors/text-track-segment-loader.js.map +1 -1
- package/dist/dev/playback/actors/text-tracks.d.ts +3 -12
- package/dist/dev/playback/actors/text-tracks.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts +11 -2
- package/dist/dev/playback/behaviors/calculate-presentation-duration.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/calculate-presentation-duration.js +21 -43
- package/dist/dev/playback/behaviors/calculate-presentation-duration.js.map +1 -1
- 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 +25 -102
- package/dist/dev/playback/behaviors/dom/end-of-stream.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/load-segments.d.ts +14 -4
- package/dist/dev/playback/behaviors/dom/load-segments.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/dom/load-segments.js +6 -2
- package/dist/dev/playback/behaviors/dom/load-segments.js.map +1 -1
- 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/setup-buffer-actors.js +50 -18
- package/dist/dev/playback/behaviors/dom/setup-buffer-actors.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/setup-mediasource.js +36 -11
- package/dist/dev/playback/behaviors/dom/setup-mediasource.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts +16 -19
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js +11 -25
- package/dist/dev/playback/behaviors/dom/setup-text-track-actors.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/sync-text-tracks.js +43 -18
- package/dist/dev/playback/behaviors/dom/sync-text-tracks.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-current-time.d.ts +1 -2
- package/dist/dev/playback/behaviors/dom/track-current-time.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-current-time.js +6 -0
- package/dist/dev/playback/behaviors/dom/track-current-time.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts +1 -2
- package/dist/dev/playback/behaviors/dom/track-load-triggers.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-load-triggers.js +4 -4
- package/dist/dev/playback/behaviors/dom/track-load-triggers.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts +1 -2
- package/dist/dev/playback/behaviors/dom/track-playback-rate.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/dom/track-playback-rate.js.map +1 -1
- package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js +3 -2
- package/dist/dev/playback/behaviors/dom/update-mediasource-duration.js.map +1 -1
- package/dist/dev/playback/behaviors/establish-start-media-time.d.ts +31 -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 +123 -0
- package/dist/dev/playback/behaviors/establish-start-media-time.js.map +1 -0
- package/dist/dev/playback/behaviors/resolve-presentation.d.ts +2 -1
- package/dist/dev/playback/behaviors/resolve-presentation.d.ts.map +1 -1
- package/dist/dev/playback/behaviors/resolve-presentation.js.map +1 -1
- package/dist/dev/playback/behaviors/resolve-track.js +45 -22
- package/dist/dev/playback/behaviors/resolve-track.js.map +1 -1
- package/dist/dev/playback/behaviors/select-tracks.d.ts +14 -0
- package/dist/dev/playback/behaviors/select-tracks.d.ts.map +1 -0
- package/dist/dev/playback/behaviors/select-tracks.js +46 -77
- package/dist/dev/playback/behaviors/select-tracks.js.map +1 -1
- 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.map +1 -1
- package/dist/dev/playback/behaviors/track-switching.js +403 -0
- package/dist/dev/playback/behaviors/track-switching.js.map +1 -0
- package/dist/dev/playback/engines/background-video/adapter.d.ts +59 -0
- package/dist/dev/playback/engines/background-video/adapter.d.ts.map +1 -0
- package/dist/dev/playback/engines/background-video/adapter.js +158 -0
- package/dist/dev/playback/engines/background-video/adapter.js.map +1 -0
- package/dist/dev/playback/engines/background-video/engine.d.ts +106 -0
- package/dist/dev/playback/engines/background-video/engine.d.ts.map +1 -0
- package/dist/dev/playback/engines/background-video/engine.js +75 -0
- package/dist/dev/playback/engines/background-video/engine.js.map +1 -0
- package/dist/dev/playback/engines/hls/adapter-audio-only.d.ts +46 -0
- package/dist/dev/playback/engines/hls/adapter-audio-only.d.ts.map +1 -0
- package/dist/dev/playback/engines/hls/adapter-audio-only.js +124 -0
- package/dist/dev/playback/engines/hls/adapter-audio-only.js.map +1 -0
- package/dist/dev/playback/engines/hls/adapter.d.ts +3 -5
- package/dist/dev/playback/engines/hls/adapter.d.ts.map +1 -1
- package/dist/dev/playback/engines/hls/adapter.js +20 -11
- package/dist/dev/playback/engines/hls/adapter.js.map +1 -1
- package/dist/dev/playback/engines/hls/engine-audio-only.d.ts +156 -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 +94 -0
- package/dist/dev/playback/engines/hls/engine-audio-only.js.map +1 -0
- package/dist/dev/playback/engines/hls/engine.d.ts +109 -4
- package/dist/dev/playback/engines/hls/engine.d.ts.map +1 -1
- package/dist/dev/playback/engines/hls/engine.js +38 -8
- package/dist/dev/playback/engines/hls/engine.js.map +1 -1
- 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/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/relocation-pipelines.js +203 -0
- package/dist/dev/playback/primitives/relocation-pipelines.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/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/{default/playback/behaviors → dev/playback/primitives}/track-types.js +1 -1
- package/dist/dev/playback/primitives/track-types.js.map +1 -0
- package/package.json +17 -7
- package/dist/default/playback/behaviors/quality-switching.js +0 -96
- package/dist/default/playback/behaviors/quality-switching.js.map +0 -1
- package/dist/default/playback/behaviors/track-types.js.map +0 -1
- package/dist/dev/playback/behaviors/quality-switching.js +0 -96
- package/dist/dev/playback/behaviors/quality-switching.js.map +0 -1
- package/dist/dev/playback/behaviors/track-types.js.map +0 -1
|
@@ -2,7 +2,8 @@ import { createSimpleHlsEngine } from "./engine.js";
|
|
|
2
2
|
//#region src/playback/engines/hls/adapter.ts
|
|
3
3
|
const simpleHlsMediaDefaultProps = {
|
|
4
4
|
src: "",
|
|
5
|
-
preload: ""
|
|
5
|
+
preload: "",
|
|
6
|
+
disableRemotePlayback: false
|
|
6
7
|
};
|
|
7
8
|
/**
|
|
8
9
|
* Mixin that adds SPF playback engine behavior to any base class.
|
|
@@ -10,10 +11,8 @@ const simpleHlsMediaDefaultProps = {
|
|
|
10
11
|
* Implements the src/play() contract per the WHATWG HTML spec so that SPF can
|
|
11
12
|
* be used anywhere a media element API is expected.
|
|
12
13
|
*
|
|
13
|
-
* A
|
|
14
|
-
*
|
|
15
|
-
* the next one begins. The media element reference is preserved across src
|
|
16
|
-
* changes and re-applied to the new engine automatically.
|
|
14
|
+
* A single engine instance is created at construction and recycled across src
|
|
15
|
+
* changes.
|
|
17
16
|
*
|
|
18
17
|
* @example
|
|
19
18
|
* class SimpleHlsMedia extends SimpleHlsMediaMixin(HTMLVideoElementHost) {}
|
|
@@ -28,6 +27,7 @@ function SimpleHlsMediaMixin(BaseClass) {
|
|
|
28
27
|
#config;
|
|
29
28
|
#signals;
|
|
30
29
|
#preload = simpleHlsMediaDefaultProps.preload;
|
|
30
|
+
#disableRemotePlayback = simpleHlsMediaDefaultProps.disableRemotePlayback;
|
|
31
31
|
/** Pending loadstart listener from a deferred play() retry, if any. */
|
|
32
32
|
#loadstartListener = null;
|
|
33
33
|
constructor(...args) {
|
|
@@ -36,6 +36,12 @@ function SimpleHlsMediaMixin(BaseClass) {
|
|
|
36
36
|
this.#config = config;
|
|
37
37
|
this.#engine = this.#createEngine();
|
|
38
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Underlying playback engine — the low-level SPF reactive composition that
|
|
41
|
+
* drives playback. An advanced escape hatch for direct engine access;
|
|
42
|
+
* normal playback is driven through this element's own properties and
|
|
43
|
+
* methods.
|
|
44
|
+
*/
|
|
39
45
|
get engine() {
|
|
40
46
|
return this.#engine;
|
|
41
47
|
}
|
|
@@ -52,6 +58,7 @@ function SimpleHlsMediaMixin(BaseClass) {
|
|
|
52
58
|
this.#cancelPendingPlay();
|
|
53
59
|
this.#engine.destroy();
|
|
54
60
|
}
|
|
61
|
+
/** Preload type (`'none'` / `'metadata'` / `'auto'`). */
|
|
55
62
|
get preload() {
|
|
56
63
|
return this.#preload;
|
|
57
64
|
}
|
|
@@ -59,17 +66,19 @@ function SimpleHlsMediaMixin(BaseClass) {
|
|
|
59
66
|
this.#preload = value;
|
|
60
67
|
if (value) this.#signals.state.preload.set(value);
|
|
61
68
|
}
|
|
69
|
+
get disableRemotePlayback() {
|
|
70
|
+
return this.#disableRemotePlayback;
|
|
71
|
+
}
|
|
72
|
+
set disableRemotePlayback(value) {
|
|
73
|
+
this.#disableRemotePlayback = value;
|
|
74
|
+
this.#signals.state.disableRemotePlayback.set(value);
|
|
75
|
+
}
|
|
62
76
|
get src() {
|
|
63
77
|
return this.#signals.state.presentation.get()?.url ?? "";
|
|
64
78
|
}
|
|
65
79
|
set src(value) {
|
|
66
|
-
const prevMediaElement = this.#signals.context.mediaElement.get();
|
|
67
80
|
this.#cancelPendingPlay();
|
|
68
|
-
this.#
|
|
69
|
-
this.#engine = this.#createEngine();
|
|
70
|
-
if (this.#preload) this.#signals.state.preload.set(this.#preload);
|
|
71
|
-
if (prevMediaElement) this.#signals.context.mediaElement.set(prevMediaElement);
|
|
72
|
-
if (value) this.#signals.state.presentation.set({ url: value });
|
|
81
|
+
this.#signals.state.presentation.set(value ? { url: value } : void 0);
|
|
73
82
|
}
|
|
74
83
|
play() {
|
|
75
84
|
const mediaElement = this.#signals.context.mediaElement.get();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","names":["#config","#engine","#createEngine","#signals","#cancelPendingPlay","#preload","#loadstartListener"],"sources":["../../../../../src/playback/engines/hls/adapter.ts"],"sourcesContent":["import type { Constructor, MixinReturn } from '@videojs/utils/types';\nimport type { Composition } from '../../../core/composition/create-composition';\nimport {\n createSimpleHlsEngine,\n type SimpleHlsEngineConfig,\n type SimpleHlsEngineContext,\n type SimpleHlsEngineSignals,\n type SimpleHlsEngineState,\n} from './engine';\n\nexport interface SimpleHlsMediaProps {\n src: string;\n preload: '' | 'none' | 'metadata' | 'auto';\n}\n\nexport const simpleHlsMediaDefaultProps: SimpleHlsMediaProps = {\n src: '',\n preload: '',\n};\n\nexport interface SimpleHlsMediaAPI extends SimpleHlsMediaProps {\n readonly engine: Composition<SimpleHlsEngineState, SimpleHlsEngineContext>;\n attach(mediaElement: HTMLMediaElement): void;\n detach(): void;\n destroy(): void;\n play(): Promise<void>;\n}\n\n/**\n * Mixin that adds SPF playback engine behavior to any base class.\n *\n * Implements the src/play() contract per the WHATWG HTML spec so that SPF can\n * be used anywhere a media element API is expected.\n *\n * A new engine is created on every src assignment — this fully tears down all\n * state, SourceBuffers, and in-flight requests from the previous source before\n * the next one begins. The media element reference is preserved across src\n * changes and re-applied to the new engine automatically.\n *\n * @example\n * class SimpleHlsMedia extends SimpleHlsMediaMixin(HTMLVideoElementHost) {}\n *\n * const media = new SimpleHlsMedia();\n * media.attach(document.querySelector('video'));\n * media.src = 'https://stream.mux.com/abc123.m3u8';\n */\nexport function SimpleHlsMediaMixin<Base extends Constructor<any>>(BaseClass: Base) {\n class SimpleHlsMediaImpl extends BaseClass {\n #engine: Composition<SimpleHlsEngineState, SimpleHlsEngineContext>;\n #config: SimpleHlsEngineConfig;\n #signals!: SimpleHlsEngineSignals;\n #preload: '' | 'none' | 'metadata' | 'auto' = simpleHlsMediaDefaultProps.preload;\n\n /** Pending loadstart listener from a deferred play() retry, if any. */\n #loadstartListener: (() => void) | null = null;\n\n constructor(...args: any[]) {\n super(...args);\n\n const { config } = args?.[0] ?? {};\n this.#config = config;\n this.#engine = this.#createEngine();\n }\n\n get engine(): Composition<SimpleHlsEngineState, SimpleHlsEngineContext> {\n return this.#engine;\n }\n\n // -------------------------------------------------------------------------\n // Media element lifecycle\n // -------------------------------------------------------------------------\n\n attach(mediaElement: HTMLMediaElement): void {\n super.attach?.(mediaElement);\n this.#signals.context.mediaElement.set(mediaElement);\n }\n\n detach(): void {\n this.#cancelPendingPlay();\n this.#signals.context.mediaElement.set(undefined);\n super.detach?.();\n }\n\n destroy(): void {\n this.#cancelPendingPlay();\n this.#engine.destroy();\n }\n\n // -------------------------------------------------------------------------\n // preload — synchronous IDL attribute (WHATWG §4.8.11.2)\n // -------------------------------------------------------------------------\n\n get preload(): '' | 'none' | 'metadata' | 'auto' {\n return this.#preload;\n }\n\n set preload(value: '' | 'none' | 'metadata' | 'auto') {\n this.#preload = value;\n if (value) {\n this.#signals.state.preload.set(value);\n }\n // value = '' clears #preload (so the next engine recreation won't re-apply\n // an explicit value) but does not patch current state — the existing preload\n // stays in effect until the next src change creates a fresh engine.\n }\n\n // -------------------------------------------------------------------------\n // src — synchronous IDL attribute (WHATWG §4.8.11.2)\n // Each assignment destroys the current engine and starts a fresh one, exactly\n // as the browser's load algorithm resets all media element state on src change.\n // -------------------------------------------------------------------------\n\n get src(): string {\n return this.#signals.state.presentation.get()?.url ?? '';\n }\n\n set src(value: string) {\n const prevMediaElement = this.#signals.context.mediaElement.get();\n\n this.#cancelPendingPlay();\n this.#engine.destroy();\n this.#engine = this.#createEngine();\n\n // Apply explicit preload before setting context so it's already in\n // state.preload when syncPreload's read effect runs on the attach —\n // the read effect only overwrites when the element's `preload` is a\n // W3C value (which a freshly-created <video> with no attribute is not).\n if (this.#preload) {\n this.#signals.state.preload.set(this.#preload);\n }\n\n if (prevMediaElement) {\n this.#signals.context.mediaElement.set(prevMediaElement);\n }\n\n if (value) {\n this.#signals.state.presentation.set({ url: value });\n }\n }\n\n // -------------------------------------------------------------------------\n // play() — WHATWG §4.8.11.8\n // Delegates to the attached media element's native play().\n // -------------------------------------------------------------------------\n\n play(): Promise<void> {\n const mediaElement = this.#signals.context.mediaElement.get();\n if (!mediaElement) {\n return Promise.reject(new Error('SimpleHlsMediaElement: no media element attached'));\n }\n\n // Signal play intent — enables loading even with preload=\"none\"\n this.#signals.state.loadActivated.set(true);\n\n return mediaElement.play().catch((err: unknown) => {\n // If we have a pending HLS source, the rejection may be because MSE\n // hasn't attached a blob URL yet. Wait for loadstart (src assigned\n // by MSE setup) and retry once.\n if (this.src) {\n return new Promise<void>((resolve, reject) => {\n const listener = () => {\n this.#loadstartListener = null;\n mediaElement.play().then(resolve, reject);\n };\n this.#loadstartListener = listener;\n mediaElement.addEventListener('loadstart', listener, { once: true });\n });\n }\n throw err;\n });\n }\n\n // -------------------------------------------------------------------------\n // Private\n // -------------------------------------------------------------------------\n\n #createEngine(): Composition<SimpleHlsEngineState, SimpleHlsEngineContext> {\n return createSimpleHlsEngine({\n ...this.#config,\n onSignalsReady: (signals) => {\n this.#signals = signals;\n },\n });\n }\n\n #cancelPendingPlay(): void {\n if (!this.#loadstartListener) return;\n const mediaElement = this.#signals.context.mediaElement.get();\n mediaElement?.removeEventListener('loadstart', this.#loadstartListener);\n this.#loadstartListener = null;\n }\n }\n\n return SimpleHlsMediaImpl as unknown as MixinReturn<Base, SimpleHlsMediaAPI>;\n}\n\n/** Standalone SPF media adapter with no base class. */\nexport class SimpleHlsMediaElement extends SimpleHlsMediaMixin(class {}) {}\n"],"mappings":";;AAeA,MAAa,6BAAkD;CAC7D,KAAK;CACL,SAAS;CACV;;;;;;;;;;;;;;;;;;;AA4BD,SAAgB,oBAAmD,WAAiB;CAClF,MAAM,2BAA2B,UAAU;EACzC;EACA;EACA;EACA,WAA8C,2BAA2B;;EAGzE,qBAA0C;EAE1C,YAAY,GAAG,MAAa;AAC1B,SAAM,GAAG,KAAK;GAEd,MAAM,EAAE,WAAW,OAAO,MAAM,EAAE;AAClC,SAAA,SAAe;AACf,SAAA,SAAe,MAAA,cAAoB;;EAGrC,IAAI,SAAoE;AACtE,UAAO,MAAA;;EAOT,OAAO,cAAsC;AAC3C,SAAM,SAAS,aAAa;AAC5B,SAAA,QAAc,QAAQ,aAAa,IAAI,aAAa;;EAGtD,SAAe;AACb,SAAA,mBAAyB;AACzB,SAAA,QAAc,QAAQ,aAAa,IAAI,KAAA,EAAU;AACjD,SAAM,UAAU;;EAGlB,UAAgB;AACd,SAAA,mBAAyB;AACzB,SAAA,OAAa,SAAS;;EAOxB,IAAI,UAA6C;AAC/C,UAAO,MAAA;;EAGT,IAAI,QAAQ,OAA0C;AACpD,SAAA,UAAgB;AAChB,OAAI,MACF,OAAA,QAAc,MAAM,QAAQ,IAAI,MAAM;;EAa1C,IAAI,MAAc;AAChB,UAAO,MAAA,QAAc,MAAM,aAAa,KAAK,EAAE,OAAO;;EAGxD,IAAI,IAAI,OAAe;GACrB,MAAM,mBAAmB,MAAA,QAAc,QAAQ,aAAa,KAAK;AAEjE,SAAA,mBAAyB;AACzB,SAAA,OAAa,SAAS;AACtB,SAAA,SAAe,MAAA,cAAoB;AAMnC,OAAI,MAAA,QACF,OAAA,QAAc,MAAM,QAAQ,IAAI,MAAA,QAAc;AAGhD,OAAI,iBACF,OAAA,QAAc,QAAQ,aAAa,IAAI,iBAAiB;AAG1D,OAAI,MACF,OAAA,QAAc,MAAM,aAAa,IAAI,EAAE,KAAK,OAAO,CAAC;;EASxD,OAAsB;GACpB,MAAM,eAAe,MAAA,QAAc,QAAQ,aAAa,KAAK;AAC7D,OAAI,CAAC,aACH,QAAO,QAAQ,uBAAO,IAAI,MAAM,mDAAmD,CAAC;AAItF,SAAA,QAAc,MAAM,cAAc,IAAI,KAAK;AAE3C,UAAO,aAAa,MAAM,CAAC,OAAO,QAAiB;AAIjD,QAAI,KAAK,IACP,QAAO,IAAI,SAAe,SAAS,WAAW;KAC5C,MAAM,iBAAiB;AACrB,YAAA,oBAA0B;AAC1B,mBAAa,MAAM,CAAC,KAAK,SAAS,OAAO;;AAE3C,WAAA,oBAA0B;AAC1B,kBAAa,iBAAiB,aAAa,UAAU,EAAE,MAAM,MAAM,CAAC;MACpE;AAEJ,UAAM;KACN;;EAOJ,gBAA2E;AACzE,UAAO,sBAAsB;IAC3B,GAAG,MAAA;IACH,iBAAiB,YAAY;AAC3B,WAAA,UAAgB;;IAEnB,CAAC;;EAGJ,qBAA2B;AACzB,OAAI,CAAC,MAAA,kBAAyB;AACT,SAAA,QAAc,QAAQ,aAAa,KAAK,EAC/C,oBAAoB,aAAa,MAAA,kBAAwB;AACvE,SAAA,oBAA0B;;;AAI9B,QAAO;;;AAIT,IAAa,wBAAb,cAA2C,oBAAoB,MAAM,GAAG,CAAC"}
|
|
1
|
+
{"version":3,"file":"adapter.js","names":["#engine","#config","#createEngine","#signals","#cancelPendingPlay","#preload","#disableRemotePlayback","#loadstartListener"],"sources":["../../../../../src/playback/engines/hls/adapter.ts"],"sourcesContent":["import type { Constructor, MixinReturn } from '@videojs/utils/types';\nimport type { Composition } from '../../../core/composition/create-composition';\nimport {\n createSimpleHlsEngine,\n type SimpleHlsEngineConfig,\n type SimpleHlsEngineContext,\n type SimpleHlsEngineSignals,\n type SimpleHlsEngineState,\n} from './engine';\n\nexport interface SimpleHlsMediaProps {\n src: string;\n preload: '' | 'none' | 'metadata' | 'auto';\n disableRemotePlayback: boolean;\n}\n\nexport const simpleHlsMediaDefaultProps: SimpleHlsMediaProps = {\n src: '',\n preload: '',\n disableRemotePlayback: false,\n};\n\nexport interface SimpleHlsMediaAPI extends SimpleHlsMediaProps {\n readonly engine: Composition<SimpleHlsEngineState, SimpleHlsEngineContext>;\n attach(mediaElement: HTMLMediaElement): void;\n detach(): void;\n destroy(): void;\n play(): Promise<void>;\n}\n\n/**\n * Mixin that adds SPF playback engine behavior to any base class.\n *\n * Implements the src/play() contract per the WHATWG HTML spec so that SPF can\n * be used anywhere a media element API is expected.\n *\n * A single engine instance is created at construction and recycled across src\n * changes.\n *\n * @example\n * class SimpleHlsMedia extends SimpleHlsMediaMixin(HTMLVideoElementHost) {}\n *\n * const media = new SimpleHlsMedia();\n * media.attach(document.querySelector('video'));\n * media.src = 'https://stream.mux.com/abc123.m3u8';\n */\nexport function SimpleHlsMediaMixin<Base extends Constructor<any>>(BaseClass: Base) {\n class SimpleHlsMediaImpl extends BaseClass {\n readonly #engine: Composition<SimpleHlsEngineState, SimpleHlsEngineContext>;\n #config: SimpleHlsEngineConfig;\n #signals!: SimpleHlsEngineSignals;\n #preload: '' | 'none' | 'metadata' | 'auto' = simpleHlsMediaDefaultProps.preload;\n #disableRemotePlayback: boolean = simpleHlsMediaDefaultProps.disableRemotePlayback;\n\n /** Pending loadstart listener from a deferred play() retry, if any. */\n #loadstartListener: (() => void) | null = null;\n\n constructor(...args: any[]) {\n super(...args);\n\n const { config } = args?.[0] ?? {};\n this.#config = config;\n this.#engine = this.#createEngine();\n }\n\n /**\n * Underlying playback engine — the low-level SPF reactive composition that\n * drives playback. An advanced escape hatch for direct engine access;\n * normal playback is driven through this element's own properties and\n * methods.\n */\n get engine(): Composition<SimpleHlsEngineState, SimpleHlsEngineContext> {\n return this.#engine;\n }\n\n // -------------------------------------------------------------------------\n // Media element lifecycle\n // -------------------------------------------------------------------------\n\n attach(mediaElement: HTMLMediaElement): void {\n super.attach?.(mediaElement);\n this.#signals.context.mediaElement.set(mediaElement);\n }\n\n detach(): void {\n this.#cancelPendingPlay();\n this.#signals.context.mediaElement.set(undefined);\n super.detach?.();\n }\n\n destroy(): void {\n this.#cancelPendingPlay();\n this.#engine.destroy();\n }\n\n // -------------------------------------------------------------------------\n // preload — synchronous IDL attribute (WHATWG §4.8.11.2)\n // -------------------------------------------------------------------------\n\n /** Preload type (`'none'` / `'metadata'` / `'auto'`). */\n get preload(): '' | 'none' | 'metadata' | 'auto' {\n return this.#preload;\n }\n\n set preload(value: '' | 'none' | 'metadata' | 'auto') {\n this.#preload = value;\n if (value) {\n this.#signals.state.preload.set(value);\n }\n // value = '' resets the IDL mirror (so `get preload` reflects '') but does\n // not patch state — the engine keeps its current preload until an explicit\n // W3C value replaces it.\n }\n\n // -------------------------------------------------------------------------\n // disableRemotePlayback — synchronous IDL attribute (WHATWG Remote Playback)\n // Author intent for whether the AirPlay/remote picker is offered. Mirrors\n // the DOM attribute name; the value flows to `state.disableRemotePlayback`,\n // which `setupAirPlay` reads to honor an explicit opt-out. The underlying\n // <video>'s own `disableRemotePlayback` stays programmatically managed\n // (ManagedMediaSource needs it `true` to open; AirPlay flips it `false` once\n // the source is open), so author intent and the effective flag stay distinct.\n // -------------------------------------------------------------------------\n\n get disableRemotePlayback(): boolean {\n return this.#disableRemotePlayback;\n }\n\n set disableRemotePlayback(value: boolean) {\n this.#disableRemotePlayback = value;\n this.#signals.state.disableRemotePlayback.set(value);\n }\n\n // -------------------------------------------------------------------------\n // src — synchronous IDL attribute (WHATWG §4.8.11.2)\n // Each assignment overwrites the engine's presentation state in place. The\n // resolver FSM routes back through teardown → rebuild on the same engine,\n // mirroring how the browser's load algorithm resets media state on src change\n // — without recreating the engine or re-capturing its signals. Setting an\n // empty src un-resolves the presentation, tearing the current source down to\n // the engine's fresh-but-attached \"no source\" state.\n // -------------------------------------------------------------------------\n\n get src(): string {\n return this.#signals.state.presentation.get()?.url ?? '';\n }\n\n set src(value: string) {\n this.#cancelPendingPlay();\n this.#signals.state.presentation.set(value ? { url: value } : undefined);\n }\n\n // -------------------------------------------------------------------------\n // play() — WHATWG §4.8.11.8\n // Delegates to the attached media element's native play().\n // -------------------------------------------------------------------------\n\n play(): Promise<void> {\n const mediaElement = this.#signals.context.mediaElement.get();\n if (!mediaElement) {\n return Promise.reject(new Error('SimpleHlsMediaElement: no media element attached'));\n }\n\n // Signal play intent — enables loading even with preload=\"none\"\n this.#signals.state.loadActivated.set(true);\n\n return mediaElement.play().catch((err: unknown) => {\n // If we have a pending HLS source, the rejection may be because MSE\n // hasn't attached a blob URL yet. Wait for loadstart (src assigned\n // by MSE setup) and retry once.\n if (this.src) {\n return new Promise<void>((resolve, reject) => {\n const listener = () => {\n this.#loadstartListener = null;\n mediaElement.play().then(resolve, reject);\n };\n this.#loadstartListener = listener;\n mediaElement.addEventListener('loadstart', listener, { once: true });\n });\n }\n throw err;\n });\n }\n\n // -------------------------------------------------------------------------\n // Private\n // -------------------------------------------------------------------------\n\n #createEngine(): Composition<SimpleHlsEngineState, SimpleHlsEngineContext> {\n return createSimpleHlsEngine({\n ...this.#config,\n onSignalsReady: (signals) => {\n this.#signals = signals;\n },\n });\n }\n\n #cancelPendingPlay(): void {\n if (!this.#loadstartListener) return;\n const mediaElement = this.#signals.context.mediaElement.get();\n mediaElement?.removeEventListener('loadstart', this.#loadstartListener);\n this.#loadstartListener = null;\n }\n }\n\n return SimpleHlsMediaImpl as unknown as MixinReturn<Base, SimpleHlsMediaAPI>;\n}\n\n/** Standalone SPF media adapter with no base class. */\nexport class SimpleHlsMediaElement extends SimpleHlsMediaMixin(class {}) {}\n"],"mappings":";;AAgBA,MAAa,6BAAkD;CAC7D,KAAK;CACL,SAAS;CACT,uBAAuB;AACzB;;;;;;;;;;;;;;;;;AA0BA,SAAgB,oBAAmD,WAAiB;CAClF,MAAM,2BAA2B,UAAU;EACzC;EACA;EACA;EACA,WAA8C,2BAA2B;EACzE,yBAAkC,2BAA2B;;EAG7D,qBAA0C;EAE1C,YAAY,GAAG,MAAa;GAC1B,MAAM,GAAG,IAAI;GAEb,MAAM,EAAE,WAAW,OAAO,MAAM,CAAC;GACjC,KAAKC,UAAU;GACf,KAAKD,UAAU,KAAKE,cAAc;EACpC;;;;;;;EAQA,IAAI,SAAoE;GACtE,OAAO,KAAKF;EACd;EAMA,OAAO,cAAsC;GAC3C,MAAM,SAAS,YAAY;GAC3B,KAAKG,SAAS,QAAQ,aAAa,IAAI,YAAY;EACrD;EAEA,SAAe;GACb,KAAKC,mBAAmB;GACxB,KAAKD,SAAS,QAAQ,aAAa,IAAI,KAAA,CAAS;GAChD,MAAM,SAAS;EACjB;EAEA,UAAgB;GACd,KAAKC,mBAAmB;GACxB,KAAKJ,QAAQ,QAAQ;EACvB;;EAOA,IAAI,UAA6C;GAC/C,OAAO,KAAKK;EACd;EAEA,IAAI,QAAQ,OAA0C;GACpD,KAAKA,WAAW;GAChB,IAAI,OACF,KAAKF,SAAS,MAAM,QAAQ,IAAI,KAAK;EAKzC;EAYA,IAAI,wBAAiC;GACnC,OAAO,KAAKG;EACd;EAEA,IAAI,sBAAsB,OAAgB;GACxC,KAAKA,yBAAyB;GAC9B,KAAKH,SAAS,MAAM,sBAAsB,IAAI,KAAK;EACrD;EAYA,IAAI,MAAc;GAChB,OAAO,KAAKA,SAAS,MAAM,aAAa,IAAI,CAAC,EAAE,OAAO;EACxD;EAEA,IAAI,IAAI,OAAe;GACrB,KAAKC,mBAAmB;GACxB,KAAKD,SAAS,MAAM,aAAa,IAAI,QAAQ,EAAE,KAAK,MAAM,IAAI,KAAA,CAAS;EACzE;EAOA,OAAsB;GACpB,MAAM,eAAe,KAAKA,SAAS,QAAQ,aAAa,IAAI;GAC5D,IAAI,CAAC,cACH,OAAO,QAAQ,uBAAO,IAAI,MAAM,kDAAkD,CAAC;GAIrF,KAAKA,SAAS,MAAM,cAAc,IAAI,IAAI;GAE1C,OAAO,aAAa,KAAK,CAAC,CAAC,OAAO,QAAiB;IAIjD,IAAI,KAAK,KACP,OAAO,IAAI,SAAe,SAAS,WAAW;KAC5C,MAAM,iBAAiB;MACrB,KAAKI,qBAAqB;MAC1B,aAAa,KAAK,CAAC,CAAC,KAAK,SAAS,MAAM;KAC1C;KACA,KAAKA,qBAAqB;KAC1B,aAAa,iBAAiB,aAAa,UAAU,EAAE,MAAM,KAAK,CAAC;IACrE,CAAC;IAEH,MAAM;GACR,CAAC;EACH;EAMA,gBAA2E;GACzE,OAAO,sBAAsB;IAC3B,GAAG,KAAKN;IACR,iBAAiB,YAAY;KAC3B,KAAKE,WAAW;IAClB;GACF,CAAC;EACH;EAEA,qBAA2B;GACzB,IAAI,CAAC,KAAKI,oBAAoB;GAE9B,KAD0BJ,SAAS,QAAQ,aAAa,IAC7C,CAAC,EAAE,oBAAoB,aAAa,KAAKI,kBAAkB;GACtE,KAAKA,qBAAqB;EAC5B;CACF;CAEA,OAAO;AACT;;AAGA,IAAa,wBAAb,cAA2C,oBAAoB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,156 @@
|
|
|
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 { ParsePresentation } from "../../behaviors/resolve-presentation.js";
|
|
9
|
+
import { DeriveStartMediaTime } from "../../primitives/derive-start-media-time.js";
|
|
10
|
+
import "../../behaviors/establish-start-media-time.js";
|
|
11
|
+
import { GetCdnId } from "../../../media/utils/cdn.js";
|
|
12
|
+
import { PresentationDurationResolver } from "../../behaviors/calculate-presentation-duration.js";
|
|
13
|
+
import { FailoverMonitorConfig } from "../../behaviors/setup-failover-monitor.js";
|
|
14
|
+
//#region src/playback/engines/hls/engine-audio-only.d.ts
|
|
15
|
+
/**
|
|
16
|
+
* State shape for the audio-only HLS playback engine.
|
|
17
|
+
*
|
|
18
|
+
* Subset of `SimpleHlsEngineState` covering only the slots written and read
|
|
19
|
+
* by audio-side behaviors. Video and text-track slots are absent —
|
|
20
|
+
* subtractive composition removes the behaviors that declare them.
|
|
21
|
+
*/
|
|
22
|
+
interface SimpleHlsAudioOnlyEngineState {
|
|
23
|
+
presentation?: MaybeResolvedPresentation;
|
|
24
|
+
preload?: 'auto' | 'metadata' | 'none';
|
|
25
|
+
selectedAudioTrackId?: string;
|
|
26
|
+
mediaContainerData?: Record<string, MediaContainerData>;
|
|
27
|
+
/**
|
|
28
|
+
* Consumer-driven constraint narrowing the audio candidate set. Sibling
|
|
29
|
+
* of `userVideoTrackSelection` in the default engine. Partial-track
|
|
30
|
+
* shape — `{ language: 'es' }`, `{ id: 'audio-en' }`, etc.
|
|
31
|
+
* `selectAudioTrack` reads this and re-picks when it changes.
|
|
32
|
+
* Multi-language-audio Tier 2 programmatic-write path.
|
|
33
|
+
*/
|
|
34
|
+
userAudioTrackSelection?: Partial<AudioTrack>;
|
|
35
|
+
/**
|
|
36
|
+
* The CDNs the source is served from, in manifest priority order (mirrors
|
|
37
|
+
* HLS content steering's `PATHWAY-PRIORITY`). Owned by `deriveCdnPriority`,
|
|
38
|
+
* read by `track-switching`'s `preferActiveCdn` scope. Only meaningful for
|
|
39
|
+
* redundant-stream sources; a single-CDN source has one entry.
|
|
40
|
+
*/
|
|
41
|
+
cdnPriority?: string[];
|
|
42
|
+
/**
|
|
43
|
+
* CDN ids currently in failover cooldown — read by `track-switching`'s
|
|
44
|
+
* `excludeFailedCdns` constraint, which prunes their tracks so the active-CDN
|
|
45
|
+
* scope falls to the next CDN. Empty / absent means all CDNs are eligible.
|
|
46
|
+
*/
|
|
47
|
+
failedCdns?: string[];
|
|
48
|
+
currentTime?: number;
|
|
49
|
+
loadActivated?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* One-shot command: start the current source at this position
|
|
52
|
+
* (presentation-timeline seconds). Written by consumers or by
|
|
53
|
+
* `setupAirPlay`'s session-end snapshot; consumed (cleared) by
|
|
54
|
+
* `applyStartPosition` once the element seeks. See
|
|
55
|
+
* `behaviors/dom/apply-start-position.ts`.
|
|
56
|
+
*/
|
|
57
|
+
startPosition?: number;
|
|
58
|
+
/**
|
|
59
|
+
* Intent-level loading policy: initiate no new loading work while `true`.
|
|
60
|
+
* Written by `setupAirPlay` (the only behavior declaring the key) while a
|
|
61
|
+
* remote-playback session owns presentation; observed by `loadAudioSegments`
|
|
62
|
+
* (parks in `'dormant'`) and by `setupMediaSource` (a pending rebuild
|
|
63
|
+
* waits). See `SegmentLoadingState['loadingSuspended']`.
|
|
64
|
+
*/
|
|
65
|
+
loadingSuspended?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Author intent for the AirPlay/remote-playback picker, written by the media
|
|
68
|
+
* adapter's `disableRemotePlayback` IDL property. `true` is an explicit
|
|
69
|
+
* opt-out: `setupAirPlay` reads it at attach and sets nothing up, leaving the
|
|
70
|
+
* element's remote playback disabled. Distinct from the underlying media
|
|
71
|
+
* element's own `disableRemotePlayback`, which stays programmatically managed
|
|
72
|
+
* (ManagedMediaSource / AirPlay).
|
|
73
|
+
*/
|
|
74
|
+
disableRemotePlayback?: boolean;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Context shape for the audio-only HLS playback engine.
|
|
78
|
+
*
|
|
79
|
+
* Subset of `SimpleHlsEngineContext` covering only the platform objects and
|
|
80
|
+
* actor refs managed by audio-side behaviors.
|
|
81
|
+
*/
|
|
82
|
+
interface SimpleHlsAudioOnlyEngineContext {
|
|
83
|
+
mediaElement?: HTMLMediaElement | undefined;
|
|
84
|
+
mediaSource?: MediaSource;
|
|
85
|
+
audioBufferActor?: SourceBufferActor;
|
|
86
|
+
audioSegmentLoaderActor?: SegmentLoaderActor;
|
|
87
|
+
}
|
|
88
|
+
type SimpleHlsAudioOnlyEngineSignals = {
|
|
89
|
+
state: StateSignals<SimpleHlsAudioOnlyEngineState>;
|
|
90
|
+
context: ContextSignals<SimpleHlsAudioOnlyEngineContext>;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Configuration for the audio-only HLS playback engine.
|
|
94
|
+
*
|
|
95
|
+
* Subset of `SimpleHlsEngineConfig` — video-quality, bandwidth-estimator,
|
|
96
|
+
* and text-track config fields are omitted (no behavior consumes them).
|
|
97
|
+
*/
|
|
98
|
+
interface SimpleHlsAudioOnlyEngineConfig extends ShareSignalsConfig<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext> {
|
|
99
|
+
preferredAudioLanguage?: string;
|
|
100
|
+
/**
|
|
101
|
+
* Codec capability probe read by `track-switching`'s `excludeUnplayableTracks`
|
|
102
|
+
* constraint. Defaults to the `MediaSource.isTypeSupported`-backed
|
|
103
|
+
* `canPlayTrack`; override to force-exclude a codec. Mirrors the default
|
|
104
|
+
* engine — without it, capability probing (and TS / raw-AAC detection) would
|
|
105
|
+
* be inert for audio-only playback.
|
|
106
|
+
*/
|
|
107
|
+
canPlayTrack?: CanPlayTrack;
|
|
108
|
+
resolveDuration?: PresentationDurationResolver;
|
|
109
|
+
parsePresentation?: ParsePresentation;
|
|
110
|
+
forwardBuffer?: Partial<ForwardBufferConfig>;
|
|
111
|
+
backBuffer?: Partial<BackBufferConfig>;
|
|
112
|
+
/** Multi-CDN failover monitor tuning. Defaults: `DEFAULT_FAILOVER_MONITOR_CONFIG`. */
|
|
113
|
+
failover?: Partial<FailoverMonitorConfig>;
|
|
114
|
+
/**
|
|
115
|
+
* Derive a CDN grouping key from a track URL (used by `cdnPriority`, the
|
|
116
|
+
* failover trip, and the track-switching CDN rules — one function read by all).
|
|
117
|
+
* Defaults to the URL origin; override to key on e.g. Mux's `cdn=` param.
|
|
118
|
+
*/
|
|
119
|
+
getCdnId?: GetCdnId;
|
|
120
|
+
/** Non-zero-PTS relocation (spike): the reduce seam (tier knob); defaults to per-track own. */
|
|
121
|
+
deriveStartMediaTime?: DeriveStartMediaTime;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Create an audio-only HLS playback engine.
|
|
125
|
+
*
|
|
126
|
+
* Subtractive composition variant of `createSimpleHlsEngine`: omits
|
|
127
|
+
* video-side behaviors (`resolveVideoTrack`, `switchVideoTrack`,
|
|
128
|
+
* `setupVideoBufferActors`, `loadVideoSegments`) and text-track behaviors
|
|
129
|
+
* (`switchTextTrack`, `resolveTextTrack`, `syncTextTracks`,
|
|
130
|
+
* `setupTextTrackActors`, `loadTextTrackSegments`). The remaining audio
|
|
131
|
+
* pipeline composes unchanged.
|
|
132
|
+
*
|
|
133
|
+
* Handles both truly audio-only HLS sources (no video stream-inf) and
|
|
134
|
+
* mixed-AV HLS sources where the audio rendition is selected and video /
|
|
135
|
+
* subtitle renditions are ignored at composition time. The variant decision
|
|
136
|
+
* is encoded by adapter choice; this engine does not branch on source
|
|
137
|
+
* shape.
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```ts
|
|
141
|
+
* let signals: SimpleHlsAudioOnlyEngineSignals;
|
|
142
|
+
* const engine = createHlsAudioOnlyEngine({
|
|
143
|
+
* preferredAudioLanguage: 'en',
|
|
144
|
+
* onSignalsReady: (refs) => {
|
|
145
|
+
* signals = refs;
|
|
146
|
+
* },
|
|
147
|
+
* });
|
|
148
|
+
*
|
|
149
|
+
* signals.context.mediaElement.set(audioEl);
|
|
150
|
+
* signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
declare function createHlsAudioOnlyEngine(config?: SimpleHlsAudioOnlyEngineConfig): Composition<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext>;
|
|
154
|
+
//#endregion
|
|
155
|
+
export { SimpleHlsAudioOnlyEngineConfig, SimpleHlsAudioOnlyEngineContext, SimpleHlsAudioOnlyEngineSignals, SimpleHlsAudioOnlyEngineState, createHlsAudioOnlyEngine };
|
|
156
|
+
//# 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":";;;;;;;;;;;;;;;;;;;;;UA0DiB;EACf,eAAe;EACf;EACA;EAGA,qBAAqB,eAAe;;;;;;;;EAQpC,0BAA0B,QAAQ;;;;;;;EAOlC;;;;;;EAMA;EACA;EACA;;;;;;;;EAQA;;;;;;;;EAQA;;;;;;;;;EASA;;;;;;;;UASe;EACf,eAAe;EACf,cAAc;EACd,mBAAmB;EACnB,0BAA0B;;KAGhB;EACV,OAAO,aAAa;EACpB,SAAS,eAAe;;;;;;;;UAST,uCACP,mBAAmB,+BAA+B;EAC1D;;;;;;;;EAQA,eAAe;EACf,kBAAkB;EAClB,oBAAoB;EACpB,gBAAgB,QAAQ;EACxB,aAAa,QAAQ;;EAErB,WAAW,QAAQ;;;;;;EAMnB,WAAW;;EAEX,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+CT,yBACd,SAAQ,iCACP,YAAY,+BAA+B"}
|
|
@@ -0,0 +1,94 @@
|
|
|
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 { deriveCdnPriority } from "../../behaviors/derive-cdn-priority.js";
|
|
13
|
+
import { setupAirPlay } from "../../behaviors/dom/airplay.js";
|
|
14
|
+
import { applyStartPosition } from "../../behaviors/dom/apply-start-position.js";
|
|
15
|
+
import { endOfStream } from "../../behaviors/dom/end-of-stream.js";
|
|
16
|
+
import { recoverEndStall } from "../../behaviors/dom/recover-end-stall.js";
|
|
17
|
+
import { setupAudioBufferActors } from "../../behaviors/dom/setup-buffer-actors.js";
|
|
18
|
+
import { setupMediaSource } from "../../behaviors/dom/setup-mediasource.js";
|
|
19
|
+
import { updateMediaSourceDuration } from "../../behaviors/dom/update-mediasource-duration.js";
|
|
20
|
+
import { resolvePresentation } from "../../behaviors/resolve-presentation.js";
|
|
21
|
+
import { resolveAudioTrack } from "../../behaviors/resolve-track.js";
|
|
22
|
+
import { setupFailoverMonitor } from "../../behaviors/setup-failover-monitor.js";
|
|
23
|
+
import { syncPreload } from "../../behaviors/sync-preload.js";
|
|
24
|
+
import { switchAudioTrack } from "../../behaviors/track-switching.js";
|
|
25
|
+
import { relocationPipelinesFor } from "../../primitives/relocation-pipelines.js";
|
|
26
|
+
//#region src/playback/engines/hls/engine-audio-only.ts
|
|
27
|
+
const shareSignals = makeShareSignals(["userAudioTrackSelection", "disableRemotePlayback"]);
|
|
28
|
+
/**
|
|
29
|
+
* Create an audio-only HLS playback engine.
|
|
30
|
+
*
|
|
31
|
+
* Subtractive composition variant of `createSimpleHlsEngine`: omits
|
|
32
|
+
* video-side behaviors (`resolveVideoTrack`, `switchVideoTrack`,
|
|
33
|
+
* `setupVideoBufferActors`, `loadVideoSegments`) and text-track behaviors
|
|
34
|
+
* (`switchTextTrack`, `resolveTextTrack`, `syncTextTracks`,
|
|
35
|
+
* `setupTextTrackActors`, `loadTextTrackSegments`). The remaining audio
|
|
36
|
+
* pipeline composes unchanged.
|
|
37
|
+
*
|
|
38
|
+
* Handles both truly audio-only HLS sources (no video stream-inf) and
|
|
39
|
+
* mixed-AV HLS sources where the audio rendition is selected and video /
|
|
40
|
+
* subtitle renditions are ignored at composition time. The variant decision
|
|
41
|
+
* is encoded by adapter choice; this engine does not branch on source
|
|
42
|
+
* shape.
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* let signals: SimpleHlsAudioOnlyEngineSignals;
|
|
47
|
+
* const engine = createHlsAudioOnlyEngine({
|
|
48
|
+
* preferredAudioLanguage: 'en',
|
|
49
|
+
* onSignalsReady: (refs) => {
|
|
50
|
+
* signals = refs;
|
|
51
|
+
* },
|
|
52
|
+
* });
|
|
53
|
+
*
|
|
54
|
+
* signals.context.mediaElement.set(audioEl);
|
|
55
|
+
* signals.state.presentation.set({ url: 'https://example.com/stream.m3u8' });
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
function createHlsAudioOnlyEngine(config = {}) {
|
|
59
|
+
const deriveStartMediaTime = config.deriveStartMediaTime ?? deriveSharedMinStartMediaTime;
|
|
60
|
+
const finalConfig = {
|
|
61
|
+
...config,
|
|
62
|
+
deriveStartMediaTime,
|
|
63
|
+
attachMediaSource: attachMediaSourceAsSourceElement,
|
|
64
|
+
canPlayTrack: config.canPlayTrack ?? canPlayTrack,
|
|
65
|
+
resolveDuration: config.resolveDuration ?? getResolvedSelectedTrackDuration,
|
|
66
|
+
parsePresentation: config.parsePresentation ?? parseMultivariantPlaylist,
|
|
67
|
+
audioMessagePipelines: relocationPipelinesFor("audio", deriveStartMediaTime)
|
|
68
|
+
};
|
|
69
|
+
return createComposition([
|
|
70
|
+
syncPreload,
|
|
71
|
+
trackLoadTriggers,
|
|
72
|
+
resolvePresentation,
|
|
73
|
+
deriveCdnPriority,
|
|
74
|
+
setupFailoverMonitor,
|
|
75
|
+
switchAudioTrack,
|
|
76
|
+
resolveAudioTrack,
|
|
77
|
+
calculatePresentationDuration,
|
|
78
|
+
setupMediaSource,
|
|
79
|
+
updateMediaSourceDuration,
|
|
80
|
+
establishStartMediaTime,
|
|
81
|
+
setupAudioBufferActors,
|
|
82
|
+
setupAirPlay,
|
|
83
|
+
trackCurrentTime,
|
|
84
|
+
applyStartPosition,
|
|
85
|
+
loadAudioSegments,
|
|
86
|
+
endOfStream,
|
|
87
|
+
recoverEndStall,
|
|
88
|
+
shareSignals
|
|
89
|
+
], { config: finalConfig });
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
export { createHlsAudioOnlyEngine };
|
|
93
|
+
|
|
94
|
+
//# 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 { 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 { 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';\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 `SimpleHlsEngineState` 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 SimpleHlsAudioOnlyEngineState {\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 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 `SimpleHlsEngineContext` covering only the platform objects and\n * actor refs managed by audio-side behaviors.\n */\nexport interface SimpleHlsAudioOnlyEngineContext {\n mediaElement?: HTMLMediaElement | undefined;\n mediaSource?: MediaSource;\n audioBufferActor?: SourceBufferActor;\n audioSegmentLoaderActor?: SegmentLoaderActor;\n}\n\nexport type SimpleHlsAudioOnlyEngineSignals = {\n state: StateSignals<SimpleHlsAudioOnlyEngineState>;\n context: ContextSignals<SimpleHlsAudioOnlyEngineContext>;\n};\n\n/**\n * Configuration for the audio-only HLS playback engine.\n *\n * Subset of `SimpleHlsEngineConfig` — video-quality, bandwidth-estimator,\n * and text-track config fields are omitted (no behavior consumes them).\n */\nexport interface SimpleHlsAudioOnlyEngineConfig\n extends ShareSignalsConfig<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext> {\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 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<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext>([\n 'userAudioTrackSelection',\n 'disableRemotePlayback',\n]);\n\n/**\n * Create an audio-only HLS playback engine.\n *\n * Subtractive composition variant of `createSimpleHlsEngine`: 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: SimpleHlsAudioOnlyEngineSignals;\n * const engine = createHlsAudioOnlyEngine({\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 createHlsAudioOnlyEngine(\n config: SimpleHlsAudioOnlyEngineConfig = {}\n): Composition<SimpleHlsAudioOnlyEngineState, SimpleHlsAudioOnlyEngineContext> {\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 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 // 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":";;;;;;;;;;;;;;;;;;;;;;;;;;AA+KA,MAAM,eAAe,iBAAiF,CACpG,2BACA,uBACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCD,SAAgB,yBACd,SAAyC,CAAC,GACmC;CAC7E,MAAM,uBAAuB,OAAO,wBAAwB;CAC5D,MAAM,cAAc;EAClB,GAAG;EACH;EAMA,mBAAmB;EACnB,cAAc,OAAO,gBAAgB;EACrC,iBAAiB,OAAO,mBAAmB;EAC3C,mBAAmB,OAAO,qBAAqB;EAI/C,uBAAuB,uBAAuB,SAAS,oBAAoB;CAC7E;CAEA,OAAO,kBACL;EACE;EACA;EACA;EAWA;EAKA;EAKA;EAGA;EAGA;EAIA;EACA;EAMA;EAEA;EAOA;EAGA;EAGA;EAGA;EAMA;EAGA;EAGA;CACF,GACA,EACE,QAAQ,YACV,CACF;AACF"}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
|
+
import { AudioTrack, CanPlayTrack, MaybeResolvedPresentation, MediaContainerData, TextTrack, VideoTrack } from "../../../media/types/index.js";
|
|
1
2
|
import { Composition, ContextSignals, StateSignals } from "../../../core/composition/create-composition.js";
|
|
2
3
|
import { ShareSignalsConfig } from "../../../core/composition/share-signals.js";
|
|
3
|
-
import { MaybeResolvedPresentation, VideoTrack } from "../../../media/types/index.js";
|
|
4
4
|
import { BackBufferConfig } from "../../../media/buffer/back-buffer.js";
|
|
5
5
|
import { ForwardBufferConfig } from "../../../media/buffer/forward-buffer.js";
|
|
6
6
|
import { SourceBufferActor } from "../../actors/dom/source-buffer.js";
|
|
7
7
|
import { SegmentLoaderActor } from "../../actors/dom/segment-loader.js";
|
|
8
|
+
import { TextTrackSegmentResolver } from "../../primitives/text-segment-load-pipeline.js";
|
|
8
9
|
import { TextTracksActor } from "../../actors/text-tracks.js";
|
|
9
|
-
import { TextTrackSegmentLoaderActor
|
|
10
|
+
import { TextTrackSegmentLoaderActor } from "../../actors/text-track-segment-loader.js";
|
|
11
|
+
import { ParsePresentation } from "../../behaviors/resolve-presentation.js";
|
|
12
|
+
import { DeriveStartMediaTime } from "../../primitives/derive-start-media-time.js";
|
|
13
|
+
import "../../behaviors/establish-start-media-time.js";
|
|
10
14
|
import { QualityConfig } from "../../../media/abr/quality-selection.js";
|
|
11
15
|
import { addSubtitlesTracksToMedia, getShowingSubtitlesTrackFromMedia, removeAllSubtitlesTracksFromMedia } from "../../../media/dom/text/text-track-slots.js";
|
|
16
|
+
import { GetCdnId } from "../../../media/utils/cdn.js";
|
|
12
17
|
import { BandwidthConfig, BandwidthState } from "../../../network/bandwidth-estimator.js";
|
|
18
|
+
import "../../actors/dom/text-tracks.js";
|
|
13
19
|
import { PresentationDurationResolver } from "../../behaviors/calculate-presentation-duration.js";
|
|
14
|
-
import {
|
|
15
|
-
|
|
20
|
+
import { FailoverMonitorConfig } from "../../behaviors/setup-failover-monitor.js";
|
|
16
21
|
//#region src/playback/engines/hls/engine.d.ts
|
|
17
22
|
/**
|
|
18
23
|
* State shape for the HLS playback engine.
|
|
@@ -32,9 +37,70 @@ interface SimpleHlsEngineState {
|
|
|
32
37
|
selectedAudioTrackId?: string;
|
|
33
38
|
selectedTextTrackId?: string;
|
|
34
39
|
bandwidthState?: BandwidthState;
|
|
40
|
+
mediaContainerData?: Record<string, MediaContainerData>;
|
|
35
41
|
userVideoTrackSelection?: Partial<VideoTrack>;
|
|
42
|
+
/**
|
|
43
|
+
* Consumer-driven constraint narrowing the audio candidate set. Sibling
|
|
44
|
+
* of `userVideoTrackSelection`. Partial-track shape — `{ language: 'es' }`,
|
|
45
|
+
* `{ id: 'audio-en' }`, etc. `selectAudioTrack` reads this and re-picks
|
|
46
|
+
* when it changes. Multi-language-audio Tier 2 programmatic-write path.
|
|
47
|
+
*/
|
|
48
|
+
userAudioTrackSelection?: Partial<AudioTrack>;
|
|
49
|
+
/**
|
|
50
|
+
* Consumer-driven *intent* for text selection, resolved into
|
|
51
|
+
* `selectedTextTrackId` by `switchTextTrack`. A language-based partial
|
|
52
|
+
* (`{ language: 'es' }`) selects captions, `'off'` disables them, and absence
|
|
53
|
+
* means auto (the engine's `preferredSubtitleLanguage` / DEFAULT-track policy).
|
|
54
|
+
* Also the write path for the DOM caption UI (via `syncTextTracks`); unlike the
|
|
55
|
+
* resolved id it persists across source changes (sticky preference).
|
|
56
|
+
*/
|
|
57
|
+
userTextTrackSelection?: Partial<TextTrack> | 'off';
|
|
58
|
+
/**
|
|
59
|
+
* The CDNs the source is served from (track-URL origins), in manifest
|
|
60
|
+
* priority order — most-preferred first (mirrors HLS content steering's
|
|
61
|
+
* `PATHWAY-PRIORITY`). Owned by `deriveCdnPriority`, read by
|
|
62
|
+
* `track-switching`'s `preferActiveCdn` scope, which narrows to the
|
|
63
|
+
* highest-priority CDN with surviving tracks so video / audio / text stay on
|
|
64
|
+
* one host. Only meaningful for redundant-stream sources; a single-CDN source
|
|
65
|
+
* has one entry.
|
|
66
|
+
*/
|
|
67
|
+
cdnPriority?: string[];
|
|
68
|
+
/**
|
|
69
|
+
* CDN ids (origins) currently in failover cooldown — written by the CDN
|
|
70
|
+
* monitor when a host fails too often, read by `track-switching`'s
|
|
71
|
+
* `excludeFailedCdns` hard constraint, which prunes their tracks so the
|
|
72
|
+
* active-CDN scope falls to the next CDN in `cdnPriority`. Empty / absent
|
|
73
|
+
* means all CDNs are eligible.
|
|
74
|
+
*/
|
|
75
|
+
failedCdns?: string[];
|
|
36
76
|
currentTime?: number;
|
|
37
77
|
loadActivated?: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* One-shot command: start the current source at this position
|
|
80
|
+
* (presentation-timeline seconds). Written by consumers or by
|
|
81
|
+
* `setupAirPlay`'s session-end snapshot; consumed (cleared) by
|
|
82
|
+
* `applyStartPosition` once the element seeks. See
|
|
83
|
+
* `behaviors/dom/apply-start-position.ts`.
|
|
84
|
+
*/
|
|
85
|
+
startPosition?: number;
|
|
86
|
+
/**
|
|
87
|
+
* Intent-level loading policy: initiate no new loading work while `true`.
|
|
88
|
+
* Written by `setupAirPlay` (the only behavior declaring the key) while a
|
|
89
|
+
* remote-playback session owns presentation; observed by the
|
|
90
|
+
* `loadXSegments` dispatchers (park in `'dormant'`) and by
|
|
91
|
+
* `setupMediaSource` (a pending rebuild waits). See
|
|
92
|
+
* `SegmentLoadingState['loadingSuspended']`.
|
|
93
|
+
*/
|
|
94
|
+
loadingSuspended?: boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Author intent for the AirPlay/remote-playback picker, written by the media
|
|
97
|
+
* adapter's `disableRemotePlayback` IDL property. `true` is an explicit
|
|
98
|
+
* opt-out: `setupAirPlay` reads it at attach and sets nothing up, leaving the
|
|
99
|
+
* element's remote playback disabled. Distinct from the underlying
|
|
100
|
+
* `<video>.disableRemotePlayback`, which stays programmatically managed
|
|
101
|
+
* (ManagedMediaSource / AirPlay).
|
|
102
|
+
*/
|
|
103
|
+
disableRemotePlayback?: boolean;
|
|
38
104
|
}
|
|
39
105
|
/**
|
|
40
106
|
* Context shape for the HLS playback engine.
|
|
@@ -73,6 +139,14 @@ interface SimpleHlsEngineConfig extends ShareSignalsConfig<SimpleHlsEngineState,
|
|
|
73
139
|
* collected. Default: `DEFAULT_INITIAL_BANDWIDTH` (5 Mbps).
|
|
74
140
|
*/
|
|
75
141
|
initialBandwidth?: number;
|
|
142
|
+
/**
|
|
143
|
+
* Codec capability probe injected into `track-switching`'s
|
|
144
|
+
* `excludeUnplayableTracks` constraint — drops renditions the environment
|
|
145
|
+
* can't decode before selection. Defaults to the `MediaSource.isTypeSupported`
|
|
146
|
+
* -backed `canPlayTrack`; supply your own to override (e.g. force-exclude a
|
|
147
|
+
* codec).
|
|
148
|
+
*/
|
|
149
|
+
canPlayTrack?: CanPlayTrack;
|
|
76
150
|
preferredAudioLanguage?: string;
|
|
77
151
|
preferredSubtitleLanguage?: string;
|
|
78
152
|
includeForcedTracks?: boolean;
|
|
@@ -144,6 +218,37 @@ interface SimpleHlsEngineConfig extends ShareSignalsConfig<SimpleHlsEngineState,
|
|
|
144
218
|
* ratio gating ABR upgrades. Defaults: `DEFAULT_QUALITY_CONFIG` (0.85 / 1.15).
|
|
145
219
|
*/
|
|
146
220
|
quality?: Partial<QualityConfig>;
|
|
221
|
+
/**
|
|
222
|
+
* Multi-CDN failover monitor tuning. `cooldownMs` is how long a CDN stays
|
|
223
|
+
* excluded after a failed fetch trips it. Defaults:
|
|
224
|
+
* `DEFAULT_FAILOVER_MONITOR_CONFIG` (300s). Only meaningful for redundant-stream
|
|
225
|
+
* sources.
|
|
226
|
+
*/
|
|
227
|
+
failover?: Partial<FailoverMonitorConfig>;
|
|
228
|
+
/**
|
|
229
|
+
* How to derive a CDN grouping key from a track URL — used to build
|
|
230
|
+
* `cdnPriority`, to record the failover trip in `failedCdns`, and by the
|
|
231
|
+
* track-switching CDN scope + failover constraint. One function, read by all of
|
|
232
|
+
* them, so the keys stay comparable. Defaults to the URL origin; override to
|
|
233
|
+
* key on something else (e.g. Mux's `cdn=` query param).
|
|
234
|
+
*/
|
|
235
|
+
getCdnId?: GetCdnId;
|
|
236
|
+
/**
|
|
237
|
+
* Non-zero-PTS relocation (spike): the reduce seam consumed by the
|
|
238
|
+
* `establishStartMediaTime` reactor. Defaults to per-track own origin (Tier 1);
|
|
239
|
+
* a Tier-2 variant returns the shared `min` across selected A/V. Relocation is
|
|
240
|
+
* composed into the standard engine below — see the marked block — so this only
|
|
241
|
+
* needs setting to swap the tier policy. See
|
|
242
|
+
* `internal/design/spf/presentation-timeline-model.md`.
|
|
243
|
+
*/
|
|
244
|
+
deriveStartMediaTime?: DeriveStartMediaTime;
|
|
245
|
+
/**
|
|
246
|
+
* Proximity window (seconds) for the `recoverEndStall` behavior — how close the
|
|
247
|
+
* playhead must be to the reachable buffered end for a `waiting` to be treated as the
|
|
248
|
+
* end-of-stream freeze and nudged to `ended`. Defaults to `0.2`. See
|
|
249
|
+
* `behaviors/dom/recover-end-stall`.
|
|
250
|
+
*/
|
|
251
|
+
endStallNudgeWindow?: number;
|
|
147
252
|
}
|
|
148
253
|
/**
|
|
149
254
|
* Create an HLS playback engine.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","names":[],"sources":["../../../../../src/playback/engines/hls/engine.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.d.ts","names":[],"sources":["../../../../../src/playback/engines/hls/engine.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;UA+EiB;;;;;EAKf,eAAe;EACf;EACA;EACA;EACA;EACA,iBAAiB;EAGjB,qBAAqB,eAAe;EACpC,0BAA0B,QAAQ;;;;;;;EAOlC,0BAA0B,QAAQ;;;;;;;;;EASlC,yBAAyB,QAAQ;;;;;;;;;;EAUjC;;;;;;;;EAQA;EACA;EACA;;;;;;;;EAQA;;;;;;;;;EASA;;;;;;;;;EASA;;;;;;;UAQe;EACf,eAAe;EACf,cAAc;EACd,mBAAmB;EACnB,mBAAmB;EACnB,0BAA0B;EAC1B,0BAA0B;EAC1B,kBAAkB;EAClB,8BAA8B;;;;;;;;KASpB;EACV,OAAO,aAAa;EACpB,SAAS,eAAe;;;;;;;;UAST,8BAA8B,mBAAmB,sBAAsB;;;;;EAKtF;;;;;;;;EAQA,eAAe;EACf;EACA;EACA;EACA;;;;;;EAMA,0BAA0B,yBAAyB;;;;;;;;;EASnD,kBAAkB;;;;;;EAMlB,oBAAoB;;;;;;EAMpB,mCAAmC;;;;;;EAMnC,2CAA2C;;;;;;EAM3C,2CAA2C;;;;;;;;EAQ3C,gBAAgB,QAAQ;;;;;;;EAOxB,aAAa,QAAQ;;;;;;;EAOrB,YAAY,QAAQ;;;;;;EAMpB,UAAU,QAAQ;;;;;;;EAOlB,WAAW,QAAQ;;;;;;;;EAQnB,WAAW;;;;;;;;;EASX,uBAAuB;;;;;;;EAOvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiDc,sBACd,SAAQ,wBACP,YAAY,sBAAsB"}
|