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
@@ -8,9 +8,11 @@
8
8
  goog.provide('shaka.ads.AdManager');
9
9
 
10
10
  goog.require('goog.asserts');
11
+ goog.require('shaka.Deprecate');
11
12
  goog.require('shaka.Player');
12
13
  goog.require('shaka.ads.AdsStats');
13
14
  goog.require('shaka.ads.ClientSideAdManager');
15
+ goog.require('shaka.ads.MediaTailorAdManager');
14
16
  goog.require('shaka.ads.ServerSideAdManager');
15
17
  goog.require('shaka.log');
16
18
  goog.require('shaka.util.Error');
@@ -380,6 +382,8 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
380
382
  super();
381
383
  /** @private {shaka.ads.ClientSideAdManager} */
382
384
  this.csAdManager_ = null;
385
+ /** @private {shaka.ads.MediaTailorAdManager} */
386
+ this.mtAdManager_ = null;
383
387
  /** @private {shaka.ads.ServerSideAdManager} */
384
388
  this.ssAdManager_ = null;
385
389
  /** @private {shaka.ads.AdsStats} */
@@ -439,28 +443,7 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
439
443
 
440
444
  this.csAdManager_ = new shaka.ads.ClientSideAdManager(
441
445
  adContainer, video, this.locale_, adsRenderingSettings,
442
- (e) => {
443
- const event = /** @type {!shaka.util.FakeEvent} */ (e);
444
- if (event && event.type) {
445
- switch (event.type) {
446
- case shaka.ads.AdManager.ADS_LOADED: {
447
- const loadTime = (/** @type {!Object} */ (e))['loadTime'];
448
- this.stats_.addLoadTime(loadTime);
449
- break;
450
- }
451
- case shaka.ads.AdManager.AD_STARTED:
452
- this.stats_.incrementStarted();
453
- break;
454
- case shaka.ads.AdManager.AD_COMPLETE:
455
- this.stats_.incrementPlayedCompletely();
456
- break;
457
- case shaka.ads.AdManager.AD_SKIPPED:
458
- this.stats_.incrementSkipped();
459
- break;
460
- }
461
- }
462
- this.dispatchEvent(event);
463
- });
446
+ (e) => this.processAndDispatchEvent_(e));
464
447
 
465
448
  goog.asserts.assert(this.config_, 'Config must not be null!');
466
449
  this.csAdManager_.configure(this.config_);
@@ -476,6 +459,10 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
476
459
  this.csAdManager_.release();
477
460
  this.csAdManager_ = null;
478
461
  }
462
+ if (this.mtAdManager_) {
463
+ this.mtAdManager_.release();
464
+ this.mtAdManager_ = null;
465
+ }
479
466
  if (this.ssAdManager_) {
480
467
  this.ssAdManager_.release();
481
468
  this.ssAdManager_ = null;
@@ -492,6 +479,9 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
492
479
  if (this.csAdManager_) {
493
480
  this.csAdManager_.stop();
494
481
  }
482
+ if (this.mtAdManager_) {
483
+ this.mtAdManager_.stop();
484
+ }
495
485
  if (this.ssAdManager_) {
496
486
  this.ssAdManager_.stop();
497
487
  }
@@ -535,6 +525,41 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
535
525
  }
536
526
 
537
527
 
