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
@@ -12,18 +12,20 @@ describe('MpdUtils', () => {
12
12
  expect(
13
13
  MpdUtils.fillUriTemplate(
14
14
  '/example/$RepresentationID$.mp4',
15
- '100', null, null, null).toString()).toBe('/example/100.mp4');
15
+ '100', null, null, null, null).toString())
16
+ .toBe('/example/100.mp4');
16
17
 
17
18
  // RepresentationID cannot use a width specifier.
18
19
  expect(
19
20
  MpdUtils.fillUriTemplate(
20
21
  '/example/$RepresentationID%01d$.mp4',
21
- '100', null, null, null).toString()).toBe('/example/100.mp4');
22
+ '100', null, null, null, null).toString())
23
+ .toBe('/example/100.mp4');
22
24
 
23
25
  expect(
24
26
  MpdUtils.fillUriTemplate(
25
27
  '/example/$RepresentationID$.mp4',
26
- null, null, null, null).toString())
28
+ null, null, null, null, null).toString())
27
29
  .toBe('/example/$RepresentationID$.mp4');
28
30
  });
29
31
 
@@ -31,35 +33,59 @@ describe('MpdUtils', () => {
31
33
  expect(
32
34
  MpdUtils.fillUriTemplate(
33
35
  '/example/$Number$.mp4',
34
- null, 100, null, null).toString()).toBe('/example/100.mp4');
36
+ null, 100, null, null, null).toString())
37
+ .toBe('/example/100.mp4');
35
38
 
36
39
  expect(
37
40
  MpdUtils.fillUriTemplate(
38
41
  '/example/$Number%05d$.mp4',
39
- null, 100, null, null).toString()).toBe('/example/00100.mp4');
42
+ null, 100, null, null, null).toString())
43
+ .toBe('/example/00100.mp4');
40
44
 
41
45
  expect(
42
46
  MpdUtils.fillUriTemplate(
43
47
  '/example/$Number$.mp4',
44
- null, null, null, null).toString())
48
+ null, null, null, null, null).toString())
45
49
  .toBe('/example/$Number$.mp4');
46
50
  });
47
51
 
52
+ it('handles a single SubNumber identifier', () => {
53
+ expect(
54
+ MpdUtils.fillUriTemplate(
55
+ '/example/$SubNumber$.mp4',
56
+ null, null, 100, null, null).toString())
57
+ .toBe('/example/100.mp4');
58
+
59
+ expect(
60
+ MpdUtils.fillUriTemplate(
61
+ '/example/$SubNumber%05d$.mp4',
62
+ null, null, 100, null, null).toString())
63
+ .toBe('/example/00100.mp4');
64
+
65
+ expect(
66
+ MpdUtils.fillUriTemplate(
67
+ '/example/$SubNumber$.mp4',
68
+ null, null, null, null, null).toString())
69
+ .toBe('/example/$SubNumber$.mp4');
70
+ });
71
+
48
72
  it('handles a single Bandwidth identifier', () => {
49
73
  expect(
50
74
  MpdUtils.fillUriTemplate(
51
75
  '/example/$Bandwidth$.mp4',
52
- null, null, 100, null).toString()).toBe('/example/100.mp4');
76
+ null, null, null, 100, null).toString())
77
+ .toBe('/example/100.mp4');
53
78
 
54
79
  expect(
55
80
  MpdUtils.fillUriTemplate(
56
81
  '/example/$Bandwidth%05d$.mp4',
57
- null, null, 100, null).toString()).toBe('/example/00100.mp4');
82
+ null, null, null, 100, null).toString())
83
+ .toBe('/example/00100.mp4');
58
84
 
59
85
  expect(
60
86
  MpdUtils.fillUriTemplate(
61
87
  '/example/$Bandwidth$.mp4',
62
- null, null, null, null).toString())
88
+ null, null, null, null, null).toString())
63
89
  .toBe('/example/$Bandwidth$.mp4');
64
90
  });
65
91
 
