shaka-player 4.6.4 → 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 (598) 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 +9 -5
  5. package/dist/locales.js +29 -29
  6. package/dist/shaka-player.compiled.d.ts +46 -3
  7. package/dist/shaka-player.compiled.debug.d.ts +46 -3
  8. package/dist/shaka-player.compiled.debug.externs.js +45 -0
  9. package/dist/shaka-player.compiled.debug.js +382 -351
  10. package/dist/shaka-player.compiled.debug.map +4 -4
  11. package/dist/shaka-player.compiled.externs.js +45 -0
  12. package/dist/shaka-player.compiled.js +1135 -1121
  13. package/dist/shaka-player.compiled.map +4 -4
  14. package/dist/shaka-player.ui.d.ts +68 -4
  15. package/dist/shaka-player.ui.debug.d.ts +68 -4
  16. package/dist/shaka-player.ui.debug.externs.js +77 -0
  17. package/dist/shaka-player.ui.debug.js +428 -392
  18. package/dist/shaka-player.ui.debug.map +4 -4
  19. package/dist/shaka-player.ui.externs.js +77 -0
  20. package/dist/shaka-player.ui.js +1304 -1290
  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/cea/cea708_service.js +1 -1
  28. package/lib/cea/cea708_window.js +95 -7
  29. package/lib/dash/dash_parser.js +55 -11
  30. package/lib/media/adaptation_set_criteria.js +76 -10
  31. package/lib/media/media_source_engine.js +42 -18
  32. package/lib/media/segment_reference.js +12 -0
  33. package/lib/media/streaming_engine.js +55 -3
  34. package/lib/player.js +92 -6
  35. package/lib/util/cmsd_manager.js +269 -0
  36. package/lib/util/content_steering_manager.js +5 -1
  37. package/lib/util/mime_utils.js +6 -2
  38. package/lib/util/periods.js +108 -39
  39. package/lib/util/player_configuration.js +19 -5
  40. package/lib/util/stream_utils.js +82 -13
  41. package/package.json +1 -1
  42. package/ui/audio_language_selection.js +3 -0
  43. package/ui/controls.js +60 -0
  44. package/ui/externs/ui.js +12 -1
  45. package/ui/hidden_fast_forward_button.js +32 -0
  46. package/ui/hidden_rewind_button.js +32 -0
  47. package/ui/hidden_seek_button.js +121 -0
  48. package/ui/less/buttons.less +50 -0
  49. package/ui/less/containers.less +18 -0
  50. package/ui/resolution_selection.js +2 -0
  51. package/ui/ui.js +2 -0
  52. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -75
  53. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -26
  54. package/.github/ISSUE_TEMPLATE/question.md +0 -26
  55. package/.github/config.yml +0 -1
  56. package/.github/workflows/appspot.yaml +0 -39
  57. package/.github/workflows/build-and-test.yaml +0 -222
  58. package/.github/workflows/compute-incremental-coverage.py +0 -265
  59. package/.github/workflows/custom-actions/prep-for-appspot/action.yaml +0 -56
  60. package/.github/workflows/custom-actions/set-commit-status/action.yaml +0 -37
  61. package/.github/workflows/deflake.yaml +0 -31
  62. package/.github/workflows/demo-version-index.yaml +0 -43
  63. package/.github/workflows/nightly-demo.yaml +0 -42
  64. package/.github/workflows/release-please.yaml +0 -193
  65. package/.github/workflows/report-incremental-coverage.yaml +0 -39
  66. package/.github/workflows/safari-homedir-launcher.sh +0 -18
  67. package/.github/workflows/selenium-lab-tests.yaml +0 -370
  68. package/.github/workflows/shaka-bot-commands/command-help.sh +0 -27
  69. package/.github/workflows/shaka-bot-commands/command-test.sh +0 -56
  70. package/.github/workflows/shaka-bot-commands/lib.sh +0 -83
  71. package/.github/workflows/shaka-bot-commands/main.sh +0 -51
  72. package/.github/workflows/sync-labels.yaml +0 -33
  73. package/.github/workflows/talk-to-shaka-bot.yaml +0 -29
  74. package/.github/workflows/update-issues.yaml +0 -31
  75. package/.github/workflows/update-screenshots.yaml +0 -142
  76. package/.github/workflows/validate-pr-title.yaml +0 -27
  77. package/CHANGELOG.md +0 -5774
  78. package/CODE_OF_CONDUCT.md +0 -93
  79. package/CONTRIBUTING.md +0 -76
  80. package/demo/TengwarTelcontar.woff2 +0 -0
  81. package/demo/app_logo_144.png +0 -0
  82. package/demo/app_logo_192.png +0 -0
  83. package/demo/app_logo_256.png +0 -0
  84. package/demo/app_logo_384.png +0 -0
  85. package/demo/app_logo_512.png +0 -0
  86. package/demo/app_manifest.json +0 -29
  87. package/demo/asset_card.js +0 -410
  88. package/demo/autoTemplate.txt +0 -61
  89. package/demo/cast_receiver/idle1.jpg +0 -0
  90. package/demo/cast_receiver/idle2.jpg +0 -0
  91. package/demo/cast_receiver/idle3.jpg +0 -0
  92. package/demo/cast_receiver/index.html +0 -75
  93. package/demo/cast_receiver/receiver_app.css +0 -111
  94. package/demo/cast_receiver/receiver_app.js +0 -158
  95. package/demo/close_button.js +0 -60
  96. package/demo/common/asset.js +0 -510
  97. package/demo/common/assets.js +0 -1634
  98. package/demo/config.js +0 -859
  99. package/demo/custom.js +0 -907
  100. package/demo/customWarning.txt +0 -8
  101. package/demo/demo.less +0 -591
  102. package/demo/demo_uncompiled.js +0 -11
  103. package/demo/demo_utils.js +0 -113
  104. package/demo/favicon.ico +0 -0
  105. package/demo/front.js +0 -156
  106. package/demo/icons/README.md +0 -4
  107. package/demo/icons/baseline-audiotrack-24px.svg +0 -1
  108. package/demo/icons/baseline-closed_caption-24px.svg +0 -1
  109. package/demo/icons/baseline-fast_forward-24px.svg +0 -1
  110. package/demo/icons/baseline-language-24px.svg +0 -1
  111. package/demo/icons/baseline-live_tv-24px.svg +0 -1
  112. package/demo/icons/baseline-subtitles-24px.svg +0 -1
  113. package/demo/icons/baseline-surround_sound-24px.svg +0 -1
  114. package/demo/icons/custom_ad.svg +0 -1
  115. package/demo/icons/custom_box_with_text.svg +0 -1
  116. package/demo/icons/custom_clear_key.svg +0 -1
  117. package/demo/icons/custom_high_definition.svg +0 -1
  118. package/demo/icons/custom_playready.svg +0 -1
  119. package/demo/icons/custom_ultra_high_definition.svg +0 -1
  120. package/demo/icons/custom_widevine.svg +0 -1
  121. package/demo/index.html +0 -173
  122. package/demo/input.js +0 -270
  123. package/demo/input_container.js +0 -218
  124. package/demo/load.js +0 -156
  125. package/demo/main.js +0 -1854
  126. package/demo/search.js +0 -452
  127. package/demo/service_worker.js +0 -355
  128. package/demo/shaka_logo_trans.png +0 -0
  129. package/demo/tooltip.js +0 -29
  130. package/demo/visualizer.js +0 -335
  131. package/demo/visualizer_button.js +0 -84
  132. package/dist/demo.compiled.debug.js +0 -340
  133. package/dist/demo.compiled.debug.map +0 -8
  134. package/dist/demo.compiled.js +0 -340
  135. package/dist/demo.compiled.map +0 -8
  136. package/dist/demo.css +0 -6
  137. package/dist/demo.css.map +0 -1
  138. package/dist/receiver.compiled.debug.js +0 -187
  139. package/dist/receiver.compiled.debug.map +0 -8
  140. package/dist/receiver.compiled.js +0 -187
  141. package/dist/receiver.compiled.map +0 -8
  142. package/docs/announcement-list-join-group.png +0 -0
  143. package/docs/api-mainpage.md +0 -28
  144. package/docs/design/REDESIGN.md +0 -283
  145. package/docs/design/architecture.md +0 -13
  146. package/docs/design/bg-fetch-after.gv +0 -29
  147. package/docs/design/bg-fetch-after.gv.png +0 -0
  148. package/docs/design/bg-fetch-before.gv +0 -18
  149. package/docs/design/bg-fetch-before.gv.png +0 -0
  150. package/docs/design/bg-fetch.md +0 -134
  151. package/docs/design/cast.gv +0 -35
  152. package/docs/design/cast.gv.png +0 -0
  153. package/docs/design/chromecast.md +0 -151
  154. package/docs/design/codec_preferences.md +0 -158
  155. package/docs/design/dash-audio-channels.md +0 -123
  156. package/docs/design/dash-manifests.md +0 -248
  157. package/docs/design/dash-timeline.svg +0 -4
  158. package/docs/design/dataflow.gv +0 -66
  159. package/docs/design/dataflow.gv.png +0 -0
  160. package/docs/design/export.md +0 -70
  161. package/docs/design/fuzzy-locale-matching.md +0 -40
  162. package/docs/design/gap-jumping.md +0 -151
  163. package/docs/design/lcevc-architecture.png +0 -0
  164. package/docs/design/lcevc-demo.png +0 -0
  165. package/docs/design/lcevc-integration.md +0 -72
  166. package/docs/design/locale_compatibility.svg +0 -1
  167. package/docs/design/locales_tree.svg +0 -1
  168. package/docs/design/localization-design-principles.md +0 -158
  169. package/docs/design/newdemo.gv +0 -83
  170. package/docs/design/newdemo.gv.png +0 -0
  171. package/docs/design/offline.gv +0 -43
  172. package/docs/design/offline.gv.png +0 -0
  173. package/docs/design/offline.md +0 -153
  174. package/docs/design/ownership.gv +0 -76
  175. package/docs/design/ownership.gv.png +0 -0
  176. package/docs/design/preload.md +0 -299
  177. package/docs/design/preload.png +0 -0
  178. package/docs/design/talking-about-languages.md +0 -46
  179. package/docs/design/timeline.svg +0 -152
  180. package/docs/design/ui.md +0 -31
  181. package/docs/design/ui_player_relationships.svg +0 -1
  182. package/docs/jsdoc-plugin.js +0 -74
  183. package/docs/jsdoc-template/README.md +0 -1
  184. package/docs/jsdoc-template/publish.js +0 -879
  185. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.eot +0 -0
  186. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.svg +0 -1830
  187. package/docs/jsdoc-template/static/fonts/OpenSans-Bold-webfont.woff +0 -0
  188. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  189. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
  190. package/docs/jsdoc-template/static/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  191. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.eot +0 -0
  192. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.svg +0 -1830
  193. package/docs/jsdoc-template/static/fonts/OpenSans-Italic-webfont.woff +0 -0
  194. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.eot +0 -0
  195. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.svg +0 -1831
  196. package/docs/jsdoc-template/static/fonts/OpenSans-Light-webfont.woff +0 -0
  197. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  198. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
  199. package/docs/jsdoc-template/static/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  200. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.eot +0 -0
  201. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.svg +0 -1831
  202. package/docs/jsdoc-template/static/fonts/OpenSans-Regular-webfont.woff +0 -0
  203. package/docs/jsdoc-template/static/scripts/linenumber.js +0 -44
  204. package/docs/jsdoc-template/static/scripts/show-widget.js +0 -55
  205. package/docs/jsdoc-template/static/styles/jsdoc-default.css +0 -438
  206. package/docs/jsdoc-template/tmpl/augments.tmpl +0 -10
  207. package/docs/jsdoc-template/tmpl/container.tmpl +0 -205
  208. package/docs/jsdoc-template/tmpl/details.tmpl +0 -152
  209. package/docs/jsdoc-template/tmpl/example.tmpl +0 -2
  210. package/docs/jsdoc-template/tmpl/examples.tmpl +0 -13
  211. package/docs/jsdoc-template/tmpl/exceptions.tmpl +0 -32
  212. package/docs/jsdoc-template/tmpl/layout.tmpl +0 -50
  213. package/docs/jsdoc-template/tmpl/mainpage.tmpl +0 -14
  214. package/docs/jsdoc-template/tmpl/members.tmpl +0 -47
  215. package/docs/jsdoc-template/tmpl/method.tmpl +0 -140
  216. package/docs/jsdoc-template/tmpl/modifies.tmpl +0 -14
  217. package/docs/jsdoc-template/tmpl/params.tmpl +0 -131
  218. package/docs/jsdoc-template/tmpl/properties.tmpl +0 -125
  219. package/docs/jsdoc-template/tmpl/returns.tmpl +0 -19
  220. package/docs/jsdoc-template/tmpl/source.tmpl +0 -8
  221. package/docs/jsdoc-template/tmpl/tutorial.tmpl +0 -21
  222. package/docs/jsdoc-template/tmpl/type.tmpl +0 -7
  223. package/docs/jsdoc.conf.json +0 -38
  224. package/docs/shaka-player-logo.png +0 -0
  225. package/docs/style.md +0 -174
  226. package/docs/tutorials/a11y.md +0 -64
  227. package/docs/tutorials/ad_monetization.md +0 -292
  228. package/docs/tutorials/application-level-redirects.md +0 -94
  229. package/docs/tutorials/architecture.md +0 -32
  230. package/docs/tutorials/basic-usage.md +0 -89
  231. package/docs/tutorials/blob-url.md +0 -15
  232. package/docs/tutorials/config.md +0 -148
  233. package/docs/tutorials/debugging.md +0 -189
  234. package/docs/tutorials/drm-config.md +0 -274
  235. package/docs/tutorials/errors.md +0 -95
  236. package/docs/tutorials/fairplay.md +0 -242
  237. package/docs/tutorials/faq.md +0 -252
  238. package/docs/tutorials/index.json +0 -29
  239. package/docs/tutorials/lcevc.md +0 -118
  240. package/docs/tutorials/license-server-auth.md +0 -248
  241. package/docs/tutorials/license-wrapping.md +0 -168
  242. package/docs/tutorials/manifest-parser.md +0 -365
  243. package/docs/tutorials/network-and-buffering-config.md +0 -119
  244. package/docs/tutorials/offline.md +0 -683
  245. package/docs/tutorials/plugins.md +0 -184
  246. package/docs/tutorials/selenium-grid-config.md +0 -174
  247. package/docs/tutorials/service-worker.md +0 -106
  248. package/docs/tutorials/ui-customization.md +0 -288
  249. package/docs/tutorials/ui.md +0 -232
  250. package/docs/tutorials/upgrade-manifest.md +0 -281
  251. package/docs/tutorials/upgrade.md +0 -104
  252. package/docs/tutorials/welcome.md +0 -108
  253. package/docs/tutorials/widevine-service-certs.md +0 -45
  254. package/karma.conf.js +0 -879
  255. package/maintained-branches.md +0 -15
  256. package/roadmap.md +0 -186
  257. package/test/abr/simple_abr_manager_unit.js +0 -398
  258. package/test/ads/ad_manager_unit.js +0 -260
  259. package/test/assumptions/uint8_array_unit.js +0 -22
  260. package/test/cast/cast_proxy_unit.js +0 -736
  261. package/test/cast/cast_receiver_integration.js +0 -488
  262. package/test/cast/cast_receiver_unit.js +0 -1183
  263. package/test/cast/cast_sender_unit.js +0 -973
  264. package/test/cast/cast_utils_unit.js +0 -311
  265. package/test/cea/cea608_memory_unit.js +0 -411
  266. package/test/cea/cea708_service_unit.js +0 -674
  267. package/test/cea/cea708_window_unit.js +0 -373
  268. package/test/cea/cea_decoder_unit.js +0 -615
  269. package/test/cea/dtvcc_packet_builder_unit.js +0 -158
  270. package/test/cea/dtvcc_packet_unit.js +0 -60
  271. package/test/cea/mp4_cea_parser_unit.js +0 -127
  272. package/test/codec_switching/codec_switching_integration.js +0 -182
  273. package/test/dash/dash_parser_content_protection_unit.js +0 -998
  274. package/test/dash/dash_parser_integration.js +0 -74
  275. package/test/dash/dash_parser_live_unit.js +0 -1542
  276. package/test/dash/dash_parser_manifest_unit.js +0 -3121
  277. package/test/dash/dash_parser_segment_base_unit.js +0 -421
  278. package/test/dash/dash_parser_segment_list_unit.js +0 -380
  279. package/test/dash/dash_parser_segment_template_unit.js +0 -910
  280. package/test/dash/mpd_utils_unit.js +0 -794
  281. package/test/demo/demo_unit.js +0 -108
  282. package/test/deprecate/enforcer_unit.js +0 -74
  283. package/test/deprecate/version_unit.js +0 -57
  284. package/test/hls/hls_live_unit.js +0 -1330
  285. package/test/hls/hls_parser_unit.js +0 -5276
  286. package/test/hls/manifest_text_parser_unit.js +0 -545
  287. package/test/media/adaptation_set_criteria_unit.js +0 -806
  288. package/test/media/adaptation_set_unit.js +0 -229
  289. package/test/media/buffering_observer_unit.js +0 -143
  290. package/test/media/closed_caption_parser_unit.js +0 -18
  291. package/test/media/content_workarounds_unit.js +0 -43
  292. package/test/media/drm_engine_integration.js +0 -356
  293. package/test/media/drm_engine_unit.js +0 -2805
  294. package/test/media/media_source_engine_integration.js +0 -691
  295. package/test/media/media_source_engine_unit.js +0 -1512
  296. package/test/media/mp4_segment_index_parser_unit.js +0 -80
  297. package/test/media/play_rate_controller_unit.js +0 -69
  298. package/test/media/playhead_unit.js +0 -1394
  299. package/test/media/presentation_timeline_unit.js +0 -477
  300. package/test/media/quality_observer_unit.js +0 -138
  301. package/test/media/region_observer_unit.js +0 -374
  302. package/test/media/region_timeline_unit.js +0 -139
  303. package/test/media/segment_index_unit.js +0 -1080
  304. package/test/media/segment_prefetch_unit.js +0 -243
  305. package/test/media/segment_reference_unit.js +0 -63
  306. package/test/media/stall_detector_unit.js +0 -184
  307. package/test/media/streaming_engine_integration.js +0 -632
  308. package/test/media/streaming_engine_unit.js +0 -4211
  309. package/test/media/time_ranges_utils_unit.js +0 -123
  310. package/test/media/webm_segment_index_parser_unit.js +0 -90
  311. package/test/mss/mss_parser_content_protection_unit.js +0 -49
  312. package/test/mss/mss_parser_unit.js +0 -474
  313. package/test/mss/mss_player_integration.js +0 -124
  314. package/test/net/data_uri_plugin_unit.js +0 -105
  315. package/test/net/http_plugin_unit.js +0 -439
  316. package/test/net/networking_engine_unit.js +0 -1236
  317. package/test/net/networking_utils_unit.js +0 -37
  318. package/test/offline/download_progress_estimator_unit.js +0 -90
  319. package/test/offline/indexeddb_storage_unit.js +0 -192
  320. package/test/offline/manifest_convert_unit.js +0 -622
  321. package/test/offline/offline_integration.js +0 -168
  322. package/test/offline/offline_manifest_parser_unit.js +0 -231
  323. package/test/offline/offline_scheme_unit.js +0 -154
  324. package/test/offline/offline_uri_unit.js +0 -59
  325. package/test/offline/storage_compatibility_unit.js +0 -344
  326. package/test/offline/storage_integration.js +0 -1858
  327. package/test/player_external.js +0 -237
  328. package/test/player_integration.js +0 -1371
  329. package/test/player_load_graph_integration.js +0 -865
  330. package/test/player_src_equals_external.js +0 -154
  331. package/test/player_src_equals_integration.js +0 -527
  332. package/test/player_unit.js +0 -4434
  333. package/test/polyfill/media_capabilities_unit.js +0 -277
  334. package/test/polyfill/patchedmediakeys_apple_unit.js +0 -130
  335. package/test/test/assets/3675/chunk-stream0-00001.m4s +0 -0
  336. package/test/test/assets/3675/chunk-stream0-00002.m4s +0 -0
  337. package/test/test/assets/3675/chunk-stream0-00003.m4s +0 -0
  338. package/test/test/assets/3675/chunk-stream0-00004.m4s +0 -0
  339. package/test/test/assets/3675/chunk-stream0-00005.m4s +0 -0
  340. package/test/test/assets/3675/chunk-stream0-00006.m4s +0 -0
  341. package/test/test/assets/3675/chunk-stream0-00007.m4s +0 -0
  342. package/test/test/assets/3675/dash_0.mpd +0 -30
  343. package/test/test/assets/3675/dash_1.mpd +0 -30
  344. package/test/test/assets/3675/dash_2.mpd +0 -30
  345. package/test/test/assets/3675/dash_3.mpd +0 -30
  346. package/test/test/assets/3675/dash_4.mpd +0 -30
  347. package/test/test/assets/3675/dash_5.mpd +0 -26
  348. package/test/test/assets/3675/init-stream0.m4s +0 -0
  349. package/test/test/assets/audio-xhe-aac.mp4 +0 -0
  350. package/test/test/assets/audio.ts +0 -0
  351. package/test/test/assets/captions-test.ts +0 -0
  352. package/test/test/assets/cea-init.mp4 +0 -0
  353. package/test/test/assets/cea-segment.mp4 +0 -0
  354. package/test/test/assets/chapters.srt +0 -11
  355. package/test/test/assets/chapters.vtt +0 -10
  356. package/test/test/assets/chapters2.vtt +0 -10
  357. package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
  358. package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
  359. package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
  360. package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
  361. package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
  362. package/test/test/assets/dash-aes-128/dash.mpd +0 -18
  363. package/test/test/assets/dash-aes-128/license +0 -1
  364. package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
  365. package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
  366. package/test/test/assets/dash-multi-codec/dash.mpd +0 -32
  367. package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
  368. package/test/test/assets/db-dump-v1.json +0 -1
  369. package/test/test/assets/db-dump-v2-broken.json +0 -1
  370. package/test/test/assets/db-dump-v2-clean.json +0 -1
  371. package/test/test/assets/db-dump-v3.json +0 -1
  372. package/test/test/assets/db-dump-v4-broken.json +0 -1
  373. package/test/test/assets/db-dump-v5.json +0 -1
  374. package/test/test/assets/empty_caption_video_init.mp4 +0 -0
  375. package/test/test/assets/empty_caption_video_segment.mp4 +0 -0
  376. package/test/test/assets/encrypted-sintel-audio-init.mp4 +0 -0
  377. package/test/test/assets/encrypted-sintel-audio-segment.mp4 +0 -0
  378. package/test/test/assets/encrypted-sintel-video-init.mp4 +0 -0
  379. package/test/test/assets/encrypted-sintel-video-segment.mp4 +0 -0
  380. package/test/test/assets/green-pixel.mp4 +0 -0
  381. package/test/test/assets/green-pixel.txt +0 -15
  382. package/test/test/assets/h265-cea-init.mp4 +0 -0
  383. package/test/test/assets/h265-cea-segment.mp4 +0 -0
  384. package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
  385. package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
  386. package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
  387. package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
  388. package/test/test/assets/hls-raw-aac/manifest.m3u8 +0 -4
  389. package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +0 -14
  390. package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
  391. package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
  392. package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
  393. package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
  394. package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
  395. package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
  396. package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
  397. package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
  398. package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +0 -31
  399. package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
  400. package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
  401. package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
  402. package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
  403. package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
  404. package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
  405. package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
  406. package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
  407. package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +0 -31
  408. package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +0 -13
  409. package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
  410. package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
  411. package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
  412. package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
  413. package/test/test/assets/hls-raw-mp3/playlist.m3u8 +0 -4
  414. package/test/test/assets/hls-ts-aac/playlist.m3u8 +0 -23
  415. package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
  416. package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
  417. package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
  418. package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
  419. package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
  420. package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
  421. package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
  422. package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
  423. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
  424. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
  425. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
  426. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
  427. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
  428. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
  429. package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +0 -19
  430. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
  431. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
  432. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
  433. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
  434. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
  435. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
  436. package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +0 -19
  437. package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
  438. package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
  439. package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
  440. package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
  441. package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
  442. package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
  443. package/test/test/assets/hls-ts-h264/prog_index.m3u8 +0 -25
  444. package/test/test/assets/hls-ts-h265/0.ts +0 -0
  445. package/test/test/assets/hls-ts-h265/hevc.m3u8 +0 -6
  446. package/test/test/assets/hls-ts-h265/index.m3u8 +0 -7
  447. package/test/test/assets/hls-ts-mp3/manifest.m3u8 +0 -13
  448. package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
  449. package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
  450. package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
  451. package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
  452. package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +0 -17
  453. package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
  454. package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
  455. package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
  456. package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
  457. package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
  458. package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
  459. package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +0 -4
  460. package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
  461. package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
  462. package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +0 -9
  463. package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +0 -24
  464. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
  465. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
  466. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
  467. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
  468. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
  469. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
  470. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
  471. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
  472. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
  473. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
  474. package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +0 -14
  475. package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +0 -23
  476. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
  477. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
  478. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
  479. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
  480. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
  481. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
  482. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
  483. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
  484. package/test/test/assets/id3-metadata.aac +0 -0
  485. package/test/test/assets/id3-metadata.ts +0 -0
  486. package/test/test/assets/index-segment.mp4 +0 -0
  487. package/test/test/assets/index-segment.webm +0 -0
  488. package/test/test/assets/init-segment.webm +0 -0
  489. package/test/test/assets/large_file.mpd +0 -4930
  490. package/test/test/assets/multidrm-audio-init.mp4 +0 -0
  491. package/test/test/assets/multidrm-audio-segment.mp4 +0 -0
  492. package/test/test/assets/multidrm-video-init.mp4 +0 -0
  493. package/test/test/assets/multidrm-video-segment.mp4 +0 -0
  494. package/test/test/assets/multiple-trun-init.mp4 +0 -0
  495. package/test/test/assets/multiple-trun-segment.mp4 +0 -0
  496. package/test/test/assets/sintel-audio-init.mp4 +0 -0
  497. package/test/test/assets/sintel-audio-segment.mp4 +0 -0
  498. package/test/test/assets/sintel-video-init.mp4 +0 -0
  499. package/test/test/assets/sintel-video-segment.mp4 +0 -0
  500. package/test/test/assets/small.mp4 +0 -0
  501. package/test/test/assets/text-clip-alt.vtt +0 -63
  502. package/test/test/assets/text-clip.vtt +0 -63
  503. package/test/test/assets/thumbnails-sprites.vtt +0 -10
  504. package/test/test/assets/thumbnails.vtt +0 -10
  505. package/test/test/assets/ttml-init.mp4 +0 -0
  506. package/test/test/assets/ttml-segment-multiplemdat.mp4 +0 -0
  507. package/test/test/assets/ttml-segment.mp4 +0 -0
  508. package/test/test/assets/video.ts +0 -0
  509. package/test/test/assets/vtt-init.mp4 +0 -0
  510. package/test/test/assets/vtt-segment-multi-payload.mp4 +0 -0
  511. package/test/test/assets/vtt-segment-no-duration.mp4 +0 -0
  512. package/test/test/assets/vtt-segment-settings.mp4 +0 -0
  513. package/test/test/assets/vtt-segment.mp4 +0 -0
  514. package/test/test/boot.js +0 -495
  515. package/test/test/externs/filters.js +0 -44
  516. package/test/test/externs/fontfaceonload.js +0 -29
  517. package/test/test/externs/jasmine.js +0 -670
  518. package/test/test/externs/karma.js +0 -26
  519. package/test/test/externs/require.js +0 -21
  520. package/test/test/externs/sprintf.js +0 -18
  521. package/test/test/namespace.js +0 -10
  522. package/test/test/util/canned_idb.js +0 -379
  523. package/test/test/util/cea_utils.js +0 -60
  524. package/test/test/util/dash_parser_util.js +0 -329
  525. package/test/test/util/fake_ad.js +0 -321
  526. package/test/test/util/fake_ad_manager.js +0 -122
  527. package/test/test/util/fake_demo_main.js +0 -144
  528. package/test/test/util/fake_drm_engine.js +0 -103
  529. package/test/test/util/fake_media_source_engine.js +0 -464
  530. package/test/test/util/fake_networking_engine.js +0 -381
  531. package/test/test/util/fake_segment_prefetch.js +0 -84
  532. package/test/test/util/fake_text_displayer.js +0 -60
  533. package/test/test/util/id3_generator.js +0 -100
  534. package/test/test/util/indexeddb_utils.js +0 -124
  535. package/test/test/util/jasmine_fetch.js +0 -382
  536. package/test/test/util/layout_tests.js +0 -435
  537. package/test/test/util/loader.js +0 -88
  538. package/test/test/util/manifest_generator.js +0 -705
  539. package/test/test/util/manifest_parser_util.js +0 -101
  540. package/test/test/util/mss_parser_util.js +0 -119
  541. package/test/test/util/offline_utils.js +0 -105
  542. package/test/test/util/simple_fakes.js +0 -535
  543. package/test/test/util/stream_generator.js +0 -676
  544. package/test/test/util/streaming_engine_util.js +0 -506
  545. package/test/test/util/test_scheme.js +0 -778
  546. package/test/test/util/ttml_utils.js +0 -77
  547. package/test/test/util/ui_utils.js +0 -183
  548. package/test/test/util/util.js +0 -374
  549. package/test/test/util/waiter.js +0 -406
  550. package/test/text/cue_integration.js +0 -51
  551. package/test/text/lrc_text_parser_unit.js +0 -98
  552. package/test/text/mp4_ttml_parser_unit.js +0 -171
  553. package/test/text/mp4_vtt_parser_unit.js +0 -195
  554. package/test/text/sbv_text_parser_unit.js +0 -81
  555. package/test/text/simple_text_displayer_unit.js +0 -468
  556. package/test/text/srt_text_parser_unit.js +0 -163
  557. package/test/text/ssa_text_parser_unit.js +0 -382
  558. package/test/text/text_displayer_layout_unit.js +0 -323
  559. package/test/text/text_engine_unit.js +0 -500
  560. package/test/text/text_track_integration.js +0 -186
  561. package/test/text/ttml_text_parser_unit.js +0 -2176
  562. package/test/text/ui_text_displayer_unit.js +0 -608
  563. package/test/text/vtt_text_parser_unit.js +0 -1363
  564. package/test/text/web_vtt_generator_unit.js +0 -144
  565. package/test/text/web_vtt_layout_integration.js +0 -524
  566. package/test/transmuxer/transmuxer_engine_integration.js +0 -69
  567. package/test/transmuxer/transmuxer_integration.js +0 -443
  568. package/test/ui/ad_ui_unit.js +0 -369
  569. package/test/ui/localization_unit.js +0 -508
  570. package/test/ui/ui_customization_unit.js +0 -208
  571. package/test/ui/ui_integration.js +0 -669
  572. package/test/ui/ui_unit.js +0 -902
  573. package/test/util/abortable_operation_unit.js +0 -624
  574. package/test/util/array_utils_unit.js +0 -58
  575. package/test/util/buffer_utils_unit.js +0 -185
  576. package/test/util/cmcd_manager_unit.js +0 -440
  577. package/test/util/content_steering_manager_unit.js +0 -427
  578. package/test/util/data_view_reader_unit.js +0 -254
  579. package/test/util/ebml_parser_unit.js +0 -297
  580. package/test/util/event_manager_unit.js +0 -185
  581. package/test/util/fake_event_target_unit.js +0 -123
  582. package/test/util/id3_utils_unit.js +0 -168
  583. package/test/util/iterables_unit.js +0 -68
  584. package/test/util/language_utils_unit.js +0 -240
  585. package/test/util/manifest_parser_utils_unit.js +0 -55
  586. package/test/util/mime_utils_unit.js +0 -64
  587. package/test/util/mp4_box_parsers_unit.js +0 -246
  588. package/test/util/mp4_parser_unit.js +0 -373
  589. package/test/util/multi_map_unit.js +0 -94
  590. package/test/util/object_utils_unit.js +0 -79
  591. package/test/util/periods_unit.js +0 -1623
  592. package/test/util/pssh_unit.js +0 -226
  593. package/test/util/state_history_unit.js +0 -101
  594. package/test/util/stream_utils_unit.js +0 -1068
  595. package/test/util/string_utils_unit.js +0 -166
  596. package/test/util/text_parser_unit.js +0 -165
  597. package/test/util/ts_parser_unit.js +0 -77
  598. package/test/util/xml_utils_unit.js +0 -444