528
+ /**
529
+ * @override
530
+ * @export
531
+ */
532
+ initMediaTailor(adContainer, networkingEngine, video) {
533
+ if (this.mtAdManager_) {
534
+ this.mtAdManager_.release();
535
+ }
536
+
537
+ this.mtAdManager_ = new shaka.ads.MediaTailorAdManager(
538
+ adContainer, networkingEngine, video,
539
+ (e) => this.processAndDispatchEvent_(e));
540
+ }
541
+
542
+
543
+ /**
544
+ * @param {string} url
545
+ * @param {Object} adsParams
546
+ * @param {string=} backupUrl
547
+ * @return {!Promise.<string>}
548
+ * @override
549
+ * @export
550
+ */
551
+ requestMediaTailorStream(url, adsParams, backupUrl = '') {
552
+ if (!this.mtAdManager_) {
553
+ throw new shaka.util.Error(
554
+ shaka.util.Error.Severity.RECOVERABLE,
555
+ shaka.util.Error.Category.ADS,
556
+ shaka.util.Error.Code.MT_AD_MANAGER_NOT_INITIALIZED);
557
+ }
558
+
559
+ return this.mtAdManager_.streamRequest(url, adsParams, backupUrl);
560
+ }
561
+
562
+
538
563
  /**
539
564
  * @override
540
565
  * @export
@@ -559,28 +584,7 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
559
584
 
560
585
  this.ssAdManager_ = new shaka.ads.ServerSideAdManager(
561
586
  adContainer, video, this.locale_,
562
- (e) => {
563
- const event = /** @type {!shaka.util.FakeEvent} */ (e);
564
- if (event && event.type) {
565
- switch (event.type) {
566
- case shaka.ads.AdManager.ADS_LOADED: {
567
- const loadTime = (/** @type {!Object} */ (e))['loadTime'];
568
- this.stats_.addLoadTime(loadTime);
569
- break;
570
- }
571
- case shaka.ads.AdManager.AD_STARTED:
572
- this.stats_.incrementStarted();
573
- break;
574
- case shaka.ads.AdManager.AD_COMPLETE:
575
- this.stats_.incrementPlayedCompletely();
576
- break;
577
- case shaka.ads.AdManager.AD_SKIPPED:
578
- this.stats_.incrementSkipped();
579
- break;
580
- }
581
- }
582
- this.dispatchEvent(event);
583
- });
587
+ (e) => this.processAndDispatchEvent_(e));
584
588
 
585
589
  goog.asserts.assert(this.config_, 'Config must not be null!');
586
590
  this.ssAdManager_.configure(this.config_);
@@ -651,13 +655,27 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
651
655
  * @export
652
656
  */
653
657
  getServerSideCuePoints() {
654
- if (!this.ssAdManager_) {
655
- throw new shaka.util.Error(
656
- shaka.util.Error.Severity.RECOVERABLE,
657
- shaka.util.Error.Category.ADS,
658
- shaka.util.Error.Code.SS_AD_MANAGER_NOT_INITIALIZED);
658
+ shaka.Deprecate.deprecateFeature(5,
659
+ 'AdManager',
660
+ 'Please use getCuePoints function.');
661
+ return this.getCuePoints();
662
+ }
663
+
664
+
665
+ /**
666
+ * @return {!Array.<!shaka.extern.AdCuePoint>}
667
+ * @override
668
+ * @export
669
+ */
670
+ getCuePoints() {
671
+ let cuepoints = [];
672
+ if (this.ssAdManager_) {
673
+ cuepoints = cuepoints.concat(this.ssAdManager_.getCuePoints());
659
674
  }
660
- return this.ssAdManager_.getCuePoints();
675
+ if (this.mtAdManager_) {
676
+ cuepoints = cuepoints.concat(this.mtAdManager_.getCuePoints());
677
+ }
678
+ return cuepoints;
661
679
  }
662
680
 
663
681
 
@@ -670,6 +688,16 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
670
688
  return this.stats_.getBlob();
671
689
  }
672
690
 
