shaka-player 4.4.3 → 4.6.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 (307) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +1 -1
  2. package/.github/workflows/release-please.yaml +2 -27
  3. package/AUTHORS +2 -0
  4. package/CHANGELOG.md +156 -39
  5. package/CODE_OF_CONDUCT.md +1 -1
  6. package/CONTRIBUTORS +2 -0
  7. package/README.md +54 -42
  8. package/demo/asset_card.js +18 -21
  9. package/demo/cast_receiver/index.html +0 -1
  10. package/demo/close_button.js +0 -3
  11. package/demo/common/asset.js +33 -22
  12. package/demo/common/assets.js +249 -60
  13. package/demo/config.js +219 -253
  14. package/demo/custom.js +88 -133
  15. package/demo/front.js +7 -10
  16. package/demo/index.html +19 -22
  17. package/demo/input.js +6 -11
  18. package/demo/input_container.js +8 -9
  19. package/demo/main.js +62 -126
  20. package/demo/search.js +29 -34
  21. package/demo/service_worker.js +0 -3
  22. package/demo/tooltip.js +3 -5
  23. package/demo/visualizer.js +3 -5
  24. package/demo/visualizer_button.js +1 -20
  25. package/dist/controls.css +1 -1
  26. package/dist/controls.css.map +1 -1
  27. package/dist/demo.compiled.debug.js +211 -228
  28. package/dist/demo.compiled.debug.map +4 -4
  29. package/dist/demo.compiled.js +211 -228
  30. package/dist/demo.compiled.map +4 -4
  31. package/dist/deps.js +42 -37
  32. package/dist/locales.js +34 -30
  33. package/dist/receiver.compiled.debug.js +64 -77
  34. package/dist/receiver.compiled.debug.map +4 -4
  35. package/dist/receiver.compiled.js +64 -77
  36. package/dist/receiver.compiled.map +4 -4
  37. package/dist/shaka-player.compiled.d.ts +343 -151
  38. package/dist/shaka-player.compiled.debug.d.ts +343 -151
  39. package/dist/shaka-player.compiled.debug.externs.js +356 -117
  40. package/dist/shaka-player.compiled.debug.js +952 -811
  41. package/dist/shaka-player.compiled.debug.map +4 -4
  42. package/dist/shaka-player.compiled.externs.js +356 -117
  43. package/dist/shaka-player.compiled.js +1165 -1078
  44. package/dist/shaka-player.compiled.map +4 -4
  45. package/dist/shaka-player.ui.d.ts +359 -153
  46. package/dist/shaka-player.ui.debug.d.ts +359 -153
  47. package/dist/shaka-player.ui.debug.externs.js +382 -117
  48. package/dist/shaka-player.ui.debug.js +1084 -918
  49. package/dist/shaka-player.ui.debug.map +4 -4
  50. package/dist/shaka-player.ui.externs.js +382 -117
  51. package/dist/shaka-player.ui.js +1377 -1274
  52. package/dist/shaka-player.ui.map +4 -4
  53. package/docs/design/lcevc-integration.md +14 -14
  54. package/docs/tutorials/ad_monetization.md +54 -0
  55. package/docs/tutorials/basic-usage.md +2 -1
  56. package/docs/tutorials/errors.md +2 -1
  57. package/docs/tutorials/faq.md +27 -55
  58. package/docs/tutorials/index.json +2 -1
  59. package/docs/tutorials/lcevc.md +118 -0
  60. package/docs/tutorials/offline.md +10 -8
  61. package/docs/tutorials/plugins.md +5 -0
  62. package/docs/tutorials/ui-customization.md +17 -0
  63. package/docs/tutorials/ui.md +2 -1
  64. package/docs/tutorials/upgrade.md +3 -0
  65. package/externs/css_style_declaration.js +19 -0
  66. package/externs/lcevc.js +37 -13
  67. package/externs/managedmediasource.js +24 -0
  68. package/externs/media_remote.js +68 -0
  69. package/externs/mediatailor.js +193 -0
  70. package/externs/pictureinpicture.js +11 -0
  71. package/externs/shaka/abr_manager.js +6 -2
  72. package/externs/shaka/ads.js +27 -0
  73. package/externs/shaka/cea.js +7 -0
  74. package/externs/shaka/codecs.js +5 -3
  75. package/externs/shaka/manifest.js +31 -10
  76. package/externs/shaka/manifest_parser.js +24 -1
  77. package/externs/shaka/net.js +2 -2
  78. package/externs/shaka/offline.js +13 -2
  79. package/externs/shaka/player.js +65 -8
  80. package/externs/shaka/text.js +3 -1
  81. package/externs/shaka/transmuxer.js +1 -1
  82. package/karma.conf.js +7 -3
  83. package/lib/abr/simple_abr_manager.js +66 -9
  84. package/lib/ads/ad_manager.js +104 -50
  85. package/lib/ads/media_tailor_ad.js +297 -0
  86. package/lib/ads/media_tailor_ad_manager.js +839 -0
  87. package/lib/cast/cast_receiver.js +1 -1
  88. package/lib/cea/cea_decoder.js +28 -0
  89. package/lib/cea/dummy_caption_decoder.js +5 -0
  90. package/lib/cea/ts_cea_parser.js +15 -2
  91. package/lib/config/codec_switching_strategy.js +24 -0
  92. package/lib/dash/content_protection.js +120 -2
  93. package/lib/dash/dash_parser.js +322 -93
  94. package/lib/dash/mpd_utils.js +62 -37
  95. package/lib/dash/segment_base.js +17 -10
  96. package/lib/dash/segment_list.js +18 -9
  97. package/lib/dash/segment_template.js +122 -107
  98. package/lib/dependencies/all.js +8 -7
  99. package/lib/hls/hls_classes.js +28 -43
  100. package/lib/hls/hls_parser.js +798 -658
  101. package/lib/hls/hls_utils.js +64 -5
  102. package/lib/hls/manifest_text_parser.js +7 -11
  103. package/lib/lcevc/lcevc_dec.js +220 -0
  104. package/lib/media/adaptation_set.js +32 -14
  105. package/lib/media/adaptation_set_criteria.js +86 -16
  106. package/lib/media/closed_caption_parser.js +13 -0
  107. package/lib/media/content_workarounds.js +6 -0
  108. package/lib/media/drm_engine.js +8 -13
  109. package/lib/media/manifest_parser.js +8 -113
  110. package/lib/media/media_source_capabilities.js +10 -3
  111. package/lib/media/media_source_engine.js +286 -44
  112. package/lib/media/play_rate_controller.js +8 -38
  113. package/lib/media/presentation_timeline.js +7 -1
  114. package/lib/media/quality_observer.js +1 -1
  115. package/lib/media/segment_index.js +6 -6
  116. package/lib/media/segment_prefetch.js +92 -24
  117. package/lib/media/segment_reference.js +73 -7
  118. package/lib/media/segment_utils.js +343 -0
  119. package/lib/media/stall_detector.js +0 -3
  120. package/lib/media/streaming_engine.js +73 -38
  121. package/lib/mss/mss_parser.js +19 -2
  122. package/lib/net/networking_engine.js +67 -12
  123. package/lib/net/networking_utils.js +95 -0
  124. package/lib/offline/indexeddb/v1_storage_cell.js +3 -0
  125. package/lib/offline/indexeddb/v2_storage_cell.js +3 -0
  126. package/lib/offline/manifest_converter.js +3 -0
  127. package/lib/offline/offline_manifest_parser.js +10 -0
  128. package/lib/offline/storage.js +14 -7
  129. package/lib/player.js +1098 -1537
  130. package/lib/polyfill/mediasource.js +22 -1
  131. package/lib/text/cue.js +15 -0
  132. package/lib/text/mp4_ttml_parser.js +2 -2
  133. package/lib/text/srt_text_parser.js +2 -2
  134. package/lib/text/stub_text_displayer.js +51 -0
  135. package/lib/text/text_engine.js +3 -2
  136. package/lib/text/ttml_text_parser.js +45 -5
  137. package/lib/text/ui_text_displayer.js +8 -0
  138. package/lib/text/vtt_text_parser.js +40 -22
  139. package/lib/transmuxer/aac_transmuxer.js +1 -1
  140. package/lib/transmuxer/ac3_transmuxer.js +1 -1
  141. package/lib/transmuxer/ec3_transmuxer.js +1 -1
  142. package/lib/transmuxer/h264.js +5 -4
  143. package/lib/transmuxer/h265.js +863 -0
  144. package/lib/transmuxer/mp3_transmuxer.js +1 -1
  145. package/lib/transmuxer/mpeg_ts_transmuxer.js +4 -3
  146. package/lib/transmuxer/mss_transmuxer.js +1 -1
  147. package/lib/transmuxer/ts_transmuxer.js +187 -22
  148. package/lib/util/buffer_utils.js +26 -4
  149. package/lib/util/content_steering_manager.js +358 -0
  150. package/lib/util/error.js +30 -15
  151. package/lib/util/exp_golomb.js +30 -2
  152. package/lib/util/fairplay_utils.js +1 -1
  153. package/lib/util/fake_event.js +8 -1
  154. package/lib/util/id3_utils.js +50 -1
  155. package/lib/util/manifest_parser_utils.js +12 -8
  156. package/lib/util/mp4_generator.js +6 -8
  157. package/lib/util/mutex.js +59 -0
  158. package/lib/util/object_utils.js +1 -1
  159. package/lib/util/periods.js +156 -179
  160. package/lib/util/platform.js +44 -3
  161. package/lib/util/player_configuration.js +43 -6
  162. package/lib/util/state_history.js +6 -2
  163. package/lib/util/stream_utils.js +206 -283
  164. package/lib/util/ts_parser.js +335 -98
  165. package/lib/util/uint8array_utils.js +5 -1
  166. package/lib/util/xml_utils.js +5 -0
  167. package/maintained-branches.md +3 -2
  168. package/package.json +4 -6
  169. package/roadmap.md +25 -5
  170. package/shaka-player.uncompiled.js +2 -2
  171. package/support.html +0 -1
  172. package/test/abr/simple_abr_manager_unit.js +33 -33
  173. package/test/ads/ad_manager_unit.js +3 -2
  174. package/test/cast/cast_receiver_integration.js +50 -4
  175. package/test/cast/cast_utils_unit.js +2 -0
  176. package/test/cea/cea_decoder_unit.js +7 -0
  177. package/test/codec_switching/codec_switching_integration.js +182 -0
  178. package/test/dash/dash_parser_content_protection_unit.js +2 -0
  179. package/test/dash/dash_parser_integration.js +74 -0
  180. package/test/dash/dash_parser_live_unit.js +2 -19
  181. package/test/dash/dash_parser_manifest_unit.js +536 -2
  182. package/test/dash/dash_parser_segment_base_unit.js +2 -0
  183. package/test/dash/dash_parser_segment_list_unit.js +2 -0
  184. package/test/dash/dash_parser_segment_template_unit.js +2 -0
  185. package/test/dash/mpd_utils_unit.js +61 -30
  186. package/test/demo/demo_unit.js +0 -16
  187. package/test/hls/hls_live_unit.js +14 -3
  188. package/test/hls/hls_parser_unit.js +385 -33
  189. package/test/hls/manifest_text_parser_unit.js +32 -99
  190. package/test/media/adaptation_set_criteria_unit.js +284 -15
  191. package/test/media/adaptation_set_unit.js +2 -0
  192. package/test/media/content_workarounds_unit.js +1 -1
  193. package/test/media/drm_engine_unit.js +3 -3
  194. package/test/media/media_source_engine_unit.js +166 -2
  195. package/test/media/play_rate_controller_unit.js +0 -48
  196. package/test/media/segment_index_unit.js +5 -4
  197. package/test/media/segment_prefetch_unit.js +1 -1
  198. package/test/media/streaming_engine_unit.js +17 -17
  199. package/test/mss/mss_parser_unit.js +2 -0
  200. package/test/mss/mss_player_integration.js +3 -2
  201. package/test/net/networking_engine_unit.js +3 -3
  202. package/test/{media/manifest_parser_unit.js → net/networking_utils_unit.js} +2 -2
  203. package/test/offline/manifest_convert_unit.js +14 -0
  204. package/test/offline/offline_integration.js +2 -1
  205. package/test/offline/storage_integration.js +22 -13
  206. package/test/player_external.js +4 -2
  207. package/test/player_integration.js +15 -4
  208. package/test/player_load_graph_integration.js +47 -151
  209. package/test/player_src_equals_external.js +1 -0
  210. package/test/player_src_equals_integration.js +71 -4
  211. package/test/player_unit.js +182 -158
  212. package/test/test/assets/dash-aes-128/Fragments(video=0,format=mpd-time-csf) +0 -0
  213. package/test/test/assets/dash-aes-128/Fragments(video=20000000,format=mpd-time-csf) +0 -0
  214. package/test/test/assets/dash-aes-128/Fragments(video=40000000,format=mpd-time-csf) +0 -0
  215. package/test/test/assets/dash-aes-128/Fragments(video=60000000,format=mpd-time-csf) +0 -0
  216. package/test/test/assets/dash-aes-128/Fragments(video=i,format=mpd-time-csf) +0 -0
  217. package/test/test/assets/dash-aes-128/dash.mpd +18 -0
  218. package/test/test/assets/dash-aes-128/license +1 -0
  219. package/test/test/assets/dash-multi-codec/audio_en_2c_128k_aac.mp4 +0 -0
  220. package/test/test/assets/dash-multi-codec/audio_es_2c_64k_opus.webm +0 -0
  221. package/test/test/assets/dash-multi-codec/dash.mpd +32 -0
  222. package/test/test/assets/dash-multi-codec/video_144p_108k_h264.mp4 +0 -0
  223. package/test/test/assets/hls-ts-h265/0.ts +0 -0
  224. package/test/test/assets/hls-ts-h265/hevc.m3u8 +6 -0
  225. package/test/test/assets/hls-ts-h265/index.m3u8 +7 -0
  226. package/test/test/assets/hls-ts-muxed-aac-h265/0.ts +0 -0
  227. package/test/test/assets/hls-ts-muxed-aac-h265/1.ts +0 -0
  228. package/test/test/assets/hls-ts-muxed-aac-h265/media.m3u8 +9 -0
  229. package/test/test/assets/hls-ts-muxed-ac3-h264/media.m3u8 +24 -0
  230. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00000.ts +0 -0
  231. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00001.ts +0 -0
  232. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00002.ts +0 -0
  233. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00003.ts +0 -0
  234. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00004.ts +0 -0
  235. package/test/test/assets/hls-ts-muxed-ac3-h264/s_00005.ts +0 -0
  236. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0000.ts +0 -0
  237. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0001.ts +0 -0
  238. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0002.ts +0 -0
  239. package/test/test/assets/hls-ts-muxed-ec3-h264/ChID_voices_1280x720p_25fps_h264_6ch_256kbps_ddp_sub_0003.ts +0 -0
  240. package/test/test/assets/hls-ts-muxed-ec3-h264/prog_index.m3u8 +14 -0
  241. package/test/test/assets/hls-ts-muxed-mp3-h264/index.m3u8 +23 -0
  242. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-1-v1-a1.ts +0 -0
  243. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-2-v1-a1.ts +0 -0
  244. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-3-v1-a1.ts +0 -0
  245. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-4-v1-a1.ts +0 -0
  246. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-5-v1-a1.ts +0 -0
  247. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-6-v1-a1.ts +0 -0
  248. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-7-v1-a1.ts +0 -0
  249. package/test/test/assets/hls-ts-muxed-mp3-h264/seg-8-v1-a1.ts +0 -0
  250. package/test/test/util/dash_parser_util.js +4 -0
  251. package/test/test/util/fake_ad_manager.js +20 -0
  252. package/test/test/util/fake_media_source_engine.js +13 -2
  253. package/test/test/util/fake_networking_engine.js +9 -1
  254. package/test/test/util/fake_segment_prefetch.js +3 -0
  255. package/test/test/util/manifest_generator.js +11 -3
  256. package/test/test/util/manifest_parser_util.js +14 -2
  257. package/test/test/util/mss_parser_util.js +4 -0
  258. package/test/test/util/offline_utils.js +2 -0
  259. package/test/test/util/simple_fakes.js +2 -2
  260. package/test/test/util/streaming_engine_util.js +10 -4
  261. package/test/test/util/test_scheme.js +6 -0
  262. package/test/test/util/ui_utils.js +4 -3
  263. package/test/text/mp4_ttml_parser_unit.js +4 -4
  264. package/test/text/srt_text_parser_unit.js +1 -1
  265. package/test/text/text_displayer_layout_unit.js +1 -1
  266. package/test/text/text_engine_unit.js +6 -0
  267. package/test/text/ttml_text_parser_unit.js +85 -2
  268. package/test/text/vtt_text_parser_unit.js +103 -31
  269. package/test/transmuxer/transmuxer_engine_integration.js +9 -0
  270. package/test/transmuxer/transmuxer_integration.js +150 -3
  271. package/test/ui/ad_ui_unit.js +2 -2
  272. package/test/ui/ui_customization_unit.js +17 -16
  273. package/test/ui/ui_integration.js +30 -20
  274. package/test/ui/ui_unit.js +28 -29
  275. package/test/util/buffer_utils_unit.js +1 -1
  276. package/test/util/content_steering_manager_unit.js +427 -0
  277. package/test/util/id3_utils_unit.js +52 -0
  278. package/test/util/stream_utils_unit.js +207 -169
  279. package/test/util/ts_parser_unit.js +3 -3
  280. package/third_party/closure-uri/uri.js +13 -1
  281. package/ui/audio_language_selection.js +9 -2
  282. package/ui/controls.js +125 -0
  283. package/ui/externs/ui.js +24 -2
  284. package/ui/language_utils.js +43 -8
  285. package/ui/less/range_elements.less +33 -0
  286. package/ui/locales/en.json +1 -0
  287. package/ui/locales/es-419.json +1 -0
  288. package/ui/locales/es.json +1 -0
  289. package/ui/locales/source.json +4 -0
  290. package/ui/localization.js +10 -0
  291. package/ui/pip_button.js +22 -120
  292. package/ui/remote_button.js +203 -0
  293. package/ui/resolution_selection.js +47 -10
  294. package/ui/seek_bar.js +296 -3
  295. package/ui/text_selection.js +2 -1
  296. package/ui/ui.js +11 -4
  297. package/demo/common/message_ids.js +0 -309
  298. package/demo/locales/en.json +0 -288
  299. package/demo/locales/source.json +0 -1146
  300. package/externs/mux.js +0 -69
  301. package/lib/lcevc/lcevc_dil.js +0 -152
  302. package/lib/routing/node.js +0 -23
  303. package/lib/routing/payload.js +0 -43
  304. package/lib/routing/walker.js +0 -587
  305. package/lib/transmuxer/muxjs_transmuxer.js +0 -242
  306. package/test/routing/walker_unit.js +0 -504
  307. package/test/transmuxer/muxjs_transmuxer_integration.js +0 -177
