shaka-player 4.7.12 → 4.7.13
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/deps.js +3 -3
- package/dist/locales.js +32 -32
- package/dist/shaka-player.compiled.d.ts +2 -2
- package/dist/shaka-player.compiled.debug.d.ts +2 -2
- package/dist/shaka-player.compiled.debug.js +224 -220
- package/dist/shaka-player.compiled.debug.map +3 -3
- package/dist/shaka-player.compiled.js +1148 -1140
- package/dist/shaka-player.compiled.map +4 -4
- package/dist/shaka-player.ui.d.ts +2 -2
- package/dist/shaka-player.ui.debug.d.ts +2 -2
- package/dist/shaka-player.ui.debug.js +355 -350
- package/dist/shaka-player.ui.debug.map +3 -3
- package/dist/shaka-player.ui.js +1304 -1296
- package/dist/shaka-player.ui.map +4 -4
- package/externs/shaka/manifest.js +11 -1
- package/externs/shaka/offline.js +7 -1
- package/lib/dash/dash_parser.js +10 -3
- package/lib/dash/segment_base.js +8 -1
- package/lib/dash/segment_list.js +24 -18
- package/lib/dash/segment_template.js +21 -2
- package/lib/hls/hls_parser.js +18 -1
- package/lib/media/media_source_engine.js +74 -24
- package/lib/media/playhead.js +3 -3
- package/lib/media/segment_index.js +21 -20
- package/lib/media/streaming_engine.js +2 -14
- package/lib/mss/mss_parser.js +4 -0
- package/lib/offline/indexeddb/v1_storage_cell.js +2 -0
- package/lib/offline/indexeddb/v2_storage_cell.js +2 -0
- package/lib/offline/manifest_converter.js +10 -3
- package/lib/offline/storage.js +2 -0
- package/lib/player.js +16 -3
- package/lib/util/mime_utils.js +10 -5
- package/lib/util/periods.js +5 -37
- package/lib/util/stream_utils.js +334 -271
- package/package.json +1 -1
package/lib/mss/mss_parser.js
CHANGED
|
@@ -19,6 +19,7 @@ goog.require('shaka.net.NetworkingEngine');
|
|
|
19
19
|
goog.require('shaka.util.Error');
|
|
20
20
|
goog.require('shaka.util.LanguageUtils');
|
|
21
21
|
goog.require('shaka.util.ManifestParserUtils');
|
|
22
|
+
goog.require('shaka.util.MimeUtils');
|
|
22
23
|
goog.require('shaka.util.Mp4Generator');
|
|
23
24
|
goog.require('shaka.util.OperationManager');
|
|
24
25
|
goog.require('shaka.util.Timer');
|
|
@@ -556,6 +557,7 @@ shaka.mss.MssParser = class {
|
|
|
556
557
|
accessibilityPurpose: null,
|
|
557
558
|
external: false,
|
|
558
559
|
fastSwitching: false,
|
|
560
|
+
fullMimeTypes: new Set(),
|
|
559
561
|
};
|
|
560
562
|
|
|
561
563
|
// This is specifically for text tracks.
|
|
@@ -634,6 +636,8 @@ shaka.mss.MssParser = class {
|
|
|
634
636
|
}
|
|
635
637
|
break;
|
|
636
638
|
}
|
|
639
|
+
stream.fullMimeTypes.add(shaka.util.MimeUtils.getFullType(
|
|
640
|
+
stream.mimeType, stream.codecs));
|
|
637
641
|
|
|
638
642
|
// Lazy-Load the segment index to avoid create all init segment at the
|
|
639
643
|
// same time
|
|
@@ -14,6 +14,7 @@ goog.require('shaka.media.SegmentIndex');
|
|
|
14
14
|
goog.require('shaka.media.SegmentReference');
|
|
15
15
|
goog.require('shaka.offline.OfflineUri');
|
|
16
16
|
goog.require('shaka.util.ManifestParserUtils');
|
|
17
|
+
goog.require('shaka.util.MimeUtils');
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
/**
|
|
@@ -169,7 +170,7 @@ shaka.offline.ManifestConverter = class {
|
|
|
169
170
|
fromStreamDB_(streamDB, timeline) {
|
|
170
171
|
/** @type {!Array.<!shaka.media.SegmentReference>} */
|
|
171
172
|
const segments = streamDB.segments.map(
|
|
172
|
-
(segment, index) => this.fromSegmentDB_(index, segment));
|
|
173
|
+
(segment, index) => this.fromSegmentDB_(index, segment, streamDB));
|
|
173
174
|
|
|
174
175
|
timeline.notifySegments(segments);
|
|
175
176
|
|
|
@@ -212,6 +213,8 @@ shaka.offline.ManifestConverter = class {
|
|
|
212
213
|
accessibilityPurpose: null,
|
|
213
214
|
external: streamDB.external,
|
|
214
215
|
fastSwitching: streamDB.fastSwitching,
|
|
216
|
+
fullMimeTypes: new Set([shaka.util.MimeUtils.getFullType(
|
|
217
|
+
streamDB.mimeType, streamDB.codecs)]),
|
|
215
218
|
};
|
|
216
219
|
|
|
217
220
|
return stream;
|
|
@@ -220,10 +223,11 @@ shaka.offline.ManifestConverter = class {
|
|
|
220
223
|
/**
|
|
221
224
|
* @param {number} index
|
|
222
225
|
* @param {shaka.extern.SegmentDB} segmentDB
|
|
226
|
+
* @param {shaka.extern.StreamDB} streamDB
|
|
223
227
|
* @return {!shaka.media.SegmentReference}
|
|
224
228
|
* @private
|
|
225
229
|
*/
|
|
226
|
-
fromSegmentDB_(index, segmentDB) {
|
|
230
|
+
fromSegmentDB_(index, segmentDB, streamDB) {
|
|
227
231
|
/** @type {!shaka.offline.OfflineUri} */
|
|
228
232
|
const uri = shaka.offline.OfflineUri.segment(
|
|
229
233
|
this.mechanism_, this.cell_, segmentDB.dataKey);
|
|
@@ -231,7 +235,7 @@ shaka.offline.ManifestConverter = class {
|
|
|
231
235
|
const initSegmentReference = segmentDB.initSegmentKey != null ?
|
|
232
236
|
this.fromInitSegmentDB_(segmentDB.initSegmentKey) : null;
|
|
233
237
|
|
|
234
|
-
|
|
238
|
+
const ref = new shaka.media.SegmentReference(
|
|
235
239
|
segmentDB.startTime,
|
|
236
240
|
segmentDB.endTime,
|
|
237
241
|
() => [uri.toString()],
|
|
@@ -243,6 +247,9 @@ shaka.offline.ManifestConverter = class {
|
|
|
243
247
|
segmentDB.appendWindowEnd,
|
|
244
248
|
/* partialReferences= */ [],
|
|
245
249
|
segmentDB.tilesLayout || '');
|
|
250
|
+
ref.mimeType = segmentDB.mimeType || streamDB.mimeType || '';
|
|
251
|
+
ref.codecs = segmentDB.codecs || streamDB.codecs || '';
|
|
252
|
+
return ref;
|
|
246
253
|
}
|
|
247
254
|
|
|
248
255
|
/**
|
package/lib/offline/storage.js
CHANGED
|
@@ -1389,6 +1389,8 @@ shaka.offline.Storage = class {
|
|
|
1389
1389
|
tilesLayout: segment.tilesLayout,
|
|
1390
1390
|
pendingSegmentRefId,
|
|
1391
1391
|
dataKey: 0,
|
|
1392
|
+
mimeType: segment.mimeType,
|
|
1393
|
+
codecs: segment.codecs,
|
|
1392
1394
|
};
|
|
1393
1395
|
streamDb.segments.push(segmentDB);
|
|
1394
1396
|
groupId = (groupId + 1) % numberOfParallelDownloads;
|
package/lib/player.js
CHANGED
|
@@ -2174,12 +2174,15 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
2174
2174
|
accessibilityPurpose: null,
|
|
2175
2175
|
external: false,
|
|
2176
2176
|
fastSwitching: false,
|
|
2177
|
+
fullMimeTypes: new Set(),
|
|
2177
2178
|
},
|
|
2178
2179
|
bandwidth: 100,
|
|
2179
2180
|
allowedByApplication: true,
|
|
2180
2181
|
allowedByKeySystem: true,
|
|
2181
2182
|
decodingInfos: [],
|
|
2182
2183
|
};
|
|
2184
|
+
variant.video.fullMimeTypes.add(shaka.util.MimeUtils.getFullType(
|
|
2185
|
+
variant.video.mimeType, variant.video.codecs));
|
|
2183
2186
|
|
|
2184
2187
|
this.drmEngine_.setSrcEquals(/* srcEquals= */ true);
|
|
2185
2188
|
await this.drmEngine_.initForPlayback(
|
|
@@ -3620,12 +3623,16 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
3620
3623
|
const currentTime = this.video_.currentTime;
|
|
3621
3624
|
const seekRange = this.seekRange();
|
|
3622
3625
|
const safeSeekOffset = this.config_.streaming.safeSeekOffset;
|
|
3626
|
+
|
|
3627
|
+
// Cancel trick play if we hit the beginning or end of the seekable
|
|
3628
|
+
// (Sub-second accuracy not required here)
|
|
3623
3629
|
if (rate > 0) {
|
|
3624
|
-
if (currentTime >= seekRange.end) {
|
|
3630
|
+
if (Math.floor(currentTime) >= Math.floor(seekRange.end)) {
|
|
3625
3631
|
this.cancelTrickPlay();
|
|
3626
3632
|
}
|
|
3627
3633
|
} else {
|
|
3628
|
-
if (currentTime <=
|
|
3634
|
+
if (Math.floor(currentTime) <=
|
|
3635
|
+
Math.floor(seekRange.start + safeSeekOffset)) {
|
|
3629
3636
|
this.cancelTrickPlay();
|
|
3630
3637
|
}
|
|
3631
3638
|
}
|
|
@@ -4804,6 +4811,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
4804
4811
|
accessibilityPurpose: null,
|
|
4805
4812
|
external: true,
|
|
4806
4813
|
fastSwitching: false,
|
|
4814
|
+
fullMimeTypes: new Set([shaka.util.MimeUtils.getFullType(
|
|
4815
|
+
mimeType || '', codec || '')]),
|
|
4807
4816
|
};
|
|
4808
4817
|
|
|
4809
4818
|
const fullMimeType = shaka.util.MimeUtils.getFullType(
|
|
@@ -4960,6 +4969,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
4960
4969
|
accessibilityPurpose: null,
|
|
4961
4970
|
external: true,
|
|
4962
4971
|
fastSwitching: false,
|
|
4972
|
+
fullMimeTypes: new Set([shaka.util.MimeUtils.getFullType(
|
|
4973
|
+
mimeType || '', '')]),
|
|
4963
4974
|
};
|
|
4964
4975
|
|
|
4965
4976
|
if (this.loadMode_ == shaka.Player.LoadMode.SRC_EQUALS) {
|
|
@@ -5390,6 +5401,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
|
|
|
5390
5401
|
accessibilityPurpose: null,
|
|
5391
5402
|
external: false,
|
|
5392
5403
|
fastSwitching: false,
|
|
5404
|
+
fullMimeTypes: new Set([shaka.util.MimeUtils.getFullType(
|
|
5405
|
+
mimeType, '')]),
|
|
5393
5406
|
};
|
|
5394
5407
|
manifest.textStreams.push(textStream);
|
|
5395
5408
|
closedCaptionsSet.add(id);
|
|
@@ -6947,7 +6960,7 @@ shaka.Player.TYPICAL_BUFFERING_THRESHOLD_ = 0.5;
|
|
|
6947
6960
|
* @export
|
|
6948
6961
|
*/
|
|
6949
6962
|
// eslint-disable-next-line no-useless-concat
|
|
6950
|
-
shaka.Player.version = 'v4.7.
|
|
6963
|
+
shaka.Player.version = 'v4.7.13' + '-uncompiled'; // x-release-please-version
|
|
6951
6964
|
|
|
6952
6965
|
// Initialize the deprecation system using the version string we just set
|
|
6953
6966
|
// on the player.
|
package/lib/util/mime_utils.js
CHANGED
|
@@ -84,17 +84,22 @@ shaka.util.MimeUtils = class {
|
|
|
84
84
|
* beyond the container and codec type, when available.
|
|
85
85
|
*
|
|
86
86
|
* @param {shaka.extern.Stream} stream
|
|
87
|
+
* @param {string} mimeType
|
|
88
|
+
* @param {string} codecs
|
|
87
89
|
* @return {string}
|
|
88
90
|
*/
|
|
89
|
-
static getExtendedType(stream) {
|
|
90
|
-
const components = [
|
|
91
|
+
static getExtendedType(stream, mimeType, codecs) {
|
|
92
|
+
const components = [mimeType];
|
|
91
93
|
|
|
92
94
|
const extendedMimeParams = shaka.util.MimeUtils.EXTENDED_MIME_PARAMETERS_;
|
|
93
95
|
extendedMimeParams.forEach((mimeKey, streamKey) => {
|
|
94
96
|
const value = stream[streamKey];
|
|
95
|
-
if (streamKey == 'codecs'
|
|
96
|
-
|
|
97
|
-
|
|
97
|
+
if (streamKey == 'codecs') {
|
|
98
|
+
if (shaka.util.MimeUtils.RAW_FORMATS.includes(stream.mimeType)) {
|
|
99
|
+
// Skip codecs for raw formats
|
|
100
|
+
} else {
|
|
101
|
+
components.push('codecs="' + codecs + '"');
|
|
102
|
+
}
|
|
98
103
|
} else if (value) {
|
|
99
104
|
components.push(mimeKey + '="' + value + '"');
|
|
100
105
|
}
|
package/lib/util/periods.js
CHANGED
|
@@ -599,14 +599,6 @@ shaka.util.PeriodCombiner = class {
|
|
|
599
599
|
goog.asserts.assert(match.segmentIndex,
|
|
600
600
|
'stream should have a segmentIndex.');
|
|
601
601
|
if (match.segmentIndex) {
|
|
602
|
-
match.segmentIndex.forEachTopLevelReference((ref) => {
|
|
603
|
-
ref.codecs = match.codecs;
|
|
604
|
-
ref.mimeType = match.mimeType;
|
|
605
|
-
if (ref.initSegmentReference) {
|
|
606
|
-
ref.initSegmentReference.codecs = match.codecs;
|
|
607
|
-
ref.initSegmentReference.mimeType = match.mimeType;
|
|
608
|
-
}
|
|
609
|
-
});
|
|
610
602
|
outputStream.segmentIndex.appendSegmentIndex(match.segmentIndex);
|
|
611
603
|
}
|
|
612
604
|
}
|
|
@@ -721,39 +713,14 @@ shaka.util.PeriodCombiner = class {
|
|
|
721
713
|
|
|
722
714
|
if (used) {
|
|
723
715
|
unusedStreamsPerPeriod[i].delete(match);
|
|
724
|
-
// Add the
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
codecs.add(codec);
|
|
716
|
+
// Add the full mimetypes to the stream.
|
|
717
|
+
if (match.fullMimeTypes) {
|
|
718
|
+
for (const fullMimeType of match.fullMimeTypes.values()) {
|
|
719
|
+
outputStream.fullMimeTypes.add(fullMimeType);
|
|
729
720
|
}
|
|
730
721
|
}
|
|
731
|
-
const PeriodCombiner = shaka.util.PeriodCombiner;
|
|
732
|
-
outputStream.codecs = PeriodCombiner.filterDuplicateCodecs_(
|
|
733
|
-
Array.from(codecs)).join(',');
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
|
|
738
|
-
/**
|
|
739
|
-
* @param {!Array.<string>} codecs
|
|
740
|
-
* @return {!Array.<string>} codecs
|
|
741
|
-
* @private
|
|
742
|
-
*/
|
|
743
|
-
static filterDuplicateCodecs_(codecs) {
|
|
744
|
-
// Filter out duplicate codecs.
|
|
745
|
-
const seen = new Set();
|
|
746
|
-
const ret = [];
|
|
747
|
-
for (const codec of codecs) {
|
|
748
|
-
const shortCodec = shaka.util.MimeUtils.getCodecBase(codec);
|
|
749
|
-
if (!seen.has(shortCodec)) {
|
|
750
|
-
ret.push(codec);
|
|
751
|
-
seen.add(shortCodec);
|
|
752
|
-
} else {
|
|
753
|
-
shaka.log.debug('Ignoring duplicate codec');
|
|
754
722
|
}
|
|
755
723
|
}
|
|
756
|
-
return ret;
|
|
757
724
|
}
|
|
758
725
|
|
|
759
726
|
/**
|
|
@@ -1578,6 +1545,7 @@ shaka.util.PeriodCombiner = class {
|
|
|
1578
1545
|
accessibilityPurpose: null,
|
|
1579
1546
|
external: false,
|
|
1580
1547
|
fastSwitching: false,
|
|
1548
|
+
fullMimeTypes: new Set(),
|
|
1581
1549
|
};
|
|
1582
1550
|
}
|
|
1583
1551
|
|