shaka-player 4.4.3 → 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 (307) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  2. package/.github/workflows/release-please.yaml +2 -27
  3. package/AUTHORS +2 -0
  4. package/CHANGELOG.md +156 -39
  5. package/CODE_OF_CONDUCT.md +1 -1
  6. package/CONTRIBUTORS +2 -0
  7. package/README.md +54 -42
  8. package/demo/asset_card.js +18 -21
  9. package/demo/cast_receiver/index.html +0 -1
  10. package/demo/close_button.js +0 -3
  11. package/demo/common/asset.js +33 -22
  12. package/demo/common/assets.js +249 -60
  13. package/demo/config.js +219 -253
  14. package/demo/custom.js +88 -133
  15. package/demo/front.js +7 -10
  16. package/demo/index.html +19 -22
  17. package/demo/input.js +6 -11
  18. package/demo/input_container.js +8 -9
  19. package/demo/main.js +62 -126
  20. package/demo/search.js +29 -34
  21. package/demo/service_worker.js +0 -3
  22. package/demo/tooltip.js +3 -5
  23. package/demo/visualizer.js +3 -5
  24. package/demo/visualizer_button.js +1 -20
  25. package/dist/controls.css +1 -1
  26. package/dist/controls.css.map +1 -1
  27. package/dist/demo.compiled.debug.js +211 -228
  28. package/dist/demo.compiled.debug.map +4 -4
  29. package/dist/demo.compiled.js +211 -228
  30. package/dist/demo.compiled.map +4 -4
  31. package/dist/deps.js +42 -37
  32. package/dist/locales.js +34 -30
  33. package/dist/receiver.compiled.debug.js +64 -77
  34. package/dist/receiver.compiled.debug.map +4 -4
  35. package/dist/receiver.compiled.js +64 -77
  36. package/dist/receiver.compiled.map +4 -4
  37. package/dist/shaka-player.compiled.d.ts +343 -151
  38. package/dist/shaka-player.compiled.debug.d.ts +343 -151
  39. package/dist/shaka-player.compiled.debug.externs.js +356 -117
  40. package/dist/shaka-player.compiled.debug.js +952 -811
  41. package/dist/shaka-player.compiled.debug.map +4 -4
  42. package/dist/shaka-player.compiled.externs.js +356 -117
  43. package/dist/shaka-player.compiled.js +1165 -1078
  44. package/dist/shaka-player.compiled.map +4 -4
  45. package/dist/shaka-player.ui.d.ts +359 -153
  46. package/dist/shaka-player.ui.debug.d.ts +359 -153
  47. package/dist/shaka-player.ui.debug.externs.js +382 -117
  48. package/dist/shaka-player.ui.debug.js +1084 -918
  49. package/dist/shaka-player.ui.debug.map +4 -4
  50. package/dist/shaka-player.ui.externs.js +382 -117
  51. package/dist/shaka-player.ui.js +1377 -1274
  52. package/dist/shaka-player.ui.map +4 -4
  53. package/docs/design/lcevc-integration.md +14 -14
  54. package/docs/tutorials/ad_monetization.md +54 -0
  55. package/docs/tutorials/basic-usage.md +2 -1
  56. package/docs/tutorials/errors.md +2 -1
  57. package/docs/tutorials/faq.md +27 -55
  58. package/docs/tutorials/index.json +2 -1
  59. package/docs/tutorials/lcevc.md +118 -0
  60. package/docs/tutorials/offline.md +10 -8
  61. package/docs/tutorials/plugins.md +5 -0
  62. package/docs/tutorials/ui-customization.md +17 -0
  63. package/docs/tutorials/ui.md +2 -1
  64. package/docs/tutorials/upgrade.md +3 -0
  65. package/externs/css_style_declaration.js +19 -0
  66. package/externs/lcevc.js +37 -13
  67. package/externs/managedmediasource.js +24 -0
  68. package/externs/media_remote.js +68 -0
  69. package/externs/mediatailor.js +193 -0
  70. package/externs/pictureinpicture.js +11 -0
  71. package/externs/shaka/abr_manager.js +6 -2
  72. package/externs/shaka/ads.js +27 -0
  73. package/externs/shaka/cea.js +7 -0
  74. package/externs/shaka/codecs.js +5 -3
  75. package/externs/shaka/manifest.js +31 -10
  76. package/externs/shaka/manifest_parser.js +24 -1
  77. package/externs/shaka/net.js +2 -2
  78. package/externs/shaka/offline.js +13 -2
  79. package/externs/shaka/player.js +65 -8
  80. package/externs/shaka/text.js +3 -1
  81. package/externs/shaka/transmuxer.js +1 -1
  82. package/karma.conf.js +7 -3
  83. package/lib/abr/simple_abr_manager.js +66 -9
  84. package/lib/ads/ad_manager.js +104 -50
  85. package/lib/ads/media_tailor_ad.js +297 -0
  86. package/lib/ads/media_tailor_ad_manager.js +839 -0
  87. package/lib/cast/cast_receiver.js +1 -1
  88. package/lib/cea/cea_decoder.js +28 -0
  89. package/lib/cea/dummy_caption_decoder.js +5 -0
  90. package/lib/cea/ts_cea_parser.js +15 -2
  91. package/lib/config/codec_switching_strategy.js +24 -0
  92. package/lib/dash/content_protection.js +120 -2
  93. package/lib/dash/dash_parser.js +322 -93
  94. package/lib/dash/mpd_utils.js +62 -37
  95. package/lib/dash/segment_base.js +17 -10
  96. package/lib/dash/segment_list.js +18 -9
  97. package/lib/dash/segment_template.js +122 -107
  98. package/lib/dependencies/all.js +8 -7
  99. package/lib/hls/hls_classes.js +28 -43
  100. package/lib/hls/hls_parser.js +798 -658
  101. package/lib/hls/hls_utils.js +64 -5
  102. package/lib/hls/manifest_text_parser.js +7 -11
  103. package/lib/lcevc/lcevc_dec.js +220 -0
  104. package/lib/media/adaptation_set.js +32 -14
  105. package/lib/media/adaptation_set_criteria.js +86 -16
  106. package/lib/media/closed_caption_parser.js +13 -0
  107. package/lib/media/content_workarounds.js +6 -0
  108. package/lib/media/drm_engine.js +8 -13
  109. package/lib/media/manifest_parser.js +8 -113
  110. package/lib/media/media_source_capabilities.js +10 -3
  111. package/lib/media/media_source_engine.js +286 -44
  112. package/lib/media/play_rate_controller.js +8 -38
  113. package/lib/media/presentation_timeline.js +7 -1
  114. package/lib/media/quality_observer.js +1 -1
  115. package/lib/media/segment_index.js +6 -6
  116. package/lib/media/segment_prefetch.js +92 -24
  117. package/lib/media/segment_reference.js +73 -7
  118. package/lib/media/segment_utils.js +343 -0
  119. package/lib/media/stall_detector.js +0 -3
  120. package/lib/media/streaming_engine.js +73 -38
  121. package/lib/mss/mss_parser.js +19 -2
  122. package/lib/net/networking_engine.js +67 -12
  123. package/lib/net/networking_utils.js +95 -0
  124. package/lib/offline/indexeddb/v1_storage_cell.js +3 -0
  125. package/lib/offline/indexeddb/v2_storage_cell.js +3 -0
  126. package/lib/offline/manifest_converter.js +3 -0
  127. package/lib/offline/offline_manifest_parser.js +10 -0
  128. package/lib/offline/storage.js +14 -7
  129. package/lib/player.js +1098 -1537
  130. package/lib/polyfill/mediasource.js +22 -1
  131. package/lib/text/cue.js +15 -0
  132. package/lib/text/mp4_ttml_parser.js +2 -2
  133. package/lib/text/srt_text_parser.js +2 -2
  134. package/lib/text/stub_text_displayer.js +51 -0
  135. package/lib/text/text_engine.js +3 -2
  136. package/lib/text/ttml_text_parser.js +45 -5
  137. package/lib/text/ui_text_displayer.js +8 -0
  138. package/lib/text/vtt_text_parser.js +40 -22
  139. package/lib/transmuxer/aac_transmuxer.js +1 -1
  140. package/lib/transmuxer/ac3_transmuxer.js +1 -1
  141. package/lib/transmuxer/ec3_transmuxer.js +1 -1
  142. package/lib/transmuxer/h264.js +5 -4
  143. package/lib/transmuxer/h265.js +863 -0
  144. package/lib/transmuxer/mp3_transmuxer.js +1 -1
  145. package/lib/transmuxer/mpeg_ts_transmuxer.js +4 -3
  146. package/lib/transmuxer/mss_transmuxer.js +1 -1
  147. package/lib/transmuxer/ts_transmuxer.js +187 -22
  148. package/lib/util/buffer_utils.js +26 -4
  149. package/lib/util/content_steering_manager.js +358 -0
  150. package/lib/util/error.js +30 -15
  151. package/lib/util/exp_golomb.js +30 -2
  152. package/lib/util/fairplay_utils.js +1 -1
  153. package/lib/util/fake_event.js +8 -1
  154. package/lib/util/id3_utils.js +50 -1
  155. package/lib/util/manifest_parser_utils.js +12 -8
  156. package/lib/util/mp4_generator.js +6 -8
  157. package/lib/util/mutex.js +59 -0
  158. package/lib/util/object_utils.js +1 -1
  159. package/lib/util/periods.js +156 -179
  160. package/lib/util/platform.js +44 -3
  161. package/lib/util/player_configuration.js +43 -6
  162. package/lib/util/state_history.js +6 -2
  163. package/lib/util/stream_utils.js +206 -283
  164. package/lib/util/ts_parser.js +335 -98
  165. package/lib/util/uint8array_utils.js +5 -1
  166. package/lib/util/xml_utils.js +5 -0
  167. package/maintained-branches.md +3 -2
  168. package/package.json +4 -6
  169. package/roadmap.md +25 -5
  170. package/shaka-player.uncompiled.js +2 -2
  171. package/support.html +0 -1
  172. package/test/abr/simple_abr_manager_unit.js +33 -33
  173. package/test/ads/ad_manager_unit.js +3 -2
  174. package/test/cast/cast_receiver_integration.js +50 -4
  175. package/test/cast/cast_utils_unit.js +2 -0
  176. package/test/cea/cea_decoder_unit.js +7 -0
  177. package/test/codec_switching/codec_switching_integration.js +182 -0
  178. package/test/dash/dash_parser_content_protection_unit.js +2 -0
  179. package/test/dash/dash_parser_integration.js +74 -0
  180. package/test/dash/dash_parser_live_unit.js +2 -19
  181. package/test/dash/dash_parser_manifest_unit.js +536 -2
  182. package/test/dash/dash_parser_segment_base_unit.js +2 -0
  183. package/test/dash/dash_parser_segment_list_unit.js +2 -0
  184. package/test/dash/dash_parser_segment_template_unit.js +2 -0
  185. package/test/dash/mpd_utils_unit.js +61 -30
  186. package/test/demo/demo_unit.js +0 -16
  187. package/test/hls/hls_live_unit.js +14 -3
  188. package/test/hls/hls_parser_unit.js +385 -33
  189. package/test/hls/manifest_text_parser_unit.js +32 -99
  190. package/test/media/adaptation_set_criteria_unit.js +284 -15
  191. package/test/media/adaptation_set_unit.js +2 -0
  192. package/test/media/content_workarounds_unit.js +1 -1
  193. package/test/media/drm_engine_unit.js +3 -3
  194. package/test/media/media_source_engine_unit.js +166 -2
  195. package/test/media/play_rate_controller_unit.js +0 -48
  196. package/test/media/segment_index_unit.js +5 -4
  197. package/test/media/segment_prefetch_unit.js +1 -1
  198. package/test/media/streaming_engine_unit.js +17 -17
  199. package/test/mss/mss_parser_unit.js +2 -0
  200. package/test/mss/mss_player_integration.js +3 -2
  201. package/test/net/networking_engine_unit.js +3 -3
  202. package/test/{media/manifest_parser_unit.js → net/networking_utils_unit.js} +2 -2
  203. package/test/offline/manifest_convert_unit.js +14 -0
  204. package/test/offline/offline_integration.js +2 -1
  205. package/test/offline/storage_integration.js +22 -13
  206. package/test/player_external.js +4 -2
  207. package/test/player_integration.js +15 -4
  208. package/test/player_load_graph_integration.js +47 -151
  209. package/test/player_src_equals_external.js +1 -0
  210. package/test/player_src_equals_integration.js +71 -4
  211. package/test/player_unit.js +182 -158
  212. package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
  213. package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
  214. package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
  215. package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
  216. package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
  217. package/test/test/assets/dash-aes-128/dash.mpd +18 -0
  218. package/test/test/assets/dash-aes-128/license +1 -0
  219. package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
  220. package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
  221. package/test/test/assets/dash-multi-codec/dash.mpd +32 -0
  222. package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
  223. package/test/test/assets/hls-ts-h265/0.ts +0 -0
  224. package/test/test/assets/hls-ts-h265/hevc.m3u8 +6 -0
  225. package/test/test/assets/hls-ts-h265/index.m3u8 +7 -0
  226. package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
  227. package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
  228. package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +9 -0
  229. package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +24 -0
  230. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
  231. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
  232. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
  233. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
  234. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
  235. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
  236. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
  237. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
  238. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
  239. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
  240. package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +14 -0
  241. package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +23 -0
  242. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
  243. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
  244. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
  245. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
  246. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
  247. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
  248. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
  249. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
  250. package/test/test/util/dash_parser_util.js +4 -0
  251. package/test/test/util/fake_ad_manager.js +20 -0
  252. package/test/test/util/fake_media_source_engine.js +13 -2
  253. package/test/test/util/fake_networking_engine.js +9 -1
  254. package/test/test/util/fake_segment_prefetch.js +3 -0
  255. package/test/test/util/manifest_generator.js +11 -3
  256. package/test/test/util/manifest_parser_util.js +14 -2
  257. package/test/test/util/mss_parser_util.js +4 -0
  258. package/test/test/util/offline_utils.js +2 -0
  259. package/test/test/util/simple_fakes.js +2 -2
  260. package/test/test/util/streaming_engine_util.js +10 -4
  261. package/test/test/util/test_scheme.js +6 -0
  262. package/test/test/util/ui_utils.js +4 -3
  263. package/test/text/mp4_ttml_parser_unit.js +4 -4
  264. package/test/text/srt_text_parser_unit.js +1 -1
  265. package/test/text/text_displayer_layout_unit.js +1 -1
  266. package/test/text/text_engine_unit.js +6 -0
  267. package/test/text/ttml_text_parser_unit.js +85 -2
  268. package/test/text/vtt_text_parser_unit.js +103 -31
  269. package/test/transmuxer/transmuxer_engine_integration.js +9 -0
  270. package/test/transmuxer/transmuxer_integration.js +150 -3
  271. package/test/ui/ad_ui_unit.js +2 -2
  272. package/test/ui/ui_customization_unit.js +17 -16
  273. package/test/ui/ui_integration.js +30 -20
  274. package/test/ui/ui_unit.js +28 -29
  275. package/test/util/buffer_utils_unit.js +1 -1
  276. package/test/util/content_steering_manager_unit.js +427 -0
  277. package/test/util/id3_utils_unit.js +52 -0
  278. package/test/util/stream_utils_unit.js +207 -169
  279. package/test/util/ts_parser_unit.js +3 -3
  280. package/third_party/closure-uri/uri.js +13 -1
  281. package/ui/audio_language_selection.js +9 -2
  282. package/ui/controls.js +125 -0
  283. package/ui/externs/ui.js +24 -2
  284. package/ui/language_utils.js +43 -8
  285. package/ui/less/range_elements.less +33 -0
  286. package/ui/locales/en.json +1 -0
  287. package/ui/locales/es-419.json +1 -0
  288. package/ui/locales/es.json +1 -0
  289. package/ui/locales/source.json +4 -0
  290. package/ui/localization.js +10 -0
  291. package/ui/pip_button.js +22 -120
  292. package/ui/remote_button.js +203 -0
  293. package/ui/resolution_selection.js +47 -10
  294. package/ui/seek_bar.js +296 -3
  295. package/ui/text_selection.js +2 -1
  296. package/ui/ui.js +11 -4
  297. package/demo/common/message_ids.js +0 -309
  298. package/demo/locales/en.json +0 -288
  299. package/demo/locales/source.json +0 -1146
  300. package/externs/mux.js +0 -69
  301. package/lib/lcevc/lcevc_dil.js +0 -152
  302. package/lib/routing/node.js +0 -23
  303. package/lib/routing/payload.js +0 -43
  304. package/lib/routing/walker.js +0 -587
  305. package/lib/transmuxer/muxjs_transmuxer.js +0 -242
  306. package/test/routing/walker_unit.js +0 -504
  307. package/test/transmuxer/muxjs_transmuxer_integration.js +0 -177
