shaka-player 4.5.0 → 4.6.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.
Files changed (214) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  2. package/AUTHORS +2 -0
  3. package/CHANGELOG.md +98 -0
  4. package/CODE_OF_CONDUCT.md +1 -1
  5. package/CONTRIBUTORS +2 -0
  6. package/README.md +38 -32
  7. package/demo/common/asset.js +11 -17
  8. package/demo/common/assets.js +117 -11
  9. package/demo/config.js +28 -1
  10. package/demo/custom.js +52 -38
  11. package/demo/main.js +11 -3
  12. package/demo/search.js +7 -0
  13. package/dist/controls.css +1 -1
  14. package/dist/controls.css.map +1 -1
  15. package/dist/demo.compiled.debug.js +133 -124
  16. package/dist/demo.compiled.debug.map +3 -3
  17. package/dist/demo.compiled.js +133 -124
  18. package/dist/demo.compiled.map +3 -3
  19. package/dist/deps.js +20 -18
  20. package/dist/locales.js +35 -31
  21. package/dist/receiver.compiled.debug.js +58 -50
  22. package/dist/receiver.compiled.debug.map +3 -3
  23. package/dist/receiver.compiled.js +58 -50
  24. package/dist/receiver.compiled.map +3 -3
  25. package/dist/shaka-player.compiled.d.ts +440 -390
  26. package/dist/shaka-player.compiled.debug.d.ts +440 -390
  27. package/dist/shaka-player.compiled.debug.externs.js +162 -77
  28. package/dist/shaka-player.compiled.debug.js +786 -736
  29. package/dist/shaka-player.compiled.debug.map +4 -4
  30. package/dist/shaka-player.compiled.externs.js +162 -77
  31. package/dist/shaka-player.compiled.js +1154 -1121
  32. package/dist/shaka-player.compiled.map +4 -4
  33. package/dist/shaka-player.ui.d.ts +491 -437
  34. package/dist/shaka-player.ui.debug.d.ts +491 -437
  35. package/dist/shaka-player.ui.debug.externs.js +167 -77
  36. package/dist/shaka-player.ui.debug.js +877 -811
  37. package/dist/shaka-player.ui.debug.map +4 -4
  38. package/dist/shaka-player.ui.externs.js +167 -77
  39. package/dist/shaka-player.ui.js +1362 -1318
  40. package/dist/shaka-player.ui.map +4 -4
  41. package/docs/tutorials/ad_monetization.md +54 -0
  42. package/docs/tutorials/basic-usage.md +2 -1
  43. package/docs/tutorials/errors.md +2 -1
  44. package/docs/tutorials/offline.md +10 -8
  45. package/docs/tutorials/plugins.md +5 -0
  46. package/docs/tutorials/ui-customization.md +13 -0
  47. package/docs/tutorials/ui.md +2 -1
  48. package/docs/tutorials/upgrade.md +3 -0
  49. package/externs/managedmediasource.js +24 -0
  50. package/externs/shaka/abr_manager.js +6 -2
  51. package/externs/shaka/cea.js +7 -0
  52. package/externs/shaka/codecs.js +5 -3
  53. package/externs/shaka/manifest.js +21 -5
  54. package/externs/shaka/manifest_parser.js +17 -0
  55. package/externs/shaka/net.js +2 -2
  56. package/externs/shaka/offline.js +9 -2
  57. package/externs/shaka/player.js +53 -7
  58. package/externs/shaka/text.js +3 -1
  59. package/externs/shaka/transmuxer.js +1 -1
  60. package/lib/abr/simple_abr_manager.js +25 -8
  61. package/lib/ads/media_tailor_ad_manager.js +14 -3
  62. package/lib/cast/cast_receiver.js +1 -1
  63. package/lib/cea/cea_decoder.js +28 -0
  64. package/lib/cea/dummy_caption_decoder.js +5 -0
  65. package/lib/dash/dash_parser.js +249 -83
  66. package/lib/dash/mpd_utils.js +52 -31
  67. package/lib/dash/segment_base.js +4 -5
  68. package/lib/dash/segment_list.js +5 -4
  69. package/lib/dash/segment_template.js +83 -26
  70. package/lib/hls/hls_classes.js +28 -43
  71. package/lib/hls/hls_parser.js +761 -649
  72. package/lib/hls/hls_utils.js +64 -5
  73. package/lib/hls/manifest_text_parser.js +7 -11
  74. package/lib/media/adaptation_set.js +20 -13
  75. package/lib/media/adaptation_set_criteria.js +70 -18
  76. package/lib/media/closed_caption_parser.js +13 -0
  77. package/lib/media/content_workarounds.js +6 -0
  78. package/lib/media/drm_engine.js +8 -13
  79. package/lib/media/manifest_parser.js +8 -113
  80. package/lib/media/media_source_capabilities.js +10 -3
  81. package/lib/media/media_source_engine.js +75 -21
  82. package/lib/media/play_rate_controller.js +8 -38
  83. package/lib/media/presentation_timeline.js +7 -1
  84. package/lib/media/quality_observer.js +1 -1
  85. package/lib/media/segment_index.js +5 -5
  86. package/lib/media/segment_prefetch.js +92 -24
  87. package/lib/media/segment_reference.js +67 -1
  88. package/lib/media/segment_utils.js +343 -0
  89. package/lib/media/stall_detector.js +0 -3
  90. package/lib/media/streaming_engine.js +41 -21
  91. package/lib/mss/mss_parser.js +18 -2
  92. package/lib/net/networking_engine.js +66 -12
  93. package/lib/net/networking_utils.js +95 -0
  94. package/lib/offline/indexeddb/v1_storage_cell.js +2 -0
  95. package/lib/offline/indexeddb/v2_storage_cell.js +2 -0
  96. package/lib/offline/manifest_converter.js +2 -0
  97. package/lib/offline/offline_manifest_parser.js +10 -0
  98. package/lib/offline/storage.js +11 -7
  99. package/lib/player.js +993 -1502
  100. package/lib/polyfill/mediasource.js +22 -1
  101. package/lib/text/mp4_ttml_parser.js +2 -2
  102. package/lib/text/srt_text_parser.js +2 -2
  103. package/lib/text/stub_text_displayer.js +51 -0
  104. package/lib/text/text_engine.js +3 -2
  105. package/lib/text/ttml_text_parser.js +28 -5
  106. package/lib/text/ui_text_displayer.js +4 -0
  107. package/lib/text/vtt_text_parser.js +7 -2
  108. package/lib/transmuxer/aac_transmuxer.js +1 -1
  109. package/lib/transmuxer/ac3_transmuxer.js +1 -1
  110. package/lib/transmuxer/ec3_transmuxer.js +1 -1
  111. package/lib/transmuxer/h264.js +5 -4
  112. package/lib/transmuxer/h265.js +5 -4
  113. package/lib/transmuxer/mp3_transmuxer.js +1 -1
  114. package/lib/transmuxer/mpeg_ts_transmuxer.js +1 -1
  115. package/lib/transmuxer/mss_transmuxer.js +1 -1
  116. package/lib/transmuxer/ts_transmuxer.js +33 -13
  117. package/lib/util/buffer_utils.js +26 -4
  118. package/lib/util/content_steering_manager.js +358 -0
  119. package/lib/util/error.js +2 -6
  120. package/lib/util/fairplay_utils.js +1 -1
  121. package/lib/util/fake_event.js +5 -1
  122. package/lib/util/id3_utils.js +50 -1
  123. package/lib/util/manifest_parser_utils.js +12 -8
  124. package/lib/util/mp4_generator.js +2 -4
  125. package/lib/util/mutex.js +59 -0
  126. package/lib/util/object_utils.js +1 -1
  127. package/lib/util/periods.js +154 -179
  128. package/lib/util/platform.js +4 -3
  129. package/lib/util/player_configuration.js +35 -6
  130. package/lib/util/stream_utils.js +105 -98
  131. package/lib/util/ts_parser.js +124 -73
  132. package/lib/util/uint8array_utils.js +5 -1
  133. package/lib/util/xml_utils.js +5 -0
  134. package/maintained-branches.md +2 -2
  135. package/package.json +1 -1
  136. package/roadmap.md +15 -5
  137. package/shaka-player.uncompiled.js +0 -1
  138. package/test/abr/simple_abr_manager_unit.js +33 -33
  139. package/test/ads/ad_manager_unit.js +3 -2
  140. package/test/cast/cast_receiver_integration.js +3 -4
  141. package/test/cast/cast_utils_unit.js +2 -0
  142. package/test/cea/cea_decoder_unit.js +7 -0
  143. package/test/codec_switching/codec_switching_integration.js +2 -1
  144. package/test/dash/dash_parser_integration.js +2 -1
  145. package/test/dash/dash_parser_live_unit.js +0 -19
  146. package/test/dash/dash_parser_manifest_unit.js +494 -2
  147. package/test/dash/mpd_utils_unit.js +61 -30
  148. package/test/hls/hls_live_unit.js +12 -3
  149. package/test/hls/hls_parser_unit.js +377 -27
  150. package/test/hls/manifest_text_parser_unit.js +32 -99
  151. package/test/media/adaptation_set_criteria_unit.js +172 -21
  152. package/test/media/adaptation_set_unit.js +1 -0
  153. package/test/media/content_workarounds_unit.js +1 -1
  154. package/test/media/drm_engine_unit.js +3 -3
  155. package/test/media/media_source_engine_unit.js +1 -1
  156. package/test/media/play_rate_controller_unit.js +0 -48
  157. package/test/media/segment_index_unit.js +2 -1
  158. package/test/mss/mss_player_integration.js +3 -2
  159. package/test/net/networking_engine_unit.js +3 -3
  160. package/test/{media/manifest_parser_unit.js → net/networking_utils_unit.js} +2 -2
  161. package/test/offline/manifest_convert_unit.js +9 -0
  162. package/test/offline/offline_integration.js +2 -1
  163. package/test/offline/storage_integration.js +21 -9
  164. package/test/player_external.js +4 -2
  165. package/test/player_integration.js +15 -4
  166. package/test/player_load_graph_integration.js +47 -151
  167. package/test/player_src_equals_external.js +1 -0
  168. package/test/player_src_equals_integration.js +71 -4
  169. package/test/player_unit.js +80 -27
  170. package/test/test/util/fake_media_source_engine.js +5 -0
  171. package/test/test/util/fake_networking_engine.js +9 -1
  172. package/test/test/util/fake_segment_prefetch.js +3 -0
  173. package/test/test/util/manifest_generator.js +4 -0
  174. package/test/test/util/manifest_parser_util.js +14 -2
  175. package/test/test/util/offline_utils.js +1 -0
  176. package/test/test/util/simple_fakes.js +2 -2
  177. package/test/test/util/streaming_engine_util.js +3 -0
  178. package/test/test/util/test_scheme.js +6 -0
  179. package/test/test/util/ui_utils.js +4 -3
  180. package/test/text/mp4_ttml_parser_unit.js +4 -4
  181. package/test/text/srt_text_parser_unit.js +1 -1
  182. package/test/text/text_displayer_layout_unit.js +1 -1
  183. package/test/text/text_engine_unit.js +6 -0
  184. package/test/text/ttml_text_parser_unit.js +33 -2
  185. package/test/transmuxer/transmuxer_engine_integration.js +9 -0
  186. package/test/transmuxer/transmuxer_integration.js +33 -3
  187. package/test/ui/ad_ui_unit.js +2 -2
  188. package/test/ui/ui_customization_unit.js +17 -16
  189. package/test/ui/ui_integration.js +30 -20
  190. package/test/ui/ui_unit.js +25 -19
  191. package/test/util/buffer_utils_unit.js +1 -1
  192. package/test/util/content_steering_manager_unit.js +427 -0
  193. package/test/util/id3_utils_unit.js +52 -0
  194. package/test/util/stream_utils_unit.js +17 -113
  195. package/test/util/ts_parser_unit.js +3 -3
  196. package/third_party/closure-uri/uri.js +13 -1
  197. package/ui/audio_language_selection.js +9 -2
  198. package/ui/externs/ui.js +17 -2
  199. package/ui/language_utils.js +43 -8
  200. package/ui/less/range_elements.less +33 -0
  201. package/ui/locales/en.json +1 -0
  202. package/ui/locales/es-419.json +1 -0
  203. package/ui/locales/es.json +1 -0
  204. package/ui/locales/source.json +4 -0
  205. package/ui/localization.js +10 -0
  206. package/ui/remote_button.js +3 -1
  207. package/ui/resolution_selection.js +47 -10
  208. package/ui/seek_bar.js +296 -3
  209. package/ui/text_selection.js +2 -1
  210. package/ui/ui.js +6 -2
  211. package/lib/routing/node.js +0 -23
  212. package/lib/routing/payload.js +0 -47
  213. package/lib/routing/walker.js +0 -587
  214. package/test/routing/walker_unit.js +0 -505