@@ -67,17 +93,19 @@ describe('MpdUtils', () => {
67
93
  expect(
68
94
  MpdUtils.fillUriTemplate(
69
95
  '/example/$Time$.mp4',
70
- null, null, null, 100).toString()).toBe('/example/100.mp4');
96
+ null, null, null, null, 100).toString())
97
+ .toBe('/example/100.mp4');
71
98
 
72
99
  expect(
73
100
  MpdUtils.fillUriTemplate(
74
101
  '/example/$Time%05d$.mp4',
75
- null, null, null, 100).toString()).toBe('/example/00100.mp4');
102
+ null, null, null, null, 100).toString())
103
+ .toBe('/example/00100.mp4');
76
104
 
77
105
  expect(
78
106
  MpdUtils.fillUriTemplate(
79
107
  '/example/$Time$.mp4',
80
- null, null, null, null).toString())
108
+ null, null, null, null, null).toString())
81
109
  .toBe('/example/$Time$.mp4');
82
110
  });
83
111
 
@@ -85,68 +113,70 @@ describe('MpdUtils', () => {
85
113
  expect(
86
114
  MpdUtils.fillUriTemplate(
87
115
  '/example/$Time$.mp4',
88
- null, null, null, 100.0001).toString()).toBe('/example/100.mp4');
116
+ null, null, null, null, 100.0001).toString())
117
+ .toBe('/example/100.mp4');
89
118
 
90
119
  expect(
91
120
  MpdUtils.fillUriTemplate(
92
121
  '/example/$Time%05d$.mp4',
93
- null, null, null, 99.9999).toString()).toBe('/example/00100.mp4');
122
+ null, null, null, null, 99.9999).toString())
123
+ .toBe('/example/00100.mp4');
94
124
  });
95
125
 
96
126
  it('handles multiple identifiers', () => {
97
127
  expect(
98
128
  MpdUtils.fillUriTemplate(
99
- '/example/$RepresentationID$_$Number$_$Bandwidth$_$Time$.mp4',
100
- '1', 2, 3, 4).toString()).toBe('/example/1_2_3_4.mp4');
129
+ '/example/$RepresentationID$_$Number$_$SubNumber$_$Bandwidth$_$Time$.mp4', // eslint-disable-line max-len
130
+ '1', 2, 3, 4, 5).toString()).toBe('/example/1_2_3_4_5.mp4');
101
131
 
102
132
  // No spaces.
103
133
  expect(
104
134
  MpdUtils.fillUriTemplate(
105
- '/example/$RepresentationID$$Number$$Bandwidth$$Time$.mp4',
106
- '1', 2, 3, 4).toString()).toBe('/example/1234.mp4');
135
+ '/example/$RepresentationID$$Number$$SubNumber$$Bandwidth$$Time$.mp4', // eslint-disable-line max-len
136
+ '1', 2, 3, 4, 5).toString()).toBe('/example/12345.mp4');
107
137
 
108
138
  // Different order.
109
139
  expect(
110
140
  MpdUtils.fillUriTemplate(
111
- '/example/$Bandwidth$_$Time$_$RepresentationID$_$Number$.mp4',
112
- '1', 2, 3, 4).toString()).toBe('/example/3_4_1_2.mp4');
141
+ '/example/$SubNumber$_$Bandwidth$_$Time$_$RepresentationID$_$Number$.mp4', // eslint-disable-line max-len
142
+ '1', 2, 3, 4, 5).toString()).toBe('/example/3_4_5_1_2.mp4');
113
143
 
114
144
  // Single width.
115
145
  expect(
116
146
  MpdUtils.fillUriTemplate(
117
- '$RepresentationID$_$Number%01d$_$Bandwidth%01d$_$Time%01d$',
118
- '1', 2, 3, 400).toString()).toBe('1_2_3_400');
147
+ '$RepresentationID$_$Number%01d$_$SubNumber%01d$_$Bandwidth%01d$_$Time%01d$', // eslint-disable-line max-len
148
+ '1', 2, 3, 4, 500).toString()).toBe('1_2_3_4_500');
119
149
 
