@amazon/vinyl 3.0.1 → 3.1.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 +972 -954
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +646 -619
- package/dist/index.js.map +4 -4
- package/dist/test/benchmark.js.map +2 -2
- package/dist/test/integ.es5.js +357 -353
- package/dist/test/integ.js +2251 -1852
- 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 +2 -0
- package/dist/types/current/drm/DrmControllerImpl.d.ts.map +1 -1
- package/dist/types/current/drm/DrmControllerImpl.js +56 -48
- 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.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/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 +21 -7
- package/dist/types/current/track/filters/sampleRateFilter.d.ts.map +1 -1
- package/dist/types/current/track/filters/sampleRateFilter.js +42 -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 +9 -17
- package/dist/types/current/track/mse/MseTrack.d.ts.map +1 -1
- package/dist/types/current/track/mse/MseTrack.js +29 -46
- 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/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 +2 -0
- 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/StreamingEventMap.d.ts +0 -5
- package/dist/types/ts3.7/streaming/buffering/BufferingController.d.ts +0 -11
- 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 +21 -7
- package/dist/types/ts3.7/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/ts3.7/track/mse/MseTrack.d.ts +9 -17
- package/dist/types/ts3.7/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts3.7/vinyl/createVinylFactories.d.ts +7 -16
- package/dist/types/ts4.1/drm/DrmControllerImpl.d.ts +2 -0
- 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/StreamingEventMap.d.ts +0 -5
- package/dist/types/ts4.1/streaming/buffering/BufferingController.d.ts +0 -11
- 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 +21 -7
- package/dist/types/ts4.1/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/ts4.1/track/mse/MseTrack.d.ts +9 -17
- package/dist/types/ts4.1/util/media/mimeType.d.ts +8 -0
- package/dist/types/ts4.1/vinyl/createVinylFactories.d.ts +7 -16
- package/dist/types/ts4.7/drm/DrmControllerImpl.d.ts +2 -0
- 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/StreamingEventMap.d.ts +0 -5
- package/dist/types/ts4.7/streaming/buffering/BufferingController.d.ts +0 -11
- 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 +21 -7
- package/dist/types/ts4.7/track/hls/createHlsFactories.d.ts +1 -1
- package/dist/types/ts4.7/track/mse/MseTrack.d.ts +9 -17
- package/dist/types/ts4.7/util/media/mimeType.d.ts +8 -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 +93 -0
- 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 +47 -74
- 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/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 +136 -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/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
|
@@ -2,39 +2,57 @@
|
|
|
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, every, map, min, } from '@amazon/vinyl-util';
|
|
5
|
+
import { hasBrowser, Browser, last, MediaUnsupportedError, every, 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: if every audio rendition is above the max the lowest is
|
|
17
|
+
* kept, and if every audio rendition is below the min the highest is kept, so
|
|
18
|
+
* playback is never stranded. Only audio renditions count toward those
|
|
19
|
+
* fallbacks — a co-present video quality (no audio rate) never influences them.
|
|
14
20
|
*/
|
|
15
|
-
export function
|
|
16
|
-
|
|
17
|
-
|
|
21
|
+
export function withinAudioSampleRateRange(options, metadata, _index, array) {
|
|
22
|
+
// Only audio renditions are gated on sampling rate; video and any other
|
|
23
|
+
// content type (including muxed video that happens to carry an audio rate)
|
|
24
|
+
// pass through untouched.
|
|
25
|
+
if (metadata.contentType !== 'audio')
|
|
26
|
+
return true;
|
|
18
27
|
const samplingRate = last(metadata.audioSamplingRate);
|
|
19
|
-
if (!samplingRate
|
|
28
|
+
if (!samplingRate)
|
|
20
29
|
return true; // sampling rate not set
|
|
21
|
-
|
|
22
|
-
|
|
30
|
+
const audioRates = () => map(array, (item) => item.contentType === 'audio'
|
|
31
|
+
? last(item.audioSamplingRate)
|
|
32
|
+
: undefined).filter((rate) => rate != null);
|
|
33
|
+
// Lower bound (soft floor), independent of the platform max: below it, keep
|
|
34
|
+
// only the highest when every audio rendition is below the floor.
|
|
35
|
+
const { minSampleRate } = options;
|
|
36
|
+
if (minSampleRate != null && samplingRate < minSampleRate) {
|
|
37
|
+
const rates = audioRates();
|
|
38
|
+
return (every(rates, (rate) => rate < minSampleRate) &&
|
|
39
|
+
samplingRate === max(rates));
|
|
40
|
+
}
|
|
41
|
+
// Upper bound. An explicit maxSampleRate takes precedence over the
|
|
42
|
+
// AudioContext-reported output rate.
|
|
43
|
+
const maxSampleRate = options.maxSampleRate ?? options.capabilities.sampleRate;
|
|
44
|
+
// No platform max to gauge support: keep. This also lets >48kHz through on
|
|
45
|
+
// Firefox (its cap below is skipped) — accepted.
|
|
46
|
+
if (!maxSampleRate)
|
|
47
|
+
return true;
|
|
48
|
+
if (hasBrowser(Browser.FIREFOX)) {
|
|
49
|
+
// Firefox cannot decode >48kHz (e.g. high-res FLAC) via MSE; drop those.
|
|
23
50
|
return samplingRate <= 48_000;
|
|
24
51
|
}
|
|
25
|
-
// Other browsers: filter out all sampling rates above supported unless this will filter all
|
|
26
52
|
if (samplingRate <= maxSampleRate)
|
|
27
53
|
return true;
|
|
28
|
-
//
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
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;
|
|
54
|
+
// Above the max: keep only the lowest when every audio rendition exceeds it.
|
|
55
|
+
const rates = audioRates();
|
|
56
|
+
return (every(rates, (rate) => rate > maxSampleRate) &&
|
|
57
|
+
samplingRate === min(rates));
|
|
40
58
|
}
|
|
@@ -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;
|
|
@@ -81,6 +71,15 @@ export declare class MseTrack extends TrackBase {
|
|
|
81
71
|
* Updates the cached qualities list from the transformed timeline for the current period.
|
|
82
72
|
*/
|
|
83
73
|
private updateQualities;
|
|
74
|
+
/**
|
|
75
|
+
* Fails fast when a media content type the manifest declared (audio/video)
|
|
76
|
+
* has no playable qualities left after timeline filtering. Its stream can
|
|
77
|
+
* never create a source buffer, so without this the track waits forever for
|
|
78
|
+
* a source buffer that never arrives, surfacing only as an opaque
|
|
79
|
+
* `readyToAppend` timeout. Runs once both the required content types and the
|
|
80
|
+
* filtered timeline qualities are known (either order).
|
|
81
|
+
*/
|
|
82
|
+
private validateRequiredContentTypesPlayable;
|
|
84
83
|
getAds(): Promise<TrackAds>;
|
|
85
84
|
/**
|
|
86
85
|
* Updates the cached unfiltered qualities list from the raw timeline for the current period.
|
|
@@ -129,13 +128,6 @@ export declare class MseTrack extends TrackBase {
|
|
|
129
128
|
private getStream;
|
|
130
129
|
private clearStreams;
|
|
131
130
|
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
131
|
private setContentTypes;
|
|
140
132
|
dispose(): void;
|
|
141
133
|
}
|
|
@@ -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,EAEV,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
|
|
1
|
+
{"version":3,"file":"MseTrack.d.ts","sourceRoot":"","sources":["../../../../../src/track/mse/MseTrack.ts"],"names":[],"mappings":"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"}
|
|
@@ -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, MediaUnsupportedError, 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 = [];
|
|
@@ -50,7 +40,10 @@ export class MseTrack extends TrackBase {
|
|
|
50
40
|
this.deps = deps;
|
|
51
41
|
add(deps.contentTypesValue.onData((contentTypesPromise) => {
|
|
52
42
|
contentTypesPromise
|
|
53
|
-
.then((value) =>
|
|
43
|
+
.then((value) => {
|
|
44
|
+
this.setContentTypes(value);
|
|
45
|
+
this.validateRequiredContentTypesPlayable();
|
|
46
|
+
})
|
|
54
47
|
.catch(this.errorHandler);
|
|
55
48
|
}));
|
|
56
49
|
// DRM
|
|
@@ -94,10 +87,6 @@ export class MseTrack extends TrackBase {
|
|
|
94
87
|
if (previous !== undefined)
|
|
95
88
|
this.reloadStreams();
|
|
96
89
|
}));
|
|
97
|
-
add(deps.allowedContentTypes.onData((_value, previous) => {
|
|
98
|
-
if (previous !== undefined)
|
|
99
|
-
this.reloadStreams();
|
|
100
|
-
}));
|
|
101
90
|
// A resolution-restriction change re-selects a quality from the same
|
|
102
91
|
// streams, so clearing the buffer is enough — no rebuild is needed.
|
|
103
92
|
add(deps.abr.onData((value, previous) => {
|
|
@@ -150,8 +139,32 @@ export class MseTrack extends TrackBase {
|
|
|
150
139
|
});
|
|
151
140
|
}
|
|
152
141
|
}
|
|
142
|
+
this.validateRequiredContentTypesPlayable();
|
|
153
143
|
});
|
|
154
144
|
}
|
|
145
|
+
/**
|
|
146
|
+
* Fails fast when a media content type the manifest declared (audio/video)
|
|
147
|
+
* has no playable qualities left after timeline filtering. Its stream can
|
|
148
|
+
* never create a source buffer, so without this the track waits forever for
|
|
149
|
+
* a source buffer that never arrives, surfacing only as an opaque
|
|
150
|
+
* `readyToAppend` timeout. Runs once both the required content types and the
|
|
151
|
+
* filtered timeline qualities are known (either order).
|
|
152
|
+
*/
|
|
153
|
+
validateRequiredContentTypesPlayable() {
|
|
154
|
+
const qualities = this._qualities;
|
|
155
|
+
if (!qualities)
|
|
156
|
+
return;
|
|
157
|
+
const present = new Set(qualities.map((q) => q.contentType));
|
|
158
|
+
// contentTypesValue only ever yields audio/video (text is a sidecar
|
|
159
|
+
// pipeline, never an MSE source buffer), so every required type must
|
|
160
|
+
// have a playable quality left in the filtered timeline.
|
|
161
|
+
for (const contentType of this._contentTypes) {
|
|
162
|
+
if (!present.has(contentType)) {
|
|
163
|
+
this.errorHandler(new MediaUnsupportedError(`No playable ${contentType} rendition`, `no-playable-${contentType}`));
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
155
168
|
async getAds() {
|
|
156
169
|
const timeline = await this.deps.mediaTimeline.value;
|
|
157
170
|
return {
|
|
@@ -237,7 +250,6 @@ export class MseTrack extends TrackBase {
|
|
|
237
250
|
this.dispatch('bufferingEnded', {});
|
|
238
251
|
}
|
|
239
252
|
});
|
|
240
|
-
stream.on('hasDataChange', () => this.checkStalledSeek());
|
|
241
253
|
stream.on('fetchedRangesChange', () => {
|
|
242
254
|
this._fetchedRanges.invalidate();
|
|
243
255
|
});
|
|
@@ -382,33 +394,6 @@ export class MseTrack extends TrackBase {
|
|
|
382
394
|
get bufferingEnded() {
|
|
383
395
|
return this.streams.every((stream) => stream.bufferingEnded);
|
|
384
396
|
}
|
|
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
397
|
setContentTypes(contentTypes) {
|
|
413
398
|
if (this.disposed)
|
|
414
399
|
return;
|
|
@@ -434,8 +419,6 @@ export class MseTrack extends TrackBase {
|
|
|
434
419
|
}
|
|
435
420
|
dispose() {
|
|
436
421
|
logDebug(this, 'dispose');
|
|
437
|
-
if (this.stallNudgeTimer !== null)
|
|
438
|
-
clearTimeout(this.stallNudgeTimer);
|
|
439
422
|
this.clearStreams();
|
|
440
423
|
super.dispose();
|
|
441
424
|
}
|