shaka-player 3.3.2 → 4.0.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 (389) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/pull_request_template.md +6 -34
  4. package/.github/workflows/build-and-test.yaml +129 -0
  5. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  6. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  7. package/.github/workflows/demo-version-index.yaml +37 -0
  8. package/.github/workflows/nightly-demo.yaml +42 -0
  9. package/.github/workflows/release-please.yaml +168 -0
  10. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  11. package/.github/workflows/selenium-lab-tests.yaml +92 -0
  12. package/.github/workflows/sync-labels.yaml +33 -0
  13. package/.github/workflows/update-issues.yaml +29 -0
  14. package/.github/workflows/validate-pr-title.yaml +35 -0
  15. package/AUTHORS +3 -0
  16. package/CHANGELOG.md +1866 -1675
  17. package/CONTRIBUTING.md +2 -2
  18. package/CONTRIBUTORS +3 -0
  19. package/README.md +16 -13
  20. package/app-engine/README.md +9 -0
  21. package/app-engine/demo-version-index/README.md +14 -0
  22. package/app-engine/demo-version-index/app.yaml +28 -0
  23. package/app-engine/demo-version-index/generate.py +164 -0
  24. package/app-engine/demo-version-index/main.py +11 -0
  25. package/app-engine/demo-version-index/requirements.txt +5 -0
  26. package/app-engine/demo-version-index/templates/index.html +114 -0
  27. package/app-engine/shaka-player-demo/README.md +18 -0
  28. package/app-engine/shaka-player-demo/app.yaml +61 -0
  29. package/app-engine/shaka-player-demo/main.py +95 -0
  30. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  31. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  32. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  33. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  34. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  35. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  36. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  37. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  38. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  39. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  40. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  41. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  42. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  43. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  44. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  45. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  46. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  47. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  48. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  49. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  50. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  51. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  52. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  53. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  54. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  55. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  56. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  57. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  58. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  59. package/app-engine/shaka-player-demo/posters.py +110 -0
  60. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  61. package/app-engine/shaka-player-demo/time.txt +1 -0
  62. package/build/README.md +3 -3
  63. package/build/checkversion.py +1 -1
  64. package/build/compiler.py +1 -1
  65. package/build/conformance.textproto +13 -0
  66. package/build/docker/Dockerfile +20 -0
  67. package/build/docker/docker-compose.yml +10 -0
  68. package/build/gendeps.py +18 -15
  69. package/build/shaka-lab.yaml +161 -0
  70. package/build/shakaBuildHelpers.py +4 -29
  71. package/build/test.py +94 -29
  72. package/build/types/core +0 -1
  73. package/build/types/polyfill +1 -3
  74. package/build/wrapper.template.js +2 -2
  75. package/demo/TengwarTelcontar.woff2 +0 -0
  76. package/demo/asset_card.js +1 -2
  77. package/demo/cast_receiver/index.html +1 -1
  78. package/demo/cast_receiver/receiver_app.css +14 -14
  79. package/demo/common/asset.js +17 -1
  80. package/demo/common/assets.js +31 -0
  81. package/demo/common/message_ids.js +6 -3
  82. package/demo/config.js +10 -12
  83. package/demo/custom.js +39 -1
  84. package/demo/customWarning.txt +2 -2
  85. package/demo/demo.less +29 -18
  86. package/demo/demo_uncompiled.js +1 -13
  87. package/demo/demo_utils.js +0 -1
  88. package/demo/index.html +1 -1
  89. package/demo/locales/en.json +6 -3
  90. package/demo/locales/source.json +22 -10
  91. package/demo/main.js +12 -9
  92. package/demo/search.js +2 -1
  93. package/dist/controls.css +3 -3
  94. package/dist/controls.css.map +1 -1
  95. package/dist/demo.compiled.debug.js +236 -232
  96. package/dist/demo.compiled.debug.map +4 -4
  97. package/dist/demo.compiled.js +236 -232
  98. package/dist/demo.compiled.map +4 -4
  99. package/dist/demo.css +1 -1
  100. package/dist/demo.css.map +1 -1
  101. package/dist/deps.js +229 -226
  102. package/dist/locales.js +34 -32
  103. package/dist/receiver.compiled.debug.js +75 -73
  104. package/dist/receiver.compiled.debug.map +4 -4
  105. package/dist/receiver.compiled.js +75 -73
  106. package/dist/receiver.compiled.map +4 -4
  107. package/dist/shaka-player.compiled.d.ts +321 -314
  108. package/dist/shaka-player.compiled.debug.d.ts +321 -314
  109. package/dist/shaka-player.compiled.debug.externs.js +140 -129
  110. package/dist/shaka-player.compiled.debug.js +527 -592
  111. package/dist/shaka-player.compiled.debug.map +4 -4
  112. package/dist/shaka-player.compiled.externs.js +140 -129
  113. package/dist/shaka-player.compiled.js +836 -860
  114. package/dist/shaka-player.compiled.map +4 -4
  115. package/dist/shaka-player.ui.d.ts +367 -358
  116. package/dist/shaka-player.ui.debug.d.ts +367 -358
  117. package/dist/shaka-player.ui.debug.externs.js +148 -129
  118. package/dist/shaka-player.ui.debug.js +586 -649
  119. package/dist/shaka-player.ui.debug.map +4 -4
  120. package/dist/shaka-player.ui.externs.js +148 -129
  121. package/dist/shaka-player.ui.js +1008 -1028
  122. package/dist/shaka-player.ui.map +4 -4
  123. package/docs/design/REDESIGN.md +33 -33
  124. package/docs/design/bg-fetch.md +2 -2
  125. package/docs/design/codec_preferences.md +1 -1
  126. package/docs/design/dash-audio-channels.md +3 -3
  127. package/docs/design/dash-manifests.md +1 -1
  128. package/docs/design/gap-jumping.md +3 -3
  129. package/docs/design/preload.md +2 -2
  130. package/docs/tutorials/config.md +0 -2
  131. package/docs/tutorials/drm-config.md +5 -0
  132. package/docs/tutorials/fairplay.md +7 -22
  133. package/docs/tutorials/faq.md +8 -19
  134. package/docs/tutorials/index.json +3 -8
  135. package/docs/tutorials/plugins.md +4 -6
  136. package/docs/tutorials/selenium-grid-config.md +122 -0
  137. package/docs/tutorials/upgrade.md +83 -11
  138. package/docs/tutorials/welcome.md +10 -2
  139. package/externs/cmcd.js +1 -1
  140. package/externs/polyfill.js +15 -0
  141. package/externs/shaka/manifest.js +5 -1
  142. package/externs/shaka/net.js +12 -0
  143. package/externs/shaka/offline.js +5 -1
  144. package/externs/shaka/player.js +39 -32
  145. package/externs/shaka/text.js +12 -12
  146. package/externs/sourcebuffer.js +15 -0
  147. package/karma.conf.js +137 -30
  148. package/lib/abr/simple_abr_manager.js +12 -6
  149. package/lib/ads/client_side_ad.js +13 -2
  150. package/lib/ads/client_side_ad_manager.js +22 -4
  151. package/lib/cast/cast_proxy.js +3 -4
  152. package/lib/cast/cast_utils.js +0 -1
  153. package/lib/cea/cea608_data_channel.js +2 -2
  154. package/lib/cea/cea708_service.js +5 -4
  155. package/lib/cea/mp4_cea_parser.js +11 -5
  156. package/lib/cea/sei_processor.js +6 -3
  157. package/lib/dash/content_protection.js +85 -5
  158. package/lib/dash/dash_parser.js +10 -12
  159. package/lib/dash/mpd_utils.js +4 -5
  160. package/lib/dash/segment_list.js +1 -2
  161. package/lib/dash/segment_template.js +3 -3
  162. package/lib/hls/hls_parser.js +386 -749
  163. package/lib/hls/manifest_text_parser.js +5 -6
  164. package/lib/media/adaptation_set.js +1 -2
  165. package/lib/media/content_workarounds.js +2 -2
  166. package/lib/media/drm_engine.js +105 -55
  167. package/lib/media/gap_jumping_controller.js +10 -45
  168. package/lib/media/media_source_engine.js +90 -17
  169. package/lib/media/mp4_segment_index_parser.js +1 -4
  170. package/lib/media/playhead.js +4 -7
  171. package/lib/media/presentation_timeline.js +19 -10
  172. package/lib/media/segment_index.js +13 -46
  173. package/lib/media/segment_reference.js +47 -1
  174. package/lib/media/streaming_engine.js +35 -17
  175. package/lib/media/time_ranges_utils.js +5 -12
  176. package/lib/media/video_wrapper.js +1 -1
  177. package/lib/net/networking_engine.js +4 -1
  178. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  179. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  180. package/lib/offline/manifest_converter.js +1 -0
  181. package/lib/offline/storage.js +104 -136
  182. package/lib/player.js +50 -216
  183. package/lib/polyfill/all.js +2 -3
  184. package/lib/polyfill/encryption_scheme.js +1 -1
  185. package/lib/polyfill/media_capabilities.js +15 -9
  186. package/lib/polyfill/mediasource.js +0 -28
  187. package/lib/polyfill/patchedmediakeys_nop.js +2 -0
  188. package/lib/polyfill/patchedmediakeys_webkit.js +2 -0
  189. package/lib/polyfill/symbol.js +46 -0
  190. package/lib/text/cue.js +1 -7
  191. package/lib/text/lrc_text_parser.js +8 -0
  192. package/lib/text/mp4_ttml_parser.js +8 -0
  193. package/lib/text/mp4_vtt_parser.js +8 -0
  194. package/lib/text/sbv_text_parser.js +8 -0
  195. package/lib/text/simple_text_displayer.js +3 -8
  196. package/lib/text/srt_text_parser.js +8 -0
  197. package/lib/text/ssa_text_parser.js +8 -0
  198. package/lib/text/text_engine.js +19 -3
  199. package/lib/text/ttml_text_parser.js +16 -5
  200. package/lib/text/ui_text_displayer.js +2 -8
  201. package/lib/text/vtt_text_parser.js +24 -2
  202. package/lib/text/web_vtt_generator.js +1 -7
  203. package/lib/util/buffer_utils.js +1 -3
  204. package/lib/util/ebml_parser.js +3 -3
  205. package/lib/util/error.js +10 -14
  206. package/lib/util/fairplay_utils.js +109 -0
  207. package/lib/util/functional.js +0 -42
  208. package/lib/util/iterables.js +0 -46
  209. package/lib/util/mime_utils.js +2 -0
  210. package/lib/util/mp4_box_parsers.js +1 -4
  211. package/lib/util/mp4_parser.js +5 -7
  212. package/lib/util/periods.js +10 -11
  213. package/lib/util/platform.js +48 -3
  214. package/lib/util/player_configuration.js +12 -6
  215. package/lib/util/pssh.js +24 -8
  216. package/lib/util/stream_utils.js +96 -25
  217. package/lib/util/string_utils.js +3 -5
  218. package/lib/util/uint8array_utils.js +3 -21
  219. package/lib/util/xml_utils.js +16 -8
  220. package/package.json +61 -36
  221. package/roadmap.md +27 -27
  222. package/shaka-player.uncompiled.js +1 -3
  223. package/test/abr/simple_abr_manager_unit.js +3 -8
  224. package/test/ads/ad_manager_unit.js +0 -6
  225. package/test/cast/cast_proxy_unit.js +0 -8
  226. package/test/cast/cast_receiver_integration.js +1 -18
  227. package/test/cast/cast_receiver_unit.js +1 -9
  228. package/test/cast/cast_sender_unit.js +0 -6
  229. package/test/cast/cast_utils_unit.js +1 -13
  230. package/test/cea/cea608_memory_unit.js +0 -5
  231. package/test/cea/cea708_service_unit.js +0 -7
  232. package/test/cea/cea708_window_unit.js +0 -5
  233. package/test/cea/cea_decoder_unit.js +0 -6
  234. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  235. package/test/cea/dtvcc_packet_unit.js +0 -5
  236. package/test/cea/mp4_cea_parser_unit.js +0 -4
  237. package/test/dash/dash_parser_content_protection_unit.js +45 -10
  238. package/test/dash/dash_parser_live_unit.js +2 -15
  239. package/test/dash/dash_parser_manifest_unit.js +2 -40
  240. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  241. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  242. package/test/dash/dash_parser_segment_template_unit.js +3 -13
  243. package/test/dash/mpd_utils_unit.js +3 -11
  244. package/test/demo/demo_unit.js +2 -6
  245. package/test/deprecate/enforcer_unit.js +0 -4
  246. package/test/deprecate/version_unit.js +0 -2
  247. package/test/hls/hls_live_unit.js +101 -234
  248. package/test/hls/hls_parser_unit.js +517 -447
  249. package/test/hls/manifest_text_parser_unit.js +0 -10
  250. package/test/media/adaptation_set_criteria_unit.js +3 -7
  251. package/test/media/adaptation_set_unit.js +0 -2
  252. package/test/media/buffering_observer_unit.js +1 -4
  253. package/test/media/closed_caption_parser_unit.js +0 -3
  254. package/test/media/drm_engine_integration.js +2 -15
  255. package/test/media/drm_engine_unit.js +90 -144
  256. package/test/media/manifest_parser_unit.js +0 -4
  257. package/test/media/media_source_engine_integration.js +26 -10
  258. package/test/media/media_source_engine_unit.js +8 -20
  259. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  260. package/test/media/play_rate_controller_unit.js +0 -4
  261. package/test/media/playhead_unit.js +35 -207
  262. package/test/media/presentation_timeline_unit.js +4 -7
  263. package/test/media/quality_observer_unit.js +0 -4
  264. package/test/media/region_observer_unit.js +1 -6
  265. package/test/media/region_timeline_unit.js +0 -3
  266. package/test/media/segment_index_unit.js +15 -31
  267. package/test/media/segment_reference_unit.js +0 -3
  268. package/test/media/stall_detector_unit.js +0 -5
  269. package/test/media/streaming_engine_integration.js +13 -75
  270. package/test/media/streaming_engine_unit.js +14 -37
  271. package/test/media/time_ranges_utils_unit.js +0 -7
  272. package/test/media/transmuxer_integration.js +0 -6
  273. package/test/media/webm_segment_index_parser_unit.js +0 -4
  274. package/test/net/data_uri_plugin_unit.js +0 -7
  275. package/test/net/http_plugin_unit.js +0 -9
  276. package/test/net/networking_engine_unit.js +0 -11
  277. package/test/offline/download_progress_estimator_unit.js +0 -2
  278. package/test/offline/indexeddb_storage_unit.js +0 -6
  279. package/test/offline/manifest_convert_unit.js +34 -12
  280. package/test/offline/offline_integration.js +1 -10
  281. package/test/offline/offline_manifest_parser_unit.js +1 -6
  282. package/test/offline/offline_scheme_unit.js +0 -8
  283. package/test/offline/offline_uri_unit.js +0 -2
  284. package/test/offline/storage_compatibility_unit.js +1 -14
  285. package/test/offline/storage_integration.js +6 -31
  286. package/test/player_external.js +1 -15
  287. package/test/player_integration.js +38 -28
  288. package/test/player_load_graph_integration.js +1 -6
  289. package/test/player_src_equals_external.js +3 -9
  290. package/test/player_src_equals_integration.js +0 -7
  291. package/test/player_unit.js +78 -37
  292. package/test/routing/walker_unit.js +0 -8
  293. package/test/test/assets/large_file.mpd +1 -1
  294. package/test/test/boot.js +75 -22
  295. package/test/test/externs/jasmine.js +2 -2
  296. package/test/test/externs/karma.js +4 -0
  297. package/test/test/namespace.js +10 -0
  298. package/test/test/util/canned_idb.js +0 -8
  299. package/test/test/util/cea_utils.js +0 -6
  300. package/test/test/util/dash_parser_util.js +0 -13
  301. package/test/test/util/fake_ad.js +0 -3
  302. package/test/test/util/fake_ad_manager.js +0 -9
  303. package/test/test/util/fake_demo_main.js +0 -5
  304. package/test/test/util/fake_drm_engine.js +0 -6
  305. package/test/test/util/fake_media_source_engine.js +11 -11
  306. package/test/test/util/fake_networking_engine.js +0 -5
  307. package/test/test/util/fake_text_displayer.js +0 -5
  308. package/test/test/util/indexeddb_utils.js +1 -10
  309. package/test/test/util/jasmine_fetch.js +0 -1
  310. package/test/test/util/loader.js +0 -18
  311. package/test/test/util/manifest_generator.js +12 -15
  312. package/test/test/util/manifest_parser_util.js +4 -7
  313. package/test/test/util/offline_utils.js +1 -5
  314. package/test/test/util/simple_fakes.js +9 -26
  315. package/test/test/util/stream_generator.js +0 -14
  316. package/test/test/util/streaming_engine_util.js +1 -15
  317. package/test/test/util/test_scheme.js +25 -20
  318. package/test/test/util/ttml_utils.js +0 -2
  319. package/test/test/util/ui_utils.js +0 -9
  320. package/test/test/util/util.js +9 -23
  321. package/test/test/util/waiter.js +84 -43
  322. package/test/text/cue_integration.js +2 -6
  323. package/test/text/lrc_text_parser_unit.js +6 -11
  324. package/test/text/mp4_ttml_parser_unit.js +6 -10
  325. package/test/text/mp4_vtt_parser_unit.js +7 -12
  326. package/test/text/sbv_text_parser_unit.js +5 -10
  327. package/test/text/simple_text_displayer_unit.js +1 -8
  328. package/test/text/srt_text_parser_unit.js +5 -10
  329. package/test/text/ssa_text_parser_unit.js +17 -34
  330. package/test/text/text_engine_unit.js +47 -12
  331. package/test/text/text_track_integration.js +0 -2
  332. package/test/text/ttml_text_parser_unit.js +79 -88
  333. package/test/text/ui_text_displayer_unit.js +44 -41
  334. package/test/text/vtt_text_parser_unit.js +55 -66
  335. package/test/text/web_vtt_generator_unit.js +0 -3
  336. package/test/ui/ad_ui_unit.js +0 -11
  337. package/test/ui/localization_unit.js +0 -3
  338. package/test/ui/text_displayer_layout_unit.js +1 -12
  339. package/test/ui/ui_customization_unit.js +0 -6
  340. package/test/ui/ui_integration.js +0 -32
  341. package/test/ui/ui_unit.js +28 -17
  342. package/test/util/abortable_operation_unit.js +4 -9
  343. package/test/util/array_utils_unit.js +0 -2
  344. package/test/util/buffer_utils_unit.js +0 -2
  345. package/test/util/cmcd_manager_unit.js +3 -3
  346. package/test/util/data_view_reader_unit.js +0 -4
  347. package/test/util/ebml_parser_unit.js +0 -4
  348. package/test/util/event_manager_unit.js +0 -3
  349. package/test/util/fake_event_target_unit.js +0 -5
  350. package/test/util/iterables_unit.js +0 -64
  351. package/test/util/language_utils_unit.js +0 -3
  352. package/test/util/manifest_parser_utils_unit.js +0 -2
  353. package/test/util/mp4_box_parsers_unit.js +0 -5
  354. package/test/util/mp4_parser_unit.js +0 -4
  355. package/test/util/multi_map_unit.js +0 -3
  356. package/test/util/object_utils_unit.js +0 -2
  357. package/test/util/periods_unit.js +14 -7
  358. package/test/util/pssh_unit.js +0 -5
  359. package/test/util/state_history_unit.js +0 -2
  360. package/test/util/stream_utils_unit.js +26 -15
  361. package/test/util/string_utils_unit.js +0 -6
  362. package/test/util/text_parser_unit.js +0 -2
  363. package/test/util/xml_utils_unit.js +0 -4
  364. package/ui/controls.js +65 -40
  365. package/ui/fullscreen_button.js +26 -6
  366. package/ui/less/ad_controls.less +6 -6
  367. package/ui/less/buttons.less +6 -6
  368. package/ui/less/containers.less +10 -12
  369. package/ui/less/overflow_menu.less +4 -4
  370. package/ui/less/range_elements.less +7 -2
  371. package/ui/less/tooltip.less +4 -4
  372. package/ui/locales/en.json +1 -0
  373. package/ui/locales/sjn-translations.yaml +257 -0
  374. package/ui/locales/sjn.json +42 -0
  375. package/ui/locales/source.json +5 -0
  376. package/ui/resolution_selection.js +31 -33
  377. package/ui/seek_bar.js +2 -1
  378. package/ui/ui.js +0 -17
  379. package/.github/workflows/build_and_test.yaml +0 -73
  380. package/.github/workflows/release.yaml +0 -53
  381. package/docs/tutorials/upgrade-v2-5.md +0 -441
  382. package/docs/tutorials/upgrade-v3.md +0 -38
  383. package/externs/svgelement.js +0 -18
  384. package/externs/webcrypto.js +0 -18
  385. package/lib/polyfill/mathround.js +0 -49
  386. package/lib/polyfill/patchedmediakeys_apple.js +0 -744
  387. package/lib/polyfill/patchedmediakeys_ms.js +0 -698
  388. package/lib/util/mutex.js +0 -52
  389. package/test/util/functional_unit.js +0 -82