@@ -7,7 +7,7 @@
7
7
  describe('ContentWorkarounds', () => {
8
8
  const encryptionBoxes = {
9
9
  'encv': ['hev1', 'hvc1', 'avc1', 'avc3'],
10
- 'enca': ['ac-3', 'ec-3', 'mp4a'],
10
+ 'enca': ['ac-3', 'ec-3', 'ac-4', 'mp4a'],
11
11
  };
12
12
  for (const encryptionBox of Object.keys(encryptionBoxes)) {
13
13
  for (const box of encryptionBoxes[encryptionBox]) {
@@ -2313,7 +2313,7 @@ describe('DrmEngine', () => {
2313
2313
  videoRobustness: 'really_really_ridiculously_good',
2314
2314
  serverCertificate: serverCert,
2315
2315
  serverCertificateUri: '',
2316
- initData: ['blah'],
2316
+ initData: [{keyId: 'a'}],
2317
2317
  keyIds: new Set(['deadbeefdeadbeefdeadbeefdeadbeef']),
2318
2318
  };
2319
2319
  const drmInfoAudio = {
@@ -2324,7 +2324,7 @@ describe('DrmEngine', () => {
2324
2324
  audioRobustness: 'good',
2325
2325
  serverCertificate: undefined,
2326
2326
  serverCertificateUri: '',
2327
- initData: ['init data'],
2327
+ initData: [{keyId: 'b'}],
2328
2328
  keyIds: new Set(['eadbeefdeadbeefdeadbeefdeadbeefd']),
2329
2329
  };
2330
2330
  const drmInfoDesired = {
@@ -2336,7 +2336,7 @@ describe('DrmEngine', () => {
2336
2336
  videoRobustness: 'really_really_ridiculously_good',
2337
2337
  serverCertificate: serverCert,
2338
2338
  serverCertificateUri: '',
2339
- initData: ['blah', 'init data'],
2339
+ initData: [{keyId: 'a'}, {keyId: 'b'}],
2340
2340
  keyIds: new Set([
2341
2341
  'deadbeefdeadbeefdeadbeefdeadbeef',
2342
2342
  'eadbeefdeadbeefdeadbeefdeadbeefd',
@@ -631,7 +631,7 @@ describe('MediaSourceEngine', () => {
631
631
  ContentType.TEXT, data, reference, fakeStream,
632
632
  /* hasClosedCaptions= */ false);
633
633
  expect(mockTextEngine.appendBuffer).toHaveBeenCalledWith(
634
- data, 0, 10);
634
+ data, 0, 10, 'foo://bar');
635
635
  });
636
636
 
637
637
  it('appends transmuxed data', async () => {
@@ -57,54 +57,6 @@ describe('PlayRateController', () => {
57
57
  expect(setPlayRateSpy).toHaveBeenCalledWith(0);
58
58
  });
59
59
 
60
- it('buffering state sets rate to zero', () => {
61
- controller.setBuffering(true);
62
- expect(setPlayRateSpy).toHaveBeenCalledWith(0);
63
-
64
- setPlayRateSpy.calls.reset();
65
-
66
- controller.setBuffering(false);
67
- expect(setPlayRateSpy).toHaveBeenCalledWith(1);
68
- });
69
-
70
- it('entering buffering state twice has no effect', () => {
71
- controller.setBuffering(true);
72
- expect(setPlayRateSpy).toHaveBeenCalledWith(0);
73
-
74
- // Reset the calls so that we can make sure it was not called again.
75
- setPlayRateSpy.calls.reset();
76
-
77
- controller.setBuffering(true);
78
- expect(setPlayRateSpy).not.toHaveBeenCalled();
79
- });
80
-
81
- it('leaving buffering state twice has no effect', () => {
82
- controller.setBuffering(true);
83
- controller.setBuffering(false);
84
-
85
- // Reset the calls so that we can make sure it was not called again.
86
- setPlayRateSpy.calls.reset();
87
-
88
- controller.setBuffering(false);
89
- expect(setPlayRateSpy).not.toHaveBeenCalled();
90
- });
91
-
92
- // When we set the rate while in a buffering state, we should see the new
93
- // rate be used once we leave the buffering state.
94
- it('set takes effect after buffering state ends', () => {
95
- controller.setBuffering(true);
96
- expect(setPlayRateSpy).toHaveBeenCalledWith(0);
97
-
98
- // Reset so that we can make sure it was not called after we call |set(4)|.
99
- setPlayRateSpy.calls.reset();
100
-
101
- controller.set(4);
102
- expect(setPlayRateSpy).not.toHaveBeenCalled();
103
-
104
- controller.setBuffering(false);
105
- expect(setPlayRateSpy).toHaveBeenCalledWith(4);
106
- });
107
-
108
60
  // Make sure that when the playback rate set, if the new rate matches the
109
61
  // current rate, the controller will not set the rate on the media element.
110
62
  it('does not redundently set the playrate', () => {
@@ -1074,6 +1074,7 @@ describe('SegmentIndex', /** @suppress {accessControls} */ () => {
1074
1074
  /* tileDuration= */ undefined,
1075
1075
  /* syncTime= */ undefined,
1076
1076
  /* status= */ undefined,
1077
- /* aes128Key= */ aes128Key);
1077
+ /* aes128Key= */ aes128Key,
1078
+ /* allPartialSegments= */ partialReferences.length > 0);
1078
1079
  }
1079
1080
  });
@@ -38,8 +38,9 @@ describe('MSS Player', () => {
38
38
  await shaka.test.Loader.loadShaka(getClientArg('uncompiled'));
39
39
  });
40
40
 
41
- beforeEach(() => {
42
- player = new compiledShaka.Player(video);
41
+ beforeEach(async () => {
42
+ player = new compiledShaka.Player();
43
+ await player.attach(video);
43
44
 
44
45
  // Make sure we are playing the lowest res available to avoid test flake
45
46
  // based on network issues. Note that disabling ABR and setting a low
@@ -1166,14 +1166,14 @@ describe('NetworkingEngine', /** @suppress {accessControls} */ () => {
1166
1166
  requestType, createRequest('resolve://'));
1167
1167
  await Util.shortDelay(); // Allow Promises to resolve.
1168
1168
  expect(onProgress).toHaveBeenCalledTimes(2);
1169
- expect(onProgress).toHaveBeenCalledWith(1, 2);
1170
- expect(onProgress).toHaveBeenCalledWith(4, 5);
1169
+ expect(onProgress).toHaveBeenCalledWith(1, 2, true);
1170
+ expect(onProgress).toHaveBeenCalledWith(4, 5, true);
1171
1171
  onProgress.calls.reset();
1172
1172
 
1173
1173
  delay.resolve();
1174
1174
  await resp.promise;
1175
1175
  expect(onProgress).toHaveBeenCalledTimes(1);
1176
- expect(onProgress).toHaveBeenCalledWith(7, 8);
1176
+ expect(onProgress).toHaveBeenCalledWith(7, 8, true);
1177
1177
  });
1178
1178
 
1179
1179
  it('doesn\'t forward progress events for non-SEGMENT', async () => {
@@ -7,13 +7,13 @@
7
7
  const testGetMimeType = async (expertedMimeType, contentType) => {
8
8
  const netEngine = new shaka.test.FakeNetworkingEngine()
9
9
  .setHeaders('dummy://foo', {'content-type': contentType});
10
- const mimeType = await shaka.media.ManifestParser
10
+ const mimeType = await shaka.net.NetworkingUtils
11
11
  .getMimeType('dummy://foo', netEngine,
12
12
  shaka.net.NetworkingEngine.defaultRetryParameters());
13
13
  expect(mimeType).toBe(expertedMimeType);
14
14
  };
15
15
 
16
- describe('ManifestParser', () => {
16
+ describe('NetworkingUtils', () => {
17
17
  describe('getMimeType', () => {
18
18
  it('test correct mimeType', () => {
19
19
  testGetMimeType('application/dash+xml', 'application/dash+xml');
@@ -319,6 +319,7 @@ describe('ManifestConverter', () => {
319
319
  spatialAudio: false,
320
320
  closedCaptions: null,
321
321
  external: false,
322
+ fastSwitching: false,
322
323
  };
323
324
 
324
325
  return streamDB;
@@ -364,6 +365,7 @@ describe('ManifestConverter', () => {
364
365
  frameRate: 22,
365
366
  pixelAspectRatio: '59:54',
366
367
  hdr: undefined,
368
+ videoLayout: undefined,
367
369
  kind: undefined,
368
370
  language: '',
369
371
  originalLanguage: null,
@@ -396,6 +398,7 @@ describe('ManifestConverter', () => {
396
398
  tilesLayout: undefined,
397
399
  accessibilityPurpose: null,
398
400
  external: false,
401
+ fastSwitching: false,
399
402
  };
400
403
  }
401
404
 
@@ -417,6 +420,7 @@ describe('ManifestConverter', () => {
417
420
  frameRate: undefined,
418
421
  pixelAspectRatio: undefined,
419
422
  hdr: undefined,
423
+ videoLayout: undefined,
420
424
  kind: undefined,
421
425
  language: 'en',
422
426
  originalLanguage: 'en',
@@ -449,6 +453,7 @@ describe('ManifestConverter', () => {
449
453
  tilesLayout: undefined,
450
454
  accessibilityPurpose: null,
451
455
  external: false,
456
+ fastSwitching: false,
452
457
  };
453
458
  }
454
459
 
@@ -469,6 +474,7 @@ describe('ManifestConverter', () => {
469
474
  frameRate: undefined,
470
475
  pixelAspectRatio: undefined,
471
476
  hdr: undefined,
477
+ videoLayout: undefined,
472
478
  kind: undefined,
473
479
  language: 'en',
474
480
  originalLanguage: 'en',
@@ -501,6 +507,7 @@ describe('ManifestConverter', () => {
501
507
  tilesLayout: undefined,
502
508
  accessibilityPurpose: null,
503
509
  external: false,
510
+ fastSwitching: false,
504
511
  };
505
512
  }
506
513
 
@@ -528,6 +535,7 @@ describe('ManifestConverter', () => {
528
535
  frameRate: streamDb.frameRate,
529
536
  pixelAspectRatio: streamDb.pixelAspectRatio,
530
537
  hdr: streamDb.hdr,
538
+ videoLayout: streamDb.videoLayout,
531
539
  width: streamDb.width || undefined,
532
540
  height: streamDb.height || undefined,
533
541
  kind: streamDb.kind,
@@ -550,6 +558,7 @@ describe('ManifestConverter', () => {
550
558
  tilesLayout: streamDb.tilesLayout,
551
559
  accessibilityPurpose: null,
552
560
  external: streamDb.external,
561
+ fastSwitching: streamDb.fastSwitching,
553
562
  };
554
563
 
555
564
  expect(stream).toEqual(expectedStream);
@@ -30,7 +30,8 @@ filterDescribe('Offline', supportsStorage, () => {
30
30
  });
31
31
 
32
32
  beforeEach(async () => {
33
- player = new shaka.Player(video);
33
+ player = new shaka.Player();
34
+ await player.attach(video);
34
35
  player.addEventListener('error', fail);
35
36
 
36
37
  // Disable stall detection, which can interfere with playback tests.
@@ -269,7 +269,7 @@ filterDescribe('Storage', storageSupport, () => {
269
269
  ];
270
270
 
271
271
  const selected =
272
- PlayerConfiguration.defaultTrackSelect(tracks, englishUS);
272
+ PlayerConfiguration.defaultTrackSelect(tracks, englishUS, 'SDR');
273
273
  expect(selected).toBeTruthy();
274
274
  expect(selected.length).toBe(1);
275
275
  expect(selected[0]).toBeTruthy();
@@ -285,7 +285,7 @@ filterDescribe('Storage', storageSupport, () => {
285
285
  ];
286
286
 
287
287
  const selected =
288
- PlayerConfiguration.defaultTrackSelect(tracks, englishUS);
288
+ PlayerConfiguration.defaultTrackSelect(tracks, englishUS, 'SDR');
289
289
  expect(selected).toBeTruthy();
290
290
  expect(selected.length).toBe(2);
291
291
  for (const track of tracks) {
@@ -302,7 +302,7 @@ filterDescribe('Storage', storageSupport, () => {
302
302
  ];
303
303
 
304
304
  const selected =
305
- PlayerConfiguration.defaultTrackSelect(tracks, 'eng-us');
305
+ PlayerConfiguration.defaultTrackSelect(tracks, 'eng-us', 'SDR');
306
306
  expect(selected).toBeTruthy();
307
307
  expect(selected.length).toBe(1);
308
308
  expect(selected[0]).toBeTruthy();
@@ -317,7 +317,8 @@ filterDescribe('Storage', storageSupport, () => {
317
317
  variantTrack(3, 480, 'eng', kbps(1)),
318
318
  ];
319
319
 
320
- const selected = PlayerConfiguration.defaultTrackSelect(tracks, 'eng');
320
+ const selected =
321
+ PlayerConfiguration.defaultTrackSelect(tracks, 'eng', 'SDR');
321
322
  expect(selected).toBeTruthy();
322
323
  expect(selected.length).toBe(1);
323
324
  expect(selected[0]).toBeTruthy();
@@ -331,7 +332,8 @@ filterDescribe('Storage', storageSupport, () => {
331
332
  variantTrack(2, 480, 'eng-ca', kbps(1)),
332
333
  ];
333
334
 
334
- const selected = PlayerConfiguration.defaultTrackSelect(tracks, 'fr');
335
+ const selected =
336
+ PlayerConfiguration.defaultTrackSelect(tracks, 'fr', 'SDR');
335
337
  expect(selected).toBeTruthy();
336
338
  expect(selected.length).toBe(1);
337
339
  expect(selected[0]).toBeTruthy();
@@ -346,7 +348,7 @@ filterDescribe('Storage', storageSupport, () => {
346
348
  ];
347
349
 
348
350
  const selected =
349
- PlayerConfiguration.defaultTrackSelect(tracks, 'fr-uk');
351
+ PlayerConfiguration.defaultTrackSelect(tracks, 'fr-uk', 'SDR');
350
352
  expect(selected).toBeTruthy();
351
353
  expect(selected.length).toBe(1);
352
354
  expect(selected[0]).toBeTruthy();
@@ -362,7 +364,8 @@ filterDescribe('Storage', storageSupport, () => {
362
364
 
363
365
  tracks[0].primary = true;
364
366
 
365
- const selected = PlayerConfiguration.defaultTrackSelect(tracks, 'de');
367
+ const selected =
368
+ PlayerConfiguration.defaultTrackSelect(tracks, 'de', 'SDR');
366
369
  expect(selected).toBeTruthy();
367
370
  expect(selected.length).toBe(1);
368
371
  expect(selected[0]).toBeTruthy();
@@ -736,15 +739,16 @@ filterDescribe('Storage', storageSupport, () => {
736
739
  const videoElement = /** @type {!HTMLVideoElement} */(
737
740
  document.createElement('video'));
738
741
 
739
- beforeEach(() => {
742
+ beforeEach(async () => {
740
743
  netEngine = makeNetworkEngine();
741
744
 
742
745
  // Use a real Player since Storage only uses the configuration and
743
746
  // networking engine. This allows us to use Player.configure in these
744
747
  // tests.
745
- player = new shaka.Player(videoElement, ((player) => {
748
+ player = new shaka.Player(null, ((player) => {
746
749
  player.createNetworkingEngine = () => netEngine;
747
750
  }));
751
+ await player.attach(videoElement);
748
752
 
749
753
  storage = new shaka.offline.Storage(player);
750
754
 
@@ -1382,6 +1386,7 @@ filterDescribe('Storage', storageSupport, () => {
1382
1386
  frameRate: 30,
1383
1387
  pixelAspectRatio: '59:54',
1384
1388
  hdr: null,
1389
+ videoLayout: null,
1385
1390
  mimeType: 'video/mp4,audio/mp4',
1386
1391
  audioMimeType: 'audio/mp4',
1387
1392
  videoMimeType: 'video/mp4',
@@ -1428,6 +1433,7 @@ filterDescribe('Storage', storageSupport, () => {
1428
1433
  frameRate: null,
1429
1434
  pixelAspectRatio: null,
1430
1435
  hdr: null,
1436
+ videoLayout: null,
1431
1437
  mimeType: 'text/vtt',
1432
1438
  audioMimeType: null,
1433
1439
  videoMimeType: null,
@@ -1742,6 +1748,12 @@ filterDescribe('Storage', storageSupport, () => {
1742
1748
 
1743
1749
  /** @override */
1744
1750
  onExpirationUpdated(session, number) {}
1751
+
1752
+ /** @override */
1753
+ onInitialVariantChosen(variant) {}
1754
+
1755
+ /** @override */
1756
+ banLocation(uri) {}
1745
1757
  };
1746
1758
 
1747
1759
  /**
@@ -33,8 +33,9 @@ describe('Player', () => {
33
33
  support = await compiledShaka.Player.probeSupport();
34
34
  });
35
35
 
36
- beforeEach(() => {
37
- player = new compiledShaka.Player(video);
36
+ beforeEach(async () => {
37
+ player = new compiledShaka.Player();
38
+ await player.attach(video);
38
39
 
39
40
  // Make sure we are playing the lowest res available to avoid test flake
40
41
  // based on network issues. Note that disabling ABR and setting a low
@@ -68,6 +69,7 @@ describe('Player', () => {
68
69
  eventManager.release();
69
70
 
70
71
  await player.destroy();
72
+ player.releaseAllMutexes();
71
73
  });
72
74
 
73
75
  afterAll(() => {
@@ -32,7 +32,8 @@ describe('Player', () => {
32
32
 
33
33
  beforeEach(async () => {
34
34
  await shaka.test.TestScheme.createManifests(compiledShaka, '_compiled');
35
- player = new compiledShaka.Player(video);
35
+ player = new compiledShaka.Player();
36
+ await player.attach(video);
36
37
 
37
38
  // Disable stall detection, which can interfere with playback tests.
38
39
  player.configure('streaming.stallEnabled', false);
@@ -53,6 +54,7 @@ describe('Player', () => {
53
54
  eventManager.release();
54
55
 
55
56
  await player.destroy();
57
+ player.releaseAllMutexes();
56
58
  });
57
59
 
58
60
  afterAll(() => {
@@ -83,7 +85,8 @@ describe('Player', () => {
83
85
 
84
86
  // Unlike the other tests in this file, this uses an uncompiled build of
85
87
  // Shaka, so that we don't need to expose shaka.util.Timer.activeTimers.
86
- player = new shaka.Player(video);
88
+ player = new shaka.Player();
89
+ await player.attach(video);
87
90
 
88
91
  // Disable stall detection, which can interfere with playback tests.
89
92
  player.configure('streaming.stallEnabled', false);
@@ -672,7 +675,8 @@ describe('Player', () => {
672
675
  // uncompiled version. Then we will get assertions.
673
676
  eventManager.unlisten(player, 'error');
674
677
  await player.destroy();
675
- player = new shaka.Player(video); // NOTE: MUST BE UNCOMPILED
678
+ player = new shaka.Player(); // NOTE: MUST BE UNCOMPILED
679
+ await player.attach(video);
676
680
  player.configure({abr: {enabled: false}});
677
681
  eventManager.listen(player, 'error', Util.spyFunc(onErrorSpy));
678
682
 
@@ -707,7 +711,8 @@ describe('Player', () => {
707
711
  // uncompiled version. Then we will get assertions.
708
712
  eventManager.unlisten(player, 'error');
709
713
  await player.destroy();
710
- player = new shaka.Player(video); // NOTE: MUST BE UNCOMPILED
714
+ player = new shaka.Player(); // NOTE: MUST BE UNCOMPILED
715
+ await player.attach(video);
711
716
  player.configure({abr: {enabled: false}});
712
717
  eventManager.listen(player, 'error', Util.spyFunc(onErrorSpy));
713
718
 
@@ -1332,6 +1337,9 @@ describe('Player', () => {
1332
1337
  expect(thumbnail3.positionX).toBe(160);
1333
1338
  expect(thumbnail3.positionY).toBe(90);
1334
1339
  expect(thumbnail3.width).toBe(160);
1340
+
1341
+ const thumbnails = await player.getAllThumbnails(newTrack.id);
1342
+ expect(thumbnails.length).toBe(3);
1335
1343
  });
1336
1344
 
1337
1345
  it('appends thumbnails for external thumbnails without sprites',
@@ -1355,6 +1363,9 @@ describe('Player', () => {
1355
1363
  const thumbnail3 = await player.getThumbnails(newTrack.id, 40);
1356
1364
  expect(thumbnail3.startTime).toBe(30);
1357
1365
  expect(thumbnail3.duration).toBe(30);
1366
+
1367
+ const thumbnails = await player.getAllThumbnails(newTrack.id);
1368
+ expect(thumbnails.length).toBe(3);
1358
1369
  });
1359
1370
  }); // describe('addThumbnailsTrack')
1360
1371
  });