shaka-player 4.6.3 → 4.7.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 (608) hide show
  1. package/README.md +1 -0
  2. package/dist/controls.css +1 -1
  3. package/dist/controls.css.map +1 -1
  4. package/dist/deps.js +13 -9
  5. package/dist/locales.js +33 -33
  6. package/dist/shaka-player.compiled.d.ts +47 -4
  7. package/dist/shaka-player.compiled.debug.d.ts +47 -4
  8. package/dist/shaka-player.compiled.debug.externs.js +50 -2
  9. package/dist/shaka-player.compiled.debug.js +408 -376
  10. package/dist/shaka-player.compiled.debug.map +4 -4
  11. package/dist/shaka-player.compiled.externs.js +50 -2
  12. package/dist/shaka-player.compiled.js +1134 -1118
  13. package/dist/shaka-player.compiled.map +4 -4
  14. package/dist/shaka-player.ui.d.ts +69 -5
  15. package/dist/shaka-player.ui.debug.d.ts +69 -5
  16. package/dist/shaka-player.ui.debug.externs.js +82 -2
  17. package/dist/shaka-player.ui.debug.js +457 -420
  18. package/dist/shaka-player.ui.debug.map +4 -4
  19. package/dist/shaka-player.ui.externs.js +82 -2
  20. package/dist/shaka-player.ui.js +1305 -1289
  21. package/dist/shaka-player.ui.map +4 -4
  22. package/externs/mediasession.js +7 -0
  23. package/externs/shaka/abr_manager.js +8 -0
  24. package/externs/shaka/manifest.js +3 -3
  25. package/externs/shaka/player.js +59 -4
  26. package/lib/abr/simple_abr_manager.js +41 -15
  27. package/lib/ads/client_side_ad_manager.js +4 -0
  28. package/lib/ads/media_tailor_ad_manager.js +5 -0
  29. package/lib/ads/server_side_ad_manager.js +4 -0
  30. package/lib/cea/cea708_service.js +1 -1
  31. package/lib/cea/cea708_window.js +95 -7
  32. package/lib/dash/dash_parser.js +55 -11
  33. package/lib/hls/hls_parser.js +17 -5
  34. package/lib/media/adaptation_set_criteria.js +76 -10
  35. package/lib/media/drm_engine.js +0 -3
  36. package/lib/media/media_source_engine.js +42 -18
  37. package/lib/media/segment_reference.js +12 -0
  38. package/lib/media/streaming_engine.js +58 -5
  39. package/lib/media/video_wrapper.js +4 -3
  40. package/lib/player.js +95 -11
  41. package/lib/text/simple_text_displayer.js +8 -7
  42. package/lib/text/text_utils.js +39 -13
  43. package/lib/text/ui_text_displayer.js +20 -11
  44. package/lib/text/web_vtt_generator.js +1 -1
  45. package/lib/util/cmsd_manager.js +269 -0
  46. package/lib/util/content_steering_manager.js +5 -1
  47. package/lib/util/mime_utils.js +6 -2
  48. package/lib/util/periods.js +108 -39
  49. package/lib/util/player_configuration.js +19 -5
  50. package/lib/util/stream_utils.js +82 -13
  51. package/package.json +1 -1
  52. package/ui/audio_language_selection.js +3 -0
  53. package/ui/controls.js +60 -0
  54. package/ui/externs/ui.js +12 -1
  55. package/ui/hidden_fast_forward_button.js +32 -0
  56. package/ui/hidden_rewind_button.js +32 -0
  57. package/ui/hidden_seek_button.js +121 -0
  58. package/ui/less/buttons.less +50 -0
  59. package/ui/less/containers.less +18 -0
  60. package/ui/resolution_selection.js +2 -0
  61. package/ui/ui.js +2 -0
  62. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -75
  63. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -26
  64. package/.github/ISSUE_TEMPLATE/question.md +0 -26
  65. package/.github/config.yml +0 -1
  66. package/.github/workflows/appspot.yaml +0 -39
  67. package/.github/workflows/build-and-test.yaml +0 -222
  68. package/.github/workflows/compute-incremental-coverage.py +0 -265
  69. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +0 -56
  70. package/.github/workflows/custom-actions/set-commit-status/action.yaml +0 -37
  71. package/.github/workflows/deflake.yaml +0 -31
  72. package/.github/workflows/demo-version-index.yaml +0 -43
  73. package/.github/workflows/nightly-demo.yaml +0 -42
  74. package/.github/workflows/release-please.yaml +0 -193
  75. package/.github/workflows/report-incremental-coverage.yaml +0 -39
  76. package/.github/workflows/safari-homedir-launcher.sh +0 -18
  77. package/.github/workflows/selenium-lab-tests.yaml +0 -370
  78. package/.github/workflows/shaka-bot-commands/command-help.sh +0 -27
  79. package/.github/workflows/shaka-bot-commands/command-test.sh +0 -56
  80. package/.github/workflows/shaka-bot-commands/lib.sh +0 -83
  81. package/.github/workflows/shaka-bot-commands/main.sh +0 -51
  82. package/.github/workflows/sync-labels.yaml +0 -33
  83. package/.github/workflows/talk-to-shaka-bot.yaml +0 -29
  84. package/.github/workflows/update-issues.yaml +0 -31
  85. package/.github/workflows/update-screenshots.yaml +0 -142
  86. package/.github/workflows/validate-pr-title.yaml +0 -27
  87. package/CHANGELOG.md +0 -5764
  88. package/CODE_OF_CONDUCT.md +0 -93
  89. package/CONTRIBUTING.md +0 -76
  90. package/demo/TengwarTelcontar.woff2 +0 -0
  91. package/demo/app_logo_144.png +0 -0
  92. package/demo/app_logo_192.png +0 -0
  93. package/demo/app_logo_256.png +0 -0
  94. package/demo/app_logo_384.png +0 -0
  95. package/demo/app_logo_512.png +0 -0
  96. package/demo/app_manifest.json +0 -29
  97. package/demo/asset_card.js +0 -410
  98. package/demo/autoTemplate.txt +0 -61
  99. package/demo/cast_receiver/idle1.jpg +0 -0
  100. package/demo/cast_receiver/idle2.jpg +0 -0
  101. package/demo/cast_receiver/idle3.jpg +0 -0
  102. package/demo/cast_receiver/index.html +0 -75
  103. package/demo/cast_receiver/receiver_app.css +0 -111
  104. package/demo/cast_receiver/receiver_app.js +0 -158
  105. package/demo/close_button.js +0 -60
  106. package/demo/common/asset.js +0 -511
  107. package/demo/common/assets.js +0 -1635
  108. package/demo/config.js +0 -859
  109. package/demo/custom.js +0 -907
  110. package/demo/customWarning.txt +0 -8
  111. package/demo/demo.less +0 -591
  112. package/demo/demo_uncompiled.js +0 -11
  113. package/demo/demo_utils.js +0 -113
  114. package/demo/favicon.ico +0 -0
  115. package/demo/front.js +0 -156
  116. package/demo/icons/README.md +0 -4
  117. package/demo/icons/baseline-audiotrack-24px.svg +0 -1
  118. package/demo/icons/baseline-closed_caption-24px.svg +0 -1
  119. package/demo/icons/baseline-fast_forward-24px.svg +0 -1
  120. package/demo/icons/baseline-language-24px.svg +0 -1
  121. package/demo/icons/baseline-live_tv-24px.svg +0 -1
  122. package/demo/icons/baseline-subtitles-24px.svg +0 -1
  123. package/demo/icons/baseline-surround_sound-24px.svg +0 -1
  124. package/demo/icons/custom_ad.svg +0 -1
  125. package/demo/icons/custom_box_with_text.svg +0 -1
  126. package/demo/icons/custom_clear_key.svg +0 -1
  127. package/demo/icons/custom_high_definition.svg +0 -1
  128. package/demo/icons/custom_playready.svg +0 -1
  129. package/demo/icons/custom_ultra_high_definition.svg +0 -1
  130. package/demo/icons/custom_widevine.svg +0 -1
  131. package/demo/index.html +0 -173
  132. package/demo/input.js +0 -270
  133. package/demo/input_container.js +0 -218
  134. package/demo/load.js +0 -156
  135. package/demo/main.js +0 -1854
  136. package/demo/search.js +0 -452
  137. package/demo/service_worker.js +0 -355
  138. package/demo/shaka_logo_trans.png +0 -0
  139. package/demo/tooltip.js +0 -29
  140. package/demo/visualizer.js +0 -335
  141. package/demo/visualizer_button.js +0 -84
  142. package/dist/demo.compiled.debug.js +0 -340
  143. package/dist/demo.compiled.debug.map +0 -8
  144. package/dist/demo.compiled.js +0 -340
  145. package/dist/demo.compiled.map +0 -8
  146. package/dist/demo.css +0 -6
  147. package/dist/demo.css.map +0 -1
  148. package/dist/receiver.compiled.debug.js +0 -187
  149. package/dist/receiver.compiled.debug.map +0 -8
  150. package/dist/receiver.compiled.js +0 -187
  151. package/dist/receiver.compiled.map +0 -8
  152. package/docs/announcement-list-join-group.png +0 -0
  153. package/docs/api-mainpage.md +0 -28
  154. package/docs/design/REDESIGN.md +0 -283
  155. package/docs/design/architecture.md +0 -13
  156. package/docs/design/bg-fetch-after.gv +0 -29
  157. package/docs/design/bg-fetch-after.gv.png +0 -0
  158. package/docs/design/bg-fetch-before.gv +0 -18
  159. package/docs/design/bg-fetch-before.gv.png +0 -0
  160. package/docs/design/bg-fetch.md +0 -134
  161. package/docs/design/cast.gv +0 -35
  162. package/docs/design/cast.gv.png +0 -0
  163. package/docs/design/chromecast.md +0 -151
  164. package/docs/design/codec_preferences.md +0 -158
  165. package/docs/design/dash-audio-channels.md +0 -123
  166. package/docs/design/dash-manifests.md +0 -248
  167. package/docs/design/dash-timeline.svg +0 -4
  168. package/docs/design/dataflow.gv +0 -66
  169. package/docs/design/dataflow.gv.png +0 -0
  170. package/docs/design/export.md +0 -70
  171. package/docs/design/fuzzy-locale-matching.md +0 -40
  172. package/docs/design/gap-jumping.md +0 -151
  173. package/docs/design/lcevc-architecture.png +0 -0
  174. package/docs/design/lcevc-demo.png +0 -0
  175. package/docs/design/lcevc-integration.md +0 -72
  176. package/docs/design/locale_compatibility.svg +0 -1
  177. package/docs/design/locales_tree.svg +0 -1
  178. package/docs/design/localization-design-principles.md +0 -158
  179. package/docs/design/newdemo.gv +0 -83
  180. package/docs/design/newdemo.gv.png +0 -0
  181. package/docs/design/offline.gv +0 -43
  182. package/docs/design/offline.gv.png +0 -0
  183. package/docs/design/offline.md +0 -153
  184. package/docs/design/ownership.gv +0 -76
  185. package/docs/design/ownership.gv.png +0 -0
  186. package/docs/design/preload.md +0 -299
  187. package/docs/design/preload.png +0 -0
  188. package/docs/design/talking-about-languages.md +0 -46
  189. package/docs/design/timeline.svg +0 -152
  190. package/docs/design/ui.md +0 -31
  191. package/docs/design/ui_player_relationships.svg +0 -1
  192. package/docs/jsdoc-plugin.js +0 -74
  193. package/docs/jsdoc-template/README.md +0 -1
  194. package/docs/jsdoc-template/publish.js +0 -879
  195. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.eot +0 -0
  196. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.svg +0 -1830
  197. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.woff +0 -0
  198. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  199. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
  200. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  201. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.eot +0 -0
  202. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.svg +0 -1830
  203. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.woff +0 -0
  204. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.eot +0 -0
  205. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.svg +0 -1831
  206. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.woff +0 -0
  207. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  208. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
  209. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  210. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.eot +0 -0
  211. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.svg +0 -1831
  212. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.woff +0 -0
  213. package/docs/jsdoc-template/static/scripts/linenumber.js +0 -44
  214. package/docs/jsdoc-template/static/scripts/show-widget.js +0 -55
  215. package/docs/jsdoc-template/static/styles/jsdoc-default.css +0 -438
  216. package/docs/jsdoc-template/tmpl/augments.tmpl +0 -10
  217. package/docs/jsdoc-template/tmpl/container.tmpl +0 -205
  218. package/docs/jsdoc-template/tmpl/details.tmpl +0 -152
  219. package/docs/jsdoc-template/tmpl/example.tmpl +0 -2
  220. package/docs/jsdoc-template/tmpl/examples.tmpl +0 -13
  221. package/docs/jsdoc-template/tmpl/exceptions.tmpl +0 -32
  222. package/docs/jsdoc-template/tmpl/layout.tmpl +0 -50
  223. package/docs/jsdoc-template/tmpl/mainpage.tmpl +0 -14
  224. package/docs/jsdoc-template/tmpl/members.tmpl +0 -47
  225. package/docs/jsdoc-template/tmpl/method.tmpl +0 -140
  226. package/docs/jsdoc-template/tmpl/modifies.tmpl +0 -14
  227. package/docs/jsdoc-template/tmpl/params.tmpl +0 -131
  228. package/docs/jsdoc-template/tmpl/properties.tmpl +0 -125
  229. package/docs/jsdoc-template/tmpl/returns.tmpl +0 -19
  230. package/docs/jsdoc-template/tmpl/source.tmpl +0 -8
  231. package/docs/jsdoc-template/tmpl/tutorial.tmpl +0 -21
  232. package/docs/jsdoc-template/tmpl/type.tmpl +0 -7
  233. package/docs/jsdoc.conf.json +0 -38
  234. package/docs/shaka-player-logo.png +0 -0
  235. package/docs/style.md +0 -174
  236. package/docs/tutorials/a11y.md +0 -64
  237. package/docs/tutorials/ad_monetization.md +0 -292
  238. package/docs/tutorials/application-level-redirects.md +0 -94
  239. package/docs/tutorials/architecture.md +0 -32
  240. package/docs/tutorials/basic-usage.md +0 -89
  241. package/docs/tutorials/blob-url.md +0 -15
  242. package/docs/tutorials/config.md +0 -148
  243. package/docs/tutorials/debugging.md +0 -189
  244. package/docs/tutorials/drm-config.md +0 -274
  245. package/docs/tutorials/errors.md +0 -95
  246. package/docs/tutorials/fairplay.md +0 -242
  247. package/docs/tutorials/faq.md +0 -252
  248. package/docs/tutorials/index.json +0 -29
  249. package/docs/tutorials/lcevc.md +0 -118
  250. package/docs/tutorials/license-server-auth.md +0 -248
  251. package/docs/tutorials/license-wrapping.md +0 -168
  252. package/docs/tutorials/manifest-parser.md +0 -365
  253. package/docs/tutorials/network-and-buffering-config.md +0 -119
  254. package/docs/tutorials/offline.md +0 -683
  255. package/docs/tutorials/plugins.md +0 -184
  256. package/docs/tutorials/selenium-grid-config.md +0 -174
  257. package/docs/tutorials/service-worker.md +0 -106
  258. package/docs/tutorials/ui-customization.md +0 -288
  259. package/docs/tutorials/ui.md +0 -230
  260. package/docs/tutorials/upgrade-manifest.md +0 -281
  261. package/docs/tutorials/upgrade.md +0 -104
  262. package/docs/tutorials/welcome.md +0 -108
  263. package/docs/tutorials/widevine-service-certs.md +0 -45
  264. package/karma.conf.js +0 -879
  265. package/maintained-branches.md +0 -15
  266. package/roadmap.md +0 -186
  267. package/test/abr/simple_abr_manager_unit.js +0 -398
  268. package/test/ads/ad_manager_unit.js +0 -260
  269. package/test/assumptions/uint8_array_unit.js +0 -22
  270. package/test/cast/cast_proxy_unit.js +0 -736
  271. package/test/cast/cast_receiver_integration.js +0 -488
  272. package/test/cast/cast_receiver_unit.js +0 -1183
  273. package/test/cast/cast_sender_unit.js +0 -973
  274. package/test/cast/cast_utils_unit.js +0 -311
  275. package/test/cea/cea608_memory_unit.js +0 -411
  276. package/test/cea/cea708_service_unit.js +0 -674
  277. package/test/cea/cea708_window_unit.js +0 -373
  278. package/test/cea/cea_decoder_unit.js +0 -615
  279. package/test/cea/dtvcc_packet_builder_unit.js +0 -158
  280. package/test/cea/dtvcc_packet_unit.js +0 -60
  281. package/test/cea/mp4_cea_parser_unit.js +0 -127
  282. package/test/codec_switching/codec_switching_integration.js +0 -182
  283. package/test/dash/dash_parser_content_protection_unit.js +0 -998
  284. package/test/dash/dash_parser_integration.js +0 -74
  285. package/test/dash/dash_parser_live_unit.js +0 -1542
  286. package/test/dash/dash_parser_manifest_unit.js +0 -3121
  287. package/test/dash/dash_parser_segment_base_unit.js +0 -421
  288. package/test/dash/dash_parser_segment_list_unit.js +0 -380
  289. package/test/dash/dash_parser_segment_template_unit.js +0 -910
  290. package/test/dash/mpd_utils_unit.js +0 -794
  291. package/test/demo/demo_unit.js +0 -108
  292. package/test/deprecate/enforcer_unit.js +0 -74
  293. package/test/deprecate/version_unit.js +0 -57
  294. package/test/hls/hls_live_unit.js +0 -1330
  295. package/test/hls/hls_parser_unit.js +0 -5276
  296. package/test/hls/manifest_text_parser_unit.js +0 -545
  297. package/test/media/adaptation_set_criteria_unit.js +0 -806
  298. package/test/media/adaptation_set_unit.js +0 -229
  299. package/test/media/buffering_observer_unit.js +0 -143
  300. package/test/media/closed_caption_parser_unit.js +0 -18
  301. package/test/media/content_workarounds_unit.js +0 -43
  302. package/test/media/drm_engine_integration.js +0 -356
  303. package/test/media/drm_engine_unit.js +0 -2778
  304. package/test/media/media_source_engine_integration.js +0 -691
  305. package/test/media/media_source_engine_unit.js +0 -1512
  306. package/test/media/mp4_segment_index_parser_unit.js +0 -80
  307. package/test/media/play_rate_controller_unit.js +0 -69
  308. package/test/media/playhead_unit.js +0 -1394
  309. package/test/media/presentation_timeline_unit.js +0 -477
  310. package/test/media/quality_observer_unit.js +0 -138
  311. package/test/media/region_observer_unit.js +0 -374
  312. package/test/media/region_timeline_unit.js +0 -139
  313. package/test/media/segment_index_unit.js +0 -1080
  314. package/test/media/segment_prefetch_unit.js +0 -243
  315. package/test/media/segment_reference_unit.js +0 -63
  316. package/test/media/stall_detector_unit.js +0 -184
  317. package/test/media/streaming_engine_integration.js +0 -632
  318. package/test/media/streaming_engine_unit.js +0 -4211
  319. package/test/media/time_ranges_utils_unit.js +0 -123
  320. package/test/media/webm_segment_index_parser_unit.js +0 -90
  321. package/test/mss/mss_parser_content_protection_unit.js +0 -49
  322. package/test/mss/mss_parser_unit.js +0 -474
  323. package/test/mss/mss_player_integration.js +0 -124
  324. package/test/net/data_uri_plugin_unit.js +0 -105
  325. package/test/net/http_plugin_unit.js +0 -439
  326. package/test/net/networking_engine_unit.js +0 -1236
  327. package/test/net/networking_utils_unit.js +0 -37
  328. package/test/offline/download_progress_estimator_unit.js +0 -90
  329. package/test/offline/indexeddb_storage_unit.js +0 -192
  330. package/test/offline/manifest_convert_unit.js +0 -622
  331. package/test/offline/offline_integration.js +0 -168
  332. package/test/offline/offline_manifest_parser_unit.js +0 -231
  333. package/test/offline/offline_scheme_unit.js +0 -154
  334. package/test/offline/offline_uri_unit.js +0 -59
  335. package/test/offline/storage_compatibility_unit.js +0 -344
  336. package/test/offline/storage_integration.js +0 -1858
  337. package/test/player_external.js +0 -237
  338. package/test/player_integration.js +0 -1371
  339. package/test/player_load_graph_integration.js +0 -865
  340. package/test/player_src_equals_external.js +0 -154
  341. package/test/player_src_equals_integration.js +0 -527
  342. package/test/player_unit.js +0 -4434
  343. package/test/polyfill/media_capabilities_unit.js +0 -277
  344. package/test/polyfill/patchedmediakeys_apple_unit.js +0 -130
  345. package/test/test/assets/3675/chunk-stream0-00001.m4s +0 -0
  346. package/test/test/assets/3675/chunk-stream0-00002.m4s +0 -0
  347. package/test/test/assets/3675/chunk-stream0-00003.m4s +0 -0
  348. package/test/test/assets/3675/chunk-stream0-00004.m4s +0 -0
  349. package/test/test/assets/3675/chunk-stream0-00005.m4s +0 -0
  350. package/test/test/assets/3675/chunk-stream0-00006.m4s +0 -0
  351. package/test/test/assets/3675/chunk-stream0-00007.m4s +0 -0
  352. package/test/test/assets/3675/dash_0.mpd +0 -30
  353. package/test/test/assets/3675/dash_1.mpd +0 -30
  354. package/test/test/assets/3675/dash_2.mpd +0 -30
  355. package/test/test/assets/3675/dash_3.mpd +0 -30
  356. package/test/test/assets/3675/dash_4.mpd +0 -30
  357. package/test/test/assets/3675/dash_5.mpd +0 -26
  358. package/test/test/assets/3675/init-stream0.m4s +0 -0
  359. package/test/test/assets/audio-xhe-aac.mp4 +0 -0
  360. package/test/test/assets/audio.ts +0 -0
  361. package/test/test/assets/captions-test.ts +0 -0
  362. package/test/test/assets/cea-init.mp4 +0 -0
  363. package/test/test/assets/cea-segment.mp4 +0 -0
  364. package/test/test/assets/chapters.srt +0 -11
  365. package/test/test/assets/chapters.vtt +0 -10
  366. package/test/test/assets/chapters2.vtt +0 -10
  367. package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
  368. package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
  369. package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
  370. package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
  371. package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
  372. package/test/test/assets/dash-aes-128/dash.mpd +0 -18
  373. package/test/test/assets/dash-aes-128/license +0 -1
  374. package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
  375. package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
  376. package/test/test/assets/dash-multi-codec/dash.mpd +0 -32
  377. package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
  378. package/test/test/assets/db-dump-v1.json +0 -1
  379. package/test/test/assets/db-dump-v2-broken.json +0 -1
  380. package/test/test/assets/db-dump-v2-clean.json +0 -1
  381. package/test/test/assets/db-dump-v3.json +0 -1
  382. package/test/test/assets/db-dump-v4-broken.json +0 -1
  383. package/test/test/assets/db-dump-v5.json +0 -1
  384. package/test/test/assets/empty_caption_video_init.mp4 +0 -0
  385. package/test/test/assets/empty_caption_video_segment.mp4 +0 -0
  386. package/test/test/assets/encrypted-sintel-audio-init.mp4 +0 -0
  387. package/test/test/assets/encrypted-sintel-audio-segment.mp4 +0 -0
  388. package/test/test/assets/encrypted-sintel-video-init.mp4 +0 -0
  389. package/test/test/assets/encrypted-sintel-video-segment.mp4 +0 -0
  390. package/test/test/assets/green-pixel.mp4 +0 -0
  391. package/test/test/assets/green-pixel.txt +0 -15
  392. package/test/test/assets/h265-cea-init.mp4 +0 -0
  393. package/test/test/assets/h265-cea-segment.mp4 +0 -0
  394. package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
  395. package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
  396. package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
  397. package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
  398. package/test/test/assets/hls-raw-aac/manifest.m3u8 +0 -4
  399. package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +0 -14
  400. package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
  401. package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
  402. package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
  403. package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
  404. package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
  405. package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
  406. package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
  407. package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
  408. package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +0 -31
  409. package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
  410. package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
  411. package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
  412. package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
  413. package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
  414. package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
  415. package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
  416. package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
  417. package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +0 -31
  418. package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +0 -13
  419. package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
  420. package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
  421. package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
  422. package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
  423. package/test/test/assets/hls-raw-mp3/playlist.m3u8 +0 -4
  424. package/test/test/assets/hls-ts-aac/playlist.m3u8 +0 -23
  425. package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
  426. package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
  427. package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
  428. package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
  429. package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
  430. package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
  431. package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
  432. package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
  433. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
  434. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
  435. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
  436. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
  437. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
  438. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
  439. package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +0 -19
  440. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
  441. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
  442. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
  443. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
  444. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
  445. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
  446. package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +0 -19
  447. package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
  448. package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
  449. package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
  450. package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
  451. package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
  452. package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
  453. package/test/test/assets/hls-ts-h264/prog_index.m3u8 +0 -25
  454. package/test/test/assets/hls-ts-h265/0.ts +0 -0
  455. package/test/test/assets/hls-ts-h265/hevc.m3u8 +0 -6
  456. package/test/test/assets/hls-ts-h265/index.m3u8 +0 -7
  457. package/test/test/assets/hls-ts-mp3/manifest.m3u8 +0 -13
  458. package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
  459. package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
  460. package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
  461. package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
  462. package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +0 -17
  463. package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
  464. package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
  465. package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
  466. package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
  467. package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
  468. package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
  469. package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +0 -4
  470. package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
  471. package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
  472. package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +0 -9
  473. package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +0 -24
  474. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
  475. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
  476. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
  477. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
  478. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
  479. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
  480. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
  481. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
  482. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
  483. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
  484. package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +0 -14
  485. package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +0 -23
  486. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
  487. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
  488. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
  489. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
  490. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
  491. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
  492. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
  493. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
  494. package/test/test/assets/id3-metadata.aac +0 -0
  495. package/test/test/assets/id3-metadata.ts +0 -0
  496. package/test/test/assets/index-segment.mp4 +0 -0
  497. package/test/test/assets/index-segment.webm +0 -0
  498. package/test/test/assets/init-segment.webm +0 -0
  499. package/test/test/assets/large_file.mpd +0 -4930
  500. package/test/test/assets/multidrm-audio-init.mp4 +0 -0
  501. package/test/test/assets/multidrm-audio-segment.mp4 +0 -0
  502. package/test/test/assets/multidrm-video-init.mp4 +0 -0
  503. package/test/test/assets/multidrm-video-segment.mp4 +0 -0
  504. package/test/test/assets/multiple-trun-init.mp4 +0 -0
  505. package/test/test/assets/multiple-trun-segment.mp4 +0 -0
  506. package/test/test/assets/sintel-audio-init.mp4 +0 -0
  507. package/test/test/assets/sintel-audio-segment.mp4 +0 -0
  508. package/test/test/assets/sintel-video-init.mp4 +0 -0
  509. package/test/test/assets/sintel-video-segment.mp4 +0 -0
  510. package/test/test/assets/small.mp4 +0 -0
  511. package/test/test/assets/text-clip-alt.vtt +0 -63
  512. package/test/test/assets/text-clip.vtt +0 -63
  513. package/test/test/assets/thumbnails-sprites.vtt +0 -10
  514. package/test/test/assets/thumbnails.vtt +0 -10
  515. package/test/test/assets/ttml-init.mp4 +0 -0
  516. package/test/test/assets/ttml-segment-multiplemdat.mp4 +0 -0
  517. package/test/test/assets/ttml-segment.mp4 +0 -0
  518. package/test/test/assets/video.ts +0 -0
  519. package/test/test/assets/vtt-init.mp4 +0 -0
  520. package/test/test/assets/vtt-segment-multi-payload.mp4 +0 -0
  521. package/test/test/assets/vtt-segment-no-duration.mp4 +0 -0
  522. package/test/test/assets/vtt-segment-settings.mp4 +0 -0
  523. package/test/test/assets/vtt-segment.mp4 +0 -0
  524. package/test/test/boot.js +0 -495
  525. package/test/test/externs/filters.js +0 -44
  526. package/test/test/externs/fontfaceonload.js +0 -29
  527. package/test/test/externs/jasmine.js +0 -670
  528. package/test/test/externs/karma.js +0 -26
  529. package/test/test/externs/require.js +0 -21
  530. package/test/test/externs/sprintf.js +0 -18
  531. package/test/test/namespace.js +0 -10
  532. package/test/test/util/canned_idb.js +0 -379
  533. package/test/test/util/cea_utils.js +0 -60
  534. package/test/test/util/dash_parser_util.js +0 -329
  535. package/test/test/util/fake_ad.js +0 -321
  536. package/test/test/util/fake_ad_manager.js +0 -122
  537. package/test/test/util/fake_demo_main.js +0 -144
  538. package/test/test/util/fake_drm_engine.js +0 -103
  539. package/test/test/util/fake_media_source_engine.js +0 -464
  540. package/test/test/util/fake_networking_engine.js +0 -381
  541. package/test/test/util/fake_segment_prefetch.js +0 -84
  542. package/test/test/util/fake_text_displayer.js +0 -60
  543. package/test/test/util/id3_generator.js +0 -100
  544. package/test/test/util/indexeddb_utils.js +0 -124
  545. package/test/test/util/jasmine_fetch.js +0 -382
  546. package/test/test/util/layout_tests.js +0 -434
  547. package/test/test/util/loader.js +0 -88
  548. package/test/test/util/manifest_generator.js +0 -705
  549. package/test/test/util/manifest_parser_util.js +0 -101
  550. package/test/test/util/mss_parser_util.js +0 -119
  551. package/test/test/util/offline_utils.js +0 -105
  552. package/test/test/util/simple_fakes.js +0 -535
  553. package/test/test/util/stream_generator.js +0 -676
  554. package/test/test/util/streaming_engine_util.js +0 -506
  555. package/test/test/util/test_scheme.js +0 -778
  556. package/test/test/util/ttml_utils.js +0 -77
  557. package/test/test/util/ui_utils.js +0 -183
  558. package/test/test/util/util.js +0 -374
  559. package/test/test/util/waiter.js +0 -406
  560. package/test/text/cue_integration.js +0 -51
  561. package/test/text/lrc_text_parser_unit.js +0 -98
  562. package/test/text/mp4_ttml_parser_unit.js +0 -171
  563. package/test/text/mp4_vtt_parser_unit.js +0 -195
  564. package/test/text/sbv_text_parser_unit.js +0 -81
  565. package/test/text/simple_text_displayer_unit.js +0 -468
  566. package/test/text/srt_text_parser_unit.js +0 -163
  567. package/test/text/ssa_text_parser_unit.js +0 -382
  568. package/test/text/text_displayer_layout_unit.js +0 -323
  569. package/test/text/text_engine_unit.js +0 -500
  570. package/test/text/text_track_integration.js +0 -186
  571. package/test/text/ttml_text_parser_unit.js +0 -2176
  572. package/test/text/ui_text_displayer_unit.js +0 -608
  573. package/test/text/vtt_text_parser_unit.js +0 -1363
  574. package/test/text/web_vtt_generator_unit.js +0 -144
  575. package/test/text/web_vtt_layout_integration.js +0 -524
  576. package/test/transmuxer/transmuxer_engine_integration.js +0 -69
  577. package/test/transmuxer/transmuxer_integration.js +0 -443
  578. package/test/ui/ad_ui_unit.js +0 -369
  579. package/test/ui/localization_unit.js +0 -508
  580. package/test/ui/ui_customization_unit.js +0 -208
  581. package/test/ui/ui_integration.js +0 -669
  582. package/test/ui/ui_unit.js +0 -902
  583. package/test/util/abortable_operation_unit.js +0 -624
  584. package/test/util/array_utils_unit.js +0 -58
  585. package/test/util/buffer_utils_unit.js +0 -185
  586. package/test/util/cmcd_manager_unit.js +0 -440
  587. package/test/util/content_steering_manager_unit.js +0 -427
  588. package/test/util/data_view_reader_unit.js +0 -254
  589. package/test/util/ebml_parser_unit.js +0 -297
  590. package/test/util/event_manager_unit.js +0 -185
  591. package/test/util/fake_event_target_unit.js +0 -123
  592. package/test/util/id3_utils_unit.js +0 -168
  593. package/test/util/iterables_unit.js +0 -68
  594. package/test/util/language_utils_unit.js +0 -240
  595. package/test/util/manifest_parser_utils_unit.js +0 -55
  596. package/test/util/mime_utils_unit.js +0 -64
  597. package/test/util/mp4_box_parsers_unit.js +0 -246
  598. package/test/util/mp4_parser_unit.js +0 -373
  599. package/test/util/multi_map_unit.js +0 -94
  600. package/test/util/object_utils_unit.js +0 -79
  601. package/test/util/periods_unit.js +0 -1623
  602. package/test/util/pssh_unit.js +0 -226
  603. package/test/util/state_history_unit.js +0 -101
  604. package/test/util/stream_utils_unit.js +0 -1068
  605. package/test/util/string_utils_unit.js +0 -166
  606. package/test/util/text_parser_unit.js +0 -165
  607. package/test/util/ts_parser_unit.js +0 -77
  608. package/test/util/xml_utils_unit.js +0 -444
