shaka-player 3.2.4 → 3.2.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 (327) 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 +129 -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 +147 -0
  9. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  10. package/.github/workflows/selenium-lab-tests.yaml +92 -0
  11. package/AUTHORS +2 -0
  12. package/CHANGELOG.md +1596 -1556
  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 +3 -3
  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 +94 -29
  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 +225 -219
  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 +225 -224
  94. package/dist/shaka-player.compiled.debug.d.ts +225 -224
  95. package/dist/shaka-player.compiled.debug.externs.js +5 -3
  96. package/dist/shaka-player.compiled.debug.js +319 -323
  97. package/dist/shaka-player.compiled.debug.map +4 -4
  98. package/dist/shaka-player.compiled.externs.js +5 -3
  99. package/dist/shaka-player.compiled.js +832 -833
  100. package/dist/shaka-player.compiled.map +4 -4
  101. package/dist/shaka-player.ui.d.ts +267 -266
  102. package/dist/shaka-player.ui.debug.d.ts +267 -266
  103. package/dist/shaka-player.ui.debug.externs.js +5 -3
  104. package/dist/shaka-player.ui.debug.js +287 -291
  105. package/dist/shaka-player.ui.debug.map +4 -4
  106. package/dist/shaka-player.ui.externs.js +5 -3
  107. package/dist/shaka-player.ui.js +981 -982
  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/karma.conf.js +141 -30
  121. package/lib/abr/simple_abr_manager.js +12 -6
  122. package/lib/cast/cast_proxy.js +3 -4
  123. package/lib/cea/cea608_data_channel.js +2 -2
  124. package/lib/cea/cea708_service.js +5 -4
  125. package/lib/cea/mp4_cea_parser.js +11 -5
  126. package/lib/cea/sei_processor.js +6 -3
  127. package/lib/dash/dash_parser.js +11 -14
  128. package/lib/dash/mpd_utils.js +4 -5
  129. package/lib/dash/segment_list.js +1 -2
  130. package/lib/dash/segment_template.js +3 -3
  131. package/lib/hls/hls_parser.js +34 -20
  132. package/lib/hls/manifest_text_parser.js +3 -3
  133. package/lib/media/adaptation_set.js +1 -2
  134. package/lib/media/content_workarounds.js +2 -2
  135. package/lib/media/drm_engine.js +3 -2
  136. package/lib/media/media_source_engine.js +10 -3
  137. package/lib/media/mp4_segment_index_parser.js +1 -4
  138. package/lib/media/playhead.js +2 -2
  139. package/lib/media/presentation_timeline.js +18 -8
  140. package/lib/media/streaming_engine.js +6 -6
  141. package/lib/media/time_ranges_utils.js +1 -3
  142. package/lib/media/video_wrapper.js +1 -1
  143. package/lib/net/networking_engine.js +1 -1
  144. package/lib/offline/indexeddb/storage_mechanism.js +4 -2
  145. package/lib/offline/storage.js +4 -4
  146. package/lib/player.js +190 -114
  147. package/lib/polyfill/all.js +2 -3
  148. package/lib/polyfill/encryption_scheme.js +1 -1
  149. package/lib/polyfill/media_capabilities.js +3 -3
  150. package/lib/polyfill/mediasource.js +1 -1
  151. package/lib/text/cue.js +1 -1
  152. package/lib/text/simple_text_displayer.js +2 -1
  153. package/lib/text/ttml_text_parser.js +8 -5
  154. package/lib/text/ui_text_displayer.js +1 -1
  155. package/lib/util/buffer_utils.js +1 -3
  156. package/lib/util/config_utils.js +25 -0
  157. package/lib/util/ebml_parser.js +3 -3
  158. package/lib/util/error.js +8 -1
  159. package/lib/util/iterables.js +0 -46
  160. package/lib/util/manifest_parser_utils.js +1 -1
  161. package/lib/util/mime_utils.js +48 -1
  162. package/lib/util/mp4_box_parsers.js +1 -4
  163. package/lib/util/mp4_parser.js +5 -7
  164. package/lib/util/periods.js +13 -13
  165. package/lib/util/platform.js +3 -3
  166. package/lib/util/player_configuration.js +9 -14
  167. package/lib/util/pssh.js +1 -4
  168. package/lib/util/stream_utils.js +8 -5
  169. package/lib/util/string_utils.js +3 -5
  170. package/lib/util/uint8array_utils.js +3 -5
  171. package/lib/util/xml_utils.js +15 -7
  172. package/package.json +61 -36
  173. package/roadmap.md +17 -17
  174. package/test/abr/simple_abr_manager_unit.js +3 -8
  175. package/test/ads/ad_manager_unit.js +0 -6
  176. package/test/cast/cast_proxy_unit.js +0 -8
  177. package/test/cast/cast_receiver_integration.js +1 -18
  178. package/test/cast/cast_receiver_unit.js +1 -9
  179. package/test/cast/cast_sender_unit.js +0 -6
  180. package/test/cast/cast_utils_unit.js +1 -13
  181. package/test/cea/cea608_memory_unit.js +0 -5
  182. package/test/cea/cea708_service_unit.js +0 -7
  183. package/test/cea/cea708_window_unit.js +0 -5
  184. package/test/cea/cea_decoder_unit.js +0 -6
  185. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  186. package/test/cea/dtvcc_packet_unit.js +0 -5
  187. package/test/cea/mp4_cea_parser_unit.js +0 -4
  188. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  189. package/test/dash/dash_parser_live_unit.js +2 -15
  190. package/test/dash/dash_parser_manifest_unit.js +2 -40
  191. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  192. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  193. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  194. package/test/dash/mpd_utils_unit.js +3 -11
  195. package/test/demo/demo_unit.js +0 -5
  196. package/test/deprecate/enforcer_unit.js +0 -4
  197. package/test/deprecate/version_unit.js +0 -2
  198. package/test/hls/hls_live_unit.js +28 -14
  199. package/test/hls/hls_parser_unit.js +2 -15
  200. package/test/hls/manifest_text_parser_unit.js +19 -10
  201. package/test/media/adaptation_set_criteria_unit.js +3 -7
  202. package/test/media/adaptation_set_unit.js +0 -2
  203. package/test/media/buffering_observer_unit.js +1 -4
  204. package/test/media/closed_caption_parser_unit.js +0 -3
  205. package/test/media/drm_engine_integration.js +2 -15
  206. package/test/media/drm_engine_unit.js +4 -24
  207. package/test/media/manifest_parser_unit.js +0 -4
  208. package/test/media/media_source_engine_integration.js +1 -7
  209. package/test/media/media_source_engine_unit.js +5 -18
  210. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  211. package/test/media/play_rate_controller_unit.js +0 -4
  212. package/test/media/playhead_unit.js +8 -16
  213. package/test/media/presentation_timeline_unit.js +4 -7
  214. package/test/media/region_observer_unit.js +1 -6
  215. package/test/media/region_timeline_unit.js +0 -3
  216. package/test/media/segment_index_unit.js +0 -6
  217. package/test/media/segment_reference_unit.js +0 -3
  218. package/test/media/stall_detector_unit.js +0 -5
  219. package/test/media/streaming_engine_integration.js +11 -36
  220. package/test/media/streaming_engine_unit.js +11 -35
  221. package/test/media/time_ranges_utils_unit.js +0 -2
  222. package/test/media/transmuxer_integration.js +0 -6
  223. package/test/media/webm_segment_index_parser_unit.js +0 -4
  224. package/test/net/data_uri_plugin_unit.js +0 -7
  225. package/test/net/http_plugin_unit.js +0 -9
  226. package/test/net/networking_engine_unit.js +0 -11
  227. package/test/offline/download_progress_estimator_unit.js +0 -2
  228. package/test/offline/indexeddb_storage_unit.js +1 -7
  229. package/test/offline/manifest_convert_unit.js +0 -8
  230. package/test/offline/offline_integration.js +1 -10
  231. package/test/offline/offline_manifest_parser_unit.js +0 -6
  232. package/test/offline/offline_scheme_unit.js +0 -8
  233. package/test/offline/offline_uri_unit.js +0 -2
  234. package/test/offline/storage_compatibility_unit.js +2 -15
  235. package/test/offline/storage_integration.js +1 -25
  236. package/test/player_external.js +9 -11
  237. package/test/player_integration.js +27 -38
  238. package/test/player_load_graph_integration.js +1 -6
  239. package/test/player_src_equals_external.js +3 -9
  240. package/test/player_src_equals_integration.js +81 -90
  241. package/test/player_unit.js +150 -38
  242. package/test/routing/walker_unit.js +0 -8
  243. package/test/test/assets/large_file.mpd +1 -1
  244. package/test/test/boot.js +84 -22
  245. package/test/test/externs/filters.js +4 -0
  246. package/test/test/externs/jasmine.js +2 -2
  247. package/test/test/externs/karma.js +4 -0
  248. package/test/test/namespace.js +10 -0
  249. package/test/test/util/canned_idb.js +0 -8
  250. package/test/test/util/cea_utils.js +0 -6
  251. package/test/test/util/dash_parser_util.js +0 -13
  252. package/test/test/util/fake_ad.js +0 -3
  253. package/test/test/util/fake_ad_manager.js +0 -9
  254. package/test/test/util/fake_demo_main.js +0 -5
  255. package/test/test/util/fake_drm_engine.js +0 -6
  256. package/test/test/util/fake_media_source_engine.js +0 -7
  257. package/test/test/util/fake_networking_engine.js +0 -5
  258. package/test/test/util/fake_text_displayer.js +0 -5
  259. package/test/test/util/indexeddb_utils.js +1 -10
  260. package/test/test/util/jasmine_fetch.js +0 -1
  261. package/test/test/util/loader.js +0 -18
  262. package/test/test/util/manifest_generator.js +9 -14
  263. package/test/test/util/manifest_parser_util.js +0 -6
  264. package/test/test/util/offline_utils.js +0 -5
  265. package/test/test/util/simple_fakes.js +40 -28
  266. package/test/test/util/stream_generator.js +0 -14
  267. package/test/test/util/streaming_engine_util.js +0 -15
  268. package/test/test/util/test_scheme.js +1 -19
  269. package/test/test/util/ttml_utils.js +0 -2
  270. package/test/test/util/ui_utils.js +0 -9
  271. package/test/test/util/util.js +5 -19
  272. package/test/test/util/waiter.js +84 -43
  273. package/test/text/cue_integration.js +0 -4
  274. package/test/text/lrc_text_parser_unit.js +0 -4
  275. package/test/text/mp4_ttml_parser_unit.js +0 -6
  276. package/test/text/mp4_vtt_parser_unit.js +1 -7
  277. package/test/text/sbv_text_parser_unit.js +0 -4
  278. package/test/text/simple_text_displayer_unit.js +1 -8
  279. package/test/text/srt_text_parser_unit.js +0 -4
  280. package/test/text/ssa_text_parser_unit.js +0 -5
  281. package/test/text/text_engine_unit.js +2 -7
  282. package/test/text/text_track_integration.js +0 -2
  283. package/test/text/ttml_text_parser_unit.js +2 -11
  284. package/test/text/ui_text_displayer_unit.js +44 -41
  285. package/test/text/vtt_text_parser_unit.js +0 -9
  286. package/test/text/web_vtt_generator_unit.js +0 -3
  287. package/test/ui/ad_ui_unit.js +0 -11
  288. package/test/ui/localization_unit.js +0 -3
  289. package/test/ui/text_displayer_layout_unit.js +1 -12
  290. package/test/ui/ui_customization_unit.js +0 -6
  291. package/test/ui/ui_integration.js +0 -16
  292. package/test/ui/ui_unit.js +1 -17
  293. package/test/util/abortable_operation_unit.js +4 -9
  294. package/test/util/array_utils_unit.js +0 -2
  295. package/test/util/buffer_utils_unit.js +0 -2
  296. package/test/util/data_view_reader_unit.js +0 -4
  297. package/test/util/ebml_parser_unit.js +0 -4
  298. package/test/util/event_manager_unit.js +0 -3
  299. package/test/util/fake_event_target_unit.js +0 -5
  300. package/test/util/functional_unit.js +1 -1
  301. package/test/util/iterables_unit.js +0 -64
  302. package/test/util/language_utils_unit.js +0 -3
  303. package/test/util/manifest_parser_utils_unit.js +0 -2
  304. package/test/util/mime_utils_unit.js +54 -0
  305. package/test/util/mp4_box_parsers_unit.js +0 -5
  306. package/test/util/mp4_parser_unit.js +0 -4
  307. package/test/util/multi_map_unit.js +0 -3
  308. package/test/util/object_utils_unit.js +0 -2
  309. package/test/util/periods_unit.js +93 -7
  310. package/test/util/pssh_unit.js +0 -5
  311. package/test/util/state_history_unit.js +0 -2
  312. package/test/util/stream_utils_unit.js +3 -8
  313. package/test/util/string_utils_unit.js +0 -6
  314. package/test/util/text_parser_unit.js +0 -2
  315. package/test/util/xml_utils_unit.js +0 -4
  316. package/ui/less/ad_controls.less +6 -6
  317. package/ui/less/buttons.less +6 -6
  318. package/ui/less/containers.less +9 -11
  319. package/ui/less/overflow_menu.less +4 -4
  320. package/ui/less/range_elements.less +7 -2
  321. package/ui/locales/sjn-translations.yaml +257 -0
  322. package/ui/locales/sjn.json +42 -0
  323. package/ui/seek_bar.js +2 -1
  324. package/.github/workflows/build_and_test.yaml +0 -73
  325. package/.github/workflows/release.yaml +0 -53
  326. package/docs/tutorials/gsoc-ideas-list.md +0 -3
  327. package/externs/svgelement.js +0 -18