120
150
  // Different widths.
121
151
  expect(
122
152
  MpdUtils.fillUriTemplate(
123
- '$RepresentationID$_$Number%02d$_$Bandwidth%02d$_$Time%02d$',
124
- '1', 2, 3, 4).toString()).toBe('1_02_03_04');
153
+ '$RepresentationID$_$Number%02d$_$SubNumber%02d$_$Bandwidth%02d$_$Time%02d$', // eslint-disable-line max-len
154
+ '1', 2, 3, 4, 5).toString()).toBe('1_02_03_04_05');
125
155
 
126
156
  // Double $$.
127
157
  expect(
128
158
  MpdUtils.fillUriTemplate(
129
- '$$/$RepresentationID$$$$Number$$$$Bandwidth$$$$Time$$$.$$',
130
- '1', 2, 3, 4).toString()).toBe('$/1$2$3$4$.$');
159
+ '$$/$RepresentationID$$$$Number$$$$SubNumber$$$$Bandwidth$$$$Time$$$.$$', // eslint-disable-line max-len
160
+ '1', 2, 3, 4, 5).toString()).toBe('$/1$2$3$4$5$.$');
131
161
  });
132
162
 
133
163
  it('handles invalid identifiers', () => {
134
164
  expect(
135
165
  MpdUtils.fillUriTemplate(
136
166
  '/example/$Garbage$.mp4',
137
- '1', 2, 3, 4).toString()).toBe('/example/$Garbage$.mp4');
167
+ '1', 2, 3, 4, 5).toString()).toBe('/example/$Garbage$.mp4');
138
168
 
139
169
  expect(
140
170
  MpdUtils.fillUriTemplate(
141
171
  '/example/$Time.mp4',
142
- '1', 2, 3, 4).toString()).toBe('/example/$Time.mp4');
172
+ '1', 2, 3, 4, 5).toString()).toBe('/example/$Time.mp4');
143
173
  });
144
174
 
145
175
  it('handles non-decimal format specifiers', () => {
146
176
  expect(
147
177
  MpdUtils.fillUriTemplate(
148
178
  '/$Number%05x$_$Number%01X$_$Number%01u$_$Number%01o$.mp4',
149
- '', 180, 0, 0).toString()).toBe('/000b4_B4_180_264.mp4');
179
+ '', 180, 0, 0, 0).toString()).toBe('/000b4_B4_180_264.mp4');
150
180
  });
151
181
  });
152
182
 
@@ -429,7 +459,8 @@ describe('MpdUtils', () => {
429
459
  console.assert(segmentTimeline);
430
460
 
431
461
  const timeline = MpdUtils.createTimeline(
432
- segmentTimeline, timescale, presentationTimeOffset, periodDuration);
462
+ segmentTimeline, timescale, presentationTimeOffset,
463
+ periodDuration, 0);
433
464
  expect(timeline).toEqual(
434
465
  expected.map((c) => jasmine.objectContaining(c)));
435
466
  }
@@ -33,22 +33,6 @@ describe('Demo', () => {
33
33
  await shakaDemoMain.cleanup();
34
34
  });
35
35
 