@@ -32,6 +32,13 @@ const MediaSession = class {
32
32
  /** @type {?MediaMetadata} */
33
33
  this.metadata;
34
34
  }
35
+
36
+ setActionHandler(type, callback) {
37
+ /** @type {string} */
38
+ this.type = type;
39
+ /** @type {!function(!{action: string, seekOffset: ?number})} */
40
+ this.callback = callback;
41
+ }
35
42
  };
36
43
 
37
44
 
@@ -121,6 +121,14 @@ shaka.extern.AbrManager = class {
121
121
  */
122
122
  setMediaElement(mediaElement) {}
123
123
 
124
+ /**
125
+ * Set CMSD manager.
126
+ *
127
+ * @param {shaka.util.CmsdManager} cmsdManager
128
+ * @exportDoc
129
+ */
130
+ setCmsdManager(cmsdManager) {}
131
+
124
132
  /**
125
133
  * Sets the ABR configuration.
126
134
  *
@@ -158,7 +158,7 @@ shaka.extern.InitDataOverride;
158
158
  * }}
159
159
  *
160
160
  * @description
161
- * Maximum and minimun latency and playback rate for a manifest. When max
161
+ * Maximum and minimum latency and playback rate for a manifest. When max
162
162
  * latency is reached playbackrate is updated to maxPlaybackRate to decrease
163
163
  * latency. When min latency is reached playbackrate is updated to
164
164
  * minPlaybackRate to increase latency.
@@ -169,9 +169,9 @@ shaka.extern.InitDataOverride;
169
169
  * @property {?number} maxPlaybackRate
170
170
  * Maximum playback rate.
171
171
  * @property {?number} minLatency
172
- * Minimun latency in seconds.
172
+ * Minimum latency in seconds.
173
173
  * @property {?number} minPlaybackRate
174
- * Minimun playback rate.
174
+ * Minimum playback rate.
175
175
  *
176
176
  * @exportDoc
177
177
  */
@@ -855,7 +855,8 @@ shaka.extern.InitDataTransform;
855
855
  * keySystemsByURI: !Object.<string, string>,
856
856
  * manifestPreprocessor: function(!Element),
857
857
  * sequenceMode: boolean,
858
- * enableAudioGroups: boolean
858
+ * enableAudioGroups: boolean,
859
+ * multiTypeVariantsAllowed: boolean
859
860
  * }}
