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
@@ -1,1068 +0,0 @@
1
- /*! @license
2
- * Shaka Player
3
- * Copyright 2016 Google LLC
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
-
7
- describe('StreamUtils', () => {
8
- const StreamUtils = shaka.util.StreamUtils;
9
-
10
- let manifest;
11
- /** @type {!jasmine.Spy} */
12
- let decodingInfoSpy;
13
-
14
- const originalDecodingInfo = navigator.mediaCapabilities.decodingInfo;
15
-
16
- beforeEach(() => {
17
- decodingInfoSpy = jasmine.createSpy('decodingInfo');
18
- });
19
-
20
- afterEach(() => {
21
- navigator.mediaCapabilities.decodingInfo = originalDecodingInfo;
22
- });
23
-
24
- describe('filterStreamsByLanguageAndRole', () => {
25
- it('chooses text streams in user\'s preferred language', () => {
26
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
27
- manifest.addTextStream(1, (stream) => {
28
- stream.language = 'en';
29
- });
30
- manifest.addTextStream(2, (stream) => {
31
- stream.language = 'es';
32
- });
33
- manifest.addTextStream(3, (stream) => {
34
- stream.language = 'en';
35
- });
36
- });
37
-
38
- const chosen = StreamUtils.filterStreamsByLanguageAndRole(
39
- manifest.textStreams,
40
- 'en',
41
- '',
42
- false);
43
- expect(chosen.length).toBe(2);
44
- expect(chosen[0]).toBe(manifest.textStreams[0]);
45
- expect(chosen[1]).toBe(manifest.textStreams[2]);
46
- });
47
-
48
- it('chooses text streams in user\'s preferred forced language', () => {
49
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
50
- manifest.addTextStream(1, (stream) => {
51
- stream.language = 'en';
52
- });
53
- manifest.addTextStream(2, (stream) => {
54
- stream.language = 'es';
55
- });
56
- manifest.addTextStream(3, (stream) => {
57
- stream.language = 'en';
58
- stream.forced = true;
59
- });
60
- });
61
-
62
- const chosen = StreamUtils.filterStreamsByLanguageAndRole(
63
- manifest.textStreams,
64
- 'en',
65
- '',
66
- true);
67
- expect(chosen.length).toBe(1);
68
- expect(chosen[0]).toBe(manifest.textStreams[2]);
69
- });
70
-
71
- it('no chooses text streams if there are not forced language', () => {
72
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
73
- manifest.addTextStream(1, (stream) => {
74
- stream.language = 'en';
75
- });
76
- manifest.addTextStream(2, (stream) => {
77
- stream.language = 'es';
78
- });
79
- });
80
-
81
- const chosen = StreamUtils.filterStreamsByLanguageAndRole(
82
- manifest.textStreams,
83
- 'es',
84
- '',
85
- true);
86
- expect(chosen.length).toBe(0);
87
- });
88
-
89
- it('chooses primary text streams', () => {
90
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
91
- manifest.addTextStream(1);
92
- manifest.addTextStream(2, (stream) => {
93
- stream.primary = true;
94
- });
95
- manifest.addTextStream(3, (stream) => {
96
- stream.primary = true;
97
- });
98
- });
99
-
100
- const chosen = StreamUtils.filterStreamsByLanguageAndRole(
101
- manifest.textStreams,
102
- 'en',
103
- '',
104
- false);
105
- expect(chosen.length).toBe(2);
106
- expect(chosen[0]).toBe(manifest.textStreams[1]);
107
- expect(chosen[1]).toBe(manifest.textStreams[2]);
108
- });
109
-
110
- it('chooses text streams in preferred language and role', () => {
111
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
112
- manifest.addTextStream(1, (stream) => {
113
- stream.language = 'en';
114
- stream.roles = ['main', 'commentary'];
115
- });
116
- manifest.addTextStream(2, (stream) => {
117
- stream.language = 'es';
118
- });
119
- manifest.addTextStream(3, (stream) => {
120
- stream.language = 'en';
121
- stream.roles = ['caption'];
122
- });
123
- });
124
-
125
- const chosen = StreamUtils.filterStreamsByLanguageAndRole(
126
- manifest.textStreams,
127
- 'en',
128
- 'main',
129
- false);
130
- expect(chosen.length).toBe(1);
131
- expect(chosen[0]).toBe(manifest.textStreams[0]);
132
- });
133
-
134
- it('prefers no-role streams if there is no preferred role', () => {
135
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
136
- manifest.addTextStream(0, (stream) => {
137
- stream.language = 'en';
138
- stream.roles = ['commentary'];
139
- });
140
- manifest.addTextStream(1, (stream) => {
141
- stream.language = 'en';
142
- });
143
- manifest.addTextStream(2, (stream) => {
144
- stream.language = 'en';
145
- stream.roles = ['secondary'];
146
- });
147
- });
148
-
149
- const chosen = StreamUtils.filterStreamsByLanguageAndRole(
150
- manifest.textStreams,
151
- 'en',
152
- '',
153
- false);
154
- expect(chosen.length).toBe(1);
155
- expect(chosen[0].roles.length).toBe(0); // Pick a stream with no role.
156
- });
157
-
158
- it('ignores no-role streams if there is a preferred role', () => {
159
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
160
- manifest.addTextStream(0, (stream) => {
161
- stream.language = 'en';
162
- stream.roles = ['commentary'];
163
- });
164
- manifest.addTextStream(1, (stream) => {
165
- stream.language = 'en';
166
- });
167
- manifest.addTextStream(2, (stream) => {
168
- stream.language = 'en';
169
- stream.roles = ['secondary'];
170
- });
171
- });
172
-
173
- const chosen = StreamUtils.filterStreamsByLanguageAndRole(
174
- manifest.textStreams,
175
- 'en',
176
- 'main', false); // A role that is not present.
177
- expect(chosen.length).toBe(1);
178
- expect(chosen[0].roles.length).toBe(1); // Pick a stream with a role.
179
- });
180
-
181
- it('chooses only one role, even if none is preferred', () => {
182
- // Regression test for https://github.com/shaka-project/shaka-player/issues/949
183
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
184
- manifest.addTextStream(0, (stream) => {
185
- stream.language = 'en';
186
- stream.roles = ['commentary'];
187
- });
188
- manifest.addTextStream(1, (stream) => {
189
- stream.language = 'en';
190
- stream.roles = ['commentary'];
191
- });
192
- manifest.addTextStream(2, (stream) => {
193
- stream.language = 'en';
194
- stream.roles = ['secondary'];
195
- });
196
- manifest.addTextStream(3, (stream) => {
197
- stream.language = 'en';
198
- stream.roles = ['secondary'];
199
- });
200
- manifest.addTextStream(4, (stream) => {
201
- stream.language = 'en';
202
- stream.roles = ['main'];
203
- });
204
- manifest.addTextStream(5, (stream) => {
205
- stream.language = 'en';
206
- stream.roles = ['main'];
207
- });
208
- });
209
-
210
- const chosen = StreamUtils.filterStreamsByLanguageAndRole(
211
- manifest.textStreams,
212
- 'en',
213
- '', false);
214
- // Which role is chosen is an implementation detail.
215
- // Each role is found on two text streams, so we should have two.
216
- expect(chosen.length).toBe(2);
217
- expect(chosen[0].roles[0]).toBe(chosen[1].roles[0]);
218
- });
219
-
220
- it('chooses only one role, even if all are primary', () => {
221
- // Regression test for https://github.com/shaka-project/shaka-player/issues/949
222
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
223
- manifest.addTextStream(0, (stream) => {
224
- stream.language = 'en';
225
- stream.primary = true;
226
- stream.roles = ['commentary'];
227
- });
228
- manifest.addTextStream(1, (stream) => {
229
- stream.language = 'en';
230
- stream.primary = true;
231
- stream.roles = ['commentary'];
232
- });
233
- manifest.addTextStream(2, (stream) => {
234
- stream.language = 'en';
235
- stream.primary = true;
236
- stream.roles = ['secondary'];
237
- });
238
- manifest.addTextStream(3, (stream) => {
239
- stream.language = 'en';
240
- stream.primary = true;
241
- stream.roles = ['secondary'];
242
- });
243
- manifest.addTextStream(4, (stream) => {
244
- stream.language = 'en';
245
- stream.primary = true;
246
- stream.roles = ['main'];
247
- });
248
- manifest.addTextStream(5, (stream) => {
249
- stream.language = 'en';
250
- stream.primary = true;
251
- stream.roles = ['main'];
252
- });
253
- });
254
-
255
- const chosen = StreamUtils.filterStreamsByLanguageAndRole(
256
- manifest.textStreams,
257
- 'zh',
258
- '',
259
- false);
260
- // Which role is chosen is an implementation detail.
261
- // Each role is found on two text streams, so we should have two.
262
- expect(chosen.length).toBe(2);
263
- expect(chosen[0].roles[0]).toBe(chosen[1].roles[0]);
264
- });
265
-
266
- it('chooses only one language, even if all are primary', () => {
267
- // Regression test for https://github.com/shaka-project/shaka-player/issues/918
268
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
269
- manifest.addTextStream(0, (stream) => {
270
- stream.language = 'en';
271
- stream.primary = true;
272
- });
273
- manifest.addTextStream(1, (stream) => {
274
- stream.language = 'en';
275
- stream.primary = true;
276
- });
277
- manifest.addTextStream(2, (stream) => {
278
- stream.language = 'es';
279
- stream.primary = true;
280
- });
281
- manifest.addTextStream(3, (stream) => {
282
- stream.language = 'es';
283
- stream.primary = true;
284
- });
285
- });
286
-
287
- const chosen = StreamUtils.filterStreamsByLanguageAndRole(
288
- manifest.textStreams,
289
- 'zh',
290
- '',
291
- false);
292
- // Which language is chosen is an implementation detail.
293
- // Each role is found on two variants, so we should have two.
294
- expect(chosen.length).toBe(2);
295
- expect(chosen[0].language).toBe(chosen[1].language);
296
- });
297
-
298
- it('chooses a role from among primary streams without language match',
299
- () => {
300
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
301
- manifest.addTextStream(0, (stream) => {
302
- stream.language = 'en';
303
- stream.primary = true;
304
- stream.roles = ['commentary'];
305
- });
306
- manifest.addTextStream(1, (stream) => {
307
- stream.language = 'en';
308
- stream.primary = true;
309
- stream.roles = ['commentary'];
310
- });
311
- manifest.addTextStream(2, (stream) => {
312
- stream.language = 'en';
313
- stream.roles = ['secondary'];
314
- });
315
- manifest.addTextStream(3, (stream) => {
316
- stream.language = 'en';
317
- stream.roles = ['secondary'];
318
- });
319
- manifest.addTextStream(4, (stream) => {
320
- stream.language = 'en';
321
- stream.primary = true;
322
- stream.roles = ['main'];
323
- });
324
- manifest.addTextStream(5, (stream) => {
325
- stream.language = 'en';
326
- stream.primary = true;
327
- stream.roles = ['main'];
328
- });
329
- });
330
-
331
- const chosen = StreamUtils.filterStreamsByLanguageAndRole(
332
- manifest.textStreams,
333
- 'zh',
334
- '',
335
- false);
336
- // Which role is chosen is an implementation detail.
337
- // Each role is found on two text streams, so we should have two.
338
- expect(chosen.length).toBe(2);
339
- expect(chosen[0].roles[0]).toBe(chosen[1].roles[0]);
340
-
341
- // Since nothing matches our language preference, we chose primary
342
- // text streams.
343
- expect(chosen[0].primary).toBe(true);
344
- expect(chosen[1].primary).toBe(true);
345
- });
346
-
347
- it('chooses a role from best language match, in spite of primary',
348
- () => {
349
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
350
- manifest.addTextStream(0, (stream) => {
351
- stream.language = 'en';
352
- stream.primary = true;
353
- stream.roles = ['commentary'];
354
- });
355
- manifest.addTextStream(1, (stream) => {
356
- stream.language = 'en';
357
- stream.primary = true;
358
- stream.roles = ['commentary'];
359
- });
360
- manifest.addTextStream(2, (stream) => {
361
- stream.language = 'zh';
362
- stream.roles = ['secondary'];
363
- });
364
- manifest.addTextStream(3, (stream) => {
365
- stream.language = 'zh';
366
- stream.roles = ['secondary'];
367
- });
368
- manifest.addTextStream(4, (stream) => {
369
- stream.language = 'en';
370
- stream.primary = true;
371
- stream.roles = ['main'];
372
- });
373
- manifest.addTextStream(5, (stream) => {
374
- stream.language = 'en';
375
- stream.primary = true;
376
- stream.roles = ['main'];
377
- });
378
- });
379
-
380
- const chosen = StreamUtils.filterStreamsByLanguageAndRole(
381
- manifest.textStreams,
382
- 'zh',
383
- '',
384
- false);
385
- expect(chosen.length).toBe(2);
386
- expect(chosen[0].language).toBe('zh');
387
- expect(chosen[1].language).toBe('zh');
388
- expect(chosen[0].primary).toBe(false);
389
- expect(chosen[1].primary).toBe(false);
390
- });
391
- });
392
-
393
- describe('getDecodingInfosForVariants', () => {
394
- it('for multiplexd content', async () => {
395
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
396
- manifest.addVariant(0, (variant) => {
397
- variant.addVideo(1, (stream) => {
398
- stream.mime('video/mp2t', 'avc1.4d400d,mp4a.40.2');
399
- });
400
- });
401
- });
402
-
403
- await StreamUtils.getDecodingInfosForVariants(manifest.variants,
404
- /* usePersistentLicenses= */false, /* srcEquals= */ false,
405
- /* preferredKeySystems= */ []);
406
- expect(manifest.variants.length).toBeTruthy();
407
- expect(manifest.variants[0].decodingInfos.length).toBe(1);
408
- expect(manifest.variants[0].decodingInfos[0].supported).toBeTruthy();
409
- });
410
-
411
- it('for srcEquals content', async () => {
412
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
413
- manifest.addVariant(0, (variant) => {
414
- variant.addVideo(1, (stream) => {
415
- stream.mime('video/mp4', 'avc1.4d400d');
416
- });
417
- });
418
- });
419
-
420
- await StreamUtils.getDecodingInfosForVariants(manifest.variants,
421
- /* usePersistentLicenses= */false, /* srcEquals= */ true,
422
- /* preferredKeySystems= */ []);
423
- expect(manifest.variants.length).toBeTruthy();
424
- expect(manifest.variants[0].decodingInfos.length).toBe(1);
425
- expect(manifest.variants[0].decodingInfos[0].supported).toBeTruthy();
426
- });
427
-
428
- it('handles decodingInfo exception', async () => {
429
- navigator.mediaCapabilities.decodingInfo =
430
- shaka.test.Util.spyFunc(decodingInfoSpy);
431
- // If decodingInfo() fails, setDecodingInfo should finish without throwing
432
- // an exception, and the variant should have no decodingInfo result.
433
- decodingInfoSpy.and.throwError('MediaCapabilties.decodingInfo failed.');
434
-
435
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
436
- manifest.addVariant(0, (variant) => {
437
- variant.addVideo(1, (stream) => {
438
- stream.mime('video/mp4', 'avc1');
439
- stream.encrypted = true;
440
- stream.mime('video/mp4', 'avc1.4d400d');
441
- });
442
- variant.addAudio(2, (stream) => {
443
- stream.mime('audio/mp4', 'mp4a.40.2');
444
- stream.encrypted = true;
445
- stream.addDrmInfo('com.widevine.alpha');
446
- });
447
- });
448
- });
449
-
450
- await StreamUtils.getDecodingInfosForVariants(manifest.variants,
451
- /* usePersistentLicenses= */false, /* srcEquals= */ false,
452
- /* preferredKeySystems= */ []);
453
- expect(manifest.variants.length).toBe(1);
454
- expect(manifest.variants[0].decodingInfos.length).toBe(0);
455
- });
456
-
457
- it('includes transferFunction in config when hdr', async () => {
458
- const originalDecodingInfo = navigator.mediaCapabilities.decodingInfo;
459
-
460
- try {
461
- navigator.mediaCapabilities.decodingInfo =
462
- shaka.test.Util.spyFunc(decodingInfoSpy);
463
-
464
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
465
- manifest.addVariant(0, (variant) => {
466
- variant.addVideo(0, (stream) => {
467
- stream.mime('video/mp4', 'avc1.640028');
468
- stream.hdr = 'SDR';
469
- });
470
- });
471
- manifest.addVariant(1, (variant) => {
472
- variant.addVideo(1, (stream) => {
473
- stream.mime('video/mp4', 'hvc1.2.4.L150.90');
474
- stream.hdr = 'PQ';
475
- });
476
- });
477
- manifest.addVariant(2, (variant) => {
478
- variant.addVideo(2, (stream) => {
479
- stream.mime('video/mp4', 'hvc1.2.4.L153.B0');
480
- stream.hdr = 'HLG';
481
- });
482
- });
483
- });
484
-
485
- await StreamUtils.getDecodingInfosForVariants(manifest.variants,
486
- /* usePersistentLicenses= */ false, /* srcEquals= */ false,
487
- /* preferredKeySystems= */ []);
488
- expect(decodingInfoSpy.calls.argsFor(0)[0].video.transferFunction)
489
- .toBe('srgb');
490
- expect(decodingInfoSpy.calls.argsFor(1)[0].video.transferFunction)
491
- .toBe('pq');
492
- expect(decodingInfoSpy.calls.argsFor(2)[0].video.transferFunction)
493
- .toBe('hlg');
494
- } finally {
495
- navigator.mediaCapabilities.decodingInfo = originalDecodingInfo;
496
- }
497
- });
498
-
499
- it('includes streams only with preferred key system', async () => {
500
- const originalDecodingInfo = navigator.mediaCapabilities.decodingInfo;
501
-
502
- try {
503
- navigator.mediaCapabilities.decodingInfo =
504
- shaka.test.Util.spyFunc(decodingInfoSpy);
505
-
506
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
507
- manifest.addVariant(0, (variant) => {
508
- variant.addVideo(1, (stream) => {
509
- stream.mime('video/mp4', 'avc1.4d400d');
510
- stream.encrypted = true;
511
- stream.addDrmInfo('com.widevine.alpha');
512
- stream.addDrmInfo('com.microsoft.playready');
513
- });
514
- });
515
- });
516
-
517
- await StreamUtils.getDecodingInfosForVariants(manifest.variants,
518
- /* usePersistentLicenses= */ false, /* srcEquals= */ false,
519
- /* preferredKeySystems= */ ['com.microsoft.playready']);
520
-
521
- // if preferred key system satisfies us, we shouldn't check other ones.
522
- expect(decodingInfoSpy).toHaveBeenCalledTimes(1);
523
- expect(decodingInfoSpy.calls.argsFor(0)[0].keySystemConfiguration
524
- .keySystem)
525
- .toBe('com.microsoft.playready');
526
- } finally {
527
- navigator.mediaCapabilities.decodingInfo = originalDecodingInfo;
528
- }
529
- });
530
- });
531
-
532
- describe('filterManifest', () => {
533
- let fakeDrmEngine;
534
-
535
- beforeAll(() => {
536
- fakeDrmEngine = new shaka.test.FakeDrmEngine();
537
- });
538
-
539
- it('filters text streams with the full MIME type', async () => {
540
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
541
- manifest.addTextStream(1, (stream) => {
542
- stream.mimeType = 'text/vtt';
543
- });
544
- manifest.addTextStream(2, (stream) => {
545
- stream.mime('application/mp4', 'wvtt');
546
- });
547
- manifest.addTextStream(3, (stream) => {
548
- stream.mimeType = 'text/bogus';
549
- });
550
- manifest.addTextStream(4, (stream) => {
551
- stream.mime('application/mp4', 'bogus');
552
- });
553
- });
554
-
555
- await shaka.util.StreamUtils.filterManifest(fakeDrmEngine, manifest);
556
-
557
- // Covers a regression in which we would remove streams with codecs.
558
- // The last two streams should be removed because their full MIME types
559
- // are bogus.
560
- expect(manifest.textStreams.length).toBe(2);
561
- expect(manifest.textStreams[0].id).toBe(1);
562
- expect(manifest.textStreams[1].id).toBe(2);
563
- });
564
-
565
- it('filters image streams', async () => {
566
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
567
- manifest.addImageStream(1, (stream) => {
568
- stream.mimeType = 'image/svg+xml';
569
- });
570
- manifest.addImageStream(2, (stream) => {
571
- stream.mimeType = 'image/png';
572
- });
573
- manifest.addImageStream(3, (stream) => {
574
- stream.mimeType = 'image/jpg';
575
- });
576
- manifest.addImageStream(4, (stream) => {
577
- stream.mimeType = 'image/jpeg';
578
- });
579
- manifest.addImageStream(5, (stream) => {
580
- stream.mimeType = 'image/bogus';
581
- });
582
- manifest.addImageStream(6, (stream) => {
583
- stream.mimeType = 'image/avif';
584
- });
585
- manifest.addImageStream(7, (stream) => {
586
- stream.mimeType = 'image/webp';
587
- });
588
- });
589
-
590
- await shaka.util.StreamUtils.filterManifest(fakeDrmEngine, manifest);
591
-
592
- // Covers a regression in which we would remove streams with codecs.
593
- // The first 4 streams should be there because they are always supported.
594
- // The 5th stream should be removed because the MIME type is bogus.
595
- // The 6th and 7th streams may be there, based on platform support.
596
- expect(manifest.imageStreams).toContain(
597
- jasmine.objectContaining({id: 1}));
598
- expect(manifest.imageStreams).toContain(
599
- jasmine.objectContaining({id: 2}));
600
- expect(manifest.imageStreams).toContain(
601
- jasmine.objectContaining({id: 3}));
602
- expect(manifest.imageStreams).toContain(
603
- jasmine.objectContaining({id: 4}));
604
- expect(manifest.imageStreams).not.toContain(
605
- jasmine.objectContaining({id: 5}));
606
- });
607
-
608
- it('does not filter manifest when codec switching is enabled', async () => {
609
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
610
- manifest.addVariant(1, (variant) => {
611
- variant.addAudio(10, (stream) => {
612
- stream.codecs = 'mp4a.69';
613
- });
614
- variant.addVideo(11, (stream) => {
615
- stream.codecs = 'avc1';
616
- });
617
- });
618
- });
619
-
620
- const originalFilterManifestByCurrentVariant =
621
- shaka.util.StreamUtils.filterManifestByCurrentVariant;
622
-
623
- try {
624
- const filterManifestByCurrentVariantSpy =
625
- jasmine.createSpy('filterManifestByCurrentVariant');
626
- shaka.util.StreamUtils.filterManifestByCurrentVariant =
627
- shaka.test.Util.spyFunc(filterManifestByCurrentVariantSpy);
628
-
629
- await shaka.util.StreamUtils.filterManifest(fakeDrmEngine, manifest);
630
-
631
- expect(filterManifestByCurrentVariantSpy).not.toHaveBeenCalled();
632
- } finally {
633
- shaka.util.StreamUtils.filterManifestByCurrentVariant =
634
- originalFilterManifestByCurrentVariant;
635
- }
636
- });
637
-
638
- it('filters transport streams', async () => {
639
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
640
- manifest.addVariant(0, (variant) => {
641
- variant.language = 'en';
642
- variant.addVideo(1, (stream) => {
643
- stream.mime('video/mp2t', 'avc1.42c00d');
644
- });
645
- variant.addAudio(2, (stream) => {
646
- stream.mime('video/mp2t', 'mp4a.40.2');
647
- });
648
- });
649
- });
650
-
651
- await shaka.util.StreamUtils.filterManifest(fakeDrmEngine, manifest);
652
-
653
- // Covers a regression in which we would remove streams with codecs.
654
- // The last two streams should be removed because their full MIME types
655
- // are bogus.
656
- expect(manifest.variants.length).toBe(1);
657
- expect(manifest.variants[0].video.id).toBe(1);
658
- expect(manifest.variants[0].audio.id).toBe(2);
659
- });
660
-
661
- // MediaCapabilities decodingInfo requires valid bandwidth, frameRate,
662
- // width, height as part of the input. Fill in default values if those info
663
- // are not available from the manifest.
664
- it('tolerates empty bandwidth, frameRate, width, height', async () => {
665
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
666
- manifest.addVariant(0, (variant) => {
667
- variant.language = 'en';
668
- variant.addVideo(1, (stream) => {
669
- stream.codecs = 'avc1.4d401f';
670
- });
671
- variant.addAudio(2, (stream) => {
672
- stream.codecs = 'mp4a.40.2';
673
- });
674
- });
675
- });
676
-
677
- await shaka.util.StreamUtils.filterManifest(fakeDrmEngine, manifest);
678
- expect(manifest.variants.length).toBe(1);
679
- });
680
-
681
- it('supports VP9 codec', async () => {
682
- if (!MediaSource.isTypeSupported('video/webm; codecs="vp9"')) {
683
- pending('Codec VP9 is not supported by the platform.');
684
- }
685
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
686
- manifest.addVariant(0, (variant) => {
687
- variant.addVideo(1, (stream) => {
688
- stream.mime('video/webm', 'vp9');
689
- });
690
- });
691
- });
692
-
693
- await shaka.util.StreamUtils.filterManifest(fakeDrmEngine, manifest);
694
-
695
- expect(manifest.variants.length).toBe(1);
696
- });
697
-
698
- it('supports fLaC codec', async () => {
699
- if (!MediaSource.isTypeSupported('audio/mp4; codecs="flac"')) {
700
- pending('Codec fLaC is not supported by the platform.');
701
- }
702
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
703
- manifest.addVariant(0, (variant) => {
704
- variant.addAudio(1, (stream) => {
705
- stream.mime('audio/mp4', 'fLaC');
706
- });
707
- });
708
- manifest.addVariant(2, (variant) => {
709
- variant.addAudio(3, (stream) => {
710
- stream.mime('audio/mp4', 'flac');
711
- });
712
- });
713
- });
714
-
715
- await shaka.util.StreamUtils.filterManifest(fakeDrmEngine, manifest);
716
-
717
- expect(manifest.variants.length).toBe(2);
718
- });
719
-
720
- it('supports Opus codec', async () => {
721
- if (!MediaSource.isTypeSupported('audio/mp4; codecs="opus"')) {
722
- pending('Codec Opus is not supported by the platform.');
723
- }
724
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
725
- manifest.addVariant(0, (variant) => {
726
- variant.addAudio(1, (stream) => {
727
- stream.mime('audio/mp4', 'Opus');
728
- });
729
- });
730
- manifest.addVariant(2, (variant) => {
731
- variant.addAudio(3, (stream) => {
732
- stream.mime('audio/mp4', 'opus');
733
- });
734
- });
735
- });
736
-
737
- await shaka.util.StreamUtils.filterManifest(fakeDrmEngine, manifest);
738
-
739
- expect(manifest.variants.length).toBe(2);
740
- });
741
-
742
- it('supports legacy AVC1 codec', async () => {
743
- if (!MediaSource.isTypeSupported('video/mp4; codecs="avc1.42001e"')) {
744
- pending('Codec avc1.42001e is not supported by the platform.');
745
- }
746
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
747
- manifest.addVariant(0, (variant) => {
748
- variant.addVideo(1, (stream) => {
749
- stream.mime('video/mp4', 'avc1.66.30');
750
- });
751
- });
752
- });
753
-
754
- await shaka.util.StreamUtils.filterManifest(fakeDrmEngine, manifest);
755
-
756
- expect(manifest.variants.length).toBe(1);
757
- });
758
- });
759
-
760
- describe('chooseCodecsAndFilterManifest', () => {
761
- const addVariant720Avc1 = (manifest) => {
762
- manifest.addVariant(0, (variant) => {
763
- variant.bandwidth = 5058558;
764
- variant.addAudio(1, (stream) => {
765
- stream.bandwidth = 129998;
766
- stream.mime('audio/mp4', 'mp4a.40.2');
767
- });
768
- variant.addVideo(2, (stream) => {
769
- stream.bandwidth = 4928560;
770
- stream.size(1280, 720);
771
- stream.mime('video/mp4', 'avc1.640028');
772
- });
773
- });
774
- };
775
-
776
- const addVariant720Vp9 = (manifest) => {
777
- manifest.addVariant(3, (variant) => {
778
- variant.bandwidth = 4911000;
779
- variant.addAudio(4, (stream) => {
780
- stream.bandwidth = 129998;
781
- stream.mime('audio/webm', 'vorbis');
782
- });
783
- variant.addVideo(5, (stream) => {
784
- stream.bandwidth = 4781002;
785
- stream.size(1280, 720);
786
- stream.mime('video/webm', 'vp9');
787
- });
788
- });
789
- };
790
-
791
- const addVariant1080Vp9 = (manifest) => {
792
- manifest.addVariant(6, (variant) => {
793
- variant.bandwidth = 10850316;
794
- variant.addAudio(1, (stream) => {
795
- stream.bandwidth = 129998;
796
- stream.mime('audio/mp4', 'mp4a.40.2');
797
- });
798
- variant.addVideo(8, (stream) => {
799
- stream.bandwidth = 10784324;
800
- stream.size(1920, 1080);
801
- stream.mime('video/webm', 'vp9');
802
- });
803
- });
804
- };
805
-
806
- it('should filter variants by the best available bandwidth' +
807
- ' for video resolution', () => {
808
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
809
- manifest.addVariant(0, (variant) => {
810
- variant.bandwidth = 4058558;
811
- variant.addVideo(1, (stream) => {
812
- stream.bandwidth = 300000;
813
- stream.size(10, 10);
814
- });
815
- });
816
- manifest.addVariant(2, (variant) => {
817
- variant.bandwidth = 4781002;
818
- variant.addVideo(3, (stream) => {
819
- stream.bandwidth = 400000;
820
- stream.size(10, 10);
821
- });
822
- });
823
- manifest.addVariant(4, (variant) => {
824
- variant.addVideo(5, (stream) => {
825
- stream.bandwidth = 500000;
826
- stream.size(20, 20);
827
- });
828
- });
829
- manifest.addVariant(6, (variant) => {
830
- variant.addVideo(7, (stream) => {
831
- stream.bandwidth = 600000;
832
- stream.size(20, 20);
833
- });
834
- });
835
- });
836
-
837
- shaka.util.StreamUtils.chooseCodecsAndFilterManifest(manifest,
838
- /* preferredVideoCodecs= */[],
839
- /* preferredAudioCodecs= */[],
840
- /* preferredDecodingAttributes= */[]);
841
-
842
- expect(manifest.variants.length).toBe(2);
843
- expect(manifest.variants.every((v) => [300000, 500000].includes(
844
- v.video.bandwidth))).toBeTruthy();
845
- });
846
-
847
- it('should filter variants by the best available bandwidth' +
848
- ' for audio language', () => {
849
- // This test is flaky in some Tizen devices, due to codec restrictions.
850
- if (shaka.util.Platform.isTizen()) {
851
- pending('Skip flaky test in Tizen');
852
- }
853
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
854
- manifest.addVariant(0, (variant) => {
855
- variant.bandwidth = 4058558;
856
- variant.addAudio(1, (stream) => {
857
- stream.bandwidth = 100000;
858
- stream.language = 'en';
859
- stream.mime('audio/mp4', 'mp4a.40.2');
860
- });
861
- });
862
- manifest.addVariant(2, (variant) => {
863
- variant.bandwidth = 4781002;
864
- variant.addAudio(3, (stream) => {
865
- stream.bandwidth = 200000;
866
- stream.language = 'en';
867
- stream.mime('audio/mp4', 'flac');
868
- });
869
- });
870
- manifest.addVariant(4, (variant) => {
871
- variant.addAudio(5, (stream) => {
872
- stream.bandwidth = 100000;
873
- stream.language = 'es';
874
- stream.mime('audio/mp4', 'mp4a.40.2');
875
- });
876
- });
877
- manifest.addVariant(6, (variant) => {
878
- variant.addAudio(7, (stream) => {
879
- stream.bandwidth = 500000;
880
- stream.language = 'es';
881
- stream.mime('audio/mp4', 'flac');
882
- });
883
- });
884
- });
885
-
886
- shaka.util.StreamUtils.chooseCodecsAndFilterManifest(manifest,
887
- /* preferredVideoCodecs= */[],
888
- /* preferredAudioCodecs= */[],
889
- /* preferredDecodingAttributes= */[]);
890
-
891
- expect(manifest.variants.length).toBe(2);
892
- expect(manifest.variants.every((v) => v.audio.bandwidth == 100000))
893
- .toBeTruthy();
894
- });
895
-
896
- it('should allow multiple codecs for codec switching', () => {
897
- if (!MediaSource.isTypeSupported('video/webm; codecs="vp9"')) {
898
- pending('Codec VP9 is not supported by the platform.');
899
- }
900
- if (!MediaSource.isTypeSupported('video/webm; codecs="vorbis"')) {
901
- pending('Codec vorbis is not supported by the platform.');
902
- }
903
- // This test is flaky in some Tizen devices, due to codec restrictions.
904
- if (shaka.util.Platform.isTizen()) {
905
- pending('Skip flaky test in Tizen');
906
- }
907
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
908
- addVariant720Avc1(manifest);
909
- addVariant720Vp9(manifest);
910
- addVariant1080Vp9(manifest);
911
- });
912
-
913
- manifest.variants[0].video.bandwidth = 1;
914
-
915
- shaka.util.StreamUtils.chooseCodecsAndFilterManifest(manifest,
916
- /* preferredVideoCodecs= */[],
917
- /* preferredAudioCodecs= */[],
918
- /* preferredDecodingAttributes= */[]);
919
-
920
- expect(manifest.variants.length).toBe(2);
921
- expect(manifest.variants[0].video.codecs)
922
- .not.toBe(manifest.variants[1].video.codecs);
923
- });
924
-
925
- it('chooses preferred audio and video codecs', () => {
926
- if (!MediaSource.isTypeSupported('video/webm; codecs="vp9"')) {
927
- pending('Codec VP9 is not supported by the platform.');
928
- }
929
- if (!MediaSource.isTypeSupported('video/webm; codecs="vorbis"')) {
930
- pending('Codec vorbis is not supported by the platform.');
931
- }
932
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
933
- addVariant720Avc1(manifest);
934
- addVariant720Vp9(manifest);
935
- addVariant1080Vp9(manifest);
936
- });
937
- const variants =
938
- shaka.util.StreamUtils.choosePreferredCodecs(manifest.variants,
939
- /* preferredVideoCodecs= */['vp9'],
940
- /* preferredAudioCodecs= */['mp4a']);
941
-
942
- expect(variants.length).toBe(1);
943
- expect(variants[0].video.codecs).toBe('vp9');
944
- expect(variants[0].audio.codecs).toBe('mp4a.40.2');
945
- });
946
-
947
- it('chooses preferred video codecs', () => {
948
- if (!MediaSource.isTypeSupported('video/webm; codecs="vp9"')) {
949
- pending('Codec VP9 is not supported by the platform.');
950
- }
951
- if (!MediaSource.isTypeSupported('video/webm; codecs="vorbis"')) {
952
- pending('Codec vorbis is not supported by the platform.');
953
- }
954
- // If no preferred audio codecs is specified or can be found, choose the
955
- // variants with preferred video codecs.
956
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
957
- addVariant720Avc1(manifest);
958
- addVariant720Vp9(manifest);
959
- addVariant1080Vp9(manifest);
960
- });
961
- const variants =
962
- shaka.util.StreamUtils.choosePreferredCodecs(manifest.variants,
963
- /* preferredVideoCodecs= */['vp9'],
964
- /* preferredAudioCodecs= */[]);
965
-
966
- expect(variants.length).toBe(2);
967
- expect(variants[0].video.codecs).toBe('vp9');
968
- expect(variants[0].audio.codecs).toBe('vorbis');
969
- expect(variants[1].video.codecs).toBe('vp9');
970
- expect(variants[1].audio.codecs).toBe('mp4a.40.2');
971
- });
972
-
973
- it('chooses preferred audio codecs', () => {
974
- if (!MediaSource.isTypeSupported('video/webm; codecs="vp9"')) {
975
- pending('Codec VP9 is not supported by the platform.');
976
- }
977
- if (!MediaSource.isTypeSupported('video/webm; codecs="vorbis"')) {
978
- pending('Codec vorbis is not supported by the platform.');
979
- }
980
- // If no preferred video codecs is specified or can be found, choose the
981
- // variants with preferred audio codecs.
982
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
983
- addVariant720Avc1(manifest);
984
- addVariant720Vp9(manifest);
985
- addVariant1080Vp9(manifest);
986
- });
987
- const variants =
988
- shaka.util.StreamUtils.choosePreferredCodecs(manifest.variants,
989
- /* preferredVideoCodecs= */['foo'],
990
- /* preferredAudioCodecs= */['mp4a.40.2']);
991
-
992
- expect(variants.length).toBe(2);
993
- expect(variants[0].video.codecs).toBe('avc1.640028');
994
- expect(variants[0].audio.codecs).toBe('mp4a.40.2');
995
- expect(variants[1].video.codecs).toBe('vp9');
996
- expect(variants[1].audio.codecs).toBe('mp4a.40.2');
997
- });
998
-
999
- it('chooses variants by decoding attributes', async () => {
1000
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
1001
- manifest.addVariant(0, (variant) => {
1002
- variant.bandwidth = 4058558;
1003
- variant.addVideo(1, (stream) => {
1004
- stream.mime('video', 'notsmooth');
1005
- });
1006
- });
1007
- manifest.addVariant(1, (variant) => {
1008
- variant.bandwidth = 4781002;
1009
- variant.addVideo(2, (stream) => {
1010
- stream.mime('video', 'smooth');
1011
- });
1012
- });
1013
- manifest.addVariant(3, (variant) => {
1014
- variant.addVideo(4, (stream) => {
1015
- variant.bandwidth = 5058558;
1016
- stream.mime('video', 'smooth-2');
1017
- });
1018
- });
1019
- });
1020
- navigator.mediaCapabilities.decodingInfo =
1021
- shaka.test.Util.spyFunc(decodingInfoSpy);
1022
- decodingInfoSpy.and.callFake((config) => {
1023
- const res = config.video.contentType.includes('notsmooth') ?
1024
- {supported: true, smooth: false} :
1025
- {supported: true, smooth: true};
1026
- return Promise.resolve(res);
1027
- });
1028
-
1029
- await StreamUtils.getDecodingInfosForVariants(manifest.variants,
1030
- /* usePersistentLicenses= */false, /* srcEquals= */ false,
1031
- /* preferredKeySystems= */ []);
1032
-
1033
- shaka.util.StreamUtils.chooseCodecsAndFilterManifest(manifest,
1034
- /* preferredVideoCodecs= */[],
1035
- /* preferredAudioCodecs= */[],
1036
- /* preferredDecodingAttributes= */
1037
- [shaka.util.StreamUtils.DecodingAttributes.SMOOTH]);
1038
- // 2 video codecs are smooth. Choose the one with the lowest bandwidth.
1039
- expect(manifest.variants.length).toBe(1);
1040
- expect(manifest.variants[0].id).toBe(1);
1041
- expect(manifest.variants[0].video.id).toBe(2);
1042
- });
1043
- });
1044
-
1045
- describe('isPlayable', () => {
1046
- /** @type {shaka.extern.Variant} */
1047
- const variant = {
1048
- id: 1,
1049
- language: 'es',
1050
- disabledUntilTime: 0,
1051
- video: null,
1052
- audio: null,
1053
- primary: false,
1054
- bandwidth: 2000,
1055
- allowedByApplication: true,
1056
- allowedByKeySystem: true,
1057
- decodingInfos: [],
1058
- };
1059
-
1060
- it('returns false if variant is disabled', () => {
1061
- variant.allowedByApplication = true;
1062
- variant.allowedByKeySystem = true;
1063
- variant.disabledUntilTime = 1234;
1064
-
1065
- expect(shaka.util.StreamUtils.isPlayable(variant)).toBe(false);
1066
- });
1067
- });
1068
- });