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
@@ -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', () => {
@@ -223,7 +223,7 @@ describe('SegmentIndex', /** @suppress {accessControls} */ () => {
223
223
 
224
224
  index.fit(/* windowStart= */ 0, /* windowEnd= */ 10);
225
225
  expect(
226
- index.references[index.references.length - 1].hlsAes128Key,
226
+ index.references[index.references.length - 1].aes128Key,
227
227
  ).toEqual({method: 'AES-128', firstMediaSequenceNumber: 0});
228
228
  });
229
229
  });
@@ -1054,11 +1054,11 @@ describe('SegmentIndex', /** @suppress {accessControls} */ () => {
1054
1054
  * @param {number} startTime
1055
1055
  * @param {number} endTime
1056
1056
  * @param {!Array.<!shaka.media.SegmentReference>=} partialReferences
1057
- * @param {?shaka.extern.HlsAes128Key=} hlsAes128Key
1057
+ * @param {?shaka.extern.aes128Key=} aes128Key
1058
1058
  * @return {shaka.media.SegmentReference}
1059
1059
  */
1060
1060
  function makeReference(uri, startTime, endTime, partialReferences = [],
1061
- hlsAes128Key = null) {
1061
+ aes128Key = null) {
1062
1062
  return new shaka.media.SegmentReference(
1063
1063
  startTime,
1064
1064
  endTime,
@@ -1074,6 +1074,7 @@ describe('SegmentIndex', /** @suppress {accessControls} */ () => {
1074
1074
  /* tileDuration= */ undefined,
1075
1075
  /* syncTime= */ undefined,
1076
1076
  /* status= */ undefined,
1077
- /* hlsAes128Key= */ hlsAes128Key);
1077
+ /* aes128Key= */ aes128Key,
1078
+ /* allPartialSegments= */ partialReferences.length > 0);
1078
1079
  }
1079
1080
  });
@@ -201,7 +201,7 @@ describe('SegmentPrefetch', () => {
201
201
  /* tileDuration= */ undefined,
202
202
  /* syncTime= */ undefined,
203
203
  /* status= */ undefined,
204
- /* hlsAes128Key= */ null);
204
+ /* aes128Key= */ null);
205
205
  }
206
206
 
207
207
  /**
@@ -109,10 +109,10 @@ describe('StreamingEngine', () => {
109
109
  /**
110
110
  * @param {boolean=} trickMode
111
111
  * @param {number=} mediaOffset The offset from 0 for the segment start times
112
- * @param {shaka.extern.HlsAes128Key=} hlsAes128Key The AES-128 key to put in
112
+ * @param {shaka.extern.aes128Key=} aes128Key The AES-128 key to put in
113
113
  * the manifest, if one should exist
114
114
  */
