shaka-player 4.3.10 → 4.4.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 (316) hide show
  1. package/.github/workflows/release-please.yaml +7 -0
  2. package/AUTHORS +9 -0
  3. package/CHANGELOG.md +295 -200
  4. package/CONTRIBUTORS +8 -0
  5. package/LICENSE +32 -0
  6. package/README.md +63 -10
  7. package/demo/autoTemplate.txt +40 -5
  8. package/demo/close_button.js +11 -0
  9. package/demo/common/asset.js +13 -1
  10. package/demo/common/assets.js +53 -3
  11. package/demo/common/message_ids.js +25 -1
  12. package/demo/config.js +69 -10
  13. package/demo/customWarning.txt +2 -2
  14. package/demo/index.html +3 -1
  15. package/demo/locales/en.json +26 -2
  16. package/demo/locales/source.json +105 -9
  17. package/demo/main.js +52 -9
  18. package/demo/search.js +3 -1
  19. package/demo/service_worker.js +3 -0
  20. package/dist/controls.css +1 -1
  21. package/dist/controls.css.map +1 -1
  22. package/dist/demo.compiled.debug.js +124 -112
  23. package/dist/demo.compiled.debug.map +3 -3
  24. package/dist/demo.compiled.js +124 -112
  25. package/dist/demo.compiled.map +3 -3
  26. package/dist/deps.js +46 -28
  27. package/dist/locales.js +28 -28
  28. package/dist/receiver.compiled.debug.js +52 -46
  29. package/dist/receiver.compiled.debug.map +3 -3
  30. package/dist/receiver.compiled.js +52 -46
  31. package/dist/receiver.compiled.map +3 -3
  32. package/dist/shaka-player.compiled.d.ts +676 -391
  33. package/dist/shaka-player.compiled.debug.d.ts +676 -391
  34. package/dist/shaka-player.compiled.debug.externs.js +1188 -616
  35. package/dist/shaka-player.compiled.debug.js +1045 -700
  36. package/dist/shaka-player.compiled.debug.map +4 -4
  37. package/dist/shaka-player.compiled.externs.js +1188 -616
  38. package/dist/shaka-player.compiled.js +1094 -933
  39. package/dist/shaka-player.compiled.map +4 -4
  40. package/dist/shaka-player.ui.d.ts +677 -392
  41. package/dist/shaka-player.ui.debug.d.ts +677 -392
  42. package/dist/shaka-player.ui.debug.externs.js +1023 -451
  43. package/dist/shaka-player.ui.debug.js +1100 -739
  44. package/dist/shaka-player.ui.debug.map +4 -4
  45. package/dist/shaka-player.ui.externs.js +1023 -451
  46. package/dist/shaka-player.ui.js +1244 -1071
  47. package/dist/shaka-player.ui.map +4 -4
  48. package/docs/tutorials/ad_monetization.md +15 -1
  49. package/docs/tutorials/application-level-redirects.md +1 -1
  50. package/docs/tutorials/config.md +9 -5
  51. package/docs/tutorials/drm-config.md +61 -0
  52. package/docs/tutorials/fairplay.md +19 -4
  53. package/docs/tutorials/license-server-auth.md +4 -4
  54. package/docs/tutorials/license-wrapping.md +2 -2
  55. package/docs/tutorials/ui-customization.md +7 -3
  56. package/docs/tutorials/ui.md +7 -7
  57. package/docs/tutorials/upgrade.md +3 -0
  58. package/externs/ima.js +123 -2
  59. package/externs/isoboxer.js +217 -0
  60. package/externs/mediakeys.js +18 -0
  61. package/externs/mux.js +1 -105
  62. package/externs/pictureinpicture.js +48 -0
  63. package/externs/shaka/ads.js +61 -1
  64. package/externs/shaka/cea.js +110 -0
  65. package/externs/shaka/codecs.js +32 -0
  66. package/externs/shaka/manifest.js +101 -1
  67. package/externs/shaka/manifest_parser.js +0 -10
  68. package/externs/shaka/net.js +36 -7
  69. package/externs/shaka/offline.js +8 -1
  70. package/externs/shaka/player.js +220 -21
  71. package/externs/shaka/text.js +1 -382
  72. package/externs/shaka/transmuxer.js +59 -0
  73. package/karma.conf.js +13 -0
  74. package/lib/abr/simple_abr_manager.js +6 -3
  75. package/lib/ads/ad_manager.js +60 -2
  76. package/lib/ads/client_side_ad.js +86 -0
  77. package/lib/ads/client_side_ad_manager.js +79 -3
  78. package/lib/ads/server_side_ad.js +86 -0
  79. package/lib/ads/server_side_ad_manager.js +13 -0
  80. package/lib/cast/cast_utils.js +1 -0
  81. package/lib/cea/cea608_data_channel.js +24 -14
  82. package/lib/cea/cea608_memory.js +5 -2
  83. package/lib/cea/cea708_service.js +8 -9
  84. package/lib/cea/cea708_window.js +1 -2
  85. package/lib/cea/cea_decoder.js +23 -6
  86. package/lib/cea/cea_utils.js +25 -2
  87. package/lib/cea/dummy_caption_decoder.js +21 -0
  88. package/lib/cea/dummy_cea_parser.js +1 -3
  89. package/lib/cea/mp4_cea_parser.js +15 -10
  90. package/lib/cea/ts_cea_parser.js +69 -0
  91. package/lib/dash/content_protection.js +32 -2
  92. package/lib/dash/dash_parser.js +93 -31
  93. package/lib/dash/mpd_utils.js +6 -25
  94. package/lib/dash/segment_base.js +12 -14
  95. package/lib/dash/segment_list.js +10 -6
  96. package/lib/dash/segment_template.js +349 -32
  97. package/lib/dependencies/all.js +8 -0
  98. package/lib/hls/hls_classes.js +33 -8
  99. package/lib/hls/hls_parser.js +805 -191
  100. package/lib/hls/manifest_text_parser.js +4 -14
  101. package/lib/media/adaptation_set_criteria.js +43 -3
  102. package/lib/media/closed_caption_parser.js +74 -12
  103. package/lib/media/drm_engine.js +189 -49
  104. package/lib/media/gap_jumping_controller.js +1 -1
  105. package/lib/media/manifest_parser.js +34 -0
  106. package/lib/media/media_source_capabilities.js +10 -0
  107. package/lib/media/media_source_engine.js +475 -231
  108. package/lib/media/playhead.js +1 -1
  109. package/lib/media/presentation_timeline.js +62 -0
  110. package/lib/media/segment_index.js +50 -14
  111. package/lib/media/segment_prefetch.js +277 -0
  112. package/lib/media/segment_reference.js +70 -4
  113. package/lib/media/streaming_engine.js +258 -81
  114. package/lib/media/video_wrapper.js +15 -7
  115. package/lib/mss/content_protection.js +353 -0
  116. package/lib/mss/mss_parser.js +1081 -0
  117. package/lib/net/networking_engine.js +60 -10
  118. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  119. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  120. package/lib/offline/manifest_converter.js +6 -0
  121. package/lib/offline/storage.js +2 -4
  122. package/lib/player.js +309 -105
  123. package/lib/polyfill/media_capabilities.js +43 -3
  124. package/lib/polyfill/patchedmediakeys_apple.js +5 -0
  125. package/lib/polyfill/patchedmediakeys_nop.js +5 -0
  126. package/lib/polyfill/patchedmediakeys_webkit.js +5 -0
  127. package/lib/text/cue.js +208 -130
  128. package/lib/text/lrc_text_parser.js +2 -2
  129. package/lib/text/mp4_vtt_parser.js +2 -2
  130. package/lib/text/sbv_text_parser.js +1 -1
  131. package/lib/text/simple_text_displayer.js +2 -1
  132. package/lib/text/srt_text_parser.js +9 -1
  133. package/lib/text/ssa_text_parser.js +2 -2
  134. package/lib/text/text_engine.js +3 -21
  135. package/lib/text/text_utils.js +71 -20
  136. package/lib/text/ui_text_displayer.js +14 -14
  137. package/lib/text/vtt_text_parser.js +22 -14
  138. package/lib/transmuxer/aac_transmuxer.js +224 -0
  139. package/lib/transmuxer/ac3.js +142 -0
  140. package/lib/transmuxer/ac3_transmuxer.js +212 -0
  141. package/lib/transmuxer/adts.js +232 -0
  142. package/lib/transmuxer/ec3.js +103 -0
  143. package/lib/transmuxer/ec3_transmuxer.js +212 -0
  144. package/lib/transmuxer/h264.js +324 -0
  145. package/lib/transmuxer/mp3_transmuxer.js +204 -0
  146. package/lib/transmuxer/mpeg_audio.js +196 -0
  147. package/lib/transmuxer/mpeg_ts_transmuxer.js +182 -0
  148. package/lib/transmuxer/mss_transmuxer.js +389 -0
  149. package/lib/{media/transmuxer.js → transmuxer/muxjs_transmuxer.js} +34 -80
  150. package/lib/transmuxer/transmuxer_engine.js +161 -0
  151. package/lib/transmuxer/ts_transmuxer.js +738 -0
  152. package/lib/util/cmcd_manager.js +131 -71
  153. package/lib/util/error.js +62 -26
  154. package/lib/util/exp_golomb.js +220 -0
  155. package/lib/util/fairplay_utils.js +64 -13
  156. package/lib/util/id3_utils.js +56 -3
  157. package/lib/util/language_utils.js +11 -8
  158. package/lib/util/manifest_parser_utils.js +3 -0
  159. package/lib/util/mime_utils.js +44 -7
  160. package/lib/util/mp4_box_parsers.js +233 -5
  161. package/lib/util/mp4_generator.js +1381 -0
  162. package/lib/util/periods.js +40 -34
  163. package/lib/util/platform.js +17 -3
  164. package/lib/util/player_configuration.js +38 -1
  165. package/lib/util/stream_utils.js +138 -27
  166. package/lib/util/text_parser.js +1 -1
  167. package/lib/util/ts_parser.js +470 -47
  168. package/lib/util/xml_utils.js +16 -3
  169. package/maintained-branches.md +2 -2
  170. package/package.json +3 -1
  171. package/roadmap.md +21 -6
  172. package/shaka-player.uncompiled.js +18 -0
  173. package/test/abr/simple_abr_manager_unit.js +32 -4
  174. package/test/ads/ad_manager_unit.js +18 -2
  175. package/test/cast/cast_utils_unit.js +7 -2
  176. package/test/cea/cea608_memory_unit.js +24 -0
  177. package/test/cea/cea_decoder_unit.js +33 -0
  178. package/test/dash/dash_parser_content_protection_unit.js +93 -3
  179. package/test/dash/dash_parser_live_unit.js +56 -13
  180. package/test/dash/dash_parser_manifest_unit.js +70 -2
  181. package/test/dash/dash_parser_segment_base_unit.js +14 -9
  182. package/test/dash/dash_parser_segment_template_unit.js +286 -6
  183. package/test/demo/demo_unit.js +5 -1
  184. package/test/hls/hls_live_unit.js +188 -28
  185. package/test/hls/hls_parser_unit.js +250 -109
  186. package/test/hls/manifest_text_parser_unit.js +18 -13
  187. package/test/media/adaptation_set_criteria_unit.js +46 -14
  188. package/test/media/adaptation_set_unit.js +2 -0
  189. package/test/media/drm_engine_integration.js +11 -8
  190. package/test/media/drm_engine_unit.js +220 -7
  191. package/test/media/media_source_engine_integration.js +122 -38
  192. package/test/media/media_source_engine_unit.js +133 -153
  193. package/test/media/playhead_unit.js +3 -0
  194. package/test/media/presentation_timeline_unit.js +51 -0
  195. package/test/media/segment_index_unit.js +52 -0
  196. package/test/media/segment_prefetch_unit.js +243 -0
  197. package/test/media/streaming_engine_integration.js +9 -3
  198. package/test/media/streaming_engine_unit.js +440 -59
  199. package/test/mss/mss_parser_content_protection_unit.js +49 -0
  200. package/test/mss/mss_parser_unit.js +472 -0
  201. package/test/mss/mss_player_integration.js +123 -0
  202. package/test/offline/manifest_convert_unit.js +9 -0
  203. package/test/offline/storage_integration.js +6 -1
  204. package/test/player_unit.js +386 -133
  205. package/test/polyfill/media_capabilities_unit.js +18 -0
  206. package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
  207. package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
  208. package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
  209. package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
  210. package/test/test/assets/hls-raw-aac/manifest.m3u8 +4 -0
  211. package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +14 -0
  212. package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
  213. package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
  214. package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
  215. package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
  216. package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
  217. package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
  218. package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
  219. package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
  220. package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +31 -0
  221. package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
  222. package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
  223. package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
  224. package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
  225. package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
  226. package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
  227. package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
  228. package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
  229. package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +31 -0
  230. package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +13 -0
  231. package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
  232. package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
  233. package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
  234. package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
  235. package/test/test/assets/hls-raw-mp3/playlist.m3u8 +4 -0
  236. package/test/test/assets/hls-ts-aac/playlist.m3u8 +23 -0
  237. package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
  238. package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
  239. package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
  240. package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
  241. package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
  242. package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
  243. package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
  244. package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
  245. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
  246. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
  247. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
  248. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
  249. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
  250. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
  251. package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +19 -0
  252. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
  253. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
  254. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
  255. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
  256. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
  257. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
  258. package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +19 -0
  259. package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
  260. package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
  261. package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
  262. package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
  263. package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
  264. package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
  265. package/test/test/assets/hls-ts-h264/prog_index.m3u8 +25 -0
  266. package/test/test/assets/hls-ts-mp3/manifest.m3u8 +13 -0
  267. package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
  268. package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
  269. package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
  270. package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
  271. package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +17 -0
  272. package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
  273. package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
  274. package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
  275. package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
  276. package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
  277. package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
  278. package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +4 -0
  279. package/test/test/boot.js +7 -2
  280. package/test/test/util/fake_ad.js +99 -0
  281. package/test/test/util/fake_ad_manager.js +7 -1
  282. package/test/test/util/fake_networking_engine.js +41 -14
  283. package/test/test/util/fake_segment_prefetch.js +81 -0
  284. package/test/test/util/manifest_generator.js +19 -5
  285. package/test/test/util/mss_parser_util.js +115 -0
  286. package/test/test/util/offline_utils.js +1 -0
  287. package/test/test/util/simple_fakes.js +12 -3
  288. package/test/test/util/streaming_engine_util.js +14 -4
  289. package/test/test/util/ttml_utils.js +2 -2
  290. package/test/text/cue_integration.js +1 -1
  291. package/test/text/srt_text_parser_unit.js +78 -0
  292. package/test/text/text_engine_unit.js +17 -8
  293. package/test/text/ui_text_displayer_unit.js +4 -4
  294. package/test/text/vtt_text_parser_unit.js +59 -40
  295. package/test/text/web_vtt_generator_unit.js +9 -3
  296. package/test/{media/transmuxer_integration.js → transmuxer/muxjs_transmuxer_integration.js} +30 -33
  297. package/test/transmuxer/transmuxer_engine_integration.js +60 -0
  298. package/test/transmuxer/transmuxer_integration.js +296 -0
  299. package/test/util/cmcd_manager_unit.js +162 -13
  300. package/test/util/language_utils_unit.js +9 -2
  301. package/test/util/mp4_box_parsers_unit.js +39 -4
  302. package/test/util/periods_unit.js +34 -26
  303. package/test/util/stream_utils_unit.js +60 -107
  304. package/ui/controls.js +19 -1
  305. package/ui/controls.less +1 -0
  306. package/ui/externs/ui.js +11 -1
  307. package/ui/language_utils.js +15 -0
  308. package/ui/less/thumbnails.less +26 -0
  309. package/ui/locales/oc.json +42 -0
  310. package/ui/pip_button.js +83 -2
  311. package/ui/range_element.js +15 -0
  312. package/ui/resolution_selection.js +9 -2
  313. package/ui/seek_bar.js +223 -0
  314. package/ui/ui.js +5 -0
  315. package/lib/cea/i_caption_decoder.js +0 -51
  316. package/lib/cea/i_cea_parser.js +0 -68
