shaka-player 3.3.2 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. package/.csslintrc +11 -1
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  3. package/.github/pull_request_template.md +6 -34
  4. package/.github/workflows/build-and-test.yaml +129 -0
  5. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +56 -0
  6. package/.github/workflows/custom-actions/set-commit-status/action.yaml +41 -0
  7. package/.github/workflows/demo-version-index.yaml +37 -0
  8. package/.github/workflows/nightly-demo.yaml +42 -0
  9. package/.github/workflows/release-please.yaml +168 -0
  10. package/.github/workflows/safari-homedir-launcher.sh +18 -0
  11. package/.github/workflows/selenium-lab-tests.yaml +92 -0
  12. package/.github/workflows/sync-labels.yaml +33 -0
  13. package/.github/workflows/update-issues.yaml +29 -0
  14. package/.github/workflows/validate-pr-title.yaml +35 -0
  15. package/AUTHORS +3 -0
  16. package/CHANGELOG.md +1866 -1675
  17. package/CONTRIBUTING.md +2 -2
  18. package/CONTRIBUTORS +3 -0
  19. package/README.md +16 -13
  20. package/app-engine/README.md +9 -0
  21. package/app-engine/demo-version-index/README.md +14 -0
  22. package/app-engine/demo-version-index/app.yaml +28 -0
  23. package/app-engine/demo-version-index/generate.py +164 -0
  24. package/app-engine/demo-version-index/main.py +11 -0
  25. package/app-engine/demo-version-index/requirements.txt +5 -0
  26. package/app-engine/demo-version-index/templates/index.html +114 -0
  27. package/app-engine/shaka-player-demo/README.md +18 -0
  28. package/app-engine/shaka-player-demo/app.yaml +61 -0
  29. package/app-engine/shaka-player-demo/main.py +95 -0
  30. package/app-engine/shaka-player-demo/posters/10yo.png +0 -0
  31. package/app-engine/shaka-player-demo/posters/10yo.xcf +0 -0
  32. package/app-engine/shaka-player-demo/posters/1yo.jpg +0 -0
  33. package/app-engine/shaka-player-demo/posters/2yo.png +0 -0
  34. package/app-engine/shaka-player-demo/posters/2yo.xcf +0 -0
  35. package/app-engine/shaka-player-demo/posters/3yo.png +0 -0
  36. package/app-engine/shaka-player-demo/posters/3yo.xcf +0 -0
  37. package/app-engine/shaka-player-demo/posters/4yo.png +0 -0
  38. package/app-engine/shaka-player-demo/posters/4yo.xcf +0 -0
  39. package/app-engine/shaka-player-demo/posters/5yo.png +0 -0
  40. package/app-engine/shaka-player-demo/posters/5yo.xcf +0 -0
  41. package/app-engine/shaka-player-demo/posters/6yo.png +0 -0
  42. package/app-engine/shaka-player-demo/posters/6yo.xcf +0 -0
  43. package/app-engine/shaka-player-demo/posters/7yo.png +0 -0
  44. package/app-engine/shaka-player-demo/posters/7yo.xcf +0 -0
  45. package/app-engine/shaka-player-demo/posters/8yo.png +0 -0
  46. package/app-engine/shaka-player-demo/posters/8yo.xcf +0 -0
  47. package/app-engine/shaka-player-demo/posters/9yo.png +0 -0
  48. package/app-engine/shaka-player-demo/posters/9yo.xcf +0 -0
  49. package/app-engine/shaka-player-demo/posters/audioOnly.gif +0 -0
  50. package/app-engine/shaka-player-demo/posters/audioRickRoll.gif +0 -0
  51. package/app-engine/shaka-player-demo/posters/colorbars.gif +0 -0
  52. package/app-engine/shaka-player-demo/posters/fireworks.jpg +0 -0
  53. package/app-engine/shaka-player-demo/posters/party-hat.png +0 -0
  54. package/app-engine/shaka-player-demo/posters/sources.txt +46 -0
  55. package/app-engine/shaka-player-demo/posters/standard.png +0 -0
  56. package/app-engine/shaka-player-demo/posters/trek.jpg +0 -0
  57. package/app-engine/shaka-player-demo/posters/valentines.png +0 -0
  58. package/app-engine/shaka-player-demo/posters/zombie.jpg +0 -0
  59. package/app-engine/shaka-player-demo/posters.py +110 -0
  60. package/app-engine/shaka-player-demo/requirements.txt +5 -0
  61. package/app-engine/shaka-player-demo/time.txt +1 -0
  62. package/build/README.md +3 -3
  63. package/build/checkversion.py +1 -1
  64. package/build/compiler.py +1 -1
  65. package/build/conformance.textproto +13 -0
  66. package/build/docker/Dockerfile +20 -0
  67. package/build/docker/docker-compose.yml +10 -0
  68. package/build/gendeps.py +18 -15
  69. package/build/shaka-lab.yaml +161 -0
  70. package/build/shakaBuildHelpers.py +4 -29
  71. package/build/test.py +94 -29
  72. package/build/types/core +0 -1
  73. package/build/types/polyfill +1 -3
  74. package/build/wrapper.template.js +2 -2
  75. package/demo/TengwarTelcontar.woff2 +0 -0
  76. package/demo/asset_card.js +1 -2
  77. package/demo/cast_receiver/index.html +1 -1
  78. package/demo/cast_receiver/receiver_app.css +14 -14
  79. package/demo/common/asset.js +17 -1
  80. package/demo/common/assets.js +31 -0
  81. package/demo/common/message_ids.js +6 -3
  82. package/demo/config.js +10 -12
  83. package/demo/custom.js +39 -1
  84. package/demo/customWarning.txt +2 -2
  85. package/demo/demo.less +29 -18
  86. package/demo/demo_uncompiled.js +1 -13
  87. package/demo/demo_utils.js +0 -1
  88. package/demo/index.html +1 -1
  89. package/demo/locales/en.json +6 -3
  90. package/demo/locales/source.json +22 -10
  91. package/demo/main.js +12 -9
  92. package/demo/search.js +2 -1
  93. package/dist/controls.css +3 -3
  94. package/dist/controls.css.map +1 -1
  95. package/dist/demo.compiled.debug.js +236 -232
  96. package/dist/demo.compiled.debug.map +4 -4
  97. package/dist/demo.compiled.js +236 -232
  98. package/dist/demo.compiled.map +4 -4
  99. package/dist/demo.css +1 -1
  100. package/dist/demo.css.map +1 -1
  101. package/dist/deps.js +229 -226
  102. package/dist/locales.js +34 -32
  103. package/dist/receiver.compiled.debug.js +75 -73
  104. package/dist/receiver.compiled.debug.map +4 -4
  105. package/dist/receiver.compiled.js +75 -73
  106. package/dist/receiver.compiled.map +4 -4
  107. package/dist/shaka-player.compiled.d.ts +321 -314
  108. package/dist/shaka-player.compiled.debug.d.ts +321 -314
  109. package/dist/shaka-player.compiled.debug.externs.js +140 -129
  110. package/dist/shaka-player.compiled.debug.js +527 -592
  111. package/dist/shaka-player.compiled.debug.map +4 -4
  112. package/dist/shaka-player.compiled.externs.js +140 -129
  113. package/dist/shaka-player.compiled.js +836 -860
  114. package/dist/shaka-player.compiled.map +4 -4
  115. package/dist/shaka-player.ui.d.ts +367 -358
  116. package/dist/shaka-player.ui.debug.d.ts +367 -358
  117. package/dist/shaka-player.ui.debug.externs.js +148 -129
  118. package/dist/shaka-player.ui.debug.js +586 -649
  119. package/dist/shaka-player.ui.debug.map +4 -4
  120. package/dist/shaka-player.ui.externs.js +148 -129
  121. package/dist/shaka-player.ui.js +1008 -1028
  122. package/dist/shaka-player.ui.map +4 -4
  123. package/docs/design/REDESIGN.md +33 -33
  124. package/docs/design/bg-fetch.md +2 -2
  125. package/docs/design/codec_preferences.md +1 -1
  126. package/docs/design/dash-audio-channels.md +3 -3
  127. package/docs/design/dash-manifests.md +1 -1
  128. package/docs/design/gap-jumping.md +3 -3
  129. package/docs/design/preload.md +2 -2
  130. package/docs/tutorials/config.md +0 -2
  131. package/docs/tutorials/drm-config.md +5 -0
  132. package/docs/tutorials/fairplay.md +7 -22
  133. package/docs/tutorials/faq.md +8 -19
  134. package/docs/tutorials/index.json +3 -8
  135. package/docs/tutorials/plugins.md +4 -6
  136. package/docs/tutorials/selenium-grid-config.md +122 -0
  137. package/docs/tutorials/upgrade.md +83 -11
  138. package/docs/tutorials/welcome.md +10 -2
  139. package/externs/cmcd.js +1 -1
  140. package/externs/polyfill.js +15 -0
  141. package/externs/shaka/manifest.js +5 -1
  142. package/externs/shaka/net.js +12 -0
  143. package/externs/shaka/offline.js +5 -1
  144. package/externs/shaka/player.js +39 -32
  145. package/externs/shaka/text.js +12 -12
  146. package/externs/sourcebuffer.js +15 -0
  147. package/karma.conf.js +137 -30
  148. package/lib/abr/simple_abr_manager.js +12 -6
  149. package/lib/ads/client_side_ad.js +13 -2
  150. package/lib/ads/client_side_ad_manager.js +22 -4
  151. package/lib/cast/cast_proxy.js +3 -4
  152. package/lib/cast/cast_utils.js +0 -1
  153. package/lib/cea/cea608_data_channel.js +2 -2
  154. package/lib/cea/cea708_service.js +5 -4
  155. package/lib/cea/mp4_cea_parser.js +11 -5
  156. package/lib/cea/sei_processor.js +6 -3
  157. package/lib/dash/content_protection.js +85 -5
  158. package/lib/dash/dash_parser.js +10 -12
  159. package/lib/dash/mpd_utils.js +4 -5
  160. package/lib/dash/segment_list.js +1 -2
  161. package/lib/dash/segment_template.js +3 -3
  162. package/lib/hls/hls_parser.js +386 -749
  163. package/lib/hls/manifest_text_parser.js +5 -6
  164. package/lib/media/adaptation_set.js +1 -2
  165. package/lib/media/content_workarounds.js +2 -2
  166. package/lib/media/drm_engine.js +105 -55
  167. package/lib/media/gap_jumping_controller.js +10 -45
  168. package/lib/media/media_source_engine.js +90 -17
  169. package/lib/media/mp4_segment_index_parser.js +1 -4
  170. package/lib/media/playhead.js +4 -7
  171. package/lib/media/presentation_timeline.js +19 -10
  172. package/lib/media/segment_index.js +13 -46
  173. package/lib/media/segment_reference.js +47 -1
  174. package/lib/media/streaming_engine.js +35 -17
  175. package/lib/media/time_ranges_utils.js +5 -12
  176. package/lib/media/video_wrapper.js +1 -1
  177. package/lib/net/networking_engine.js +4 -1
  178. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  179. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  180. package/lib/offline/manifest_converter.js +1 -0
  181. package/lib/offline/storage.js +104 -136
  182. package/lib/player.js +50 -216
  183. package/lib/polyfill/all.js +2 -3
  184. package/lib/polyfill/encryption_scheme.js +1 -1
  185. package/lib/polyfill/media_capabilities.js +15 -9
  186. package/lib/polyfill/mediasource.js +0 -28
  187. package/lib/polyfill/patchedmediakeys_nop.js +2 -0
  188. package/lib/polyfill/patchedmediakeys_webkit.js +2 -0
  189. package/lib/polyfill/symbol.js +46 -0
  190. package/lib/text/cue.js +1 -7
  191. package/lib/text/lrc_text_parser.js +8 -0
  192. package/lib/text/mp4_ttml_parser.js +8 -0
  193. package/lib/text/mp4_vtt_parser.js +8 -0
  194. package/lib/text/sbv_text_parser.js +8 -0
  195. package/lib/text/simple_text_displayer.js +3 -8
  196. package/lib/text/srt_text_parser.js +8 -0
  197. package/lib/text/ssa_text_parser.js +8 -0
  198. package/lib/text/text_engine.js +19 -3
  199. package/lib/text/ttml_text_parser.js +16 -5
  200. package/lib/text/ui_text_displayer.js +2 -8
  201. package/lib/text/vtt_text_parser.js +24 -2
  202. package/lib/text/web_vtt_generator.js +1 -7
  203. package/lib/util/buffer_utils.js +1 -3
  204. package/lib/util/ebml_parser.js +3 -3
  205. package/lib/util/error.js +10 -14
  206. package/lib/util/fairplay_utils.js +109 -0
  207. package/lib/util/functional.js +0 -42
  208. package/lib/util/iterables.js +0 -46
  209. package/lib/util/mime_utils.js +2 -0
  210. package/lib/util/mp4_box_parsers.js +1 -4
  211. package/lib/util/mp4_parser.js +5 -7
  212. package/lib/util/periods.js +10 -11
  213. package/lib/util/platform.js +48 -3
  214. package/lib/util/player_configuration.js +12 -6
  215. package/lib/util/pssh.js +24 -8
  216. package/lib/util/stream_utils.js +96 -25
  217. package/lib/util/string_utils.js +3 -5
  218. package/lib/util/uint8array_utils.js +3 -21
  219. package/lib/util/xml_utils.js +16 -8
  220. package/package.json +61 -36
  221. package/roadmap.md +27 -27
  222. package/shaka-player.uncompiled.js +1 -3
  223. package/test/abr/simple_abr_manager_unit.js +3 -8
  224. package/test/ads/ad_manager_unit.js +0 -6
  225. package/test/cast/cast_proxy_unit.js +0 -8
  226. package/test/cast/cast_receiver_integration.js +1 -18
  227. package/test/cast/cast_receiver_unit.js +1 -9
  228. package/test/cast/cast_sender_unit.js +0 -6
  229. package/test/cast/cast_utils_unit.js +1 -13
  230. package/test/cea/cea608_memory_unit.js +0 -5
  231. package/test/cea/cea708_service_unit.js +0 -7
  232. package/test/cea/cea708_window_unit.js +0 -5
  233. package/test/cea/cea_decoder_unit.js +0 -6
  234. package/test/cea/dtvcc_packet_builder_unit.js +0 -3
  235. package/test/cea/dtvcc_packet_unit.js +0 -5
  236. package/test/cea/mp4_cea_parser_unit.js +0 -4
  237. package/test/dash/dash_parser_content_protection_unit.js +45 -10
  238. package/test/dash/dash_parser_live_unit.js +2 -15
  239. package/test/dash/dash_parser_manifest_unit.js +2 -40
  240. package/test/dash/dash_parser_segment_base_unit.js +1 -8
  241. package/test/dash/dash_parser_segment_list_unit.js +1 -7
  242. package/test/dash/dash_parser_segment_template_unit.js +3 -13
  243. package/test/dash/mpd_utils_unit.js +3 -11
  244. package/test/demo/demo_unit.js +2 -6
  245. package/test/deprecate/enforcer_unit.js +0 -4
  246. package/test/deprecate/version_unit.js +0 -2
  247. package/test/hls/hls_live_unit.js +101 -234
  248. package/test/hls/hls_parser_unit.js +517 -447
  249. package/test/hls/manifest_text_parser_unit.js +0 -10
  250. package/test/media/adaptation_set_criteria_unit.js +3 -7
  251. package/test/media/adaptation_set_unit.js +0 -2
  252. package/test/media/buffering_observer_unit.js +1 -4
  253. package/test/media/closed_caption_parser_unit.js +0 -3
  254. package/test/media/drm_engine_integration.js +2 -15
  255. package/test/media/drm_engine_unit.js +90 -144
  256. package/test/media/manifest_parser_unit.js +0 -4
  257. package/test/media/media_source_engine_integration.js +26 -10
  258. package/test/media/media_source_engine_unit.js +8 -20
  259. package/test/media/mp4_segment_index_parser_unit.js +0 -4
  260. package/test/media/play_rate_controller_unit.js +0 -4
  261. package/test/media/playhead_unit.js +35 -207
  262. package/test/media/presentation_timeline_unit.js +4 -7
  263. package/test/media/quality_observer_unit.js +0 -4
  264. package/test/media/region_observer_unit.js +1 -6
  265. package/test/media/region_timeline_unit.js +0 -3
  266. package/test/media/segment_index_unit.js +15 -31
  267. package/test/media/segment_reference_unit.js +0 -3
  268. package/test/media/stall_detector_unit.js +0 -5
  269. package/test/media/streaming_engine_integration.js +13 -75
  270. package/test/media/streaming_engine_unit.js +14 -37
  271. package/test/media/time_ranges_utils_unit.js +0 -7
  272. package/test/media/transmuxer_integration.js +0 -6
  273. package/test/media/webm_segment_index_parser_unit.js +0 -4
  274. package/test/net/data_uri_plugin_unit.js +0 -7
  275. package/test/net/http_plugin_unit.js +0 -9
  276. package/test/net/networking_engine_unit.js +0 -11
  277. package/test/offline/download_progress_estimator_unit.js +0 -2
  278. package/test/offline/indexeddb_storage_unit.js +0 -6
  279. package/test/offline/manifest_convert_unit.js +34 -12
  280. package/test/offline/offline_integration.js +1 -10
  281. package/test/offline/offline_manifest_parser_unit.js +1 -6
  282. package/test/offline/offline_scheme_unit.js +0 -8
  283. package/test/offline/offline_uri_unit.js +0 -2
  284. package/test/offline/storage_compatibility_unit.js +1 -14
  285. package/test/offline/storage_integration.js +6 -31
  286. package/test/player_external.js +1 -15
  287. package/test/player_integration.js +38 -28
  288. package/test/player_load_graph_integration.js +1 -6
  289. package/test/player_src_equals_external.js +3 -9
  290. package/test/player_src_equals_integration.js +0 -7
  291. package/test/player_unit.js +78 -37
  292. package/test/routing/walker_unit.js +0 -8
  293. package/test/test/assets/large_file.mpd +1 -1
  294. package/test/test/boot.js +75 -22
  295. package/test/test/externs/jasmine.js +2 -2
  296. package/test/test/externs/karma.js +4 -0
  297. package/test/test/namespace.js +10 -0
  298. package/test/test/util/canned_idb.js +0 -8
  299. package/test/test/util/cea_utils.js +0 -6
  300. package/test/test/util/dash_parser_util.js +0 -13
  301. package/test/test/util/fake_ad.js +0 -3
  302. package/test/test/util/fake_ad_manager.js +0 -9
  303. package/test/test/util/fake_demo_main.js +0 -5
  304. package/test/test/util/fake_drm_engine.js +0 -6
  305. package/test/test/util/fake_media_source_engine.js +11 -11
  306. package/test/test/util/fake_networking_engine.js +0 -5
  307. package/test/test/util/fake_text_displayer.js +0 -5
  308. package/test/test/util/indexeddb_utils.js +1 -10
  309. package/test/test/util/jasmine_fetch.js +0 -1
  310. package/test/test/util/loader.js +0 -18
  311. package/test/test/util/manifest_generator.js +12 -15
  312. package/test/test/util/manifest_parser_util.js +4 -7
  313. package/test/test/util/offline_utils.js +1 -5
  314. package/test/test/util/simple_fakes.js +9 -26
  315. package/test/test/util/stream_generator.js +0 -14
  316. package/test/test/util/streaming_engine_util.js +1 -15
  317. package/test/test/util/test_scheme.js +25 -20
  318. package/test/test/util/ttml_utils.js +0 -2
  319. package/test/test/util/ui_utils.js +0 -9
  320. package/test/test/util/util.js +9 -23
  321. package/test/test/util/waiter.js +84 -43
  322. package/test/text/cue_integration.js +2 -6
  323. package/test/text/lrc_text_parser_unit.js +6 -11
  324. package/test/text/mp4_ttml_parser_unit.js +6 -10
  325. package/test/text/mp4_vtt_parser_unit.js +7 -12
  326. package/test/text/sbv_text_parser_unit.js +5 -10
  327. package/test/text/simple_text_displayer_unit.js +1 -8
  328. package/test/text/srt_text_parser_unit.js +5 -10
  329. package/test/text/ssa_text_parser_unit.js +17 -34
  330. package/test/text/text_engine_unit.js +47 -12
  331. package/test/text/text_track_integration.js +0 -2
  332. package/test/text/ttml_text_parser_unit.js +79 -88
  333. package/test/text/ui_text_displayer_unit.js +44 -41
  334. package/test/text/vtt_text_parser_unit.js +55 -66
  335. package/test/text/web_vtt_generator_unit.js +0 -3
  336. package/test/ui/ad_ui_unit.js +0 -11
  337. package/test/ui/localization_unit.js +0 -3
  338. package/test/ui/text_displayer_layout_unit.js +1 -12
  339. package/test/ui/ui_customization_unit.js +0 -6
  340. package/test/ui/ui_integration.js +0 -32
  341. package/test/ui/ui_unit.js +28 -17
  342. package/test/util/abortable_operation_unit.js +4 -9
  343. package/test/util/array_utils_unit.js +0 -2
  344. package/test/util/buffer_utils_unit.js +0 -2
  345. package/test/util/cmcd_manager_unit.js +3 -3
  346. package/test/util/data_view_reader_unit.js +0 -4
  347. package/test/util/ebml_parser_unit.js +0 -4
  348. package/test/util/event_manager_unit.js +0 -3
  349. package/test/util/fake_event_target_unit.js +0 -5
  350. package/test/util/iterables_unit.js +0 -64
  351. package/test/util/language_utils_unit.js +0 -3
  352. package/test/util/manifest_parser_utils_unit.js +0 -2
  353. package/test/util/mp4_box_parsers_unit.js +0 -5
  354. package/test/util/mp4_parser_unit.js +0 -4
  355. package/test/util/multi_map_unit.js +0 -3
  356. package/test/util/object_utils_unit.js +0 -2
  357. package/test/util/periods_unit.js +14 -7
  358. package/test/util/pssh_unit.js +0 -5
  359. package/test/util/state_history_unit.js +0 -2
  360. package/test/util/stream_utils_unit.js +26 -15
  361. package/test/util/string_utils_unit.js +0 -6
  362. package/test/util/text_parser_unit.js +0 -2
  363. package/test/util/xml_utils_unit.js +0 -4
  364. package/ui/controls.js +65 -40
  365. package/ui/fullscreen_button.js +26 -6
  366. package/ui/less/ad_controls.less +6 -6
  367. package/ui/less/buttons.less +6 -6
  368. package/ui/less/containers.less +10 -12
  369. package/ui/less/overflow_menu.less +4 -4
  370. package/ui/less/range_elements.less +7 -2
  371. package/ui/less/tooltip.less +4 -4
  372. package/ui/locales/en.json +1 -0
  373. package/ui/locales/sjn-translations.yaml +257 -0
  374. package/ui/locales/sjn.json +42 -0
  375. package/ui/locales/source.json +5 -0
  376. package/ui/resolution_selection.js +31 -33
  377. package/ui/seek_bar.js +2 -1
  378. package/ui/ui.js +0 -17
  379. package/.github/workflows/build_and_test.yaml +0 -73
  380. package/.github/workflows/release.yaml +0 -53
  381. package/docs/tutorials/upgrade-v2-5.md +0 -441
  382. package/docs/tutorials/upgrade-v3.md +0 -38
  383. package/externs/svgelement.js +0 -18
  384. package/externs/webcrypto.js +0 -18
  385. package/lib/polyfill/mathround.js +0 -49
  386. package/lib/polyfill/patchedmediakeys_apple.js +0 -744
  387. package/lib/polyfill/patchedmediakeys_ms.js +0 -698
  388. package/lib/util/mutex.js +0 -52
  389. package/test/util/functional_unit.js +0 -82