@@ -9,7 +9,6 @@ goog.provide('shaka.abr.SimpleAbrManager');
9
9
  goog.require('goog.asserts');
10
10
  goog.require('shaka.abr.EwmaBandwidthEstimator');
11
11
  goog.require('shaka.log');
12
- goog.require('shaka.util.Iterables');
13
12
  goog.require('shaka.util.StreamUtils');
14
13
 
15
14
 
@@ -145,15 +144,21 @@ shaka.abr.SimpleAbrManager = class {
145
144
  // Start by assuming that we will use the first Stream.
146
145
  let chosen = sortedVariants[0] || null;
147
146
 
148
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
149
- for (const {item, next} of enumerate(sortedVariants)) {
147
+ for (let i = 0; i < sortedVariants.length; i++) {
148
+ const item = sortedVariants[i];
150
149
  const playbackRate =
151
150
  !isNaN(this.playbackRate_) ? Math.abs(this.playbackRate_) : 1;
152
151
  const itemBandwidth = playbackRate * item.bandwidth;
153
152
  const minBandwidth =
154
153
  itemBandwidth / this.config_.bandwidthDowngradeTarget;
155
- const nextBandwidth =
156
- playbackRate * (next || {bandwidth: Infinity}).bandwidth;
154
+ let next = {bandwidth: Infinity};
155
+ for (let j = i + 1; j < sortedVariants.length; j++) {
156
+ if (item.bandwidth != sortedVariants[j].bandwidth) {
157
+ next = sortedVariants[j];
158
+ break;
159
+ }
160
+ }
161
+ const nextBandwidth = playbackRate * next.bandwidth;
157
162
  const maxBandwidth = nextBandwidth / this.config_.bandwidthUpgradeTarget;
158
163
  shaka.log.v2('Bandwidth ranges:',
159
164
  (itemBandwidth / 1e6).toFixed(3),
@@ -161,7 +166,8 @@ shaka.abr.SimpleAbrManager = class {
161
166
  (maxBandwidth / 1e6).toFixed(3));
162
167
 
163
168
  if (currentBandwidth >= minBandwidth &&
164
- currentBandwidth <= maxBandwidth) {
169
+ currentBandwidth <= maxBandwidth &&
170
+ chosen.bandwidth != item.bandwidth) {
165
171
  chosen = item;
166
172
  }
167
173
  }
@@ -18,14 +18,18 @@ shaka.ads.ClientSideAd = class {
18
18
  /**
19
19
  * @param {!google.ima.Ad} imaAd
20
20
  * @param {!google.ima.AdsManager} imaAdManager
21
+ * @param {HTMLMediaElement} video
21
22
  */
22
- constructor(imaAd, imaAdManager) {
23
+ constructor(imaAd, imaAdManager, video) {
23
24
  /** @private {google.ima.Ad} */
24
25
  this.ad_ = imaAd;
25
26
 
26
27
  /** @private {google.ima.AdsManager} */
27
28
  this.manager_ = imaAdManager;
28
29
 
30
+ /** @private {HTMLMediaElement} */
31
+ this.video_ = video;
32
+
29
33
  /** @private {boolean} */
30
34
  this.isPaused_ = false;
31
35
 
@@ -176,7 +180,14 @@ shaka.ads.ClientSideAd = class {
176
180
  * @export
177
181
  */
178
182
  resize(width, height) {
179
- const viewMode = document.fullscreenElement ?
183
+ let isInFullscreen = false;
184
+ const video = /** @type {HTMLVideoElement} */(this.video_);
185
+ if (document.fullscreenEnabled) {
186
+ isInFullscreen = !!document.fullscreenElement;
187
+ } else if (video.webkitSupportsFullscreen) {
188
+ isInFullscreen = video.webkitDisplayingFullscreen;
189
+ }
190
+ const viewMode = isInFullscreen ?
180
191
  google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;
181
192
  this.manager_.resize(width, height, viewMode);
182
193
  }
@@ -181,7 +181,7 @@ shaka.ads.ClientSideAdManager = class {
181
181
  this.addImaEventListeners_();
182
182
 
183
183
  try {
184
- const viewMode = document.fullscreenElement ?
184
+ const viewMode = this.isFullScreenEnabled_() ?
185
185
  google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;
186
186
 
187
187
  this.imaAdsManager_.init(this.video_.offsetWidth,
@@ -191,7 +191,7 @@ shaka.ads.ClientSideAdManager = class {
191
191
  // because 'loadedmetadata' is sometimes called before the video resizes
192
192
  // on some platforms (e.g. Safari).
193
193
  this.eventManager_.listen(this.video_, 'loadeddata', () => {
194
- const viewMode = document.fullscreenElement ?
194
+ const viewMode = this.isFullScreenEnabled_() ?
195
195
  google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;
196
196
  this.imaAdsManager_.resize(this.video_.offsetWidth,
197
197
  this.video_.offsetHeight, viewMode);
@@ -199,7 +199,7 @@ shaka.ads.ClientSideAdManager = class {
199
199
 
200
200
  if ('ResizeObserver' in window) {
201
201
  this.resizeObserver_ = new ResizeObserver(() => {
202
- const viewMode = document.fullscreenElement ?
202
+ const viewMode = this.isFullScreenEnabled_() ?
203
203
  google.ima.ViewMode.FULLSCREEN : google.ima.ViewMode.NORMAL;
204
204
  this.imaAdsManager_.resize(this.video_.offsetWidth,
205
205
  this.video_.offsetHeight, viewMode);
@@ -221,6 +221,23 @@ shaka.ads.ClientSideAdManager = class {
221
221
  }
222
222
 
223
223
 
224
+ /**
225
+ * @return {boolean}
226
+ * @private
227
+ */
228
+ isFullScreenEnabled_() {
229
+ if (document.fullscreenEnabled) {
230
+ return !!document.fullscreenElement;
231
+ } else {
232
+ const video = /** @type {HTMLVideoElement} */(this.video_);
233
+ if (video.webkitSupportsFullscreen) {
234
+ return video.webkitDisplayingFullscreen;
235
+ }
236
+ }
237
+ return false;
238
+ }
239
+
240
+
224
241
  /**
225
242
  * @private
226
243
  */
@@ -389,7 +406,8 @@ shaka.ads.ClientSideAdManager = class {
389
406
  'Should have an ads manager at this point!');
390
407
 
391
408
  const imaAd = e.getAd();
392
- this.ad_ = new shaka.ads.ClientSideAd(imaAd, this.imaAdsManager_);
409
+ this.ad_ = new shaka.ads.ClientSideAd(imaAd,
410
+ this.imaAdsManager_, this.video_);
393
411
  const data = new Map()
394
412
  .set('ad', this.ad_)
395
413
  .set('sdkAdObject', imaAd)
@@ -314,10 +314,9 @@ shaka.cast.CastProxy = class extends shaka.util.FakeEventTarget {
314
314
  * @private
315
315
  */
316
316
  mapCompiledToUncompiledPlayerMethodNames_() {
317
- // In compiled mode, UI tries to access player methods
318
- // by their internal renamed names, but the proxy object doesn't know about
319
- // those.
320
- // See https://github.com/google/shaka-player/issues/2130 for details.
317
+ // In compiled mode, UI tries to access player methods by their internal
318
+ // renamed names, but the proxy object doesn't know about those. See
319
+ // https://github.com/shaka-project/shaka-player/issues/2130 for details.
321
320
  const methodsToNames = new Map();
322
321
  this.iterateOverPlayerMethods_((name, method) => {
323
322
  if (methodsToNames.has(method)) {
@@ -373,7 +373,6 @@ shaka.cast.CastUtils.PlayerInitAfterLoadState = [
373
373
  */
374
374
  shaka.cast.CastUtils.PlayerVoidMethods = [
375
375
  'addChaptersTrack',
376
- 'addTextTrack',
377
376
  'addTextTrackAsync',
378
377
  'cancelTrickPlay',
379
378
  'configure',
@@ -140,8 +140,8 @@ shaka.cea.Cea608DataChannel = class {
140
140
  const buf = this.curbuf_;
141
141
 
142
142
  // Move entire scroll window to a new base in rollup mode.
143
- if (this.type_ === shaka.cea.Cea608DataChannel.CaptionType.ROLLUP
144
- && row !== buf.getRow()) {
143
+ if (this.type_ === shaka.cea.Cea608DataChannel.CaptionType.ROLLUP &&
144
+ row !== buf.getRow()) {
145
145
  const oldTopRow = 1 + buf.getRow() - buf.getScrollSize();
146
146
  const newTopRow = 1 + row - buf.getScrollSize();
147
147
 
@@ -9,7 +9,6 @@ goog.provide('shaka.cea.Cea708Service');
9
9
  goog.require('shaka.cea.Cea708Window');
10
10
  goog.require('shaka.cea.DtvccPacket');
11
11
  goog.require('shaka.cea.ICaptionDecoder');
12
- goog.require('shaka.util.Error');
13
12
 
14
13
 
15
14
  /**
@@ -301,17 +300,19 @@ shaka.cea.Cea708Service = class {
301
300
  /**
302
301
  * Yields each non-null window specified in the 8-bit bitmap.
303
302
  * @param {number} bitmap 8 bits corresponding to each of the 8 windows.
304
- * @return {!Iterable.<number>}
303
+ * @return {!Array.<number>}
305
304
  * @private
306
305
  */
307
- * getSpecifiedWindowIds_(bitmap) {
306
+ getSpecifiedWindowIds_(bitmap) {
307
+ const ids = [];
308
308
  for (let i = 0; i < 8; i++) {
309
309
  const windowSpecified = (bitmap & 0x01) === 0x01;
310
310
  if (windowSpecified && this.windows_[i]) {
311
- yield i;
311
+ ids.push(i);
312
312
  }
313
313
  bitmap >>= 1;
314
314
  }
315
+ return ids;
315
316
  }
316
317
 
317
318
  /**
@@ -150,11 +150,11 @@ shaka.cea.Mp4CeaParser = class {
150
150
 
151
151
  // If specified, defaultSampleDuration and defaultSampleSize
152
152
  // override the ones specified in the TREX box
153
- defaultSampleDuration = parsedTFHD.defaultSampleDuration
154
- || this.defaultSampleDuration_;
153
+ defaultSampleDuration = parsedTFHD.defaultSampleDuration ||
154
+ this.defaultSampleDuration_;
155
155
 
156
- defaultSampleSize = parsedTFHD.defaultSampleSize
157
- || this.defaultSampleSize_;
156
+ defaultSampleSize = parsedTFHD.defaultSampleSize ||
157
+ this.defaultSampleSize_;
158
158
 
159
159
  const trackId = parsedTFHD.trackId;
160
160
 
@@ -236,7 +236,13 @@ shaka.cea.Mp4CeaParser = class {
236
236
  });
237
237
  }
238
238
  } else {
239
- reader.skip(naluSize - 1);
239
+ try {
240
+ reader.skip(naluSize - 1);
241
+ } catch (e) {
242
+ // It is necessary to ignore this error because it can break the start
243
+ // of playback even if the user does not want to see the subtitles.
244
+ break;
245
+ }
240
246
  }
241
247
  sampleSize -= (naluSize + 4);
242
248
  if (sampleSize == 0) {
@@ -14,9 +14,10 @@ shaka.cea.SeiProcessor = class {
14
14
  /**
15
15
  * Processes supplemental enhancement information data.
16
16
  * @param {!Uint8Array} naluData NALU from which SEI data is to be processed.
17
- * @return {!Iterable.<!Uint8Array>}
17
+ * @return {!Array.<!Uint8Array>}
18
18
  */
19
- * process(naluData) {
19
+ process(naluData) {
20
+ const seiPayloads = [];
20
21
  const naluClone = this.removeEmu(naluData);
21
22
 
22
23
  // The following is an implementation of section 7.3.2.3.1
@@ -41,10 +42,12 @@ shaka.cea.SeiProcessor = class {
41
42
  // Payload type 4 is user_data_registered_itu_t_t35, as per the H.264
42
43
  // spec. This payload type contains caption data.
43
44
  if (payloadType == 0x04) {
44
- yield naluClone.subarray(offset, offset + payloadSize);
45
+ seiPayloads.push(naluClone.subarray(offset, offset + payloadSize));
45
46
  }
46
47
  offset += payloadSize;
47
48
  }
49
+
50
+ return seiPayloads;
48
51
  }
49
52
 
50
53
 
@@ -68,7 +68,7 @@ shaka.dash.ContentProtection = class {
68
68
 
69
69
  if (parsedNonCenc.length) {
70
70
  drmInfos = ContentProtection.convertElements_(
71
- defaultInit, parsedNonCenc, keySystemsByURI);
71
+ defaultInit, parsedNonCenc, keySystemsByURI, keyIds);
72
72
 
73
73
  // If there are no drmInfos after parsing, then add a dummy entry.
74
74
  // This may be removed in parseKeyIds.
@@ -180,6 +180,27 @@ shaka.dash.ContentProtection = class {
180
180
  return '';
181
181
  }
182
182
 
183
+ /**
184
+ * Gets a ClearKey license URL from a content protection element
185
+ * containing a custom `clearkey::Laurl` element
186
+ *
187
+ * @param {shaka.dash.ContentProtection.Element} element
188
+ * @return {string}
189
+ */
190
+ static getClearKeyLicenseUrl(element) {
191
+ const clearKeyLaurlNode = shaka.util.XmlUtils.findChildNS(
192
+ element.node, shaka.dash.ContentProtection.ClearKeyNamespaceUri_,
193
+ 'Laurl',
194
+ );
195
+ if (clearKeyLaurlNode &&
196
+ clearKeyLaurlNode.getAttribute('Lic_type') === 'EME-1.0') {
197
+ if (clearKeyLaurlNode.textContent) {
198
+ return clearKeyLaurlNode.textContent;
199
+ }
200
+ }
201
+ return '';
202
+ }
203
+
183
204
  /**
184
205
  * Parses an Array buffer starting at byteOffset for PlayReady Object Records.
185
206
  * Each PRO Record is preceded by its PlayReady Record type and length in
@@ -335,7 +356,41 @@ shaka.dash.ContentProtection = class {
335
356
  0x9a, 0x04, 0xf0, 0x79, 0x98, 0x40, 0x42, 0x86,
336
357
  0xab, 0x92, 0xe6, 0x5b, 0xe0, 0x88, 0x5f, 0x95,
337
358
  ]);
338
- const pssh = shaka.util.Pssh.createPssh(data, systemId);
359
+ const keyIds = new Set();
360
+ const psshVersion = 0;
361
+ const pssh =
362
+ shaka.util.Pssh.createPssh(data, systemId, keyIds, psshVersion);
363
+ return [
364
+ {
365
+ initData: pssh,
366
+ initDataType: 'cenc',
367
+ keyId: element.keyId,
368
+ },
369
+ ];
370
+ }
371
+
372
+ /**
373
+ * Creates ClearKey initData from Default_KID value retrieved from previously
374
+ * parsed ContentProtection tag.
375
+ * @param {shaka.dash.ContentProtection.Element} element
376
+ * @param {!Set.<string>} keyIds
377
+ * @return {?Array.<shaka.extern.InitDataOverride>}
378
+ * @private
379
+ */
380
+ static getInitDataClearKey_(element, keyIds) {
381
+ if (keyIds.size == 0) {
382
+ return null;
383
+ }
384
+
385
+ const systemId = new Uint8Array([
386
+ 0x10, 0x77, 0xef, 0xec, 0xc0, 0xb2, 0x4d, 0x02,
387
+ 0xac, 0xe3, 0x3c, 0x1e, 0x52, 0xe2, 0xfb, 0x4b,
388
+ ]);
389
+ const data = new Uint8Array([]);
390
+ const psshVersion = 1;
391
+ const pssh =
392
+ shaka.util.Pssh.createPssh(data, systemId, keyIds, psshVersion);
393
+
339
394
  return [
340
395
  {
341
396
  initData: pssh,
@@ -351,10 +406,11 @@ shaka.dash.ContentProtection = class {
351
406
  * @param {Array.<shaka.extern.InitDataOverride>} defaultInit
352
407
  * @param {!Array.<shaka.dash.ContentProtection.Element>} elements
353
408
  * @param {!Object.<string, string>} keySystemsByURI
409
+ * @param {!Set.<string>} keyIds
354
410
  * @return {!Array.<shaka.extern.DrmInfo>}
355
411
  * @private
356
412
  */
357
- static convertElements_(defaultInit, elements, keySystemsByURI) {
413
+ static convertElements_(defaultInit, elements, keySystemsByURI, keyIds) {
358
414
  const ContentProtection = shaka.dash.ContentProtection;
359
415
  const ManifestParserUtils = shaka.util.ManifestParserUtils;
360
416
  const licenseUrlParsers = ContentProtection.licenseUrlParsers_;
@@ -370,7 +426,14 @@ shaka.dash.ContentProtection = class {
370
426
  'Init data must be null or non-empty.');
371
427
 
372
428
  const proInitData = ContentProtection.getInitDataFromPro_(element);
373
- const initData = element.init || defaultInit || proInitData;
429
+ let clearKeyInitData = null;
430
+ if (element.schemeUri ===
431
+ shaka.dash.ContentProtection.ClearKeySchemeUri_) {
432
+ clearKeyInitData =
433
+ ContentProtection.getInitDataClearKey_(element, keyIds);
434
+ }
435
+ const initData = element.init || defaultInit || proInitData ||
436
+ clearKeyInitData;
374
437
  const info = ManifestParserUtils.createDrmInfo(keySystem, initData);
375
438
  const licenseParser = licenseUrlParsers.get(keySystem);
376
439
  if (licenseParser) {
@@ -562,7 +625,9 @@ shaka.dash.ContentProtection.licenseUrlParsers_ = new Map()
562
625
  .set('com.microsoft.playready.software',
563
626
  shaka.dash.ContentProtection.getPlayReadyLicenseUrl)
564
627
  .set('com.microsoft.playready.hardware',
565
- shaka.dash.ContentProtection.getPlayReadyLicenseUrl);
628
+ shaka.dash.ContentProtection.getPlayReadyLicenseUrl)
629
+ .set('org.w3.clearkey',
630
+ shaka.dash.ContentProtection.getClearKeyLicenseUrl);
566
631
 
567
632
  /**
568
633
  * @const {string}
@@ -577,3 +642,18 @@ shaka.dash.ContentProtection.MP4Protection_ =
577
642
  * @private
578
643
  */
579
644
  shaka.dash.ContentProtection.CencNamespaceUri_ = 'urn:mpeg:cenc:2013';
645
+
646
+ /**
647
+ * @const {string}
648
+ * @private
649
+ */
650
+ shaka.dash.ContentProtection.ClearKeyNamespaceUri_ =
651
+ 'http://dashif.org/guidelines/clearKey';
652
+
653
+
654
+ /**
655
+ * @const {string}
656
+ * @private
657
+ */
658
+ shaka.dash.ContentProtection.ClearKeySchemeUri_ =
659
+ 'urn:uuid:e2719d58-a985-b3c9-781a-b030af78d30e';
@@ -22,7 +22,6 @@ goog.require('shaka.text.TextEngine');
22
22
  goog.require('shaka.util.CmcdManager');
23
23
  goog.require('shaka.util.Error');
24
24
  goog.require('shaka.util.Functional');
25
- goog.require('shaka.util.Iterables');
26
25
  goog.require('shaka.util.LanguageUtils');
27
26
  goog.require('shaka.util.ManifestParserUtils');
28
27
  goog.require('shaka.util.MimeUtils');
@@ -104,7 +103,7 @@ shaka.dash.DashParser = class {
104
103
 
105
104
  /**
106
105
  * Period IDs seen in previous manifest.
107
- * @private {!Array.<number>}
106
+ * @private {!Array.<string>}
108
107
  */
109
108
  this.lastManifestUpdatePeriodIds_ = [];
110
109
 
@@ -383,7 +382,7 @@ shaka.dash.DashParser = class {
383
382
  // This gives us confidence that our state is maintained correctly, and
384
383
  // that the complex logic of multi-Period eviction and period-flattening
385
384
  // is correct. See also:
386
- // https://github.com/google/shaka-player/issues/3169#issuecomment-823580634
385
+ // https://github.com/shaka-project/shaka-player/issues/3169#issuecomment-823580634
387
386
  for (const stream of Object.values(this.streamMap_)) {
388
387
  if (stream.segmentIndex) {
389
388
  stream.segmentIndex.evict(
@@ -499,6 +498,7 @@ shaka.dash.DashParser = class {
499
498
  imageStreams: this.periodCombiner_.getImageStreams(),
500
499
  offlineSessionIds: [],
501
500
  minBufferTime: minBufferTime || 0,
501
+ sequenceMode: false,
502
502
  };
503
503
 
504
504
  // We only need to do clock sync when we're using presentation start
@@ -555,10 +555,9 @@ shaka.dash.DashParser = class {
555
555
  const periods = [];
556
556
  let prevEnd = 0;
557
557
  const periodNodes = XmlUtils.findChildren(mpd, 'Period');
558
- // This uses a for-loop rather than a for-of loop because this needs to look
559
- // ahead to the next element.
560
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
561
- for (const {i, item: elem, next} of enumerate(periodNodes)) {
558
+ for (let i = 0; i < periodNodes.length; i++) {
559
+ const elem = periodNodes[i];
560
+ const next = periodNodes[i + 1];
562
561
  const start = /** @type {number} */ (
563
562
  XmlUtils.parseAttr(elem, 'start', XmlUtils.parseDuration, prevEnd));
564
563
  const periodId = elem.id;
@@ -764,7 +763,7 @@ shaka.dash.DashParser = class {
764
763
  for (const stream of normalSet.streams) {
765
764
  // There may be multiple trick mode streams, but we do not
766
765
  // currently support that. Just choose one.
767
- // TODO: https://github.com/google/shaka-player/issues/1528
766
+ // TODO: https://github.com/shaka-project/shaka-player/issues/1528
768
767
  stream.trickModeVideo = trickModeSet.streams.find((trickStream) =>
769
768
  shaka.util.MimeUtils.getCodecBase(stream.codecs) ==
770
769
  shaka.util.MimeUtils.getCodecBase(trickStream.codecs));
@@ -1157,7 +1156,7 @@ shaka.dash.DashParser = class {
1157
1156
  // does not make sense in the DASH spec's bandwidth formulas.
1158
1157
  // In some content, however, the attribute is missing or zero.
1159
1158
  // To avoid NaN at the variant level on broken content, fall back to zero.
1160
- // https://github.com/google/shaka-player/issues/938#issuecomment-317278180
1159
+ // https://github.com/shaka-project/shaka-player/issues/938#issuecomment-317278180
1161
1160
  context.bandwidth =
1162
1161
  XmlUtils.parseAttr(node, 'bandwidth', XmlUtils.parsePositiveInt) || 0;
1163
1162
 
@@ -1230,13 +1229,12 @@ shaka.dash.DashParser = class {
1230
1229
  });
1231
1230
  let spatialAudio = false;
1232
1231
  if (hasJoc) {
1233
- context.representation.mimeType = 'audio/eac3-joc';
1234
1232
  spatialAudio = true;
1235
1233
  }
1236
1234
 
1237
1235
  let forced = false;
1238
1236
  if (isText) {
1239
- // See: https://github.com/google/shaka-player/issues/2122 and
1237
+ // See: https://github.com/shaka-project/shaka-player/issues/2122 and
1240
1238
  // https://github.com/Dash-Industry-Forum/DASH-IF-IOP/issues/165
1241
1239
  forced = roles.includes('forced_subtitle') ||
1242
1240
  roles.includes('forced-subtitle');
@@ -1384,7 +1382,7 @@ shaka.dash.DashParser = class {
1384
1382
  // NOTE: An updatePeriod_ of -1 means the attribute was missing.
1385
1383
  // An attribute which is present and set to 0 should still result in
1386
1384
  // periodic updates. For more, see:
1387
- // https://github.com/google/shaka-player/issues/331
1385
+ // https://github.com/shaka-project/shaka-player/issues/331
1388
1386
  if (this.updatePeriod_ < 0) {
1389
1387
  return;
1390
1388
  }
@@ -12,7 +12,6 @@ goog.require('shaka.net.NetworkingEngine');
12
12
  goog.require('shaka.util.AbortableOperation');
13
13
  goog.require('shaka.util.Error');
14
14
  goog.require('shaka.util.Functional');
15
- goog.require('shaka.util.Iterables');
16
15
  goog.require('shaka.util.ManifestParserUtils');
17
16
  goog.require('shaka.util.XmlUtils');
18
17
  goog.requireType('shaka.dash.DashParser');
@@ -142,8 +141,9 @@ shaka.dash.MpdUtils = class {
142
141
  const timeline = [];
143
142
  let lastEndTime = -unscaledPresentationTimeOffset;
144
143
 
145
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
146
- for (const {item: timePoint, next} of enumerate(timePoints)) {
144
+ for (let i = 0; i < timePoints.length; ++i) {
145
+ const timePoint = timePoints[i];
146
+ const next = timePoints[i + 1];
147
147
  let t = XmlUtils.parseAttr(timePoint, 't', XmlUtils.parseNonNegativeInt);
148
148
  const d =
149
149
  XmlUtils.parseAttr(timePoint, 'd', XmlUtils.parseNonNegativeInt);
@@ -225,8 +225,7 @@ shaka.dash.MpdUtils = class {
225
225
  timeline[timeline.length - 1].end = startTime / timescale;
226
226
  }
227
227
 
228
- for (const _ of shaka.util.Iterables.range(repeat + 1)) {
229
- shaka.util.Functional.ignored(_);
228
+ for (let j = 0; j <= repeat; ++j) {
230
229
  const endTime = startTime + d;
231
230
  const item = {
232
231
  start: startTime / timescale,
@@ -15,7 +15,6 @@ goog.require('shaka.media.SegmentIndex');
15
15
  goog.require('shaka.media.SegmentReference');
16
16
  goog.require('shaka.util.Error');
17
17
  goog.require('shaka.util.Functional');
18
- goog.require('shaka.util.Iterables');
19
18
  goog.require('shaka.util.ManifestParserUtils');
20
19
  goog.require('shaka.util.XmlUtils');
21
20
  goog.requireType('shaka.dash.DashParser');
@@ -222,7 +221,7 @@ shaka.dash.SegmentList = class {
222
221
  /** @type {!Array.<!shaka.media.SegmentReference>} */
223
222
  const references = [];
224
223
  let prevEndTime = info.startTime;
225
- for (const i of shaka.util.Iterables.range(max)) {
224
+ for (let i = 0; i < max; i++) {
226
225
  const segment = info.mediaSegments[i];
227
226
  const mediaUri = ManifestParserUtils.resolveUris(
228
227
  baseUris, [segment.mediaUri]);
@@ -14,7 +14,6 @@ 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.Iterables');
18
17
  goog.require('shaka.util.ManifestParserUtils');
19
18
  goog.require('shaka.util.ObjectUtils');
20
19
  goog.requireType('shaka.dash.DashParser');
@@ -504,8 +503,9 @@ shaka.dash.SegmentTemplate = class {
504
503
 
505
504
  /** @type {!Array.<!shaka.media.SegmentReference>} */
506
505
  const references = [];
507
- const enum_ = (it) => shaka.util.Iterables.enumerate(it);
508
- for (const {i, item: {start, unscaledStart, end}} of enum_(info.timeline)) {
506
+ for (let i = 0; i < info.timeline.length; i++) {
507
+ const {start, unscaledStart, end} = info.timeline[i];
508
+
509
509
  // Note: i = k - 1, where k indicates the k'th segment listed in the MPD.
510
510
  // (See section 5.3.9.5.3 of the DASH spec.)
511
511
  const segmentReplacement = i + info.startNumber;