shaka-player 3.1.4 → 3.1.7

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 (332) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/workflows/build-and-test.yaml +130 -0
  4. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  5. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  6. package/.github/workflows/demo-version-index.yaml +29 -0
  7. package/.github/workflows/nightly-demo.yaml +42 -0
  8. package/.github/workflows/release-please.yaml +145 -0
  9. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  10. package/.github/workflows/selenium-lab-tests.yaml +93 -0
  11. package/AUTHORS +2 -0
  12. package/CHANGELOG.md +1540 -1474
  13. package/CONTRIBUTING.md +2 -2
  14. package/CONTRIBUTORS +2 -0
  15. package/README.md +7 -7
  16. package/app-engine/README.md +9 -0
  17. package/app-engine/demo-version-index/README.md +14 -0
  18. package/app-engine/demo-version-index/app.yaml +2 -0
  19. package/app-engine/demo-version-index/main.py +162 -0
  20. package/app-engine/demo-version-index/requirements.txt +6 -0
  21. package/app-engine/demo-version-index/templates/index.html +114 -0
  22. package/app-engine/shaka-player-demo/README.md +18 -0
  23. package/app-engine/shaka-player-demo/app.yaml +61 -0
  24. package/app-engine/shaka-player-demo/main.py +95 -0
  25. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  26. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  27. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  28. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  29. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  30. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  31. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  32. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  33. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  34. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  35. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  36. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  37. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  38. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  39. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  40. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  41. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  42. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  43. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  44. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  45. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  46. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  47. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  48. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  49. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  50. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  51. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  52. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  53. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  54. package/app-engine/shaka-player-demo/posters.py +110 -0
  55. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  56. package/app-engine/shaka-player-demo/time.txt +1 -0
  57. package/build/README.md +1 -1
  58. package/build/checkversion.py +1 -1
  59. package/build/conformance.textproto +13 -0
  60. package/build/docker/Dockerfile +20 -0
  61. package/build/docker/docker-compose.yml +10 -0
  62. package/build/gendeps.py +18 -15
  63. package/build/shaka-lab.yaml +163 -0
  64. package/build/shakaBuildHelpers.py +4 -29
  65. package/build/test.py +93 -28
  66. package/build/wrapper.template.js +2 -2
  67. package/demo/TengwarTelcontar.woff2 +0 -0
  68. package/demo/asset_card.js +1 -2
  69. package/demo/cast_receiver/index.html +1 -1
  70. package/demo/cast_receiver/receiver_app.css +14 -14
  71. package/demo/common/assets.js +2 -0
  72. package/demo/config.js +0 -1
  73. package/demo/custom.js +0 -1
  74. package/demo/customWarning.txt +2 -2
  75. package/demo/demo.less +29 -18
  76. package/demo/demo_uncompiled.js +1 -13
  77. package/demo/index.html +1 -1
  78. package/demo/main.js +3 -3
  79. package/dist/controls.css +2 -2
  80. package/dist/controls.css.map +1 -1
  81. package/dist/demo.compiled.debug.js +191 -194
  82. package/dist/demo.compiled.debug.map +4 -4
  83. package/dist/demo.compiled.js +191 -194
  84. package/dist/demo.compiled.map +4 -4
  85. package/dist/demo.css +1 -1
  86. package/dist/demo.css.map +1 -1
  87. package/dist/deps.js +224 -218
  88. package/dist/locales.js +30 -30
  89. package/dist/receiver.compiled.debug.js +43 -45
  90. package/dist/receiver.compiled.debug.map +4 -4
  91. package/dist/receiver.compiled.js +43 -45
  92. package/dist/receiver.compiled.map +4 -4
  93. package/dist/shaka-player.compiled.d.ts +237 -222
  94. package/dist/shaka-player.compiled.debug.d.ts +237 -222
  95. package/dist/shaka-player.compiled.debug.externs.js +20 -3
  96. package/dist/shaka-player.compiled.debug.js +361 -365
  97. package/dist/shaka-player.compiled.debug.map +4 -4
  98. package/dist/shaka-player.compiled.externs.js +20 -3
  99. package/dist/shaka-player.compiled.js +811 -815
  100. package/dist/shaka-player.compiled.map +4 -4
  101. package/dist/shaka-player.ui.d.ts +281 -275
  102. package/dist/shaka-player.ui.debug.d.ts +281 -275
  103. package/dist/shaka-player.ui.debug.externs.js +34 -26
  104. package/dist/shaka-player.ui.debug.js +384 -389
  105. package/dist/shaka-player.ui.debug.map +4 -4
  106. package/dist/shaka-player.ui.externs.js +34 -26
  107. package/dist/shaka-player.ui.js +945 -950
  108. package/dist/shaka-player.ui.map +4 -4
  109. package/docs/design/REDESIGN.md +33 -33
  110. package/docs/design/codec_preferences.md +1 -1
  111. package/docs/design/dash-audio-channels.md +3 -3
  112. package/docs/design/dash-manifests.md +1 -1
  113. package/docs/design/gap-jumping.md +3 -3
  114. package/docs/design/preload.md +2 -2
  115. package/docs/tutorials/faq.md +8 -8
  116. package/docs/tutorials/index.json +1 -0
  117. package/docs/tutorials/plugins.md +3 -3
  118. package/docs/tutorials/selenium-grid-config.md +122 -0
  119. package/docs/tutorials/welcome.md +10 -2
  120. package/externs/shaka/text.js +10 -0
  121. package/karma.conf.js +156 -45
  122. package/lib/abr/simple_abr_manager.js +12 -6
  123. package/lib/ads/ad_manager.js +1 -0
  124. package/lib/cast/cast_proxy.js +6 -4
  125. package/lib/cast/cast_receiver.js +3 -0
  126. package/lib/cea/cea608_data_channel.js +3 -3
  127. package/lib/cea/cea608_memory.js +1 -1
  128. package/lib/cea/cea708_service.js +6 -5
  129. package/lib/cea/cea_decoder.js +1 -1
  130. package/lib/cea/i_caption_decoder.js +2 -3
  131. package/lib/cea/mp4_cea_parser.js +11 -5
  132. package/lib/cea/sei_processor.js +6 -3
  133. package/lib/dash/dash_parser.js +43 -31
  134. package/lib/dash/mpd_utils.js +4 -5
  135. package/lib/dash/segment_list.js +1 -2
  136. package/lib/dash/segment_template.js +3 -3
  137. package/lib/hls/hls_parser.js +11 -9
  138. package/lib/hls/manifest_text_parser.js +4 -3
  139. package/lib/media/adaptation_set.js +1 -2
  140. package/lib/media/closed_caption_parser.js +0 -1
  141. package/lib/media/content_workarounds.js +2 -2
  142. package/lib/media/drm_engine.js +3 -2
  143. package/lib/media/media_source_engine.js +3 -2
  144. package/lib/media/mp4_segment_index_parser.js +1 -4
  145. package/lib/media/playhead.js +2 -2
  146. package/lib/media/presentation_timeline.js +18 -8
  147. package/lib/media/region_observer.js +39 -33
  148. package/lib/media/region_timeline.js +17 -19
  149. package/lib/media/streaming_engine.js +12 -9
  150. package/lib/media/time_ranges_utils.js +1 -3
  151. package/lib/media/video_wrapper.js +1 -1
  152. package/lib/net/networking_engine.js +5 -1
  153. package/lib/offline/storage.js +14 -15
  154. package/lib/player.js +52 -22
  155. package/lib/polyfill/all.js +2 -3
  156. package/lib/polyfill/encryption_scheme.js +1 -1
  157. package/lib/polyfill/media_capabilities.js +32 -17
  158. package/lib/polyfill/mediasource.js +1 -1
  159. package/lib/routing/walker.js +2 -3
  160. package/lib/text/cue.js +7 -1
  161. package/lib/text/simple_text_displayer.js +2 -1
  162. package/lib/text/text_engine.js +1 -1
  163. package/lib/text/ttml_text_parser.js +92 -63
  164. package/lib/text/ui_text_displayer.js +18 -12
  165. package/lib/util/buffer_utils.js +1 -3
  166. package/lib/util/ebml_parser.js +3 -3
  167. package/lib/util/error.js +1 -1
  168. package/lib/util/fake_event_target.js +21 -1
  169. package/lib/util/iterables.js +0 -46
  170. package/lib/util/mp4_box_parsers.js +1 -4
  171. package/lib/util/mp4_parser.js +5 -7
  172. package/lib/util/periods.js +8 -9
  173. package/lib/util/platform.js +3 -3
  174. package/lib/util/pssh.js +1 -4
  175. package/lib/util/stream_utils.js +60 -8
  176. package/lib/util/string_utils.js +3 -5
  177. package/lib/util/uint8array_utils.js +3 -5
  178. package/lib/util/xml_utils.js +34 -7
  179. package/package.json +62 -40
  180. package/roadmap.md +17 -17
  181. package/test/abr/simple_abr_manager_unit.js +3 -8
  182. package/test/ads/ad_manager_unit.js +0 -6
  183. package/test/cast/cast_proxy_unit.js +0 -8
  184. package/test/cast/cast_receiver_integration.js +1 -18
  185. package/test/cast/cast_receiver_unit.js +1 -9
  186. package/test/cast/cast_sender_unit.js +0 -6
  187. package/test/cast/cast_utils_unit.js +0 -13
  188. package/test/cea/cea608_memory_unit.js +0 -5
  189. package/test/cea/cea708_service_unit.js +0 -7
  190. package/test/cea/cea708_window_unit.js +0 -5
  191. package/test/cea/cea_decoder_unit.js +0 -6
  192. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  193. package/test/cea/dtvcc_packet_unit.js +0 -5
  194. package/test/cea/mp4_cea_parser_unit.js +0 -4
  195. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  196. package/test/dash/dash_parser_live_unit.js +45 -15
  197. package/test/dash/dash_parser_manifest_unit.js +37 -18
  198. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  199. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  200. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  201. package/test/dash/mpd_utils_unit.js +3 -11
  202. package/test/demo/demo_unit.js +0 -5
  203. package/test/deprecate/enforcer_unit.js +0 -4
  204. package/test/deprecate/version_unit.js +0 -2
  205. package/test/hls/hls_live_unit.js +2 -14
  206. package/test/hls/hls_parser_unit.js +76 -15
  207. package/test/hls/manifest_text_parser_unit.js +0 -10
  208. package/test/media/adaptation_set_criteria_unit.js +3 -7
  209. package/test/media/adaptation_set_unit.js +0 -2
  210. package/test/media/buffering_observer_unit.js +1 -4
  211. package/test/media/closed_caption_parser_unit.js +0 -3
  212. package/test/media/drm_engine_integration.js +3 -17
  213. package/test/media/drm_engine_unit.js +7 -26
  214. package/test/media/manifest_parser_unit.js +0 -4
  215. package/test/media/media_source_engine_integration.js +0 -7
  216. package/test/media/media_source_engine_unit.js +1 -14
  217. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  218. package/test/media/play_rate_controller_unit.js +0 -4
  219. package/test/media/playhead_unit.js +8 -16
  220. package/test/media/presentation_timeline_unit.js +4 -7
  221. package/test/media/region_observer_unit.js +40 -10
  222. package/test/media/region_timeline_unit.js +40 -25
  223. package/test/media/segment_index_unit.js +0 -6
  224. package/test/media/segment_reference_unit.js +0 -3
  225. package/test/media/stall_detector_unit.js +0 -5
  226. package/test/media/streaming_engine_integration.js +11 -37
  227. package/test/media/streaming_engine_unit.js +155 -34
  228. package/test/media/time_ranges_utils_unit.js +0 -2
  229. package/test/media/transmuxer_integration.js +0 -6
  230. package/test/media/webm_segment_index_parser_unit.js +0 -4
  231. package/test/net/data_uri_plugin_unit.js +0 -7
  232. package/test/net/http_plugin_unit.js +0 -9
  233. package/test/net/networking_engine_unit.js +0 -11
  234. package/test/offline/download_progress_estimator_unit.js +0 -2
  235. package/test/offline/indexeddb_storage_unit.js +0 -6
  236. package/test/offline/manifest_convert_unit.js +0 -8
  237. package/test/offline/offline_integration.js +1 -10
  238. package/test/offline/offline_manifest_parser_unit.js +0 -6
  239. package/test/offline/offline_scheme_unit.js +0 -8
  240. package/test/offline/offline_uri_unit.js +0 -2
  241. package/test/offline/storage_compatibility_unit.js +1 -14
  242. package/test/offline/storage_integration.js +1 -25
  243. package/test/player_external.js +2 -10
  244. package/test/player_integration.js +21 -28
  245. package/test/player_load_graph_integration.js +1 -6
  246. package/test/player_src_equals_external.js +3 -9
  247. package/test/player_src_equals_integration.js +0 -7
  248. package/test/player_unit.js +57 -42
  249. package/test/routing/walker_unit.js +0 -8
  250. package/test/test/assets/large_file.mpd +1 -1
  251. package/test/test/boot.js +75 -22
  252. package/test/test/externs/jasmine.js +2 -2
  253. package/test/test/externs/karma.js +4 -0
  254. package/test/test/namespace.js +10 -0
  255. package/test/test/util/canned_idb.js +0 -8
  256. package/test/test/util/cea_utils.js +0 -6
  257. package/test/test/util/dash_parser_util.js +0 -13
  258. package/test/test/util/fake_ad.js +0 -3
  259. package/test/test/util/fake_ad_manager.js +0 -9
  260. package/test/test/util/fake_demo_main.js +0 -5
  261. package/test/test/util/fake_drm_engine.js +0 -6
  262. package/test/test/util/fake_media_source_engine.js +0 -7
  263. package/test/test/util/fake_networking_engine.js +0 -5
  264. package/test/test/util/fake_text_displayer.js +0 -5
  265. package/test/test/util/indexeddb_utils.js +1 -10
  266. package/test/test/util/jasmine_fetch.js +0 -1
  267. package/test/test/util/loader.js +0 -18
  268. package/test/test/util/manifest_generator.js +9 -14
  269. package/test/test/util/manifest_parser_util.js +0 -6
  270. package/test/test/util/offline_utils.js +0 -5
  271. package/test/test/util/simple_fakes.js +9 -26
  272. package/test/test/util/stream_generator.js +0 -14
  273. package/test/test/util/streaming_engine_util.js +0 -15
  274. package/test/test/util/test_scheme.js +1 -19
  275. package/test/test/util/ttml_utils.js +79 -0
  276. package/test/test/util/ui_utils.js +0 -9
  277. package/test/test/util/util.js +15 -26
  278. package/test/test/util/waiter.js +84 -43
  279. package/test/text/cue_integration.js +0 -4
  280. package/test/text/lrc_text_parser_unit.js +0 -4
  281. package/test/text/mp4_ttml_parser_unit.js +10 -23
  282. package/test/text/mp4_vtt_parser_unit.js +1 -7
  283. package/test/text/sbv_text_parser_unit.js +0 -4
  284. package/test/text/simple_text_displayer_unit.js +1 -8
  285. package/test/text/srt_text_parser_unit.js +0 -4
  286. package/test/text/ssa_text_parser_unit.js +0 -5
  287. package/test/text/text_engine_unit.js +2 -7
  288. package/test/text/text_track_integration.js +0 -2
  289. package/test/text/ttml_text_parser_unit.js +495 -237
  290. package/test/text/ui_text_displayer_unit.js +44 -41
  291. package/test/text/vtt_text_parser_unit.js +0 -9
  292. package/test/text/web_vtt_generator_unit.js +0 -3
  293. package/test/ui/ad_ui_unit.js +0 -11
  294. package/test/ui/localization_unit.js +0 -3
  295. package/test/ui/text_displayer_layout_unit.js +9 -19
  296. package/test/ui/ui_customization_unit.js +0 -6
  297. package/test/ui/ui_integration.js +0 -16
  298. package/test/ui/ui_unit.js +1 -17
  299. package/test/util/abortable_operation_unit.js +4 -9
  300. package/test/util/array_utils_unit.js +0 -2
  301. package/test/util/buffer_utils_unit.js +0 -2
  302. package/test/util/data_view_reader_unit.js +0 -4
  303. package/test/util/ebml_parser_unit.js +0 -4
  304. package/test/util/event_manager_unit.js +0 -3
  305. package/test/util/fake_event_target_unit.js +0 -5
  306. package/test/util/functional_unit.js +1 -1
  307. package/test/util/iterables_unit.js +0 -64
  308. package/test/util/language_utils_unit.js +0 -3
  309. package/test/util/manifest_parser_utils_unit.js +0 -2
  310. package/test/util/mp4_box_parsers_unit.js +0 -5
  311. package/test/util/mp4_parser_unit.js +0 -4
  312. package/test/util/multi_map_unit.js +0 -3
  313. package/test/util/object_utils_unit.js +0 -2
  314. package/test/util/periods_unit.js +14 -7
  315. package/test/util/pssh_unit.js +0 -5
  316. package/test/util/state_history_unit.js +0 -2
  317. package/test/util/stream_utils_unit.js +38 -37
  318. package/test/util/string_utils_unit.js +0 -6
  319. package/test/util/text_parser_unit.js +0 -2
  320. package/test/util/xml_utils_unit.js +0 -4
  321. package/ui/controls.js +3 -0
  322. package/ui/less/ad_controls.less +4 -4
  323. package/ui/less/buttons.less +5 -9
  324. package/ui/less/containers.less +5 -7
  325. package/ui/less/overflow_menu.less +4 -4
  326. package/ui/less/range_elements.less +5 -0
  327. package/ui/locales/sjn-translations.yaml +257 -0
  328. package/ui/locales/sjn.json +42 -0
  329. package/ui/localization.js +12 -36
  330. package/ui/text_selection.js +1 -0
  331. package/externs/media_capabilities.js +0 -16
  332. package/externs/svgelement.js +0 -18
