@amazon/vinyl 3.0.1 → 3.2.0
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/dist/index.cjs +1103 -1042
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +810 -739
- package/dist/index.js.map +4 -4
- package/dist/test/benchmark.js.map +2 -2
- package/dist/test/integ.es5.js +394 -388
- package/dist/test/integ.js +2626 -2032
- package/dist/test/integ.js.map +4 -4
- package/dist/test/jasmine.css +50 -3
- package/dist/test/jasmineHtml.es5.js +195 -155
- package/dist/test/jasmineHtml.js +2938 -1833
- package/dist/test/jasmineHtml.js.map +3 -3
- package/dist/types/current/ad/AdControllerImpl.d.ts.map +1 -1
- package/dist/types/current/ad/AdControllerImpl.js +4 -1
- package/dist/types/current/ad/discoverHlsInterstitials.d.ts.map +1 -1
- package/dist/types/current/ad/discoverHlsInterstitials.js +2 -2
- package/dist/types/current/drm/DrmControllerImpl.d.ts +19 -1
- package/dist/types/current/drm/DrmControllerImpl.d.ts.map +1 -1
- package/dist/types/current/drm/DrmControllerImpl.js +101 -58
- package/dist/types/current/drm/licenseProvider/defaultLicenseProvider.d.ts.map +1 -1
- package/dist/types/current/drm/licenseProvider/defaultLicenseProvider.js +2 -2
- package/dist/types/current/index.d.ts +3 -6
- package/dist/types/current/index.d.ts.map +1 -1
- package/dist/types/current/index.js +3 -6
- package/dist/types/current/playback/PlaybackControllerImpl.d.ts +15 -0
- package/dist/types/current/playback/PlaybackControllerImpl.d.ts.map +1 -1
- package/dist/types/current/playback/PlaybackControllerImpl.js +100 -9
- package/dist/types/current/playback/ReadonlyPlaybackController.d.ts +27 -1
- package/dist/types/current/playback/ReadonlyPlaybackController.d.ts.map +1 -1
- package/dist/types/current/playback/ReadonlyPlaybackController.js +16 -0
- package/dist/types/current/playback/createStallDetector.d.ts +43 -0
- package/dist/types/current/playback/createStallDetector.d.ts.map +1 -0
- package/dist/types/current/playback/createStallDetector.js +101 -0
- package/dist/types/current/playback/createStallMonitor.d.ts +45 -0
- package/dist/types/current/playback/createStallMonitor.d.ts.map +1 -0
- package/dist/types/current/playback/createStallMonitor.js +94 -0
- package/dist/types/current/streaming/AudioOptions.d.ts +27 -0
- package/dist/types/current/streaming/AudioOptions.d.ts.map +1 -1
- package/dist/types/current/streaming/AudioOptions.js +5 -1
- package/dist/types/current/streaming/ContentStream.d.ts +0 -5
- package/dist/types/current/streaming/ContentStream.d.ts.map +1 -1
- package/dist/types/current/streaming/ContentStream.js +0 -4
- package/dist/types/current/streaming/LoadMetric.d.ts +15 -1
- package/dist/types/current/streaming/LoadMetric.d.ts.map +1 -1
- package/dist/types/current/streaming/StreamingEventMap.d.ts +1 -5
- package/dist/types/current/streaming/StreamingEventMap.d.ts.map +1 -1
- package/dist/types/current/streaming/StreamingEventMap.js +0 -1
- package/dist/types/current/streaming/buffering/BufferingController.d.ts +0 -11
- package/dist/types/current/streaming/buffering/BufferingController.d.ts.map +1 -1
- package/dist/types/current/streaming/buffering/BufferingController.js +0 -13
- package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.d.ts.map +1 -1
- package/dist/types/current/streaming/createDefaultMediaTimelineTransformer.js +13 -4
- package/dist/types/current/streaming/mediaTimelineFilter.d.ts +4 -2
- package/dist/types/current/streaming/mediaTimelineFilter.d.ts.map +1 -1
- package/dist/types/current/streaming/mediaTimelineFilter.js +23 -8
- package/dist/types/current/text/SidecarTextTrackLoader.d.ts.map +1 -1
- package/dist/types/current/text/SidecarTextTrackLoader.js +4 -4
- package/dist/types/current/text/TextTrack.d.ts.map +1 -1
- package/dist/types/current/track/TrackController.d.ts.map +1 -1
- package/dist/types/current/track/TrackController.js +8 -2
- package/dist/types/current/track/createSegmentDataProvider.d.ts.map +1 -1
- package/dist/types/current/track/createSegmentDataProvider.js +6 -3
- package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.d.ts +10 -6
- package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.d.ts.map +1 -1
- package/dist/types/current/track/dash/DashMediaQualityMetadataResolver.js +13 -8
- package/dist/types/current/track/dash/createDashFactories.d.ts +1 -1
- package/dist/types/current/track/dash/timeline/DashRepresentationSegmentProvider.d.ts.map +1 -1
- package/dist/types/current/track/dash/timeline/DashRepresentationSegmentProvider.js +71 -3
- package/dist/types/current/track/dash/urlDashManifestProvider.js +2 -2
- package/dist/types/current/track/dash/util/mpd.d.ts +6 -0
- package/dist/types/current/track/dash/util/mpd.d.ts.map +1 -1
- package/dist/types/current/track/dash/util/mpd.js +24 -3
- package/dist/types/current/track/filters/resourceTypeFilter.d.ts +4 -0
- package/dist/types/current/track/filters/resourceTypeFilter.d.ts.map +1 -1
- package/dist/types/current/track/filters/resourceTypeFilter.js +4 -0
- package/dist/types/current/track/filters/sampleRateFilter.d.ts +25 -7
- package/dist/types/current/track/filters/sampleRateFilter.d.ts.map +1 -1
- package/dist/types/current/track/filters/sampleRateFilter.js +52 -24
- package/dist/types/current/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/current/track/hls/createUrlHlsManifestProvider.d.ts.map +1 -1
- package/dist/types/current/track/hls/createUrlHlsManifestProvider.js +3 -3
- package/dist/types/current/track/mse/MseTrack.d.ts +0 -17
- package/dist/types/current/track/mse/MseTrack.d.ts.map +1 -1
- package/dist/types/current/track/mse/MseTrack.js +1 -45
- package/dist/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/types/current/util/media/mimeType.d.ts +8 -0
- package/dist/types/current/util/media/mimeType.d.ts.map +1 -0
- package/dist/types/current/util/media/mimeType.js +13 -0
- package/dist/types/current/vinyl/VinylPlayer.d.ts +5 -0
- package/dist/types/current/vinyl/VinylPlayer.d.ts.map +1 -1
- package/dist/types/current/vinyl/VinylPlayer.js +23 -1
- package/dist/types/current/vinyl/createVinylFactories.d.ts +7 -16
- package/dist/types/current/vinyl/createVinylFactories.d.ts.map +1 -1
- package/dist/types/current/vinyl/createVinylFactories.js +2 -12
- package/dist/types/ts3.7/drm/DrmControllerImpl.d.ts +19 -1
- package/dist/types/ts3.7/index.d.ts +3 -6
- package/dist/types/ts3.7/playback/PlaybackControllerImpl.d.ts +15 -0
- package/dist/types/ts3.7/playback/ReadonlyPlaybackController.d.ts +28 -0
- package/dist/types/ts3.7/playback/createStallDetector.d.ts +43 -0
- package/dist/types/ts3.7/playback/createStallMonitor.d.ts +45 -0
- package/dist/types/ts3.7/streaming/AudioOptions.d.ts +27 -0
- package/dist/types/ts3.7/streaming/ContentStream.d.ts +0 -5
- package/dist/types/ts3.7/streaming/LoadMetric.d.ts +15 -1
- package/dist/types/ts3.7/streaming/StreamingEventMap.d.ts +0 -5
- package/dist/types/ts3.7/streaming/buffering/BufferingController.d.ts +0 -11
- package/dist/types/ts3.7/streaming/mediaTimelineFilter.d.ts +4 -2
- package/dist/types/ts3.7/track/dash/DashMediaQualityMetadataResolver.d.ts +10 -6
- package/dist/types/ts3.7/track/dash/createDashFactories.d.ts +1 -1
- package/dist/types/ts3.7/track/dash/util/mpd.d.ts +6 -0
- package/dist/types/ts3.7/track/filters/resourceTypeFilter.d.ts +4 -0
- package/dist/types/ts3.7/track/filters/sampleRateFilter.d.ts +25 -7
- package/dist/types/ts3.7/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/ts3.7/track/mse/MseTrack.d.ts +0 -17
- package/dist/types/ts3.7/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts3.7/vinyl/VinylPlayer.d.ts +5 -0
- package/dist/types/ts3.7/vinyl/createVinylFactories.d.ts +7 -16
- package/dist/types/ts4.1/drm/DrmControllerImpl.d.ts +19 -1
- package/dist/types/ts4.1/index.d.ts +3 -6
- package/dist/types/ts4.1/playback/PlaybackControllerImpl.d.ts +15 -0
- package/dist/types/ts4.1/playback/ReadonlyPlaybackController.d.ts +28 -0
- package/dist/types/ts4.1/playback/createStallDetector.d.ts +43 -0
- package/dist/types/ts4.1/playback/createStallMonitor.d.ts +45 -0
- package/dist/types/ts4.1/streaming/AudioOptions.d.ts +27 -0
- package/dist/types/ts4.1/streaming/ContentStream.d.ts +0 -5
- package/dist/types/ts4.1/streaming/LoadMetric.d.ts +15 -1
- package/dist/types/ts4.1/streaming/StreamingEventMap.d.ts +0 -5
- package/dist/types/ts4.1/streaming/buffering/BufferingController.d.ts +0 -11
- package/dist/types/ts4.1/streaming/mediaTimelineFilter.d.ts +4 -2
- package/dist/types/ts4.1/track/dash/DashMediaQualityMetadataResolver.d.ts +10 -6
- package/dist/types/ts4.1/track/dash/createDashFactories.d.ts +1 -1
- package/dist/types/ts4.1/track/dash/util/mpd.d.ts +6 -0
- package/dist/types/ts4.1/track/filters/resourceTypeFilter.d.ts +4 -0
- package/dist/types/ts4.1/track/filters/sampleRateFilter.d.ts +25 -7
- package/dist/types/ts4.1/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/ts4.1/track/mse/MseTrack.d.ts +0 -17
- package/dist/types/ts4.1/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts4.1/vinyl/VinylPlayer.d.ts +5 -0
- package/dist/types/ts4.1/vinyl/createVinylFactories.d.ts +7 -16
- package/dist/types/ts4.7/drm/DrmControllerImpl.d.ts +19 -1
- package/dist/types/ts4.7/index.d.ts +3 -6
- package/dist/types/ts4.7/playback/PlaybackControllerImpl.d.ts +15 -0
- package/dist/types/ts4.7/playback/ReadonlyPlaybackController.d.ts +28 -0
- package/dist/types/ts4.7/playback/createStallDetector.d.ts +43 -0
- package/dist/types/ts4.7/playback/createStallMonitor.d.ts +45 -0
- package/dist/types/ts4.7/streaming/AudioOptions.d.ts +27 -0
- package/dist/types/ts4.7/streaming/ContentStream.d.ts +0 -5
- package/dist/types/ts4.7/streaming/LoadMetric.d.ts +15 -1
- package/dist/types/ts4.7/streaming/StreamingEventMap.d.ts +0 -5
- package/dist/types/ts4.7/streaming/buffering/BufferingController.d.ts +0 -11
- package/dist/types/ts4.7/streaming/mediaTimelineFilter.d.ts +4 -2
- package/dist/types/ts4.7/track/dash/DashMediaQualityMetadataResolver.d.ts +10 -6
- package/dist/types/ts4.7/track/dash/createDashFactories.d.ts +1 -1
- package/dist/types/ts4.7/track/dash/util/mpd.d.ts +6 -0
- package/dist/types/ts4.7/track/filters/resourceTypeFilter.d.ts +4 -0
- package/dist/types/ts4.7/track/filters/sampleRateFilter.d.ts +25 -7
- package/dist/types/ts4.7/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/ts4.7/track/mse/MseTrack.d.ts +0 -17
- package/dist/types/ts4.7/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts4.7/vinyl/VinylPlayer.d.ts +5 -0
- package/dist/types/ts4.7/vinyl/createVinylFactories.d.ts +7 -16
- package/dist/unit/types/current/ad/AdControllerImpl.test.js +27 -1
- package/dist/unit/types/current/drm/DrmControllerImpl.test.js +146 -9
- package/dist/unit/types/current/index.d.ts +3 -4
- package/dist/unit/types/current/index.d.ts.map +1 -1
- package/dist/unit/types/current/index.js +3 -4
- package/dist/unit/types/current/playback/PlaybackControllerImpl.test.js +165 -0
- package/dist/unit/types/current/playback/createStallDetector.test.d.ts +2 -0
- package/dist/unit/types/current/playback/createStallDetector.test.d.ts.map +1 -0
- package/dist/unit/types/current/playback/createStallDetector.test.js +163 -0
- package/dist/unit/types/current/playback/createStallMonitor.test.d.ts +2 -0
- package/dist/unit/types/current/playback/createStallMonitor.test.d.ts.map +1 -0
- package/dist/unit/types/current/playback/createStallMonitor.test.js +125 -0
- package/dist/unit/types/current/streaming/ContentStream.test.js +0 -11
- package/dist/unit/types/current/streaming/MseTrack.test.js +49 -73
- package/dist/unit/types/current/streaming/abr/QualitySelectorImpl.test.js +1 -1
- package/dist/unit/types/current/streaming/buffering/BufferingController.test.js +0 -21
- package/dist/unit/types/current/streaming/createDefaultMediaTimelineTransformer.test.js +133 -0
- package/dist/unit/types/current/streaming/mediaTimelineFilter.test.js +60 -54
- package/dist/unit/types/current/track/TrackController.test.js +61 -1
- package/dist/unit/types/current/track/createSegmentDataProvider.test.js +18 -0
- package/dist/unit/types/current/track/dash/DashMediaQualityMetadataResolver.test.js +46 -14
- package/dist/unit/types/current/track/dash/createSegmentControllerFactory.test.js +1 -0
- package/dist/unit/types/current/track/dash/timeline/DashRepresentationSegmentProvider.test.js +114 -0
- package/dist/unit/types/current/track/dash/util/mpd.test.js +37 -0
- package/dist/unit/types/current/track/filters/resourceTypeFilter.test.js +7 -0
- package/dist/unit/types/current/track/filters/sampleRateFilter.test.js +211 -34
- package/dist/unit/types/current/track/source/SourceObjectTrack.test.js +1 -1
- package/dist/unit/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/unit/types/current/util/media/mimeType.test.d.ts +2 -0
- package/dist/unit/types/current/util/media/mimeType.test.d.ts.map +1 -0
- package/dist/unit/types/current/util/media/mimeType.test.js +22 -0
- package/dist/unit/types/current/vinyl/VinylPlayer.test.js +33 -2
- package/dist/unit/types/current/vinyl/createVinylFactories.test.js +2 -36
- package/dist/vinylTestUtil/index.js +6 -4
- package/dist/vinylTestUtil/index.js.map +2 -2
- package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.d.ts +1 -0
- package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/assets/vinylTestAssets.js +1 -0
- package/dist/vinylTestUtil/types/current/media/FrequencyAnalyzer.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/MockContentStream.d.ts +0 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/MockContentStream.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/MockContentStream.js +0 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockBufferingController.d.ts +0 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockBufferingController.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/mock/streaming/buffering/MockBufferingController.js +0 -1
- package/dist/vinylTestUtil/types/current/tsconfig.tsbuildinfo +1 -1
- package/dist/vinylTestUtil/types/current/util/playback/eventPromises.js +1 -1
- package/dist/vinylTestUtil/types/current/util/playback/expectTrackCanSeek.d.ts.map +1 -1
- package/dist/vinylTestUtil/types/current/util/playback/expectTrackCanSeek.js +9 -1
- package/dist/vinylTestUtil/types/ts3.7/assets/vinylTestAssets.d.ts +1 -0
- package/dist/vinylTestUtil/types/ts3.7/mock/streaming/MockContentStream.d.ts +0 -1
- package/dist/vinylTestUtil/types/ts3.7/mock/streaming/buffering/MockBufferingController.d.ts +0 -1
- package/dist/vinylTestUtil/types/ts4.1/assets/vinylTestAssets.d.ts +1 -0
- package/dist/vinylTestUtil/types/ts4.1/mock/streaming/MockContentStream.d.ts +0 -1
- package/dist/vinylTestUtil/types/ts4.1/mock/streaming/buffering/MockBufferingController.d.ts +0 -1
- package/dist/vinylTestUtil/types/ts4.7/assets/vinylTestAssets.d.ts +1 -0
- package/dist/vinylTestUtil/types/ts4.7/mock/streaming/MockContentStream.d.ts +0 -1
- package/dist/vinylTestUtil/types/ts4.7/mock/streaming/buffering/MockBufferingController.d.ts +0 -1
- package/docs/USAGE.md +29 -0
- package/package.json +11 -10
- package/dist/types/current/patch/media/HtmlMediaElementPatch.d.ts +0 -3
- package/dist/types/current/patch/media/HtmlMediaElementPatch.d.ts.map +0 -1
- package/dist/types/current/patch/media/HtmlMediaElementPatch.js +0 -5
- package/dist/types/current/patch/media/MediaElementPatchOptions.d.ts +0 -19
- package/dist/types/current/patch/media/MediaElementPatchOptions.d.ts.map +0 -1
- package/dist/types/current/patch/media/MediaElementPatchOptions.js +0 -16
- package/dist/types/current/patch/media/patchMediaElement.d.ts +0 -9
- package/dist/types/current/patch/media/patchMediaElement.d.ts.map +0 -1
- package/dist/types/current/patch/media/patchMediaElement.js +0 -15
- package/dist/types/current/patch/media/patches/createPreventStallsPatch.d.ts +0 -17
- package/dist/types/current/patch/media/patches/createPreventStallsPatch.d.ts.map +0 -1
- package/dist/types/current/patch/media/patches/createPreventStallsPatch.js +0 -55
- package/dist/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +0 -26
- package/dist/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts.map +0 -1
- package/dist/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.js +0 -218
- package/dist/types/current/vinyl/VinylPatchOptions.d.ts +0 -10
- package/dist/types/current/vinyl/VinylPatchOptions.d.ts.map +0 -1
- package/dist/types/current/vinyl/VinylPatchOptions.js +0 -11
- package/dist/types/ts3.7/patch/media/HtmlMediaElementPatch.d.ts +0 -3
- package/dist/types/ts3.7/patch/media/MediaElementPatchOptions.d.ts +0 -19
- package/dist/types/ts3.7/patch/media/patchMediaElement.d.ts +0 -9
- package/dist/types/ts3.7/patch/media/patches/createPreventStallsPatch.d.ts +0 -17
- package/dist/types/ts3.7/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +0 -26
- package/dist/types/ts3.7/vinyl/VinylPatchOptions.d.ts +0 -10
- package/dist/types/ts4.1/patch/media/HtmlMediaElementPatch.d.ts +0 -3
- package/dist/types/ts4.1/patch/media/MediaElementPatchOptions.d.ts +0 -19
- package/dist/types/ts4.1/patch/media/patchMediaElement.d.ts +0 -9
- package/dist/types/ts4.1/patch/media/patches/createPreventStallsPatch.d.ts +0 -17
- package/dist/types/ts4.1/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +0 -26
- package/dist/types/ts4.1/vinyl/VinylPatchOptions.d.ts +0 -10
- package/dist/types/ts4.7/patch/media/HtmlMediaElementPatch.d.ts +0 -3
- package/dist/types/ts4.7/patch/media/MediaElementPatchOptions.d.ts +0 -19
- package/dist/types/ts4.7/patch/media/patchMediaElement.d.ts +0 -9
- package/dist/types/ts4.7/patch/media/patches/createPreventStallsPatch.d.ts +0 -17
- package/dist/types/ts4.7/patch/media/patches/createUnreliablePlaybackEventsPatch.d.ts +0 -26
- package/dist/types/ts4.7/vinyl/VinylPatchOptions.d.ts +0 -10
- package/dist/unit/types/current/patch/media/MediaElementPatchOptions.test.d.ts +0 -2
- package/dist/unit/types/current/patch/media/MediaElementPatchOptions.test.d.ts.map +0 -1
- package/dist/unit/types/current/patch/media/MediaElementPatchOptions.test.js +0 -17
- package/dist/unit/types/current/patch/media/patchMediaElement.test.d.ts +0 -2
- package/dist/unit/types/current/patch/media/patchMediaElement.test.d.ts.map +0 -1
- package/dist/unit/types/current/patch/media/patchMediaElement.test.js +0 -36
- package/dist/unit/types/current/patch/media/patches/createPreventStallsPatch.test.d.ts +0 -2
- package/dist/unit/types/current/patch/media/patches/createPreventStallsPatch.test.d.ts.map +0 -1
- package/dist/unit/types/current/patch/media/patches/createPreventStallsPatch.test.js +0 -93
- package/dist/unit/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.test.d.ts +0 -2
- package/dist/unit/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.test.d.ts.map +0 -1
- package/dist/unit/types/current/patch/media/patches/createUnreliablePlaybackEventsPatch.test.js +0 -423
|
@@ -107,7 +107,7 @@ export declare function createDashFactories(options: Maybe<DashInitOptions>): (d
|
|
|
107
107
|
readonly manifestTransformed: ObservableValue<Promise<DashManifestData>>;
|
|
108
108
|
readonly options: ObservableValue<Pick<VinylOptions, "text">>;
|
|
109
109
|
}) => SidecarTextTrackController;
|
|
110
|
-
options: import("@amazon/vinyl-di").Factory<ObservableValue<Pick<VinylOptions, "
|
|
110
|
+
options: import("@amazon/vinyl-di").Factory<ObservableValue<Pick<VinylOptions, "text" | "audio" | "abr" | "allowedContentTypes">>>;
|
|
111
111
|
playbackController: import("@amazon/vinyl-di").Factory<PlaybackController>;
|
|
112
112
|
playbackSource: import("@amazon/vinyl-di").Factory<PlaybackSource>;
|
|
113
113
|
drmKeySystemResolver: import("@amazon/vinyl-di").Factory<DrmKeySystemResolver>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashRepresentationSegmentProvider.d.ts","sourceRoot":"","sources":["../../../../../../src/track/dash/timeline/DashRepresentationSegmentProvider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DashRepresentationSegmentProvider.d.ts","sourceRoot":"","sources":["../../../../../../src/track/dash/timeline/DashRepresentationSegmentProvider.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAGR,kBAAkB,EAKrB,MAAM,0BAA0B,CAAA;AASjC,OAAO,EACH,KAAK,kBAAkB,EAG1B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAEH,KAAK,6BAA6B,EACrC,MAAM,iCAAiC,CAAA;AAGxC,OAAO,KAAK,EAER,gBAAgB,EACnB,MAAM,qCAAqC,CAAA;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAA;AAE7E,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAA;AAE3F,MAAM,WAAW,uBACb,SAAQ,kBAAkB,EAAE,6BAA6B;IACzD;;OAEG;IACH,QAAQ,CAAC,4BAA4B,EAAE,gCAAgC,CAAA;CAC1E;AAED,MAAM,WAAW,iCAAiC;IAC9C;;;;;;OAMG;IACH,UAAU,CACN,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC,CAAA;CAC3D;AAaD;;GAEG;AACH,wBAAgB,uCAAuC,CACnD,IAAI,EAAE,uBAAuB,EAC7B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,kBAAkB,GACnC,iCAAiC,CAoHnC"}
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
|
-
import { ErrorOrigin, getSidxSampleTimes, parseSidxBox, ValidationError, } from '@amazon/vinyl-util';
|
|
5
|
+
import { ErrorOrigin, getSidxSampleTimes, parseSidxBox, parseWebmCues, parseWebmInit, ValidationError, } from '@amazon/vinyl-util';
|
|
6
6
|
import { calculatePeriodTimeRange, getSegmentBase, getSegmentList, getSegmentTemplate, sampleToMpdTime, } from '../util/mpd';
|
|
7
7
|
import { resolveDashUri, segmentTemplateUrl, } from '../util/uriResolution';
|
|
8
8
|
import { createSegmentDataProvider, } from '../../createSegmentDataProvider';
|
|
9
|
+
import { getRepresentationMimeInfo } from '../util/mimeType';
|
|
9
10
|
import { getSegmentAtTime } from '../../../streaming/util/segment';
|
|
10
11
|
/**
|
|
11
12
|
* Creates a representation timeline for the given representation.
|
|
@@ -72,7 +73,7 @@ export function createDashRepresentationSegmentProvider(deps, baseUrl, represent
|
|
|
72
73
|
getSegmentReferences = () => createSegmentsFromSegmentBase(deps, {
|
|
73
74
|
...options,
|
|
74
75
|
segmentBase,
|
|
75
|
-
});
|
|
76
|
+
}, initData);
|
|
76
77
|
}
|
|
77
78
|
return {
|
|
78
79
|
async getSegment(time, affordance = 0) {
|
|
@@ -183,9 +184,15 @@ function createSegmentsFromSegmentTemplate(deps, options) {
|
|
|
183
184
|
/**
|
|
184
185
|
* When SegmentBase is provided, get the timeline from the index range.
|
|
185
186
|
*/
|
|
186
|
-
async function createSegmentsFromSegmentBase(deps, options) {
|
|
187
|
+
async function createSegmentsFromSegmentBase(deps, options, initData) {
|
|
187
188
|
const { baseUrl, periodTimeRange, representation, segmentBase } = options;
|
|
188
189
|
if (segmentBase.indexRange) {
|
|
190
|
+
// WebM indexes segments with an EBML `Cues` element, not an ISO-BMFF
|
|
191
|
+
// `sidx` box, so it needs a different reader.
|
|
192
|
+
const { mimeType } = getRepresentationMimeInfo(representation);
|
|
193
|
+
if (mimeType?.includes('webm')) {
|
|
194
|
+
return createSegmentsFromWebmCues(deps, options, initData);
|
|
195
|
+
}
|
|
189
196
|
// Load the sidx box from the mp4.
|
|
190
197
|
const indexRange = segmentBase.indexRange;
|
|
191
198
|
const { url: indexUrl, serviceLocation: indexServiceLocation } = resolveDashUri(deps, { baseUrl, representation });
|
|
@@ -219,6 +226,67 @@ async function createSegmentsFromSegmentBase(deps, options) {
|
|
|
219
226
|
throw new ValidationError('Manifest missing segments');
|
|
220
227
|
}
|
|
221
228
|
}
|
|
229
|
+
/**
|
|
230
|
+
* When SegmentBase is provided for a WebM stream, build the timeline from the
|
|
231
|
+
* EBML `Cues` element (the WebM analog of a `sidx`). Cue times are in the
|
|
232
|
+
* container's `TimecodeScale` ticks (from the init segment), and each cue's
|
|
233
|
+
* `CueClusterPosition` is a byte offset relative to the `Segment` data start.
|
|
234
|
+
*/
|
|
235
|
+
async function createSegmentsFromWebmCues(deps, options, initData) {
|
|
236
|
+
const { baseUrl, periodTimeRange, representation, segmentBase } = options;
|
|
237
|
+
const indexRange = segmentBase.indexRange;
|
|
238
|
+
const { url, serviceLocation } = resolveDashUri(deps, {
|
|
239
|
+
baseUrl,
|
|
240
|
+
representation,
|
|
241
|
+
});
|
|
242
|
+
// The init segment (fetched via `initData`, whether by range or sourceURL)
|
|
243
|
+
// carries the Segment data offset and TimecodeScale; the index range holds
|
|
244
|
+
// the Cues.
|
|
245
|
+
const [{ segmentDataStart, timecodeScale }, cues] = await Promise.all([
|
|
246
|
+
Promise.resolve(initData()).then(parseWebmInit),
|
|
247
|
+
createSegmentDataProvider(deps, {
|
|
248
|
+
url,
|
|
249
|
+
mediaRange: indexRange,
|
|
250
|
+
serviceId: serviceLocation,
|
|
251
|
+
reportDownlinkMetrics: false,
|
|
252
|
+
})().then(parseWebmCues),
|
|
253
|
+
]);
|
|
254
|
+
if (!cues.length) {
|
|
255
|
+
throw new ValidationError('WebM Cues contained no cue points');
|
|
256
|
+
}
|
|
257
|
+
// Cue times are in TimecodeScale ticks (ns per tick); express the timeline
|
|
258
|
+
// in ticks-per-second so sampleToMpdTime yields seconds.
|
|
259
|
+
const ticksPerSecond = Math.round(1e9 / timecodeScale);
|
|
260
|
+
const manifestTimescale = segmentBase.timescale ?? ticksPerSecond;
|
|
261
|
+
const presentationTimeOffset = ((segmentBase.presentationTimeOffset ?? 0) * ticksPerSecond) /
|
|
262
|
+
manifestTimescale;
|
|
263
|
+
// The final sample time is the last segment's end. WebM Cues don't carry
|
|
264
|
+
// it, so it comes from the period end (which VOD always defines).
|
|
265
|
+
const [, periodEnd] = periodTimeRange;
|
|
266
|
+
if (periodEnd == null)
|
|
267
|
+
throw new ValidationError('MPD.mediaPresentationDuration or Period.duration required', ErrorOrigin.MEDIA);
|
|
268
|
+
const sampleTimes = cues.map((cue) => cue.time);
|
|
269
|
+
sampleTimes.push(periodEnd * ticksPerSecond);
|
|
270
|
+
return createTimeline({
|
|
271
|
+
sampleTimes,
|
|
272
|
+
periodTimeRange,
|
|
273
|
+
presentationTimeOffset,
|
|
274
|
+
timescale: ticksPerSecond,
|
|
275
|
+
}, (i) => {
|
|
276
|
+
const start = segmentDataStart + cues[i].clusterPosition;
|
|
277
|
+
// Each cluster runs to the byte before the next cue's cluster; the
|
|
278
|
+
// last runs to the end of the file (open-ended range).
|
|
279
|
+
const end = i < cues.length - 1
|
|
280
|
+
? segmentDataStart + cues[i + 1].clusterPosition - 1
|
|
281
|
+
: null;
|
|
282
|
+
return createSegmentDataProvider(deps, {
|
|
283
|
+
url,
|
|
284
|
+
mediaRange: [start, end],
|
|
285
|
+
serviceId: serviceLocation,
|
|
286
|
+
reportDownlinkMetrics: true,
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
}
|
|
222
290
|
/**
|
|
223
291
|
* Returns an array of start times, in timescale units for the segments in the given multiple segment base.
|
|
224
292
|
* The last time in the list will be the end time, in timescale units.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { noop } from '@amazon/vinyl-util';
|
|
6
6
|
import { clone, getLocation, resolveUrl } from '@amazon/vinyl-util';
|
|
7
|
-
import { requestWithRetry } from '@amazon/vinyl-util';
|
|
7
|
+
import { readResponseBody, requestWithRetry } from '@amazon/vinyl-util';
|
|
8
8
|
import { parseDashManifest } from '@amazon/vinyl-mpd-parser';
|
|
9
9
|
/**
|
|
10
10
|
* Creates a DashManifestProvider which performs a request to retrieve a dash manifest.
|
|
@@ -27,7 +27,7 @@ export function urlDashManifestProvider(input, init, requestInterceptor = noop)
|
|
|
27
27
|
const response = await requestWithRetry(params.input, params.init, {
|
|
28
28
|
abort,
|
|
29
29
|
});
|
|
30
|
-
const xml = await response
|
|
30
|
+
const xml = await readResponseBody(response, 'text');
|
|
31
31
|
const manifest = parseDashManifest(xml);
|
|
32
32
|
const baseInput = response.url || params.input;
|
|
33
33
|
return {
|
|
@@ -28,6 +28,12 @@ export declare function calculatePeriodTimeRange(period: PeriodType): PeriodRang
|
|
|
28
28
|
*
|
|
29
29
|
* In a static presentation, the first period SHALL start at the zero point of the MPD timeline (with a
|
|
30
30
|
* Period@start value of 0 seconds).
|
|
31
|
+
*
|
|
32
|
+
* When `Period@start` is absent, the start is derived from the sum of the
|
|
33
|
+
* preceding periods' `Period@duration` values, per the PeriodStart derivation
|
|
34
|
+
* in ISO/IEC 23009-1 §5.3.2.1. This is common in on-demand manifests that
|
|
35
|
+
* declare only per-period durations (no explicit `@start`, no
|
|
36
|
+
* `MPD@mediaPresentationDuration`).
|
|
31
37
|
*/
|
|
32
38
|
export declare function calculatePeriodStart(period: PeriodType): number;
|
|
33
39
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mpd.d.ts","sourceRoot":"","sources":["../../../../../../src/track/dash/util/mpd.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EAC3B,MAAM,0BAA0B,CAAA;AAKjC;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,cAAc,EAAE,kBAAkB,GACnC,eAAe,GAAG,SAAS,CAM7B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAC9B,cAAc,EAAE,kBAAkB,GACnC,mBAAmB,GAAG,SAAS,CAMjC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,cAAc,EAAE,kBAAkB,GACnC,eAAe,GAAG,SAAS,CAM7B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACrC,cAAc,EAAE,kBAAkB,GACnC,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAKvE;AAYD,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;AAE1D;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAExE;AAED
|
|
1
|
+
{"version":3,"file":"mpd.d.ts","sourceRoot":"","sources":["../../../../../../src/track/dash/util/mpd.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EAC3B,MAAM,0BAA0B,CAAA;AAKjC;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,cAAc,EAAE,kBAAkB,GACnC,eAAe,GAAG,SAAS,CAM7B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAC9B,cAAc,EAAE,kBAAkB,GACnC,mBAAmB,GAAG,SAAS,CAMjC;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC1B,cAAc,EAAE,kBAAkB,GACnC,eAAe,GAAG,SAAS,CAM7B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACrC,cAAc,EAAE,kBAAkB,GACnC,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,CAKvE;AAYD,MAAM,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;AAE1D;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,CAExE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAc/D;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAYpE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC3B,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,sBAAsB,EAAE,MAAM,EAC9B,SAAS,EAAE,MAAM,GAClB,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC3B,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,MAAM,GACb,UAAU,GAAG,IAAI,CASnB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAClC,MAAM,EAAE,UAAU,GACnB,kBAAkB,EAAE,CAQtB;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACvC,MAAM,EAAE,UAAU,GACnB,kBAAkB,EAAE,CAKtB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAahE"}
|
|
@@ -56,9 +56,27 @@ export function calculatePeriodTimeRange(period) {
|
|
|
56
56
|
*
|
|
57
57
|
* In a static presentation, the first period SHALL start at the zero point of the MPD timeline (with a
|
|
58
58
|
* Period@start value of 0 seconds).
|
|
59
|
+
*
|
|
60
|
+
* When `Period@start` is absent, the start is derived from the sum of the
|
|
61
|
+
* preceding periods' `Period@duration` values, per the PeriodStart derivation
|
|
62
|
+
* in ISO/IEC 23009-1 §5.3.2.1. This is common in on-demand manifests that
|
|
63
|
+
* declare only per-period durations (no explicit `@start`, no
|
|
64
|
+
* `MPD@mediaPresentationDuration`).
|
|
59
65
|
*/
|
|
60
66
|
export function calculatePeriodStart(period) {
|
|
61
|
-
|
|
67
|
+
if (period.start != null)
|
|
68
|
+
return period.start;
|
|
69
|
+
const mpd = period.parent;
|
|
70
|
+
const periodIndex = mpd.Period.indexOf(period);
|
|
71
|
+
if (periodIndex <= 0)
|
|
72
|
+
return 0;
|
|
73
|
+
const previous = mpd.Period[periodIndex - 1];
|
|
74
|
+
const previousStart = calculatePeriodStart(previous);
|
|
75
|
+
// The previous period's duration extends the timeline; without it the start
|
|
76
|
+
// cannot be advanced, so it inherits the previous period's start.
|
|
77
|
+
return previous.duration != null
|
|
78
|
+
? previousStart + previous.duration
|
|
79
|
+
: previousStart;
|
|
62
80
|
}
|
|
63
81
|
/**
|
|
64
82
|
* In a static presentation, the last period SHALL have a Period@duration.
|
|
@@ -71,8 +89,11 @@ export function calculatePeriodStart(period) {
|
|
|
71
89
|
* shortened by an MPD update).
|
|
72
90
|
*/
|
|
73
91
|
export function calculatePeriodEnd(period) {
|
|
74
|
-
|
|
75
|
-
|
|
92
|
+
// A period's own duration defines its end regardless of whether `@start`
|
|
93
|
+
// is explicit, since `calculatePeriodStart` derives the start from the
|
|
94
|
+
// preceding periods when `@start` is absent.
|
|
95
|
+
if (period.duration != null)
|
|
96
|
+
return calculatePeriodStart(period) + period.duration;
|
|
76
97
|
const mpd = period.parent;
|
|
77
98
|
const periodIndex = mpd.Period.indexOf(period);
|
|
78
99
|
if (periodIndex < mpd.Period.length - 1)
|
|
@@ -3,6 +3,10 @@ import type { MediaFormatMetadata } from '../../streaming/MediaQualityMetadata';
|
|
|
3
3
|
export declare function throwMimeTypesUnsupported(): never;
|
|
4
4
|
/**
|
|
5
5
|
* Returns true when the media's codec and container is supported.
|
|
6
|
+
*
|
|
7
|
+
* Both ISO-BMFF (MP4/fMP4) and WebM containers are supported: the DASH
|
|
8
|
+
* `SegmentBase` indexer reads ISO-BMFF `sidx` boxes or WebM EBML `Cues` as
|
|
9
|
+
* appropriate, and MSE appends each to a matching SourceBuffer.
|
|
6
10
|
*/
|
|
7
11
|
export declare function canPlayMimeType(deps: {
|
|
8
12
|
readonly capabilities: Capabilities;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resourceTypeFilter.d.ts","sourceRoot":"","sources":["../../../../../src/track/filters/resourceTypeFilter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA;AAG/E,wBAAgB,yBAAyB,IAAI,KAAK,CAKjD;AAED
|
|
1
|
+
{"version":3,"file":"resourceTypeFilter.d.ts","sourceRoot":"","sources":["../../../../../src/track/filters/resourceTypeFilter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA;AAG/E,wBAAgB,yBAAyB,IAAI,KAAK,CAKjD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC3B,IAAI,EAAE;IAAE,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;CAAE,EAC7C,QAAQ,EAAE,mBAAmB,GAC9B,OAAO,CAGT"}
|
|
@@ -8,6 +8,10 @@ export function throwMimeTypesUnsupported() {
|
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
10
|
* Returns true when the media's codec and container is supported.
|
|
11
|
+
*
|
|
12
|
+
* Both ISO-BMFF (MP4/fMP4) and WebM containers are supported: the DASH
|
|
13
|
+
* `SegmentBase` indexer reads ISO-BMFF `sidx` boxes or WebM EBML `Cues` as
|
|
14
|
+
* appropriate, and MSE appends each to a matching SourceBuffer.
|
|
11
15
|
*/
|
|
12
16
|
export function canPlayMimeType(deps, metadata) {
|
|
13
17
|
if (!metadata.mimeType)
|
|
@@ -1,13 +1,31 @@
|
|
|
1
1
|
import type { MediaQualityMetadata } from '../../streaming/MediaQualityMetadata';
|
|
2
2
|
import type { Capabilities } from '../../client/Capabilities';
|
|
3
3
|
export declare function throwSamplingRatesUnsupported(): never;
|
|
4
|
+
export interface AudioSampleRateRangeOptions {
|
|
5
|
+
readonly capabilities: Capabilities;
|
|
6
|
+
/**
|
|
7
|
+
* An explicit maximum sampling rate that takes precedence over the
|
|
8
|
+
* platform's `AudioContext`-reported output rate when set.
|
|
9
|
+
*/
|
|
10
|
+
readonly maxSampleRate?: number | null;
|
|
11
|
+
/** An optional minimum sampling-rate floor. */
|
|
12
|
+
readonly minSampleRate?: number | null;
|
|
13
|
+
}
|
|
4
14
|
/**
|
|
5
|
-
* Returns true when the media's sampling rate is supported.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
15
|
+
* Returns true when the media's sampling rate is within the supported range.
|
|
16
|
+
* Only audio content types are gated; every other content type passes through.
|
|
17
|
+
*
|
|
18
|
+
* The upper bound is `maxSampleRate` when set, otherwise the platform's
|
|
19
|
+
* `AudioContext`-reported output rate (Firefox is hard-capped at 48kHz, which it
|
|
20
|
+
* cannot decode beyond via MSE). The optional lower bound is `minSampleRate`.
|
|
21
|
+
* Both bounds are soft, and soft *together*: when no audio rendition sits in the
|
|
22
|
+
* acceptable `[minSampleRate, maxSampleRate]` band, a single fallback is kept so
|
|
23
|
+
* playback is never stranded — the highest rate the ceiling can decode, or, when
|
|
24
|
+
* every rate is above the ceiling, the lowest. This holds even when renditions
|
|
25
|
+
* straddle an empty band (some below the floor, some above the ceiling). Only
|
|
26
|
+
* audio renditions count toward the fallback — a co-present video quality (no
|
|
27
|
+
* audio rate) never influences it. Firefox is the exception: its 48kHz cap is
|
|
28
|
+
* hard, with no fallback.
|
|
9
29
|
*/
|
|
10
|
-
export declare function
|
|
11
|
-
readonly capabilities: Capabilities;
|
|
12
|
-
}, metadata: MediaQualityMetadata, _index: number, array: ArrayLike<MediaQualityMetadata>): boolean;
|
|
30
|
+
export declare function withinAudioSampleRateRange(options: AudioSampleRateRangeOptions, metadata: MediaQualityMetadata, _index: number, array: ArrayLike<MediaQualityMetadata>): boolean;
|
|
13
31
|
//# sourceMappingURL=sampleRateFilter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sampleRateFilter.d.ts","sourceRoot":"","sources":["../../../../../src/track/filters/sampleRateFilter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAUhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE7D,wBAAgB,6BAA6B,IAAI,KAAK,CAErD;AAED
|
|
1
|
+
{"version":3,"file":"sampleRateFilter.d.ts","sourceRoot":"","sources":["../../../../../src/track/filters/sampleRateFilter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAA;AAUhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAE7D,wBAAgB,6BAA6B,IAAI,KAAK,CAErD;AAED,MAAM,WAAW,2BAA2B;IACxC,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAA;IACnC;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtC,+CAA+C;IAC/C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,0BAA0B,CACtC,OAAO,EAAE,2BAA2B,EACpC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,CAAC,oBAAoB,CAAC,GACvC,OAAO,CAmDT"}
|
|
@@ -2,39 +2,67 @@
|
|
|
2
2
|
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
|
-
import { hasBrowser, Browser, last, MediaUnsupportedError,
|
|
5
|
+
import { hasBrowser, Browser, last, MediaUnsupportedError, map, max, min, } from '@amazon/vinyl-util';
|
|
6
6
|
export function throwSamplingRatesUnsupported() {
|
|
7
7
|
throw new MediaUnsupportedError('No supported sample rate', 'sampling-rate');
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
|
-
* Returns true when the media's sampling rate is supported.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
10
|
+
* Returns true when the media's sampling rate is within the supported range.
|
|
11
|
+
* Only audio content types are gated; every other content type passes through.
|
|
12
|
+
*
|
|
13
|
+
* The upper bound is `maxSampleRate` when set, otherwise the platform's
|
|
14
|
+
* `AudioContext`-reported output rate (Firefox is hard-capped at 48kHz, which it
|
|
15
|
+
* cannot decode beyond via MSE). The optional lower bound is `minSampleRate`.
|
|
16
|
+
* Both bounds are soft, and soft *together*: when no audio rendition sits in the
|
|
17
|
+
* acceptable `[minSampleRate, maxSampleRate]` band, a single fallback is kept so
|
|
18
|
+
* playback is never stranded — the highest rate the ceiling can decode, or, when
|
|
19
|
+
* every rate is above the ceiling, the lowest. This holds even when renditions
|
|
20
|
+
* straddle an empty band (some below the floor, some above the ceiling). Only
|
|
21
|
+
* audio renditions count toward the fallback — a co-present video quality (no
|
|
22
|
+
* audio rate) never influences it. Firefox is the exception: its 48kHz cap is
|
|
23
|
+
* hard, with no fallback.
|
|
14
24
|
*/
|
|
15
|
-
export function
|
|
16
|
-
|
|
17
|
-
|
|
25
|
+
export function withinAudioSampleRateRange(options, metadata, _index, array) {
|
|
26
|
+
// Muxed video carrying an audio rate, and every non-audio type, pass through.
|
|
27
|
+
if (metadata.contentType !== 'audio')
|
|
28
|
+
return true;
|
|
18
29
|
const samplingRate = last(metadata.audioSamplingRate);
|
|
19
|
-
if (!samplingRate
|
|
30
|
+
if (!samplingRate)
|
|
20
31
|
return true; // sampling rate not set
|
|
21
|
-
|
|
22
|
-
|
|
32
|
+
const { minSampleRate } = options;
|
|
33
|
+
// An explicit maxSampleRate takes precedence over the AudioContext rate.
|
|
34
|
+
const maxSampleRate = options.maxSampleRate ?? options.capabilities.sampleRate;
|
|
35
|
+
const audioRates = () => map(array, (item) => item.contentType === 'audio'
|
|
36
|
+
? last(item.audioSamplingRate)
|
|
37
|
+
: undefined).filter((rate) => rate != null);
|
|
38
|
+
// The single rate to keep when this rendition is out of band — or undefined
|
|
39
|
+
// when some rendition IS in band, so out-of-band renditions are dropped.
|
|
40
|
+
// Evaluating both bounds together is what stops a straddle from stranding.
|
|
41
|
+
const outOfBandFallback = () => {
|
|
42
|
+
const rates = audioRates();
|
|
43
|
+
const inBand = (rate) => (minSampleRate == null || rate >= minSampleRate) &&
|
|
44
|
+
(!maxSampleRate || rate <= maxSampleRate);
|
|
45
|
+
if (rates.some(inBand))
|
|
46
|
+
return undefined;
|
|
47
|
+
const decodable = maxSampleRate
|
|
48
|
+
? rates.filter((rate) => rate <= maxSampleRate)
|
|
49
|
+
: rates;
|
|
50
|
+
return decodable.length ? max(decodable) : min(rates);
|
|
51
|
+
};
|
|
52
|
+
// Lower bound (soft floor), independent of the platform max.
|
|
53
|
+
if (minSampleRate != null && samplingRate < minSampleRate) {
|
|
54
|
+
return samplingRate === outOfBandFallback();
|
|
55
|
+
}
|
|
56
|
+
// No platform max to gauge support: keep. This also lets >48kHz through on
|
|
57
|
+
// Firefox (its cap below is skipped) — accepted.
|
|
58
|
+
if (!maxSampleRate)
|
|
59
|
+
return true;
|
|
60
|
+
if (hasBrowser(Browser.FIREFOX)) {
|
|
61
|
+
// Firefox cannot decode >48kHz (e.g. high-res FLAC) via MSE; drop those.
|
|
23
62
|
return samplingRate <= 48_000;
|
|
24
63
|
}
|
|
25
|
-
// Other browsers: filter out all sampling rates above supported unless this will filter all
|
|
26
64
|
if (samplingRate <= maxSampleRate)
|
|
27
65
|
return true;
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
const itemSamplingRate = last(item.audioSamplingRate);
|
|
31
|
-
return itemSamplingRate != null && itemSamplingRate > maxSampleRate;
|
|
32
|
-
});
|
|
33
|
-
if (allAboveMax) {
|
|
34
|
-
// Find the lowest sampling rate and only allow that one
|
|
35
|
-
const samplingRates = map(array, (item) => last(item.audioSamplingRate)).filter((rate) => rate != null);
|
|
36
|
-
const lowestSamplingRate = min(samplingRates);
|
|
37
|
-
return samplingRate === lowestSamplingRate;
|
|
38
|
-
}
|
|
39
|
-
return false;
|
|
66
|
+
// Above the ceiling (soft): keep only the fallback when no rate is in band.
|
|
67
|
+
return samplingRate === outOfBandFallback();
|
|
40
68
|
}
|
|
@@ -96,7 +96,7 @@ export declare function createHlsFactories(options: Maybe<HlsInitOptions>): (dep
|
|
|
96
96
|
readonly manifestTransformed: ObservableValue<Promise<HlsManifestData>>;
|
|
97
97
|
readonly options: ObservableValue<Pick<VinylOptions, "text">>;
|
|
98
98
|
}) => SidecarTextTrackController;
|
|
99
|
-
options: import("@amazon/vinyl-di").Factory<ObservableValue<Pick<VinylOptions, "
|
|
99
|
+
options: import("@amazon/vinyl-di").Factory<ObservableValue<Pick<VinylOptions, "text" | "audio" | "abr" | "allowedContentTypes">>>;
|
|
100
100
|
playbackController: import("@amazon/vinyl-di").Factory<PlaybackController>;
|
|
101
101
|
playbackSource: import("@amazon/vinyl-di").Factory<PlaybackSource>;
|
|
102
102
|
drmKeySystemResolver: import("@amazon/vinyl-di").Factory<DrmKeySystemResolver>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createUrlHlsManifestProvider.d.ts","sourceRoot":"","sources":["../../../../../src/track/hls/createUrlHlsManifestProvider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EACnB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,KAAK,EACR,KAAK,EACL,aAAa,EACb,kBAAkB,EACrB,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"createUrlHlsManifestProvider.d.ts","sourceRoot":"","sources":["../../../../../src/track/hls/createUrlHlsManifestProvider.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACR,eAAe,EACf,gBAAgB,EACnB,MAAM,0BAA0B,CAAA;AAEjC,OAAO,KAAK,EACR,KAAK,EACL,aAAa,EACb,kBAAkB,EACrB,MAAM,oBAAoB,CAAA;AAQ3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEtE,wBAAgB,4BAA4B,CACxC,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,kBAAkB,GACjC,mBAAmB,CAiCrB;AAED,MAAM,WAAW,yBAAyB;IACtC,uDAAuD;IACvD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IAC5C,sCAAsC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAChD,6BAA6B;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;CACxC;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACpC,OAAO,EAAE,yBAAyB,GACnC,OAAO,CAAC,gBAAgB,CAAC,CAU3B"}
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
5
|
import { parseMainPlaylist, parseMediaPlaylist } from '@amazon/vinyl-hls-parser';
|
|
6
|
-
import { memoize, requestWithRetry, resolveUrl } from '@amazon/vinyl-util';
|
|
6
|
+
import { memoize, readResponseBody, requestWithRetry, resolveUrl, } from '@amazon/vinyl-util';
|
|
7
7
|
export function createUrlHlsManifestProvider(url, requestInit) {
|
|
8
8
|
return async (abort) => {
|
|
9
9
|
const mainResponse = await requestWithRetry(url, requestInit, {
|
|
10
10
|
abort,
|
|
11
11
|
});
|
|
12
|
-
const mainText = await mainResponse
|
|
12
|
+
const mainText = await readResponseBody(mainResponse, 'text');
|
|
13
13
|
// Use the response URL (after redirects) as the base for resolving
|
|
14
14
|
// relative URIs and for resolving #EXT-X-DEFINE:QUERYPARAM tokens.
|
|
15
15
|
const baseUrl = mainResponse.url || url;
|
|
@@ -35,7 +35,7 @@ export async function fetchMediaPlaylist(options) {
|
|
|
35
35
|
const { uri, baseUrl, defines, requestInit, abort } = options;
|
|
36
36
|
const variantUrl = resolveUrl(uri, baseUrl);
|
|
37
37
|
const response = await requestWithRetry(variantUrl, requestInit, { abort });
|
|
38
|
-
const text = await response
|
|
38
|
+
const text = await readResponseBody(response, 'text');
|
|
39
39
|
// The resolved URL (after redirects) carries the query parameters that
|
|
40
40
|
// #EXT-X-DEFINE:QUERYPARAM entries resolve against (e.g. MediaTailor ad
|
|
41
41
|
// manifests). Fall back to the requested URL if the response omits it.
|
|
@@ -14,15 +14,6 @@ import type { TextTrackController } from '../../text/TextTrack';
|
|
|
14
14
|
import type { TrackConfigOptions } from '../TrackFactory';
|
|
15
15
|
import type { TrackAds } from '../../ad/AdBreakInfo';
|
|
16
16
|
import type { VinylOptions } from '../../vinyl/VinylOptions';
|
|
17
|
-
/**
|
|
18
|
-
* How long to wait after all streams have data before checking whether a seek
|
|
19
|
-
* is still stuck, in seconds.
|
|
20
|
-
*/
|
|
21
|
-
export declare const SEEKING_STALL_TIME_CHECK = 0.1;
|
|
22
|
-
/**
|
|
23
|
-
* How far to nudge the playhead, in seconds, to recover a stuck seek.
|
|
24
|
-
*/
|
|
25
|
-
export declare const PLAYHEAD_NUDGE = 0.05;
|
|
26
17
|
export type MseTrackDeps = TrackBaseDeps & {
|
|
27
18
|
readonly contentTypesValue: ContentTypesValue;
|
|
28
19
|
readonly contentStreamFactory: (contentType: ContentType) => ContentStream;
|
|
@@ -54,7 +45,6 @@ export declare class MseTrack extends TrackBase {
|
|
|
54
45
|
protected readonly deps: MseTrackDeps;
|
|
55
46
|
get textTrackController(): TextTrackController | null;
|
|
56
47
|
private readonly streams;
|
|
57
|
-
private stallNudgeTimer;
|
|
58
48
|
private readonly disposeAbort;
|
|
59
49
|
private lastPreloadOptions;
|
|
60
50
|
private readonly allFetchedRanges;
|
|
@@ -129,13 +119,6 @@ export declare class MseTrack extends TrackBase {
|
|
|
129
119
|
private getStream;
|
|
130
120
|
private clearStreams;
|
|
131
121
|
get bufferingEnded(): boolean;
|
|
132
|
-
/**
|
|
133
|
-
* A seek only completes once every stream has data at the target, but on
|
|
134
|
-
* some platforms the element can stay stuck `seeking` even after that. Once
|
|
135
|
-
* all streams hold data, if we're still seeking a moment later, nudge the
|
|
136
|
-
* playhead to prod the element into completing the seek.
|
|
137
|
-
*/
|
|
138
|
-
private checkStalledSeek;
|
|
139
122
|
private setContentTypes;
|
|
140
123
|
dispose(): void;
|
|
141
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MseTrack.d.ts","sourceRoot":"","sources":["../../../../../src/track/mse/MseTrack.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,EAOH,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"MseTrack.d.ts","sourceRoot":"","sources":["../../../../../src/track/mse/MseTrack.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5D,OAAO,EAOH,KAAK,KAAK,EACV,KAAK,cAAc,EACnB,KAAK,WAAW,EAGnB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAC1E,OAAO,KAAK,EACR,WAAW,EACX,oBAAoB,EACvB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,KAAK,EACR,aAAa,EAEhB,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAA;AAC5F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAA;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAGH,KAAK,aAAa,EACrB,MAAM,+BAA+B,CAAA;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAC/D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAEzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAE5D,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG;IACvC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAA;IAC7C,QAAQ,CAAC,oBAAoB,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,aAAa,CAAA;IAC1E,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAA;IACxD,QAAQ,CAAC,qBAAqB,EAAE,qBAAqB,CAAA;IACrD,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAA;IACvC,QAAQ,CAAC,aAAa,EAAE,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;IAC/D,QAAQ,CAAC,wBAAwB,EAAE,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;IAC1E;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAA;IAEzD;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;IACtD,QAAQ,CAAC,mBAAmB,EAAE,eAAe,CACzC,YAAY,CAAC,qBAAqB,CAAC,CACtC,CAAA;IACD,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAA;CACrD,CAAA;AAMD;;GAEG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACnC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,MAAM,CAEjC;IAED,mBAA2B,IAAI,EAAE,YAAY,CAAA;IAE7C,IAAa,mBAAmB,IAAI,mBAAmB,GAAG,IAAI,CAK7D;IAED,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAC9C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,kBAAkB,CAA2C;IACrE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuB;IACxD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAG9B;IACD,OAAO,CAAC,aAAa,CAAsC;IAE3D,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,oBAAoB,CAA+C;IAC3E,OAAO,CAAC,aAAa,CAA2B;IAChD,OAAO,CAAC,aAAa,CAA2B;gBAG5C,GAAG,EAAE,QAAQ,EACb,IAAI,EAAE,WAAW,EACjB,mBAAmB,EAAE,SAAS,CAAC,YAAY,CAAC;IAsFhD;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAKrB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;IACH,OAAO,CAAC,eAAe;IAqBjB,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC;IAQjC;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAoBjC,OAAO,CAAC,gBAAgB;IAmBxB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IAcpB;;;;OAIG;IACH,SAAS,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IA4CtD,OAAO,CACH,YAAY,EAAE,mBAAmB,EACjC,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC;IAU1C,IAAI,YAAY,IAAI,WAAW,CAAC,WAAW,CAAC,CAE3C;IAED,IAAI,SAAS,IAAI,SAAS,oBAAoB,EAAE,GAAG,IAAI,CAEtD;IAED,IAAI,mBAAmB,IAAI,SAAS,oBAAoB,EAAE,GAAG,IAAI,CAEhE;IAED,IAAI,aAAa,IAAI,cAAc,CAElC;IAED;;;;OAIG;IACH,aAAa;IAKb;;;OAGG;IACH,KAAK,CAAC,IAAI,UAAQ,GAAG,IAAI;IAUzB,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAwCzD,aAAa,IAAI,IAAI;IAsBrB,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,oBAAoB,GAAG,IAAI;IAI1E,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,oBAAoB,GAAG,IAAI;IAI1E,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,oBAAoB,GAAG,IAAI;IAIzE;;OAEG;IACH,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,YAAY;IAOpB,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,OAAO,CAAC,eAAe;IAsBvB,OAAO,IAAI,IAAI;CAKlB"}
|
|
@@ -3,18 +3,9 @@
|
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
5
|
import { TrackBase } from '../TrackBase';
|
|
6
|
-
import { Abort, equalDeep, first, IntersectionRanges, logDebug,
|
|
6
|
+
import { Abort, equalDeep, first, IntersectionRanges, logDebug, redispatchEvents, } from '@amazon/vinyl-util';
|
|
7
7
|
import { createContainer } from '@amazon/vinyl-di';
|
|
8
8
|
import { getMediaPeriodAtTime, } from '../../streaming/MediaTimeline';
|
|
9
|
-
/**
|
|
10
|
-
* How long to wait after all streams have data before checking whether a seek
|
|
11
|
-
* is still stuck, in seconds.
|
|
12
|
-
*/
|
|
13
|
-
export const SEEKING_STALL_TIME_CHECK = 0.1;
|
|
14
|
-
/**
|
|
15
|
-
* How far to nudge the playhead, in seconds, to recover a stuck seek.
|
|
16
|
-
*/
|
|
17
|
-
export const PLAYHEAD_NUDGE = 0.05;
|
|
18
9
|
/**
|
|
19
10
|
* An MseTrack uses media source extensions for streaming.
|
|
20
11
|
*/
|
|
@@ -30,7 +21,6 @@ export class MseTrack extends TrackBase {
|
|
|
30
21
|
return this.deps.textTrackController ?? null;
|
|
31
22
|
}
|
|
32
23
|
streams = [];
|
|
33
|
-
stallNudgeTimer = null;
|
|
34
24
|
disposeAbort = new Abort();
|
|
35
25
|
lastPreloadOptions = null;
|
|
36
26
|
allFetchedRanges = [];
|
|
@@ -94,10 +84,6 @@ export class MseTrack extends TrackBase {
|
|
|
94
84
|
if (previous !== undefined)
|
|
95
85
|
this.reloadStreams();
|
|
96
86
|
}));
|
|
97
|
-
add(deps.allowedContentTypes.onData((_value, previous) => {
|
|
98
|
-
if (previous !== undefined)
|
|
99
|
-
this.reloadStreams();
|
|
100
|
-
}));
|
|
101
87
|
// A resolution-restriction change re-selects a quality from the same
|
|
102
88
|
// streams, so clearing the buffer is enough — no rebuild is needed.
|
|
103
89
|
add(deps.abr.onData((value, previous) => {
|
|
@@ -237,7 +223,6 @@ export class MseTrack extends TrackBase {
|
|
|
237
223
|
this.dispatch('bufferingEnded', {});
|
|
238
224
|
}
|
|
239
225
|
});
|
|
240
|
-
stream.on('hasDataChange', () => this.checkStalledSeek());
|
|
241
226
|
stream.on('fetchedRangesChange', () => {
|
|
242
227
|
this._fetchedRanges.invalidate();
|
|
243
228
|
});
|
|
@@ -382,33 +367,6 @@ export class MseTrack extends TrackBase {
|
|
|
382
367
|
get bufferingEnded() {
|
|
383
368
|
return this.streams.every((stream) => stream.bufferingEnded);
|
|
384
369
|
}
|
|
385
|
-
/**
|
|
386
|
-
* A seek only completes once every stream has data at the target, but on
|
|
387
|
-
* some platforms the element can stay stuck `seeking` even after that. Once
|
|
388
|
-
* all streams hold data, if we're still seeking a moment later, nudge the
|
|
389
|
-
* playhead to prod the element into completing the seek.
|
|
390
|
-
*/
|
|
391
|
-
checkStalledSeek() {
|
|
392
|
-
const { playbackController } = this.deps;
|
|
393
|
-
if (this.stallNudgeTimer !== null || !playbackController.seeking)
|
|
394
|
-
return;
|
|
395
|
-
if (!this.streams.length || !this.streams.every((s) => s.hasData)) {
|
|
396
|
-
return;
|
|
397
|
-
}
|
|
398
|
-
this.stallNudgeTimer = setTimeout(() => {
|
|
399
|
-
this.stallNudgeTimer = null;
|
|
400
|
-
if (this.disposed || !playbackController.seeking)
|
|
401
|
-
return;
|
|
402
|
-
if (!this.streams.every((s) => s.hasData))
|
|
403
|
-
return;
|
|
404
|
-
const from = playbackController.currentTime;
|
|
405
|
-
const to = from + PLAYHEAD_NUDGE;
|
|
406
|
-
// An internal recovery seek, not a user seek — logged so the two
|
|
407
|
-
// are distinguishable in playback traces.
|
|
408
|
-
logDebug(this, 'nudging playhead to recover a stalled seek', from, '->', to);
|
|
409
|
-
playbackController.seekTo(to, 0).catch(noop);
|
|
410
|
-
}, SEEKING_STALL_TIME_CHECK * 1000);
|
|
411
|
-
}
|
|
412
370
|
setContentTypes(contentTypes) {
|
|
413
371
|
if (this.disposed)
|
|
414
372
|
return;
|
|
@@ -434,8 +392,6 @@ export class MseTrack extends TrackBase {
|
|
|
434
392
|
}
|
|
435
393
|
dispose() {
|
|
436
394
|
logDebug(this, 'dispose');
|
|
437
|
-
if (this.stallNudgeTimer !== null)
|
|
438
|
-
clearTimeout(this.stallNudgeTimer);
|
|
439
395
|
this.clearStreams();
|
|
440
396
|
super.dispose();
|
|
441
397
|
}
|