shaka-player 3.3.0 → 3.3.3

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 (344) 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 +130 -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 +29 -0
  8. package/.github/workflows/nightly-demo.yaml +42 -0
  9. package/.github/workflows/release-please.yaml +145 -0
  10. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  11. package/.github/workflows/selenium-lab-tests.yaml +93 -0
  12. package/AUTHORS +2 -0
  13. package/CHANGELOG.md +1722 -1640
  14. package/CONTRIBUTING.md +2 -2
  15. package/CONTRIBUTORS +2 -0
  16. package/README.md +7 -7
  17. package/app-engine/README.md +9 -0
  18. package/app-engine/demo-version-index/README.md +14 -0
  19. package/app-engine/demo-version-index/app.yaml +2 -0
  20. package/app-engine/demo-version-index/main.py +162 -0
  21. package/app-engine/demo-version-index/requirements.txt +6 -0
  22. package/app-engine/demo-version-index/templates/index.html +114 -0
  23. package/app-engine/shaka-player-demo/README.md +18 -0
  24. package/app-engine/shaka-player-demo/app.yaml +61 -0
  25. package/app-engine/shaka-player-demo/main.py +95 -0
  26. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  27. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  28. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  29. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  30. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  31. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  32. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  33. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  34. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  35. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  36. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  37. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  38. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  39. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  40. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  41. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  42. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  43. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  44. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  45. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  46. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  47. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  48. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  49. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  50. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  51. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  52. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  53. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  54. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  55. package/app-engine/shaka-player-demo/posters.py +110 -0
  56. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  57. package/app-engine/shaka-player-demo/time.txt +1 -0
  58. package/build/README.md +1 -1
  59. package/build/checkversion.py +1 -1
  60. package/build/conformance.textproto +196 -169
  61. package/build/docker/Dockerfile +20 -0
  62. package/build/docker/docker-compose.yml +10 -0
  63. package/build/gendeps.py +18 -15
  64. package/build/shaka-lab.yaml +163 -0
  65. package/build/shakaBuildHelpers.py +4 -29
  66. package/build/test.py +93 -28
  67. package/build/types/polyfill +1 -0
  68. package/build/wrapper.template.js +2 -2
  69. package/demo/TengwarTelcontar.woff2 +0 -0
  70. package/demo/asset_card.js +1 -2
  71. package/demo/cast_receiver/index.html +1 -1
  72. package/demo/cast_receiver/receiver_app.css +14 -14
  73. package/demo/common/assets.js +2 -0
  74. package/demo/config.js +0 -1
  75. package/demo/custom.js +0 -1
  76. package/demo/customWarning.txt +2 -2
  77. package/demo/demo.less +29 -18
  78. package/demo/demo_uncompiled.js +1 -13
  79. package/demo/index.html +1 -1
  80. package/demo/main.js +3 -3
  81. package/dist/controls.css +3 -3
  82. package/dist/controls.css.map +1 -1
  83. package/dist/demo.compiled.debug.js +191 -194
  84. package/dist/demo.compiled.debug.map +4 -4
  85. package/dist/demo.compiled.js +191 -194
  86. package/dist/demo.compiled.map +4 -4
  87. package/dist/demo.css +1 -1
  88. package/dist/demo.css.map +1 -1
  89. package/dist/deps.js +233 -226
  90. package/dist/locales.js +30 -30
  91. package/dist/receiver.compiled.debug.js +43 -45
  92. package/dist/receiver.compiled.debug.map +4 -4
  93. package/dist/receiver.compiled.js +43 -45
  94. package/dist/receiver.compiled.map +4 -4
  95. package/dist/shaka-player.compiled.d.ts +272 -238
  96. package/dist/shaka-player.compiled.debug.d.ts +272 -238
  97. package/dist/shaka-player.compiled.debug.externs.js +53 -16
  98. package/dist/shaka-player.compiled.debug.js +393 -394
  99. package/dist/shaka-player.compiled.debug.map +4 -4
  100. package/dist/shaka-player.compiled.externs.js +53 -16
  101. package/dist/shaka-player.compiled.js +840 -843
  102. package/dist/shaka-player.compiled.map +4 -4
  103. package/dist/shaka-player.ui.d.ts +318 -293
  104. package/dist/shaka-player.ui.debug.d.ts +318 -293
  105. package/dist/shaka-player.ui.debug.externs.js +55 -27
  106. package/dist/shaka-player.ui.debug.js +415 -417
  107. package/dist/shaka-player.ui.debug.map +4 -4
  108. package/dist/shaka-player.ui.externs.js +55 -27
  109. package/dist/shaka-player.ui.js +997 -1000
  110. package/dist/shaka-player.ui.map +4 -4
  111. package/docs/design/REDESIGN.md +33 -33
  112. package/docs/design/bg-fetch.md +2 -2
  113. package/docs/design/codec_preferences.md +1 -1
  114. package/docs/design/dash-audio-channels.md +3 -3
  115. package/docs/design/dash-manifests.md +1 -1
  116. package/docs/design/gap-jumping.md +3 -3
  117. package/docs/design/preload.md +2 -2
  118. package/docs/tutorials/faq.md +8 -8
  119. package/docs/tutorials/index.json +1 -0
  120. package/docs/tutorials/plugins.md +3 -3
  121. package/docs/tutorials/selenium-grid-config.md +122 -0
  122. package/docs/tutorials/welcome.md +10 -2
  123. package/externs/cmcd.js +186 -0
  124. package/externs/shaka/player.js +8 -0
  125. package/externs/shaka/text.js +10 -0
  126. package/karma.conf.js +156 -45
  127. package/lib/abr/simple_abr_manager.js +12 -6
  128. package/lib/ads/ad_manager.js +1 -0
  129. package/lib/cast/cast_proxy.js +6 -4
  130. package/lib/cast/cast_receiver.js +3 -0
  131. package/lib/cea/cea608_data_channel.js +2 -2
  132. package/lib/cea/cea708_service.js +5 -4
  133. package/lib/cea/mp4_cea_parser.js +11 -5
  134. package/lib/cea/sei_processor.js +6 -3
  135. package/lib/dash/dash_parser.js +40 -30
  136. package/lib/dash/mpd_utils.js +4 -5
  137. package/lib/dash/segment_list.js +1 -2
  138. package/lib/dash/segment_template.js +3 -3
  139. package/lib/hls/hls_parser.js +41 -9
  140. package/lib/hls/manifest_text_parser.js +4 -3
  141. package/lib/media/adaptation_set.js +1 -2
  142. package/lib/media/content_workarounds.js +2 -2
  143. package/lib/media/drm_engine.js +3 -2
  144. package/lib/media/media_source_engine.js +3 -2
  145. package/lib/media/mp4_segment_index_parser.js +1 -4
  146. package/lib/media/playhead.js +2 -2
  147. package/lib/media/presentation_timeline.js +18 -8
  148. package/lib/media/quality_observer.js +17 -34
  149. package/lib/media/region_observer.js +39 -33
  150. package/lib/media/region_timeline.js +17 -19
  151. package/lib/media/segment_index.js +2 -1
  152. package/lib/media/segment_reference.js +19 -1
  153. package/lib/media/streaming_engine.js +12 -9
  154. package/lib/media/time_ranges_utils.js +1 -3
  155. package/lib/media/video_wrapper.js +1 -1
  156. package/lib/net/networking_engine.js +5 -1
  157. package/lib/offline/storage.js +12 -13
  158. package/lib/player.js +87 -41
  159. package/lib/polyfill/all.js +2 -3
  160. package/lib/polyfill/encryption_scheme.js +1 -1
  161. package/lib/polyfill/media_capabilities.js +32 -17
  162. package/lib/polyfill/mediasource.js +1 -1
  163. package/lib/polyfill/symbol.js +46 -0
  164. package/lib/text/cue.js +7 -1
  165. package/lib/text/simple_text_displayer.js +2 -1
  166. package/lib/text/ttml_text_parser.js +92 -63
  167. package/lib/text/ui_text_displayer.js +18 -12
  168. package/lib/util/buffer_utils.js +1 -3
  169. package/lib/util/cmcd_manager.js +47 -201
  170. package/lib/util/ebml_parser.js +3 -3
  171. package/lib/util/error.js +1 -1
  172. package/lib/util/fake_event_target.js +21 -1
  173. package/lib/util/iterables.js +0 -46
  174. package/lib/util/mp4_box_parsers.js +1 -4
  175. package/lib/util/mp4_parser.js +5 -7
  176. package/lib/util/periods.js +10 -11
  177. package/lib/util/platform.js +3 -3
  178. package/lib/util/pssh.js +1 -4
  179. package/lib/util/stream_utils.js +88 -11
  180. package/lib/util/string_utils.js +3 -5
  181. package/lib/util/uint8array_utils.js +3 -5
  182. package/lib/util/xml_utils.js +34 -7
  183. package/package.json +62 -40
  184. package/roadmap.md +17 -17
  185. package/shaka-player.uncompiled.js +1 -0
  186. package/test/abr/simple_abr_manager_unit.js +3 -8
  187. package/test/ads/ad_manager_unit.js +0 -6
  188. package/test/cast/cast_proxy_unit.js +0 -8
  189. package/test/cast/cast_receiver_integration.js +1 -18
  190. package/test/cast/cast_receiver_unit.js +1 -9
  191. package/test/cast/cast_sender_unit.js +0 -6
  192. package/test/cast/cast_utils_unit.js +0 -13
  193. package/test/cea/cea608_memory_unit.js +0 -5
  194. package/test/cea/cea708_service_unit.js +0 -7
  195. package/test/cea/cea708_window_unit.js +0 -5
  196. package/test/cea/cea_decoder_unit.js +0 -6
  197. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  198. package/test/cea/dtvcc_packet_unit.js +0 -5
  199. package/test/cea/mp4_cea_parser_unit.js +0 -4
  200. package/test/dash/dash_parser_content_protection_unit.js +1 -10
  201. package/test/dash/dash_parser_live_unit.js +45 -15
  202. package/test/dash/dash_parser_manifest_unit.js +4 -17
  203. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  204. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  205. package/test/dash/dash_parser_segment_template_unit.js +0 -9
  206. package/test/dash/mpd_utils_unit.js +3 -11
  207. package/test/demo/demo_unit.js +0 -5
  208. package/test/deprecate/enforcer_unit.js +0 -4
  209. package/test/deprecate/version_unit.js +0 -2
  210. package/test/hls/hls_live_unit.js +2 -14
  211. package/test/hls/hls_parser_unit.js +76 -15
  212. package/test/hls/manifest_text_parser_unit.js +0 -10
  213. package/test/media/adaptation_set_criteria_unit.js +3 -7
  214. package/test/media/adaptation_set_unit.js +0 -2
  215. package/test/media/buffering_observer_unit.js +1 -4
  216. package/test/media/closed_caption_parser_unit.js +0 -3
  217. package/test/media/drm_engine_integration.js +2 -15
  218. package/test/media/drm_engine_unit.js +7 -27
  219. package/test/media/manifest_parser_unit.js +0 -4
  220. package/test/media/media_source_engine_integration.js +0 -7
  221. package/test/media/media_source_engine_unit.js +1 -14
  222. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  223. package/test/media/play_rate_controller_unit.js +0 -4
  224. package/test/media/playhead_unit.js +8 -16
  225. package/test/media/presentation_timeline_unit.js +4 -7
  226. package/test/media/quality_observer_unit.js +4 -5
  227. package/test/media/region_observer_unit.js +40 -10
  228. package/test/media/region_timeline_unit.js +40 -25
  229. package/test/media/segment_index_unit.js +0 -6
  230. package/test/media/segment_reference_unit.js +0 -3
  231. package/test/media/stall_detector_unit.js +0 -5
  232. package/test/media/streaming_engine_integration.js +11 -37
  233. package/test/media/streaming_engine_unit.js +155 -34
  234. package/test/media/time_ranges_utils_unit.js +0 -2
  235. package/test/media/transmuxer_integration.js +0 -6
  236. package/test/media/webm_segment_index_parser_unit.js +0 -4
  237. package/test/net/data_uri_plugin_unit.js +0 -7
  238. package/test/net/http_plugin_unit.js +0 -9
  239. package/test/net/networking_engine_unit.js +0 -11
  240. package/test/offline/download_progress_estimator_unit.js +0 -2
  241. package/test/offline/indexeddb_storage_unit.js +0 -6
  242. package/test/offline/manifest_convert_unit.js +0 -8
  243. package/test/offline/offline_integration.js +1 -10
  244. package/test/offline/offline_manifest_parser_unit.js +0 -6
  245. package/test/offline/offline_scheme_unit.js +0 -8
  246. package/test/offline/offline_uri_unit.js +0 -2
  247. package/test/offline/storage_compatibility_unit.js +1 -14
  248. package/test/offline/storage_integration.js +1 -27
  249. package/test/player_external.js +2 -10
  250. package/test/player_integration.js +63 -36
  251. package/test/player_load_graph_integration.js +1 -6
  252. package/test/player_src_equals_external.js +3 -9
  253. package/test/player_src_equals_integration.js +41 -15
  254. package/test/player_unit.js +71 -46
  255. package/test/routing/walker_unit.js +0 -8
  256. package/test/test/assets/chapters.vtt +2 -2
  257. package/test/test/assets/chapters2.vtt +10 -0
  258. package/test/test/assets/large_file.mpd +1 -1
  259. package/test/test/boot.js +75 -22
  260. package/test/test/externs/jasmine.js +2 -2
  261. package/test/test/externs/karma.js +4 -0
  262. package/test/test/namespace.js +10 -0
  263. package/test/test/util/canned_idb.js +0 -8
  264. package/test/test/util/cea_utils.js +0 -6
  265. package/test/test/util/dash_parser_util.js +0 -13
  266. package/test/test/util/fake_ad.js +0 -3
  267. package/test/test/util/fake_ad_manager.js +0 -9
  268. package/test/test/util/fake_demo_main.js +0 -5
  269. package/test/test/util/fake_drm_engine.js +0 -6
  270. package/test/test/util/fake_media_source_engine.js +0 -7
  271. package/test/test/util/fake_networking_engine.js +0 -5
  272. package/test/test/util/fake_text_displayer.js +0 -5
  273. package/test/test/util/indexeddb_utils.js +1 -10
  274. package/test/test/util/jasmine_fetch.js +0 -1
  275. package/test/test/util/loader.js +0 -18
  276. package/test/test/util/manifest_generator.js +9 -14
  277. package/test/test/util/manifest_parser_util.js +0 -6
  278. package/test/test/util/offline_utils.js +0 -5
  279. package/test/test/util/simple_fakes.js +9 -26
  280. package/test/test/util/stream_generator.js +0 -14
  281. package/test/test/util/streaming_engine_util.js +0 -15
  282. package/test/test/util/test_scheme.js +1 -19
  283. package/test/test/util/ttml_utils.js +79 -0
  284. package/test/test/util/ui_utils.js +0 -9
  285. package/test/test/util/util.js +15 -26
  286. package/test/test/util/waiter.js +84 -43
  287. package/test/text/cue_integration.js +0 -4
  288. package/test/text/lrc_text_parser_unit.js +0 -4
  289. package/test/text/mp4_ttml_parser_unit.js +10 -23
  290. package/test/text/mp4_vtt_parser_unit.js +1 -7
  291. package/test/text/sbv_text_parser_unit.js +0 -4
  292. package/test/text/simple_text_displayer_unit.js +1 -8
  293. package/test/text/srt_text_parser_unit.js +0 -4
  294. package/test/text/ssa_text_parser_unit.js +0 -5
  295. package/test/text/text_engine_unit.js +2 -7
  296. package/test/text/text_track_integration.js +0 -2
  297. package/test/text/ttml_text_parser_unit.js +499 -239
  298. package/test/text/ui_text_displayer_unit.js +44 -41
  299. package/test/text/vtt_text_parser_unit.js +0 -9
  300. package/test/text/web_vtt_generator_unit.js +0 -3
  301. package/test/ui/ad_ui_unit.js +0 -11
  302. package/test/ui/localization_unit.js +0 -3
  303. package/test/ui/text_displayer_layout_unit.js +9 -19
  304. package/test/ui/ui_customization_unit.js +0 -6
  305. package/test/ui/ui_integration.js +0 -16
  306. package/test/ui/ui_unit.js +1 -17
  307. package/test/util/abortable_operation_unit.js +4 -9
  308. package/test/util/array_utils_unit.js +0 -2
  309. package/test/util/buffer_utils_unit.js +0 -2
  310. package/test/util/cmcd_manager_unit.js +29 -18
  311. package/test/util/data_view_reader_unit.js +0 -4
  312. package/test/util/ebml_parser_unit.js +0 -4
  313. package/test/util/event_manager_unit.js +0 -3
  314. package/test/util/fake_event_target_unit.js +0 -5
  315. package/test/util/functional_unit.js +1 -1
  316. package/test/util/iterables_unit.js +0 -64
  317. package/test/util/language_utils_unit.js +0 -3
  318. package/test/util/manifest_parser_utils_unit.js +0 -2
  319. package/test/util/mp4_box_parsers_unit.js +0 -5
  320. package/test/util/mp4_parser_unit.js +0 -4
  321. package/test/util/multi_map_unit.js +0 -3
  322. package/test/util/object_utils_unit.js +0 -2
  323. package/test/util/periods_unit.js +14 -7
  324. package/test/util/pssh_unit.js +0 -5
  325. package/test/util/state_history_unit.js +0 -2
  326. package/test/util/stream_utils_unit.js +39 -38
  327. package/test/util/string_utils_unit.js +0 -6
  328. package/test/util/text_parser_unit.js +0 -2
  329. package/test/util/xml_utils_unit.js +0 -4
  330. package/third_party/closure-uri/uri.js +21 -0
  331. package/ui/controls.js +3 -0
  332. package/ui/less/ad_controls.less +4 -4
  333. package/ui/less/buttons.less +5 -5
  334. package/ui/less/containers.less +9 -11
  335. package/ui/less/overflow_menu.less +4 -4
  336. package/ui/less/range_elements.less +5 -0
  337. package/ui/less/tooltip.less +1 -1
  338. package/ui/locales/sjn-translations.yaml +257 -0
  339. package/ui/locales/sjn.json +42 -0
  340. package/ui/localization.js +12 -36
  341. package/ui/text_selection.js +1 -0
  342. package/externs/media_capabilities.js +0 -16
  343. package/externs/svgelement.js +0 -18
  344. package/externs/webcrypto.js +0 -18
