shaka-player 4.3.10 → 4.4.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 (316) hide show
  1. package/.github/workflows/release-please.yaml +7 -0
  2. package/AUTHORS +9 -0
  3. package/CHANGELOG.md +295 -200
  4. package/CONTRIBUTORS +8 -0
  5. package/LICENSE +32 -0
  6. package/README.md +63 -10
  7. package/demo/autoTemplate.txt +40 -5
  8. package/demo/close_button.js +11 -0
  9. package/demo/common/asset.js +13 -1
  10. package/demo/common/assets.js +53 -3
  11. package/demo/common/message_ids.js +25 -1
  12. package/demo/config.js +69 -10
  13. package/demo/customWarning.txt +2 -2
  14. package/demo/index.html +3 -1
  15. package/demo/locales/en.json +26 -2
  16. package/demo/locales/source.json +105 -9
  17. package/demo/main.js +52 -9
  18. package/demo/search.js +3 -1
  19. package/demo/service_worker.js +3 -0
  20. package/dist/controls.css +1 -1
  21. package/dist/controls.css.map +1 -1
  22. package/dist/demo.compiled.debug.js +124 -112
  23. package/dist/demo.compiled.debug.map +3 -3
  24. package/dist/demo.compiled.js +124 -112
  25. package/dist/demo.compiled.map +3 -3
  26. package/dist/deps.js +46 -28
  27. package/dist/locales.js +28 -28
  28. package/dist/receiver.compiled.debug.js +52 -46
  29. package/dist/receiver.compiled.debug.map +3 -3
  30. package/dist/receiver.compiled.js +52 -46
  31. package/dist/receiver.compiled.map +3 -3
  32. package/dist/shaka-player.compiled.d.ts +676 -391
  33. package/dist/shaka-player.compiled.debug.d.ts +676 -391
  34. package/dist/shaka-player.compiled.debug.externs.js +1188 -616
  35. package/dist/shaka-player.compiled.debug.js +1045 -700
  36. package/dist/shaka-player.compiled.debug.map +4 -4
  37. package/dist/shaka-player.compiled.externs.js +1188 -616
  38. package/dist/shaka-player.compiled.js +1094 -933
  39. package/dist/shaka-player.compiled.map +4 -4
  40. package/dist/shaka-player.ui.d.ts +677 -392
  41. package/dist/shaka-player.ui.debug.d.ts +677 -392
  42. package/dist/shaka-player.ui.debug.externs.js +1023 -451
  43. package/dist/shaka-player.ui.debug.js +1100 -739
  44. package/dist/shaka-player.ui.debug.map +4 -4
  45. package/dist/shaka-player.ui.externs.js +1023 -451
  46. package/dist/shaka-player.ui.js +1244 -1071
  47. package/dist/shaka-player.ui.map +4 -4
  48. package/docs/tutorials/ad_monetization.md +15 -1
  49. package/docs/tutorials/application-level-redirects.md +1 -1
  50. package/docs/tutorials/config.md +9 -5
  51. package/docs/tutorials/drm-config.md +61 -0
  52. package/docs/tutorials/fairplay.md +19 -4
  53. package/docs/tutorials/license-server-auth.md +4 -4
  54. package/docs/tutorials/license-wrapping.md +2 -2
  55. package/docs/tutorials/ui-customization.md +7 -3
  56. package/docs/tutorials/ui.md +7 -7
  57. package/docs/tutorials/upgrade.md +3 -0
  58. package/externs/ima.js +123 -2
  59. package/externs/isoboxer.js +217 -0
  60. package/externs/mediakeys.js +18 -0
  61. package/externs/mux.js +1 -105
  62. package/externs/pictureinpicture.js +48 -0
  63. package/externs/shaka/ads.js +61 -1
  64. package/externs/shaka/cea.js +110 -0
  65. package/externs/shaka/codecs.js +32 -0
  66. package/externs/shaka/manifest.js +101 -1
  67. package/externs/shaka/manifest_parser.js +0 -10
  68. package/externs/shaka/net.js +36 -7
  69. package/externs/shaka/offline.js +8 -1
  70. package/externs/shaka/player.js +220 -21
  71. package/externs/shaka/text.js +1 -382
  72. package/externs/shaka/transmuxer.js +59 -0
  73. package/karma.conf.js +13 -0
  74. package/lib/abr/simple_abr_manager.js +6 -3
  75. package/lib/ads/ad_manager.js +60 -2
  76. package/lib/ads/client_side_ad.js +86 -0
  77. package/lib/ads/client_side_ad_manager.js +79 -3
  78. package/lib/ads/server_side_ad.js +86 -0
  79. package/lib/ads/server_side_ad_manager.js +13 -0
  80. package/lib/cast/cast_utils.js +1 -0
  81. package/lib/cea/cea608_data_channel.js +24 -14
  82. package/lib/cea/cea608_memory.js +5 -2
  83. package/lib/cea/cea708_service.js +8 -9
  84. package/lib/cea/cea708_window.js +1 -2
  85. package/lib/cea/cea_decoder.js +23 -6
  86. package/lib/cea/cea_utils.js +25 -2
  87. package/lib/cea/dummy_caption_decoder.js +21 -0
  88. package/lib/cea/dummy_cea_parser.js +1 -3
  89. package/lib/cea/mp4_cea_parser.js +15 -10
  90. package/lib/cea/ts_cea_parser.js +69 -0
  91. package/lib/dash/content_protection.js +32 -2
  92. package/lib/dash/dash_parser.js +93 -31
  93. package/lib/dash/mpd_utils.js +6 -25
  94. package/lib/dash/segment_base.js +12 -14
  95. package/lib/dash/segment_list.js +10 -6
  96. package/lib/dash/segment_template.js +349 -32
  97. package/lib/dependencies/all.js +8 -0
  98. package/lib/hls/hls_classes.js +33 -8
  99. package/lib/hls/hls_parser.js +805 -191
  100. package/lib/hls/manifest_text_parser.js +4 -14
  101. package/lib/media/adaptation_set_criteria.js +43 -3
  102. package/lib/media/closed_caption_parser.js +74 -12
  103. package/lib/media/drm_engine.js +189 -49
  104. package/lib/media/gap_jumping_controller.js +1 -1
  105. package/lib/media/manifest_parser.js +34 -0
  106. package/lib/media/media_source_capabilities.js +10 -0
  107. package/lib/media/media_source_engine.js +475 -231
  108. package/lib/media/playhead.js +1 -1
  109. package/lib/media/presentation_timeline.js +62 -0
  110. package/lib/media/segment_index.js +50 -14
  111. package/lib/media/segment_prefetch.js +277 -0
  112. package/lib/media/segment_reference.js +70 -4
  113. package/lib/media/streaming_engine.js +258 -81
  114. package/lib/media/video_wrapper.js +15 -7
  115. package/lib/mss/content_protection.js +353 -0
  116. package/lib/mss/mss_parser.js +1081 -0
  117. package/lib/net/networking_engine.js +60 -10
  118. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  119. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  120. package/lib/offline/manifest_converter.js +6 -0
  121. package/lib/offline/storage.js +2 -4
  122. package/lib/player.js +309 -105
  123. package/lib/polyfill/media_capabilities.js +43 -3
  124. package/lib/polyfill/patchedmediakeys_apple.js +5 -0
  125. package/lib/polyfill/patchedmediakeys_nop.js +5 -0
  126. package/lib/polyfill/patchedmediakeys_webkit.js +5 -0
  127. package/lib/text/cue.js +208 -130
  128. package/lib/text/lrc_text_parser.js +2 -2
  129. package/lib/text/mp4_vtt_parser.js +2 -2
  130. package/lib/text/sbv_text_parser.js +1 -1
  131. package/lib/text/simple_text_displayer.js +2 -1
  132. package/lib/text/srt_text_parser.js +9 -1
  133. package/lib/text/ssa_text_parser.js +2 -2
  134. package/lib/text/text_engine.js +3 -21
  135. package/lib/text/text_utils.js +71 -20
  136. package/lib/text/ui_text_displayer.js +14 -14
  137. package/lib/text/vtt_text_parser.js +22 -14
  138. package/lib/transmuxer/aac_transmuxer.js +224 -0
  139. package/lib/transmuxer/ac3.js +142 -0
  140. package/lib/transmuxer/ac3_transmuxer.js +212 -0
  141. package/lib/transmuxer/adts.js +232 -0
  142. package/lib/transmuxer/ec3.js +103 -0
  143. package/lib/transmuxer/ec3_transmuxer.js +212 -0
  144. package/lib/transmuxer/h264.js +324 -0
  145. package/lib/transmuxer/mp3_transmuxer.js +204 -0
  146. package/lib/transmuxer/mpeg_audio.js +196 -0
  147. package/lib/transmuxer/mpeg_ts_transmuxer.js +182 -0
  148. package/lib/transmuxer/mss_transmuxer.js +389 -0
  149. package/lib/{media/transmuxer.js → transmuxer/muxjs_transmuxer.js} +34 -80
  150. package/lib/transmuxer/transmuxer_engine.js +161 -0
  151. package/lib/transmuxer/ts_transmuxer.js +738 -0
  152. package/lib/util/cmcd_manager.js +131 -71
  153. package/lib/util/error.js +62 -26
  154. package/lib/util/exp_golomb.js +220 -0
  155. package/lib/util/fairplay_utils.js +64 -13
  156. package/lib/util/id3_utils.js +56 -3
  157. package/lib/util/language_utils.js +11 -8
  158. package/lib/util/manifest_parser_utils.js +3 -0
  159. package/lib/util/mime_utils.js +44 -7
  160. package/lib/util/mp4_box_parsers.js +233 -5
  161. package/lib/util/mp4_generator.js +1381 -0
  162. package/lib/util/periods.js +40 -34
  163. package/lib/util/platform.js +17 -3
  164. package/lib/util/player_configuration.js +38 -1
  165. package/lib/util/stream_utils.js +138 -27
  166. package/lib/util/text_parser.js +1 -1
  167. package/lib/util/ts_parser.js +470 -47
  168. package/lib/util/xml_utils.js +16 -3
  169. package/maintained-branches.md +2 -2
  170. package/package.json +3 -1
  171. package/roadmap.md +21 -6
  172. package/shaka-player.uncompiled.js +18 -0
  173. package/test/abr/simple_abr_manager_unit.js +32 -4
  174. package/test/ads/ad_manager_unit.js +18 -2
  175. package/test/cast/cast_utils_unit.js +7 -2
  176. package/test/cea/cea608_memory_unit.js +24 -0
  177. package/test/cea/cea_decoder_unit.js +33 -0
  178. package/test/dash/dash_parser_content_protection_unit.js +93 -3
  179. package/test/dash/dash_parser_live_unit.js +56 -13
  180. package/test/dash/dash_parser_manifest_unit.js +70 -2
  181. package/test/dash/dash_parser_segment_base_unit.js +14 -9
  182. package/test/dash/dash_parser_segment_template_unit.js +286 -6
  183. package/test/demo/demo_unit.js +5 -1
  184. package/test/hls/hls_live_unit.js +188 -28
  185. package/test/hls/hls_parser_unit.js +250 -109
  186. package/test/hls/manifest_text_parser_unit.js +18 -13
  187. package/test/media/adaptation_set_criteria_unit.js +46 -14
  188. package/test/media/adaptation_set_unit.js +2 -0
  189. package/test/media/drm_engine_integration.js +11 -8
  190. package/test/media/drm_engine_unit.js +220 -7
  191. package/test/media/media_source_engine_integration.js +122 -38
  192. package/test/media/media_source_engine_unit.js +133 -153
  193. package/test/media/playhead_unit.js +3 -0
  194. package/test/media/presentation_timeline_unit.js +51 -0
  195. package/test/media/segment_index_unit.js +52 -0
  196. package/test/media/segment_prefetch_unit.js +243 -0
  197. package/test/media/streaming_engine_integration.js +9 -3
  198. package/test/media/streaming_engine_unit.js +440 -59
  199. package/test/mss/mss_parser_content_protection_unit.js +49 -0
  200. package/test/mss/mss_parser_unit.js +472 -0
  201. package/test/mss/mss_player_integration.js +123 -0
  202. package/test/offline/manifest_convert_unit.js +9 -0
  203. package/test/offline/storage_integration.js +6 -1
  204. package/test/player_unit.js +386 -133
  205. package/test/polyfill/media_capabilities_unit.js +18 -0
  206. package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
  207. package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
  208. package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
  209. package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
  210. package/test/test/assets/hls-raw-aac/manifest.m3u8 +4 -0
  211. package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +14 -0
  212. package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
  213. package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
  214. package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
  215. package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
  216. package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
  217. package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
  218. package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
  219. package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
  220. package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +31 -0
  221. package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
  222. package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
  223. package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
  224. package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
  225. package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
  226. package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
  227. package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
  228. package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
  229. package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +31 -0
  230. package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +13 -0
  231. package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
  232. package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
  233. package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
  234. package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
  235. package/test/test/assets/hls-raw-mp3/playlist.m3u8 +4 -0
  236. package/test/test/assets/hls-ts-aac/playlist.m3u8 +23 -0
  237. package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
  238. package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
  239. package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
  240. package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
  241. package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
  242. package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
  243. package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
  244. package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
  245. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
  246. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
  247. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
  248. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
  249. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
  250. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
  251. package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +19 -0
  252. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
  253. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
  254. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
  255. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
  256. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
  257. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
  258. package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +19 -0
  259. package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
  260. package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
  261. package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
  262. package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
  263. package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
  264. package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
  265. package/test/test/assets/hls-ts-h264/prog_index.m3u8 +25 -0
  266. package/test/test/assets/hls-ts-mp3/manifest.m3u8 +13 -0
  267. package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
  268. package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
  269. package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
  270. package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
  271. package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +17 -0
  272. package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
  273. package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
  274. package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
  275. package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
  276. package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
  277. package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
  278. package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +4 -0
  279. package/test/test/boot.js +7 -2
  280. package/test/test/util/fake_ad.js +99 -0
  281. package/test/test/util/fake_ad_manager.js +7 -1
  282. package/test/test/util/fake_networking_engine.js +41 -14
  283. package/test/test/util/fake_segment_prefetch.js +81 -0
  284. package/test/test/util/manifest_generator.js +19 -5
  285. package/test/test/util/mss_parser_util.js +115 -0
  286. package/test/test/util/offline_utils.js +1 -0
  287. package/test/test/util/simple_fakes.js +12 -3
  288. package/test/test/util/streaming_engine_util.js +14 -4
  289. package/test/test/util/ttml_utils.js +2 -2
  290. package/test/text/cue_integration.js +1 -1
  291. package/test/text/srt_text_parser_unit.js +78 -0
  292. package/test/text/text_engine_unit.js +17 -8
  293. package/test/text/ui_text_displayer_unit.js +4 -4
  294. package/test/text/vtt_text_parser_unit.js +59 -40
  295. package/test/text/web_vtt_generator_unit.js +9 -3
  296. package/test/{media/transmuxer_integration.js → transmuxer/muxjs_transmuxer_integration.js} +30 -33
  297. package/test/transmuxer/transmuxer_engine_integration.js +60 -0
  298. package/test/transmuxer/transmuxer_integration.js +296 -0
  299. package/test/util/cmcd_manager_unit.js +162 -13
  300. package/test/util/language_utils_unit.js +9 -2
  301. package/test/util/mp4_box_parsers_unit.js +39 -4
  302. package/test/util/periods_unit.js +34 -26
  303. package/test/util/stream_utils_unit.js +60 -107
  304. package/ui/controls.js +19 -1
  305. package/ui/controls.less +1 -0
  306. package/ui/externs/ui.js +11 -1
  307. package/ui/language_utils.js +15 -0
  308. package/ui/less/thumbnails.less +26 -0
  309. package/ui/locales/oc.json +42 -0
  310. package/ui/pip_button.js +83 -2
  311. package/ui/range_element.js +15 -0
  312. package/ui/resolution_selection.js +9 -2
  313. package/ui/seek_bar.js +223 -0
  314. package/ui/ui.js +5 -0
  315. package/lib/cea/i_caption_decoder.js +0 -51
  316. package/lib/cea/i_cea_parser.js +0 -68