@@ -18,6 +18,11 @@ describe('MediaSourceEngine', () => {
18
18
  let mediaSourceEngine;
19
19
  let generators;
20
20
  let metadata;
21
+
22
+ /** @type {shaka.extern.Stream} */
23
+ const fakeStream = shaka.test.StreamingEngineUtil.createMockVideoStream(1);
24
+ const fakeTsStream =
25
+ shaka.test.StreamingEngineUtil.createMockVideoStream(1, 'video/mp2t');
21
26
  // TODO: add text streams to MSE integration tests
22
27
 
23
28
  const mp4CeaCue0 = jasmine.objectContaining({
@@ -38,21 +43,51 @@ describe('MediaSourceEngine', () => {
38
43
  startTime: Util.closeTo(0.767, 0.001),
39
44
  endTime: Util.closeTo(4.972, 0.001),
40
45
  textAlign: Cue.textAlign.CENTER,
41
- payload: 'These are 608 captions\n(top left)',
46
+ nestedCues: [
47
+ jasmine.objectContaining({
48
+ payload: 'These are 608 captions',
49
+ textAlign: Cue.textAlign.CENTER,
50
+ }),
51
+ jasmine.objectContaining({lineBreak: true}),
52
+ jasmine.objectContaining({
53
+ payload: '(top left)',
54
+ textAlign: Cue.textAlign.CENTER,
55
+ }),
56
+ ],
42
57
  });
43
58
 
44
59
  const tsCeaCue1 = jasmine.objectContaining({
45
60
  startTime: Util.closeTo(5.305, 0.001),
46
61
  endTime: Util.closeTo(11.979, 0.001),
47
62
  textAlign: Cue.textAlign.CENTER,
48
- payload: 'These are 608 captions\n(middle)',
63
+ nestedCues: [
64
+ jasmine.objectContaining({
65
+ payload: 'These are 608 captions',
66
+ textAlign: Cue.textAlign.CENTER,
67
+ }),
68
+ jasmine.objectContaining({lineBreak: true}),
69
+ jasmine.objectContaining({
70
+ payload: '(middle)',
71
+ textAlign: Cue.textAlign.CENTER,
72
+ }),
73
+ ],
49
74
  });
50
75
 
51
76
  const tsCeaCue2 = jasmine.objectContaining({
52
77
  startTime: Util.closeTo(12.312, 0.001),
53
78
  endTime: Util.closeTo(19.319, 0.001),
54
79
  textAlign: Cue.textAlign.CENTER,
55
- payload: 'These are 608 captions\n(bottom left)',
80
+ nestedCues: [
81
+ jasmine.objectContaining({
82
+ payload: 'These are 608 captions',
83
+ textAlign: Cue.textAlign.CENTER,
84
+ }),
85
+ jasmine.objectContaining({lineBreak: true}),
86
+ jasmine.objectContaining({
87
+ payload: '(bottom left)',
88
+ textAlign: Cue.textAlign.CENTER,
89
+ }),
90
+ ],
56
91
  });
57
92
 
58
93
  // The same segments as above, but offset by 40 seconds (yes, 40), which is
@@ -61,21 +96,51 @@ describe('MediaSourceEngine', () => {
61
96
  startTime: Util.closeTo(40.767, 0.001),
62
97
  endTime: Util.closeTo(44.972, 0.001),
63
98
  textAlign: Cue.textAlign.CENTER,
64
- payload: 'These are 608 captions\n(top left)',
99
+ nestedCues: [
100
+ jasmine.objectContaining({
101
+ payload: 'These are 608 captions',
102
+ textAlign: Cue.textAlign.CENTER,
103
+ }),
104
+ jasmine.objectContaining({lineBreak: true}),
105
+ jasmine.objectContaining({
106
+ payload: '(top left)',
107
+ textAlign: Cue.textAlign.CENTER,
108
+ }),
109
+ ],
65
110
  });
66
111
 
67
112
  const tsCeaCue4 = jasmine.objectContaining({
68
113
  startTime: Util.closeTo(45.305, 0.001),
69
114
  endTime: Util.closeTo(51.979, 0.001),
70
115
  textAlign: Cue.textAlign.CENTER,
71
- payload: 'These are 608 captions\n(middle)',
116
+ nestedCues: [
117
+ jasmine.objectContaining({
118
+ payload: 'These are 608 captions',
119
+ textAlign: Cue.textAlign.CENTER,
120
+ }),
121
+ jasmine.objectContaining({lineBreak: true}),
122
+ jasmine.objectContaining({
123
+ payload: '(middle)',
124
+ textAlign: Cue.textAlign.CENTER,
125
+ }),
126
+ ],
72
127
  });
73
128
 
74
129
  const tsCeaCue5 = jasmine.objectContaining({
75
130
  startTime: Util.closeTo(52.312, 0.001),
76
131
  endTime: Util.closeTo(59.319, 0.001),
77
132
  textAlign: Cue.textAlign.CENTER,
78
- payload: 'These are 608 captions\n(bottom left)',
133
+ nestedCues: [
134
+ jasmine.objectContaining({
135
+ payload: 'These are 608 captions',
136
+ textAlign: Cue.textAlign.CENTER,
137
+ }),
138
+ jasmine.objectContaining({lineBreak: true}),
139
+ jasmine.objectContaining({
140
+ payload: '(bottom left)',
141
+ textAlign: Cue.textAlign.CENTER,
142
+ }),
143
+ ],
79
144
  });
80
145
 
81
146
  /**
@@ -126,7 +191,7 @@ describe('MediaSourceEngine', () => {
126
191
  const segment = generators[type].getInitSegment(Date.now() / 1000);
127
192
  const reference = null;
128
193
  return mediaSourceEngine.appendBuffer(
129
- type, segment, reference, /* hasClosedCaptions= */ false);
194
+ type, segment, reference, fakeStream, /* hasClosedCaptions= */ false);
130
195
  }
131
196
 
132
197
  function append(type, segmentNumber) {
@@ -134,10 +199,10 @@ describe('MediaSourceEngine', () => {
134
199
  .getSegment(segmentNumber, Date.now() / 1000);
135
200
  const reference = dummyReference(type, segmentNumber);
136
201
  return mediaSourceEngine.appendBuffer(
137
- type, segment, reference, /* hasClosedCaptions= */ false);
202
+ type, segment, reference, fakeStream, /* hasClosedCaptions= */ false);
138
203
  }
139
204
 
140
- function appendWithSeek(type, segmentNumber) {
205
+ function appendWithSeekAndClosedCaptions(type, segmentNumber) {
141
206
  const segment = generators[type]
142
207
  .getSegment(segmentNumber, Date.now() / 1000);
143
208
  const reference = dummyReference(type, segmentNumber);
@@ -145,7 +210,8 @@ describe('MediaSourceEngine', () => {
145
210
  type,
146
211
  segment,
147
212
  reference,
148
- /* hasClosedCaptions= */ false,
213
+ fakeStream,
214
+ /* hasClosedCaptions= */ true,
149
215
  /* seeked= */ true);
150
216
  }
151
217
 
@@ -153,7 +219,7 @@ describe('MediaSourceEngine', () => {
153
219
  const segment = generators[type].getInitSegment(Date.now() / 1000);
154
220
  const reference = null;
155
221
  return mediaSourceEngine.appendBuffer(
156
- type, segment, reference, /* hasClosedCaptions= */ true);
222
+ type, segment, reference, fakeStream, /* hasClosedCaptions= */ true);
157
223
  }
158
224
 
159
225
  function appendWithClosedCaptions(type, segmentNumber) {
@@ -161,7 +227,7 @@ describe('MediaSourceEngine', () => {
161
227
  .getSegment(segmentNumber, Date.now() / 1000);
162
228
  const reference = dummyReference(type, segmentNumber);
163
229
  return mediaSourceEngine.appendBuffer(
164
- type, segment, reference, /* hasClosedCaptions= */ true);
230
+ type, segment, reference, fakeStream, /* hasClosedCaptions= */ true);
165
231
  }
166
232
 
167
233
  function buffered(type, time) {
@@ -383,7 +449,9 @@ describe('MediaSourceEngine', () => {
383
449
  /* timestampOffset= */ 0,
384
450
  /* appendWindowStart= */ 5,
385
451
  /* appendWindowEnd= */ 18,
386
- /* sequenceMode= */ false);
452
+ /* sequenceMode= */ false,
453
+ fakeStream,
454
+ /* streamsByType= */ new Map());
387
455
  expect(buffered(ContentType.VIDEO, 0)).toBe(0);
388
456
  await append(ContentType.VIDEO, 0);
389
457
  expect(bufferStart(ContentType.VIDEO)).toBeCloseTo(5, 1);
@@ -402,7 +470,9 @@ describe('MediaSourceEngine', () => {
402
470
  /* timestampOffset= */ 100,
403
471
  /* appendWindowStart= */ 5,
404
472
  /* appendWindowEnd= */ 18,
405
- /* sequenceMode= */ true);
473
+ /* sequenceMode= */ true,
474
+ fakeStream,
475
+ /* streamsByType= */ new Map());
406
476
  expect(buffered(ContentType.VIDEO, 0)).toBe(0);
407
477
  await append(ContentType.VIDEO, 0);
408
478
  expect(bufferStart(ContentType.VIDEO)).toBeCloseTo(5, 1);
@@ -422,7 +492,9 @@ describe('MediaSourceEngine', () => {
422
492
  /* timestampOffset= */ 0,
423
493
  /* appendWindowStart= */ 0,
424
494
  /* appendWindowEnd= */ 20,
425
- /* sequenceMode= */ false);
495
+ /* sequenceMode= */ false,
496
+ fakeStream,
497
+ /* streamsByType= */ new Map());
426
498
  await append(ContentType.VIDEO, 0);
427
499
  await append(ContentType.VIDEO, 1);
428
500
  expect(bufferStart(ContentType.VIDEO)).toBeCloseTo(0, 1);
@@ -435,7 +507,9 @@ describe('MediaSourceEngine', () => {
435
507
  /* timestampOffset= */ 15,
436
508
  /* appendWindowStart= */ 20,
437
509
  /* appendWindowEnd= */ 35,
438
- /* sequenceMode= */ false);
510
+ /* sequenceMode= */ false,
511
+ fakeStream,
512
+ /* streamsByType= */ new Map());
439
513
  await append(ContentType.VIDEO, 0);
440
514
  await append(ContentType.VIDEO, 1);
441
515
  expect(bufferStart(ContentType.VIDEO)).toBeCloseTo(0, 1);
@@ -450,15 +524,15 @@ describe('MediaSourceEngine', () => {
450
524
  const initObject = new Map();
451
525
  initObject.set(ContentType.VIDEO, getFakeStream(metadata.video));
452
526
  initObject.set(ContentType.TEXT, getFakeStream(metadata.text));
453
- // Call with forceTransmux = true, so that it will transmux even on
454
- // platforms with native TS support.
455
- await mediaSourceEngine.init(initObject, /* forceTransmux= */ true);
527
+ const config = shaka.util.PlayerConfiguration.createDefault().mediaSource;
528
+ config.forceTransmux = true;
529
+ mediaSourceEngine.configure(config);
530
+ await mediaSourceEngine.init(initObject);
456
531
  mediaSourceEngine.setSelectedClosedCaptionId('CC1');
457
532
 
458
- await append(ContentType.VIDEO, 0);
533
+ await appendWithClosedCaptions(ContentType.VIDEO, 0);
459
534
 
460
535
  expect(textDisplayer.appendSpy).toHaveBeenCalledTimes(3);
461
-
462
536
  expect(textDisplayer.appendSpy).toHaveBeenCalledWith([tsCeaCue0]);
463
537
  expect(textDisplayer.appendSpy).toHaveBeenCalledWith([tsCeaCue1]);
464
538
  expect(textDisplayer.appendSpy).toHaveBeenCalledWith([tsCeaCue2]);
@@ -472,12 +546,13 @@ describe('MediaSourceEngine', () => {
472
546
  const initObject = new Map();
473
547
  initObject.set(ContentType.VIDEO, getFakeStream(metadata.video));
474
548
  initObject.set(ContentType.TEXT, getFakeStream(metadata.text));
475
- // Call with forceTransmux = true, so that it will transmux even on
476
- // platforms with native TS support.
477
- await mediaSourceEngine.init(initObject, /* forceTransmux= */ true);
549
+ const config = shaka.util.PlayerConfiguration.createDefault().mediaSource;
550
+ config.forceTransmux = true;
551
+ mediaSourceEngine.configure(config);
552
+ await mediaSourceEngine.init(initObject);
478
553
  mediaSourceEngine.setSelectedClosedCaptionId('CC1');
479
554
 
480
- await append(ContentType.VIDEO, 2);
555
+ await appendWithClosedCaptions(ContentType.VIDEO, 2);
481
556
 
482
557
  expect(textDisplayer.appendSpy).toHaveBeenCalledTimes(3);
483
558
  expect(textDisplayer.appendSpy).toHaveBeenCalledWith([tsCeaCue3]);
@@ -485,7 +560,7 @@ describe('MediaSourceEngine', () => {
485
560
  expect(textDisplayer.appendSpy).toHaveBeenCalledWith([tsCeaCue5]);
486
561
 
487
562
  textDisplayer.appendSpy.calls.reset();
488
- await appendWithSeek(ContentType.VIDEO, 0);
563
+ await appendWithSeekAndClosedCaptions(ContentType.VIDEO, 0);
489
564
 
490
565
  expect(textDisplayer.appendSpy).toHaveBeenCalledTimes(3);
491
566
  expect(textDisplayer.appendSpy).toHaveBeenCalledWith([tsCeaCue0]);
@@ -501,15 +576,16 @@ describe('MediaSourceEngine', () => {
501
576
  const initObject = new Map();
502
577
  initObject.set(videoType, getFakeStream(metadata.video));
503
578
 
504
- await mediaSourceEngine.init(
505
- initObject, /* forceTransmux= */ false, /* sequenceMode= */ true);
579
+ await mediaSourceEngine.init(initObject, /* sequenceMode= */ true);
506
580
  await mediaSourceEngine.setDuration(presentationDuration);
507
581
  await mediaSourceEngine.setStreamProperties(
508
582
  videoType,
509
583
  /* timestampOffset= */ 0,
510
584
  /* appendWindowStart= */ 0,
511
585
  /* appendWindowEnd= */ Infinity,
512
- /* sequenceMode= */ true);
586
+ /* sequenceMode= */ true,
587
+ fakeTsStream,
588
+ /* streamsByType= */ new Map());
513
589
 
514
590
  const segment = generators[videoType].getSegment(0, Date.now() / 1000);
515
591
  const partialSegmentLength = Math.floor(segment.byteLength / 3);
@@ -518,15 +594,16 @@ describe('MediaSourceEngine', () => {
518
594
  segment, /* offset= */ 0, /* length= */ partialSegmentLength);
519
595
  let reference = dummyReference(videoType, 0);
520
596
  await mediaSourceEngine.appendBuffer(
521
- videoType, partialSegment, reference, /* hasClosedCaptions= */ false);
597
+ videoType, partialSegment, reference, fakeStream,
598
+ /* hasClosedCaptions= */ false);
522
599
 
523
600
  partialSegment = shaka.util.BufferUtils.toUint8(
524
601
  segment,
525
602
  /* offset= */ partialSegmentLength);
526
603
  reference = dummyReference(videoType, 1);
527
604
  await mediaSourceEngine.appendBuffer(
528
- videoType, partialSegment, reference, /* hasClosedCaptions= */ false,
529
- /* seeked= */ true);
605
+ videoType, partialSegment, reference, fakeStream,
606
+ /* hasClosedCaptions= */ false, /* seeked= */ true);
530
607
  });
531
608
 
532
609
  it('extracts CEA-708 captions from dash', async () => {
@@ -537,7 +614,7 @@ describe('MediaSourceEngine', () => {
537
614
  const initObject = new Map();
538
615
  initObject.set(ContentType.VIDEO, getFakeStream(metadata.video));
539
616
 
540
- await mediaSourceEngine.init(initObject, /* forceTransmux= */ false);
617
+ await mediaSourceEngine.init(initObject);
541
618
  await mediaSourceEngine.setDuration(presentationDuration);
542
619
  await appendInitWithClosedCaptions(ContentType.VIDEO);
543
620
  mediaSourceEngine.setSelectedClosedCaptionId('CC1');
@@ -554,7 +631,7 @@ describe('MediaSourceEngine', () => {
554
631
  const audioType = ContentType.AUDIO;
555
632
  const initObject = new Map();
556
633
  initObject.set(audioType, getFakeStream(metadata.audio));
557
- await mediaSourceEngine.init(initObject, /* forceTransmux= */ false);
634
+ await mediaSourceEngine.init(initObject);
558
635
  await append(ContentType.AUDIO, 0);
559
636
 
560
637
  expect(onMetadata).toHaveBeenCalled();
@@ -567,14 +644,18 @@ describe('MediaSourceEngine', () => {
567
644
  const audioType = ContentType.AUDIO;
568
645
  const initObject = new Map();
569
646
  initObject.set(audioType, getFakeStream(metadata.audio));
570
- await mediaSourceEngine.init(initObject, /* forceTransmux= */ true);
647
+ const config = shaka.util.PlayerConfiguration.createDefault().mediaSource;
648
+ config.forceTransmux = true;
649
+ mediaSourceEngine.configure(config);
650
+ await mediaSourceEngine.init(initObject);
571
651
  await append(ContentType.AUDIO, 0);
572
652
 
573
653
  expect(onMetadata).toHaveBeenCalled();
574
654
  });
575
655
 
576
656
  it('extracts ID3 metadata from AAC', async () => {
577
- if (!MediaSource.isTypeSupported('audio/aac')) {
657
+ if (!MediaSource.isTypeSupported('audio/aac') ||
658
+ !shaka.util.Platform.supportsSequenceMode()) {
578
659
  return;
579
660
  }
580
661
  metadata = shaka.test.TestScheme.DATA['id3-metadata_aac'];
@@ -583,7 +664,7 @@ describe('MediaSourceEngine', () => {
583
664
  const audioType = ContentType.AUDIO;
584
665
  const initObject = new Map();
585
666
  initObject.set(audioType, getFakeStream(metadata.audio));
586
- await mediaSourceEngine.init(initObject, /* forceTransmux= */ false);
667
+ await mediaSourceEngine.init(initObject, /* sequenceMode= */ true);
587
668
  await append(ContentType.AUDIO, 0);
588
669
 
589
670
  expect(onMetadata).toHaveBeenCalled();
@@ -599,7 +680,10 @@ describe('MediaSourceEngine', () => {
599
680
  const audioType = ContentType.AUDIO;
600
681
  const initObject = new Map();
601
682
  initObject.set(audioType, getFakeStream(metadata.audio));
602
- await mediaSourceEngine.init(initObject, /* forceTransmux= */ true);
683
+ const config = shaka.util.PlayerConfiguration.createDefault().mediaSource;
684
+ config.forceTransmux = true;
685
+ mediaSourceEngine.configure(config);
686
+ await mediaSourceEngine.init(initObject);
603
687
  await append(ContentType.AUDIO, 0);
604
688
 
605
689
  expect(onMetadata).toHaveBeenCalled();