860
861
  *
861
862
  * @property {string} clockSyncUri
@@ -917,6 +918,16 @@ shaka.extern.InitDataTransform;
917
918
  * If set, audio streams will be grouped and filtered by their parent
918
919
  * adaptation set ID.
919
920
  * <i>Defaults to <code>false</code>.</i>
921
+ * @property {boolean} multiTypeVariantsAllowed
922
+ * If true, the manifest parser will create variants that have multiple
923
+ * mimeTypes or codecs for video or for audio if there is no other choice.
924
+ * Meant for content where some periods are only available in one mimeType or
925
+ * codec, and other periods are only available in a different mimeType or
926
+ * codec. For example, a stream with baked-in ads where the audio codec does
927
+ * not match the main content.
928
+ * Might result in undesirable behavior if mediaSource.codecSwitchingStrategy
929
+ * is not set to SMOOTH.
930
+ * Defaults to true if SMOOTH codec switching is supported, RELOAD overwise.
920
931
  * @exportDoc
921
932
  */
922
933
  shaka.extern.DashManifestConfiguration;
@@ -1123,7 +1134,9 @@ shaka.extern.ManifestConfiguration;
1123
1134
  * liveSyncMaxLatency: number,
1124
1135
  * liveSyncPlaybackRate: number,
1125
1136
  * liveSyncMinLatency: number,