@@ -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');
@@ -918,7 +917,7 @@ shaka.hls.HlsParser = class {
918
917
  // the content. This means that if the content changes profiles, it should
919
918
  // include both. Since all known browsers support changing profiles
920
919
  // without any other work, just ignore them. See also:
921
- // https://github.com/google/shaka-player/issues/1817
920
+ // https://github.com/shaka-project/shaka-player/issues/1817
922
921
  const shortCodec = shaka.util.MimeUtils.getCodecBase(codec);
923
922
  if (!seen.has(shortCodec)) {
924
923
  ret.push(codec);
@@ -1737,8 +1736,8 @@ shaka.hls.HlsParser = class {
1737
1736
  * @param {number} timestampOffset
1738
1737
  * @param {!Map.<string, string>} variables
1739
1738
  * @param {string} absoluteMediaPlaylistUri
1740
- * @return {!shaka.media.SegmentReference}
1741
1739
  * @param {string} type
1740
+ * @return {shaka.media.SegmentReference}
1742
1741
  * @private
1743
1742
  */
1744
1743
  createSegmentReference_(
@@ -1754,11 +1753,25 @@ shaka.hls.HlsParser = class {
1754
1753
  let startByte = 0;
1755
1754
  let endByte = null;
1756
1755
 
1756
+ if (!extinfTag) {
1757
+ if (hlsSegment.partialSegments.length == 0) {
1758
+ // EXTINF tag must be available if the segment has no partial segments.
1759
+ throw new shaka.util.Error(
1760
+ shaka.util.Error.Severity.CRITICAL,
1761
+ shaka.util.Error.Category.MANIFEST,
1762
+ shaka.util.Error.Code.HLS_REQUIRED_TAG_MISSING, 'EXTINF');
1763
+ } else if (!this.lowLatencyMode_) {
1764
+ // Without EXTINF and without low-latency mode, partial segments get
1765
+ // ignored.
1766
+ return null;
1767
+ }
1768
+ }
1769
+
1757
1770
  // Create SegmentReferences for the partial segments.
1758
1771
  const partialSegmentRefs = [];
1759
- if (this.lowLatencyMode_ && hlsSegment.partialSegments.length) {
1760
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
1761
- for (const {i, item} of enumerate(hlsSegment.partialSegments)) {
1772
+ if (this.lowLatencyMode_) {
1773
+ for (let i = 0; i < hlsSegment.partialSegments.length; i++) {
1774
+ const item = hlsSegment.partialSegments[i];
1762
1775
  const pPreviousReference = i == 0 ?
1763
1776
  previousReference : partialSegmentRefs[partialSegmentRefs.length - 1];
1764
1777
  const pStartTime = (i == 0) ? startTime : pPreviousReference.endTime;
@@ -1779,6 +1792,9 @@ shaka.hls.HlsParser = class {
1779
1792
  this.parseByteRange_(pPreviousReference, pByterange);
1780
1793
  }
1781
1794
  const pUri = item.getAttributeValue('URI');
1795
+ if (!pUri) {
1796
+ continue;
1797
+ }
1782
1798
  const pAbsoluteUri = shaka.hls.Utils.constructAbsoluteUri(
1783
1799
  absoluteMediaPlaylistUri, pUri);
1784
1800
 
@@ -1794,14 +1810,6 @@ shaka.hls.HlsParser = class {
1794
1810
  /* appendWindowEnd= */ Infinity);
1795
1811
  partialSegmentRefs.push(partial);
1796
1812
  } // for-loop of hlsSegment.partialSegments
1797
- } else {
1798
- // EXTINF tag must be available if the segment has no partial segments.
1799
- if (!extinfTag) {
1800
- throw new shaka.util.Error(
1801
- shaka.util.Error.Severity.CRITICAL,
1802
- shaka.util.Error.Category.MANIFEST,
1803
- shaka.util.Error.Code.HLS_REQUIRED_TAG_MISSING, 'EXTINF');
1804
- }
1805
1813
  }
1806
1814
 
1807
1815
  // If the segment has EXTINF tag, set the segment's end time, start byte
@@ -1820,6 +1828,7 @@ shaka.hls.HlsParser = class {
1820
1828
  } else {
1821
1829
  endTime = partialSegmentRefs[partialSegmentRefs.length - 1].endTime;
1822
1830
  }
1831
+
1823
1832
  // If the segment has EXT-X-BYTERANGE tag, set the start byte and end byte
1824
1833
  // base on the byterange information. If segment has no EXT-X-BYTERANGE tag
1825
1834
  // and has partial segments, set the start byte and end byte base on the
@@ -1983,9 +1992,9 @@ shaka.hls.HlsParser = class {
1983
1992
  // With delta updates, the DISCONTINUITY may be skipped. Check if
1984
1993
  // the discontintuity Sequence Number based on the media sequence
1985
1994
  // number.
1986
- while (discontinuityToMediaSequence.has(discontintuitySequenceNum + 1)
1987
- && discontinuityToMediaSequence.get(discontintuitySequenceNum + 1) <
1988
- position) {
1995
+ const disconMap = discontinuityToMediaSequence;
1996
+ while (disconMap.has(discontintuitySequenceNum + 1) &&
1997
+ disconMap.get(discontintuitySequenceNum + 1) < position) {
1989
1998
  discontintuitySequenceNum++;
1990
1999
  }
1991
2000
  }
@@ -1996,8 +2005,8 @@ shaka.hls.HlsParser = class {
1996
2005
  /** @type {!Array.<!shaka.media.SegmentReference>} */
1997
2006
  const references = [];
1998
2007
 
1999
- const enumerate = (it) => shaka.util.Iterables.enumerate(it);
2000
- for (const {i, item} of enumerate(hlsSegments)) {
2008
+ for (let i = 0; i < hlsSegments.length; i++) {
2009
+ const item = hlsSegments[i];
2001
2010
  const previousReference = references[references.length - 1];
2002
2011
  const startTime = (i == 0) ? firstStartTime :
2003
2012
  previousReference.endTime;
@@ -2045,7 +2054,9 @@ shaka.hls.HlsParser = class {
2045
2054
  playlist.absoluteUri,
2046
2055
  type);
2047
2056
 
2048
- references.push(reference);
2057
+ if (reference) {
2058
+ references.push(reference);
2059
+ }
2049
2060
  } else if (!this.lowLatencyMode_) {
2050
2061
  // If a segment has no extinfTag, it must contain partial segments.
2051
2062
  shaka.log.alwaysWarn('Low-latency HLS live stream detected, but ' +
@@ -2189,6 +2200,9 @@ shaka.hls.HlsParser = class {
2189
2200
  variables,
2190
2201
  /* absoluteMediaPlaylistUri= */ '',
2191
2202
  type);
2203
+ goog.asserts.assert(
2204
+ segmentRef != null, 'Segment reference should not be null!');
2205
+
2192
2206
  // If we are updating the manifest, we can usually skip fetching the segment
2193
2207
  // by examining the references we already have. This won't be possible if
2194
2208
  // there was some kind of lag or delay updating the manifest on the server,
@@ -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;
@@ -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
  }
@@ -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([
@@ -655,7 +655,7 @@ shaka.media.DrmEngine = class {
655
655
  // first MIME type even if the others are supported. To work around this,
656
656
  // we say that Edge supports everything.
657
657
  //
658
- // See https://github.com/google/shaka-player/issues/1495 for details.
658
+ // See https://github.com/shaka-project/shaka-player/issues/1495 for details.
659
659
  if (shaka.util.Platform.isLegacyEdge()) {
660
660
  return true;
661
661
  }
@@ -667,7 +667,8 @@ shaka.media.DrmEngine = class {
667
667
  // Some Tizen devices seem to misreport AC-3 support. This works around
668
668
  // the issue, by falling back to EC-3, which seems to be supported on the
669
669
  // same devices and be correctly reported in all cases we have observed.
670
- // See https://github.com/google/shaka-player/issues/2989 for details.
670
+ // See https://github.com/shaka-project/shaka-player/issues/2989 for
671
+ // details.
671
672
  const fallback = contentType.replace('ac-3', 'ec-3');
672
673
  return this.supportedTypes_.has(contentType) ||
673
674
  this.supportedTypes_.has(fallback);
@@ -63,6 +63,11 @@ shaka.media.MediaSourceEngine = class {
63
63
  string>} */
64
64
  this.sourceBufferTypes_ = {};
65
65
 
66
+
67
+ /** @private {!Object.<shaka.util.ManifestParserUtils.ContentType,
68
+ boolean>} */
69
+ this.expectedEncryption_ = {};
70
+
66
71
  /** @private {shaka.text.TextEngine} */
67
72
  this.textEngine_ = null;
68
73
 
@@ -345,6 +350,7 @@ shaka.media.MediaSourceEngine = class {
345
350
  this.sourceBuffers_[contentType] = sourceBuffer;
346
351
  this.sourceBufferTypes_[contentType] = mimeType;
347
352
  this.queues_[contentType] = [];
353
+ this.expectedEncryption_[contentType] = !!stream.drmInfos.length;
348
354
  }
349
355
  }
350
356
  }
@@ -830,7 +836,8 @@ shaka.media.MediaSourceEngine = class {
830
836
  * @private
831
837
  */
832
838
  setTimestampOffset_(contentType, timestampOffset) {
833
- // Work around for https://github.com/google/shaka-player/issues/1281:
839
+ // Work around for
840
+ // https://github.com/shaka-project/shaka-player/issues/1281:
834
841
  // TODO(https://bit.ly/2ttKiBU): follow up when this is fixed in Edge
835
842
  if (timestampOffset < 0) {
836
843
  // Try to prevent rounding errors in Edge from removing the first
@@ -1090,7 +1097,7 @@ shaka.media.MediaSourceEngine = class {
1090
1097
  */
1091
1098
  workAroundBrokenPlatforms_(segment, startTime, contentType) {
1092
1099
  const isInitSegment = startTime == null;
1093
- const encryptionExpected = this.video_.mediaKeys;
1100
+ const encryptionExpected = this.expectedEncryption_[contentType];
1094
1101
 
1095
1102
  // If:
1096
1103
  // 1. this is an init segment,
@@ -1100,7 +1107,7 @@ shaka.media.MediaSourceEngine = class {
1100
1107
  // then insert fake encryption metadata for init segments that lack it.
1101
1108
  // The MP4 requirement is because we can currently only do this
1102
1109
  // transformation on MP4 containers.
1103
- // See: https://github.com/google/shaka-player/issues/2759
1110
+ // See: https://github.com/shaka-project/shaka-player/issues/2759
1104
1111
  if (isInitSegment &&
1105
1112
  encryptionExpected &&
1106
1113
  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);
@@ -669,7 +669,7 @@ shaka.media.StreamingEngine = class {
669
669
 
670
670
  if (mediaState.waitingToClearBuffer) {
671
671
  // May not be performing an update, but an update will still happen.
672
- // See: https://github.com/google/shaka-player/issues/334
672
+ // See: https://github.com/shaka-project/shaka-player/issues/334
673
673
  shaka.log.debug(logPrefix, 'clear: already waiting');
674
674
  return;
675
675
  }
@@ -909,9 +909,9 @@ shaka.media.StreamingEngine = class {
909
909
  // buffering forever at the end.
910
910
  // We should only do this if the duration needs to shrink.
911
911
  // Growing it by less than 1ms can actually cause buffering on
912
- // replay, as in https://github.com/google/shaka-player/issues/979
912
+ // replay, as in https://github.com/shaka-project/shaka-player/issues/979
913
913
  // On some platforms, this can spuriously be 0, so ignore this case.
914
- // https://github.com/google/shaka-player/issues/1967,
914
+ // https://github.com/shaka-project/shaka-player/issues/1967,
915
915
  const duration = this.playerInterface_.mediaSourceEngine.getDuration();
916
916
  if (duration != 0 &&
917
917
  duration < this.manifest_.presentationTimeline.getDuration()) {
@@ -1702,7 +1702,7 @@ shaka.media.StreamingEngine = class {
1702
1702
  const bufferedBehind = presentationTime - startTime;
1703
1703
 
1704
1704
  const overflow = bufferedBehind - bufferBehind;
1705
- // See: https://github.com/google/shaka-player/issues/2982
1705
+ // See: https://github.com/shaka-project/shaka-player/issues/2982
1706
1706
  if (overflow <= 0.01) {
1707
1707
  shaka.log.v2(logPrefix,
1708
1708
  'buffer behind okay:',
@@ -2041,7 +2041,7 @@ shaka.media.StreamingEngine.MediaState_;
2041
2041
  * of the Period.
2042
2042
  *
2043
2043
  * NOTE: This was increased as part of the solution to
2044
- * https://github.com/google/shaka-player/issues/1281
2044
+ * https://github.com/shaka-project/shaka-player/issues/1281
2045
2045
  *
2046
2046
  * @const {number}
2047
2047
  * @private
@@ -2055,7 +2055,7 @@ shaka.media.StreamingEngine.APPEND_WINDOW_START_FUDGE_ = 0.1;
2055
2055
  * the Period. This rounding error could then create an artificial gap and a
2056
2056
  * stutter when the gap-jumping logic takes over.
2057
2057
  *
2058
- * https://github.com/google/shaka-player/issues/1597
2058
+ * https://github.com/shaka-project/shaka-player/issues/1597
2059
2059
  *
2060
2060
  * @const {number}
2061
2061
  * @private
@@ -6,8 +6,6 @@
6
6
 
7
7
  goog.provide('shaka.media.TimeRangesUtils');
8
8
 
9
- goog.require('shaka.util.Iterables');
10
-
11
9
 
12
10
  /**
13
11
  * @summary A set of utility functions for dealing with TimeRanges objects.
@@ -157,7 +155,7 @@ shaka.media.TimeRangesUtils = class {
157
155
  return [];
158
156
  }
159
157
  const ret = [];
160
- for (const i of shaka.util.Iterables.range(b.length)) {
158
+ for (let i = 0; i < b.length; i++) {
161
159
  ret.push({start: b.start(i), end: b.end(i)});
162
160
  }
163
161
  return ret;
@@ -141,7 +141,7 @@ shaka.media.VideoWrapper = class {
141
141
  // TODO: Need further investigation why it happens. Before and after
142
142
  // setting the current time, video.readyState is 1, video.paused is true,
143
143
  // and video.buffered's TimeRanges length is 0.
144
- // See: https://github.com/google/shaka-player/issues/1298
144
+ // See: https://github.com/shaka-project/shaka-player/issues/1298
145
145
  this.mover_.moveTo(
146
146
  this.video_.currentTime == 0 ?
147
147
  startTime :
@@ -421,7 +421,7 @@ shaka.net.NetworkingEngine = class extends shaka.util.FakeEventTarget {
421
421
  }
422
422
 
423
423
  // Schemes are meant to be case-insensitive.
424
- // See https://github.com/google/shaka-player/issues/2173
424
+ // See https://github.com/shaka-project/shaka-player/issues/2173
425
425
  // and https://tools.ietf.org/html/rfc3986#section-3.1
426
426
  scheme = scheme.toLowerCase();
427
427
 
@@ -368,8 +368,10 @@ shaka.offline.indexeddb.StorageMechanism.SESSION_ID_STORE = 'session-ids';
368
368
  shaka.offline.StorageMuxer.register(
369
369
  'idb',
370
370
  () => {
371
- // Offline storage is not supported on the Chromecast platform.
372
- if (shaka.util.Platform.isChromecast()) {
371
+ // Offline storage is not supported on the Chromecast or Xbox One
372
+ // platforms.
373
+ if (shaka.util.Platform.isChromecast() ||
374
+ shaka.util.Platform.isXboxOne()) {
373
375
  return null;
374
376
  }
375
377
  // Offline storage requires the IndexedDB API.
@@ -598,10 +598,10 @@ shaka.offline.Storage = class {
598
598
  storage, drmEngine, manifest, uri, metadata, config, downloader) {
599
599
  const pendingContent = shaka.offline.StoredContentUtils.fromManifest(
600
600
  uri, manifest, /* size= */ 0, metadata);
601
- // In https://github.com/google/shaka-player/issues/2652, we found that this
602
- // callback would be removed by the compiler if we reference the config in
603
- // the onProgress closure below. Reading it into a local variable first
604
- // seems to work around this apparent compiler bug.
601
+ // In https://github.com/shaka-project/shaka-player/issues/2652, we found
602
+ // that this callback would be removed by the compiler if we reference the
603
+ // config in the onProgress closure below. Reading it into a local
604
+ // variable first seems to work around this apparent compiler bug.
605
605
  const progressCallback = config.offline.progressCallback;
606
606
 
607
607
  const onProgress = (progress, size) => {