@@ -6,6 +6,7 @@
6
6
 
7
7
  goog.provide('shaka.util.CmcdManager');
8
8
 
9
+ goog.require('goog.Uri');
9
10
  goog.require('shaka.log');
10
11
 
11
12
 
@@ -31,7 +32,7 @@ shaka.util.CmcdManager = class {
31
32
  *
32
33
  * @private {string}
33
34
  */
34
- this.sid_ = config.sessionId || window.crypto.randomUUID();
35
+ this.sid_ = '';
35
36
 
36
37
  /**
37
38
  * Streaming format
@@ -118,10 +119,11 @@ shaka.util.CmcdManager = class {
118
119
 
119
120
  data.ot = this.getObjectType_(segmentInfo);
120
121
 
121
- const isMedia = data.ot === shaka.util.CmcdManager.ObjectType.VIDEO ||
122
- data.ot === shaka.util.CmcdManager.ObjectType.AUDIO ||
123
- data.ot === shaka.util.CmcdManager.ObjectType.MUXED ||
124
- data.ot === shaka.util.CmcdManager.ObjectType.TIMED_TEXT;
122
+ const ObjectType = shaka.util.CmcdManager.ObjectType;
123
+ const isMedia = data.ot === ObjectType.VIDEO ||
124
+ data.ot === ObjectType.AUDIO ||
125
+ data.ot === ObjectType.MUXED ||
126
+ data.ot === ObjectType.TIMED_TEXT;
125
127
 
126
128
  if (isMedia) {
127
129
  data.bl = this.getBufferLength_(segmentInfo.type);
@@ -131,7 +133,9 @@ shaka.util.CmcdManager = class {
131
133
  data.br = segmentInfo.bandwidth / 1000;
132
134
  }
133
135
 
134
- data.tb = this.getTopBandwidth_(segmentInfo.type) / 1000;
136
+ if (isMedia && data.ot !== ObjectType.TIMED_TEXT) {
137
+ data.tb = this.getTopBandwidth_(data.ot) / 1000;
138
+ }
135
139
 
136
140
  this.apply_(request, data);
137
141
  } catch (error) {
@@ -147,6 +151,10 @@ shaka.util.CmcdManager = class {
147
151
  */
148
152
  applyTextData(request) {
149
153
  try {
154
+ if (!this.config_.enabled) {
155
+ return;
156
+ }
157
+
150
158
  this.apply_(request, {
151
159
  ot: shaka.util.CmcdManager.ObjectType.CAPTION,
152
160
  su: true,
@@ -213,10 +221,13 @@ shaka.util.CmcdManager = class {
213
221
  /**
214
222
  * Create baseline CMCD data
215
223
  *
216
- * @return {shaka.util.CmcdManager.Data}
224
+ * @return {CmcdData}
217
225
  * @private
218
226
  */
219
227
  createData_() {
228
+ if (!this.sid_) {
229
+ this.sid_ = this.config_.sessionId || window.crypto.randomUUID();
230
+ }
220
231
  return {
221
232
  v: shaka.util.CmcdManager.Version,
222
233
  sf: this.sf_,
@@ -230,7 +241,7 @@ shaka.util.CmcdManager = class {
230
241
  * Apply CMCD data to a request.
231
242
  *
232
243
  * @param {!shaka.extern.Request} request The request to apply CMCD data to
233
- * @param {!shaka.util.CmcdManager.Data} data The data object
244
+ * @param {!CmcdData} data The data object
234
245
  * @param {boolean} useHeaders Send data via request headers
235
246
  * @private
236
247
  */
@@ -380,23 +391,31 @@ shaka.util.CmcdManager = class {
380
391
  * @private
381
392
  */
382
393
  getTopBandwidth_(type) {
383
- const manifest = this.playerInterface_.getManifest();
384
- if (!manifest) {
394
+ const variants = this.playerInterface_.getVariantTracks();
395
+ if (!variants.length) {
385
396
  return NaN;
386
397
  }
387
398
 
388
- const variants = (type === 'text') ?
389
- manifest.textStreams : manifest.variants;
390
- let top = variants[0][type] || variants[0];
399
+ let top = variants[0];
391
400
 
392
401
  for (const variant of variants) {
393
- const stream = variant[type] || variant;
394
- if (stream.bandwidth > top.bandwidth) {
395
- top = stream;
402
+ if (variant.type === 'variant' && variant.bandwidth > top.bandwidth) {
403
+ top = variant;
396
404
  }
397
405
  }
398
406
 
399
- return top.bandwidth;
407
+ const ObjectType = shaka.util.CmcdManager.ObjectType;
408
+
409
+ switch (type) {
410
+ case ObjectType.VIDEO:
411
+ return top.videoBandwidth || NaN;
412
+
413
+ case ObjectType.AUDIO:
414
+ return top.audioBandwidth || NaN;
415
+
416
+ default:
417
+ return top.bandwidth;
418
+ }
400
419
  }
401
420
 
402
421
  /**
@@ -404,7 +423,7 @@ shaka.util.CmcdManager = class {
404
423
  * section 3.2 of
405
424
  * [CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf).
406
425
  *
407
- * @param {shaka.util.CmcdManager.Data} data The CMCD data object
426
+ * @param {CmcdData} data The CMCD data object
408
427
  * @return {string}
409
428
  */
410
429
  static serialize(data) {
@@ -456,7 +475,7 @@ shaka.util.CmcdManager = class {
456
475
  let result;
457
476
 
458
477
  if (type === 'string' && key !== 'ot' && key !== 'sf' && key !== 'st') {
459
- result = `${key}="${value.replace(/"/g, '"')}"`;
478
+ result = `${key}=${JSON.stringify(value)}`;
460
479
  } else if (type === 'boolean') {
461
480
  result = key;
462
481
  } else if (type === 'symbol') {
@@ -476,7 +495,7 @@ shaka.util.CmcdManager = class {
476
495
  * defined in the section 2.1 and 3.2 of
477
496
  * [CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf).
478
497
  *
479
- * @param {shaka.util.CmcdManager.Data} data The CMCD data object
498
+ * @param {CmcdData} data The CMCD data object
480
499
  * @return {!Object}
481
500
  */
482
501
  static toHeaders(data) {
@@ -512,11 +531,11 @@ shaka.util.CmcdManager = class {
512
531
  * defined in the section 2.2 and 3.2 of
513
532
  * [CTA-5004](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf).
514
533
  *
515
- * @param {shaka.util.CmcdManager.Data} data The CMCD data object
534
+ * @param {CmcdData} data The CMCD data object
516
535
  * @return {string}
517
536
  */
518
537
  static toQuery(data) {
519
- return `CMCD=${encodeURIComponent(shaka.util.CmcdManager.serialize(data))}`;
538
+ return shaka.util.CmcdManager.serialize(data);
520
539
  }
521
540
 
522
541
  /**
@@ -535,8 +554,9 @@ shaka.util.CmcdManager = class {
535
554
  return uri;
536
555
  }
537
556
 
538
- const separator = uri.includes('?') ? '&' : '?';
539
- return `${uri}${separator}${query}`;
557
+ const url = new goog.Uri(uri);
558
+ url.getQueryData().set('CMCD', query);
559
+ return url.toString();
540
560
  }
541
561
  };
542
562
 
@@ -546,7 +566,7 @@ shaka.util.CmcdManager = class {
546
566
  * getBandwidthEstimate: function():number,
547
567
  * getBufferedInfo: function():shaka.extern.BufferedInfo,
548
568
  * getCurrentTime: function():number,
549
- * getManifest: function():shaka.extern.Manifest,
569
+ * getVariantTracks: function():Array.<shaka.extern.Track>,
550
570
  * getPlaybackRate: function():number,
551
571
  * isLive: function():boolean
552
572
  * }}
@@ -557,8 +577,8 @@ shaka.util.CmcdManager = class {
557
577
  * Get information about what the player has buffered.
558
578
  * @property {function():number} getCurrentTime
559
579
  * Get the current time
560
- * @property {function():shaka.extern.Manifest} getManifest
561
- * Get the manifest
580
+ * @property {function():Array.<shaka.extern.Track>} getVariantTracks
581
+ * Get the variant tracks
562
582
  * @property {function():number} getPlaybackRate
563
583
  * Get the playback rate
564
584
  * @property {function():boolean} isLive
@@ -608,180 +628,6 @@ shaka.util.CmcdManager.SegmentInfo;
608
628
  shaka.util.CmcdManager.ManifestInfo;
609
629
 
610
630
 
611
- /**
612
- * @typedef {{
613
- * br: (number|undefined),
614
- * d: (number|undefined),
615
- * ot: (shaka.util.CmcdManager.ObjectType|undefined),
616
- * tb: (number|undefined),
617
- * bl: (number|undefined),
618
- * dl: (number|undefined),
619
- * mtp: (number|undefined),
620
- * nor: (string|undefined),
621
- * nrr: (string|undefined),
622
- * su: (boolean|undefined),
623
- * cid: (string|undefined),
624
- * pr: (number|undefined),
625
- * sf: (shaka.util.CmcdManager.StreamingFormat|undefined),
626
- * sid: (string|undefined),
627
- * st: (shaka.util.CmcdManager.StreamType|undefined),
628
- * v: (number|undefined),
629
- * bs: (boolean|undefined),
630
- * rtp: (number|undefined)
631
- * }}
632
- *
633
- * @description
634
- * Client Media Common Data (CMCD) data.
635
- *
636
- * @property {number} br
637
- * The encoded bitrate of the audio or video object being requested. This may
638
- * not be known precisely by the player; however, it MAY be estimated based
639
- * upon playlist/manifest declarations. If the playlist declares both peak and
640
- * average bitrate values, the peak value should be transmitted.
641
- *
642
- * @property {number} d
643
- * The playback duration in milliseconds of the object being requested. If a
644
- * partial segment is being requested, then this value MUST indicate the
645
- * playback duration of that part and not that of its parent segment. This
646
- * value can be an approximation of the estimated duration if the explicit
647
- * value is not known.
648
- *
649
- * @property {shaka.util.CmcdManager.ObjectType} ot
650
- * The media type of the current object being requested:
651
- * - `m` = text file, such as a manifest or playlist
652
- * - `a` = audio only
653
- * - `v` = video only
654
- * - `av` = muxed audio and video
655
- * - `i` = init segment
656
- * - `c` = caption or subtitle
657
- * - `tt` = ISOBMFF timed text track
658
- * - `k` = cryptographic key, license or certificate.
659
- * - `o` = other
660
- *
661
- * If the object type being requested is unknown, then this key MUST NOT be
662
- * used.
663
- *
664
- * @property {number} tb
665
- * The highest bitrate rendition in the manifest or playlist that the client
666
- * is allowed to play, given current codec, licensing and sizing constraints.
667
- *
668
- * @property {number} bl
669
- * The buffer length associated with the media object being requested. This
670
- * value MUST be rounded to the nearest 100 ms. This key SHOULD only be sent
671
- * with an object type of ‘a’, ‘v’ or ‘av’.
672
- *
673
- * @property {number} dl
674
- * Deadline from the request time until the first sample of this
675
- * Segment/Object needs to be available in order to not create a buffer
676
- * underrun or any other playback problems. This value MUST be rounded to the
677
- * nearest 100ms. For a playback rate of 1, this may be equivalent to the
678
- * player’s remaining buffer length.
679
- *
680
- * @property {number} mtp
681
- * The throughput between client and server, as measured by the client and
682
- * MUST be rounded to the nearest 100 kbps. This value, however derived,
683
- * SHOULD be the value that the client is using to make its next Adaptive
684
- * Bitrate switching decision. If the client is connected to multiple
685
- * servers concurrently, it must take care to report only the throughput
686
- * measured against the receiving server. If the client has multiple
687
- * concurrent connections to the server, then the intent is that this value
688
- * communicates the aggregate throughput the client sees across all those
689
- * connections.
690
- *
691
- * @property {string} nor
692
- * Relative path of the next object to be requested. This can be used to
693
- * trigger pre-fetching by the CDN. This MUST be a path relative to the
694
- * current request. This string MUST be URLEncoded. The client SHOULD NOT
695
- * depend upon any pre-fetch action being taken - it is merely a request for
696
- * such a pre-fetch to take place.
697
- *
698
- * @property {string} nrr
699
- * If the next request will be a partial object request, then this string
700
- * denotes the byte range to be requested. If the ‘nor’ field is not set, then
701
- * the object is assumed to match the object currently being requested. The
702
- * client SHOULD NOT depend upon any pre-fetch action being taken – it is
703
- * merely a request for such a pre-fetch to take place. Formatting is similar
704
- * to the HTTP Range header, except that the unit MUST be ‘byte’, the ‘Range:’
705
- * prefix is NOT required and specifying multiple ranges is NOT allowed. Valid
706
- * combinations are:
707
- *
708
- * - `"\<range-start\>-"`
709
- * - `"\<range-start\>-\<range-end\>"`
710
- * - `"-\<suffix-length\>"`
711
- *
712
- * @property {boolean} su
713
- * Key is included without a value if the object is needed urgently due to
714
- * startup, seeking or recovery after a buffer-empty event. The media SHOULD
715
- * not be rendering when this request is made. This key MUST not be sent if it
716
- * is FALSE.
717
- *
718
- * @property {string} cid
719
- * A unique string identifying the current content. Maximum length is 64
720
- * characters. This value is consistent across multiple different sessions and
721
- * devices and is defined and updated at the discretion of the service
722
- * provider.
723
- *
724
- * @property {number} pr
725
- * The playback rate. `1` if real-time, `2` if double speed, `0` if not
726
- * playing. SHOULD only be sent if not equal to `1`.
727
- *
728
- * @property {shaka.util.CmcdManager.StreamingFormat} sf
729
- * The streaming format that defines the current request.
730
- *
731
- * - `d` = MPEG DASH
732
- * - `h` = HTTP Live Streaming (HLS)
733
- * - `s` = Smooth Streaming
734
- * - `o` = other
735
- *
736
- * If the streaming format being requested is unknown, then this key MUST NOT
737
- * be used.
738
- *
739
- * @property {string} sid
740
- * A GUID identifying the current playback session. A playback session
741
- * typically ties together segments belonging to a single media asset. Maximum
742
- * length is 64 characters. It is RECOMMENDED to conform to the UUID
743
- * specification.
744
- *
745
- * @property {shaka.util.CmcdManager.StreamType} st
746
- * Stream type
747
- * - `v` = all segments are available – e.g., VOD
748
- * - `l` = segments become available over time – e.g., LIVE
749
- *
750
- * @property {number} v
751
- * The version of this specification used for interpreting the defined key
752
- * names and values. If this key is omitted, the client and server MUST
753
- * interpret the values as being defined by version 1. Client SHOULD omit this
754
- * field if the version is 1.
755
- *
756
- * @property {boolean} bs
757
- * Buffer starvation key is included without a value if the buffer was starved
758
- * at some point between the prior request and this object request, resulting
759
- * in the player being in a rebuffering state and the video or audio playback
760
- * being stalled. This key MUST NOT be sent if the buffer was not starved
761
- * since the prior request.
762
- *
763
- * If the object type `ot` key is sent along with this key, then the `bs` key
764
- * refers to the buffer associated with the particular object type. If no
765
- * object type is communicated, then the buffer state applies to the current
766
- * session.
767
- *
768
- * @property {number} rtp
769
- * Requested maximum throughput
770
- *
771
- * The requested maximum throughput that the client considers sufficient for
772
- * delivery of the asset. Values MUST be rounded to the nearest 100kbps. For
773
- * example, a client would indicate that the current segment, encoded at
774
- * 2Mbps, is to be delivered at no more than 10Mbps, by using rtp=10000.
775
- *
776
- * Note: This can benefit clients by preventing buffer saturation through
777
- * over-delivery and can also deliver a community benefit through fair-share
778
- * delivery. The concept is that each client receives the throughput necessary
779
- * for great performance, but no more. The CDN may not support the rtp
780
- * feature.
781
- */
782
- shaka.util.CmcdManager.Data;
783
-
784
-
785
631
  /**
786
632
  * @enum {string}
787
633
  */
@@ -11,7 +11,6 @@ goog.require('goog.asserts');
11
11
  goog.require('shaka.util.BufferUtils');
12
12
  goog.require('shaka.util.DataViewReader');
13
13
  goog.require('shaka.util.Error');
14
- goog.require('shaka.util.Iterables');
15
14
 
16
15
 
17
16
  /**
@@ -157,7 +156,8 @@ shaka.util.EbmlParser = class {
157
156
  }
158
157
 
159
158
  let value = 0;
160
- for (const {item, i} of shaka.util.Iterables.enumerate(vint)) {
159
+ for (let i = 0; i < vint.length; i++) {
160
+ const item = vint[i];
161
161
  if (i == 0) {
162
162
  // Mask out the first few bits of |vint|'s first byte to get the most
163
163
  // significant bits of |vint|'s value. If |vint| is 8 bytes wide then
@@ -267,7 +267,7 @@ shaka.util.EbmlElement = class {
267
267
 
268
268
  let value = 0;
269
269
 
270
- for (const i of shaka.util.Iterables.range(this.dataView_.byteLength)) {
270
+ for (let i = 0; i < this.dataView_.byteLength; i++) {
271
271
  const chunk = this.dataView_.getUint8(i);
272
272
  value = (256 * value) + chunk;
273
273
  }
package/lib/util/error.js CHANGED
@@ -467,7 +467,7 @@ shaka.util.Error.Code = {
467
467
  * Content transformations required by the platform could not be performed for
468
468
  * some reason (unsupported container, etc.)
469
469
  *
470
- * @see https://github.com/google/shaka-player/issues/2759
470
+ * @see https://github.com/shaka-project/shaka-player/issues/2759
471
471
  */
472
472
  'CONTENT_TRANSFORMATION_FAILED': 3019,
473
473
 
@@ -9,6 +9,7 @@ goog.provide('shaka.util.FakeEventTarget');
9
9
  goog.require('goog.asserts');
10
10
  goog.require('shaka.log');
11
11
  goog.require('shaka.util.FakeEvent');
12
+ goog.require('shaka.util.IReleasable');
12
13
  goog.require('shaka.util.MultiMap');
13
14
 
14
15
 
@@ -18,13 +19,14 @@ goog.require('shaka.util.MultiMap');
18
19
  * to non-DOM classes. Only FakeEvents should be dispatched.
19
20
  *
20
21
  * @implements {EventTarget}
22
+ * @implements {shaka.util.IReleasable}
21
23
  * @exportInterface
22
24
  */
23
25
  shaka.util.FakeEventTarget = class {
24
26
  /** */
25
27
  constructor() {
26
28
  /**
27
- * @private {!shaka.util.MultiMap.<shaka.util.FakeEventTarget.ListenerType>}
29
+ * @private {shaka.util.MultiMap.<shaka.util.FakeEventTarget.ListenerType>}
28
30
  */
29
31
  this.listeners_ = new shaka.util.MultiMap();
30
32
 
@@ -46,6 +48,9 @@ shaka.util.FakeEventTarget = class {
46
48
  * @exportInterface
47
49
  */
48
50
  addEventListener(type, listener, options) {
51
+ if (!this.listeners_) {
52
+ return;
53
+ }
49
54
  this.listeners_.push(type, listener);
50
55
  }
51
56
 
@@ -73,6 +78,9 @@ shaka.util.FakeEventTarget = class {
73
78
  * @exportInterface
74
79
  */
75
80
  removeEventListener(type, listener, options) {
81
+ if (!this.listeners_) {
82
+ return;
83
+ }
76
84
  this.listeners_.remove(type, listener);
77
85
  }
78
86
 
@@ -90,6 +98,10 @@ shaka.util.FakeEventTarget = class {
90
98
  goog.asserts.assert(event instanceof shaka.util.FakeEvent,
91
99
  'FakeEventTarget can only dispatch FakeEvents!');
92
100
 
101
+ if (!this.listeners_) {
102
+ return true;
103
+ }
104
+
93
105
  let listeners = this.listeners_.get(event.type) || [];
94
106
  const universalListeners =
95
107
  this.listeners_.get(shaka.util.FakeEventTarget.ALL_EVENTS_);
@@ -129,6 +141,14 @@ shaka.util.FakeEventTarget = class {
129
141
 
130
142
  return event.defaultPrevented;
131
143
  }
144
+
145
+ /**
146
+ * @override
147
+ * @exportInterface
148
+ */
149
+ release() {
150
+ this.listeners_ = null;
151
+ }
132
152
  };
133
153
 
134
154
  /**
@@ -75,50 +75,4 @@ shaka.util.Iterables = class {
75
75
  }
76
76
  return out;
77
77
  }
78
-
79
- /**
80
- * Returns an iterable that contains numbers in the range [0, end).
81
- *
82
- * @param {number} end The exclusive end of the list.
83
- * @return {!Iterable.<number>}
84
- */
85
- static* range(end) {
86
- for (let i = 0; i < end; i++) {
87
- yield i;
88
- }
89
- }
90
-
91
- /**
92
- * Iterates over an iterable object and includes additional info about each
93
- * item:
94
- * - The zero-based index of the element.
95
- * - The next item in the list, if it exists.
96
- * - The previous item in the list, if it exists.
97
- *
98
- * @param {!Iterable.<T>} iterable
99
- * @return {!Iterable.<
100
- * {i: number, item: T, prev: (T|undefined), next: (T|undefined)}>}
101
- * @template T
102
- */
103
- static* enumerate(iterable) {
104
- // Since we want the "next" item, we need to skip the first item and return
105
- // elements one in the past. So as we iterate, we are getting the "next"
106
- // element and yielding the one from the previous iteration.
107
- let i = -1;
108
- let prev = undefined;
109
- let item = undefined;
110
- for (const next of iterable) {
111
- if (i >= 0) {
112
- yield {i, item, prev, next};
113
- }
114
- i++;
115
- prev = item;
116
- item = next;
117
- }
118
- if (i != -1) {
119
- // If it's still -1, there were no items. Otherwise we need to yield
120
- // the last item.
121
- yield {i, prev, item, next: undefined};
122
- }
123
- }
124
78
  };
@@ -7,8 +7,6 @@
7
7
  goog.provide('shaka.util.Mp4BoxParsers');
8
8
 
9
9
  goog.require('shaka.util.DataViewReader');
10
- goog.require('shaka.util.Functional');
11
- goog.require('shaka.util.Iterables');
12
10
 
13
11
  shaka.util.Mp4BoxParsers = class {
14
12
  /**
@@ -125,8 +123,7 @@ shaka.util.Mp4BoxParsers = class {
125
123
  reader.skip(4);
126
124
  }
127
125
 
128
- for (const _ of shaka.util.Iterables.range(sampleCount)) {
129
- shaka.util.Functional.ignored(_);
126
+ for (let i = 0; i < sampleCount; i++) {
130
127
  /** @type {shaka.util.ParsedTRUNSample} */
131
128
  const sample = {
132
129
  sampleDuration: null,
@@ -9,8 +9,6 @@ goog.provide('shaka.util.Mp4Parser');
9
9
  goog.require('goog.asserts');
10
10
  goog.require('shaka.log');
11
11
  goog.require('shaka.util.DataViewReader');
12
- goog.require('shaka.util.Functional');
13
- goog.require('shaka.util.Iterables');
14
12
 
15
13
 
16
14
  /**
@@ -229,8 +227,7 @@ shaka.util.Mp4Parser = class {
229
227
  // start position. The header size varies.
230
228
  const headerSize = shaka.util.Mp4Parser.headerSize(box);
231
229
  const count = box.reader.readUint32();
232
- for (const _ of shaka.util.Iterables.range(count)) {
233
- shaka.util.Functional.ignored(_);
230
+ for (let i = 0; i < count; i++) {
234
231
  box.parser.parseNext(box.start + headerSize, box.reader, box.partialOkay);
235
232
  if (box.parser.done_) {
236
233
  break;
@@ -302,9 +299,10 @@ shaka.util.Mp4Parser = class {
302
299
  * @export
303
300
  */
304
301
  static headerSize(box) {
305
- return /* basic header */ 8
306
- + /* additional 64-bit size field */ (box.has64BitSize ? 8 : 0)
307
- + /* version and flags for a "full" box */ (box.flags != null ? 4 : 0);
302
+ const basicHeaderSize = 8;
303
+ const _64BitFieldSize = box.has64BitSize ? 8 : 0;
304
+ const versionAndFlagsSize = box.flags != null ? 4 : 0;
305
+ return basicHeaderSize + _64BitFieldSize + versionAndFlagsSize;
308
306
  }
309
307
  };
310
308
 
@@ -14,7 +14,6 @@ goog.require('shaka.media.SegmentIndex');
14
14
  goog.require('shaka.util.ArrayUtils');
15
15
  goog.require('shaka.util.Error');
16
16
  goog.require('shaka.util.IReleasable');
17
- goog.require('shaka.util.Iterables');
18
17
  goog.require('shaka.util.LanguageUtils');
19
18
  goog.require('shaka.util.ManifestParserUtils');
20
19
  goog.require('shaka.util.MapUtils');
@@ -98,7 +97,6 @@ shaka.util.PeriodCombiner = class {
98
97
  */
99
98
  async combinePeriods(periods, isDynamic) {
100
99
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
101
- const Iterables = shaka.util.Iterables;
102
100
 
103
101
  shaka.util.PeriodCombiner.filterOutAudioStreamDuplicates_(periods);
104
102
  shaka.util.PeriodCombiner.filterOutVideoStreamDuplicates_(periods);
@@ -118,7 +116,8 @@ shaka.util.PeriodCombiner = class {
118
116
  // Find the first period we haven't seen before. Tag all the periods we
119
117
  // see now as "used".
120
118
  let firstNewPeriodIndex = -1;
121
- for (const {i, item: period} of Iterables.enumerate(periods)) {
119
+ for (let i = 0; i < periods.length; i++) {
120
+ const period = periods[i];
122
121
  if (this.usedPeriodIds_.has(period.id)) {
123
122
  // This isn't new.
124
123
  } else {
@@ -301,6 +300,7 @@ shaka.util.PeriodCombiner = class {
301
300
  t1.label == t2.label &&
302
301
  t1.codecs == t2.codecs &&
303
302
  t1.mimeType == t2.mimeType &&
303
+ t1.bandwidth == t2.bandwidth &&
304
304
  ArrayUtils.hasSameElements(t1.roles, t2.roles)) {
305
305
  duplicate = true;
306
306
  }
@@ -510,13 +510,12 @@ shaka.util.PeriodCombiner = class {
510
510
  static async combine_(
511
511
  outputStreams, streamsPerPeriod, firstNewPeriodIndex, clone, concat) {
512
512
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
513
- const Iterables = shaka.util.Iterables;
514
513
 
515
514
  const unusedStreamsPerPeriod = [];
516
- for (const {i, item: streams} of Iterables.enumerate(streamsPerPeriod)) {
515
+ for (let i = 0; i < streamsPerPeriod.length; i++) {
517
516
  if (i >= firstNewPeriodIndex) {
518
517
  // This periods streams are all new.
519
- unusedStreamsPerPeriod.push(new Set(streams));
518
+ unusedStreamsPerPeriod.push(new Set(streamsPerPeriod[i]));
520
519
  } else {
521
520
  // This period's streams have all been used already.
522
521
  unusedStreamsPerPeriod.push(new Set());
@@ -668,12 +667,12 @@ shaka.util.PeriodCombiner = class {
668
667
 
669
668
  // Concatenate the new matches onto the stream, starting at the first new
670
669
  // period.
671
- const Iterables = shaka.util.Iterables;
672
670
  // Satisfy the compiler about the type.
673
671
  // Also checks if the segmentIndex is still valid after the async
674
672
  // operations, to make sure we stop if the active stream has changed.
675
673
  if (outputStream.segmentIndex instanceof shaka.media.MetaSegmentIndex) {
676
- for (const {i, item: match} of Iterables.enumerate(streams)) {
674
+ for (let i = 0; i < streams.length; i++) {
675
+ const match = streams[i];
677
676
  if (match.segmentIndex && i >= firstNewPeriodIndex) {
678
677
  goog.asserts.assert(match.segmentIndex,
679
678
  'stream should have a segmentIndex.');
@@ -768,9 +767,9 @@ shaka.util.PeriodCombiner = class {
768
767
 
769
768
  // Concatenate the new matches onto the stream, starting at the first new
770
769
  // period.
771
- const Iterables = shaka.util.Iterables;
772
- for (const {i, item: match} of Iterables.enumerate(matches)) {
770
+ for (let i = 0; i < matches.length; i++) {
773
771
  if (i >= firstNewPeriodIndex) {
772
+ const match = matches[i];
774
773
  concat(outputStream, match);
775
774
 
776
775
  // We only consider an audio stream "used" if its language is related to
@@ -1210,7 +1209,7 @@ shaka.util.PeriodCombiner = class {
1210
1209
  // [r1, r2, r3, r4].
1211
1210
  // If we match stream1 with stream3 due to the same role overlap,
1212
1211
  // stream2 is likely to be left unmatched and error out later.
1213
- // See https://github.com/google/shaka-player/issues/2542 for
1212
+ // See https://github.com/shaka-project/shaka-player/issues/2542 for
1214
1213
  // more details.
1215
1214
  return candidate.roles.length < best.roles.length;
1216
1215
  }
@@ -174,8 +174,8 @@ shaka.util.Platform = class {
174
174
  * @return {boolean}
175
175
  */
176
176
  static isApple() {
177
- return !!navigator.vendor && navigator.vendor.includes('Apple')
178
- && !shaka.util.Platform.isTizen();
177
+ return !!navigator.vendor && navigator.vendor.includes('Apple') &&
178
+ !shaka.util.Platform.isTizen();
179
179
  }
180
180
 
181
181
  /**
@@ -312,7 +312,7 @@ shaka.util.Platform = class {
312
312
  * initialization segments.
313
313
  *
314
314
  * @return {boolean}
315
- * @see https://github.com/google/shaka-player/issues/2759
315
+ * @see https://github.com/shaka-project/shaka-player/issues/2759
316
316
  */
317
317
  static requiresEncryptionInfoInAllInitSegments() {
318
318
  const Platform = shaka.util.Platform;