shaka-player 4.2.9 → 4.2.10
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/.github/workflows/selenium-lab-tests.yaml +23 -1
- package/AUTHORS +2 -1
- package/CHANGELOG.md +27 -0
- package/CONTRIBUTORS +4 -1
- package/dist/controls.css +1 -1
- package/dist/demo.compiled.debug.js +154 -276
- package/dist/demo.compiled.debug.map +4 -4
- package/dist/demo.compiled.js +154 -276
- package/dist/demo.compiled.map +4 -4
- package/dist/deps.js +1 -1
- package/dist/locales.js +30 -30
- package/dist/receiver.compiled.debug.js +36 -65
- package/dist/receiver.compiled.debug.map +4 -4
- package/dist/receiver.compiled.js +36 -65
- package/dist/receiver.compiled.map +4 -4
- package/dist/shaka-player.compiled.d.ts +12 -3
- package/dist/shaka-player.compiled.debug.d.ts +12 -3
- package/dist/shaka-player.compiled.debug.externs.js +17 -12
- package/dist/shaka-player.compiled.debug.js +150 -147
- package/dist/shaka-player.compiled.debug.map +4 -4
- package/dist/shaka-player.compiled.externs.js +17 -12
- package/dist/shaka-player.compiled.js +822 -820
- package/dist/shaka-player.compiled.map +3 -3
- package/dist/shaka-player.ui.d.ts +12 -3
- package/dist/shaka-player.ui.debug.d.ts +12 -3
- package/dist/shaka-player.ui.debug.externs.js +5 -0
- package/dist/shaka-player.ui.debug.js +160 -157
- package/dist/shaka-player.ui.debug.map +3 -3
- package/dist/shaka-player.ui.externs.js +5 -0
- package/dist/shaka-player.ui.js +952 -949
- package/dist/shaka-player.ui.map +3 -3
- package/docs/tutorials/a11y.md +0 -4
- package/docs/tutorials/ad_monetization.md +0 -4
- package/docs/tutorials/basic-usage.md +0 -5
- package/docs/tutorials/config.md +0 -5
- package/docs/tutorials/debugging.md +0 -5
- package/docs/tutorials/drm-config.md +0 -5
- package/docs/tutorials/fairplay.md +2 -2
- package/docs/tutorials/license-server-auth.md +0 -5
- package/docs/tutorials/license-wrapping.md +0 -5
- package/docs/tutorials/network-and-buffering-config.md +0 -5
- package/docs/tutorials/ui-customization.md +0 -5
- package/docs/tutorials/ui.md +0 -7
- package/docs/tutorials/welcome.md +0 -5
- package/externs/network_information.js +7 -2
- package/externs/shaka/abr_manager.js +6 -0
- package/externs/shaka/net.js +1 -0
- package/externs/shaka/player.js +13 -7
- package/lib/abr/simple_abr_manager.js +27 -3
- package/lib/ads/client_side_ad_manager.js +6 -3
- package/lib/dash/dash_parser.js +49 -48
- package/lib/debug/log.js +9 -13
- package/lib/media/media_source_engine.js +11 -4
- package/lib/media/segment_index.js +2 -0
- package/lib/media/streaming_engine.js +8 -3
- package/lib/net/http_fetch_plugin.js +79 -57
- package/lib/net/networking_engine.js +1 -0
- package/lib/player.js +22 -3
- package/lib/polyfill/media_capabilities.js +13 -0
- package/lib/text/mp4_vtt_parser.js +4 -0
- package/lib/text/text_engine.js +1 -0
- package/lib/util/manifest_parser_utils.js +1 -2
- package/lib/util/mime_utils.js +11 -0
- package/lib/util/periods.js +5 -5
- package/lib/util/stream_utils.js +2 -2
- package/maintained-branches.md +3 -4
- package/package.json +1 -1
- package/test/media/content_workarounds_unit.js +43 -0
- package/test/media/drm_engine_integration.js +4 -17
- package/test/media/streaming_engine_unit.js +6 -1
- package/test/net/networking_engine_unit.js +6 -1
- package/test/player_integration.js +39 -0
- package/test/player_unit.js +57 -0
- package/test/polyfill/media_capabilities_unit.js +0 -1
- package/test/test/assets/text-clip-alt.vtt +63 -0
- package/test/test/util/fake_drm_engine.js +3 -0
- package/test/test/util/simple_fakes.js +6 -0
- package/test/test/util/test_scheme.js +9 -14
- package/test/text/mp4_vtt_parser_unit.js +8 -0
- package/test/util/mime_utils_unit.js +10 -0
package/docs/tutorials/a11y.md
CHANGED
|
@@ -222,7 +222,3 @@ before instantiating the player.
|
|
|
222
222
|
// myapp.CustomAdManager is a placeholder name for your ad manager implementation.
|
|
223
223
|
shaka.Player.setAdManagerFactory(() => new myapp.CustomAdManager());
|
|
224
224
|
```
|
|
225
|
-
|
|
226
|
-
#### Continue the Tutorials
|
|
227
|
-
|
|
228
|
-
Next, check out {@tutorial plugins}.
|
package/docs/tutorials/config.md
CHANGED
|
@@ -142,8 +142,3 @@ player.configure({
|
|
|
142
142
|
|
|
143
143
|
For more detail on individual configuration options, please see the API docs for
|
|
144
144
|
{@link shaka.extern.PlayerConfiguration} and {@link shaka.Player#configure}.
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
#### Continue the Tutorials
|
|
148
|
-
|
|
149
|
-
Next, check out {@tutorial network-and-buffering-config}.
|
|
@@ -187,8 +187,3 @@ To sum up, remember these points when debugging your application:
|
|
|
187
187
|
- Use the debug version of Shaka Player for debugging and integration work
|
|
188
188
|
- Refer to the docs for error codes
|
|
189
189
|
- Increase the log level when you need more detail
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
#### Continue the Tutorials
|
|
193
|
-
|
|
194
|
-
Next, check out {@tutorial config}.
|
|
@@ -208,8 +208,3 @@ you should provide an empty string as robustness
|
|
|
208
208
|
##### Other key-systems
|
|
209
209
|
|
|
210
210
|
Values for other key systems are not known to us at this time.
|
|
211
|
-
|
|
212
|
-
#### Continue the Tutorials
|
|
213
|
-
|
|
214
|
-
Next, check out {@tutorial license-server-auth}.
|
|
215
|
-
Or check out {@tutorial fairplay}.
|
|
@@ -65,13 +65,13 @@ is used by the browser to generate the license request. If you don't use the
|
|
|
65
65
|
default content ID derivation, you need to specify a custom init data transform:
|
|
66
66
|
|
|
67
67
|
```js
|
|
68
|
-
player.configure('drm.initDataTransform', (initData, initDataType) => {
|
|
68
|
+
player.configure('drm.initDataTransform', (initData, initDataType, drmInfo) => {
|
|
69
69
|
if (initDataType != 'skd')
|
|
70
70
|
return initData;
|
|
71
71
|
// 'initData' is a buffer containing an 'skd://' URL as a UTF-8 string.
|
|
72
72
|
const skdUri = shaka.util.StringUtils.fromBytesAutoDetect(initData);
|
|
73
73
|
const contentId = getMyContentId(skdUri);
|
|
74
|
-
const cert =
|
|
74
|
+
const cert = drmInfo.serverCertificate;
|
|
75
75
|
return shaka.util.FairPlayUtils.initDataTransform(initData, contentId, cert);
|
|
76
76
|
});
|
|
77
77
|
```
|
|
@@ -166,8 +166,3 @@ using a request filter:
|
|
|
166
166
|
|
|
167
167
|
Load the page again, and the license response will be accepted by the Widevine
|
|
168
168
|
CDM. Open the JavaScript console to see what the server sent back.
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
#### Continue the Tutorials
|
|
172
|
-
|
|
173
|
-
Next, check out {@tutorial ui}.
|
|
@@ -117,8 +117,3 @@ URLs in your manifests always use `https:`, or by having it not include the
|
|
|
117
117
|
scheme (e.g., `//example.com/file.mp4`).
|
|
118
118
|
|
|
119
119
|
[CORS]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
#### Continue the Tutorials
|
|
123
|
-
|
|
124
|
-
Next, check out {@tutorial drm-config}.
|
|
@@ -265,8 +265,3 @@ PR contributions to [the gallery repo][] are welcome.
|
|
|
265
265
|
[@lucksy]: https://github.com/lucksy
|
|
266
266
|
[pre-packaged Shaka UI themes]: https://lucksy.github.io/shaka-player-themes/
|
|
267
267
|
[the gallery repo]: https://github.com/lucksy/shaka-player-themes
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
#### Continue the Tutorials
|
|
271
|
-
|
|
272
|
-
Next, check out {@tutorial a11y} to make your custom buttons accessible to screen readers.
|
package/docs/tutorials/ui.md
CHANGED
|
@@ -106,8 +106,3 @@ To subscribe to new releases on GitHub, you can follow
|
|
|
106
106
|
To receive infrequent announcements and surveys from us, you can join our
|
|
107
107
|
[mailing list](https://groups.google.com/forum/#!forum/shaka-player-users).
|
|
108
108
|
The list is very low volume, and can only be written to by us.
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
#### Continue the Tutorials
|
|
112
|
-
|
|
113
|
-
Next, check out {@tutorial basic-usage}.
|
|
@@ -19,5 +19,10 @@ NetworkInformation.prototype.saveData;
|
|
|
19
19
|
* @param {string} type
|
|
20
20
|
* @param {Function} listener
|
|
21
21
|
*/
|
|
22
|
-
NetworkInformation.prototype.addEventListener =
|
|
23
|
-
|
|
22
|
+
NetworkInformation.prototype.addEventListener = function(type, listener) {};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param {string} type
|
|
26
|
+
* @param {Function} listener
|
|
27
|
+
*/
|
|
28
|
+
NetworkInformation.prototype.removeEventListener = function(type, listener) {};
|
package/externs/shaka/net.js
CHANGED
package/externs/shaka/player.js
CHANGED
|
@@ -627,9 +627,7 @@ shaka.extern.AdvancedDrmConfiguration;
|
|
|
627
627
|
* clearKeys: !Object.<string, string>,
|
|
628
628
|
* delayLicenseRequestUntilPlayed: boolean,
|
|
629
629
|
* advanced: Object.<string, shaka.extern.AdvancedDrmConfiguration>,
|
|
630
|
-
* initDataTransform:
|
|
631
|
-
* ((function(!Uint8Array, string, ?shaka.extern.DrmInfo):!Uint8Array)|
|
|
632
|
-
* undefined),
|
|
630
|
+
* initDataTransform:(shaka.extern.InitDataTransform|undefined),
|
|
633
631
|
* logLicenseExchange: boolean,
|
|
634
632
|
* updateExpirationTime: number,
|
|
635
633
|
* preferredKeySystems: !Array.<string>,
|
|
@@ -655,10 +653,7 @@ shaka.extern.AdvancedDrmConfiguration;
|
|
|
655
653
|
* <i>Optional.</i> <br>
|
|
656
654
|
* A dictionary which maps key system IDs to advanced DRM configuration for
|
|
657
655
|
* those key systems.
|
|
658
|
-
* @property
|
|
659
|
-
* {((function(!Uint8Array, string, ?shaka.extern.DrmInfo):!Uint8Array)|
|
|
660
|
-
* undefined)}
|
|
661
|
-
* initDataTransform
|
|
656
|
+
* @property {shaka.extern.InitDataTransform|undefined} initDataTransform
|
|
662
657
|
* <i>Optional.</i><br>
|
|
663
658
|
* If given, this function is called with the init data from the
|
|
664
659
|
* manifest/media and should return the (possibly transformed) init data to
|
|
@@ -687,6 +682,17 @@ shaka.extern.AdvancedDrmConfiguration;
|
|
|
687
682
|
*/
|
|
688
683
|
shaka.extern.DrmConfiguration;
|
|
689
684
|
|
|
685
|
+
/**
|
|
686
|
+
* @typedef {function(!Uint8Array, string, ?shaka.extern.DrmInfo):!Uint8Array}
|
|
687
|
+
*
|
|
688
|
+
* @description
|
|
689
|
+
* A callback function to handle custom content ID signaling for FairPlay
|
|
690
|
+
* content.
|
|
691
|
+
*
|
|
692
|
+
* @exportDoc
|
|
693
|
+
*/
|
|
694
|
+
shaka.extern.InitDataTransform;
|
|
695
|
+
|
|
690
696
|
|
|
691
697
|
/**
|
|
692
698
|
* @typedef {{
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
goog.provide('shaka.abr.SimpleAbrManager');
|
|
8
8
|
|
|
9
|
+
goog.require('shaka.util.IReleasable');
|
|
9
10
|
goog.require('goog.asserts');
|
|
10
11
|
goog.require('shaka.abr.EwmaBandwidthEstimator');
|
|
11
12
|
goog.require('shaka.log');
|
|
@@ -32,6 +33,7 @@ goog.require('shaka.util.Timer');
|
|
|
32
33
|
* </p>
|
|
33
34
|
*
|
|
34
35
|
* @implements {shaka.extern.AbrManager}
|
|
36
|
+
* @implements {shaka.util.IReleasable}
|
|
35
37
|
* @export
|
|
36
38
|
*/
|
|
37
39
|
shaka.abr.SimpleAbrManager = class {
|
|
@@ -50,8 +52,8 @@ shaka.abr.SimpleAbrManager = class {
|
|
|
50
52
|
// retrieving information about a user's network connection. We listen
|
|
51
53
|
// to the change event to be able to make quick changes in case the type
|
|
52
54
|
// of connectivity changes.
|
|
53
|
-
if (navigator.connection) {
|
|
54
|
-
|
|
55
|
+
if (navigator.connection && navigator.connection.addEventListener) {
|
|
56
|
+
this.onNetworkInformationChange_ = () => {
|
|
55
57
|
if (this.config_.useNetworkInformation && this.enabled_) {
|
|
56
58
|
this.bandwidthEstimator_ = new shaka.abr.EwmaBandwidthEstimator();
|
|
57
59
|
if (this.config_) {
|
|
@@ -62,7 +64,10 @@ shaka.abr.SimpleAbrManager = class {
|
|
|
62
64
|
this.switch_(chosenVariant);
|
|
63
65
|
}
|
|
64
66
|
}
|
|
65
|
-
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
navigator.connection.addEventListener(
|
|
70
|
+
'change', this.onNetworkInformationChange_);
|
|
66
71
|
}
|
|
67
72
|
|
|
68
73
|
/**
|
|
@@ -93,6 +98,9 @@ shaka.abr.SimpleAbrManager = class {
|
|
|
93
98
|
/** @private {ResizeObserver} */
|
|
94
99
|
this.resizeObserver_ = null;
|
|
95
100
|
|
|
101
|
+
/** @private {?function():void} */
|
|
102
|
+
this.onNetworkInformationChange_ = null;
|
|
103
|
+
|
|
96
104
|
/** @private {shaka.util.Timer} */
|
|
97
105
|
this.resizeObserverTimer_ = new shaka.util.Timer(() => {
|
|
98
106
|
if (this.config_.restrictToElementSize) {
|
|
@@ -128,6 +136,22 @@ shaka.abr.SimpleAbrManager = class {
|
|
|
128
136
|
// can start using bandwidth estimates right away after init() is called.
|
|
129
137
|
}
|
|
130
138
|
|
|
139
|
+
/**
|
|
140
|
+
* @override
|
|
141
|
+
* @export
|
|
142
|
+
*/
|
|
143
|
+
release() {
|
|
144
|
+
// stop() should already have been called for unload
|
|
145
|
+
|
|
146
|
+
if (navigator.connection && navigator.connection.removeEventListener) {
|
|
147
|
+
navigator.connection.removeEventListener(
|
|
148
|
+
'change', this.onNetworkInformationChange_);
|
|
149
|
+
this.onNetworkInformationChange_ = null;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
this.resizeObserverTimer_ = null;
|
|
153
|
+
}
|
|
154
|
+
|
|
131
155
|
|
|
132
156
|
/**
|
|
133
157
|
* @override
|
|
@@ -219,9 +219,9 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
219
219
|
// seen the ads actually play until requestAds() is called.
|
|
220
220
|
// Note: We listen for a play event to avoid autoplay issues that might
|
|
221
221
|
// crash IMA.
|
|
222
|
-
this.
|
|
222
|
+
this.eventManager_.listenOnce(this.video_, 'play', () => {
|
|
223
223
|
this.imaAdsManager_.start();
|
|
224
|
-
}
|
|
224
|
+
});
|
|
225
225
|
} catch (adError) {
|
|
226
226
|
// If there was a problem with the VAST response,
|
|
227
227
|
// we we won't be getting an ad. Hide ad UI if we showed it already
|
|
@@ -427,7 +427,10 @@ shaka.ads.ClientSideAdManager = class {
|
|
|
427
427
|
if (this.ad_.isLinear()) {
|
|
428
428
|
this.adContainer_.setAttribute('ad-active', 'true');
|
|
429
429
|
this.video_.pause();
|
|
430
|
-
this.ad_.setVolume(this.video_.
|
|
430
|
+
this.ad_.setVolume(this.video_.volume);
|
|
431
|
+
if (this.video_.muted) {
|
|
432
|
+
this.ad_.setMuted(true);
|
|
433
|
+
}
|
|
431
434
|
}
|
|
432
435
|
}
|
|
433
436
|
|
package/lib/dash/dash_parser.js
CHANGED
|
@@ -1279,55 +1279,56 @@ shaka.dash.DashParser = class {
|
|
|
1279
1279
|
context.period.id + ',' + context.representation.id : '';
|
|
1280
1280
|
|
|
1281
1281
|
/** @type {shaka.extern.Stream} */
|
|
1282
|
-
|
|
1283
|
-
id: this.globalId_++,
|
|
1284
|
-
originalId: context.representation.id,
|
|
1285
|
-
createSegmentIndex: async () => {
|
|
1286
|
-
// If we have a stream with the same context id stored in the map
|
|
1287
|
-
// that has no segmentIndex, we should set the segmentIndex for it.
|
|
1288
|
-
const storedInMap = contextId && context.dynamic &&
|
|
1289
|
-
this.streamMap_[contextId];
|
|
1290
|
-
|
|
1291
|
-
const currentStream = storedInMap ? this.streamMap_[contextId] : stream;
|
|
1292
|
-
if (!currentStream.segmentIndex) {
|
|
1293
|
-
currentStream.segmentIndex = await streamInfo.generateSegmentIndex();
|
|
1294
|
-
}
|
|
1295
|
-
},
|
|
1282
|
+
let stream;
|
|
1296
1283
|
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1284
|
+
if (contextId && this.streamMap_[contextId]) {
|
|
1285
|
+
stream = this.streamMap_[contextId];
|
|
1286
|
+
} else {
|
|
1287
|
+
stream = {
|
|
1288
|
+
id: this.globalId_++,
|
|
1289
|
+
originalId: context.representation.id,
|
|
1290
|
+
createSegmentIndex: () => Promise.resolve(),
|
|
1291
|
+
closeSegmentIndex: () => {
|
|
1292
|
+
if (stream.segmentIndex) {
|
|
1293
|
+
stream.segmentIndex.release();
|
|
1294
|
+
stream.segmentIndex = null;
|
|
1295
|
+
}
|
|
1296
|
+
},
|
|
1297
|
+
segmentIndex: null,
|
|
1298
|
+
mimeType: context.representation.mimeType,
|
|
1299
|
+
codecs: context.representation.codecs,
|
|
1300
|
+
frameRate: context.representation.frameRate,
|
|
1301
|
+
pixelAspectRatio: context.representation.pixelAspectRatio,
|
|
1302
|
+
bandwidth: context.bandwidth,
|
|
1303
|
+
width: context.representation.width,
|
|
1304
|
+
height: context.representation.height,
|
|
1305
|
+
kind,
|
|
1306
|
+
encrypted: contentProtection.drmInfos.length > 0,
|
|
1307
|
+
drmInfos: contentProtection.drmInfos,
|
|
1308
|
+
keyIds,
|
|
1309
|
+
language,
|
|
1310
|
+
label,
|
|
1311
|
+
type: context.adaptationSet.contentType,
|
|
1312
|
+
primary: isPrimary,
|
|
1313
|
+
trickModeVideo: null,
|
|
1314
|
+
emsgSchemeIdUris:
|
|
1315
|
+
context.representation.emsgSchemeIdUris,
|
|
1316
|
+
roles,
|
|
1317
|
+
forced,
|
|
1318
|
+
channelsCount: context.representation.numChannels,
|
|
1319
|
+
audioSamplingRate: context.representation.audioSamplingRate,
|
|
1320
|
+
spatialAudio,
|
|
1321
|
+
closedCaptions,
|
|
1322
|
+
hdr,
|
|
1323
|
+
tilesLayout,
|
|
1324
|
+
matchedStreams: [],
|
|
1325
|
+
};
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
stream.createSegmentIndex = async () => {
|
|
1329
|
+
if (!stream.segmentIndex) {
|
|
1330
|
+
stream.segmentIndex = await streamInfo.generateSegmentIndex();
|
|
1331
|
+
}
|
|
1331
1332
|
};
|
|
1332
1333
|
|
|
1333
1334
|
if (contextId && context.dynamic && !this.streamMap_[contextId]) {
|
package/lib/debug/log.js
CHANGED
|
@@ -134,23 +134,19 @@ shaka.log.MAX_LOG_LEVEL = 3;
|
|
|
134
134
|
shaka.log.oneTimeWarningIssued_ = new Set();
|
|
135
135
|
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
// IE9 console methods are not Functions and have no bind.
|
|
139
|
-
if (window.console && window.console.log.bind) {
|
|
137
|
+
if (window.console) {
|
|
140
138
|
/** @private {!Object.<shaka.log.Level, function(...*)>} */
|
|
141
139
|
shaka.log.logMap_ = {
|
|
142
|
-
|
|
143
|
-
[shaka.log.Level.
|
|
144
|
-
[shaka.log.Level.
|
|
145
|
-
[shaka.log.Level.
|
|
146
|
-
[shaka.log.Level.
|
|
147
|
-
[shaka.log.Level.
|
|
148
|
-
[shaka.log.Level.V2]: console.debug.bind(console),
|
|
149
|
-
/* eslint-enable no-restricted-syntax */
|
|
140
|
+
[shaka.log.Level.ERROR]: (...args) => console.error(...args),
|
|
141
|
+
[shaka.log.Level.WARNING]: (...args) => console.warn(...args),
|
|
142
|
+
[shaka.log.Level.INFO]: (...args) => console.info(...args),
|
|
143
|
+
[shaka.log.Level.DEBUG]: (...args) => console.log(...args),
|
|
144
|
+
[shaka.log.Level.V1]: (...args) => console.debug(...args),
|
|
145
|
+
[shaka.log.Level.V2]: (...args) => console.debug(...args),
|
|
150
146
|
};
|
|
151
147
|
|
|
152
|
-
shaka.log.alwaysWarn =
|
|
153
|
-
shaka.log.alwaysError =
|
|
148
|
+
shaka.log.alwaysWarn = (...args) => console.warn(...args);
|
|
149
|
+
shaka.log.alwaysError = (...args) => console.error(...args);
|
|
154
150
|
|
|
155
151
|
if (goog.DEBUG) {
|
|
156
152
|
// Since we don't want to export shaka.log in production builds, we don't
|
|
@@ -192,6 +192,9 @@ shaka.media.MediaSourceEngine = class {
|
|
|
192
192
|
'audio/mp4; codecs="ec-3"',
|
|
193
193
|
'audio/mp4; codecs="opus"',
|
|
194
194
|
'audio/mp4; codecs="flac"',
|
|
195
|
+
'audio/mp4; codecs="dtsc"', // DTS Digital Surround
|
|
196
|
+
'audio/mp4; codecs="dtse"', // DTS Express
|
|
197
|
+
'audio/mp4; codecs="dtsx"', // DTS:X
|
|
195
198
|
// WebM types
|
|
196
199
|
'video/webm; codecs="vp8"',
|
|
197
200
|
'video/webm; codecs="vp9"',
|
|
@@ -556,7 +559,8 @@ shaka.media.MediaSourceEngine = class {
|
|
|
556
559
|
// For HLS CEA-608/708 CLOSED-CAPTIONS, text data is embedded in
|
|
557
560
|
// the video stream, so textEngine may not have been initialized.
|
|
558
561
|
if (!this.textEngine_) {
|
|
559
|
-
this.reinitText(
|
|
562
|
+
this.reinitText(shaka.util.MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE,
|
|
563
|
+
this.sequenceMode_);
|
|
560
564
|
}
|
|
561
565
|
|
|
562
566
|
if (transmuxedData.metadata) {
|
|
@@ -584,7 +588,8 @@ shaka.media.MediaSourceEngine = class {
|
|
|
584
588
|
data = transmuxedData.data;
|
|
585
589
|
} else if (hasClosedCaptions) {
|
|
586
590
|
if (!this.textEngine_) {
|
|
587
|
-
this.reinitText(
|
|
591
|
+
this.reinitText(shaka.util.MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE,
|
|
592
|
+
this.sequenceMode_);
|
|
588
593
|
}
|
|
589
594
|
// If it is the init segment for closed captions, initialize the closed
|
|
590
595
|
// caption parser.
|
|
@@ -910,8 +915,10 @@ shaka.media.MediaSourceEngine = class {
|
|
|
910
915
|
async endOfStream(reason) {
|
|
911
916
|
await this.enqueueBlockingOperation_(() => {
|
|
912
917
|
// If endOfStream() has already been called on the media source,
|
|
913
|
-
// don't call it again.
|
|
914
|
-
|
|
918
|
+
// don't call it again. Also do not call if readyState is
|
|
919
|
+
// 'closed' (not attached to video element) since it is not a
|
|
920
|
+
// valid operation.
|
|
921
|
+
if (this.ended() || this.mediaSource_.readyState === 'closed') {
|
|
915
922
|
return;
|
|
916
923
|
}
|
|
917
924
|
// Tizen won't let us pass undefined, but it will let us omit the
|
|
@@ -77,6 +77,9 @@ shaka.media.StreamingEngine = class {
|
|
|
77
77
|
/** @private {?shaka.extern.Stream} */
|
|
78
78
|
this.currentTextStream_ = null;
|
|
79
79
|
|
|
80
|
+
/** @private {number} */
|
|
81
|
+
this.textStreamSequenceId_ = 0;
|
|
82
|
+
|
|
80
83
|
/**
|
|
81
84
|
* Maps a content type, e.g., 'audio', 'video', or 'text', to a MediaState.
|
|
82
85
|
*
|
|
@@ -220,6 +223,8 @@ shaka.media.StreamingEngine = class {
|
|
|
220
223
|
const ContentType = shaka.util.ManifestParserUtils.ContentType;
|
|
221
224
|
goog.asserts.assert(!this.mediaStates_.has(ContentType.TEXT),
|
|
222
225
|
'Should not call loadNewTextStream_ while streaming text!');
|
|
226
|
+
this.textStreamSequenceId_++;
|
|
227
|
+
const currentSequenceId = this.textStreamSequenceId_;
|
|
223
228
|
|
|
224
229
|
try {
|
|
225
230
|
// Clear MediaSource's buffered text, so that the new text stream will
|
|
@@ -242,7 +247,7 @@ shaka.media.StreamingEngine = class {
|
|
|
242
247
|
const streamText =
|
|
243
248
|
textDisplayer.isTextVisible() || this.config_.alwaysStreamText;
|
|
244
249
|
|
|
245
|
-
if (streamText) {
|
|
250
|
+
if (streamText && (this.textStreamSequenceId_ == currentSequenceId)) {
|
|
246
251
|
const state = this.createMediaState_(stream);
|
|
247
252
|
this.mediaStates_.set(ContentType.TEXT, state);
|
|
248
253
|
this.scheduleUpdate_(state, 0);
|
|
@@ -1559,10 +1564,10 @@ shaka.media.StreamingEngine = class {
|
|
|
1559
1564
|
'waiting for another stream to recover...');
|
|
1560
1565
|
}
|
|
1561
1566
|
|
|
1562
|
-
// QuotaExceededError gets thrown if
|
|
1567
|
+
// QuotaExceededError gets thrown if eviction didn't help to make room
|
|
1563
1568
|
// for a segment. We want to wait for a while (4 seconds is just an
|
|
1564
1569
|
// arbitrary number) before updating to give the playhead a chance to
|
|
1565
|
-
// advance, so we don't
|
|
1570
|
+
// advance, so we don't immediately throw again.
|
|
1566
1571
|
this.scheduleUpdate_(mediaState, 4);
|
|
1567
1572
|
}
|
|
1568
1573
|
|