115
- function setupVod(trickMode, mediaOffset, hlsAes128Key) {
115
+ function setupVod(trickMode, mediaOffset, aes128Key) {
116
116
  // For VOD, we fake a presentation that has 2 Periods of equal duration
117
117
  // (20 seconds), where each Period has 1 Variant and 1 text stream.
118
118
  //
@@ -219,7 +219,7 @@ describe('StreamingEngine', () => {
219
219
  /* firstPeriodStartTime= */ 0,
220
220
  /* secondPeriodStartTime= */ 20,
221
221
  /* presentationDuration= */ 40,
222
- hlsAes128Key);
222
+ aes128Key);
223
223
  }
224
224
 
225
225
  function setupLive() {
@@ -370,11 +370,11 @@ describe('StreamingEngine', () => {
370
370
  * @param {number} firstPeriodStartTime
371
371
  * @param {number} secondPeriodStartTime
372
372
  * @param {number} presentationDuration
373
- * @param {shaka.extern.HlsAes128Key=} hlsAes128Key
373
+ * @param {shaka.extern.aes128Key=} aes128Key
374
374
  */
375
375
  function setupManifest(
376
376
  firstPeriodStartTime, secondPeriodStartTime, presentationDuration,
377
- hlsAes128Key) {
377
+ aes128Key) {
378
378
  const segmentDurations = {
379
379
  audio: segmentData[ContentType.AUDIO].segmentDuration,
380
380
  video: segmentData[ContentType.VIDEO].segmentDuration,
@@ -397,7 +397,7 @@ describe('StreamingEngine', () => {
397
397
  /** @type {!shaka.media.PresentationTimeline} */(timeline),
398
398
  [firstPeriodStartTime, secondPeriodStartTime],
399
399
  presentationDuration, segmentDurations, initSegmentRanges,
400
- timestampOffsets, hlsAes128Key);
400
+ timestampOffsets, aes128Key);
401
401
 
402
402
  audioStream = manifest.variants[0].audio;
403
403
  videoStream = manifest.variants[0].video;
@@ -3809,8 +3809,8 @@ describe('StreamingEngine', () => {
3809
3809
 
3810
3810
  describe('AES-128', () => {
3811
3811
  let key;
3812
- /** @type {!shaka.extern.HlsAes128Key} */
3813
- let hlsAes128Key;
3812
+ /** @type {!shaka.extern.aes128Key} */
3813
+ let aes128Key;
3814
3814
 
3815
3815
  beforeEach(async () => {
3816
3816
  // Get a key.
@@ -3823,10 +3823,10 @@ describe('StreamingEngine', () => {
3823
3823
  // Set up a manifest with AES-128 key info.
3824
3824
  // We don't actually provide the imported key OR the key fetching function
3825
3825
  // here, though, so that the individual tests can choose what the starting
3826
- // state of the hlsAes128Key object is.
3827
- hlsAes128Key = {method: 'AES-128', firstMediaSequenceNumber: 0};
3826
+ // state of the aes128Key object is.
3827
+ aes128Key = {method: 'AES-128', firstMediaSequenceNumber: 0};
3828
3828
 
3829
- setupVod(false, 0, hlsAes128Key);
3829
+ setupVod(false, 0, aes128Key);
3830
3830
  mediaSourceEngine = new shaka.test.FakeMediaSourceEngine(segmentData);
3831
3831
  presentationTimeInSeconds = 0;
3832
3832
  createStreamingEngine();
@@ -3851,22 +3851,22 @@ describe('StreamingEngine', () => {
3851
3851
  }
3852
3852
 
3853
3853
  it('decrypts segments', async () => {
3854
- hlsAes128Key.cryptoKey = key;
3854
+ aes128Key.cryptoKey = key;
3855
3855
  await runTest();
3856
3856
  });
3857
3857
 
3858
3858
  it('downloads key if not pre-filled', async () => {
3859
- hlsAes128Key.fetchKey = () => {
3860
- hlsAes128Key.cryptoKey = key;
3861
- hlsAes128Key.fetchKey = undefined;
3859
+ aes128Key.fetchKey = () => {
3860
+ aes128Key.cryptoKey = key;
3861
+ aes128Key.fetchKey = undefined;
3862
3862
  return Promise.resolve();
3863
3863
  };
3864
3864
 
3865
3865
  await runTest();
3866
3866
 
3867
3867
  // The key should have been fetched.
3868
- expect(hlsAes128Key.cryptoKey).not.toBeUndefined();
3869
- expect(hlsAes128Key.fetchKey).toBeUndefined();
3868
+ expect(aes128Key.cryptoKey).not.toBeUndefined();
3869
+ expect(aes128Key.fetchKey).toBeUndefined();
3870
3870
  });
3871
3871
  });
3872
3872
 
@@ -79,6 +79,8 @@ describe('MssParser Manifest', () => {
79
79
  enableLowLatencyMode: () => {},
80
80
  updateDuration: () => {},
81
81
  newDrmInfo: (stream) => {},
82
+ onManifestUpdated: () => {},
83
+ getBandwidthEstimate: () => 1e6,
82
84
  };
83
85
  });
84
86
 
@@ -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');
@@ -298,6 +298,7 @@ describe('ManifestConverter', () => {
298
298
  const streamDB = {
299
299
  id,
300
300
  originalId: id.toString(),
301
+ groupId: null,
301
302
  primary: false,
302
303
  type,
303
304
  mimeType: '',
@@ -318,6 +319,7 @@ describe('ManifestConverter', () => {
318
319
  spatialAudio: false,
319
320
  closedCaptions: null,
320
321
  external: false,
322
+ fastSwitching: false,
321
323
  };
322
324
 
323
325
  return streamDB;
@@ -355,6 +357,7 @@ describe('ManifestConverter', () => {
355
357
  return {
356
358
  id,
357
359
  originalId: id.toString(),
360
+ groupId: null,
358
361
  primary: false,
359
362
  type: ContentType.VIDEO,
360
363
  mimeType: 'video/mp4',
@@ -362,6 +365,7 @@ describe('ManifestConverter', () => {
362
365
  frameRate: 22,
363
366
  pixelAspectRatio: '59:54',
364
367
  hdr: undefined,
368
+ videoLayout: undefined,
365
369
  kind: undefined,
366
370
  language: '',
367
371
  originalLanguage: null,
@@ -394,6 +398,7 @@ describe('ManifestConverter', () => {
394
398
  tilesLayout: undefined,
395
399
  accessibilityPurpose: null,
396
400
  external: false,
401
+ fastSwitching: false,
397
402
  };
398
403
  }
399
404
 
@@ -407,6 +412,7 @@ describe('ManifestConverter', () => {
407
412
  return {
408
413
  id,
409
414
  originalId: id.toString(),
415
+ groupId: null,
410
416
  primary: false,
411
417
  type: ContentType.AUDIO,
412
418
  mimeType: 'audio/mp4',
@@ -414,6 +420,7 @@ describe('ManifestConverter', () => {
414
420
  frameRate: undefined,
415
421
  pixelAspectRatio: undefined,
416
422
  hdr: undefined,
423
+ videoLayout: undefined,
417
424
  kind: undefined,
418
425
  language: 'en',
419
426
  originalLanguage: 'en',
@@ -446,6 +453,7 @@ describe('ManifestConverter', () => {
446
453
  tilesLayout: undefined,
447
454
  accessibilityPurpose: null,
448
455
  external: false,
456
+ fastSwitching: false,
449
457
  };
450
458
  }
451
459
 
@@ -458,6 +466,7 @@ describe('ManifestConverter', () => {
458
466
  return {
459
467
  id,
460
468
  originalId: id.toString(),
469
+ groupId: null,
461
470
  primary: false,
462
471
  type: ContentType.TEXT,
463
472
  mimeType: 'text/vtt',
@@ -465,6 +474,7 @@ describe('ManifestConverter', () => {
465
474
  frameRate: undefined,
466
475
  pixelAspectRatio: undefined,
467
476
  hdr: undefined,
477
+ videoLayout: undefined,
468
478
  kind: undefined,
469
479
  language: 'en',
470
480
  originalLanguage: 'en',
@@ -497,6 +507,7 @@ describe('ManifestConverter', () => {
497
507
  tilesLayout: undefined,
498
508
  accessibilityPurpose: null,
499
509
  external: false,
510
+ fastSwitching: false,
500
511
  };
501
512
  }
502
513
 
@@ -516,6 +527,7 @@ describe('ManifestConverter', () => {
516
527
  const expectedStream = {
517
528
  id: jasmine.any(Number),
518
529
  originalId: jasmine.any(String),
530
+ groupId: streamDb.groupId,
519
531
  createSegmentIndex: jasmine.any(Function),
520
532
  segmentIndex: jasmine.any(shaka.media.SegmentIndex),
521
533
  mimeType: streamDb.mimeType,
@@ -523,6 +535,7 @@ describe('ManifestConverter', () => {
523
535
  frameRate: streamDb.frameRate,
524
536
  pixelAspectRatio: streamDb.pixelAspectRatio,
525
537
  hdr: streamDb.hdr,
538
+ videoLayout: streamDb.videoLayout,
526
539
  width: streamDb.width || undefined,
527
540
  height: streamDb.height || undefined,
528
541
  kind: streamDb.kind,
@@ -545,6 +558,7 @@ describe('ManifestConverter', () => {
545
558
  tilesLayout: streamDb.tilesLayout,
546
559
  accessibilityPurpose: null,
547
560
  external: streamDb.external,
561
+ fastSwitching: streamDb.fastSwitching,
548
562
  };
549
563
 
550
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,
@@ -1530,10 +1536,7 @@ filterDescribe('Storage', storageSupport, () => {
1530
1536
  manifest.addVariant(3, (variant) => {
1531
1537
  variant.language = frenchCanadian;
1532
1538
  variant.bandwidth = kbps(13);
1533
- variant.addVideo(4, (stream) => {
1534
- stream.bandwidth = kbps(10);
1535
- stream.size(100, 200);
1536
- });
1539
+ variant.addExistingStream(1);
1537
1540
  variant.addAudio(5, (stream) => {
1538
1541
  stream.language = frenchCanadian;
1539
1542
  stream.bandwidth = kbps(3);
@@ -1745,6 +1748,12 @@ filterDescribe('Storage', storageSupport, () => {
1745
1748
 
1746
1749
  /** @override */
1747
1750
  onExpirationUpdated(session, number) {}
1751
+
1752
+ /** @override */
1753
+ onInitialVariantChosen(variant) {}
1754
+
1755
+ /** @override */
1756
+ banLocation(uri) {}
1748
1757
  };
1749
1758
 
1750
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
  });