@@ -21,7 +21,6 @@ goog.require('shaka.net.NetworkingEngine');
21
21
  goog.require('shaka.text.TextEngine');
22
22
  goog.require('shaka.util.Error');
23
23
  goog.require('shaka.util.Functional');
24
- goog.require('shaka.util.Iterables');
25
24
  goog.require('shaka.util.LanguageUtils');
26
25
  goog.require('shaka.util.ManifestParserUtils');
27
26
  goog.require('shaka.util.MimeUtils');
@@ -103,7 +102,7 @@ shaka.dash.DashParser = class {
103
102
 
104
103
  /**
105
104
  * Period IDs seen in previous manifest.
106
- * @private {!Array.<number>}
105
+ * @private {!Array.<string>}
107
106
  */
108
107
  this.lastManifestUpdatePeriodIds_ = [];
109
108
 
@@ -372,7 +371,7 @@ shaka.dash.DashParser = class {
372
371
  // This gives us confidence that our state is maintained correctly, and
373
372
  // that the complex logic of multi-Period eviction and period-flattening
374
373
  // is correct. See also:
375
- // https://github.com/google/shaka-player/issues/3169#issuecomment-823580634
374
+ // https://github.com/shaka-project/shaka-player/issues/3169#issuecomment-823580634
376
375
  for (const segmentIndex of Object.values(this.segmentIndexMap_)) {
377
376
  segmentIndex.evict(presentationTimeline.getSegmentAvailabilityStart());
378
377
  }
@@ -396,6 +395,24 @@ shaka.dash.DashParser = class {
396
395
  this.config_.dash.autoCorrectDrift);
397
396
  }
398
397
 
398
+ presentationTimeline.setStatic(mpdType == 'static');
399
+
400
+ const isLive = presentationTimeline.isLive();
401
+
402
+ // If it's live, we check for an override.
403
+ if (isLive && !isNaN(this.config_.availabilityWindowOverride)) {
404
+ segmentAvailabilityDuration = this.config_.availabilityWindowOverride;
405
+ }
406
+
407
+ // If it's null, that means segments are always available. This is always
408
+ // the case for VOD, and sometimes the case for live.
409
+ if (segmentAvailabilityDuration == null) {
410
+ segmentAvailabilityDuration = Infinity;
411
+ }
412
+
413
+ presentationTimeline.setSegmentAvailabilityDuration(
414
+ segmentAvailabilityDuration);
415
+
399
416
  const profiles = mpd.getAttribute('profiles') || '';
400
417
 
401
418
  /** @type {shaka.dash.DashParser.Context} */
@@ -418,7 +435,6 @@ shaka.dash.DashParser = class {
418
435
  const duration = periodsAndDuration.duration;
419
436
  const periods = periodsAndDuration.periods;
420
437
 
421
- presentationTimeline.setStatic(mpdType == 'static');
422
438
  if (mpdType == 'static' ||
423
439
  !periodsAndDuration.durationDerivedFromPeriods) {
424
440
  // Ignore duration calculated from Period lengths if this is dynamic.
@@ -437,6 +453,7 @@ shaka.dash.DashParser = class {
437
453
  this.lowLatencyMode_ = this.playerInterface_.isLowLatencyMode();
438
454
  }
439
455
  }
456
+
440
457
  if (this.lowLatencyMode_) {
441
458
  presentationTimeline.setAvailabilityTimeOffset(
442
459
  this.minTotalAvailabilityTimeOffset_);
@@ -450,22 +467,6 @@ shaka.dash.DashParser = class {
450
467
  'https://bit.ly/3clctcj for details.');
451
468
  }
452
469
 
453
- const isLive = presentationTimeline.isLive();
454
-
455
- // If it's live, we check for an override.
456
- if (isLive && !isNaN(this.config_.availabilityWindowOverride)) {
457
- segmentAvailabilityDuration = this.config_.availabilityWindowOverride;
458
- }
459
-
460
- // If it's null, that means segments are always available. This is always
461
- // the case for VOD, and sometimes the case for live.
462
- if (segmentAvailabilityDuration == null) {
463
- segmentAvailabilityDuration = Infinity;
464
- }
465
-
466
- presentationTimeline.setSegmentAvailabilityDuration(
467
- segmentAvailabilityDuration);
468
-
469
470
  // Use @maxSegmentDuration to override smaller, derived values.
470
471
  presentationTimeline.notifyMaxSegmentDuration(maxSegmentDuration || 1);
471
472
  if (goog.DEBUG) {
@@ -539,10 +540,9 @@ shaka.dash.DashParser = class {
539
540
  const periods = [];
540
541
  let prevEnd = 0;
541
542
  const periodNodes = XmlUtils.findChildren(mpd, 'Period');
542
- // This uses a for-loop rather than a for-of loop because this needs to look
543
- // ahead to the next element.
544
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
545
- for (const {i, item: elem, next} of enumerate(periodNodes)) {
543
+ for (let i = 0; i < periodNodes.length; i++) {
544
+ const elem = periodNodes[i];
545
+ const next = periodNodes[i + 1];
546
546
  const start = /** @type {number} */ (
547
547
  XmlUtils.parseAttr(elem, 'start', XmlUtils.parseDuration, prevEnd));
548
548
  const periodId = elem.id;
@@ -700,8 +700,12 @@ shaka.dash.DashParser = class {
700
700
 
701
701
  const eventStreamNodes =
702
702
  XmlUtils.findChildren(periodInfo.node, 'EventStream');
703
+ const availabilityStart =
704
+ context.presentationTimeline.getSegmentAvailabilityStart();
705
+
703
706
  for (const node of eventStreamNodes) {
704
- this.parseEventStream_(periodInfo.start, periodInfo.duration, node);
707
+ this.parseEventStream_(
708
+ periodInfo.start, periodInfo.duration, node, availabilityStart);
705
709
  }
706
710
 
707
711
  const adaptationSetNodes =
@@ -744,7 +748,7 @@ shaka.dash.DashParser = class {
744
748
  for (const stream of normalSet.streams) {
745
749
  // There may be multiple trick mode streams, but we do not
746
750
  // currently support that. Just choose one.
747
- // TODO: https://github.com/google/shaka-player/issues/1528
751
+ // TODO: https://github.com/shaka-project/shaka-player/issues/1528
748
752
  stream.trickModeVideo = trickModeSet.streams.find((trickStream) =>
749
753
  shaka.util.MimeUtils.getCodecBase(stream.codecs) ==
750
754
  shaka.util.MimeUtils.getCodecBase(trickStream.codecs));
@@ -1137,7 +1141,7 @@ shaka.dash.DashParser = class {
1137
1141
  // does not make sense in the DASH spec's bandwidth formulas.
1138
1142
  // In some content, however, the attribute is missing or zero.
1139
1143
  // To avoid NaN at the variant level on broken content, fall back to zero.
1140
- // https://github.com/google/shaka-player/issues/938#issuecomment-317278180
1144
+ // https://github.com/shaka-project/shaka-player/issues/938#issuecomment-317278180
1141
1145
  context.bandwidth =
1142
1146
  XmlUtils.parseAttr(node, 'bandwidth', XmlUtils.parsePositiveInt) || 0;
1143
1147
 
@@ -1215,8 +1219,10 @@ shaka.dash.DashParser = class {
1215
1219
 
1216
1220
  let forced = false;
1217
1221
  if (isText) {
1218
- // See: https://github.com/google/shaka-player/issues/2122
1219
- forced = roles.includes('forced_subtitle');
1222
+ // See: https://github.com/shaka-project/shaka-player/issues/2122 and
1223
+ // https://github.com/Dash-Industry-Forum/DASH-IF-IOP/issues/165
1224
+ forced = roles.includes('forced_subtitle') ||
1225
+ roles.includes('forced-subtitle');
1220
1226
  }
1221
1227
 
1222
1228
  let tilesLayout;
@@ -1339,7 +1345,7 @@ shaka.dash.DashParser = class {
1339
1345
  // NOTE: An updatePeriod_ of -1 means the attribute was missing.
1340
1346
  // An attribute which is present and set to 0 should still result in
1341
1347
  // periodic updates. For more, see:
1342
- // https://github.com/google/shaka-player/issues/331
1348
+ // https://github.com/shaka-project/shaka-player/issues/331
1343
1349
  if (this.updatePeriod_ < 0) {
1344
1350
  return;
1345
1351
  }
@@ -1730,9 +1736,10 @@ shaka.dash.DashParser = class {
1730
1736
  * @param {number} periodStart
1731
1737
  * @param {?number} periodDuration
1732
1738
  * @param {!Element} elem
1739
+ * @param {number} availabilityStart
1733
1740
  * @private
1734
1741
  */
1735
- parseEventStream_(periodStart, periodDuration, elem) {
1742
+ parseEventStream_(periodStart, periodDuration, elem, availabilityStart) {
1736
1743
  const XmlUtils = shaka.util.XmlUtils;
1737
1744
  const parseNumber = XmlUtils.parseNonNegativeInt;
1738
1745
 
@@ -1755,6 +1762,11 @@ shaka.dash.DashParser = class {
1755
1762
  endTime = Math.min(endTime, periodStart + periodDuration);
1756
1763
  }
1757
1764
 
1765
+ // Don't add unavailable regions to the timeline.
1766
+ if (endTime < availabilityStart) {
1767
+ continue;
1768
+ }
1769
+
1758
1770
  /** @type {shaka.extern.TimelineRegionInfo} */
1759
1771
  const region = {
1760
1772
  schemeIdUri: schemeIdUri,
@@ -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');
@@ -213,7 +212,7 @@ shaka.dash.SegmentList = class {
213
212
  /** @type {!Array.<!shaka.media.SegmentReference>} */
214
213
  const references = [];
215
214
  let prevEndTime = info.startTime;
216
- for (const i of shaka.util.Iterables.range(max)) {
215
+ for (let i = 0; i < max; i++) {
217
216
  const segment = info.mediaSegments[i];
218
217
  const mediaUri = ManifestParserUtils.resolveUris(
219
218
  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');
@@ -491,8 +490,9 @@ shaka.dash.SegmentTemplate = class {
491
490
 
492
491
  /** @type {!Array.<!shaka.media.SegmentReference>} */
493
492
  const references = [];
494
- const enum_ = (it) => shaka.util.Iterables.enumerate(it);
495
- for (const {i, item: {start, unscaledStart, end}} of enum_(info.timeline)) {
493
+ for (let i = 0; i < info.timeline.length; i++) {
494
+ const {start, unscaledStart, end} = info.timeline[i];
495
+
496
496
  // Note: i = k - 1, where k indicates the k'th segment listed in the MPD.
497
497
  // (See section 5.3.9.5.3 of the DASH spec.)
498
498
  const segmentReplacement = i + info.startNumber;
@@ -29,7 +29,6 @@ goog.require('shaka.util.DataViewReader');
29
29
  goog.require('shaka.util.Error');
30
30
  goog.require('shaka.util.FakeEvent');
31
31
  goog.require('shaka.util.Functional');
32
- goog.require('shaka.util.Iterables');
33
32
  goog.require('shaka.util.LanguageUtils');
34
33
  goog.require('shaka.util.ManifestParserUtils');
35
34
  goog.require('shaka.util.MimeUtils');
@@ -885,7 +884,7 @@ shaka.hls.HlsParser = class {
885
884
  // the content. This means that if the content changes profiles, it should
886
885
  // include both. Since all known browsers support changing profiles
887
886
  // without any other work, just ignore them. See also:
888
- // https://github.com/google/shaka-player/issues/1817
887
+ // https://github.com/shaka-project/shaka-player/issues/1817
889
888
  const shortCodec = shaka.util.MimeUtils.getCodecBase(codec);
890
889
  if (!seen.has(shortCodec)) {
891
890
  ret.push(codec);
@@ -1653,8 +1652,8 @@ shaka.hls.HlsParser = class {
1653
1652
  // Create SegmentReferences for the partial segments.
1654
1653
  const partialSegmentRefs = [];
1655
1654
  if (this.lowLatencyMode_ && hlsSegment.partialSegments.length) {
1656
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
1657
- for (const {i, item} of enumerate(hlsSegment.partialSegments)) {
1655
+ for (let i = 0; i < hlsSegment.partialSegments.length; i++) {
1656
+ const item = hlsSegment.partialSegments[i];
1658
1657
  const pPreviousReference = i == 0 ?
1659
1658
  previousReference : partialSegmentRefs[partialSegmentRefs.length - 1];
1660
1659
  const pStartTime = (i == 0) ? startTime : pPreviousReference.endTime;
@@ -1675,6 +1674,9 @@ shaka.hls.HlsParser = class {
1675
1674
  this.parseByteRange_(pPreviousReference, pByterange);
1676
1675
  }
1677
1676
  const pUri = item.getAttributeValue('URI');
1677
+ if (!pUri) {
1678
+ continue;
1679
+ }
1678
1680
  const pAbsoluteUri = shaka.hls.Utils.constructAbsoluteUri(
1679
1681
  absoluteMediaPlaylistUri, pUri);
1680
1682
 
@@ -1860,9 +1862,9 @@ shaka.hls.HlsParser = class {
1860
1862
  // With delta updates, the DISCONTINUITY may be skipped. Check if
1861
1863
  // the discontintuity Sequence Number based on the media sequence
1862
1864
  // number.
1863
- while (discontinuityToMediaSequence.has(discontintuitySequenceNum + 1)
1864
- && discontinuityToMediaSequence.get(discontintuitySequenceNum + 1) <
1865
- position) {
1865
+ const disconMap = discontinuityToMediaSequence;
1866
+ while (disconMap.has(discontintuitySequenceNum + 1) &&
1867
+ disconMap.get(discontintuitySequenceNum + 1) < position) {
1866
1868
  discontintuitySequenceNum++;
1867
1869
  }
1868
1870
  }
@@ -1873,8 +1875,8 @@ shaka.hls.HlsParser = class {
1873
1875
  /** @type {!Array.<!shaka.media.SegmentReference>} */
1874
1876
  const references = [];
1875
1877
 
1876
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
1877
- for (const {i, item} of enumerate(hlsSegments)) {
1878
+ for (let i = 0; i < hlsSegments.length; i++) {
1879
+ const item = hlsSegments[i];
1878
1880
  const previousReference = references[references.length - 1];
1879
1881
  const startTime = (i == 0) ? firstStartTime :
1880
1882
  previousReference.endTime;
@@ -13,7 +13,6 @@ goog.require('shaka.hls.Segment');
13
13
  goog.require('shaka.hls.Tag');
14
14
  goog.require('shaka.hls.Utils');
15
15
  goog.require('shaka.util.Error');
16
- goog.require('shaka.util.Iterables');
17
16
  goog.require('shaka.util.StringUtils');
18
17
  goog.require('shaka.util.TextParser');
19
18
 
@@ -82,8 +81,9 @@ shaka.hls.ManifestTextParser = class {
82
81
  const tags = [];
83
82
  // Initialize to "true" to skip the first element.
84
83
  skip = true;
85
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
86
- for (const {i, item: line, next} of enumerate(lines)) {
84
+ for (let i = 0; i < lines.length; i++) {
85
+ const line = lines[i];
86
+ const next = lines[i + 1];
87
87
  // Skip comments
88
88
  if (shaka.hls.Utils.isComment(line) || skip) {
89
89
  skip = false;
@@ -277,6 +277,7 @@ shaka.hls.ManifestTextParser = class {
277
277
  const attrValue = blockAttrs[2] || blockAttrs[3];
278
278
  const attribute = new shaka.hls.Attribute(attrName, attrValue);
279
279
  attributes.push(attribute);
280
+ parser.skipWhitespace();
280
281
  }
281
282
  }
282
283
 
@@ -8,7 +8,6 @@ goog.provide('shaka.media.AdaptationSet');
8
8
 
9
9
  goog.require('goog.asserts');
10
10
  goog.require('shaka.log');
11
- goog.require('shaka.util.Iterables');
12
11
  goog.require('shaka.util.MimeUtils');
13
12
 
14
13
 
@@ -215,7 +214,7 @@ shaka.media.AdaptationSet = class {
215
214
  codecsA.sort();
216
215
  codecsB.sort();
217
216
 
218
- for (const i of shaka.util.Iterables.range(codecsA.length)) {
217
+ for (let i = 0; i < codecsA.length; i++) {
219
218
  if (codecsA[i] != codecsB[i]) {
220
219
  return false;
221
220
  }
@@ -11,7 +11,6 @@ goog.require('shaka.cea.CeaDecoder');
11
11
  goog.require('shaka.cea.Mp4CeaParser');
12
12
  goog.require('shaka.util.BufferUtils');
13
13
  goog.requireType('shaka.cea.ICaptionDecoder');
14
- goog.requireType('shaka.cea.ICaptionDecoder.ClosedCaption');
15
14
  goog.requireType('shaka.cea.ICeaParser');
16
15
 
17
16
 
@@ -31,7 +31,7 @@ shaka.media.ContentWorkarounds = class {
31
31
  *
32
32
  * @param {!BufferSource} initSegmentBuffer
33
33
  * @return {!Uint8Array}
34
- * @see https://github.com/google/shaka-player/issues/2759
34
+ * @see https://github.com/shaka-project/shaka-player/issues/2759
35
35
  */
36
36
  static fakeEncryption(initSegmentBuffer) {
37
37
  const ContentWorkarounds = shaka.media.ContentWorkarounds;
@@ -283,7 +283,7 @@ shaka.media.ContentWorkarounds = class {
283
283
  *
284
284
  * @const {!shaka.util.Lazy.<!Uint8Array>}
285
285
  * @private
286
- * @see https://github.com/google/shaka-player/issues/2759
286
+ * @see https://github.com/shaka-project/shaka-player/issues/2759
287
287
  */
288
288
  shaka.media.ContentWorkarounds.CANNED_SINF_BOX_ =
289
289
  new shaka.util.Lazy(() => new Uint8Array([
@@ -616,7 +616,7 @@ shaka.media.DrmEngine = class {
616
616
  // first MIME type even if the others are supported. To work around this,
617
617
  // we say that Edge supports everything.
618
618
  //
619
- // See https://github.com/google/shaka-player/issues/1495 for details.
619
+ // See https://github.com/shaka-project/shaka-player/issues/1495 for details.
620
620
  if (shaka.util.Platform.isLegacyEdge()) {
621
621
  return true;
622
622
  }
@@ -628,7 +628,8 @@ shaka.media.DrmEngine = class {
628
628
  // Some Tizen devices seem to misreport AC-3 support. This works around
629
629
  // the issue, by falling back to EC-3, which seems to be supported on the
630
630
  // same devices and be correctly reported in all cases we have observed.
631
- // See https://github.com/google/shaka-player/issues/2989 for details.
631
+ // See https://github.com/shaka-project/shaka-player/issues/2989 for
632
+ // details.
632
633
  const fallback = contentType.replace('ac-3', 'ec-3');
633
634
  return this.supportedTypes_.has(contentType) ||
634
635
  this.supportedTypes_.has(fallback);
@@ -830,7 +830,8 @@ shaka.media.MediaSourceEngine = class {
830
830
  * @private
831
831
  */
832
832
  setTimestampOffset_(contentType, timestampOffset) {
833
- // Work around for https://github.com/google/shaka-player/issues/1281:
833
+ // Work around for
834
+ // https://github.com/shaka-project/shaka-player/issues/1281:
834
835
  // TODO(https://bit.ly/2ttKiBU): follow up when this is fixed in Edge
835
836
  if (timestampOffset < 0) {
836
837
  // Try to prevent rounding errors in Edge from removing the first
@@ -1100,7 +1101,7 @@ shaka.media.MediaSourceEngine = class {
1100
1101
  // then insert fake encryption metadata for init segments that lack it.
1101
1102
  // The MP4 requirement is because we can currently only do this
1102
1103
  // transformation on MP4 containers.
1103
- // See: https://github.com/google/shaka-player/issues/2759
1104
+ // See: https://github.com/shaka-project/shaka-player/issues/2759
1104
1105
  if (isInitSegment &&
1105
1106
  encryptionExpected &&
1106
1107
  shaka.util.Platform.requiresEncryptionInfoInAllInitSegments() &&
@@ -11,8 +11,6 @@ goog.require('shaka.log');
11
11
  goog.require('shaka.media.InitSegmentReference');
12
12
  goog.require('shaka.media.SegmentReference');
13
13
  goog.require('shaka.util.Error');
14
- goog.require('shaka.util.Functional');
15
- goog.require('shaka.util.Iterables');
16
14
  goog.require('shaka.util.Mp4Parser');
17
15
 
18
16
 
@@ -123,8 +121,7 @@ shaka.media.Mp4SegmentIndexParser = class {
123
121
  let unscaledStartTime = earliestPresentationTime;
124
122
  let startByte = sidxOffset + box.size + firstOffset;
125
123
 
126
- for (const _ of shaka.util.Iterables.range(referenceCount)) {
127
- shaka.util.Functional.ignored(_);
124
+ for (let i = 0; i < referenceCount; i++) {
128
125
  // |chunk| is 1 bit for |referenceType|, and 31 bits for |referenceSize|.
129
126
  const chunk = box.reader.readUint32();
130
127
  const referenceType = (chunk & 0x80000000) >>> 31;
@@ -256,7 +256,7 @@ shaka.media.MediaSourcePlayhead = class {
256
256
  // We don't buffer when the livestream video is paused and the playhead time
257
257
  // is out of the seek range; thus, we do not clamp the current time when the
258
258
  // video is paused.
259
- // https://github.com/google/shaka-player/issues/1121
259
+ // https://github.com/shaka-project/shaka-player/issues/1121
260
260
  if (this.mediaElement_.readyState > 0 && !this.mediaElement_.paused) {
261
261
  return this.clampTime_(time);
262
262
  }
@@ -362,7 +362,7 @@ shaka.media.MediaSourcePlayhead = class {
362
362
  * presentation duration. Seeking to or starting at duration does not work
363
363
  * consistently across browsers.
364
364
  *
365
- * @see https://github.com/google/shaka-player/issues/979
365
+ * @see https://github.com/shaka-project/shaka-player/issues/979
366
366
  * @param {number} time
367
367
  * @return {number} The adjusted seek time.
368
368
  * @private
@@ -355,14 +355,23 @@ shaka.media.PresentationTimeline = class {
355
355
  * starting after this time should be assumed to be unavailable.
356
356
  *
357
357
  * @return {number} The current segment availability end time, in seconds,
358
- * relative to the start of the presentation. Always returns the
359
- * presentation's duration for video-on-demand.
358
+ * relative to the start of the presentation. For VOD, the availability
359
+ * end time is the content's duration. If the Player's playRangeEnd
360
+ * configuration is used, this can override the duration.
360
361
  * @export
361
362
  */
362
363
  getSegmentAvailabilityEnd() {
363
364
  if (!this.isLive() && !this.isInProgress()) {
364
365
  // It's a static manifest (can also be a dynamic->static conversion)
365
- return this.maxSegmentEndTime_ || this.duration_;
366
+ if (this.maxSegmentEndTime_) {
367
+ // If we know segment times, use the min of that and duration.
368
+ // Note that the playRangeEnd configuration changes this.duration_.
369
+ // See https://github.com/shaka-project/shaka-player/issues/4026
370
+ return Math.min(this.maxSegmentEndTime_, this.duration_);
371
+ } else {
372
+ // If we don't have segment times, use duration.
373
+ return this.duration_;
374
+ }
366
375
  }
367
376
  // Can be either live or "in-progress recording" (live with known duration)
368
377
  return Math.min(this.getLiveEdge_() + this.availabilityTimeOffset_,
@@ -389,10 +398,11 @@ shaka.media.PresentationTimeline = class {
389
398
  // For VOD, the offset and end time are ignored, and we just return the
390
399
  // earliest segment time. All segments are "safe" in VOD. However, we
391
400
  // should round up to the nearest millisecond to avoid issues like
392
- // https://github.com/google/shaka-player/issues/2831, in which we tried to
393
- // seek repeatedly to catch up to the seek range, and never actually
394
- // "arrived" within it. The video's currentTime is not as accurate as the
395
- // JS number representing the earliest segment time for some content.
401
+ // https://github.com/shaka-project/shaka-player/issues/2831, in which we
402
+ // tried to seek repeatedly to catch up to the seek range, and never
403
+ // actually "arrived" within it. The video's currentTime is not as
404
+ // accurate as the JS number representing the earliest segment time for
405
+ // some content.
396
406
  if (this.segmentAvailabilityDuration_ == Infinity) {
397
407
  return Math.ceil(earliestSegmentTime * 1e3) / 1e3;
398
408
  }
@@ -407,7 +417,7 @@ shaka.media.PresentationTimeline = class {
407
417
  // Add the offset to the availability start to ensure that we don't fall
408
418
  // outside the availability window while we buffer; we don't need to add the
409
419
  // offset to earliestSegmentTime since that won't change over time.
410
- // Also see: https://github.com/google/shaka-player/issues/692
420
+ // Also see: https://github.com/shaka-project/shaka-player/issues/692
411
421
  const desiredStart =
412
422
  Math.min(availabilityStart + offset, this.getSeekRangeEnd());
413
423
  return Math.max(earliestSegmentTime, desiredStart);