@@ -48,7 +48,7 @@ describe('Player', () => {
48
48
  /** @type {!shaka.test.FakeVideo} */
49
49
  let video;
50
50
 
51
- beforeEach(() => {
51
+ beforeEach(async () => {
52
52
  // By default, errors are a failure.
53
53
  logErrorSpy = jasmine.createSpy('shaka.log.error');
54
54
  logErrorSpy.calls.reset();
@@ -92,7 +92,7 @@ describe('Player', () => {
92
92
  variant.addVideo(2);
93
93
  });
94
94
  manifest.addVariant(1, (variant) => {
95
- variant.addAudio(3);
95
+ variant.addAudio(1);
96
96
  variant.addVideo(4);
97
97
  });
98
98
  });
@@ -124,12 +124,13 @@ describe('Player', () => {
124
124
  open: jasmine.createSpy('open').and.returnValue(Promise.resolve()),
125
125
  destroy:
126
126
  jasmine.createSpy('destroy').and.returnValue(Promise.resolve()),
127
+ setTextDisplayer: jasmine.createSpy('setTextDisplayer'),
127
128
  setUseEmbeddedText: jasmine.createSpy('setUseEmbeddedText'),
128
129
  getUseEmbeddedText: jasmine.createSpy('getUseEmbeddedText'),
129
130
  setSegmentRelativeVttTiming:
130
131
  jasmine.createSpy('setSegmentRelativeVttTiming'),
131
- updateLcevcDil:
132
- jasmine.createSpy('updateLcevcDil'),
132
+ updateLcevcDec:
133
+ jasmine.createSpy('updateLcevcDec'),
133
134
  getTextDisplayer: () => textDisplayer,
134
135
  getBufferedInfo: () => bufferedInfo,
135
136
  ended: jasmine.createSpy('ended').and.returnValue(false),
@@ -151,7 +152,8 @@ describe('Player', () => {
151
152
  }
152
153
 
153
154
  video = new shaka.test.FakeVideo(20);
154
- player = new shaka.Player(video, dependencyInjector);
155
+ player = new shaka.Player(null, dependencyInjector);
156
+ await player.attach(video);
155
157
  player.configure({
156
158
  // Ensures we don't get a warning about missing preference.
157
159
  preferredAudioLanguage: 'en',
@@ -170,6 +172,7 @@ describe('Player', () => {
170
172
  try {
171
173
  await player.destroy();
172
174
  } finally {
175
+ player.releaseAllMutexes();
173
176
  shaka.log.error = originalLogError;
174
177
  shaka.log.alwaysError = originalLogError;
175
178
  shaka.log.warning = originalLogWarn;
@@ -184,6 +187,7 @@ describe('Player', () => {
184
187
  describe('destroy', () => {
185
188
  it('cleans up all dependencies', async () => {
186
189
  goog.asserts.assert(manifest, 'Manifest should be non-null');
190
+ await player.load(fakeManifestUri, 0, fakeMimeType);
187
191
  const segmentIndexes = [];
188
192
  for (const variant of manifest.variants) {
189
193
  if (variant.audio) {
@@ -233,31 +237,6 @@ describe('Player', () => {
233
237
  expect(mediaSourceEngine.destroy).toHaveBeenCalled();
234
238
  expect(drmEngine.destroy).toHaveBeenCalled();
235
239
  });
236
-
237
- // TODO(vaage): Re-enable once the parser is integrated into the load graph
238
- // better.
239
- xit('destroys parser first when interrupting load', async () => {
240
- const p = shaka.test.Util.shortDelay();
241
- /** @type {!shaka.test.FakeManifestParser} */
242
- const parser = new shaka.test.FakeManifestParser(manifest);
243
- parser.start.and.returnValue(p);
244
- parser.stop.and.callFake(() => {
245
- expect(abrManager.stop).not.toHaveBeenCalled();
246
- expect(abrManager.release).not.toHaveBeenCalled();
247
- expect(networkingEngine.destroy).not.toHaveBeenCalled();
248
- });
249
- shaka.media.ManifestParser.registerParserByMime(
250
- fakeMimeType, () => parser);
251
-
252
- const load = player.load(fakeManifestUri, 0, fakeMimeType);
253
- await shaka.test.Util.shortDelay();
254
- await player.destroy();
255
- expect(abrManager.stop).toHaveBeenCalled();
256
- expect(abrManager.release).toHaveBeenCalled();
257
- expect(networkingEngine.destroy).toHaveBeenCalled();
258
- expect(parser.stop).toHaveBeenCalled();
259
- await expectAsync(load).toBeRejected();
260
- });
261
240
  });
262
241
 
263
242
  describe('load/unload', () => {
@@ -340,15 +319,12 @@ describe('Player', () => {
340
319
  });
341
320
 
342
321
  describe('disableStream', () => {
343
- /** @type {function(function(), number)} */
344
- let realSetTimeout;
345
322
  /** @type {number} */
346
323
  let disableTimeInSeconds;
347
324
  /** @type {?jasmine.Spy} */
348
325
  let getBufferedInfoSpy;
349
326
 
350
327
  beforeAll(() => {
351
- realSetTimeout = window.setTimeout;
352
328
  jasmine.clock().install();
353
329
  jasmine.clock().mockDate();
354
330
  });
@@ -381,15 +357,21 @@ describe('Player', () => {
381
357
  stream.mime('audio/mp4', 'mp4a.40.2');
382
358
  stream.language = 'en';
383
359
  });
384
- variant.addVideo(2);
360
+ variant.addVideo(2, (stream) => {
361
+ stream.size(10, 10);
362
+ });
385
363
  });
386
364
  manifest.addVariant(1, (variant) => {
387
365
  variant.addExistingStream(1);
388
- variant.addVideo(3);
366
+ variant.addVideo(3, (stream) => {
367
+ stream.size(20, 20);
368
+ });
389
369
  });
390
370
  manifest.addVariant(2, (variant) => {
391
371
  variant.addExistingStream(1);
392
- variant.addVideo(4);
372
+ variant.addVideo(4, (stream) => {
373
+ stream.size(30, 30);
374
+ });
393
375
  });
394
376
  });
395
377
  }
@@ -498,102 +480,6 @@ describe('Player', () => {
498
480
  expect(fromAdaptation).toBeFalsy();
499
481
  });
500
482
 
501
- it('disables all variants containing stream', async () => {
502
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
503
- manifest.addVariant(0, (variant) => {
504
- variant.addAudio(1, (stream) => {
505
- stream.mime('audio/mp4', 'mp4a.40.2');
506
- stream.language = 'en';
507
- stream.bandwidth = 100;
508
- });
509
- variant.addVideo(2);
510
- });
511
- manifest.addVariant(1, (variant) => {
512
- variant.addExistingStream(1);
513
- variant.addVideo(3);
514
- });
515
-
516
- manifest.addVariant(2, (variant) => {
517
- variant.addAudio(4, (stream) => {
518
- stream.mime('audio/mp4', 'mp4a.40.2');
519
- stream.language = 'en';
520
- stream.bandwidth = 200;
521
- });
522
- variant.addExistingStream(2);
523
- });
524
- manifest.addVariant(3, (variant) => {
525
- variant.addExistingStream(4);
526
- variant.addExistingStream(3);
527
- });
528
- });
529
-
530
- await player.load(fakeManifestUri, 0, fakeMimeType);
531
-
532
- const variantCount = manifest.variants.length;
533
- const variantAffected = 2;
534
- const audioStream =
535
- /** @type {shaka.extern.Stream} */ (manifest.variants[0].audio);
536
-
537
- player.disableStream(audioStream, disableTimeInSeconds);
538
-
539
- await shaka.test.Util.shortDelay(realSetTimeout);
540
-
541
- expect(abrManager.setVariants).toHaveBeenCalled();
542
-
543
- const updatedVariants =
544
- abrManager.setVariants.calls.mostRecent().args[0];
545
-
546
- expect(updatedVariants.length).toBe(variantCount - variantAffected);
547
-
548
- for (const variant of updatedVariants) {
549
- expect(variant.audio).not.toEqual(audioStream);
550
- }
551
- });
552
-
553
- it('does not disable streams if abr is disabled', async () => {
554
- await player.load(fakeManifestUri, 0, fakeMimeType);
555
-
556
- player.configure({abr: {enabled: true}});
557
-
558
- const videoStream =
559
- /** @type {shaka.extern.Stream} */ (manifest.variants[0].video);
560
- let status = player.disableStream(videoStream, 10);
561
- expect(status).toBe(true);
562
-
563
- player.configure({abr: {enabled: false}});
564
-
565
- status = player.disableStream(videoStream, 10);
566
- expect(status).toBe(false);
567
- });
568
-
569
- it('disables stream if have alternate stream', async () => {
570
- // Run test with the default manifest
571
- await runTest(0, 'video', true);
572
-
573
- manifest = shaka.test.ManifestGenerator.generate((manifest) => {
574
- manifest.addVariant(0, (variant) => {
575
- variant.addAudio(1, (stream) => {
576
- stream.mime('audio/mp4', 'mp4a.40.2');
577
- stream.language = 'en';
578
- stream.bandwidth = 10;
579
- });
580
- variant.addVideo(2);
581
- });
582
- manifest.addVariant(1, (variant) => {
583
- variant.addAudio(3, (stream) => {
584
- stream.mime('audio/mp4', 'mp4a.40.2');
585
- stream.language = 'en';
586
- stream.bandwidth = 20;
587
- });
588
- variant.addExistingStream(2);
589
- });
590
- });
591
-
592
- player.configure({abr: {enabled: true}});
593
-
594
- await runTest(0, 'audio', true);
595
- });
596
-
597
483
  describe('does not disable stream if there not alternate stream', () => {
598
484
  it('single audio multiple videos', async () => {
599
485
  manifest = shaka.test.ManifestGenerator.generate((manifest) => {
@@ -1595,6 +1481,7 @@ describe('Player', () => {
1595
1481
  frameRate: 1000000 / 42000,
1596
1482
  pixelAspectRatio: '59:54',
1597
1483
  hdr: null,
1484
+ videoLayout: null,
1598
1485
  mimeType: 'video/mp4',
1599
1486
  audioMimeType: 'audio/mp4',
1600
1487
  videoMimeType: 'video/mp4',
@@ -1633,6 +1520,7 @@ describe('Player', () => {
1633
1520
  frameRate: 24,
1634
1521
  pixelAspectRatio: '59:54',
1635
1522
  hdr: null,
1523
+ videoLayout: null,
1636
1524
  mimeType: 'video/mp4',
1637
1525
  audioMimeType: 'audio/mp4',
1638
1526
  videoMimeType: 'video/mp4',
@@ -1671,6 +1559,7 @@ describe('Player', () => {
1671
1559
  frameRate: 1000000 / 42000,
1672
1560
  pixelAspectRatio: '59:54',
1673
1561
  hdr: null,
1562
+ videoLayout: null,
1674
1563
  mimeType: 'video/mp4',
1675
1564
  audioMimeType: 'audio/mp4',
1676
1565
  videoMimeType: 'video/mp4',
@@ -1709,6 +1598,7 @@ describe('Player', () => {
1709
1598
  frameRate: 24,
1710
1599
  pixelAspectRatio: '59:54',
1711
1600
  hdr: null,
1601
+ videoLayout: null,
1712
1602
  mimeType: 'video/mp4',
1713
1603
  audioMimeType: 'audio/mp4',
1714
1604
  videoMimeType: 'video/mp4',
@@ -1747,6 +1637,7 @@ describe('Player', () => {
1747
1637
  frameRate: 1000000 / 42000,
1748
1638
  pixelAspectRatio: '59:54',
1749
1639
  hdr: null,
1640
+ videoLayout: null,
1750
1641
  mimeType: 'video/mp4',
1751
1642
  audioMimeType: 'audio/mp4',
1752
1643
  videoMimeType: 'video/mp4',
@@ -1785,6 +1676,7 @@ describe('Player', () => {
1785
1676
  frameRate: 24,
1786
1677
  pixelAspectRatio: '59:54',
1787
1678
  hdr: null,
1679
+ videoLayout: null,
1788
1680
  mimeType: 'video/mp4',
1789
1681
  audioMimeType: 'audio/mp4',
1790
1682
  videoMimeType: 'video/mp4',
@@ -1823,6 +1715,7 @@ describe('Player', () => {
1823
1715
  frameRate: 1000000 / 42000,
1824
1716
  pixelAspectRatio: '59:54',
1825
1717
  hdr: null,
1718
+ videoLayout: null,
1826
1719
  mimeType: 'video/mp4',
1827
1720
  audioMimeType: 'audio/mp4',
1828
1721
  videoMimeType: 'video/mp4',
@@ -1861,6 +1754,7 @@ describe('Player', () => {
1861
1754
  frameRate: 24,
1862
1755
  pixelAspectRatio: '59:54',
1863
1756
  hdr: null,
1757
+ videoLayout: null,
1864
1758
  mimeType: 'video/mp4',
1865
1759
  audioMimeType: 'audio/mp4',
1866
1760
  videoMimeType: 'video/mp4',
@@ -1918,6 +1812,7 @@ describe('Player', () => {
1918
1812
  frameRate: null,
1919
1813
  pixelAspectRatio: null,
1920
1814
  hdr: null,
1815
+ videoLayout: null,
1921
1816
  videoId: null,
1922
1817
  audioId: null,
1923
1818
  originalAudioId: null,
@@ -1956,6 +1851,7 @@ describe('Player', () => {
1956
1851
  frameRate: null,
1957
1852
  pixelAspectRatio: null,
1958
1853
  hdr: null,
1854
+ videoLayout: null,
1959
1855
  videoId: null,
1960
1856
  audioId: null,
1961
1857
  originalAudioId: null,
@@ -1994,6 +1890,7 @@ describe('Player', () => {
1994
1890
  frameRate: null,
1995
1891
  pixelAspectRatio: null,
1996
1892
  hdr: null,
1893
+ videoLayout: null,
1997
1894
  videoId: null,
1998
1895
  audioId: null,
1999
1896
  originalAudioId: null,
@@ -2035,6 +1932,7 @@ describe('Player', () => {
2035
1932
  frameRate: null,
2036
1933
  pixelAspectRatio: null,
2037
1934
  hdr: null,
1935
+ videoLayout: null,
2038
1936
  videoId: null,
2039
1937
  audioId: null,
2040
1938
  originalAudioId: null,
@@ -2711,15 +2609,15 @@ describe('Player', () => {
2711
2609
  });
2712
2610
  manifest.addVariant(2, (variant) => {
2713
2611
  variant.bandwidth = 300;
2714
- variant.addAudio(4, (stream) => {
2612
+ variant.addAudio(1, (stream) => {
2715
2613
  stream.bandwidth = 200;
2716
2614
  });
2717
2615
  variant.addExistingStream(2); // video
2718
2616
  });
2719
2617
  manifest.addVariant(3, (variant) => {
2720
2618
  variant.bandwidth = 400;
2721
- variant.addExistingStream(4); // audio
2722
- variant.addExistingStream(3); // video
2619
+ variant.addExistingStream(1); // audio
2620
+ variant.addExistingStream(2); // video
2723
2621
  });
2724
2622
  });
2725
2623
 
@@ -3028,11 +2926,15 @@ describe('Player', () => {
3028
2926
  manifest = shaka.test.ManifestGenerator.generate((manifest) => {
3029
2927
  manifest.addVariant(0, (variant) => {
3030
2928
  variant.bandwidth = 500;
3031
- variant.addVideo(1);
2929
+ variant.addVideo(1, (stream) => {
2930
+ stream.size(10, 10);
2931
+ });
3032
2932
  });
3033
2933
  manifest.addVariant(1, (variant) => {
3034
2934
  variant.bandwidth = 100;
3035
- variant.addVideo(2);
2935
+ variant.addVideo(2, (stream) => {
2936
+ stream.size(30, 30);
2937
+ });
3036
2938
  });
3037
2939
  });
3038
2940
 
@@ -3067,11 +2969,15 @@ describe('Player', () => {
3067
2969
  manifest = shaka.test.ManifestGenerator.generate((manifest) => {
3068
2970
  manifest.addVariant(1, (variant) => {
3069
2971
  variant.bandwidth = 500;
3070
- variant.addVideo(10);
2972
+ variant.addVideo(10, (stream) => {
2973
+ stream.size(10, 10);
2974
+ });
3071
2975
  });
3072
2976
  manifest.addVariant(2, (variant) => {
3073
2977
  variant.bandwidth = 100;
3074
- variant.addVideo(20);
2978
+ variant.addVideo(20, (stream) => {
2979
+ stream.size(30, 30);
2980
+ });
3075
2981
  });
3076
2982
  });
3077
2983
 
@@ -3101,10 +3007,13 @@ describe('Player', () => {
3101
3007
  manifest.addVariant(0, (variant) => {
3102
3008
  variant.addVideo(1, (stream) => {
3103
3009
  stream.keyIds = new Set(['abc']);
3010
+ stream.size(10, 10);
3104
3011
  });
3105
3012
  });
3106
3013
  manifest.addVariant(1, (variant) => {
3107
- variant.addVideo(2);
3014
+ variant.addVideo(2, (stream) => {
3015
+ stream.size(20, 20);
3016
+ });
3108
3017
  });
3109
3018
  });
3110
3019
 
@@ -3133,10 +3042,13 @@ describe('Player', () => {
3133
3042
  manifest.addVariant(0, (variant) => {
3134
3043
  variant.addVideo(1, (stream) => {
3135
3044
  stream.keyIds = new Set(['abc']);
3045
+ stream.size(10, 10);
3136
3046
  });
3137
3047
  });
3138
3048
  manifest.addVariant(1, (variant) => {
3139
- variant.addVideo(2);
3049
+ variant.addVideo(2, (stream) => {
3050
+ stream.size(20, 20);
3051
+ });
3140
3052
  });
3141
3053
  });
3142
3054
 
@@ -3232,10 +3144,13 @@ describe('Player', () => {
3232
3144
  manifest.addVariant(0, (variant) => {
3233
3145
  variant.addVideo(1, (stream) => {
3234
3146
  stream.keyIds = new Set(['abc']);
3147
+ stream.size(10, 10);
3235
3148
  });
3236
3149
  });
3237
3150
  manifest.addVariant(1, (variant) => {
3238
- variant.addVideo(2);
3151
+ variant.addVideo(2, (stream) => {
3152
+ stream.size(20, 20);
3153
+ });
3239
3154
  });
3240
3155
  });
3241
3156
 
@@ -3254,10 +3169,13 @@ describe('Player', () => {
3254
3169
  manifest.addVariant(0, (variant) => {
3255
3170
  variant.addVideo(1, (stream) => {
3256
3171
  stream.keyIds = new Set(['abc']);
3172
+ stream.size(10, 10);
3257
3173
  });
3258
3174
  });
3259
3175
  manifest.addVariant(1, (variant) => {
3260
- variant.addVideo(2);
3176
+ variant.addVideo(2, (stream) => {
3177
+ stream.size(20, 20);
3178
+ });
3261
3179
  });
3262
3180
  });
3263
3181
 
@@ -3276,10 +3194,13 @@ describe('Player', () => {
3276
3194
  manifest.addVariant(0, (variant) => {
3277
3195
  variant.addVideo(1, (stream) => {
3278
3196
  stream.keyIds = new Set(['abc']);
3197
+ stream.size(10, 10);
3279
3198
  });
3280
3199
  });
3281
3200
  manifest.addVariant(2, (variant) => {
3282
- variant.addVideo(3);
3201
+ variant.addVideo(3, (stream) => {
3202
+ stream.size(20, 20);
3203
+ });
3283
3204
  });
3284
3205
  });
3285
3206
 
@@ -3299,16 +3220,19 @@ describe('Player', () => {
3299
3220
  manifest.addVariant(0, (variant) => {
3300
3221
  variant.addVideo(1, (stream) => {
3301
3222
  stream.keyIds = new Set(['abc']);
3223
+ stream.size(10, 10);
3302
3224
  });
3303
3225
  });
3304
3226
  manifest.addVariant(2, (variant) => {
3305
3227
  variant.addVideo(3, (stream) => {
3306
3228
  stream.keyIds = new Set(['def']);
3229
+ stream.size(20, 20);
3307
3230
  });
3308
3231
  });
3309
3232
  manifest.addVariant(4, (variant) => {
3310
3233
  variant.addVideo(5, (stream) => {
3311
3234
  stream.keyIds = new Set(['abc', 'def']);
3235
+ stream.size(30, 30);
3312
3236
  });
3313
3237
  });
3314
3238
  });
@@ -3326,10 +3250,13 @@ describe('Player', () => {
3326
3250
  manifest.addVariant(0, (variant) => {
3327
3251
  variant.addVideo(1, (stream) => {
3328
3252
  stream.keyIds = new Set(['abc']);
3253
+ stream.size(10, 10);
3329
3254
  });
3330
3255
  });
3331
3256
  manifest.addVariant(2, (variant) => {
3332
- variant.addVideo(3);
3257
+ variant.addVideo(3, (stream) => {
3258
+ stream.size(20, 20);
3259
+ });
3333
3260
  });
3334
3261
  });
3335
3262
 
@@ -3349,10 +3276,13 @@ describe('Player', () => {
3349
3276
  manifest.addVariant(0, (variant) => {
3350
3277
  variant.addVideo(1, (stream) => {
3351
3278
  stream.keyIds = new Set(['abc']);
3279
+ stream.size(10, 10);
3352
3280
  });
3353
3281
  });
3354
3282
  manifest.addVariant(2, (variant) => {
3355
- variant.addVideo(3);
3283
+ variant.addVideo(3, (stream) => {
3284
+ stream.size(20, 20);
3285
+ });
3356
3286
  });
3357
3287
  });
3358
3288
 
@@ -3371,15 +3301,19 @@ describe('Player', () => {
3371
3301
  manifest.addVariant(0, (variant) => {
3372
3302
  variant.addVideo(1, (stream) => {
3373
3303
  stream.keyIds = new Set(['abc']);
3304
+ stream.size(10, 10);
3374
3305
  });
3375
3306
  });
3376
3307
  manifest.addVariant(2, (variant) => {
3377
3308
  variant.addVideo(3, (stream) => {
3378
3309
  stream.keyIds = new Set(['xyz']);
3310
+ stream.size(20, 20);
3379
3311
  });
3380
3312
  });
3381
3313
  manifest.addVariant(4, (variant) => {
3382
- variant.addVideo(5);
3314
+ variant.addVideo(5, (stream) => {
3315
+ stream.size(30, 30);
3316
+ });
3383
3317
  });
3384
3318
  });
3385
3319
 
@@ -3433,15 +3367,21 @@ describe('Player', () => {
3433
3367
  manifest = shaka.test.ManifestGenerator.generate((manifest) => {
3434
3368
  manifest.addVariant(0, (variant) => {
3435
3369
  variant.bandwidth = 10;
3436
- variant.addVideo(1);
3370
+ variant.addVideo(1, (stream) => {
3371
+ stream.size(10, 10);
3372
+ });
3437
3373
  });
3438
3374
  manifest.addVariant(1, (variant) => {
3439
3375
  variant.bandwidth = 1500;
3440
- variant.addVideo(2);
3376
+ variant.addVideo(2, (stream) => {
3377
+ stream.size(20, 20);
3378
+ });
3441
3379
  });
3442
3380
  manifest.addVariant(2, (variant) => {
3443
3381
  variant.bandwidth = 500;
3444
- variant.addVideo(3);
3382
+ variant.addVideo(3, (stream) => {
3383
+ stream.size(30, 30);
3384
+ });
3445
3385
  });
3446
3386
  });
3447
3387
 
@@ -3557,7 +3497,7 @@ describe('Player', () => {
3557
3497
  variant.addVideo(3, (stream) => {
3558
3498
  stream.size(190, 190);
3559
3499
  });
3560
- variant.addAudio(4);
3500
+ variant.addAudio(2);
3561
3501
  });
3562
3502
  });
3563
3503
 
@@ -3620,18 +3560,21 @@ describe('Player', () => {
3620
3560
  variant.bandwidth = 100;
3621
3561
  variant.addVideo(0, (stream) => {
3622
3562
  stream.codecs = 'good';
3563
+ stream.size(10, 10);
3623
3564
  });
3624
3565
  });
3625
3566
  manifest.addVariant(1, (variant) => {
3626
3567
  variant.bandwidth = 200;
3627
3568
  variant.addVideo(1, (stream) => {
3628
3569
  stream.codecs = 'good';
3570
+ stream.size(20, 20);
3629
3571
  });
3630
3572
  });
3631
3573
  manifest.addVariant(2, (variant) => {
3632
3574
  variant.bandwidth = 300;
3633
3575
  variant.addVideo(2, (stream) => {
3634
3576
  stream.codecs = 'good';
3577
+ stream.size(30, 30);
3635
3578
  });
3636
3579
  });
3637
3580
 
@@ -3640,18 +3583,21 @@ describe('Player', () => {
3640
3583
  variant.bandwidth = 10000;
3641
3584
  variant.addVideo(3, (stream) => {
3642
3585
  stream.codecs = 'bad';
3586
+ stream.size(10, 10);
3643
3587
  });
3644
3588
  });
3645
3589
  manifest.addVariant(4, (variant) => {
3646
3590
  variant.bandwidth = 20000;
3647
3591
  variant.addVideo(4, (stream) => {
3648
3592
  stream.codecs = 'bad';
3593
+ stream.size(20, 20);
3649
3594
  });
3650
3595
  });
3651
3596
  manifest.addVariant(5, (variant) => {
3652
3597
  variant.bandwidth = 30000;
3653
3598
  variant.addVideo(5, (stream) => {
3654
3599
  stream.codecs = 'bad';
3600
+ stream.size(30, 30);
3655
3601
  });
3656
3602
  });
3657
3603
  });
@@ -3672,10 +3618,13 @@ describe('Player', () => {
3672
3618
  manifest.addVariant(0, (variant) => {
3673
3619
  variant.addVideo(1, (stream) => {
3674
3620
  stream.keyIds = new Set(['abc']);
3621
+ stream.size(10, 10);
3675
3622
  });
3676
3623
  });
3677
3624
  manifest.addVariant(2, (variant) => {
3678
- variant.addVideo(3);
3625
+ variant.addVideo(3, (stream) => {
3626
+ stream.size(20, 20);
3627
+ });
3679
3628
  });
3680
3629
  });
3681
3630
 
@@ -3778,19 +3727,25 @@ describe('Player', () => {
3778
3727
  manifest = shaka.test.ManifestGenerator.generate((manifest) => {
3779
3728
  manifest.addVariant(0, (variant) => {
3780
3729
  variant.bandwidth = 100;
3781
- variant.addVideo(0);
3730
+ variant.addVideo(0, (stream) => {
3731
+ stream.size(10, 10);
3732
+ });
3782
3733
  variant.addAudio(9);
3783
3734
  });
3784
3735
 
3785
3736
  manifest.addVariant(1, (variant) => {
3786
3737
  variant.bandwidth = 200;
3787
- variant.addVideo(1);
3738
+ variant.addVideo(1, (stream) => {
3739
+ stream.size(20, 20);
3740
+ });
3788
3741
  variant.addExistingStream(9); // audio
3789
3742
  });
3790
3743
 
3791
3744
  manifest.addVariant(2, (variant) => {
3792
3745
  variant.bandwidth = 300;
3793
- variant.addVideo(2);
3746
+ variant.addVideo(2, (stream) => {
3747
+ stream.size(30, 30);
3748
+ });
3794
3749
  variant.addExistingStream(9); // audio
3795
3750
  });
3796
3751
  });
@@ -3859,15 +3814,21 @@ describe('Player', () => {
3859
3814
  manifest = shaka.test.ManifestGenerator.generate((manifest) => {
3860
3815
  manifest.addVariant(0, (variant) => {
3861
3816
  variant.bandwidth = /** @type {?} */(undefined);
3862
- variant.addVideo(0);
3817
+ variant.addVideo(0, (stream) => {
3818
+ stream.size(10, 10);
3819
+ });
3863
3820
  });
3864
3821
  manifest.addVariant(1, (variant) => {
3865
3822
  variant.bandwidth = NaN;
3866
- variant.addVideo(1);
3823
+ variant.addVideo(1, (stream) => {
3824
+ stream.size(20, 20);
3825
+ });
3867
3826
  });
3868
3827
  manifest.addVariant(2, (variant) => {
3869
3828
  variant.bandwidth = 0;
3870
- variant.addVideo(2);
3829
+ variant.addVideo(2, (stream) => {
3830
+ stream.size(30, 30);
3831
+ });
3871
3832
  });
3872
3833
  });
3873
3834
 
@@ -4208,6 +4169,69 @@ describe('Player', () => {
4208
4169
  expect(thumbnail8.duration).toBe(10);
4209
4170
  });
4210
4171
  });
4172
+
4173
+ describe('getAllThumbnails', () => {
4174
+ it('returns all thumbnails', async () => {
4175
+ const uris = () => ['thumbnail'];
4176
+ const ref = new shaka.media.SegmentReference(
4177
+ 0, 60, uris, 0, null, null, 0, 0, Infinity, [],
4178
+ );
4179
+ const index = new shaka.media.SegmentIndex([ref]);
4180
+
4181
+ manifest = shaka.test.ManifestGenerator.generate((manifest) => {
4182
+ manifest.addVariant(0, (variant) => {
4183
+ variant.addVideo(1);
4184
+ });
4185
+ manifest.addImageStream(5, (stream) => {
4186
+ stream.originalId = 'thumbnail';
4187
+ stream.width = 200;
4188
+ stream.height = 150;
4189
+ stream.mimeType = 'image/jpeg';
4190
+ stream.tilesLayout = '2x3';
4191
+ stream.segmentIndex = index;
4192
+ });
4193
+ });
4194
+
4195
+ await player.load(fakeManifestUri, 0, fakeMimeType);
4196
+
4197
+ expect(player.getImageTracks()[0].width).toBe(100);
4198
+ expect(player.getImageTracks()[0].height).toBe(50);
4199
+ const thumbnails = await player.getAllThumbnails(5);
4200
+ expect(thumbnails.length).toBe(6);
4201
+ expect(thumbnails[0]).toEqual(jasmine.objectContaining({
4202
+ imageHeight: 150,
4203
+ imageWidth: 200,
4204
+ positionX: 0,
4205
+ positionY: 0,
4206
+ width: 100,
4207
+ height: 50,
4208
+ }));
4209
+ expect(thumbnails[1]).toEqual(jasmine.objectContaining({
4210
+ imageHeight: 150,
4211
+ imageWidth: 200,
4212
+ positionX: 100,
4213
+ positionY: 0,
4214
+ width: 100,
4215
+ height: 50,
4216
+ }));
4217
+ expect(thumbnails[2]).toEqual(jasmine.objectContaining({
4218
+ imageHeight: 150,
4219
+ imageWidth: 200,
4220
+ positionX: 0,
4221
+ positionY: 50,
4222
+ width: 100,
4223
+ height: 50,
4224
+ }));
4225
+ expect(thumbnails[5]).toEqual(jasmine.objectContaining({
4226
+ imageHeight: 150,
4227
+ imageWidth: 200,
4228
+ positionX: 100,
4229
+ positionY: 100,
4230
+ width: 100,
4231
+ height: 50,
4232
+ }));
4233
+ });
4234
+ });
4211
4235
  });
4212
4236
 
4213
4237
  describe('config streaming.startAtSegmentBoundary', () => {