@@ -84,6 +84,14 @@ shaka.text.Mp4VttParser = class {
84
84
  }
85
85
  }
86
86
 
87
+ /**
88
+ * @override
89
+ * @export
90
+ */
91
+ setSequenceMode(sequenceMode) {
92
+ // Unused.
93
+ }
94
+
87
95
  /**
88
96
  * @override
89
97
  * @export
@@ -27,6 +27,14 @@ shaka.text.SbvTextParser = class {
27
27
  goog.asserts.assert(false, 'SubViewer does not have init segments');
28
28
  }
29
29
 
30
+ /**
31
+ * @override
32
+ * @export
33
+ */
34
+ setSequenceMode(sequenceMode) {
35
+ // Unused.
36
+ }
37
+
30
38
  /**
31
39
  * @override
32
40
  * @export
@@ -12,7 +12,6 @@
12
12
  goog.provide('shaka.text.SimpleTextDisplayer');
13
13
 
14
14
  goog.require('goog.asserts');
15
- goog.require('shaka.Deprecate');
16
15
  goog.require('shaka.log');
17
16
  goog.require('shaka.text.Cue');
18
17
 
@@ -108,12 +107,7 @@ shaka.text.SimpleTextDisplayer = class {
108
107
  return `${acc}</${tag}>`;
109
108
  }, '');
110
109
 
111
- if (cue.lineBreak || cue.spacer) {
112
- if (cue.spacer) {
113
- shaka.Deprecate.deprecateFeature(4,
114
- 'shaka.extern.Cue',
115
- 'Please use lineBreak instead of spacer.');
116
- }
110
+ if (cue.lineBreak) {
117
111
  // This is a vertical lineBreak, so insert a newline.
118
112
  return '\n';
119
113
  } else if (cue.nestedCues.length) {
@@ -178,7 +172,8 @@ shaka.text.SimpleTextDisplayer = class {
178
172
  // The browser will display cues with identical time ranges from the
179
173
  // bottom up. Reversing the order of equal cues means the first one
180
174
  // parsed will be at the top, as you would expect.
181
- // See https://github.com/google/shaka-player/issues/848 for more info.
175
+ // See https://github.com/shaka-project/shaka-player/issues/848 for
176
+ // more info.
182
177
  // However, this ordering behavior is part of VTTCue's "line" field.
183
178
  // Some platforms don't have a real VTTCue and use a polyfill instead.
184
179
  // When VTTCue is polyfilled or does not support "line", we should _not_
@@ -35,6 +35,14 @@ shaka.text.SrtTextParser = class {
35
35
  goog.asserts.assert(false, 'SRT does not have init segments');
36
36
  }
37
37
 
38
+ /**
39
+ * @override
40
+ * @export
41
+ */
42
+ setSequenceMode(sequenceMode) {
43
+ // Unused.
44
+ }
45
+
38
46
  /**
39
47
  * @override
40
48
  * @export
@@ -28,6 +28,14 @@ shaka.text.SsaTextParser = class {
28
28
  goog.asserts.assert(false, 'SSA does not have init segments');
29
29
  }
30
30
 
31
+ /**
32
+ * @override
33
+ * @export
34
+ */
35
+ setSequenceMode(sequenceMode) {
36
+ // Unused.
37
+ }
38
+
31
39
  /**
32
40
  * @override
33
41
  * @export
@@ -7,9 +7,9 @@
7
7
  goog.provide('shaka.text.TextEngine');
8
8
 
9
9
  goog.require('goog.asserts');
10
+ goog.require('shaka.log');
10
11
  goog.require('shaka.text.Cue');
11
12
  goog.require('shaka.util.BufferUtils');
12
- goog.require('shaka.util.Functional');
13
13
  goog.require('shaka.util.IDestroyable');
14
14
  goog.require('shaka.util.MimeUtils');
15
15
  goog.requireType('shaka.cea.ICaptionDecoder');
@@ -30,6 +30,9 @@ shaka.text.TextEngine = class {
30
30
  /** @private {shaka.extern.TextDisplayer} */
