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.
Files changed (35) hide show
  1. package/dist/deps.js +3 -3
  2. package/dist/locales.js +32 -32
  3. package/dist/shaka-player.compiled.d.ts +2 -2
  4. package/dist/shaka-player.compiled.debug.d.ts +2 -2
  5. package/dist/shaka-player.compiled.debug.js +224 -220
  6. package/dist/shaka-player.compiled.debug.map +3 -3
  7. package/dist/shaka-player.compiled.js +1148 -1140
  8. package/dist/shaka-player.compiled.map +4 -4
  9. package/dist/shaka-player.ui.d.ts +2 -2
  10. package/dist/shaka-player.ui.debug.d.ts +2 -2
  11. package/dist/shaka-player.ui.debug.js +355 -350
  12. package/dist/shaka-player.ui.debug.map +3 -3
  13. package/dist/shaka-player.ui.js +1304 -1296
  14. package/dist/shaka-player.ui.map +4 -4
  15. package/externs/shaka/manifest.js +11 -1
  16. package/externs/shaka/offline.js +7 -1
  17. package/lib/dash/dash_parser.js +10 -3
  18. package/lib/dash/segment_base.js +8 -1
  19. package/lib/dash/segment_list.js +24 -18
  20. package/lib/dash/segment_template.js +21 -2
  21. package/lib/hls/hls_parser.js +18 -1
  22. package/lib/media/media_source_engine.js +74 -24
  23. package/lib/media/playhead.js +3 -3
  24. package/lib/media/segment_index.js +21 -20
  25. package/lib/media/streaming_engine.js +2 -14
  26. package/lib/mss/mss_parser.js +4 -0
  27. package/lib/offline/indexeddb/v1_storage_cell.js +2 -0
  28. package/lib/offline/indexeddb/v2_storage_cell.js +2 -0
  29. package/lib/offline/manifest_converter.js +10 -3
  30. package/lib/offline/storage.js +2 -0
  31. package/lib/player.js +16 -3
  32. package/lib/util/mime_utils.js +10 -5
  33. package/lib/util/periods.js +5 -37
  34. package/lib/util/stream_utils.js +334 -271
  35. package/package.json +1 -1
@@ -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
@@ -211,6 +211,8 @@ shaka.offline.indexeddb.V1StorageCell = class
211
211
  appendWindowEnd,
212
212
  timestampOffset,
213
213
  tilesLayout: '',
214
+ mimeType: null,
215
+ codecs: null,
214
216
  };
215
217
  }
216
218
 
@@ -155,6 +155,8 @@ shaka.offline.indexeddb.V2StorageCell = class
155
155
  timestampOffset,
156
156
  dataKey: old.dataKey,
157
157
  tilesLayout: '',
158
+ mimeType: null,
159
+ codecs: null,
158
160
  };
159
161
  }
160
162
  };
@@ -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
- return new shaka.media.SegmentReference(
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
  /**
@@ -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 <= (seekRange.start + safeSeekOffset)) {
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.12' + '-uncompiled'; // x-release-please-version
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.
@@ -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 = [stream.mimeType];
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
- shaka.util.MimeUtils.RAW_FORMATS.includes(stream.mimeType)) {
97
- // Skip codecs for raw formats
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
  }
@@ -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 codec of this stream to the output stream's codecs.
725
- const codecs = new Set(outputStream.codecs.split(','));
726
- for (const codec of match.codecs.split(',')) {
727
- if (codec) {
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