36
- it('has all messages defined', async () => {
37
- const englishBuffer =
38
- await shaka.test.Util.fetch('/base/demo/locales/en.json');
39
- const englishMessages = JSON.parse(shaka.util.StringUtils.fromUTF8(
40
- englishBuffer));
41
- const sourceBuffer =
42
- await shaka.test.Util.fetch('/base/demo/locales/source.json');
43
- const sourceMessages = JSON.parse(shaka.util.StringUtils.fromUTF8(
44
- sourceBuffer));
45
-
46
- for (const id of Object.values(shakaDemo.MessageIds)) {
47
- expect(englishMessages[id]).withContext(`id=${id}, English`).toBeTruthy();
48
- expect(sourceMessages[id]).withContext(`id=${id}, source`).toBeTruthy();
49
- }
50
- });
51
-
52
36
  describe('config', () => {
53
37
  it('does not have entries for invalid config options', () => {
54
38
  // We determine whether a config option has been made or not by looking at
@@ -77,6 +77,8 @@ describe('HlsParser live', () => {
77
77
  enableLowLatencyMode: () => {},
78
78
  updateDuration: () => {},
79
79
  newDrmInfo: (stream) => {},
80
+ onManifestUpdated: () => {},
81
+ getBandwidthEstimate: () => 1e6,
80
82
  };
81
83
 
82
84
  parser = new shaka.hls.HlsParser();
@@ -686,23 +688,29 @@ describe('HlsParser live', () => {
686
688
  const partialRef = makeReference(
687
689
  'test:/partial.mp4', 0, 2, /* syncTime= */ null,
688
690
  /* baseUri= */ '', /* startByte= */ 0, /* endByte= */ null);
691
+ partialRef.partial = true;
689
692
 
690
693
  const partialRef2 = makeReference(
691
694
  'test:/partial2.mp4', 2, 4, /* syncTime= */ null,
692
695
  /* baseUri= */ '', /* startByte= */ 0, /* endByte= */ null);
696
+ partialRef2.partial = true;
697
+ partialRef2.lastPartial = true;
693
698
 
694
699
  const ref = makeReference(
695
700
  'test:/main.mp4', 0, 4, /* syncTime= */ null,
696
701
  /* baseUri= */ '', /* startByte= */ 0, /* endByte= */ null,
697
702
  /* timestampOffset= */ 0, [partialRef, partialRef2]);
703
+ ref.allPartialSegments = true;
698
704
 
699
705
  const partialRef3 = makeReference(
700
706
  'test:/partial.mp4', 4, 6, /* syncTime= */ null,
701
707
  /* baseUri= */ '', /* startByte= */ 0, /* endByte= */ null);
708
+ partialRef3.partial = true;
702
709
 
703
710
  const preloadRef = makeReference(
704
711
  'test:/partial.mp4', 6, 7.5, /* syncTime= */ null,
705
712
  /* baseUri= */ '', /* startByte= */ 0, /* endByte= */ null);
713
+ preloadRef.partial = true;
706
714
  preloadRef.markAsPreload();
707
715
  preloadRef.markAsNonIndependent();
708
716
 
@@ -772,6 +780,7 @@ describe('HlsParser live', () => {
772
780
  'test:/ref1.mp4', 0, 4, /* syncTime= */ null,
773
781
  /* baseUri= */ '', /* startByte= */ 0, /* endByte= */ 429,
774
782
  /* timestampOffset= */ 0, [partialRef, partialRef2]);
783
+ ref.allPartialSegments = true;
775
784
 
776
785
  const partialRef3 = makeReference(
777
786
  'test:/ref2.mp4', 4, 6, /* syncTime= */ null,
@@ -965,9 +974,11 @@ describe('HlsParser live', () => {
965
974
  'test:/main.mp4', 0, 2, /* syncTime= */ null);
966
975
 
967
976
  const newRef1 = makeReference(
968
- 'test:/redirected/main.mp4', 0, 2, /* syncTime= */ null);
977
+ ['test:/redirected/main.mp4', 'test:/main.mp4'],
978
+ 0, 2, /* syncTime= */ null);
969
979
  const newRef2 = makeReference(
970
- 'test:/redirected/main2.mp4', 2, 4, /* syncTime= */ null);
980
+ ['test:/redirected/main2.mp4', 'test:/main2.mp4'],
981
+ 2, 4, /* syncTime= */ null);
971
982
 
972
983
  let playlistFetchCount = 0;
973
984
 
@@ -1299,7 +1310,7 @@ describe('HlsParser live', () => {
1299
1310
  }); // describe('playlist type LIVE')
1300
1311
 
1301
1312
  /**
1302
- * @param {string} uri A relative URI to http://example.com
1313
+ * @param {string|Array.<string>} uri A relative URI to http://example.com
1303
1314
  * @param {number} start
1304
1315
  * @param {number} end
1305
1316
  * @param {?number} syncTime