@videojs/html 10.0.0-beta.28 → 10.0.0-beta.29
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/cdn/{adapter-XTen-YVQ.js → adapter-CEnNWvii.js} +17 -4
- package/cdn/adapter-CEnNWvii.js.map +1 -0
- package/cdn/adapter-DaKW8NzI.js +2 -0
- package/cdn/adapter-DaKW8NzI.js.map +1 -0
- package/cdn/audio-headless.dev.js +1 -1
- package/cdn/audio-headless.js +1 -1
- package/cdn/audio-minimal-ui.dev.js +2 -2
- package/cdn/audio-minimal-ui.js +1 -1
- package/cdn/audio-minimal.dev.js +5 -5
- package/cdn/audio-minimal.dev.js.map +1 -1
- package/cdn/audio-minimal.js +1 -1
- package/cdn/audio-minimal.js.map +1 -1
- package/cdn/audio-ui.dev.js +2 -2
- package/cdn/audio-ui.js +1 -1
- package/cdn/audio.dev.js +5 -5
- package/cdn/audio.dev.js.map +1 -1
- package/cdn/audio.js +1 -1
- package/cdn/audio.js.map +1 -1
- package/cdn/background.dev.js +1 -1
- package/cdn/background.js +1 -1
- package/cdn/background.js.map +1 -1
- package/cdn/compounds-C4YYLyL2.js +8 -0
- package/cdn/compounds-C4YYLyL2.js.map +1 -0
- package/cdn/{compounds-nk9RJtBK.js → compounds-C73u1MeO.js} +63 -59
- package/cdn/compounds-C73u1MeO.js.map +1 -0
- package/cdn/create-player-BU8LDJDL.js +2 -0
- package/cdn/create-player-BU8LDJDL.js.map +1 -0
- package/cdn/{create-player-DK9WOywd.js → create-player-Db1CIvlK.js} +58 -46
- package/cdn/create-player-Db1CIvlK.js.map +1 -0
- package/cdn/{default-BqQDVloS.js → default-A3aM0skz.js} +2 -2
- package/cdn/default-A3aM0skz.js.map +1 -0
- package/cdn/default-BDyhiTCm.js +2 -0
- package/cdn/default-BDyhiTCm.js.map +1 -0
- package/cdn/{default-I2LasfxC.js → default-C1_k1NeB.js} +2 -2
- package/cdn/default-C1_k1NeB.js.map +1 -0
- package/cdn/default-DHrMd4ie.js +2 -0
- package/cdn/default-DHrMd4ie.js.map +1 -0
- package/cdn/error-surface-BID4D3DW.js +59 -0
- package/cdn/error-surface-BID4D3DW.js.map +1 -0
- package/cdn/{select-tracks-nRPBa1NC.js → error-surface-D0bo71gD.js} +442 -48
- package/cdn/error-surface-D0bo71gD.js.map +1 -0
- package/cdn/gesture-element-CeRy1IVs.js +2 -0
- package/cdn/gesture-element-CeRy1IVs.js.map +1 -0
- package/cdn/{gesture-element-6Ld1YwIL.js → gesture-element-DB67OYCE.js} +3 -3
- package/cdn/gesture-element-DB67OYCE.js.map +1 -0
- package/cdn/{hls-js-C4P_b2tT.js → hls-js-CiE4wOrG.js} +2 -2
- package/cdn/{hls-js-C4P_b2tT.js.map → hls-js-CiE4wOrG.js.map} +1 -1
- package/cdn/{hls-js-CATW7NBm.js → hls-js-DBKRCbQm.js} +2 -2
- package/cdn/{hls-js-CATW7NBm.js.map → hls-js-DBKRCbQm.js.map} +1 -1
- package/cdn/{hls-js-BEuVm0u9.js → hls-js-DX2NGCAr.js} +2 -2
- package/cdn/{hls-js-BEuVm0u9.js.map → hls-js-DX2NGCAr.js.map} +1 -1
- package/cdn/{hls-js-WCNy9MVh.js → hls-js-JeH8yvsP.js} +2 -2
- package/cdn/{hls-js-WCNy9MVh.js.map → hls-js-JeH8yvsP.js.map} +1 -1
- package/cdn/i18n-CpBDXf6M.js +2 -0
- package/cdn/{i18n-Dc7WM2xd.js.map → i18n-CpBDXf6M.js.map} +1 -1
- package/cdn/{i18n-Ch4t6EjV.js → i18n-D0nhPa0m.js} +2 -2
- package/cdn/{i18n-Ch4t6EjV.js.map → i18n-D0nhPa0m.js.map} +1 -1
- package/cdn/{live-button-element-DaHgnYdw.js → live-button-element-Co8z2LkI.js} +2 -2
- package/cdn/{live-button-element-DaHgnYdw.js.map → live-button-element-Co8z2LkI.js.map} +1 -1
- package/cdn/{live-button-element-Bae44kBN.js → live-button-element-zE-8uoR2.js} +3 -3
- package/cdn/{live-button-element-Bae44kBN.js.map → live-button-element-zE-8uoR2.js.map} +1 -1
- package/cdn/live-video-minimal.dev.js +11 -9
- package/cdn/live-video-minimal.dev.js.map +1 -1
- package/cdn/live-video-minimal.js +1 -1
- package/cdn/live-video-minimal.js.map +1 -1
- package/cdn/live-video.dev.js +12 -10
- package/cdn/live-video.dev.js.map +1 -1
- package/cdn/live-video.js +1 -1
- package/cdn/live-video.js.map +1 -1
- package/cdn/media/hls-audio.dev.js +1 -1
- package/cdn/media/hls-audio.js +1 -1
- package/cdn/media/hls-background-video.dev.js +1 -1
- package/cdn/media/hls-background-video.js +1 -1
- package/cdn/media/hls-video.dev.js +1 -1
- package/cdn/media/hls-video.js +1 -1
- package/cdn/media/mux-audio/hls-js.dev.js +1 -1
- package/cdn/media/mux-audio/hls-js.js +1 -1
- package/cdn/media/mux-audio/spf.dev.js +2 -2
- package/cdn/media/mux-audio/spf.js +1 -1
- package/cdn/media/mux-audio.dev.js +1 -1
- package/cdn/media/mux-audio.js +1 -1
- package/cdn/media/mux-background-video.dev.js +1 -1
- package/cdn/media/mux-background-video.js +1 -1
- package/cdn/media/mux-data.dev.js +1 -1
- package/cdn/media/mux-data.dev.js.map +1 -1
- package/cdn/media/mux-data.js +1 -1
- package/cdn/media/mux-data.js.map +1 -1
- package/cdn/media/mux-video/hls-js.dev.js +1 -1
- package/cdn/media/mux-video/hls-js.js +1 -1
- package/cdn/media/mux-video/spf.dev.js +2 -2
- package/cdn/media/mux-video/spf.js +1 -1
- package/cdn/media/mux-video.dev.js +1 -1
- package/cdn/media/mux-video.js +1 -1
- package/cdn/media/vimeo-video.dev.js +27 -5
- package/cdn/media/vimeo-video.dev.js.map +1 -1
- package/cdn/media/vimeo-video.js +1 -1
- package/cdn/media/vimeo-video.js.map +1 -1
- package/cdn/{media-Uxm0d3Vx.js → media-BI8caj07.js} +3 -3
- package/cdn/{media-Uxm0d3Vx.js.map → media-BI8caj07.js.map} +1 -1
- package/cdn/{media-COIe3uI5.js → media-BNuI0Im7.js} +19 -6
- package/cdn/media-BNuI0Im7.js.map +1 -0
- package/cdn/media-CQxFuDcv.js +2 -0
- package/cdn/{media-CPVSKLdk.js.map → media-CQxFuDcv.js.map} +1 -1
- package/cdn/media-D4tG62L5.js +2 -0
- package/cdn/{media-BTipOcKo.js.map → media-D4tG62L5.js.map} +1 -1
- package/cdn/{media-oa3nyL2o.js → media-DI6DvYm3.js} +3 -3
- package/cdn/{media-oa3nyL2o.js.map → media-DI6DvYm3.js.map} +1 -1
- package/cdn/media-DU3Xf5XR.js +2 -0
- package/cdn/media-DU3Xf5XR.js.map +1 -0
- package/cdn/media-mYKOAsk3.js +825 -0
- package/cdn/media-mYKOAsk3.js.map +1 -0
- package/cdn/media-zReLnePj.js +2 -0
- package/cdn/media-zReLnePj.js.map +1 -0
- package/cdn/{minimal-DQCLKRyR.js → minimal-3OmH0xQS.js} +2 -2
- package/cdn/minimal-3OmH0xQS.js.map +1 -0
- package/cdn/{minimal-DLosvq31.js → minimal-6w_Vyyl9.js} +2 -2
- package/cdn/minimal-6w_Vyyl9.js.map +1 -0
- package/cdn/minimal-BWLTn7oQ.js +2 -0
- package/cdn/minimal-BWLTn7oQ.js.map +1 -0
- package/cdn/minimal-DIGrklyh.js +2 -0
- package/cdn/minimal-DIGrklyh.js.map +1 -0
- package/cdn/{minimal-ui-CRKvUmB8.js → minimal-ui-BCIESK8f.js} +8 -8
- package/cdn/{minimal-ui-CRKvUmB8.js.map → minimal-ui-BCIESK8f.js.map} +1 -1
- package/cdn/minimal-ui-BXrq3z4U.js +2 -0
- package/cdn/{minimal-ui-Et2Wcn7r.js.map → minimal-ui-BXrq3z4U.js.map} +1 -1
- package/cdn/{minimal-ui-BpHxIo4z.js → minimal-ui-DEalpMk6.js} +4 -4
- package/cdn/{minimal-ui-BpHxIo4z.js.map → minimal-ui-DEalpMk6.js.map} +1 -1
- package/cdn/{minimal-ui-8iRZf_72.js → minimal-ui-vY3QgohH.js} +2 -2
- package/cdn/{minimal-ui-8iRZf_72.js.map → minimal-ui-vY3QgohH.js.map} +1 -1
- package/cdn/{player-DM9rUXg-.js → player-B3GlPF90.js} +2 -2
- package/cdn/{player-DM9rUXg-.js.map → player-B3GlPF90.js.map} +1 -1
- package/cdn/player-CtTC7qa5.js +2 -0
- package/cdn/{player-rCFqzWrA.js.map → player-CtTC7qa5.js.map} +1 -1
- package/cdn/player-DKkph8UM.js +2 -0
- package/cdn/{player-BRQLp5bX.js.map → player-DKkph8UM.js.map} +1 -1
- package/cdn/{player-CKTAtwit.js → player-DPDmTRvg.js} +2 -2
- package/cdn/{player-CKTAtwit.js.map → player-DPDmTRvg.js.map} +1 -1
- package/cdn/player-DrDd7LJi.js +2 -0
- package/cdn/{player-BloX4l6F.js.map → player-DrDd7LJi.js.map} +1 -1
- package/cdn/{player-B2oraRyD.js → player-L5UpZmT4.js} +2 -2
- package/cdn/{player-B2oraRyD.js.map → player-L5UpZmT4.js.map} +1 -1
- package/cdn/{poster-element-BGr1VQJB.js → poster-element-B5tdJ2ub.js} +179 -38
- package/cdn/poster-element-B5tdJ2ub.js.map +1 -0
- package/cdn/poster-element-B8QwXSU_.js +2 -0
- package/cdn/poster-element-B8QwXSU_.js.map +1 -0
- package/cdn/{error-surface-drmCvBVW.js → relocation-pipelines-Dh8CcgHw.js} +5 -343
- package/cdn/relocation-pipelines-Dh8CcgHw.js.map +1 -0
- package/cdn/relocation-pipelines-DunE4gcV.js +2 -0
- package/cdn/relocation-pipelines-DunE4gcV.js.map +1 -0
- package/cdn/{seek-button-element-XMTLIxZj.js → seek-button-element-5co-k0Dx.js} +4 -4
- package/cdn/seek-button-element-5co-k0Dx.js.map +1 -0
- package/cdn/{seek-button-element-FlgBVoGM.js → seek-button-element-B8TkILg-.js} +2 -2
- package/cdn/{seek-button-element-FlgBVoGM.js.map → seek-button-element-B8TkILg-.js.map} +1 -1
- package/cdn/shallow-equal-C7S8rj2f.js +16 -0
- package/cdn/shallow-equal-C7S8rj2f.js.map +1 -0
- package/cdn/shallow-equal-KV1zFqZi.js +2 -0
- package/cdn/shallow-equal-KV1zFqZi.js.map +1 -0
- package/cdn/{skin-element-DL-Kqa5f.js → skin-element-DrkI8xuM.js} +2 -2
- package/cdn/{skin-element-DL-Kqa5f.js.map → skin-element-DrkI8xuM.js.map} +1 -1
- package/cdn/{skin-element-DNytI-uu.js → skin-element-DvX6Bxsv.js} +2 -2
- package/cdn/{skin-element-DNytI-uu.js.map → skin-element-DvX6Bxsv.js.map} +1 -1
- package/cdn/{text-element-DeWBNKXb.js → text-element-BoY6AhMn.js} +2 -2
- package/cdn/{text-element-DeWBNKXb.js.map → text-element-BoY6AhMn.js.map} +1 -1
- package/cdn/{text-element-D88ArbZz.js → text-element-cg6l21cd.js} +2 -2
- package/cdn/{text-element-D88ArbZz.js.map → text-element-cg6l21cd.js.map} +1 -1
- package/cdn/time-slider-chapters-element-BfLjdnU4.js +2 -0
- package/cdn/time-slider-chapters-element-BfLjdnU4.js.map +1 -0
- package/cdn/{time-slider-chapters-element-DJ0abZXI.js → time-slider-chapters-element-CznFQWFm.js} +5 -5
- package/cdn/time-slider-chapters-element-CznFQWFm.js.map +1 -0
- package/cdn/{ui-BU3_2gDQ.js → ui-BwzqkJNK.js} +7 -7
- package/cdn/{ui-BU3_2gDQ.js.map → ui-BwzqkJNK.js.map} +1 -1
- package/cdn/ui-DayfItun.js +2 -0
- package/cdn/{ui-C0isALTQ.js.map → ui-DayfItun.js.map} +1 -1
- package/cdn/ui-PSnD-pv8.js +2 -0
- package/cdn/{ui-DVpkE1MN.js.map → ui-PSnD-pv8.js.map} +1 -1
- package/cdn/{ui-BsaWWE4y.js → ui-fnKp94a7.js} +9 -9
- package/cdn/{ui-BsaWWE4y.js.map → ui-fnKp94a7.js.map} +1 -1
- package/cdn/video-headless.dev.js +1 -1
- package/cdn/video-headless.js +1 -1
- package/cdn/video-minimal-ui.dev.js +2 -2
- package/cdn/video-minimal-ui.js +1 -1
- package/cdn/video-minimal.dev.js +8 -6
- package/cdn/video-minimal.dev.js.map +1 -1
- package/cdn/video-minimal.js +1 -1
- package/cdn/video-minimal.js.map +1 -1
- package/cdn/video-ui.dev.js +2 -2
- package/cdn/video-ui.js +1 -1
- package/cdn/video.dev.js +9 -7
- package/cdn/video.dev.js.map +1 -1
- package/cdn/video.js +1 -1
- package/cdn/video.js.map +1 -1
- package/dist/default/__generated__/skins/default-video/styles/buttons.css +132 -18
- package/dist/default/__generated__/skins/default-video/styles/captions.css +22 -0
- package/dist/default/__generated__/skins/default-video/styles/container.css +121 -8
- package/dist/default/__generated__/skins/default-video/styles/controls.css +436 -21
- package/dist/default/__generated__/skins/default-video/styles/dialog.css +169 -0
- package/dist/default/__generated__/skins/default-video/styles/indicator.css +459 -0
- package/dist/default/__generated__/skins/default-video/styles/menus.css +254 -0
- package/dist/default/__generated__/skins/default-video/styles/overlays.css +26 -2
- package/dist/default/__generated__/skins/default-video/styles/popups.css +338 -12
- package/dist/default/__generated__/skins/default-video/styles/poster.css +4 -4
- package/dist/default/__generated__/skins/default-video/styles/sliders.css +355 -31
- package/dist/default/__generated__/skins/default-video/styles/styles.css +2455 -216
- package/dist/default/__generated__/skins/default-video/styles/theme.css +4 -19
- package/dist/default/__generated__/skins/default-video/styles/video.css +29 -0
- package/dist/default/__generated__/skins/minimal-video/styles/base.css +25 -0
- package/dist/default/__generated__/skins/minimal-video/styles/buttons.css +266 -0
- package/dist/default/__generated__/skins/minimal-video/styles/captions.css +22 -0
- package/dist/default/__generated__/skins/minimal-video/styles/container.css +158 -0
- package/dist/default/__generated__/skins/minimal-video/styles/controls.css +182 -0
- package/dist/default/__generated__/skins/minimal-video/styles/dialog.css +77 -0
- package/dist/default/__generated__/skins/minimal-video/styles/indicator.css +322 -0
- package/dist/default/__generated__/skins/minimal-video/styles/menus.css +254 -0
- package/dist/default/__generated__/skins/minimal-video/styles/overlays.css +35 -0
- package/dist/default/__generated__/skins/minimal-video/styles/popups.css +371 -0
- package/dist/default/__generated__/skins/minimal-video/styles/poster.css +47 -0
- package/dist/default/__generated__/skins/minimal-video/styles/sliders.css +436 -0
- package/dist/default/__generated__/skins/minimal-video/styles/styles.css +2246 -0
- package/dist/default/__generated__/skins/minimal-video/styles/theme.css +7 -0
- package/dist/default/__generated__/skins/minimal-video/styles/video.css +29 -0
- package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/default/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/default/define/audio/minimal-skin.css +103 -101
- package/dist/default/define/audio/skin.css +68 -69
- package/dist/default/define/live-audio/minimal-skin.css +103 -101
- package/dist/default/define/live-audio/skin.css +68 -69
- package/dist/default/define/live-video/minimal-skin.css +140 -120
- package/dist/default/define/live-video/minimal-skin.js +1 -1
- package/dist/default/define/live-video/minimal-skin.js.map +1 -1
- package/dist/default/define/live-video/minimal-skin.tailwind.js +1 -1
- package/dist/default/define/live-video/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/define/live-video/skin.css +89 -76
- package/dist/default/define/live-video/skin.js +1 -1
- package/dist/default/define/live-video/skin.js.map +1 -1
- package/dist/default/define/live-video/skin.tailwind.js +1 -1
- package/dist/default/define/live-video/skin.tailwind.js.map +1 -1
- package/dist/default/define/ui/gesture.js +7 -0
- package/dist/default/define/ui/gesture.js.map +1 -0
- package/dist/default/define/video/minimal-skin.css +140 -120
- package/dist/default/define/video/minimal-skin.js +1 -1
- package/dist/default/define/video/minimal-skin.js.map +1 -1
- package/dist/default/define/video/minimal-skin.tailwind.js +1 -1
- package/dist/default/define/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/define/video/skin.css +89 -76
- package/dist/default/define/video/skin.js +1 -1
- package/dist/default/define/video/skin.js.map +1 -1
- package/dist/default/define/video/skin.tailwind.js +1 -1
- package/dist/default/define/video/skin.tailwind.js.map +1 -1
- package/dist/default/icons/dist/element/default/icons.js +1 -1
- package/dist/default/icons/dist/element/default/icons.js.map +1 -1
- package/dist/default/icons/dist/element/minimal/icons.js +1 -1
- package/dist/default/icons/dist/element/minimal/icons.js.map +1 -1
- package/dist/default/icons/dist/html/default/airplay-exit.js +1 -1
- package/dist/default/icons/dist/html/default/airplay-exit.js.map +1 -1
- package/dist/default/icons/dist/html/minimal/airplay-exit.js +1 -1
- package/dist/default/icons/dist/html/minimal/airplay-exit.js.map +1 -1
- package/dist/default/icons/dist/render/default/index.js +1 -1
- package/dist/default/icons/dist/render/default/index.js.map +1 -1
- package/dist/default/icons/dist/render/minimal/index.js +1 -1
- package/dist/default/icons/dist/render/minimal/index.js.map +1 -1
- package/dist/default/media/hls-background-video/media.js +18 -0
- package/dist/default/media/hls-background-video/media.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/button.js +3 -1
- package/dist/default/skins/dist/default/default/tailwind/components/button.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/poster.js +8 -1
- package/dist/default/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/slider.js +10 -10
- package/dist/default/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js +1 -1
- package/dist/default/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -1
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js +2 -2
- package/dist/default/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js +8 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js +13 -12
- package/dist/default/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -1
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js +6 -5
- package/dist/default/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/shared/tailwind/icon-state.js +4 -4
- package/dist/default/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
- package/dist/default/store/provider-mixin.js +22 -8
- package/dist/default/store/provider-mixin.js.map +1 -1
- package/dist/default/ui/audio-track-radio-group/audio-track-radio-group-element.js +1 -1
- package/dist/default/ui/audio-track-radio-group/audio-track-radio-group-element.js.map +1 -1
- package/dist/default/ui/captions-radio-group/captions-radio-group-element.js +1 -1
- package/dist/default/ui/captions-radio-group/captions-radio-group-element.js.map +1 -1
- package/dist/default/ui/gesture/gesture-element.js.map +1 -1
- package/dist/default/ui/hotkey/hotkey-element.js.map +1 -1
- package/dist/default/ui/menu/context.js.map +1 -1
- package/dist/default/ui/menu/menu-element.js +28 -27
- package/dist/default/ui/menu/menu-element.js.map +1 -1
- package/dist/default/ui/menu/menu-radio-group-element.js +14 -14
- package/dist/default/ui/menu/menu-radio-group-element.js.map +1 -1
- package/dist/default/ui/playback-rate-radio-group/playback-rate-radio-group-element.js +1 -1
- package/dist/default/ui/playback-rate-radio-group/playback-rate-radio-group-element.js.map +1 -1
- package/dist/default/ui/poster/poster-element.js +138 -8
- package/dist/default/ui/poster/poster-element.js.map +1 -1
- package/dist/default/ui/quality-radio-group/quality-radio-group-element.js +1 -1
- package/dist/default/ui/quality-radio-group/quality-radio-group-element.js.map +1 -1
- package/dist/default/ui/slider/slider-preview-element.js.map +1 -1
- package/dist/dev/__generated__/skins/default-video/styles/buttons.css +132 -18
- package/dist/dev/__generated__/skins/default-video/styles/captions.css +22 -0
- package/dist/dev/__generated__/skins/default-video/styles/container.css +121 -8
- package/dist/dev/__generated__/skins/default-video/styles/controls.css +436 -21
- package/dist/dev/__generated__/skins/default-video/styles/dialog.css +169 -0
- package/dist/dev/__generated__/skins/default-video/styles/indicator.css +459 -0
- package/dist/dev/__generated__/skins/default-video/styles/menus.css +254 -0
- package/dist/dev/__generated__/skins/default-video/styles/overlays.css +26 -2
- package/dist/dev/__generated__/skins/default-video/styles/popups.css +338 -12
- package/dist/dev/__generated__/skins/default-video/styles/poster.css +4 -4
- package/dist/dev/__generated__/skins/default-video/styles/sliders.css +355 -31
- package/dist/dev/__generated__/skins/default-video/styles/styles.css +2455 -216
- package/dist/dev/__generated__/skins/default-video/styles/theme.css +4 -19
- package/dist/dev/__generated__/skins/default-video/styles/video.css +29 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/base.css +25 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/buttons.css +266 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/captions.css +22 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/container.css +158 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/controls.css +182 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/dialog.css +77 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/indicator.css +322 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/menus.css +254 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/overlays.css +35 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/popups.css +371 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/poster.css +47 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/sliders.css +436 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/styles.css +2246 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/theme.css +7 -0
- package/dist/dev/__generated__/skins/minimal-video/styles/video.css +29 -0
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-audio/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/live-video/skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/minimal-skin.js.map +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js +1 -1
- package/dist/dev/_virtual/inline-css_src/define/video/skin.js.map +1 -1
- package/dist/dev/define/audio/minimal-skin.css +103 -101
- package/dist/dev/define/audio/skin.css +68 -69
- package/dist/dev/define/live-audio/minimal-skin.css +103 -101
- package/dist/dev/define/live-audio/skin.css +68 -69
- package/dist/dev/define/live-video/minimal-skin.css +140 -120
- package/dist/dev/define/live-video/minimal-skin.d.ts.map +1 -1
- package/dist/dev/define/live-video/minimal-skin.js +3 -1
- package/dist/dev/define/live-video/minimal-skin.js.map +1 -1
- package/dist/dev/define/live-video/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/live-video/minimal-skin.tailwind.js +3 -1
- package/dist/dev/define/live-video/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/define/live-video/skin.css +89 -76
- package/dist/dev/define/live-video/skin.d.ts.map +1 -1
- package/dist/dev/define/live-video/skin.js +3 -1
- package/dist/dev/define/live-video/skin.js.map +1 -1
- package/dist/dev/define/live-video/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/live-video/skin.tailwind.js +4 -2
- package/dist/dev/define/live-video/skin.tailwind.js.map +1 -1
- package/dist/dev/define/ui/gesture.d.ts +8 -0
- package/dist/dev/define/ui/gesture.d.ts.map +1 -0
- package/dist/dev/define/ui/gesture.js +7 -0
- package/dist/dev/define/ui/gesture.js.map +1 -0
- package/dist/dev/define/video/minimal-skin.css +140 -120
- package/dist/dev/define/video/minimal-skin.d.ts.map +1 -1
- package/dist/dev/define/video/minimal-skin.js +3 -1
- package/dist/dev/define/video/minimal-skin.js.map +1 -1
- package/dist/dev/define/video/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/video/minimal-skin.tailwind.js +3 -1
- package/dist/dev/define/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/define/video/skin.css +89 -76
- package/dist/dev/define/video/skin.d.ts.map +1 -1
- package/dist/dev/define/video/skin.js +3 -1
- package/dist/dev/define/video/skin.js.map +1 -1
- package/dist/dev/define/video/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/define/video/skin.tailwind.js +4 -2
- package/dist/dev/define/video/skin.tailwind.js.map +1 -1
- package/dist/dev/media/hls-background-video/media.d.ts +16 -0
- package/dist/dev/media/hls-background-video/media.d.ts.map +1 -1
- package/dist/dev/media/hls-background-video/media.js +18 -0
- package/dist/dev/media/hls-background-video/media.js.map +1 -1
- package/dist/dev/packages/icons/dist/element/default/icons.js +1 -1
- package/dist/dev/packages/icons/dist/element/default/icons.js.map +1 -1
- package/dist/dev/packages/icons/dist/element/minimal/icons.js +1 -1
- package/dist/dev/packages/icons/dist/element/minimal/icons.js.map +1 -1
- package/dist/dev/packages/icons/dist/html/default/airplay-exit.js +1 -1
- package/dist/dev/packages/icons/dist/html/default/airplay-exit.js.map +1 -1
- package/dist/dev/packages/icons/dist/html/minimal/airplay-exit.js +1 -1
- package/dist/dev/packages/icons/dist/html/minimal/airplay-exit.js.map +1 -1
- package/dist/dev/packages/icons/dist/render/default/index.js +1 -1
- package/dist/dev/packages/icons/dist/render/default/index.js.map +1 -1
- package/dist/dev/packages/icons/dist/render/minimal/index.js +1 -1
- package/dist/dev/packages/icons/dist/render/minimal/index.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js +3 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/button.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js +8 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/poster.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js +10 -10
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/slider.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/thumbnail.js +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/components/thumbnail.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js +2 -2
- package/dist/dev/packages/skins/dist/default/default/tailwind/video.tailwind.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js +8 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/poster.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js +13 -12
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/slider.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/thumbnail.js +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/components/thumbnail.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js +6 -5
- package/dist/dev/packages/skins/dist/default/minimal/tailwind/video.tailwind.js.map +1 -1
- package/dist/dev/packages/skins/dist/default/shared/tailwind/icon-state.js +4 -4
- package/dist/dev/packages/skins/dist/default/shared/tailwind/icon-state.js.map +1 -1
- package/dist/dev/store/provider-mixin.d.ts.map +1 -1
- package/dist/dev/store/provider-mixin.js +24 -8
- package/dist/dev/store/provider-mixin.js.map +1 -1
- package/dist/dev/store/types.d.ts +2 -2
- package/dist/dev/store/types.d.ts.map +1 -1
- package/dist/dev/ui/audio-track-radio-group/audio-track-radio-group-element.js +1 -1
- package/dist/dev/ui/audio-track-radio-group/audio-track-radio-group-element.js.map +1 -1
- package/dist/dev/ui/captions-radio-group/captions-radio-group-element.js +1 -1
- package/dist/dev/ui/captions-radio-group/captions-radio-group-element.js.map +1 -1
- package/dist/dev/ui/gesture/gesture-element.d.ts +7 -7
- package/dist/dev/ui/gesture/gesture-element.d.ts.map +1 -1
- package/dist/dev/ui/gesture/gesture-element.js.map +1 -1
- package/dist/dev/ui/hotkey/hotkey-element.d.ts +6 -6
- package/dist/dev/ui/hotkey/hotkey-element.d.ts.map +1 -1
- package/dist/dev/ui/hotkey/hotkey-element.js.map +1 -1
- package/dist/dev/ui/menu/context.d.ts +8 -8
- package/dist/dev/ui/menu/context.d.ts.map +1 -1
- package/dist/dev/ui/menu/context.js.map +1 -1
- package/dist/dev/ui/menu/menu-element.d.ts.map +1 -1
- package/dist/dev/ui/menu/menu-element.js +28 -27
- package/dist/dev/ui/menu/menu-element.js.map +1 -1
- package/dist/dev/ui/menu/menu-radio-group-element.d.ts +1 -1
- package/dist/dev/ui/menu/menu-radio-group-element.d.ts.map +1 -1
- package/dist/dev/ui/menu/menu-radio-group-element.js +14 -14
- package/dist/dev/ui/menu/menu-radio-group-element.js.map +1 -1
- package/dist/dev/ui/playback-rate-radio-group/playback-rate-radio-group-element.js +1 -1
- package/dist/dev/ui/playback-rate-radio-group/playback-rate-radio-group-element.js.map +1 -1
- package/dist/dev/ui/poster/poster-element.d.ts +20 -18
- package/dist/dev/ui/poster/poster-element.d.ts.map +1 -1
- package/dist/dev/ui/poster/poster-element.js +145 -8
- package/dist/dev/ui/poster/poster-element.js.map +1 -1
- package/dist/dev/ui/quality-radio-group/quality-radio-group-element.js +1 -1
- package/dist/dev/ui/quality-radio-group/quality-radio-group-element.js.map +1 -1
- package/dist/dev/ui/slider/slider-preview-element.d.ts +2 -2
- package/dist/dev/ui/slider/slider-preview-element.d.ts.map +1 -1
- package/dist/dev/ui/slider/slider-preview-element.js.map +1 -1
- package/docs/README.md +1 -1
- package/docs/concepts/skins.md +91 -78
- package/docs/how-to/customize-skins.md +411 -377
- package/docs/reference/menu.md +3 -19
- package/docs/reference/popover.md +2 -2
- package/docs/reference/poster.md +211 -21
- package/docs/reference/slider.md +1 -1
- package/docs/reference/time-slider.md +1 -1
- package/docs/reference/tooltip.md +6 -6
- package/docs/reference/volume-slider.md +1 -1
- package/package.json +14 -9
- package/cdn/adapter-Bk03SAxn.js +0 -2
- package/cdn/adapter-Bk03SAxn.js.map +0 -1
- package/cdn/adapter-XTen-YVQ.js.map +0 -1
- package/cdn/compounds-BEO1d3ZM.js +0 -8
- package/cdn/compounds-BEO1d3ZM.js.map +0 -1
- package/cdn/compounds-nk9RJtBK.js.map +0 -1
- package/cdn/create-player-DK9WOywd.js.map +0 -1
- package/cdn/create-player-hSdQMP5p.js +0 -2
- package/cdn/create-player-hSdQMP5p.js.map +0 -1
- package/cdn/default-BqQDVloS.js.map +0 -1
- package/cdn/default-CXWVp2oG.js +0 -2
- package/cdn/default-CXWVp2oG.js.map +0 -1
- package/cdn/default-Dw6cIEqT.js +0 -2
- package/cdn/default-Dw6cIEqT.js.map +0 -1
- package/cdn/default-I2LasfxC.js.map +0 -1
- package/cdn/error-surface-DCT1m2p1.js +0 -2
- package/cdn/error-surface-DCT1m2p1.js.map +0 -1
- package/cdn/error-surface-drmCvBVW.js.map +0 -1
- package/cdn/gesture-element-6Ld1YwIL.js.map +0 -1
- package/cdn/gesture-element-BC48ucj9.js +0 -2
- package/cdn/gesture-element-BC48ucj9.js.map +0 -1
- package/cdn/i18n-Dc7WM2xd.js +0 -2
- package/cdn/media-BTipOcKo.js +0 -2
- package/cdn/media-Bmablv4g.js +0 -2
- package/cdn/media-Bmablv4g.js.map +0 -1
- package/cdn/media-COIe3uI5.js.map +0 -1
- package/cdn/media-CPVSKLdk.js +0 -2
- package/cdn/media-Dq4zmIJa.js +0 -2
- package/cdn/media-Dq4zmIJa.js.map +0 -1
- package/cdn/media-suYcjCG2.js +0 -445
- package/cdn/media-suYcjCG2.js.map +0 -1
- package/cdn/minimal-BedCvMBG.js +0 -2
- package/cdn/minimal-BedCvMBG.js.map +0 -1
- package/cdn/minimal-BoP112ye.js +0 -2
- package/cdn/minimal-BoP112ye.js.map +0 -1
- package/cdn/minimal-DLosvq31.js.map +0 -1
- package/cdn/minimal-DQCLKRyR.js.map +0 -1
- package/cdn/minimal-ui-Et2Wcn7r.js +0 -2
- package/cdn/player-BRQLp5bX.js +0 -2
- package/cdn/player-BloX4l6F.js +0 -2
- package/cdn/player-rCFqzWrA.js +0 -2
- package/cdn/poster-element-BGr1VQJB.js.map +0 -1
- package/cdn/poster-element-DBmgOyep.js +0 -2
- package/cdn/poster-element-DBmgOyep.js.map +0 -1
- package/cdn/seek-button-element-XMTLIxZj.js.map +0 -1
- package/cdn/select-tracks-nRPBa1NC.js.map +0 -1
- package/cdn/select-tracks-xV1s28xD.js +0 -59
- package/cdn/select-tracks-xV1s28xD.js.map +0 -1
- package/cdn/time-slider-chapters-element-DJ0abZXI.js.map +0 -1
- package/cdn/time-slider-chapters-element-DW8YyJn8.js +0 -2
- package/cdn/time-slider-chapters-element-DW8YyJn8.js.map +0 -1
- package/cdn/ui-C0isALTQ.js +0 -2
- package/cdn/ui-DVpkE1MN.js +0 -2
|
@@ -542,6 +542,54 @@ function effect(fn) {
|
|
|
542
542
|
};
|
|
543
543
|
}
|
|
544
544
|
|
|
545
|
+
//#endregion
|
|
546
|
+
//#region ../spf/dist/dev/media/errors.js
|
|
547
|
+
/** SVTA 1 [Media Content] 004 — the video is in a format we can't play (e.g. an MPEG-TS container). */
|
|
548
|
+
const SVTA_UNSUPPORTED_VIDEO_FORMAT = 1004;
|
|
549
|
+
/** SVTA 1 [Media Content] 005 — the audio counterpart of {@link SVTA_UNSUPPORTED_VIDEO_FORMAT}. */
|
|
550
|
+
const SVTA_UNSUPPORTED_AUDIO_FORMAT = 1005;
|
|
551
|
+
/**
|
|
552
|
+
* SVTA 4 [Content Protection] 008 — unsupported or unavailable DRM system. Used
|
|
553
|
+
* for "this source is encrypted and we have no decryption pipeline," which is
|
|
554
|
+
* detection, not a license failure.
|
|
555
|
+
*/
|
|
556
|
+
const SVTA_UNSUPPORTED_DRM_SYSTEM = 4008;
|
|
557
|
+
/**
|
|
558
|
+
* SVTA 2 [Playback] 011 — no video track the environment can play.
|
|
559
|
+
*
|
|
560
|
+
* Covers both ways a composition can end up with nothing to select: renditions
|
|
561
|
+
* that existed and were all excluded as unplayable, and — where the composition
|
|
562
|
+
* composes `reportAbsentTrackType` to say it needs the type — a source carrying
|
|
563
|
+
* none to begin with. Deliberately one code for both, because they are the same
|
|
564
|
+
* answer to a viewer, and because the alternative is a code the SVTA spec doesn't
|
|
565
|
+
* define. Whether an absent type is a failure is the composition's to state,
|
|
566
|
+
* which is why it opts in rather than being read off the source.
|
|
567
|
+
*/
|
|
568
|
+
const SVTA_NO_SUPPORTED_VIDEO_TRACK = 2011;
|
|
569
|
+
/** SVTA 2 [Playback] 012 — the audio counterpart of {@link SVTA_NO_SUPPORTED_VIDEO_TRACK}. */
|
|
570
|
+
const SVTA_NO_SUPPORTED_AUDIO_TRACK = 2012;
|
|
571
|
+
/**
|
|
572
|
+
* SVTA 99 [Custom] 001 — this engine has no pipeline for something the source
|
|
573
|
+
* requires, so the source is unplayable *here* rather than broken.
|
|
574
|
+
*
|
|
575
|
+
* Custom rather than standard because the standard codes available describe
|
|
576
|
+
* either narrower or wider things. The causes (1004/1005 unsupported format,
|
|
577
|
+
* 4008 unsupported DRM) say what one rendition hit; the verdicts (2011/2012 no
|
|
578
|
+
* supported track) say a type emptied without saying why it's unfixable. And
|
|
579
|
+
* 2039 "Manifest feature unsupported" covers features that are unsupported but
|
|
580
|
+
* still *playable* — LL-HLS degrading to standard live is a 2039 — so
|
|
581
|
+
* overloading it for a fatal condition would make it useless for the notices it
|
|
582
|
+
* belongs on.
|
|
583
|
+
*
|
|
584
|
+
* Index `001`: the spec defines only `99000` (Unknown) for the custom category
|
|
585
|
+
* and leaves the rest to the publisher, so this is the first code we define.
|
|
586
|
+
*
|
|
587
|
+
* Five digits, and deliberately not special-cased anywhere: {@link svtaCategory}
|
|
588
|
+
* and {@link svtaIndex} decompose it correctly by arithmetic alone, because
|
|
589
|
+
* every standard category is below `8000` and custom starts at `99000`.
|
|
590
|
+
*/
|
|
591
|
+
const SVTA_UNSUPPORTED_PLAYBACK_FEATURE = 99001;
|
|
592
|
+
|
|
545
593
|
//#endregion
|
|
546
594
|
//#region ../spf/dist/dev/core/signals/primitives.js
|
|
547
595
|
/** Read a signal value without tracking it as a dependency. */
|
|
@@ -2034,6 +2082,73 @@ function parseMediaPlaylist(text, previous) {
|
|
|
2034
2082
|
};
|
|
2035
2083
|
}
|
|
2036
2084
|
|
|
2085
|
+
//#endregion
|
|
2086
|
+
//#region ../spf/dist/dev/media/dom/capabilities.js
|
|
2087
|
+
/**
|
|
2088
|
+
* Capability probing — the engine's foundation for asking the browser what it
|
|
2089
|
+
* can actually decode before committing a rendition to the pipeline.
|
|
2090
|
+
*
|
|
2091
|
+
* Today this is the synchronous codec half: `canPlayTrack` answers "can this
|
|
2092
|
+
* environment play this track?" by building the track's MIME codec string and
|
|
2093
|
+
* passing it to `MediaSource.isTypeSupported` (via `isCodecSupported`). It's the
|
|
2094
|
+
* DOM implementation of the DOM-free `CanPlayTrack` predicate the
|
|
2095
|
+
* track-switching hard-constraint pre-pass consumes — injected through engine
|
|
2096
|
+
* config so the (DOM-free) behavior never imports a DOM API directly.
|
|
2097
|
+
*
|
|
2098
|
+
* Results are memoized by built MIME string: codec support is a pure function
|
|
2099
|
+
* of (codec, environment) and never changes after load, so probing is lazy
|
|
2100
|
+
* (per candidate, at constraint-apply time) but each unique MIME is asked once.
|
|
2101
|
+
*
|
|
2102
|
+
* Future cluster-D phases (async `requestMediaKeySystemAccess` key-system
|
|
2103
|
+
* probing, `SourceBuffer.changeType()` availability) extend this surface; the
|
|
2104
|
+
* async ones land as a state-slot writer behavior rather than a config
|
|
2105
|
+
* predicate, since their verdict resolves asynchronously.
|
|
2106
|
+
*/
|
|
2107
|
+
const codecSupportCache = /* @__PURE__ */ new Map();
|
|
2108
|
+
/**
|
|
2109
|
+
* Whether the environment can decode `track`, by codec. Builds the track's
|
|
2110
|
+
* MIME codec string and checks `MediaSource.isTypeSupported`, memoized by MIME.
|
|
2111
|
+
* A track without enough to probe — no `mimeType`, or no declared `codecs`
|
|
2112
|
+
* (CODECS is optional per the HLS spec) — is unprobeable and passes through as
|
|
2113
|
+
* playable (`true`) rather than being dropped; the late `createSourceBuffer`
|
|
2114
|
+
* check stays as the backstop for those.
|
|
2115
|
+
*
|
|
2116
|
+
* Detected non-fMP4 containers (`video/mp2t`, `audio/aac`) are asserted
|
|
2117
|
+
* unsupported regardless of the probe, so they're pruned before selection
|
|
2118
|
+
* (the type makes no pick) instead of failing/stalling deep in the pipeline.
|
|
2119
|
+
* Two different reasons, neither UA-based:
|
|
2120
|
+
*
|
|
2121
|
+
* - **MPEG-TS** can't be played at all here: `isTypeSupported('video/mp2t…')` is
|
|
2122
|
+
* a genuine false positive on Chromium (reports `true` but appends produce no
|
|
2123
|
+
* buffered range), and this engine has no TS transmux pipeline.
|
|
2124
|
+
* - **Raw ADTS AAC** is a *temporary* limitation. The browser genuinely
|
|
2125
|
+
* supports it (Chrome/Safari decode `audio/aac`; Firefox doesn't), so it could
|
|
2126
|
+
* be made playable — but our segment actors / loading behaviors / append
|
|
2127
|
+
* pipeline assume every rendition has an `EXT-X-MAP` init segment (e.g. an
|
|
2128
|
+
* `append-init` task with an empty URL, fMP4-shaped append handling). Until
|
|
2129
|
+
* that init-segment assumption is removed, ADTS would fetch but never buffer
|
|
2130
|
+
* (a silent stall), so we assert it unplayable for now. FOLLOW-UP: drop the
|
|
2131
|
+
* init-required assumption in the pipeline and switch this to a bare-MIME
|
|
2132
|
+
* probe (`buildMimeCodec` would project `audio/aac` with no codecs) so it
|
|
2133
|
+
* plays where the browser supports it.
|
|
2134
|
+
*
|
|
2135
|
+
* Override via the engine's `canPlayTrack` config when those pipelines land.
|
|
2136
|
+
*/
|
|
2137
|
+
const canPlayTrack = (track) => {
|
|
2138
|
+
if (track.mimeType && NON_FMP4_CONTAINER_MIMES.has(track.mimeType)) return false;
|
|
2139
|
+
if (getMediaPlaylistMetadata(track)?.encrypted) return false;
|
|
2140
|
+
if (!track.mimeType || !track.codecs?.length) return true;
|
|
2141
|
+
const mimeCodec = buildMimeCodec({
|
|
2142
|
+
mimeType: track.mimeType,
|
|
2143
|
+
codecs: track.codecs
|
|
2144
|
+
});
|
|
2145
|
+
const cached = codecSupportCache.get(mimeCodec);
|
|
2146
|
+
if (cached !== void 0) return cached;
|
|
2147
|
+
const supported = isCodecSupported(mimeCodec);
|
|
2148
|
+
codecSupportCache.set(mimeCodec, supported);
|
|
2149
|
+
return supported;
|
|
2150
|
+
};
|
|
2151
|
+
|
|
2037
2152
|
//#endregion
|
|
2038
2153
|
//#region ../spf/dist/dev/media/hls/parse-multivariant.js
|
|
2039
2154
|
/**
|
|
@@ -2389,6 +2504,40 @@ function emitError(state, error) {
|
|
|
2389
2504
|
update(state.errors, (errors) => [...errors ?? [], error]);
|
|
2390
2505
|
}
|
|
2391
2506
|
/**
|
|
2507
|
+
* A "constraint" that reports a type the source carries **no** renditions of, for
|
|
2508
|
+
* a composition that can't play without it.
|
|
2509
|
+
*
|
|
2510
|
+
* Strange on purpose, and the strangeness is the point: it never constrains
|
|
2511
|
+
* anything, always returning its input untouched. It is shaped as a rule so a
|
|
2512
|
+
* composition opts in by adding it to `constraints` — nothing to thread through
|
|
2513
|
+
* config, and no cost at all to a composition that leaves it out.
|
|
2514
|
+
*
|
|
2515
|
+
* **Belongs first in the chain.** A constraint sees the list as it stands at its
|
|
2516
|
+
* own position, so only at the head does an empty input mean "the source offers
|
|
2517
|
+
* none of this type" rather than "the constraints ahead of me pruned them all."
|
|
2518
|
+
*
|
|
2519
|
+
* This is the one failure no per-rendition cause can report: causes come from
|
|
2520
|
+
* `reportUnsupportedTrackConditions` as each media playlist resolves, and here
|
|
2521
|
+
* nothing resolves, because there is nothing to resolve. Everything else already
|
|
2522
|
+
* reports something more specific than a verdict.
|
|
2523
|
+
*
|
|
2524
|
+
* Idempotent because the constraint chain runs inside a `computed` that re-derives
|
|
2525
|
+
* on every `presentation` write — segment appends and live reloads included — and
|
|
2526
|
+
* the sequence deliberately keeps duplicates. `peek` is what keeps that computed
|
|
2527
|
+
* from subscribing to the slot this writes.
|
|
2528
|
+
*
|
|
2529
|
+
* @example
|
|
2530
|
+
* // engine-background-video.ts — video-only, so a source with none can't play
|
|
2531
|
+
* constraints: [reportAbsentTrackType(SVTA_NO_SUPPORTED_VIDEO_TRACK), excludeUnplayableTracks]
|
|
2532
|
+
*/
|
|
2533
|
+
function reportAbsentTrackType(code) {
|
|
2534
|
+
return (tracks, { state }) => {
|
|
2535
|
+
const reported = state.errors && peek(state.errors);
|
|
2536
|
+
if (!tracks.length && !reported?.some((error) => error.code === code)) emitError(state, { code });
|
|
2537
|
+
return tracks;
|
|
2538
|
+
};
|
|
2539
|
+
}
|
|
2540
|
+
/**
|
|
2392
2541
|
* Own `errors` for the resolved source's lifetime.
|
|
2393
2542
|
*
|
|
2394
2543
|
* @example
|
|
@@ -4667,58 +4816,44 @@ function matchesPartialTrack(track, filter) {
|
|
|
4667
4816
|
}
|
|
4668
4817
|
return true;
|
|
4669
4818
|
}
|
|
4670
|
-
/**
|
|
4671
|
-
|
|
4672
|
-
*
|
|
4673
|
-
* Returns the first track in the first switching set of the matching
|
|
4674
|
-
* selection set, or `undefined` if either is missing. POC-shaped
|
|
4675
|
-
* default-pick — `pickVideoTrack` / `pickAudioTrack` honor bandwidth +
|
|
4676
|
-
* language preferences and will replace this once selection callers are
|
|
4677
|
-
* ready.
|
|
4678
|
-
*/
|
|
4679
|
-
function pickFirstTrackId(presentation, type) {
|
|
4680
|
-
return presentation.selectionSets?.find((set) => set.type === type)?.switchingSets[0]?.tracks[0]?.id;
|
|
4819
|
+
/** Missing dimensions are treated as area `0`, so a track without them ranks last. */
|
|
4820
|
+
function pixelArea(track) {
|
|
4821
|
+
return (track.width ?? 0) * (track.height ?? 0);
|
|
4681
4822
|
}
|
|
4682
4823
|
/**
|
|
4683
|
-
*
|
|
4684
|
-
*
|
|
4685
|
-
*
|
|
4686
|
-
*
|
|
4824
|
+
* Narrow to the tracks at or below `maxPixelArea`, and nothing else: no ordering,
|
|
4825
|
+
* no fallback. Survivors keep their incoming order, and an empty result is a real
|
|
4826
|
+
* answer — "none of these fit".
|
|
4827
|
+
*
|
|
4828
|
+
* Deliberately only the filter, because as a selection rule this composes under
|
|
4829
|
+
* `applyRules`, which already owns both halves a caller might expect here: an empty
|
|
4830
|
+
* result is skipped, so a preference can never narrow the candidate set to nothing;
|
|
4831
|
+
* and ordering the survivors is a separate rule's job
|
|
4832
|
+
* ({@link byDescendingResolution}, bandwidth ABR). Doing either here would duplicate
|
|
4833
|
+
* the composer and give one rule two responsibilities.
|
|
4687
4834
|
*/
|
|
4688
|
-
function
|
|
4689
|
-
|
|
4690
|
-
const sorted = [...tracks].sort((a, b) => (b.width ?? 0) * (b.height ?? 0) - (a.width ?? 0) * (a.height ?? 0) || (b.bandwidth ?? 0) - (a.bandwidth ?? 0));
|
|
4691
|
-
return sorted.find((t) => (t.width ?? 0) * (t.height ?? 0) <= maxPixelArea) ?? sorted[sorted.length - 1];
|
|
4835
|
+
function tracksUnderPixelArea(tracks, maxPixelArea = Number.POSITIVE_INFINITY) {
|
|
4836
|
+
return tracks.filter((track) => pixelArea(track) <= maxPixelArea);
|
|
4692
4837
|
}
|
|
4693
4838
|
/**
|
|
4694
|
-
*
|
|
4839
|
+
* Compare two tracks by resolution, largest first, with bandwidth as the tiebreak
|
|
4840
|
+
* for renditions of identical dimensions. Missing dimensions are treated as area
|
|
4841
|
+
* `0`, so a track without them sorts last.
|
|
4695
4842
|
*
|
|
4696
|
-
*
|
|
4697
|
-
*
|
|
4843
|
+
* A comparator rather than a "highest track" function: the selection-rule chain
|
|
4844
|
+
* takes the head of the list it produces, so ranking never has to collapse to a
|
|
4845
|
+
* single track. `preferHighestResolution` is `sort` over this and nothing more.
|
|
4698
4846
|
*/
|
|
4699
|
-
function
|
|
4700
|
-
|
|
4701
|
-
if (!tracks?.length) return void 0;
|
|
4702
|
-
return pickTrackUnderPixelArea(tracks)?.id;
|
|
4847
|
+
function byDescendingResolution(a, b) {
|
|
4848
|
+
return pixelArea(b) - pixelArea(a) || (b.bandwidth ?? 0) - (a.bandwidth ?? 0);
|
|
4703
4849
|
}
|
|
4704
4850
|
/**
|
|
4705
|
-
*
|
|
4851
|
+
* Default audio policy over a candidate list: the three-tier pick a selection-rule
|
|
4852
|
+
* chain applies once it has narrowed the candidates.
|
|
4706
4853
|
*
|
|
4707
|
-
*
|
|
4708
|
-
* 1. First track matching preferred language (if specified)
|
|
4709
|
-
* 2. First default track
|
|
4710
|
-
* 3. First audio track
|
|
4711
|
-
*
|
|
4712
|
-
* @param presentation - Presentation with audio tracks
|
|
4713
|
-
* @param config - Selection configuration (preferred language)
|
|
4714
|
-
* @returns Selected audio track ID, or undefined if no audio tracks
|
|
4854
|
+
* Priority: `preferredAudioLanguage` match → `DEFAULT=YES` → first track.
|
|
4715
4855
|
*/
|
|
4716
|
-
function
|
|
4717
|
-
const audioSet = presentation.selectionSets?.find((set) => set.type === "audio");
|
|
4718
|
-
if (!audioSet || audioSet.switchingSets.length === 0) return;
|
|
4719
|
-
const switchingSet = audioSet.switchingSets[0];
|
|
4720
|
-
if (!switchingSet || switchingSet.tracks.length === 0) return;
|
|
4721
|
-
const tracks = switchingSet.tracks;
|
|
4856
|
+
function pickAudioTrackFromTracks(tracks, config) {
|
|
4722
4857
|
if (config?.preferredAudioLanguage) {
|
|
4723
4858
|
const languageMatch = tracks.find((track) => track.language === config.preferredAudioLanguage);
|
|
4724
4859
|
if (languageMatch) return languageMatch.id;
|
|
@@ -4728,11 +4863,9 @@ function pickAudioTrack(presentation, config) {
|
|
|
4728
4863
|
return tracks[0]?.id;
|
|
4729
4864
|
}
|
|
4730
4865
|
/**
|
|
4731
|
-
* Default text-track policy over
|
|
4732
|
-
*
|
|
4733
|
-
*
|
|
4734
|
-
* CDN-scoped track-switching chain — applies the same policy without re-deriving
|
|
4735
|
-
* from the presentation.
|
|
4866
|
+
* Default text-track policy over a candidate list: the opt-in three-tier pick
|
|
4867
|
+
* `switchTextTrack`'s terminal applies once it has narrowed the renditions to the
|
|
4868
|
+
* constrained, CDN-scoped set.
|
|
4736
4869
|
*
|
|
4737
4870
|
* Priority: `preferredSubtitleLanguage` match → `DEFAULT=YES + AUTOSELECT=YES`
|
|
4738
4871
|
* (only when `enableDefaultTrack`) → `undefined` (opt-in). FORCED tracks are
|
|
@@ -4754,5 +4887,266 @@ function pickTextTrackFromTracks(tracks, config) {
|
|
|
4754
4887
|
}
|
|
4755
4888
|
|
|
4756
4889
|
//#endregion
|
|
4757
|
-
|
|
4758
|
-
|
|
4890
|
+
//#region ../spf/dist/dev/playback/primitives/selection-rules.js
|
|
4891
|
+
/**
|
|
4892
|
+
* Apply rules to a candidate list in order; the pick is the first survivor.
|
|
4893
|
+
* Two responsibilities the rules don't carry: a rule that returns nothing is
|
|
4894
|
+
* skipped (fall-through — a preference never empties the set), and once one
|
|
4895
|
+
* survivor remains the chain stops (early-bail — later rules, including the
|
|
4896
|
+
* bandwidth ranker, never run, so the effect doesn't subscribe to their
|
|
4897
|
+
* signals while the choice is fixed).
|
|
4898
|
+
*
|
|
4899
|
+
* @param rules - Rules to apply, most authoritative first
|
|
4900
|
+
* @param tracks - Candidate tracks
|
|
4901
|
+
* @param deps - The behavior's `{ state, context, config }`, passed through to each rule
|
|
4902
|
+
* @returns The surviving candidates, pick first
|
|
4903
|
+
*/
|
|
4904
|
+
function applyRules(rules, tracks, deps) {
|
|
4905
|
+
let current = tracks;
|
|
4906
|
+
for (const rule of rules) {
|
|
4907
|
+
const remaining = rule(current, deps);
|
|
4908
|
+
if (remaining.length === 0) continue;
|
|
4909
|
+
current = remaining;
|
|
4910
|
+
if (current.length === 1) break;
|
|
4911
|
+
}
|
|
4912
|
+
return current;
|
|
4913
|
+
}
|
|
4914
|
+
/**
|
|
4915
|
+
* Apply hard constraints to a candidate list — the pre-pass that runs before the
|
|
4916
|
+
* rule chain. A constraint shares a rule's signature but its exclusion is
|
|
4917
|
+
* *hard*: it removes the unplayable (a codec the environment can't decode, a CDN
|
|
4918
|
+
* in failover cooldown) and a removed track is never attempted. Unlike
|
|
4919
|
+
* `applyRules`, this never skips an empty result and never early-bails — every
|
|
4920
|
+
* constraint always applies, and an empty survivor set is a real outcome
|
|
4921
|
+
* ("nothing playable here"), not a fall-through. Because each constraint only
|
|
4922
|
+
* removes, the order they run in can't change the result.
|
|
4923
|
+
*
|
|
4924
|
+
* @param constraints - Constraints to apply (pooled, order-independent)
|
|
4925
|
+
* @param tracks - Candidate tracks
|
|
4926
|
+
* @param deps - The behavior's `{ state, context, config }`, passed to each constraint
|
|
4927
|
+
* @returns The playable survivors (possibly empty)
|
|
4928
|
+
*/
|
|
4929
|
+
function applyConstraints(constraints, tracks, deps) {
|
|
4930
|
+
let current = tracks;
|
|
4931
|
+
for (const constraint of constraints) current = constraint(current, deps);
|
|
4932
|
+
return current;
|
|
4933
|
+
}
|
|
4934
|
+
/**
|
|
4935
|
+
* Whether two candidate sets hold the same tracks, by id.
|
|
4936
|
+
*
|
|
4937
|
+
* The `equals` both selection behaviors give their candidate-set `computed`. A
|
|
4938
|
+
* live playlist refresh swaps in a new presentation object carrying the same
|
|
4939
|
+
* variants, and a constraint's own inputs can churn without changing which
|
|
4940
|
+
* tracks survive; in both cases the set is unchanged and the reaction must not
|
|
4941
|
+
* re-fire. Compares by id rather than array identity for exactly that.
|
|
4942
|
+
*/
|
|
4943
|
+
function sameCandidateSet(a, b) {
|
|
4944
|
+
return a.length === b.length && a.every((track) => b.some((other) => other.id === track.id));
|
|
4945
|
+
}
|
|
4946
|
+
/**
|
|
4947
|
+
* Capability constraint — a *hard* filter for the {@link applyConstraints}
|
|
4948
|
+
* pre-pass. Removes renditions this environment can't decode, probed via the
|
|
4949
|
+
* injected `canPlayTrack` (codec → `MediaSource.isTypeSupported`, plus the
|
|
4950
|
+
* container and encryption assertions that probe can't make). Constraining here
|
|
4951
|
+
* — before selection — means an unplayable variant is pruned upstream and never
|
|
4952
|
+
* picked, instead of surviving into the pipeline to fail late at
|
|
4953
|
+
* `createSourceBuffer`. That late throw stays as a defensive structural
|
|
4954
|
+
* guarantee; with this constraint it should rarely fire.
|
|
4955
|
+
*
|
|
4956
|
+
* Lives here rather than beside `switchVideoTrack` for the reason this module
|
|
4957
|
+
* exists: both the re-evaluating variant and the pinned `selectVideoTrack` apply
|
|
4958
|
+
* it, and reaching it through `behaviors/track-switching.ts` would drag the ABR
|
|
4959
|
+
* path into a composition that deliberately omits it.
|
|
4960
|
+
*
|
|
4961
|
+
* Passes everything through when there's no probe (a composition that didn't
|
|
4962
|
+
* wire one, or DOM-free tests). When it prunes *every* track, the empty result is
|
|
4963
|
+
* preserved (per `applyConstraints`) — "nothing playable" — which each consuming
|
|
4964
|
+
* behavior answers by clearing its selection and reporting the type's verdict.
|
|
4965
|
+
*/
|
|
4966
|
+
function excludeUnplayableTracks(tracks, { config }) {
|
|
4967
|
+
const canPlay = config?.canPlayTrack;
|
|
4968
|
+
if (!canPlay) return tracks;
|
|
4969
|
+
return tracks.filter((track) => canPlay(track));
|
|
4970
|
+
}
|
|
4971
|
+
|
|
4972
|
+
//#endregion
|
|
4973
|
+
//#region ../spf/dist/dev/playback/primitives/report-track-conditions.js
|
|
4974
|
+
/**
|
|
4975
|
+
* The seam `resolve-track` uses to report conditions discovered in a freshly
|
|
4976
|
+
* parsed media playlist.
|
|
4977
|
+
*
|
|
4978
|
+
* Injected rather than baked in so `resolve-track` stays free of format and
|
|
4979
|
+
* policy knowledge: it parses and commits, and whatever the composition wants
|
|
4980
|
+
* noticed about the result is this function's business. Which conditions matter,
|
|
4981
|
+
* and which codes they carry, therefore vary per composition — a provider that
|
|
4982
|
+
* never ships MPEG-TS can drop that check, and future playlist-derived notices
|
|
4983
|
+
* (LL-HLS or DVR support that's partial rather than absent) attach here without
|
|
4984
|
+
* touching the resolver.
|
|
4985
|
+
*
|
|
4986
|
+
* Reported **per rendition, as it resolves**, which is why these are causes and
|
|
4987
|
+
* not verdicts: one rendition being unplayable doesn't make the source
|
|
4988
|
+
* unplayable. The verdict is `track-switching`'s, which reports
|
|
4989
|
+
* `SVTA_NO_SUPPORTED_{VIDEO,AUDIO}_TRACK` when a type's candidates actually
|
|
4990
|
+
* empty. Keeping the two apart is what lets a mixed source — some renditions
|
|
4991
|
+
* encrypted or MPEG-TS, others playable — log its causes and still play.
|
|
4992
|
+
*/
|
|
4993
|
+
/** Unsupported-format code per type; text has none — absent captions aren't a failure. */
|
|
4994
|
+
const UNSUPPORTED_FORMAT_CODE = {
|
|
4995
|
+
video: SVTA_UNSUPPORTED_VIDEO_FORMAT,
|
|
4996
|
+
audio: SVTA_UNSUPPORTED_AUDIO_FORMAT
|
|
4997
|
+
};
|
|
4998
|
+
/**
|
|
4999
|
+
* The types a reported cause can legitimately describe: the ones whose candidates
|
|
5000
|
+
* `canPlayTrack` actually prunes, via `track-switching`'s `excludeUnplayableTracks`
|
|
5001
|
+
* pre-pass.
|
|
5002
|
+
*
|
|
5003
|
+
* Text is outside it by design — its switching chain runs failed-CDN constraints
|
|
5004
|
+
* alone, because an MSE codec probe is the wrong question for a WebVTT rendition
|
|
5005
|
+
* (see `track-switching.ts`). So nothing prunes a text rendition, no verdict can
|
|
5006
|
+
* follow from one, and a cause reported against it would be an orphan: the
|
|
5007
|
+
* adapter's unsupported-feature substitution scans the sequence as a whole, so a
|
|
5008
|
+
* lone encrypted subtitle would otherwise recode an unrelated verdict — an
|
|
5009
|
+
* all-CDN cooldown among them — as "this engine can't play the source".
|
|
5010
|
+
*/
|
|
5011
|
+
const CAPABILITY_PRUNED_TYPES = /* @__PURE__ */ new Set(["video", "audio"]);
|
|
5012
|
+
/**
|
|
5013
|
+
* The default: report what makes a rendition unplayable *to this engine* — a
|
|
5014
|
+
* container MSE can't accept, or encryption with no decryption pipeline. Both
|
|
5015
|
+
* mirror what `canPlayTrack` prunes on, so a reported cause always has a
|
|
5016
|
+
* corresponding exclusion.
|
|
5017
|
+
*
|
|
5018
|
+
* A condition carries its code and its context, not copy. `data.mimeType` is
|
|
5019
|
+
* what preserves the specificity — the format codes cover every non-fMP4
|
|
5020
|
+
* container, so "which one" lives there for a consumer that wants to say, rather
|
|
5021
|
+
* than being flattened into an English sentence here.
|
|
5022
|
+
*
|
|
5023
|
+
* Both carry `trackType`, redundantly for the format codes (1004/1005 are
|
|
5024
|
+
* already per type) but not for 4008, which isn't per type — SVTA has one
|
|
5025
|
+
* content-protection code for both. Nothing branches on the tag: it's diagnostic
|
|
5026
|
+
* context, reaching a developer through the logged sequence and `error.data`,
|
|
5027
|
+
* which is why it goes on every condition rather than only where the code can't
|
|
5028
|
+
* carry it. `trackId` alongside it is what distinguishes two renditions of the
|
|
5029
|
+
* same type.
|
|
5030
|
+
*/
|
|
5031
|
+
function reportUnsupportedTrackConditions(track) {
|
|
5032
|
+
if (!CAPABILITY_PRUNED_TYPES.has(track.type)) return [];
|
|
5033
|
+
const conditions = [];
|
|
5034
|
+
const data = {
|
|
5035
|
+
trackType: track.type,
|
|
5036
|
+
trackId: track.id
|
|
5037
|
+
};
|
|
5038
|
+
const formatCode = UNSUPPORTED_FORMAT_CODE[track.type];
|
|
5039
|
+
if (formatCode !== void 0 && NON_FMP4_CONTAINER_MIMES.has(track.mimeType)) conditions.push({
|
|
5040
|
+
code: formatCode,
|
|
5041
|
+
data: {
|
|
5042
|
+
...data,
|
|
5043
|
+
mimeType: track.mimeType
|
|
5044
|
+
}
|
|
5045
|
+
});
|
|
5046
|
+
if (getMediaPlaylistMetadata(track)?.encrypted) conditions.push({
|
|
5047
|
+
code: SVTA_UNSUPPORTED_DRM_SYSTEM,
|
|
5048
|
+
data
|
|
5049
|
+
});
|
|
5050
|
+
return conditions;
|
|
5051
|
+
}
|
|
5052
|
+
|
|
5053
|
+
//#endregion
|
|
5054
|
+
//#region ../spf/dist/dev/playback/primitives/error-messages.js
|
|
5055
|
+
/**
|
|
5056
|
+
* Developer-facing copy for what this engine reports.
|
|
5057
|
+
*
|
|
5058
|
+
* Everything here reaches a **console**, never a viewer. Viewer-facing copy for
|
|
5059
|
+
* a fatal condition is the presentation layer's to compose: the engine reports a
|
|
5060
|
+
* code, and a consumer maps that code to localized text it owns.
|
|
5061
|
+
*
|
|
5062
|
+
* Plain string constants, one export each. Nothing is parameterized — a message
|
|
5063
|
+
* that names the engine has to be built at the call site from state the engine
|
|
5064
|
+
* carries around solely to say it, which is a lot of plumbing for a console
|
|
5065
|
+
* prefix. Separate exports rather than one object so a composition that logs
|
|
5066
|
+
* neither notice doesn't carry their bytes.
|
|
5067
|
+
*/
|
|
5068
|
+
/**
|
|
5069
|
+
* Logged when a fatal `SVTA_UNSUPPORTED_PLAYBACK_FEATURE` is surfaced.
|
|
5070
|
+
*
|
|
5071
|
+
* The developer's half of that event; the viewer gets the localized copy the
|
|
5072
|
+
* code maps to. One sentence is enough because the specifics — which container,
|
|
5073
|
+
* which rendition, whether it was DRM — stay structured on the reported
|
|
5074
|
+
* conditions logged beside it.
|
|
5075
|
+
*/
|
|
5076
|
+
const UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE = "Can't play this source: it requires an unsupported playback feature.";
|
|
5077
|
+
/**
|
|
5078
|
+
* Logged for **any** fatal condition, by a composition whose failures don't all
|
|
5079
|
+
* reduce to a missing feature.
|
|
5080
|
+
*
|
|
5081
|
+
* The background variant is the case: it treats a per-rendition cause as fatal on
|
|
5082
|
+
* its own, so what reaches its surface can be an unsupported container, DRM it
|
|
5083
|
+
* can't decrypt, or a source carrying no video at all. Naming one feature would be
|
|
5084
|
+
* wrong for the last of those, so all three are named broadly. Deferring the *why*
|
|
5085
|
+
* to the conditions instead would promise prose they don't carry — an `SvtaError`
|
|
5086
|
+
* is a code and its context, and nothing on this path sets `message`.
|
|
5087
|
+
*/
|
|
5088
|
+
const UNPLAYABLE_SOURCE_MESSAGE = "Can't play this source — unsupported container, encryption, or no usable video track.";
|
|
5089
|
+
/**
|
|
5090
|
+
* LL-HLS delivery, played as standard live. The parser ignores partial segments
|
|
5091
|
+
* and the loader fetches whole ones, so latency lands wherever `HOLD-BACK` puts
|
|
5092
|
+
* it — the stream plays, just not at the latency it was published for.
|
|
5093
|
+
*/
|
|
5094
|
+
const LOW_LATENCY_UNSUPPORTED_MESSAGE = "Low-Latency HLS is unsupported; playing as standard live at higher latency.";
|
|
5095
|
+
/**
|
|
5096
|
+
* `#EXT-X-PLAYLIST-TYPE:EVENT` — a growing window, which is how DVR is
|
|
5097
|
+
* delivered. It plays, but the seekable-range and live-edge handling for it is
|
|
5098
|
+
* newer and less exercised than sliding-window live.
|
|
5099
|
+
*/
|
|
5100
|
+
const DVR_EXPERIMENTAL_MESSAGE = "DVR support for EVENT playlists is experimental.";
|
|
5101
|
+
|
|
5102
|
+
//#endregion
|
|
5103
|
+
//#region ../spf/dist/dev/playback/adapters/hls-video/error-surface.js
|
|
5104
|
+
/**
|
|
5105
|
+
* `message`, plus the alternative-Media sentence when `media`'s class names one.
|
|
5106
|
+
*
|
|
5107
|
+
* Read off the class rather than passed in so a subclass can point at a
|
|
5108
|
+
* better-equipped sibling — the SPF Mux Medias name the hls.js-backed one, which
|
|
5109
|
+
* plays the MPEG-TS and DRM sources SPF doesn't — without either adapter knowing
|
|
5110
|
+
* that sibling exists.
|
|
5111
|
+
*/
|
|
5112
|
+
function withAlternativeMediaSuggestion(message, media) {
|
|
5113
|
+
const { alternativeMediaSuggestion } = media.constructor;
|
|
5114
|
+
const suggestion = alternativeMediaSuggestion?.trim();
|
|
5115
|
+
return suggestion ? `${message} ${suggestion}` : message;
|
|
5116
|
+
}
|
|
5117
|
+
/** The first condition `fatalCodes` covers — the root cause, not its consequences. */
|
|
5118
|
+
function firstFatal(errors, fatalCodes) {
|
|
5119
|
+
return errors?.find((error) => fatalCodes.has(error.code));
|
|
5120
|
+
}
|
|
5121
|
+
/**
|
|
5122
|
+
* The causes that mean the engine has no pipeline for what the source delivers —
|
|
5123
|
+
* a container it can't append, or encryption it can't decrypt.
|
|
5124
|
+
*
|
|
5125
|
+
* What these have in common is that no retry, no other CDN, and no other
|
|
5126
|
+
* rendition of the same source fixes them: the source needs a capability this
|
|
5127
|
+
* engine doesn't have. That's the distinction the surfaced code exists to draw,
|
|
5128
|
+
* and it's why the set is these three rather than "every cause".
|
|
5129
|
+
*/
|
|
5130
|
+
const UNSUPPORTED_FEATURE_CAUSES = /* @__PURE__ */ new Set([
|
|
5131
|
+
SVTA_UNSUPPORTED_VIDEO_FORMAT,
|
|
5132
|
+
SVTA_UNSUPPORTED_AUDIO_FORMAT,
|
|
5133
|
+
SVTA_UNSUPPORTED_DRM_SYSTEM
|
|
5134
|
+
]);
|
|
5135
|
+
/**
|
|
5136
|
+
* Whether anything in the sequence is a cause of the "we don't implement this"
|
|
5137
|
+
* kind.
|
|
5138
|
+
*
|
|
5139
|
+
* Deliberately `some` over the whole sequence rather than a per-type match
|
|
5140
|
+
* against the verdict. A verdict means one type's candidates emptied, but the
|
|
5141
|
+
* *reason* the source is unplayable can sit on another type — an audio-only
|
|
5142
|
+
* source whose sole rendition is encrypted empties the audio candidates, and a
|
|
5143
|
+
* video source with encrypted video empties the video ones. Both are the same
|
|
5144
|
+
* answer to the viewer, so both get the same code.
|
|
5145
|
+
*/
|
|
5146
|
+
function hasUnsupportedFeatureCause(errors) {
|
|
5147
|
+
return errors?.some((error) => UNSUPPORTED_FEATURE_CAUSES.has(error.code)) ?? false;
|
|
5148
|
+
}
|
|
5149
|
+
|
|
5150
|
+
//#endregion
|
|
5151
|
+
export { getTracksByType as $, SerialRunner as A, reportAbsentTrackType as B, updateMediaSourceDuration as C, dispatchStep as D, setupVideoBufferActors as E, getMinBufferedEnd as F, attachMediaSourceAsSourceElement as G, getResolvedSelectedTrackDuration as H, getCdnId as I, loadTextTrackSegments as J, trackCurrentTime as K, getOrderedCdnIds as L, DEFAULT_BANDWIDTH_CONFIG as M, getBandwidthEstimate as N, fetchStep as O, endOfStream as P, findTrackById as Q, collectErrors as R, isStandardPreload as S, setupAudioBufferActors as T, parseMultivariantPlaylist as U, calculatePresentationDuration as V, canPlayTrack as W, AUDIO_TYPE_CONFIG as X, loadVideoSegments as Y, VIDEO_TYPE_CONFIG as Z, tracksUnderPixelArea as _, SVTA_UNSUPPORTED_DRM_SYSTEM as _t, LOW_LATENCY_UNSUPPORTED_MESSAGE as a, isResolvedTrack as at, resolveVideoTrack as b, effect as bt, reportUnsupportedTrackConditions as c, makeShareSignals as ct, excludeUnplayableTracks as d, computed as dt, DEFAULT_FORWARD_BUFFER_CONFIG as et, sameCandidateSet as f, peek as ft, pickTextTrackFromTracks as g, SVTA_NO_SUPPORTED_VIDEO_TRACK as gt, pickAudioTrackFromTracks as h, SVTA_NO_SUPPORTED_AUDIO_TRACK as ht, DVR_EXPERIMENTAL_MESSAGE as i, isResolvedPresentation as it, Task as j, createMachineActor as k, applyConstraints as l, createComposition as lt, matchesPartialTrack as m, update as mt, hasUnsupportedFeatureCause as n, deriveStreamType as nt, UNPLAYABLE_SOURCE_MESSAGE as o, createMachineReactor as ot, byDescendingResolution as p, untrack as pt, loadAudioSegments as q, withAlternativeMediaSuggestion as r, getMediaPlaylistMetadata as rt, UNSUPPORTED_PLAYBACK_FEATURE_MESSAGE as s, createMachineCore as st, firstFatal as t, getSegmentsToLoad as tt, applyRules as u, defineBehavior as ut, resolveAudioTrack as v, SVTA_UNSUPPORTED_PLAYBACK_FEATURE as vt, setupMediaSource as w, resolvePresentation as x, resolveTextTrack as y, SVTA_UNSUPPORTED_VIDEO_FORMAT as yt, emitError as z };
|
|
5152
|
+
//# sourceMappingURL=error-surface-D0bo71gD.js.map
|