691
+ /**
692
+ * @override
693
+ * @export
694
+ */
695
+ onManifestUpdated(isLive) {
696
+ if (this.mtAdManager_) {
697
+ this.mtAdManager_.onManifestUpdated(isLive);
698
+ }
699
+ }
700
+
673
701
  /**
674
702
  * @override
675
703
  * @export
@@ -703,6 +731,32 @@ shaka.ads.AdManager = class extends shaka.util.FakeEventTarget {
703
731
  this.ssAdManager_.onCueMetadataChange(value);
704
732
  }
705
733
  }
734
+
735
+ /**
736
+ * @param {!shaka.util.FakeEvent} event
737
+ * @private
738
+ */
739
+ processAndDispatchEvent_(event) {
740
+ if (event && event.type) {
741
+ switch (event.type) {
742
+ case shaka.ads.AdManager.ADS_LOADED: {
743
+ const loadTime = (/** @type {!Object} */ (event))['loadTime'];
744
+ this.stats_.addLoadTime(loadTime);
745
+ break;
746
+ }
747
+ case shaka.ads.AdManager.AD_STARTED:
748
+ this.stats_.incrementStarted();
749
+ break;
750
+ case shaka.ads.AdManager.AD_COMPLETE:
751
+ this.stats_.incrementPlayedCompletely();
752
+ break;
753
+ case shaka.ads.AdManager.AD_SKIPPED:
754
+ this.stats_.incrementSkipped();
755
+ break;
756
+ }
757
+ }
758
+ this.dispatchEvent(event);
759
+ }
706
760
  };
707
761
 