@@ -58,8 +58,10 @@ shaka.media.ExampleBasedCriteria = class {
58
58
  // We can't know if role and label are really important, so we don't use
59
59
  // role and label for this.
60
60
  const role = '';
61
- const label = '';
61
+ const audioLabel = '';
62
+ const videoLabel = '';
62
63
  const hdrLevel = '';
64
+ const spatialAudio = false;
63
65
  const videoLayout = '';
64
66
  const channelCount = example.audio && example.audio.channelsCount ?
65
67
  example.audio.channelsCount :
@@ -67,7 +69,8 @@ shaka.media.ExampleBasedCriteria = class {
67
69
 
68
70
  /** @private {!shaka.media.AdaptationSetCriteria} */
69
71
  this.fallback_ = new shaka.media.PreferenceBasedCriteria(
70
- example.language, role, channelCount, hdrLevel, videoLayout, label,
72
+ example.language, role, channelCount, hdrLevel, spatialAudio,
73
+ videoLayout, audioLabel, videoLabel,
71
74
  codecSwitchingStrategy, enableAudioGroups);
72
75
  }
73
76
 
@@ -106,12 +109,15 @@ shaka.media.PreferenceBasedCriteria = class {
106
109
  * @param {string} role
107
110
  * @param {number} channelCount
108
111
  * @param {string} hdrLevel
112
+ * @param {boolean} spatialAudio
109
113
  * @param {string} videoLayout
110
- * @param {string=} label
114
+ * @param {string=} audioLabel
115
+ * @param {string=} videoLabel
111
116
  * @param {shaka.config.CodecSwitchingStrategy=} codecSwitchingStrategy
112
117
  * @param {boolean=} enableAudioGroups
113
118
  */
114
- constructor(language, role, channelCount, hdrLevel, videoLayout, label = '',
119
+ constructor(language, role, channelCount, hdrLevel, spatialAudio,
120
+ videoLayout, audioLabel = '', videoLabel = '',
115
121
  codecSwitchingStrategy = shaka.config.CodecSwitchingStrategy.RELOAD,
116
122
  enableAudioGroups = false) {
117
123
  /** @private {string} */
@@ -122,10 +128,14 @@ shaka.media.PreferenceBasedCriteria = class {
122
128
  this.channelCount_ = channelCount;
123
129
  /** @private {string} */
124
130
  this.hdrLevel_ = hdrLevel;
131
+ /** @private {boolean} */
132
+ this.spatialAudio_ = spatialAudio;
125
133
  /** @private {string} */
126
134
  this.videoLayout_ = videoLayout;
127
135
  /** @private {string} */
128
- this.label_ = label;
136
+ this.audioLabel_ = audioLabel;
137
+ /** @private {string} */
138
+ this.videoLabel_ = videoLabel;
129
139
  /** @private {shaka.config.CodecSwitchingStrategy} */
130
140
  this.codecSwitchingStrategy_ = codecSwitchingStrategy;
131
141
  /** @private {boolean} */
@@ -191,15 +201,34 @@ shaka.media.PreferenceBasedCriteria = class {
191
201
  }
192
202
  }
193
203
 
194
- if (this.label_) {
195
- const byLabel = Class.filterVariantsByLabel_(current, this.label_);
204
+ if (this.audioLabel_) {
205
+ const byLabel = Class.filterVariantsByAudioLabel_(
206
+ current, this.audioLabel_);
207
+ if (byLabel.length) {
208
+ current = byLabel;
209
+ } else {
210
+ shaka.log.warning('No exact match for audio label could be found.');
211
+ }
212
+ }
213
+
214
+ if (this.videoLabel_) {
215
+ const byLabel = Class.filterVariantsByVideoLabel_(
216
+ current, this.videoLabel_);
196
217
  if (byLabel.length) {
197
218
  current = byLabel;
198
219
  } else {
199
- shaka.log.warning('No exact match for variant label could be found.');
220
+ shaka.log.warning('No exact match for video label could be found.');
200
221
  }
201
222
  }
202
223
 
224
+ const bySpatialAudio = Class.filterVariantsBySpatialAudio_(
225
+ current, this.spatialAudio_);
226
+ if (bySpatialAudio.length) {
227
+ current = bySpatialAudio;
228
+ } else {
229
+ shaka.log.warning('No exact match for spatial audio could be found.');
230
+ }
231
+
203
232
  const supportsSmoothCodecTransitions = this.codecSwitchingStrategy_ ==
204
233
  shaka.config.CodecSwitchingStrategy.SMOOTH &&
205
234
  shaka.media.Capabilities.isChangeTypeSupported();
@@ -259,14 +288,14 @@ shaka.media.PreferenceBasedCriteria = class {
259
288
  }
260
289
 
261
290
  /**
262
- * Filter Variants by label.
291
+ * Filter Variants by audio label.
263
292
  *
264
293
  * @param {!Array.<shaka.extern.Variant>} variants
265
294
  * @param {string} preferredLabel
266
295
  * @return {!Array.<shaka.extern.Variant>}
267
296
  * @private
268
297
  */
269
- static filterVariantsByLabel_(variants, preferredLabel) {
298
+ static filterVariantsByAudioLabel_(variants, preferredLabel) {
270
299
  return variants.filter((variant) => {
271
300
  if (!variant.audio || !variant.audio.label) {
272
301
  return false;
@@ -278,6 +307,26 @@ shaka.media.PreferenceBasedCriteria = class {
278
307
  });
279
308
  }
280
309
 
310
+ /**
311
+ * Filter Variants by video label.
312
+ *
313
+ * @param {!Array.<shaka.extern.Variant>} variants
314
+ * @param {string} preferredLabel
315
+ * @return {!Array.<shaka.extern.Variant>}
316
+ * @private
317
+ */
318
+ static filterVariantsByVideoLabel_(variants, preferredLabel) {
319
+ return variants.filter((variant) => {
320
+ if (!variant.video || !variant.video.label) {
321
+ return false;
322
+ }
323
+
324
+ const label1 = variant.video.label.toLowerCase();
325
+ const label2 = preferredLabel.toLowerCase();
326
+ return label1 == label2;
327
+ });
328
+ }
329
+
281
330
  /**
282
331
  * Filter Variants by channelCount.
283
332
  *
@@ -337,4 +386,21 @@ shaka.media.PreferenceBasedCriteria = class {
337
386
  return true;
338
387
  });
339
388
  }
389
+
390
+
391
+ /**
392
+ * Filters variants according to the given spatial audio config.
393
+ *
394
+ * @param {!Array.<shaka.extern.Variant>} variants
395
+ * @param {boolean} spatialAudio
396
+ * @private
397
+ */
398
+ static filterVariantsBySpatialAudio_(variants, spatialAudio) {
399
+ return variants.filter((variant) => {
400
+ if (variant.audio && variant.audio.spatialAudio != spatialAudio) {
401
+ return false;
402
+ }
403
+ return true;
404
+ });
405
+ }
340
406
  };
@@ -148,6 +148,9 @@ shaka.media.MediaSourceEngine = class {
148
148
 
149
149
  /** @private {boolean} */
150
150
  this.streamingAllowed_ = true;
151
+
152
+ /** @private {?number} */
153
+ this.lastDuration_ = null;
151
154
  }
152
155
 
153
156
  /**
@@ -1088,7 +1091,8 @@ shaka.media.MediaSourceEngine = class {
1088
1091
  * value will be dropped.
1089
1092
  * @param {boolean} ignoreTimestampOffset If true, the timestampOffset will
1090
1093
  * not be applied in this step.
1091
- * @param {shaka.extern.Stream} stream The current stream.
1094
+ * @param {string} mimeType
1095
+ * @param {string} codecs
1092
1096
  * @param {!Map.<shaka.util.ManifestParserUtils.ContentType,
1093
1097
  * shaka.extern.Stream>} streamsByType
1094
1098
  * A map of content types to streams. All streams must be supported
@@ -1098,7 +1102,7 @@ shaka.media.MediaSourceEngine = class {
1098
1102
  */
1099
1103
  async setStreamProperties(
1100
1104
  contentType, timestampOffset, appendWindowStart, appendWindowEnd,
1101
- ignoreTimestampOffset, stream, streamsByType) {
1105
+ ignoreTimestampOffset, mimeType, codecs, streamsByType) {
1102
1106
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
1103
1107
  if (contentType == ContentType.TEXT) {
1104
1108
  if (!ignoreTimestampOffset) {
@@ -1109,8 +1113,8 @@ shaka.media.MediaSourceEngine = class {
1109
1113
  }
1110
1114
  const operations = [];
1111
1115
 
1112
- const hasChangedCodecs =
1113
- await this.codecSwitchIfNecessary_(contentType, stream, streamsByType);
1116
+ const hasChangedCodecs = await this.codecSwitchIfNecessary_(
1117
+ contentType, mimeType, codecs, streamsByType);
1114
1118
 
1115
1119
  if (!hasChangedCodecs) {
1116
1120
  // Queue an abort() to help MSE splice together overlapping segments.
@@ -1241,6 +1245,7 @@ shaka.media.MediaSourceEngine = class {
1241
1245
  }
1242
1246
 
1243
1247
  this.mediaSource_.duration = duration;
1248
+ this.lastDuration_ = duration;
1244
1249
  });
1245
1250
  }
1246
1251
 
@@ -1758,7 +1763,11 @@ shaka.media.MediaSourceEngine = class {
1758
1763
  this.mediaSourceOpen_ = new shaka.util.PublicPromise();
1759
1764
  this.mediaSource_ = this.createMediaSource(this.mediaSourceOpen_);
1760
1765
  await this.mediaSourceOpen_;
1761
- this.mediaSource_.duration = previousDuration;
1766
+ if (!isNaN(previousDuration) && previousDuration) {
1767
+ this.mediaSource_.duration = previousDuration;
1768
+ } else if (!isNaN(this.lastDuration_) && this.lastDuration_) {
1769
+ this.mediaSource_.duration = this.lastDuration_;
1770
+ }
1762
1771
 
1763
1772
  const sourceBufferAdded = new shaka.util.PublicPromise();
1764
1773
  const sourceBuffers =
@@ -1819,15 +1828,17 @@ shaka.media.MediaSourceEngine = class {
1819
1828
  * Codec switch if necessary, this will not resolve until the codec
1820
1829
  * switch is over.
1821
1830
  * @param {shaka.util.ManifestParserUtils.ContentType} contentType
1822
- * @param {shaka.extern.Stream} stream
1831
+ * @param {string} mimeType
1832
+ * @param {string} codecs
1823
1833
  * @param {!Map.<shaka.util.ManifestParserUtils.ContentType,
1824
1834
  * shaka.extern.Stream>} streamsByType
1825
1835
  * @return {!Promise.<boolean>} true if there was a codec switch,
1826
1836
  * false otherwise.
1827
1837
  * @private
1828
1838
  */
1829
- async codecSwitchIfNecessary_(contentType, stream, streamsByType) {
1830
- if (contentType == shaka.util.ManifestParserUtils.ContentType.TEXT) {
1839
+ async codecSwitchIfNecessary_(contentType, mimeType, codecs, streamsByType) {
1840
+ const ContentType = shaka.util.ManifestParserUtils.ContentType;
1841
+ if (contentType == ContentType.TEXT) {
1831
1842
  return false;
1832
1843
  }
1833
1844
  const MimeUtils = shaka.util.MimeUtils;
@@ -1838,30 +1849,43 @@ shaka.media.MediaSourceEngine = class {
1838
1849
 
1839
1850
  /** @type {?shaka.extern.Transmuxer} */
1840
1851
  let transmuxer;
1841
- let newMimeType = shaka.util.MimeUtils.getFullType(
1842
- stream.mimeType, stream.codecs);
1852
+ let transmuxerMuxed = false;
1853
+ let newMimeType = shaka.util.MimeUtils.getFullType(mimeType, codecs);
1843
1854
  let needTransmux = this.config_.forceTransmux;
1844
1855
  if (!shaka.media.Capabilities.isTypeSupported(newMimeType) ||
1845
1856
  (!this.sequenceMode_ &&
1846
1857
  shaka.util.MimeUtils.RAW_FORMATS.includes(newMimeType))) {
1847
1858
  needTransmux = true;
1848
1859
  }
1849
- const newMimeTypeWithAllCodecs =
1850
- shaka.util.MimeUtils.getFullTypeWithAllCodecs(
1851
- stream.mimeType, stream.codecs);
1852
1860
  const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;
1853
1861
  if (needTransmux) {
1862
+ const newMimeTypeWithAllCodecs =
1863
+ shaka.util.MimeUtils.getFullTypeWithAllCodecs(mimeType, codecs);
1854
1864
  const transmuxerPlugin =
1855
1865
  TransmuxerEngine.findTransmuxer(newMimeTypeWithAllCodecs);
1856
1866
  if (transmuxerPlugin) {
1857
1867
  transmuxer = transmuxerPlugin();
1858
- newMimeType =
1859
- transmuxer.convertCodecs(contentType, newMimeTypeWithAllCodecs);
1868
+ const audioCodec = shaka.util.ManifestParserUtils.guessCodecsSafe(
1869
+ ContentType.AUDIO, (codecs || '').split(','));
1870
+ const videoCodec = shaka.util.ManifestParserUtils.guessCodecsSafe(
1871
+ ContentType.VIDEO, (codecs || '').split(','));
1872
+ if (audioCodec && videoCodec) {
1873
+ transmuxerMuxed = true;
1874
+ let codec = videoCodec;
1875
+ if (contentType == ContentType.AUDIO) {
1876
+ codec = audioCodec;
1877
+ }
1878
+ newMimeType = transmuxer.convertCodecs(contentType,
1879
+ shaka.util.MimeUtils.getFullTypeWithAllCodecs(mimeType, codec));
1880
+ } else {
1881
+ newMimeType =
1882
+ transmuxer.convertCodecs(contentType, newMimeTypeWithAllCodecs);
1883
+ }
1860
1884
  }
1861
1885
  }
1862
1886
 
1863
- const newAllCodecs = MimeUtils.getCodecs(newMimeType);
1864
- const newCodec = MimeUtils.getCodecBase(newAllCodecs);
1887
+ const newCodec = MimeUtils.getCodecBase(
1888
+ MimeUtils.getCodecs(newMimeType));
1865
1889
  const newBasicType = MimeUtils.getBasicType(newMimeType);
1866
1890
 
1867
1891
  // Current/new codecs base and basic type match then no need to switch
@@ -1870,7 +1894,7 @@ shaka.media.MediaSourceEngine = class {
1870
1894
  }
1871
1895
 
1872
1896
  let allowChangeType = true;
1873
- if (this.needSplitMuxedContent_ || (newAllCodecs.split(',').length &&
1897
+ if (this.needSplitMuxedContent_ || (transmuxerMuxed &&
1874
1898
  transmuxer && !this.transmuxers_[contentType])) {
1875
1899
  allowChangeType = false;
1876
1900
  }
@@ -57,6 +57,12 @@ shaka.media.InitSegmentReference = class {
57
57
 
58
58
  /** @type {?shaka.extern.aes128Key} */
59
59
  this.aes128Key = aes128Key;
60
+
61
+ /** @type {?string} */
62
+ this.codecs = null;
63
+
64
+ /** @type {?string} */
65
+ this.mimeType = null;
60
66
  }
61
67
 
62
68
  /**
@@ -305,6 +311,12 @@ shaka.media.SegmentReference = class {
305
311
  this.partialReferences[this.partialReferences.length - 1];
306
312
  lastPartial.markAsLastPartial();
307
313
  }
314
+
315
+ /** @type {?string} */
316
+ this.codecs = null;
317
+
318
+ /** @type {?string} */
319
+ this.mimeType = null;
308
320
  }
309
321
 
310
322
  /**
@@ -119,6 +119,9 @@ shaka.media.StreamingEngine = class {
119
119
 
120
120
  /** @private {!shaka.util.Destroyer} */
121
121
  this.destroyer_ = new shaka.util.Destroyer(() => this.doDestroy_());
122
+
123
+ /** @private {number} */
124
+ this.lastMediaSourceReset_ = 0;
122
125
  }
123
126
 
124
127
  /** @override */
@@ -1090,8 +1093,8 @@ shaka.media.StreamingEngine = class {
1090
1093
  this.config_.rebufferingGoal,
1091
1094
  this.config_.bufferingGoal);
1092
1095
 
1093
- const scaledBufferingGoal =
1094
- unscaledBufferingGoal * this.bufferingGoalScale_;
1096
+ const scaledBufferingGoal = Math.max(1,
1097
+ unscaledBufferingGoal * this.bufferingGoalScale_);
1095
1098
 
1096
1099
  // Check if we've buffered to the end of the presentation.
1097
1100
  const timeUntilEnd =
@@ -1636,6 +1639,13 @@ shaka.media.StreamingEngine = class {
1636
1639
  });
1637
1640
 
1638
1641
  if (!waitingForAnotherStreamToRecover) {
1642
+ if (this.config_.maxDisabledTime > 0) {
1643
+ const handled = this.playerInterface_.disableStream(
1644
+ mediaState.stream, this.config_.maxDisabledTime);
1645
+ if (handled) {
1646
+ return;
1647
+ }
1648
+ }
1639
1649
  // Reduction schedule: 80%, 60%, 40%, 20%, 16%, 12%, 8%, 4%, fail.
1640
1650
  // Note: percentages are used for comparisons to avoid rounding errors.
1641
1651
  const percentBefore = Math.round(100 * this.bufferingGoalScale_);
@@ -1761,7 +1771,8 @@ shaka.media.StreamingEngine = class {
1761
1771
  await this.playerInterface_.mediaSourceEngine.setStreamProperties(
1762
1772
  mediaState.type, timestampOffset, appendWindowStart,
1763
1773
  appendWindowEnd, ignoreTimestampOffset,
1764
- mediaState.stream, streamsByType);
1774
+ reference.mimeType || mediaState.stream.mimeType,
1775
+ reference.codecs || mediaState.stream.codecs, streamsByType);
1765
1776
  if (isResetMediaSourceNecessary) {
1766
1777
  let otherState = null;
1767
1778
  if (mediaState.type === ContentType.VIDEO) {
@@ -2453,6 +2464,47 @@ shaka.media.StreamingEngine = class {
2453
2464
  return this.config_.maxDisabledTime;
2454
2465
  }
2455
2466
 
2467
+ /**
2468
+ * Reset Media Source
2469
+ *
2470
+ * @return {!Promise.<boolean>}
2471
+ */
2472
+ async resetMediaSource() {
2473
+ const now = (Date.now() / 1000);
2474
+ const minTimeBetweenRecoveries = this.config_.minTimeBetweenRecoveries;
2475
+ if (!this.config_.allowMediaSourceRecoveries ||
2476
+ (now - this.lastMediaSourceReset_) < minTimeBetweenRecoveries) {
2477
+ return false;
2478
+ }
2479
+ this.lastMediaSourceReset_ = now;
2480
+ const ContentType = shaka.util.ManifestParserUtils.ContentType;
2481
+ const audioMediaState = this.mediaStates_.get(ContentType.AUDIO);
2482
+ if (audioMediaState) {
2483
+ audioMediaState.lastInitSegmentReference = null;
2484
+ this.forceClearBuffer_(audioMediaState);
2485
+ this.abortOperations_(audioMediaState).catch(() => {});
2486
+ }
2487
+ const videoMediaState = this.mediaStates_.get(ContentType.VIDEO);
2488
+ if (videoMediaState) {
2489
+ videoMediaState.lastInitSegmentReference = null;
2490
+ this.forceClearBuffer_(videoMediaState);
2491
+ this.abortOperations_(videoMediaState).catch(() => {});
2492
+ }
2493
+ /**
2494
+ * @type {!Map.<shaka.util.ManifestParserUtils.ContentType,
2495
+ * shaka.extern.Stream>}
2496
+ */
2497
+ const streamsByType = new Map();
2498
+ if (this.currentVariant_.audio) {
2499
+ streamsByType.set(ContentType.AUDIO, this.currentVariant_.audio);
2500
+ }
2501
+ if (this.currentVariant_.video) {
2502
+ streamsByType.set(ContentType.VIDEO, this.currentVariant_.video);
2503
+ }
2504
+ await this.playerInterface_.mediaSourceEngine.reset(streamsByType);
2505
+ return true;
2506
+ }
2507
+
2456
2508
  /**
2457
2509
  * @param {shaka.media.StreamingEngine.MediaState_} mediaState
2458
2510
  * @return {string} A log prefix of the form ($CONTENT_TYPE:$STREAM_ID), e.g.,
package/lib/player.js CHANGED
@@ -39,6 +39,7 @@ goog.require('shaka.text.UITextDisplayer');
39
39
  goog.require('shaka.text.WebVttGenerator');
40
40
  goog.require('shaka.util.BufferUtils');
41
41
  goog.require('shaka.util.CmcdManager');
42
+ goog.require('shaka.util.CmsdManager');
42
43
  goog.require('shaka.util.ConfigUtils');
43
44
  goog.require('shaka.util.Dom');
44
45
  goog.require('shaka.util.Error');
@@ -598,6 +599,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
598
599
  /** @private {shaka.util.CmcdManager} */
599
600
  this.cmcdManager_ = null;
600
601
 
602
+ /** @private {shaka.util.CmsdManager} */
603
+ this.cmsdManager_ = null;
604
+
601
605
  // This is the canvas element that will be used for rendering LCEVC
602
606
  // enhanced frames.
603
607
  /** @private {?HTMLCanvasElement} */
@@ -676,8 +680,10 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
676
680
  this.config_.preferredVariantRole,
677
681
  this.config_.preferredAudioChannelCount,
678
682
  this.config_.preferredVideoHdrLevel,
683
+ this.config_.preferSpatialAudio,
679
684
  this.config_.preferredVideoLayout,
680
685
  this.config_.preferredAudioLabel,
686
+ this.config_.preferredVideoLabel,
681
687
  this.config_.mediaSource.codecSwitchingStrategy,
682
688
  this.config_.manifest.dash.enableAudioGroups);
683
689
 
@@ -701,6 +707,8 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
701
707
  // Create the CMCD manager so client data can be attached to all requests
702
708
  this.cmcdManager_ = this.createCmcd_();
703
709
 
710
+ this.cmsdManager_ = this.createCmsd_();
711
+
704
712
  this.networkingEngine_ = this.createNetworkingEngine();
705
713
  this.networkingEngine_.setForceHTTPS(this.config_.streaming.forceHTTPS);
706
714
 
@@ -846,6 +854,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
846
854
  this.stats_ = null;
847
855
  this.videoContainer_ = null;
848
856
  this.cmcdManager_ = null;
857
+ this.cmsdManager_ = null;
849
858
 
850
859
  if (this.networkingEngine_) {
851
860
  await this.networkingEngine_.destroy();
@@ -1217,6 +1226,10 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
1217
1226
  this.adManager_.onAssetUnload();
1218
1227
  }
1219
1228
 
1229
+ if (this.cmsdManager_) {
1230
+ this.cmsdManager_.reset();
1231
+ }
1232
+
1220
1233
  if (this.video_) {
1221
1234
  // Remove all track nodes
1222
1235
  shaka.util.Dom.removeAllChildren(this.video_);
@@ -1576,6 +1589,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
1576
1589
  goog.asserts.assert(
1577
1590
  this.cmcdManager_,
1578
1591
  'Need CMCD manager to populate manifest request data.');
1592
+ goog.asserts.assert(
1593
+ this.cmsdManager_,
1594
+ 'Need CMSD manager to process response headers.');
1579
1595
  goog.asserts.assert(
1580
1596
  this.config_,
1581
1597
  'Need player config when initializing the parser.');
@@ -1825,6 +1841,12 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
1825
1841
  'Please use an AbrManager with setMediaElement function.');
1826
1842
  this.abrManager_.setMediaElement = () => {};
1827
1843
  }
1844
+ if (typeof this.abrManager_.setCmsdManager != 'function') {
1845
+ shaka.Deprecate.deprecateFeature(5,
1846
+ 'AbrManager',
1847
+ 'Please use an AbrManager with setCmsdManager function.');
1848
+ this.abrManager_.setCmsdManager = () => {};
1849
+ }
1828
1850
  this.abrManager_.configure(this.config_.abr);
1829
1851
  }
1830
1852
 
@@ -1836,8 +1858,10 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
1836
1858
  this.config_.preferredVariantRole,
1837
1859
  this.config_.preferredAudioChannelCount,
1838
1860
  this.config_.preferredVideoHdrLevel,
1861
+ this.config_.preferSpatialAudio,
1839
1862
  this.config_.preferredVideoLayout,
1840
1863
  this.config_.preferredAudioLabel,
1864
+ this.config_.preferredVideoLabel,
1841
1865
  this.config_.mediaSource.codecSwitchingStrategy,
1842
1866
  this.config_.manifest.dash.enableAudioGroups);
1843
1867
 
@@ -1853,6 +1877,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
1853
1877
  return this.switch_(variant, clearBuffer, safeMargin);
1854
1878
  });
1855
1879
  this.abrManager_.setMediaElement(mediaElement);
1880
+ this.abrManager_.setCmsdManager(this.cmsdManager_);
1856
1881
 
1857
1882
  // If the content is multi-codec and the browser can play more than one of
1858
1883
  // them, choose codecs now before we initialize streaming.
@@ -2607,6 +2632,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2607
2632
  .set('request', request)
2608
2633
  .set('requestType', requestType);
2609
2634
  this.dispatchEvent(this.makeEvent_(name, data));
2635
+ if (this.cmsdManager_) {
2636
+ this.cmsdManager_.processHeaders(headers);
2637
+ }
2610
2638
  };
2611
2639
  /** @type {shaka.net.NetworkingEngine.OnDownloadFailed} */
2612
2640
  const onDownloadFailed_ = (request, error, httpResponseCode, aborted) => {
@@ -2847,6 +2875,15 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2847
2875
  return new shaka.util.CmcdManager(playerInterface, this.config_.cmcd);
2848
2876
  }
2849
2877
 
2878
+ /**
2879
+ * Create a new CMSD manager.
2880
+ *
2881
+ * @private
2882
+ */
2883
+ createCmsd_() {
2884
+ return new shaka.util.CmsdManager(this.config_.cmsd);
2885
+ }
2886
+
2850
2887
  /**
2851
2888
  * Creates a new instance of StreamingEngine. This can be replaced by tests
2852
2889
  * to create fake instances instead.
@@ -2947,9 +2984,10 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2947
2984
  }
2948
2985
 
2949
2986
  // If lowLatencyMode is enabled, and inaccurateManifestTolerance and
2950
- // rebufferingGoal and segmentPrefetchLimit are not specified, set
2951
- // inaccurateManifestTolerance to 0 and rebufferingGoal to 0.01 and
2952
- // segmentPrefetchLimit to 2 by default for low latency streaming.
2987
+ // rebufferingGoal and segmentPrefetchLimit and baseDelay are not
2988
+ // specified, set inaccurateManifestTolerance to 0 and rebufferingGoal
2989
+ // to 0.01 and segmentPrefetchLimit to 2 and baseDelay to 100 by default
2990
+ // for low latency streaming.
2953
2991
  if (config['streaming'] && config['streaming']['lowLatencyMode']) {
2954
2992
  if (config['streaming']['inaccurateManifestTolerance'] == undefined) {
2955
2993
  config['streaming']['inaccurateManifestTolerance'] = 0;
@@ -2960,6 +2998,30 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
2960
2998
  if (config['streaming']['segmentPrefetchLimit'] == undefined) {
2961
2999
  config['streaming']['segmentPrefetchLimit'] = 2;
2962
3000
  }
3001
+ if (config['streaming']['retryParameters'] == undefined) {
3002
+ config['streaming']['retryParameters'] = {};
3003
+ }
3004
+ if (config['streaming']['retryParameters']['baseDelay'] == undefined) {
3005
+ config['streaming']['retryParameters']['baseDelay'] = 100;
3006
+ }
3007
+ if (config['manifest'] == undefined) {
3008
+ config['manifest'] = {};
3009
+ }
3010
+ if (config['manifest']['retryParameters'] == undefined) {
3011
+ config['manifest']['retryParameters'] = {};
3012
+ }
3013
+ if (config['manifest']['retryParameters']['baseDelay'] == undefined) {
3014
+ config['manifest']['retryParameters']['baseDelay'] = 100;
3015
+ }
3016
+ if (config['drm'] == undefined) {
3017
+ config['drm'] = {};
3018
+ }
3019
+ if (config['drm']['retryParameters'] == undefined) {
3020
+ config['drm']['retryParameters'] = {};
3021
+ }
3022
+ if (config['drm']['retryParameters']['baseDelay'] == undefined) {
3023
+ config['drm']['retryParameters']['baseDelay'] = 100;
3024
+ }
2963
3025
  }
2964
3026
  const ret = shaka.util.PlayerConfiguration.mergeConfigObjects(
2965
3027
  this.config_, config, this.defaultConfig_());
@@ -3065,6 +3127,9 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
3065
3127
  if (this.cmcdManager_) {
3066
3128
  this.cmcdManager_.configure(this.config_.cmcd);
3067
3129
  }
3130
+ if (this.cmsdManager_) {
3131
+ this.cmsdManager_.configure(this.config_.cmsd);
3132
+ }
3068
3133
  }
3069
3134
 
3070
3135
  /**
@@ -4001,8 +4066,10 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
4001
4066
  role || '',
4002
4067
  channelsCount,
4003
4068
  /* hdrLevel= */ '',
4069
+ /* spatialAudio= */ false,
4004
4070
  /* videoLayout= */ '',
4005
- /* label= */ '',
4071
+ /* audioLabel= */ '',
4072
+ /* videoLabel= */ '',
4006
4073
  this.config_.mediaSource.codecSwitchingStrategy,
4007
4074
  this.config_.manifest.dash.enableAudioGroups);
4008
4075
 
@@ -4125,8 +4192,10 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
4125
4192
  /* role= */ '',
4126
4193
  /* channelCount= */ 0,
4127
4194
  /* hdrLevel= */ '',
4195
+ /* spatialAudio= */ false,
4128
4196
  /* videoLayout= */ '',
4129
4197
  label,
4198
+ /* videoLabel= */ '',
4130
4199
  this.config_.mediaSource.codecSwitchingStrategy,
4131
4200
  this.config_.manifest.dash.enableAudioGroups);
4132
4201
 
@@ -6188,7 +6257,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
6188
6257
  * @param {!shaka.util.Error} error
6189
6258
  * @private
6190
6259
  */
6191
- onError_(error) {
6260
+ async onError_(error) {
6192
6261
  goog.asserts.assert(error instanceof shaka.util.Error, 'Wrong error type!');
6193
6262
 
6194
6263
  // Errors dispatched after |destroy| is called are not meaningful and should
@@ -6197,6 +6266,23 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
6197
6266
  return;
6198
6267
  }
6199
6268
 
6269
+ let fireError = true;
6270
+ if (this.fullyLoaded_ && this.manifest_ && this.streamingEngine_ &&
6271
+ (error.code == shaka.util.Error.Code.VIDEO_ERROR ||
6272
+ error.code == shaka.util.Error.Code.MEDIA_SOURCE_OPERATION_FAILED ||
6273
+ error.code == shaka.util.Error.Code.MEDIA_SOURCE_OPERATION_THREW ||
6274
+ error.code == shaka.util.Error.Code.TRANSMUXING_FAILED)) {
6275
+ try {
6276
+ const ret = await this.streamingEngine_.resetMediaSource();
6277
+ fireError = !ret;
6278
+ } catch (e) {
6279
+ fireError = true;
6280
+ }
6281
+ }
6282
+ if (!fireError) {
6283
+ return;
6284
+ }
6285
+
6200
6286
  // Restore disabled variant if the player experienced a critical error.
6201
6287
  if (error.severity === shaka.util.Error.Severity.CRITICAL) {
6202
6288
  this.restoreDisabledVariants_(/* updateAbrManager= */ false);
@@ -6779,7 +6865,7 @@ shaka.Player.TYPICAL_BUFFERING_THRESHOLD_ = 0.5;
6779
6865
  * @export
6780
6866
  */
6781
6867
  // eslint-disable-next-line no-useless-concat
6782
- shaka.Player.version = 'v4.6.4' + '-uncompiled'; // x-release-please-version
6868
+ shaka.Player.version = 'v4.7.0' + '-uncompiled'; // x-release-please-version
6783
6869
 
6784
6870
  // Initialize the deprecation system using the version string we just set
6785
6871
  // on the player.