1126
- * liveSyncMinPlaybackRate: number
1137
+ * liveSyncMinPlaybackRate: number,
1138
+ * allowMediaSourceRecoveries: boolean,
1139
+ * minTimeBetweenRecoveries: number
1127
1140
  * }}
1128
1141
  *
1129
1142
  * @description
@@ -1253,12 +1266,19 @@ shaka.extern.ManifestConfiguration;
1253
1266
  * between 1 and 2. Effective only if liveSync is true. Defaults to
1254
1267
  * <code>1.1</code>.
1255
1268
  * @property {number} liveSyncMinLatency
1256
- * Minimun acceptable latency, in seconds. Effective only if liveSync is
1269
+ * Minimum acceptable latency, in seconds. Effective only if liveSync is
1257
1270
  * true. Defaults to <code>0</code>.
1258
1271
  * @property {number} liveSyncMinPlaybackRate
1259
- * Minimun playback rate used for latency chasing. It is recommended to use a
1272
+ * Minimum playback rate used for latency chasing. It is recommended to use a
1260
1273
  * value between 0 and 1. Effective only if liveSync is true. Defaults to
1261
1274
  * <code>1</code>.
1275
+ * @property {boolean} allowMediaSourceRecoveries
1276
+ * Indicate if we should recover from VIDEO_ERROR resetting Media Source.
1277
+ * Defaults to <code>true</code>.
1278
+ * @property {number} minTimeBetweenRecoveries
1279
+ * The minimum time between recoveries when VIDEO_ERROR is reached, in
1280
+ * seconds.
1281
+ * Defaults to <code>5</code>.
1262
1282
  * @exportDoc