@@ -45,7 +45,8 @@ describe('UI', () => {
45
45
  videoContainer = shaka.util.Dom.createHTMLElement('div');
46
46
  videoContainer.appendChild(video);
47
47
  document.body.appendChild(videoContainer);
48
- player = new compiledShaka.Player(video);
48
+ player = new compiledShaka.Player();
49
+ await player.attach(video);
49
50
 
50
51
  // Create UI
51
52
  // Add all of the buttons we have
@@ -313,8 +314,6 @@ describe('UI', () => {
313
314
  describe('resolution selection', () => {
314
315
  /** @type {!Map.<number, !HTMLElement>} */
315
316
  let resolutionsToButtons;
316
- /** @type {!Array.<number>} */
317
- let resolutionsFromContent;
318
317
  /** @type {!Array.<!HTMLElement>} */
319
318
  let resolutionButtons;
320
319
  /** @type {!Element} */
@@ -329,6 +328,8 @@ describe('UI', () => {
329
328
  let preferredLanguage;
330
329
  /** @type {!shaka.extern.Track} */
331
330
  let oldResolutionTrack;
331
+ /** @type {number} */
332
+ let newResolutionTrackId;
332
333
 
333
334
  beforeEach(async () => {
334
335
  oldResolution = 182;
@@ -353,6 +354,7 @@ describe('UI', () => {
353
354
  updateResolutionButtonsAndMap();
354
355
 
355
356
  oldResolutionTrack = findTrackWithHeight(tracks, oldResolution);
357
+ newResolutionTrackId = findTrackWithHeight(tracks, newResolution).id;
356
358
 
357
359
  const selectedResolution =
358
360
  getSelectedTrack(player.getVariantTracks()).height;
@@ -363,9 +365,8 @@ describe('UI', () => {
363
365
  });
364
366
 
365
367
  it('contains all the relevant resolutions', () => {
366
- const formattedResolutions = resolutionsFromContent.map((res) => {
367
- return formatResolution(res);
368
- });
368
+ const formattedResolutions =
369
+ tracks.map((t) => formatResolution(t.id, tracks));
369
370
  verifyItems(formattedResolutions, resolutionButtons);
370
371
  });
371
372
 
@@ -374,7 +375,7 @@ describe('UI', () => {
374
375
  tracks = player.getVariantTracks();
375
376
  expect(getSelectedTrack(tracks).height).toBe(oldResolution);
376
377
 
377
- const button = resolutionsToButtons.get(newResolution);
378
+ const button = resolutionsToButtons.get(newResolutionTrackId);
378
379
  button.click();
379
380
 
380
381
  // Wait for the change to take effect
@@ -400,7 +401,7 @@ describe('UI', () => {
400
401
 
401
402
  expect(getSelectedTrack(tracks).height).toBe(newResolution);
402
403
 
403
- const button = resolutionsToButtons.get(newResolution);
404
+ const button = resolutionsToButtons.get(newResolutionTrackId);
404
405
  const isChosen = button.querySelector('.shaka-chosen-item');
405
406
 
406
407
  expect(isChosen).not.toBe(null);
@@ -427,7 +428,7 @@ describe('UI', () => {
427
428
  const p = waiter.waitForEvent(controls, 'resolutionselectionupdated');
428
429
 
429
430
  // Any resolution would works
430
- const button = resolutionsToButtons.get(newResolution);
431
+ const button = resolutionsToButtons.get(newResolutionTrackId);
431
432
  button.click();
432
433
 
433
434
  await p;
@@ -467,13 +468,26 @@ describe('UI', () => {
467
468
 
468
469
  /**
469
470
  * Gets the resolution to the same format it
470
- * appears in the UI: height + 'p'.
471
+ * appears in the UI
471
472
  *
472
- * @param {number} height
473
+ * @param {number} id
474
+ * @param {!Array.<!shaka.extern.Track>} tracks
473
475
  * @return {string}
474
476
  */
475
- function formatResolution(height) {
476
- return height.toString() + 'p';
477
+ function formatResolution(id, tracks) {
478
+ const track = tracks.find((t) => t.id == id);
479
+ const trackHeight = track.height || 0;
480
+ const trackWidth = track.width || 0;
481
+ let height = trackHeight;
482
+ const aspectRatio = trackWidth / trackHeight;
483
+ if (aspectRatio > (16 / 9)) {
484
+ height = Math.round(trackWidth * 9 / 16);
485
+ }
486
+ let text = height + 'p';
487
+ if (height == 2160) {
488
+ text = '4K';
489
+ }
490
+ return text;
477
491
  }
478
492
 
479
493
  /**
@@ -500,10 +514,6 @@ describe('UI', () => {
500
514
  return track.language == preferredLanguage;
501
515
  });
502
516
 
503
- resolutionsFromContent = tracks.map((track) => {
504
- return track.height;
505
- });
506
-
507
517
  resolutionButtons = filterButtons(
508
518
  /* buttons= */ resolutionsMenu.childNodes,
509
519
  /* excludeClasses= */ [
@@ -513,8 +523,8 @@ describe('UI', () => {
513
523
 
514
524
  resolutionsToButtons = mapChoicesToButtons(
515
525
  /* buttons= */ resolutionButtons,
516
- /* choices= */ resolutionsFromContent,
517
- /* modifier= */ formatResolution);
526
+ /* choices= */ tracks.map((track) => track.id),
527
+ /* modifier= */ (id) => formatResolution(id, tracks));
518
528
  }
519
529
  }); // describe('resolution selection')
520
530
 
@@ -598,7 +608,7 @@ describe('UI', () => {
598
608
 
599
609
  /**
600
610
  * @param {!Array.<!HTMLElement>} buttons
601
- * @param {!Array.<string>} choices
611
+ * @param {!Array.<string>|!Array.<number>} choices
602
612
  * @param {function(string):string|function(number):string} modifier
603
613
  * @return {!Map.<string, !HTMLElement>|!Map.<number, !HTMLElement>}
604
614
  */
@@ -36,14 +36,14 @@ describe('UI', () => {
36
36
  /** @type {!HTMLVideoElement} */
37
37
  let video;
38
38
 
39
- beforeEach(() => {
39
+ beforeEach(async () => {
40
40
  videoContainer =
41
41
  /** @type {!HTMLElement} */ (document.createElement('div'));
42
42
  document.body.appendChild(videoContainer);
43
43
 
44
44
  video = shaka.test.UiUtils.createVideoElement();
45
45
  videoContainer.appendChild(video);
46
- UiUtils.createUIThroughAPI(videoContainer, video);
46
+ await UiUtils.createUIThroughAPI(videoContainer, video);
47
47
  });
48
48
 
49
49
  it('has all the basic elements', () => {
@@ -193,7 +193,8 @@ describe('UI', () => {
193
193
  ],
194
194
  doubleClickForFullscreen: false,
195
195
  };
196
- const ui = UiUtils.createUIThroughAPI(videoContainer, video, config);
196
+ const ui = await UiUtils.createUIThroughAPI(
197
+ videoContainer, video, config);
197
198
  const controls = ui.getControls();
198
199
 
199
200
  const spy = spyOn(controls, 'toggleFullScreen');
@@ -216,8 +217,8 @@ describe('UI', () => {
216
217
  /** @type {!HTMLElement} */
217
218
  let controlsContainer;
218
219
 
219
- beforeEach(() => {
220
- const ui = UiUtils.createUIThroughAPI(videoContainer, video);
220
+ beforeEach(async () => {
221
+ const ui = await UiUtils.createUIThroughAPI(videoContainer, video);
221
222
  player = ui.getControls().getLocalPlayer();
222
223
  const controlsContainers =
223
224
  videoContainer.getElementsByClassName('shaka-controls-container');
@@ -246,13 +247,14 @@ describe('UI', () => {
246
247
  /** @type {!HTMLElement} */
247
248
  let overflowMenu;
248
249
 
249
- beforeEach(() => {
250
+ beforeEach(async () => {
250
251
  const config = {
251
252
  controlPanelElements: [
252
253
  'overflow_menu',
253
254
  ],
254
255
  };
255
- const ui = UiUtils.createUIThroughAPI(videoContainer, video, config);
256
+ const ui = await UiUtils.createUIThroughAPI(
257
+ videoContainer, video, config);
256
258
  player = ui.getControls().getLocalPlayer();
257
259
 
258
260
  const overflowMenus =
@@ -323,8 +325,8 @@ describe('UI', () => {
323
325
  /** @type {!HTMLElement} */
324
326
  let controlsButtonPanel;
325
327
 
326
- it('has default elements', () => {
327
- UiUtils.createUIThroughAPI(videoContainer, video);
328
+ it('has default elements', async () => {
329
+ await UiUtils.createUIThroughAPI(videoContainer, video);
328
330
  const controlsButtonPanels = videoContainer.getElementsByClassName(
329
331
  'shaka-controls-button-panel');
330
332
 
@@ -357,7 +359,7 @@ describe('UI', () => {
357
359
  }
358
360
  });
359
361
 
360
- it('is accessible', () => {
362
+ it('is accessible', async () => {
361
363
  function confirmAriaLabel(className) {
362
364
  const elements =
363
365
  controlsButtonPanel.getElementsByClassName(className);
@@ -376,7 +378,7 @@ describe('UI', () => {
376
378
  ],
377
379
  };
378
380
 
379
- UiUtils.createUIThroughAPI(videoContainer, video, config);
381
+ await UiUtils.createUIThroughAPI(videoContainer, video, config);
380
382
  const controlsButtonPanels = videoContainer.getElementsByClassName(
381
383
  'shaka-controls-button-panel');
382
384
  expect(controlsButtonPanels.length).toBe(1);
@@ -403,14 +405,15 @@ describe('UI', () => {
403
405
  /** @type {!Element} */
404
406
  let languageMenuButton;
405
407
 
406
- beforeEach(() => {
408
+ beforeEach(async () => {
407
409
  const config = {
408
410
  controlPanelElements: [
409
411
  'quality',
410
412
  'language',
411
413
  ],
412
414
  };
413
- const ui = UiUtils.createUIThroughAPI(videoContainer, video, config);
415
+ const ui = await UiUtils.createUIThroughAPI(
416
+ videoContainer, video, config);
414
417
  player = ui.getControls().getLocalPlayer();
415
418
 
416
419
  const resolutionsMenus =
@@ -473,7 +476,7 @@ describe('UI', () => {
473
476
  /** @type {shaka.ui.Controls} */
474
477
  let controls;
475
478
 
476
- beforeEach(() => {
479
+ beforeEach(async () => {
477
480
  const config = {
478
481
  controlPanelElements: [
479
482
  'overflow_menu',
@@ -482,7 +485,8 @@ describe('UI', () => {
482
485
  'quality',
483
486
  ],
484
487
  };
485
- const ui = UiUtils.createUIThroughAPI(videoContainer, video, config);
488
+ const ui = await UiUtils.createUIThroughAPI(
489
+ videoContainer, video, config);
486
490
  controls = ui.getControls();
487
491
  player = controls.getLocalPlayer();
488
492
 
@@ -616,19 +620,10 @@ describe('UI', () => {
616
620
  player.configure('abr.enabled', false);
617
621
 
618
622
  const tracks = player.getVariantTracks();
619
- const en2 =
620
- tracks.find((t) => t.language == 'en' && t.channelsCount == 2);
621
623
  const en1 =
622
624
  tracks.find((t) => t.language == 'en' && t.channelsCount == 1);
623
625
  const es = tracks.find((t) => t.language == 'es');
624
626
 
625
- // There are 3 variants with English 2-channel, but one is a duplicate
626
- // and shouldn't appear in the list.
627
- goog.asserts.assert(en2, 'Unable to find tracks');
628
- player.selectVariantTrack(en2, true);
629
- await updateResolutionMenu();
630
- expect(getResolutions()).toEqual(['240p', '480p']);
631
-
632
627
  // There is 1 variant with English 1-channel.
633
628
  goog.asserts.assert(en1, 'Unable to find tracks');
634
629
  player.selectVariantTrack(en1, true);
@@ -646,7 +641,9 @@ describe('UI', () => {
646
641
  const manifest =
647
642
  shaka.test.ManifestGenerator.generate((manifest) => {
648
643
  manifest.addVariant(0, (variant) => {
649
- variant.addAudio(0);
644
+ variant.addAudio(0, (stream) => {
645
+ stream.roles = ['main'];
646
+ });
650
647
  variant.bandwidth = 100000;
651
648
  });
652
649
  manifest.addVariant(1, (variant) => {
@@ -703,7 +700,7 @@ describe('UI', () => {
703
700
  /** @type {!HTMLElement} */
704
701
  let contextMenu;
705
702
 
706
- beforeEach(() => {
703
+ beforeEach(async () => {
707
704
  const config = {
708
705
  customContextMenu: true,
709
706
  contextMenuElements: [
@@ -712,7 +709,8 @@ describe('UI', () => {
712
709
  'fakeElement',
713
710
  ],
714
711
  };
715
- const ui = UiUtils.createUIThroughAPI(videoContainer, video, config);
712
+ const ui = await UiUtils.createUIThroughAPI(
713
+ videoContainer, video, config);
716
714
 
717
715
  controlsContainer = ui.getControls().getControlsContainer();
718
716
 
@@ -752,7 +750,7 @@ describe('UI', () => {
752
750
  /** @type {!HTMLElement} */
753
751
  let statisticsContainer;
754
752
 
755
- beforeEach(() => {
753
+ beforeEach(async () => {
756
754
  const config = {
757
755
  customContextMenu: true,
758
756
  contextMenuElements: [
@@ -760,7 +758,8 @@ describe('UI', () => {
760
758
  ],
761
759
  statisticsList: Object.keys(new shaka.util.Stats().getBlob()),
762
760
  };
763
- const ui = UiUtils.createUIThroughAPI(videoContainer, video, config);
761
+ const ui = await UiUtils.createUIThroughAPI(
762
+ videoContainer, video, config);
764
763
  player = ui.getControls().getLocalPlayer();
765
764
 
766
765
  const statisticsButtons =
@@ -42,7 +42,7 @@ describe('BufferUtils', () => {
42
42
 
43
43
  it('compares with same buffer', () => {
44
44
  const a = new Uint8Array([0, 1, 2, 3]);
45
- const b = new Uint16Array(a.buffer);
45
+ const b = BufferUtils.toUint16(a);
46
46
  expect(BufferUtils.equal(a, b)).toBe(true);
47
47
  });
48
48