@@ -70,11 +70,10 @@ shaka.dash.SegmentBase = class {
70
70
  * Creates a new StreamInfo object.
71
71
  *
72
72
  * @param {shaka.dash.DashParser.Context} context
73
- * @param {shaka.dash.DashParser.RequestInitSegmentCallback}
74
- * requestInitSegment
73
+ * @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment
75
74
  * @return {shaka.dash.DashParser.StreamInfo}
76
75
  */
77
- static createStreamInfo(context, requestInitSegment) {
76
+ static createStreamInfo(context, requestSegment) {
78
77
  goog.asserts.assert(context.representation.segmentBase,
79
78
  'Should only be called with SegmentBase');
80
79
  // Since SegmentBase does not need updates, simply treat any call as
@@ -111,7 +110,7 @@ shaka.dash.SegmentBase = class {
111
110
  return {
112
111
  generateSegmentIndex: () => {
113
112
  return SegmentBase.generateSegmentIndex_(
114
- shallowCopyOfContext, requestInitSegment, initSegmentReference,
113
+ shallowCopyOfContext, requestSegment, initSegmentReference,
115
114
  scaledPresentationTimeOffset);
116
115
  },
117
116
  };
@@ -121,8 +120,7 @@ shaka.dash.SegmentBase = class {
121
120
  * Creates a SegmentIndex for the given URIs and context.
122
121
  *
123
122
  * @param {shaka.dash.DashParser.Context} context
124
- * @param {shaka.dash.DashParser.RequestInitSegmentCallback}
125
- * requestInitSegment
123
+ * @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment
126
124
  * @param {shaka.media.InitSegmentReference} initSegmentReference
127
125
  * @param {!Array.<string>} uris
128
126
  * @param {number} startByte
@@ -131,7 +129,7 @@ shaka.dash.SegmentBase = class {
131
129
  * @return {!Promise.<shaka.media.SegmentIndex>}
132
130
  */
133
131
  static async generateSegmentIndexFromUris(
134
- context, requestInitSegment, initSegmentReference, uris, startByte,
132
+ context, requestSegment, initSegmentReference, uris, startByte,
135
133
  endByte, scaledPresentationTimeOffset) {
136
134
  // Unpack context right away, before we start an async process.
137
135
  // This immunizes us against changes to the context object later.
@@ -143,16 +141,17 @@ shaka.dash.SegmentBase = class {
143
141
  const containerType = context.representation.mimeType.split('/')[1];
144
142
 
145
143
  // Create a local variable to bind to so we can set to null to help the GC.
146
- let localRequest = requestInitSegment;
144
+ let localRequest = requestSegment;
147
145
  let segmentIndex = null;
148
146
 
149
147
  const responses = [
150
- localRequest(uris, startByte, endByte),
148
+ localRequest(uris, startByte, endByte, /* isInit= */ false),
151
149
  containerType == 'webm' ?
152
150
  localRequest(
153
151
  initSegmentReference.getUris(),
154
152
  initSegmentReference.startByte,
155
- initSegmentReference.endByte) :
153
+ initSegmentReference.endByte,
154
+ /* isInit= */ true) :
156
155
  null,
157
156
  ];
158
157
 
@@ -327,15 +326,14 @@ shaka.dash.SegmentBase = class {
327
326
  * Generate a SegmentIndex from a Context object.
328
327
  *
329
328
  * @param {shaka.dash.DashParser.Context} context
330
- * @param {shaka.dash.DashParser.RequestInitSegmentCallback}
331
- * requestInitSegment
329
+ * @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment
332
330
  * @param {shaka.media.InitSegmentReference} initSegmentReference
333
331
  * @param {number} scaledPresentationTimeOffset
334
332
  * @return {!Promise.<shaka.media.SegmentIndex>}
335
333
  * @private
336
334
  */
337
335
  static generateSegmentIndex_(
338
- context, requestInitSegment, initSegmentReference,
336
+ context, requestSegment, initSegmentReference,
339
337
  scaledPresentationTimeOffset) {
340
338
  const SegmentBase = shaka.dash.SegmentBase;
341
339
 
@@ -344,7 +342,7 @@ shaka.dash.SegmentBase = class {
344
342
  goog.asserts.assert(indexRange, 'Index range should not be null!');
345
343
 
346
344
  return shaka.dash.SegmentBase.generateSegmentIndexFromUris(
347
- context, requestInitSegment, initSegmentReference, indexUris,
345
+ context, requestSegment, initSegmentReference, indexUris,
348
346
  indexRange.start, indexRange.end,
349
347
  scaledPresentationTimeOffset);
350
348
  }
@@ -18,6 +18,7 @@ goog.require('shaka.util.Functional');
18
18
  goog.require('shaka.util.ManifestParserUtils');
19
19
  goog.require('shaka.util.XmlUtils');
20
20
  goog.requireType('shaka.dash.DashParser');
21
+ goog.requireType('shaka.media.PresentationTimeline');
21
22
 
22
23
 
23
24
  /**
@@ -223,9 +224,6 @@ shaka.dash.SegmentList = class {
223
224
  let prevEndTime = info.startTime;
224
225
  for (let i = 0; i < max; i++) {
225
226
  const segment = info.mediaSegments[i];
226
- const mediaUri = ManifestParserUtils.resolveUris(
227
- baseUris, [segment.mediaUri]);
228
-
229
227
  const startTime = prevEndTime;
230
228
  let endTime;
231
229
 
@@ -243,7 +241,13 @@ shaka.dash.SegmentList = class {
243
241
  endTime = startTime + periodDuration;
244
242
  }
245
243
 
246
- const getUris = () => mediaUri;
244
+ let uris = null;
245
+ const getUris = () => {
246
+ if (uris == null) {
247
+ uris = ManifestParserUtils.resolveUris(baseUris, [segment.mediaUri]);
248
+ }
249
+ return uris;
250
+ };
247
251
  references.push(
248
252
  new shaka.media.SegmentReference(
249
253
  periodStart + startTime,
@@ -323,7 +327,7 @@ shaka.dash.SegmentList.MediaSegment;
323
327
  * startTime: number,
324
328
  * startNumber: number,
325
329
  * scaledPresentationTimeOffset: number,
326
- * timeline: Array.<shaka.dash.MpdUtils.TimeRange>,
330
+ * timeline: Array.<shaka.media.PresentationTimeline.TimeRange>,
327
331
  * mediaSegments: !Array.<shaka.dash.SegmentList.MediaSegment>
328
332
  * }}
329
333
  * @private
@@ -339,7 +343,7 @@ shaka.dash.SegmentList.MediaSegment;
339
343
  * The start number of the segments; 1 or greater.
340
344
  * @property {number} scaledPresentationTimeOffset
341
345
  * The scaledPresentationTimeOffset of the representation, in seconds.
342
- * @property {Array.<shaka.dash.MpdUtils.TimeRange>} timeline
346
+ * @property {Array.<shaka.media.PresentationTimeline.TimeRange>} timeline
343
347
  * The timeline of the representation, if given. Times in seconds.
344
348
  * @property {!Array.<shaka.dash.SegmentList.MediaSegment>} mediaSegments
345
349
  * The URI and byte-ranges of the media segments.
@@ -14,9 +14,11 @@ goog.require('shaka.media.InitSegmentReference');
14
14
  goog.require('shaka.media.SegmentIndex');
15
15
  goog.require('shaka.media.SegmentReference');
16
16
  goog.require('shaka.util.Error');
17
+ goog.require('shaka.util.IReleasable');
17
18
  goog.require('shaka.util.ManifestParserUtils');
18
19
  goog.require('shaka.util.ObjectUtils');
19
20
  goog.requireType('shaka.dash.DashParser');
21
+ goog.requireType('shaka.media.PresentationTimeline');
20
22
 
21
23
 
22
24
  /**
@@ -28,8 +30,7 @@ shaka.dash.SegmentTemplate = class {
28
30
  * Updates the existing SegmentIndex, if any.
29
31
  *
30
32
  * @param {shaka.dash.DashParser.Context} context
31
- * @param {shaka.dash.DashParser.RequestInitSegmentCallback}
32
- * requestInitSegment
33
+ * @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment
33
34
  * @param {!Object.<string, !shaka.extern.Stream>} streamMap
34
35
  * @param {boolean} isUpdate True if the manifest is being updated.
35
36
  * @param {number} segmentLimit The maximum number of segments to generate for
@@ -38,13 +39,16 @@ shaka.dash.SegmentTemplate = class {
38
39
  * @return {shaka.dash.DashParser.StreamInfo}
39
40
  */
40
41
  static createStreamInfo(
41
- context, requestInitSegment, streamMap, isUpdate, segmentLimit,
42
+ context, requestSegment, streamMap, isUpdate, segmentLimit,
42
43
  periodDurationMap) {
43
44
  goog.asserts.assert(context.representation.segmentTemplate,
44
45
  'Should only be called with SegmentTemplate');
45
46
  const SegmentTemplate = shaka.dash.SegmentTemplate;
47
+ const TimelineSegmentIndex = shaka.dash.TimelineSegmentIndex;
46
48
 
47
49
  const initSegmentReference = SegmentTemplate.createInitSegment_(context);
50
+
51
+ /** @type {shaka.dash.SegmentTemplate.SegmentTemplateInfo} */
48
52
  const info = SegmentTemplate.parseSegmentTemplateInfo_(context);
49
53
 
50
54
  SegmentTemplate.checkSegmentTemplateInfo_(context, info);
@@ -62,7 +66,7 @@ shaka.dash.SegmentTemplate = class {
62
66
  return {
63
67
  generateSegmentIndex: () => {
64
68
  return SegmentTemplate.generateSegmentIndexFromIndexTemplate_(
65
- shallowCopyOfContext, requestInitSegment, initSegmentReference,
69
+ shallowCopyOfContext, requestSegment, initSegmentReference,
66
70
  info);
67
71
  },
68
72
  };
@@ -95,12 +99,11 @@ shaka.dash.SegmentTemplate = class {
95
99
  }
96
100
  }
97
101
 
98
- const references = SegmentTemplate.createFromTimeline_(
99
- shallowCopyOfContext, info, initSegmentReference);
100
-
101
102
  const periodStart = context.periodInfo.start;
102
- const periodEnd = context.periodInfo.duration ?
103
- context.periodInfo.start + context.periodInfo.duration : Infinity;
103
+ const periodEnd = context.periodInfo.duration ? periodStart +
104
+ context.periodInfo.duration : Infinity;
105
+
106
+ shaka.log.debug(`New manifest ${periodStart} - ${periodEnd}`);
104
107
 
105
108
  /* When to fit segments. All refactors should honor/update this table:
106
109
  *
@@ -120,23 +123,32 @@ shaka.dash.SegmentTemplate = class {
120
123
  // most recent segment to the end of the presentation).
121
124
  const shouldFit = !(context.dynamic && context.periodInfo.isLastPeriod);
122
125
 
123
- if (segmentIndex) {
124
- if (shouldFit) {
125
- // Fit the new references before merging them, so that the merge
126
- // algorithm has a more accurate view of their start and end times.
127
- const wrapper = new shaka.media.SegmentIndex(references);
128
- wrapper.fit(periodStart, periodEnd, /* isNew= */ true);
129
- }
130
-
131
- segmentIndex.mergeAndEvict(references,
132
- context.presentationTimeline.getSegmentAvailabilityStart());
126
+ if (!segmentIndex) {
127
+ shaka.log.debug(`Creating TSI with end ${periodEnd}`);
128
+ segmentIndex = new TimelineSegmentIndex(
129
+ info,
130
+ context.representation.id,
131
+ context.bandwidth,
132
+ context.representation.baseUris,
133
+ periodStart,
134
+ periodEnd,
135
+ initSegmentReference,
136
+ shouldFit,
137
+ );
133
138
  } else {
134
- segmentIndex = new shaka.media.SegmentIndex(references);
139
+ const tsi = /** @type {!TimelineSegmentIndex} */(segmentIndex);
140
+ tsi.appendTemplateInfo(info, periodStart, periodEnd, shouldFit);
141
+
142
+ const availabilityStart =
143
+ context.presentationTimeline.getSegmentAvailabilityStart();
144
+ tsi.evict(availabilityStart);
135
145
  }
136
- context.presentationTimeline.notifySegments(references);
137
146
 
138
- if (shouldFit) {
139
- segmentIndex.fit(periodStart, periodEnd);
147
+ if (info.timeline && context.adaptationSet.contentType !== 'image') {
148
+ const timeline = info.timeline;
149
+ context.presentationTimeline.notifyTimeRange(
150
+ timeline,
151
+ periodStart);
140
152
  }
141
153
 
142
154
  if (stream && context.dynamic) {
@@ -148,8 +160,10 @@ shaka.dash.SegmentTemplate = class {
148
160
  // If segmentIndex is deleted, or segmentIndex's references are
149
161
  // released by closeSegmentIndex(), we should set the value of
150
162
  // segmentIndex again.
151
- if (!segmentIndex || segmentIndex.isEmpty()) {
152
- segmentIndex.merge(references);
163
+ if (segmentIndex instanceof shaka.dash.TimelineSegmentIndex &&
164
+ segmentIndex.isEmpty()) {
165
+ segmentIndex.appendTemplateInfo(info, periodStart,
166
+ periodEnd, shouldFit);
153
167
  }
154
168
  return Promise.resolve(segmentIndex);
155
169
  },
@@ -253,15 +267,14 @@ shaka.dash.SegmentTemplate = class {
253
267
  * Generates a SegmentIndex from an index URL template.
254
268
  *
255
269
  * @param {shaka.dash.DashParser.Context} context
256
- * @param {shaka.dash.DashParser.RequestInitSegmentCallback}
257
- * requestInitSegment
270
+ * @param {shaka.dash.DashParser.RequestSegmentCallback} requestSegment
258
271
  * @param {shaka.media.InitSegmentReference} init
259
272
  * @param {shaka.dash.SegmentTemplate.SegmentTemplateInfo} info
260
273
  * @return {!Promise.<shaka.media.SegmentIndex>}
261
274
  * @private
262
275
  */
263
276
  static generateSegmentIndexFromIndexTemplate_(
264
- context, requestInitSegment, init, info) {
277
+ context, requestSegment, init, info) {
265
278
  const MpdUtils = shaka.dash.MpdUtils;
266
279
  const ManifestParserUtils = shaka.util.ManifestParserUtils;
267
280
 
@@ -274,7 +287,7 @@ shaka.dash.SegmentTemplate = class {
274
287
  context.representation.baseUris, [filledTemplate]);
275
288
 
276
289
  return shaka.dash.SegmentBase.generateSegmentIndexFromUris(
277
- context, requestInitSegment, init, resolvedUris, 0, null,
290
+ context, requestSegment, init, resolvedUris, 0, null,
278
291
  info.scaledPresentationTimeOffset);
279
292
  }
280
293
 
@@ -599,6 +612,311 @@ shaka.dash.SegmentTemplate = class {
599
612
  }
600
613
  };
601
614
 
615
+
616
+ /**
617
+ * A SegmentIndex that returns segments references on demand from
618
+ * a segment timeline.
619
+ *
620
+ * @extends shaka.media.SegmentIndex
621
+ * @implements {shaka.util.IReleasable}
622
+ * @implements {Iterable.<!shaka.media.SegmentReference>}
623
+ *
624
+ * @private
625
+ *
626
+ */
627
+ shaka.dash.TimelineSegmentIndex = class extends shaka.media.SegmentIndex {
628
+ /**
629
+ *
630
+ * @param {!shaka.dash.SegmentTemplate.SegmentTemplateInfo} templateInfo
631
+ * @param {?string} representationId
632
+ * @param {number} bandwidth
633
+ * @param {Array.<string>} baseUris
634
+ * @param {number} periodStart
635
+ * @param {number} periodEnd
636
+ * @param {shaka.media.InitSegmentReference} initSegmentReference
637
+ * @param {boolean} shouldFit
638
+ *
639
+ */
640
+ constructor(templateInfo, representationId, bandwidth, baseUris,
641
+ periodStart, periodEnd, initSegmentReference, shouldFit) {
642
+ super([]);
643
+
644
+ /** @private {?shaka.dash.SegmentTemplate.SegmentTemplateInfo} */
645
+ this.templateInfo_ = templateInfo;
646
+ /** @private {?string} */
647
+ this.representationId_ = representationId;
648
+ /** @private {number} */
649
+ this.bandwidth_ = bandwidth;
650
+ /** @private {Array.<string>} */
651
+ this.baseUris_ = baseUris;
652
+ /** @private {number} */
653
+ this.periodStart_ = periodStart;
654
+ /** @private {number} */
655
+ this.periodEnd_ = periodEnd;
656
+ /** @private {shaka.media.InitSegmentReference} */
657
+ this.initSegmentReference_ = initSegmentReference;
658
+
659
+
660
+ if (shouldFit) {
661
+ this.fitTimeline();
662
+ }
663
+ }
664
+
665
+ /**
666
+ * @override
667
+ */
668
+ getNumReferences() {
669
+ if (this.templateInfo_) {
670
+ return this.templateInfo_.timeline.length;
671
+ } else {
672
+ return 0;
673
+ }
674
+ }
675
+
676
+ /**
677
+ * @override
678
+ */
679
+ release() {
680
+ super.release();
681
+ this.templateInfo_ = null;
682
+ // We cannot release other fields, as segment index can
683
+ // be recreated using only template info.
684
+ }
685
+
686
+
687
+ /**
688
+ * @override
689
+ */
690
+ evict(time) {
691
+ if (!this.templateInfo_) {
692
+ return;
693
+ }
694
+ shaka.log.debug(`${this.representationId_} Evicting at ${time}`);
695
+ let numToEvict = 0;
696
+ const timeline = this.templateInfo_.timeline;
697
+
698
+ for (let i = 0; i < timeline.length; i += 1) {
699
+ const range = timeline[i];
700
+ const end = range.end + this.periodStart_;
701
+ const start = range.start + this.periodStart_;
702
+
703
+ if (end <= time) {
704
+ shaka.log.debug(`Evicting ${start} - ${end}`);
705
+ numToEvict += 1;
706
+ } else {
707
+ break;
708
+ }
709
+ }
710
+
711
+ if (numToEvict > 0) {
712
+ this.templateInfo_.timeline = timeline.slice(numToEvict);
713
+ if (this.references.length >= numToEvict) {
714
+ this.references = this.references.slice(numToEvict);
715
+ }
716
+
717
+ this.numEvicted_ += numToEvict;
718
+
719
+ if (this.getNumReferences() === 0) {
720
+ this.release();
721
+ }
722
+ }
723
+ }
724
+
725
+ /**
726
+ * Merge new template info
727
+ * @param {shaka.dash.SegmentTemplate.SegmentTemplateInfo} info
728
+ * @param {number} periodStart
729
+ * @param {number} periodEnd
730
+ * @param {boolean} shouldFit
731
+ */
732
+ appendTemplateInfo(info, periodStart, periodEnd, shouldFit) {
733
+ if (!this.templateInfo_) {
734
+ this.templateInfo_ = info;
735
+ this.periodStart_ = periodStart;
736
+ this.periodEnd_ = periodEnd;
737
+ } else {
738
+ const currentTimeline = this.templateInfo_.timeline;
739
+
740
+ // Append timeline
741
+ const lastCurrentEntry = currentTimeline[currentTimeline.length - 1];
742
+ const newEntries = info.timeline.filter((entry) => {
743
+ return entry.start >= lastCurrentEntry.end;
744
+ });
745
+
746
+ if (newEntries.length > 0) {
747
+ shaka.log.debug(`Appending ${newEntries.length} entries`);
748
+ this.templateInfo_.timeline.push(...newEntries);
749
+ }
750
+
751
+ if (this.periodEnd_ !== periodEnd) {
752
+ this.periodEnd_ = periodEnd;
753
+ }
754
+ }
755
+
756
+ if (shouldFit) {
757
+ this.fitTimeline();
758
+ }
759
+ }
760
+
761
+ /**
762
+ *
763
+ * @param {number} time
764
+ */
765
+ isBeforeFirstEntry(time) {
766
+ const hasTimeline = this.templateInfo_ &&
767
+ this.templateInfo_.timeline && this.templateInfo_.timeline.length;
768
+
769
+ if (hasTimeline) {
770
+ const timeline = this.templateInfo_.timeline;
771
+ return time < timeline[0].start + this.periodStart_;
772
+ } else {
773
+ return false;
774
+ }
775
+ }
776
+
777
+ /**
778
+ * Fit timeline entries to period boundaries
779
+ */
780
+ fitTimeline() {
781
+ if (this.getIsImmutable()) {
782
+ return;
783
+ }
784
+ const timeline = this.templateInfo_.timeline;
785
+ while (timeline.length) {
786
+ const lastTimePeriod = timeline[timeline.length - 1];
787
+ if (lastTimePeriod.start >= this.periodEnd_) {
788
+ timeline.pop();
789
+ } else {
790
+ break;
791
+ }
792
+ }
793
+
794
+ this.evict(this.periodStart_);
795
+
796
+ if (timeline.length === 0) {
797
+ return;
798
+ }
799
+
800
+ if (this.periodEnd_ !== Infinity) {
801
+ // Adjust the last timeline entry to match the period end
802
+ const lastTimePeriod = timeline[timeline.length - 1];
803
+ // NOTE: end should be relative to period start
804
+ lastTimePeriod.end = this.periodEnd_ - this.periodStart_;
805
+ }
806
+ }
807
+
808
+ /**
809
+ * @override
810
+ */
811
+ find(time) {
812
+ shaka.log.debug(`Find ${time}`);
813
+
814
+ if (this.isBeforeFirstEntry(time)) {
815
+ return this.numEvicted_;
816
+ }
817
+
818
+ if (!this.templateInfo_) {
819
+ return null;
820
+ }
821
+
822
+ const timeline = this.templateInfo_.timeline;
823
+
824
+ // Early exit if the time isn't within this period
825
+ if (time < this.periodStart_ || time > this.periodEnd_) {
826
+ return null;
827
+ }
828
+
829
+ const lastIndex = timeline.length - 1;
830
+
831
+ for (let i = 0; i < timeline.length; i++) {
832
+ const range = timeline[i];
833
+ const start = range.start + this.periodStart_;
834
+ // A rounding error can cause /time/ to equal e.endTime or fall in between
835
+ // the references by a fraction of a second. To account for this, we use
836
+ // the start of the next segment as /end/, unless this is the last
837
+ // reference, in which case we use the period end as the /end/
838
+ let end = range.end + this.periodStart_;
839
+
840
+ if (i < lastIndex) {
841
+ end = timeline[i + 1].start + this.periodStart_;
842
+ }
843
+
844
+ if ((time >= start) && (time < end)) {
845
+ return i + this.numEvicted_;
846
+ }
847
+ }
848
+
849
+ return null;
850
+ }
851
+
852
+ /**
853
+ * @override
854
+ */
855
+ get(position) {
856
+ const correctedPosition = position - this.numEvicted_;
857
+ if (correctedPosition < 0 ||
858
+ correctedPosition >= this.getNumReferences() || !this.templateInfo_) {
859
+ return null;
860
+ }
861
+
862
+ let ref = this.references[correctedPosition];
863
+
864
+ if (!ref) {
865
+ const range = this.templateInfo_.timeline[correctedPosition];
866
+ const segmentReplacement = position + this.templateInfo_.startNumber;
867
+ const timeReplacement = this.templateInfo_
868
+ .unscaledPresentationTimeOffset + range.unscaledStart;
869
+
870
+ const createUrisCb = () => {
871
+ return shaka.dash.TimelineSegmentIndex
872
+ .createUris_(
873
+ this.templateInfo_.mediaTemplate,
874
+ this.representationId_,
875
+ segmentReplacement,
876
+ this.bandwidth_,
877
+ timeReplacement,
878
+ this.baseUris_,
879
+ );
880
+ };
881
+
882
+ const timestampOffset = this.periodStart_ -
883
+ this.templateInfo_.scaledPresentationTimeOffset;
884
+
885
+ ref = new shaka.media.SegmentReference(
886
+ this.periodStart_ + range.start,
887
+ this.periodStart_ + range.end,
888
+ createUrisCb,
889
+ /* startByte= */ 0,
890
+ /* endByte= */ null,
891
+ this.initSegmentReference_,
892
+ timestampOffset,
893
+ this.periodStart_,
894
+ this.periodEnd_);
895
+ this.references[correctedPosition] = ref;
896
+ }
897
+
898
+ return ref;
899
+ }
900
+
901
+ /**
902
+ * Fill in a specific template with values to get the segment uris
903
+ *
904
+ * @return {!Array.<string>}
905
+ * @private
906
+ */
907
+ static createUris_(mediaTemplate, repId, segmentReplacement,
908
+ bandwidth, timeReplacement, baseUris) {
909
+ const mediaUri = shaka.dash.MpdUtils.fillUriTemplate(
910
+ mediaTemplate, repId,
911
+ segmentReplacement, bandwidth || null, timeReplacement);
912
+ return shaka.util.ManifestParserUtils
913
+ .resolveUris(baseUris, [mediaUri])
914
+ .map((g) => {
915
+ return g.toString();
916
+ });
917
+ }
918
+ };
919
+
602
920
  /**
603
921
  * @typedef {{
604
922
  * timescale: number,
@@ -606,11 +924,10 @@ shaka.dash.SegmentTemplate = class {
606
924
  * startNumber: number,
607
925
  * scaledPresentationTimeOffset: number,
608
926
  * unscaledPresentationTimeOffset: number,
609
- * timeline: Array.<shaka.dash.MpdUtils.TimeRange>,
927
+ * timeline: Array.<shaka.media.PresentationTimeline.TimeRange>,
610
928
  * mediaTemplate: ?string,
611
929
  * indexTemplate: ?string
612
930
  * }}
613
- * @private
614
931
  *
615
932
  * @description
616
933
  * Contains information about a SegmentTemplate.
@@ -625,7 +942,7 @@ shaka.dash.SegmentTemplate = class {
625
942
  * The presentation time offset of the representation, in seconds.
626
943
  * @property {number} unscaledPresentationTimeOffset
627
944
  * The presentation time offset of the representation, in timescale units.
628
- * @property {Array.<shaka.dash.MpdUtils.TimeRange>} timeline
945
+ * @property {Array.<shaka.media.PresentationTimeline.TimeRange>} timeline
629
946
  * The timeline of the representation, if given. Times in seconds.
630
947
  * @property {?string} mediaTemplate
631
948
  * The media URI template, if given.
@@ -41,6 +41,12 @@ shaka.dependencies = class {
41
41
  return /** @type {?muxjs} */ (shaka.dependencies.dependencies_.get(
42
42
  shaka.dependencies.Allowed.muxjs)());
43
43
  }
44
+
45
+ /** @return {?ISOBoxer} */
46
+ static isoBoxer() {
47
+ return /** @type {?ISOBoxer} */ (shaka.dependencies.dependencies_.get(
48
+ shaka.dependencies.Allowed.ISOBoxer)());
49
+ }
44
50
  };
45
51
 
46
52
  /**
@@ -49,6 +55,7 @@ shaka.dependencies = class {
49
55
  */
50
56
  shaka.dependencies.Allowed = {
51
57
  muxjs: 'muxjs',
58
+ ISOBoxer: 'ISOBoxer',
52
59
  };
53
60
 
54
61
  /**
@@ -59,4 +66,5 @@ shaka.dependencies.Allowed = {
59
66
  */
60
67
  shaka.dependencies.dependencies_ = new Map([
61
68
  [shaka.dependencies.Allowed.muxjs, () => window.muxjs],
69
+ [shaka.dependencies.Allowed.ISOBoxer, () => window.ISOBoxer],
62
70
  ]);