708
762
  /**
@@ -0,0 +1,297 @@
1
+ /*! @license
2
+ * Shaka Player
3
+ * Copyright 2016 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+
8
+ goog.provide('shaka.ads.MediaTailorAd');
9
+
10
+ /**
11
+ * @implements {shaka.extern.IAd}
12
+ * @export
13
+ */
14
+ shaka.ads.MediaTailorAd = class {
15
+ /**
16
+ * @param {mediaTailor.Ad} mediaTailorAd
17
+ * @param {number} adPosition
18
+ * @param {number} totalAds
19
+ * @param {HTMLMediaElement} video
20
+ */
21
+ constructor(mediaTailorAd, adPosition, totalAds, isLinear, video) {
22
+ /** @private {?mediaTailor.Ad} */
23
+ this.ad_ = mediaTailorAd;
24
+
25
+ /** @private {HTMLMediaElement} */
26
+ this.video_ = video;
27
+
28
+ /** @private {?number} */
29
+ this.adPosition_ = adPosition;
30
+
31
+ /** @private {?number} */
32
+ this.totalAds_ = totalAds;
33
+
34
+ /** @private {boolean} */
35
+ this.isLinear_ = isLinear;
36
+ }
37
+
38
+
39
+ /**
40
+ * @override
41
+ * @export
42
+ */
43
+ getDuration() {
44
+ return this.ad_.durationInSeconds;
45
+ }
46
+
47
+ /**
48
+ * @override
49
+ * @export
50
+ */
51
+ getMinSuggestedDuration() {
52
+ return this.getDuration();
53
+ }
54
+
55
+ /**
56
+ * @override
57
+ * @export
58
+ */
59
+ getRemainingTime() {
60
+ const endTime = this.ad_.startTimeInSeconds + this.ad_.durationInSeconds;
61
+ return endTime - this.video_.currentTime;
62
+ }
63
+
64
+ /**
65
+ * @override
66
+ * @export
67
+ */
68
+ isPaused() {
69
+ return this.video_.paused;
70
+ }
71
+
72
+ /**
73
+ * @override
74
+ * @export
75
+ */
76
+ isSkippable() {
77
+ if (this.ad_.skipOffset) {
78
+ return true;
79
+ }
80
+ return false;
81
+ }
82
+
83
+ /**
84
+ * @override
85
+ * @export
86
+ */
87
+ getTimeUntilSkippable() {
88
+ if (!this.ad_.skipOffset) {
89
+ return this.getRemainingTime();
90
+ }
91
+ const canSkipIn = this.getRemainingTime() - this.ad_.skipOffset;
92
+ return Math.max(canSkipIn, 0);
93
+ }
94
+
95
+ /**
96
+ * @override
97
+ * @export
98
+ */
99
+ canSkipNow() {
100
+ return this.getTimeUntilSkippable() == 0;
101
+ }
102
+
103
+ /**
104
+ * @override
105
+ * @export
106
+ */
107
+ skip() {
108
+ this.video_.currentTime += this.getRemainingTime();
109
+ }
110
+
111
+ /**
112
+ * @override
113
+ * @export
114
+ */
115
+ pause() {
116
+ return this.video_.pause();
117
+ }
118
+
119
+ /**
120
+ * @override
121
+ * @export
122
+ */
123
+ play() {
124
+ return this.video_.play();
125
+ }
126
+
127
+
128
+ /**
129
+ * @override
130
+ * @export
131
+ */
132
+ getVolume() {
133
+ return this.video_.volume;
134
+ }
135
+
136
+ /**
137
+ * @override
138
+ * @export
139
+ */
140
+ setVolume(volume) {
141
+ this.video_.volume = volume;
142
+ }
143
+
144
+ /**
145
+ * @override
146
+ * @export
147
+ */
148
+ isMuted() {
149
+ return this.video_.muted;
150
+ }
151
+
152
+ /**
153
+ * @override
154
+ * @export
155
+ */
156
+ isLinear() {
157
+ return this.isLinear_;
158
+ }
159
+
160
+ /**
161
+ * @override
162
+ * @export
163
+ */
164
+ resize(width, height) {
165
+ // Nothing
166
+ }
167
+
168
+ /**
169
+ * @override
170
+ * @export
171
+ */
172
+ setMuted(muted) {
173
+ this.video_.muted = muted;
174
+ }
175
+
176
+
177
+ /**
178
+ * @override
179
+ * @export
180
+ */
181
+ getSequenceLength() {
182
+ if (!this.totalAds_) {
183
+ return 1;
184
+ }
185
+ return this.totalAds_;
186
+ }
187
+
188
+ /**
189
+ * @override
190
+ * @export
191
+ */
192
+ getPositionInSequence() {
193
+ if (!this.adPosition_) {
194
+ return 1;
195
+ }
196
+ return this.adPosition_;
197
+ }
198
+
199
+ /**
200
+ * @override
201
+ * @export
202
+ */
203
+ getTitle() {
204
+ return this.ad_.adTitle;
205
+ }
206
+
207
+ /**
208
+ * @override
209
+ * @export
210
+ */
211
+ getDescription() {
212
+ return '';
213
+ }
214
+
215
+ /**
216
+ * @override
217
+ * @export
218
+ */
219
+ getVastMediaBitrate() {
220
+ return 0;
221
+ }
222
+
223
+ /**
224
+ * @override
225
+ * @export
226
+ */
227
+ getVastMediaHeight() {
228
+ return 0;
229
+ }
230
+
231
+ /**
232
+ * @override
233
+ * @export
234
+ */
235
+ getVastMediaWidth() {
236
+ return 0;
237
+ }
238
+
239
+ /**
240
+ * @override
241
+ * @export
242
+ */
243
+ getAdId() {
244
+ return this.ad_.adId;
245
+ }
246
+
247
+ /**
248
+ * @override
249
+ * @export
250
+ */
251
+ getCreativeAdId() {
252
+ return this.ad_.creativeId;
253
+ }
254
+
255
+ /**
256
+ * @override
257
+ * @export
258
+ */
259
+ getAdvertiserName() {
260
+ return '';
261
+ }
262
+
263
+ /**
264
+ * @override
265
+ * @export
266
+ */
267
+ getMediaUrl() {
268
+ return null;
269
+ }
270
+
271
+ /**
272
+ * @override
273
+ * @export
274
+ */
275
+ getTimeOffset() {
276
+ return 0;
277
+ }
278
+
279
+ /**
280
+ * @override
281
+ * @export
282
+ */
283
+ getPodIndex() {
284
+ return 0;
285
+ }
286
+
287
+ /**
288
+ * @override
289
+ * @export
290
+ */
291
+ release() {
292
+ this.ad_ = null;
293
+ this.video_ = null;
294
+ this.adPosition_ = null;
295
+ this.totalAds_ = null;
296
+ }
297
+ };