1263
1283
  */
1264
1284
  shaka.extern.StreamingConfiguration;
@@ -1459,6 +1479,32 @@ shaka.extern.AdvancedAbrConfiguration;
1459
1479
  */
1460
1480
  shaka.extern.CmcdConfiguration;
1461
1481
 
1482
+
1483
+ /**
1484
+ * @typedef {{
1485
+ * enabled: boolean,
1486
+ * applyMaximumSuggestedBitrate: boolean,
1487
+ * estimatedThroughputWeightRatio: number
1488
+ * }}
1489
+ *
1490
+ * @description
1491
+ * Common Media Server Data (CMSD) configuration.
1492
+ *
1493
+ * @property {boolean} enabled
1494
+ * If <code>true</code>, enables reading CMSD data in media requests.
1495
+ * Defaults to <code>true</code>.
1496
+ * @property {boolean} applyMaximumSuggestedBitrate
1497
+ * If true, we must apply the maximum suggested bitrate. If false, we ignore
1498
+ * this.
1499
+ * Defaults to <code>true</code>.
1500
+ * @property {number} estimatedThroughputWeightRatio
1501
+ * How much the estimatedThroughput of the CMSD data should be weighted
1502
+ * against the default estimate, between 0 and 1.
1503
+ * Defaults to <code>0.5</code>.
1504
+ * @exportDoc
1505
+ */
1506
+ shaka.extern.CmsdConfiguration;
1507
+
1462
1508
  /**
1463
1509
  * @typedef {{
1464
1510
  * enabled: boolean,
@@ -1554,6 +1600,7 @@ shaka.extern.OfflineConfiguration;
1554
1600
  * abrFactory: shaka.extern.AbrManager.Factory,
1555
1601
  * abr: shaka.extern.AbrConfiguration,
1556
1602
  * cmcd: shaka.extern.CmcdConfiguration,
1603
+ * cmsd: shaka.extern.CmsdConfiguration,
1557
1604
  * lcevc: shaka.extern.LcevcConfiguration,
1558
1605
  * offline: shaka.extern.OfflineConfiguration,
1559
1606
  * preferredAudioLanguage: string,
@@ -1566,8 +1613,10 @@ shaka.extern.OfflineConfiguration;
1566
1613
  * preferredAudioChannelCount: number,
1567
1614
  * preferredVideoHdrLevel: string,
1568
1615
  * preferredVideoLayout: string,
1616
+ * preferredVideoLabel: string,
1569
1617
  * preferredDecodingAttributes: !Array.<string>,
1570
1618
  * preferForcedSubs: boolean,
1619
+ * preferSpatialAudio: boolean,
1571
1620
  * restrictions: shaka.extern.Restrictions,
1572
1621
  * playRangeStart: number,
1573
1622
  * playRangeEnd: number,
@@ -1592,6 +1641,8 @@ shaka.extern.OfflineConfiguration;
1592
1641
  * ABR configuration and settings.
1593
1642
  * @property {shaka.extern.CmcdConfiguration} cmcd
1594
1643
  * CMCD configuration and settings. (Common Media Client Data)
1644
+ * @property {shaka.extern.CmsdConfiguration} cmsd
1645
+ * CMSD configuration and settings. (Common Media Server Data)
1595
1646
  * @property {shaka.extern.LcevcConfiguration} lcevc
1596
1647
  * MPEG-5 LCEVC configuration and settings.
1597
1648
  * (Low Complexity Enhancement Video Codec)
@@ -1603,6 +1654,8 @@ shaka.extern.OfflineConfiguration;
1603
1654
  * Changing this during playback will not affect the current playback.
1604
1655
  * @property {string} preferredAudioLabel
1605
1656
  * The preferred label to use for audio tracks
1657
+ * @property {string} preferredVideoLabel
1658
+ * The preferred label to use for video tracks
1606
1659
  * @property {string} preferredTextLanguage
1607
1660
  * The preferred language to use for text tracks. If a matching text track
1608
1661
  * is found, and the selected audio and text tracks have different languages,
@@ -1640,6 +1693,8 @@ shaka.extern.OfflineConfiguration;
1640
1693
  * If the content has no forced captions and the value is true,
1641
1694
  * no text track is chosen.
1642
1695
  * Changing this during playback will not affect the current playback.
1696
+ * @property {boolean} preferSpatialAudio
1697
+ * If true, a spatial audio track is preferred. Defaults to false.
1643
1698
  * @property {shaka.extern.Restrictions} restrictions
1644
1699
  * The application restrictions to apply to the tracks. These are "hard"
1645
1700
  * restrictions. Any track that fails to meet these restrictions will not
@@ -13,6 +13,8 @@ goog.require('shaka.log');
13
13
  goog.require('shaka.util.StreamUtils');
14
14
  goog.require('shaka.util.Timer');
15
15
 
16
+ goog.requireType('shaka.util.CmsdManager');
17
+
16
18
 
17
19
  /**
18
20
  * @summary
@@ -112,6 +114,9 @@ shaka.abr.SimpleAbrManager = class {
112
114
  }
113
115
  }
114
116
  });
117
+
118
+ /** @private {?shaka.util.CmsdManager} */
119
+ this.cmsdManager_ = null;
115
120
  }