31
31
  this.displayer_ = displayer;
32
32
 
33
+ /** @private {boolean} */
34
+ this.segmentRelativeVttTiming_ = false;
35
+
33
36
  /** @private {number} */
34
37
  this.timestampOffset_ = 0;
35
38
 
@@ -128,8 +131,10 @@ shaka.text.TextEngine = class {
128
131
  * called at least once before appendBuffer.
129
132
  *
130
133
  * @param {string} mimeType
134
+ * @param {boolean} sequenceMode
135
+ * @param {boolean} segmentRelativeVttTiming
131
136
  */
132
- initParser(mimeType) {
137
+ initParser(mimeType, sequenceMode, segmentRelativeVttTiming) {
133
138
  // No parser for CEA, which is extracted from video and side-loaded
134
139
  // into TextEngine and TextDisplayer.
135
140
  if (mimeType == shaka.util.MimeUtils.CEA608_CLOSED_CAPTION_MIMETYPE ||
@@ -140,7 +145,14 @@ shaka.text.TextEngine = class {
140
145
  const factory = shaka.text.TextEngine.parserMap_[mimeType];
141
146
  goog.asserts.assert(
142
147
  factory, 'Text type negotiation should have happened already');
143
- this.parser_ = shaka.util.Functional.callFactory(factory);
148
+ this.parser_ = factory();
149
+ if (this.parser_.setSequenceMode) {
150
+ this.parser_.setSequenceMode(sequenceMode);
151
+ } else {
152
+ shaka.log.alwaysWarn(
153
+ 'Text parsers should have a "setSequenceMode" method!');
154
+ }
155
+ this.segmentRelativeVttTiming_ = segmentRelativeVttTiming;
144
156
  }
145
157
 
146
158
  /**
@@ -166,11 +178,15 @@ shaka.text.TextEngine = class {
166
178
  return;
167
179
  }
168
180
 
181
+ const vttOffset = this.segmentRelativeVttTiming_ ?
182
+ startTime : this.timestampOffset_;
183
+
169
184
  /** @type {shaka.extern.TextParser.TimeContext} **/
170
185
  const time = {
171
186
  periodStart: this.timestampOffset_,
172
187
  segmentStart: startTime,
173
188
  segmentEnd: endTime,
189
+ vttOffset: vttOffset,
174
190
  };
175
191
 
176
192
  // Parse the buffer and add the new cues.
@@ -30,6 +30,14 @@ shaka.text.TtmlTextParser = class {
30
30
  goog.asserts.assert(false, 'TTML does not have init segments');
31
31
  }
32
32
 
33
+ /**
34
+ * @override
35
+ * @export
36
+ */
37
+ setSequenceMode(sequenceMode) {
38
+ // Unused.
39
+ }
40
+
33
41
  /**
34
42
  * @override
35
43
  * @export
@@ -536,8 +544,10 @@ shaka.text.TtmlTextParser = class {
536
544
 
537
545
  cue.textAlign = Cue.textAlign[align.toUpperCase()];
538
546
  } else {
539
- // Default value is START: https://bit.ly/32OGmvo
540
- cue.textAlign = Cue.textAlign.START;
547
+ // Default value is START in the TTML spec: https://bit.ly/32OGmvo
548
+ // But to make the subtitle render consitent with other players and the
549
+ // shaka.text.Cue we use CENTER
550
+ cue.textAlign = Cue.textAlign.CENTER;
541
551
  }
542
552
 
543
553
  const displayAlign = TtmlTextParser.getStyleAttribute_(
@@ -558,7 +568,7 @@ shaka.text.TtmlTextParser = class {
558
568
  // Background color should not be set on a container. If this is a nested
559
569
  // cue, you can set the background. If it's a top-level that happens to
560
570
  // also be a leaf, you can set the background.
561
- // See https://github.com/google/shaka-player/issues/2623
571
+ // See https://github.com/shaka-project/shaka-player/issues/2623
562
572
  // This used to be handled in the displayer, but that is confusing. The Cue
563
573
  // structure should reflect what you want to happen in the displayer, and
564
574
  // the displayer shouldn't have to know about TTML.
@@ -942,8 +952,9 @@ shaka.text.TtmlTextParser = class {
942
952
  let ret = null;
943
953
  const XmlUtils = shaka.util.XmlUtils;
944
954
  while (element) {
945
- ret = nsName ? XmlUtils.getAttributeNS(element, nsName, attributeName)
946
- : element.getAttribute(attributeName);
955
+ ret = nsName ?
956
+ XmlUtils.getAttributeNS(element, nsName, attributeName) :
957
+ element.getAttribute(attributeName);
947
958
  if (ret) {
948
959
  break;
949
960
  }
@@ -8,7 +8,6 @@
8
8
  goog.provide('shaka.text.UITextDisplayer');
9
9
 
10
10
  goog.require('goog.asserts');
11
- goog.require('shaka.Deprecate');
12
11
  goog.require('shaka.text.Cue');
13
12
  goog.require('shaka.text.CueRegion');
14
13
  goog.require('shaka.util.Dom');
@@ -108,7 +107,7 @@ shaka.text.UITextDisplayer = class {
108
107
  append(cues) {
109
108
  // Clone the cues list for performace optimization. We can avoid the cues
110
109
  // list growing during the comparisons for duplicate cues.
111
- // See: https://github.com/google/shaka-player/issues/3018
110
+ // See: https://github.com/shaka-project/shaka-player/issues/3018
112
111
  const cuesList = [...this.cues_];
113
112
  for (const cue of cues) {
114
113
  // When a VTT cue spans a segment boundary, the cue will be duplicated
@@ -343,12 +342,7 @@ shaka.text.UITextDisplayer = class {
343
342
  createCue_(cue, parents) {
344
343
  const isNested = parents.length > 1;
345
344
  let type = isNested ? 'span' : 'div';
346
- if (cue.lineBreak || cue.spacer) {
347
- if (cue.spacer) {
348
- shaka.Deprecate.deprecateFeature(4,
349
- 'shaka.extern.Cue',
350
- 'Please use lineBreak instead of spacer.');
351
- }
345
+ if (cue.lineBreak) {
352
346
  type = 'br';
353
347
  }
354
348
 
@@ -22,6 +22,12 @@ goog.require('shaka.util.XmlUtils');
22
22
  * @export
23
23
  */
24
24
  shaka.text.VttTextParser = class {
25
+ /** Constructs a VTT parser. */
26
+ constructor() {
27
+ /** @private {boolean} */
28
+ this.sequenceMode_ = false;
29
+ }
30
+
25
31
  /**
26
32
  * @override
27
33
  * @export
@@ -30,6 +36,14 @@ shaka.text.VttTextParser = class {
30
36
  goog.asserts.assert(false, 'VTT does not have init segments');
31
37
  }
32
38
 
39
+ /**
40
+ * @override
41
+ * @export
42
+ */
43
+ setSequenceMode(sequenceMode) {
44
+ this.sequenceMode_ = sequenceMode;
45
+ }
46
+
33
47
  /**
34
48
  * @override
35
49
  * @export
@@ -48,11 +62,19 @@ shaka.text.VttTextParser = class {
48
62
  shaka.util.Error.Code.INVALID_TEXT_HEADER);
49
63
  }
50
64
 
65
+ // Depending on "segmentRelativeVttTiming" configuration,
66
+ // "vttOffset" will correspond to either "periodStart" (default)
67
+ // or "segmentStart", for segmented VTT where timings are relative
68
+ // to the beginning of each segment.
51
69
  // NOTE: "periodStart" is the timestamp offset applied via TextEngine.
52
70
  // It is no longer closely tied to periods, but the name stuck around.
53
- let offset = time.periodStart;
71
+ let offset = time.vttOffset;
54
72
 
55
- if (blocks[0].includes('X-TIMESTAMP-MAP')) {
73
+ // Do not honor the 'X-TIMESTAMP-MAP' value when in sequence mode.
74
+ // That is because it is used mainly (solely?) to account for the timestamp
75
+ // offset of the video/audio; when in sequence mode, we normalize that
76
+ // timestamp offset to 0, so we should not account for it.
77
+ if (blocks[0].includes('X-TIMESTAMP-MAP') && !this.sequenceMode_) {
56
78
  // https://bit.ly/2K92l7y
57
79
  // The 'X-TIMESTAMP-MAP' header is used in HLS to align text with
58
80
  // the rest of the media.
@@ -6,7 +6,6 @@
6
6
 
7
7
  goog.provide('shaka.text.WebVttGenerator');
8
8
 
9
- goog.require('shaka.Deprecate');
10
9
  goog.require('shaka.text.Cue');
11
10
 
12
11
 
@@ -49,12 +48,7 @@ shaka.text.WebVttGenerator = class {
49
48
  return `${acc}</${tag}>`;
50
49
  }, '');
51
50
 
52
- if (cue.lineBreak || cue.spacer) {
53
- if (cue.spacer) {
54
- shaka.Deprecate.deprecateFeature(4,
55
- 'shaka.text.Cue',
56
- 'Please use lineBreak instead of spacer.');
57
- }
51
+ if (cue.lineBreak) {
58
52
  // This is a vertical lineBreak, so insert a newline.
59
53
  return '\n';
60
54
  } else if (cue.nestedCues.length) {
@@ -6,8 +6,6 @@
6
6
 
7
7
  goog.provide('shaka.util.BufferUtils');
8
8
 
9
- goog.require('shaka.util.Iterables');
10
-
11
9
 
12
10
  /**
13
11
  * @summary A set of BufferSource utility functions.
@@ -45,7 +43,7 @@ shaka.util.BufferUtils = class {
45
43
 
46
44
  const uint8A = shaka.util.BufferUtils.toUint8(arr1);
47
45
  const uint8B = shaka.util.BufferUtils.toUint8(arr2);
48
- for (const i of shaka.util.Iterables.range(arr1.byteLength)) {
46
+ for (let i = 0; i < arr1.byteLength; i++) {
49
47
  if (uint8A[i] != uint8B[i]) {
50
48
  return false;
51
49
  }
@@ -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
 
@@ -581,13 +581,7 @@ shaka.util.Error.Code = {
581
581
 
582
582
  // RETIRED: 'HLS_COULD_NOT_GUESS_MIME_TYPE': 4021,
583
583
 
584
- /**
585
- * No Master Playlist has been provided. Master playlist provides
586
- * vital information about the streams (like codecs) that is
587
- * required for MediaSource. We don't support directly providing
588
- * a Media Playlist.
589
- */
590
- 'HLS_MASTER_PLAYLIST_NOT_PROVIDED': 4022,
584
+ // RETIRED: 'HLS_MASTER_PLAYLIST_NOT_PROVIDED': 4022,
591
585
 
592
586
  /**
593
587
  * One of the required attributes was not provided, so the
@@ -627,12 +621,7 @@ shaka.util.Error.Code = {
627
621
 
628
622
  // RETIRED: 'HLS_LIVE_CONTENT_NOT_SUPPORTED': 4029,
629
623
 
630
- /**
631
- * The HLS parser was unable to parse segment start time from the media.
632
- * <br> error.data[0] is the failed media playlist URI.
633
- * <br> error.data[1] is the failed media segment URI (if any).
634
- */
635
- 'HLS_COULD_NOT_PARSE_SEGMENT_START_TIME': 4030,
624
+ // RETIRED: 'HLS_COULD_NOT_PARSE_SEGMENT_START_TIME': 4030,
636
625
 
637
626
  // RETIRED: 'HLS_MEDIA_SEQUENCE_REQUIRED_IN_LIVE_STREAMS': 4031,
638
627
 
@@ -686,6 +675,13 @@ shaka.util.Error.Code = {
686
675
  */
687
676
  'HLS_VARIABLE_NOT_FOUND': 4039,
688
677
 
678
+ /**
679
+ * We do not support playing encrypted mp2t with MSE
680
+ */
681
+ 'HLS_MSE_ENCRYPTED_MP2T_NOT_SUPPORTED': 4040,
682
+
683
+ // RETIRED: 'HLS_MSE_ENCRYPTED_LEGACY_APPLE_MEDIA_KEYS_NOT_SUPPORTED': 4041,
684
+
689
685
 
690
686
  // RETIRED: 'INCONSISTENT_BUFFER_STATE': 5000,
691
687
  // RETIRED: 'INVALID_SEGMENT_INDEX': 5001,
@@ -8,9 +8,11 @@ goog.provide('shaka.util.FairPlayUtils');
8
8
 
9
9
  goog.require('goog.Uri');
10
10
  goog.require('goog.asserts');
11
+ goog.require('shaka.net.NetworkingEngine');
11
12
  goog.require('shaka.util.BufferUtils');
12
13
  goog.require('shaka.util.Error');
13
14
  goog.require('shaka.util.StringUtils');
15
+ goog.require('shaka.util.Uint8ArrayUtils');
14
16
 
15
17
 
16
18
  /**
@@ -18,6 +20,29 @@ goog.require('shaka.util.StringUtils');
18
20
  * @export
19
21
  */
20
22
  shaka.util.FairPlayUtils = class {
23
+ /**
24
+ * Check if FairPlay is supported.
25
+ *
26
+ * @return {!Promise.<boolean>}
27
+ * @export
28
+ */
29
+ static async isFairPlaySupported() {
30
+ const config = {
31
+ initDataTypes: ['cenc', 'sinf', 'skd'],
32
+ videoCapabilities: [
33
+ {
34
+ contentType: 'video/mp4; codecs="avc1.42E01E"',
35
+ },
36
+ ],
37
+ };
38
+ try {
39
+ await navigator.requestMediaKeySystemAccess('com.apple.fps', [config]);
40
+ return true;
41
+ } catch (err) {
42
+ return false;
43
+ }
44
+ }
45
+
21
46
  /**
22
47
  * Using the default method, extract a content ID from the init data. This is
23
48
  * based on the FairPlay example documentation.
@@ -106,4 +131,88 @@ shaka.util.FairPlayUtils = class {
106
131
  offset == rebuiltInitData.length, 'Inconsistent init data length');
107
132
  return rebuiltInitData;
108
133
  }
134
+
135
+ /**
136
+ * SPC FairPlay request.
137
+ *
138
+ * @param {shaka.net.NetworkingEngine.RequestType} type
139
+ * @param {shaka.extern.Request} request
140
+ * @export
141
+ */
142
+ static spcFairPlayRequest(type, request) {
143
+ if (type !== shaka.net.NetworkingEngine.RequestType.LICENSE) {
144
+ return;
145
+ }
146
+ const body = /** @type {!(ArrayBuffer|ArrayBufferView)} */(request.body);
147
+ const originalPayload = shaka.util.BufferUtils.toUint8(body);
148
+ const base64Payload = shaka.util.Uint8ArrayUtils.toBase64(originalPayload);
149
+ request.headers['Content-Type'] = 'application/x-www-form-urlencoded';
150
+ request.body = shaka.util.StringUtils.toUTF8('spc=' + base64Payload);
151
+ }
152
+
153
+ /**
154
+ * Common FairPlay response transform for some DRMs providers.
155
+ *
156
+ * @param {shaka.net.NetworkingEngine.RequestType} type
157
+ * @param {shaka.extern.Response} response
158
+ * @export
159
+ */
160
+ static commonFairPlayResponse(type, response) {
161
+ if (type !== shaka.net.NetworkingEngine.RequestType.LICENSE) {
162
+ return;
163
+ }
164
+
165
+ // In Apple's docs, responses can be of the form:
166
+ // '\n<ckc>base64encoded</ckc>\n' or 'base64encoded'
167
+ // We have also seen responses in JSON format from some of our partners.
168
+ // In all of these text-based formats, the CKC data is base64-encoded.
169
+
170
+ let responseText;
171
+ try {
172
+ // Convert it to text for further processing.
173
+ responseText = shaka.util.StringUtils.fromUTF8(response.data);
174
+ } catch (error) {
175
+ // Assume it's not a text format of any kind and leave it alone.
176
+ return;
177
+ }
178
+
179
+ let licenseProcessing = false;
180
+
181
+ // Trim whitespace.
182
+ responseText = responseText.trim();
183
+
184
+ // Look for <ckc> wrapper and remove it.
185
+ if (responseText.substr(0, 5) === '<ckc>' &&
186
+ responseText.substr(-6) === '</ckc>') {
187
+ responseText = responseText.slice(5, -6);
188
+ licenseProcessing = true;
189
+ }
190
+
191
+ // Look for a JSON wrapper and remove it.
192
+ try {
193
+ const responseObject = /** @type {!Object} */(JSON.parse(responseText));
194
+ if (responseObject['ckc']) {
195
+ responseText = responseObject['ckc'];
196
+ licenseProcessing = true;
197
+ }
198
+ if (responseObject['CkcMessage']) {
199
+ responseText = responseObject['CkcMessage'];
200
+ licenseProcessing = true;
201
+ }
202
+ if (responseObject['License']) {
203
+ responseText = responseObject['License'];
204
+ licenseProcessing = true;
205
+ }
206
+ } catch (err) {
207
+ // It wasn't JSON. Fall through with other transformations.
208
+ }
209
+
210
+ if (licenseProcessing) {
211
+ // Decode the base64-encoded data into the format the browser expects.
212
+ // It's not clear why FairPlay license servers don't just serve this
213
+ // directly.
214
+ response.data = shaka.util.BufferUtils.toArrayBuffer(
215
+ shaka.util.Uint8ArrayUtils.fromBase64(responseText));
216
+ }
217
+ }
109
218
  };
@@ -6,9 +6,6 @@
6
6
 
7
7
  goog.provide('shaka.util.Functional');
8
8
 
9
- goog.require('shaka.Deprecate');
10
-
11
-
12
9
  /**
13
10
  * @summary A set of functional utility functions.
14
11
  */
@@ -70,43 +67,4 @@ shaka.util.Functional = class {
70
67
  static isNotNull(value) {
71
68
  return value != null;
72
69
  }
73
-
74
- /**
75
- * Calls a factory function while allowing it to be a constructor for
76
- * reverse-compatibility.
77
- *
78
- * @param {function():!T} factory
79
- * @return {!T}
80
- * @template T
81
- */
82
- static callFactory(factory) {
83
- // See https://stackoverflow.com/q/10428603/1208502
84
- // eslint-disable-next-line no-restricted-syntax
85
- const obj = Object.create(factory.prototype || Object.prototype);
86
- // If this is a constructor, call it with our newly created object to
87
- // initialize it; if this isn't a constructor, the "this" shouldn't be used
88
- // since it should be "undefined".
89
- let ret;
90
- try {
91
- ret = factory.call(obj); // eslint-disable-line no-restricted-syntax
92
-
93
- // If it didn't return anything, assume it is a constructor and return our
94
- // "this" value instead.
95
- if (!ret) {
96
- shaka.Deprecate.deprecateFeature(4,
97
- 'Factories requiring new',
98
- 'Factories should be plain functions');
99
- ret = obj;
100
- }
101
- } catch (e) {
102
- // This was an ES6 class, so it threw a TypeError because we didn't use
103
- // "new". Fall back to actually using "new".
104
- shaka.Deprecate.deprecateFeature(4,
105
- 'Factories requiring new',
106
- 'Factories should be plain functions');
107
- const FactoryAsClass = /** @type {function(new: T)} */(factory);
108
- ret = new FactoryAsClass();
109
- }
110
- return ret;
111
- }
112
70
  };
@@ -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
  };
@@ -11,6 +11,7 @@ goog.require('shaka.media.Transmuxer');
11
11
 
12
12
  /**
13
13
  * @summary A set of utility functions for dealing with MIME types.
14
+ * @export
14
15
  */
15
16
  shaka.util.MimeUtils = class {
16
17
  /**
@@ -20,6 +21,7 @@ shaka.util.MimeUtils = class {
20
21
  * @param {string} mimeType
21
22
  * @param {string=} codecs
22
23
  * @return {string}
24
+ * @export
23
25
  */
24
26
  static getFullType(mimeType, codecs) {
25
27
  let fullMimeType = mimeType;
@@ -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,