116
121
 
117
122
 
@@ -134,6 +139,8 @@ shaka.abr.SimpleAbrManager = class {
134
139
 
135
140
  this.resizeObserverTimer_.stop();
136
141
 
142
+ this.cmsdManager_ = null;
143
+
137
144
  // Don't reset |startupComplete_|: if we've left the startup interval, we
138
145
  // can start using bandwidth estimates right away after init() is called.
139
146
  }
@@ -171,8 +178,6 @@ shaka.abr.SimpleAbrManager = class {
171
178
  * @export
172
179
  */
173
180
  chooseVariant(preferFastSwitching = false) {
174
- const SimpleAbrManager = shaka.abr.SimpleAbrManager;
175
-
176
181
  let maxHeight = Infinity;
177
182
  let maxWidth = Infinity;
178
183
 
@@ -208,12 +213,12 @@ shaka.abr.SimpleAbrManager = class {
208
213
  }
209
214
 
210
215
  // Get sorted Variants.
211
- let sortedVariants = SimpleAbrManager.filterAndSortVariants_(
216
+ let sortedVariants = this.filterAndSortVariants_(
212
217
  this.config_.restrictions, variants,
213
218
  /* maxHeight= */ Infinity, /* maxWidth= */ Infinity);
214
219
 
215
220
  if (maxHeight != Infinity || maxWidth != Infinity) {
216
- const resolutions = SimpleAbrManager.getResolutionList_(sortedVariants);
221
+ const resolutions = this.getResolutionList_(sortedVariants);
217
222
  for (const resolution of resolutions) {
218
223
  if (resolution.height >= maxHeight && resolution.width >= maxWidth) {
219
224
  maxHeight = resolution.height;
@@ -222,13 +227,11 @@ shaka.abr.SimpleAbrManager = class {
222
227
  }
223
228
  }
224
229
 
225
- sortedVariants = SimpleAbrManager.filterAndSortVariants_(
230
+ sortedVariants = this.filterAndSortVariants_(
226
231
  this.config_.restrictions, variants, maxHeight, maxWidth);
227
232
  }
228
233
 
229
- const defaultBandwidthEstimate = this.getDefaultBandwidth_();
230
- const currentBandwidth = this.bandwidthEstimator_.getBandwidthEstimate(
231
- defaultBandwidthEstimate);
234
+ const currentBandwidth = this.getBandwidthEstimate();
232
235
 
233
236
  if (variants.length && !sortedVariants.length) {
234
237
  // If we couldn't meet the ABR restrictions, we should still play
@@ -238,7 +241,7 @@ shaka.abr.SimpleAbrManager = class {
238
241
  // restrictions and keep just the first (lowest-bandwidth) one.
239
242
  shaka.log.warning('No variants met the ABR restrictions. ' +
240
243
  'Choosing a variant by lowest bandwidth.');
241
- sortedVariants = SimpleAbrManager.filterAndSortVariants_(
244
+ sortedVariants = this.filterAndSortVariants_(
242
245
  /* restrictions= */ null, variants,
243
246
  /* maxHeight= */ Infinity, /* maxWidth= */ Infinity);
244
247
  sortedVariants = [sortedVariants[0]];
@@ -323,8 +326,12 @@ shaka.abr.SimpleAbrManager = class {
323
326
  */
324
327
  getBandwidthEstimate() {
325
328
  const defaultBandwidthEstimate = this.getDefaultBandwidth_();
326
- return this.bandwidthEstimator_.getBandwidthEstimate(
329
+ const bandwidthEstimate = this.bandwidthEstimator_.getBandwidthEstimate(
327
330
  defaultBandwidthEstimate);
331
+ if (this.cmsdManager_) {
332
+ return this.cmsdManager_.getBandwidthEstimate(bandwidthEstimate);
333
+ }
334
+ return bandwidthEstimate;
328
335
  }
329
336
 
330
337
 
@@ -368,6 +375,15 @@ shaka.abr.SimpleAbrManager = class {
368
375
  }
369
376
 
370
377
 
378
+ /**
379
+ * @override
380
+ * @export
381
+ */
382
+ setCmsdManager(cmsdManager) {
383
+ this.cmsdManager_ = cmsdManager;
384
+ }
385
+
386
+
371
387
  /**
372
388
  * @override
373
389
  * @export
@@ -408,9 +424,7 @@ shaka.abr.SimpleAbrManager = class {
408
424
  }
409
425
 
410
426
  const chosenVariant = this.chooseVariant();
411
- const defaultBandwidthEstimate = this.getDefaultBandwidth_();
412
- const bandwidthEstimate = this.bandwidthEstimator_.getBandwidthEstimate(
413
- defaultBandwidthEstimate);
427
+ const bandwidthEstimate = this.getBandwidthEstimate();
414
428
  const currentBandwidthKbps = Math.round(bandwidthEstimate / 1000.0);
415
429
 
416
430
  if (chosenVariant) {
@@ -452,7 +466,19 @@ shaka.abr.SimpleAbrManager = class {
452
466
  * |restrictions| and sorted in ascending order of bandwidth.
453
467
  * @private
454
468
  */
455
- static filterAndSortVariants_(restrictions, variants, maxHeight, maxWidth) {
469
+ filterAndSortVariants_(restrictions, variants, maxHeight, maxWidth) {
470
+ if (this.cmsdManager_) {
471
+ const maxBitrate = this.cmsdManager_.getMaxBitrate();
472
+ if (maxBitrate) {
473
+ variants = variants.filter((variant) => {
474
+ if (!variant.bandwidth || !maxBitrate) {
475
+ return true;
476
+ }
477
+ return variant.bandwidth <= maxBitrate;
478
+ });
479
+ }
480
+ }
481
+
456
482
  if (restrictions) {
457
483
  variants = variants.filter((variant) => {
458
484
  // This was already checked in another scope, but the compiler doesn't
@@ -475,7 +501,7 @@ shaka.abr.SimpleAbrManager = class {
475
501
  * @return {!Array.<{height: number, width: number}>}
476
502
  * @private
477
503
  */
478
- static getResolutionList_(variants) {
504
+ getResolutionList_(variants) {
479
505
  const resolutions = [];
480
506
  for (const variant of variants) {
481
507
  const video = variant.video;
@@ -13,6 +13,10 @@ goog.provide('shaka.ads.ClientSideAdManager');
13
13
 
14
14
  goog.require('goog.asserts');
15
15
  goog.require('shaka.ads.ClientSideAd');
16
+ goog.require('shaka.log');
17
+ goog.require('shaka.util.Dom');
18
+ goog.require('shaka.util.EventManager');
19
+ goog.require('shaka.util.FakeEvent');
16
20
  goog.require('shaka.util.IReleasable');
17
21
 
18
22
  /**
@@ -15,7 +15,12 @@ goog.require('goog.asserts');
15
15
  goog.require('shaka.ads.MediaTailorAd');
16
16
  goog.require('shaka.log');
17
17
  goog.require('shaka.net.NetworkingEngine');
18
+ goog.require('goog.Uri');
19
+ goog.require('shaka.util.EventManager');
20
+ goog.require('shaka.util.Error');
21
+ goog.require('shaka.util.FakeEvent');
18
22
  goog.require('shaka.util.IReleasable');
23
+ goog.require('shaka.util.PublicPromise');
19
24
  goog.require('shaka.util.StringUtils');
20
25
 
21
26
 
@@ -14,7 +14,11 @@ goog.provide('shaka.ads.ServerSideAdManager');
14
14
  goog.require('goog.asserts');
15
15
  goog.require('shaka.ads.ServerSideAd');
16
16
  goog.require('shaka.log');
17
+ goog.require('shaka.util.EventManager');
18
+ goog.require('shaka.util.Error');
19
+ goog.require('shaka.util.FakeEvent');
17
20
  goog.require('shaka.util.IReleasable');
21
+ goog.require('shaka.util.PublicPromise');
18
22
 
19
23
 
20
24
  /**
@@ -568,7 +568,7 @@ shaka.cea.Cea708Service = class {
568
568
  // Create the window if it doesn't exist.
569
569
  const windowAlreadyExists = this.windows_[windowNum] !== null;
570
570
  if (!windowAlreadyExists) {
571
- const window = new shaka.cea.Cea708Window(windowNum);
571
+ const window = new shaka.cea.Cea708Window(windowNum, this.serviceNumber_);
572
572
  window.setStartTime(pts);
573
573
  this.windows_[windowNum] = window;
574
574
  }
@@ -9,7 +9,7 @@ goog.provide('shaka.cea.Cea708Window');
9
9
  goog.require('shaka.cea.CeaUtils');
10
10
  goog.require('shaka.cea.CeaUtils.StyledChar');
11
11
  goog.require('shaka.text.Cue');
12
- goog.require('shaka.util.Functional');
12
+ goog.require('shaka.text.CueRegion');
13
13
 
14
14
 
15
15
  /**
@@ -19,7 +19,13 @@ shaka.cea.Cea708Window = class {
19
19
  /**
20
20
  * @param {number} windowNum
21
21
  */
22
- constructor(windowNum) {
22
+ constructor(windowNum, parentService) {
23
+ /**
24
+ * Number for the parent service (1 - 63).
25
+ * @private {number}
26
+ */
27
+ this.parentService_ = parentService;
28
+
23
29
  /**
24
30
  * A number from 0 - 7 indicating the window number in the
25
31
  * service that owns this window.
@@ -132,11 +138,6 @@ shaka.cea.Cea708Window = class {
132
138
  this.backgroundColor_ = shaka.cea.CeaUtils.DEFAULT_BG_COLOR;
133
139
 
134
140
  this.resetMemory();
135
-
136
- // TODO Support window positioning by mapping them to Regions.
137
- // https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/608toVTT.html#positioning-in-cea-708
138
- shaka.util.Functional.ignored(this.verticalAnchor_, this.relativeToggle_,
139
- this.horizontalAnchor_, this.anchorId_, this.windowNum_);
140
141
  }
141
142
 
142
143
  /**
@@ -306,6 +307,8 @@ shaka.cea.Cea708Window = class {
306
307
  topLevelCue.textAlign = shaka.text.Cue.textAlign.CENTER;
307
308
  }
308
309
 
310
+ this.adjustRegion_(topLevelCue.region);
311
+
309
312
  const caption = shaka.cea.CeaUtils.getParsedCaption(
310
313
  topLevelCue, stream, this.memory_, this.startTime_, endTime);
311
314
  if (caption) {
@@ -398,6 +401,75 @@ shaka.cea.Cea708Window = class {
398
401
  setStartTime(pts) {
399
402
  this.startTime_ = pts;
400
403
  }
404
+
405
+ /**
406
+ * Support window positioning by mapping anchor related values to CueRegion.
407
+ * https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/608toVTT.html#positioning-in-cea-708
408
+ * @param {shaka.text.CueRegion} region
409
+ * @private
410
+ */
411
+ adjustRegion_(region) {
412
+ if (this.parentService_) {
413
+ region.id += 'svc' + this.parentService_;
414
+ }
415
+ region.id += 'win' + this.windowNum_;
416
+
417
+ region.height = this.rowCount_;
418
+ region.width = this.colCount_;
419
+ region.heightUnits = shaka.text.CueRegion.units.LINES;
420
+ region.widthUnits = shaka.text.CueRegion.units.LINES;
421
+
422
+ region.viewportAnchorX = this.horizontalAnchor_;
423
+ region.viewportAnchorY = this.verticalAnchor_;
424
+ // WebVTT's region viewport anchors are technically always in percentages.
425
+ // However, we don't know the aspect ratio of the video at this point,
426
+ // which determines how we interpret the horizontal anchor.
427
+ // So, we expose the additonal flag to reflect whether these viewport anchor
428
+ // values can be used be used as is or should be converted to percentages.
429
+ region.viewportAnchorUnits = this.relativeToggle_ ?
430
+ shaka.text.CueRegion.units.PERCENTAGE : shaka.text.CueRegion.units.LINES;
431
+
432
+ const AnchorId = shaka.cea.Cea708Window.AnchorId;
433
+
434
+ switch (this.anchorId_) {
435
+ case AnchorId.UPPER_LEFT:
436
+ region.regionAnchorX = 0;
437
+ region.regionAnchorY = 0;
438
+ break;
439
+ case AnchorId.UPPER_CENTER:
440
+ region.regionAnchorX = 50;
441
+ region.regionAnchorY = 0;
442
+ break;
443
+ case AnchorId.UPPER_RIGHT:
444
+ region.regionAnchorX = 100;
445
+ region.regionAnchorY = 0;
446
+ break;
447
+ case AnchorId.MIDDLE_LEFT:
448
+ region.regionAnchorX = 0;
449
+ region.regionAnchorY = 50;
450
+ break;
451
+ case AnchorId.MIDDLE_CENTER:
452
+ region.regionAnchorX = 50;
453
+ region.regionAnchorY = 50;
454
+ break;
455
+ case AnchorId.MIDDLE_RIGHT:
456
+ region.regionAnchorX = 100;
457
+ region.regionAnchorY = 50;
458
+ break;
459
+ case AnchorId.LOWER_LEFT:
460
+ region.regionAnchorX = 0;
461
+ region.regionAnchorY = 100;
462
+ break;
463
+ case AnchorId.LOWER_CENTER:
464
+ region.regionAnchorX = 50;
465
+ region.regionAnchorY = 100;
466
+ break;
467
+ case AnchorId.LOWER_RIGHT:
468
+ region.regionAnchorX = 100;
469
+ region.regionAnchorY = 100;
470
+ break;
471
+ }
472
+ }
401
473
  };
402
474
 
403
475
  /**
@@ -411,6 +483,22 @@ shaka.cea.Cea708Window.TextJustification = {
411
483
  FULL: 3,
412
484
  };
413
485
 
486
+ /**
487
+ * Possible AnchorId values.
488
+ * @const @enum {number}
489
+ */
490
+ shaka.cea.Cea708Window.AnchorId = {
491
+ UPPER_LEFT: 0,
492
+ UPPER_CENTER: 1,
493
+ UPPER_RIGHT: 2,
494
+ MIDDLE_LEFT: 3,
495
+ MIDDLE_CENTER: 4,
496
+ MIDDLE_RIGHT: 5,
497
+ LOWER_LEFT: 6,
498
+ LOWER_CENTER: 7,
499
+ LOWER_RIGHT: 8,
500
+ };
501
+
414
502
  /**
415
503
  * Can be indexed 0-31 for 4:3 format, and 0-41 for 16:9 formats.
416
504
  * Thus the absolute maximum is 42 columns for the 16:9 format.
@@ -14,6 +14,7 @@ goog.require('shaka.dash.SegmentBase');
14
14
  goog.require('shaka.dash.SegmentList');
15
15
  goog.require('shaka.dash.SegmentTemplate');
16
16
  goog.require('shaka.log');
17
+ goog.require('shaka.media.Capabilities');
17
18
  goog.require('shaka.media.ManifestParser');
18
19
  goog.require('shaka.media.PresentationTimeline');
19
20
  goog.require('shaka.media.SegmentIndex');
@@ -134,6 +135,10 @@ shaka.dash.DashParser = class {
134
135
  if (this.contentSteeringManager_) {
135
136
  this.contentSteeringManager_.configure(this.config_);
136
137
  }
138
+
139
+ this.periodCombiner_.setAllowMultiTypeVariants(
140
+ this.config_.dash.multiTypeVariantsAllowed &&
141
+ shaka.media.Capabilities.isChangeTypeSupported());
137
142
  }
138
143
 
139
144
  /**
@@ -271,8 +276,16 @@ shaka.dash.DashParser = class {
271
276
  async requestManifest_() {
272
277
  const requestType = shaka.net.NetworkingEngine.RequestType.MANIFEST;
273
278
  const type = shaka.net.NetworkingEngine.AdvancedRequestType.MPD;
279
+ let manifestUris = this.manifestUris_;
280
+ if (this.manifestUris_.length > 1 && this.contentSteeringManager_) {
281
+ const locations = this.contentSteeringManager_.getLocations(
282
+ 'Location', /* ignoreBaseUrls= */ true);
283
+ if (locations.length) {
284
+ manifestUris = locations;
285
+ }
286
+ }
274
287
  const request = shaka.net.NetworkingEngine.makeRequest(
275
- this.manifestUris_, this.config_.retryParameters);
288
+ manifestUris, this.config_.retryParameters);
276
289
  const startTime = Date.now();
277
290
 
278
291
  const response = await this.makeNetworkRequest_(
@@ -347,7 +360,6 @@ shaka.dash.DashParser = class {
347
360
  * @private
348
361
  */
349
362
  async processManifest_(mpd, finalManifestUri) {
350
- const Functional = shaka.util.Functional;
351
363
  const XmlUtils = shaka.util.XmlUtils;
352
364
 
353
365
  const manifestPreprocessor = this.config_.dash.manifestPreprocessor;
@@ -355,19 +367,47 @@ shaka.dash.DashParser = class {
355
367
  manifestPreprocessor(mpd);
356
368
  }
357
369
 
370
+ if (this.contentSteeringManager_) {
371
+ this.contentSteeringManager_.clearPreviousLocations();
372
+ }
373
+
358
374
  // Get any Location elements. This will update the manifest location and
359
375
  // the base URI.
360
376
  /** @type {!Array.<string>} */
361
377
  let manifestBaseUris = [finalManifestUri];
362
378
  /** @type {!Array.<string>} */
363
- const locations = XmlUtils.findChildren(mpd, 'Location')
364
- .map(XmlUtils.getContents)
365
- .filter(Functional.isNotNull);
366
- if (locations.length > 0) {
367
- const absoluteLocations = shaka.util.ManifestParserUtils.resolveUris(
368
- manifestBaseUris, locations);
369
- this.manifestUris_ = absoluteLocations;
370
- manifestBaseUris = absoluteLocations;
379
+ const locations = [];
380
+ /** @type {!Map.<string, string>} */
381
+ const locationsMapping = new Map();
382
+ const locationsObjs = XmlUtils.findChildren(mpd, 'Location');
383
+ for (const locationsObj of locationsObjs) {
384
+ const serviceLocation = locationsObj.getAttribute('serviceLocation');
385
+ const uri = XmlUtils.getContents(locationsObj);
386
+ if (!uri) {
387
+ continue;
388
+ }
389
+ const finalUri = shaka.util.ManifestParserUtils.resolveUris(
390
+ manifestBaseUris, [uri])[0];
391
+ if (serviceLocation) {
392
+ if (this.contentSteeringManager_) {
393
+ this.contentSteeringManager_.addLocation(
394
+ 'Location', serviceLocation, finalUri);
395
+ } else {
396
+ locationsMapping.set(serviceLocation, finalUri);
397
+ }
398
+ }
399
+ locations.push(finalUri);
400
+ }
401
+ if (this.contentSteeringManager_) {
402
+ const steeringlocations = this.contentSteeringManager_.getLocations(
403
+ 'Location', /* ignoreBaseUrls= */ true);
404
+ if (steeringlocations.length > 0) {
405
+ this.manifestUris_ = steeringlocations;
406
+ manifestBaseUris = steeringlocations;
407
+ }
408
+ } else if (locations.length) {
409
+ this.manifestUris_ = locations;
410
+ manifestBaseUris = locations;
371
411
  }
372
412
 
373
413
  let contentSteeringPromise = Promise.resolve();
@@ -400,13 +440,17 @@ shaka.dash.DashParser = class {
400
440
  this.contentSteeringManager_.setBaseUris(manifestBaseUris);
401
441
  this.contentSteeringManager_.setDefaultPathwayId(defaultPathwayId);
402
442
  }
443
+ for (const serviceLocation of locationsMapping.keys()) {
444
+ const uri = locationsMapping.get(serviceLocation);
445
+ this.contentSteeringManager_.addLocation(
446
+ 'Location', serviceLocation, uri);
447
+ }
403
448
  }
404
449
 
405
450
  const uriObjs = XmlUtils.findChildren(mpd, 'BaseURL');
406
451
  let calculatedBaseUris;
407
452
  let someLocationValid = false;
408
453
  if (this.contentSteeringManager_) {
409
- this.contentSteeringManager_.clearPreviousLocations();
410
454
  for (const uriObj of uriObjs) {
411
455
  const serviceLocation = uriObj.getAttribute('serviceLocation');
412
456
  const uri = XmlUtils.getContents(uriObj);
@@ -3753,14 +3753,26 @@ shaka.hls.HlsParser = class {
3753
3753
 
3754
3754
  // If unable to guess mime type, request a segment and try getting it
3755
3755
  // from the response.
3756
+ let contentMimeType;
3757
+ const type = shaka.net.NetworkingEngine.AdvancedRequestType.MEDIA_SEGMENT;
3756
3758
  const headRequest = shaka.net.NetworkingEngine.makeRequest(
3757
3759
  middleSegmentUris, this.config_.retryParameters);
3758
- headRequest.method = 'HEAD';
3759
- const type = shaka.net.NetworkingEngine.AdvancedRequestType.MEDIA_SEGMENT;
3760
- const response = await this.makeNetworkRequest_(
3761
- headRequest, requestType, {type});
3760
+ try {
3761
+ headRequest.method = 'HEAD';
3762
+ const response = await this.makeNetworkRequest_(
3763
+ headRequest, requestType, {type});
3764
+
3765
+ contentMimeType = response.headers['content-type'];
3766
+ } catch (error) {
3767
+ if (error && error.code == shaka.util.Error.Code.HTTP_ERROR) {
3768
+ headRequest.method = 'GET';
3769
+ const response = await this.makeNetworkRequest_(
3770
+ headRequest, requestType, {type});
3771
+
3772
+ contentMimeType = response.headers['content-type'];
3773
+ }
3774
+ }
3762
3775
 
3763
- const contentMimeType = response.headers['content-type'];
3764
3776
  if (contentMimeType) {
3765
3777
  // Split the MIME type in case the server sent additional parameters.
3766
3778
  return contentMimeType.split(';')[0];