shaka-player 4.3.9 → 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 (321) hide show
  1. package/.github/workflows/build-and-test.yaml +11 -18
  2. package/.github/workflows/compute-incremental-coverage.py +3 -0
  3. package/.github/workflows/release-please.yaml +7 -0
  4. package/.github/workflows/selenium-lab-tests.yaml +45 -10
  5. package/AUTHORS +9 -0
  6. package/CHANGELOG.md +295 -190
  7. package/CONTRIBUTORS +8 -0
  8. package/LICENSE +32 -0
  9. package/README.md +63 -10
  10. package/demo/autoTemplate.txt +40 -5
  11. package/demo/close_button.js +11 -0
  12. package/demo/common/asset.js +13 -1
  13. package/demo/common/assets.js +112 -28
  14. package/demo/common/message_ids.js +25 -1
  15. package/demo/config.js +69 -10
  16. package/demo/customWarning.txt +2 -2
  17. package/demo/index.html +3 -1
  18. package/demo/locales/en.json +26 -2
  19. package/demo/locales/source.json +105 -9
  20. package/demo/main.js +57 -9
  21. package/demo/search.js +3 -1
  22. package/demo/service_worker.js +3 -0
  23. package/dist/controls.css +1 -1
  24. package/dist/controls.css.map +1 -1
  25. package/dist/demo.compiled.debug.js +132 -118
  26. package/dist/demo.compiled.debug.map +3 -3
  27. package/dist/demo.compiled.js +132 -118
  28. package/dist/demo.compiled.map +3 -3
  29. package/dist/deps.js +46 -28
  30. package/dist/locales.js +31 -31
  31. package/dist/receiver.compiled.debug.js +60 -52
  32. package/dist/receiver.compiled.debug.map +3 -3
  33. package/dist/receiver.compiled.js +60 -52
  34. package/dist/receiver.compiled.map +3 -3
  35. package/dist/shaka-player.compiled.d.ts +676 -391
  36. package/dist/shaka-player.compiled.debug.d.ts +676 -391
  37. package/dist/shaka-player.compiled.debug.externs.js +1188 -616
  38. package/dist/shaka-player.compiled.debug.js +1046 -700
  39. package/dist/shaka-player.compiled.debug.map +4 -4
  40. package/dist/shaka-player.compiled.externs.js +1188 -616
  41. package/dist/shaka-player.compiled.js +1094 -933
  42. package/dist/shaka-player.compiled.map +4 -4
  43. package/dist/shaka-player.ui.d.ts +677 -392
  44. package/dist/shaka-player.ui.debug.d.ts +677 -392
  45. package/dist/shaka-player.ui.debug.externs.js +1023 -451
  46. package/dist/shaka-player.ui.debug.js +1101 -738
  47. package/dist/shaka-player.ui.debug.map +4 -4
  48. package/dist/shaka-player.ui.externs.js +1023 -451
  49. package/dist/shaka-player.ui.js +1244 -1071
  50. package/dist/shaka-player.ui.map +4 -4
  51. package/docs/tutorials/ad_monetization.md +15 -1
  52. package/docs/tutorials/application-level-redirects.md +1 -1
  53. package/docs/tutorials/config.md +9 -5
  54. package/docs/tutorials/drm-config.md +61 -0
  55. package/docs/tutorials/fairplay.md +19 -4
  56. package/docs/tutorials/license-server-auth.md +4 -4
  57. package/docs/tutorials/license-wrapping.md +2 -2
  58. package/docs/tutorials/ui-customization.md +7 -3
  59. package/docs/tutorials/ui.md +7 -7
  60. package/docs/tutorials/upgrade.md +3 -0
  61. package/externs/ima.js +123 -2
  62. package/externs/isoboxer.js +217 -0
  63. package/externs/mediakeys.js +18 -0
  64. package/externs/mux.js +1 -105
  65. package/externs/pictureinpicture.js +48 -0
  66. package/externs/shaka/ads.js +61 -1
  67. package/externs/shaka/cea.js +110 -0
  68. package/externs/shaka/codecs.js +32 -0
  69. package/externs/shaka/manifest.js +101 -1
  70. package/externs/shaka/manifest_parser.js +0 -10
  71. package/externs/shaka/net.js +36 -7
  72. package/externs/shaka/offline.js +8 -1
  73. package/externs/shaka/player.js +220 -21
  74. package/externs/shaka/text.js +1 -382
  75. package/externs/shaka/transmuxer.js +59 -0
  76. package/karma.conf.js +15 -0
  77. package/lib/abr/simple_abr_manager.js +6 -3
  78. package/lib/ads/ad_manager.js +60 -2
  79. package/lib/ads/client_side_ad.js +86 -0
  80. package/lib/ads/client_side_ad_manager.js +93 -5
  81. package/lib/ads/server_side_ad.js +86 -0
  82. package/lib/ads/server_side_ad_manager.js +13 -0
  83. package/lib/cast/cast_utils.js +1 -0
  84. package/lib/cea/cea608_data_channel.js +24 -14
  85. package/lib/cea/cea608_memory.js +5 -2
  86. package/lib/cea/cea708_service.js +8 -9
  87. package/lib/cea/cea708_window.js +1 -2
  88. package/lib/cea/cea_decoder.js +23 -6
  89. package/lib/cea/cea_utils.js +25 -2
  90. package/lib/cea/dummy_caption_decoder.js +21 -0
  91. package/lib/cea/dummy_cea_parser.js +1 -3
  92. package/lib/cea/mp4_cea_parser.js +15 -10
  93. package/lib/cea/ts_cea_parser.js +69 -0
  94. package/lib/dash/content_protection.js +32 -2
  95. package/lib/dash/dash_parser.js +93 -31
  96. package/lib/dash/mpd_utils.js +6 -25
  97. package/lib/dash/segment_base.js +12 -14
  98. package/lib/dash/segment_list.js +10 -6
  99. package/lib/dash/segment_template.js +349 -32
  100. package/lib/dependencies/all.js +8 -0
  101. package/lib/hls/hls_classes.js +33 -8
  102. package/lib/hls/hls_parser.js +805 -191
  103. package/lib/hls/manifest_text_parser.js +4 -14
  104. package/lib/media/adaptation_set_criteria.js +43 -3
  105. package/lib/media/closed_caption_parser.js +74 -12
  106. package/lib/media/drm_engine.js +189 -49
  107. package/lib/media/gap_jumping_controller.js +1 -1
  108. package/lib/media/manifest_parser.js +34 -0
  109. package/lib/media/media_source_capabilities.js +10 -0
  110. package/lib/media/media_source_engine.js +475 -231
  111. package/lib/media/playhead.js +1 -1
  112. package/lib/media/presentation_timeline.js +62 -0
  113. package/lib/media/segment_index.js +50 -14
  114. package/lib/media/segment_prefetch.js +277 -0
  115. package/lib/media/segment_reference.js +70 -4
  116. package/lib/media/streaming_engine.js +258 -81
  117. package/lib/media/video_wrapper.js +15 -7
  118. package/lib/mss/content_protection.js +353 -0
  119. package/lib/mss/mss_parser.js +1081 -0
  120. package/lib/net/networking_engine.js +60 -10
  121. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  122. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  123. package/lib/offline/manifest_converter.js +6 -0
  124. package/lib/offline/storage.js +2 -4
  125. package/lib/player.js +309 -105
  126. package/lib/polyfill/media_capabilities.js +43 -3
  127. package/lib/polyfill/patchedmediakeys_apple.js +5 -0
  128. package/lib/polyfill/patchedmediakeys_nop.js +5 -0
  129. package/lib/polyfill/patchedmediakeys_webkit.js +5 -0
  130. package/lib/text/cue.js +208 -130
  131. package/lib/text/lrc_text_parser.js +2 -2
  132. package/lib/text/mp4_vtt_parser.js +2 -2
  133. package/lib/text/sbv_text_parser.js +1 -1
  134. package/lib/text/simple_text_displayer.js +2 -1
  135. package/lib/text/srt_text_parser.js +9 -1
  136. package/lib/text/ssa_text_parser.js +2 -2
  137. package/lib/text/text_engine.js +3 -21
  138. package/lib/text/text_utils.js +71 -20
  139. package/lib/text/ui_text_displayer.js +14 -14
  140. package/lib/text/vtt_text_parser.js +22 -14
  141. package/lib/transmuxer/aac_transmuxer.js +224 -0
  142. package/lib/transmuxer/ac3.js +142 -0
  143. package/lib/transmuxer/ac3_transmuxer.js +212 -0
  144. package/lib/transmuxer/adts.js +232 -0
  145. package/lib/transmuxer/ec3.js +103 -0
  146. package/lib/transmuxer/ec3_transmuxer.js +212 -0
  147. package/lib/transmuxer/h264.js +324 -0
  148. package/lib/transmuxer/mp3_transmuxer.js +204 -0
  149. package/lib/transmuxer/mpeg_audio.js +196 -0
  150. package/lib/transmuxer/mpeg_ts_transmuxer.js +182 -0
  151. package/lib/transmuxer/mss_transmuxer.js +389 -0
  152. package/lib/{media/transmuxer.js → transmuxer/muxjs_transmuxer.js} +34 -80
  153. package/lib/transmuxer/transmuxer_engine.js +161 -0
  154. package/lib/transmuxer/ts_transmuxer.js +738 -0
  155. package/lib/util/cmcd_manager.js +131 -71
  156. package/lib/util/error.js +62 -26
  157. package/lib/util/exp_golomb.js +220 -0
  158. package/lib/util/fairplay_utils.js +64 -13
  159. package/lib/util/id3_utils.js +56 -3
  160. package/lib/util/language_utils.js +11 -8
  161. package/lib/util/manifest_parser_utils.js +3 -0
  162. package/lib/util/mime_utils.js +44 -7
  163. package/lib/util/mp4_box_parsers.js +233 -5
  164. package/lib/util/mp4_generator.js +1381 -0
  165. package/lib/util/periods.js +40 -34
  166. package/lib/util/platform.js +25 -3
  167. package/lib/util/player_configuration.js +38 -1
  168. package/lib/util/stream_utils.js +138 -27
  169. package/lib/util/text_parser.js +1 -1
  170. package/lib/util/ts_parser.js +470 -47
  171. package/lib/util/xml_utils.js +16 -3
  172. package/maintained-branches.md +2 -2
  173. package/package.json +4 -2
  174. package/roadmap.md +21 -6
  175. package/shaka-player.uncompiled.js +18 -0
  176. package/test/abr/simple_abr_manager_unit.js +32 -4
  177. package/test/ads/ad_manager_unit.js +18 -2
  178. package/test/cast/cast_utils_unit.js +7 -2
  179. package/test/cea/cea608_memory_unit.js +24 -0
  180. package/test/cea/cea_decoder_unit.js +33 -0
  181. package/test/dash/dash_parser_content_protection_unit.js +93 -3
  182. package/test/dash/dash_parser_live_unit.js +56 -13
  183. package/test/dash/dash_parser_manifest_unit.js +70 -2
  184. package/test/dash/dash_parser_segment_base_unit.js +14 -9
  185. package/test/dash/dash_parser_segment_template_unit.js +286 -6
  186. package/test/demo/demo_unit.js +5 -1
  187. package/test/hls/hls_live_unit.js +188 -28
  188. package/test/hls/hls_parser_unit.js +250 -109
  189. package/test/hls/manifest_text_parser_unit.js +18 -13
  190. package/test/media/adaptation_set_criteria_unit.js +46 -14
  191. package/test/media/adaptation_set_unit.js +2 -0
  192. package/test/media/drm_engine_integration.js +11 -8
  193. package/test/media/drm_engine_unit.js +220 -7
  194. package/test/media/media_source_engine_integration.js +122 -38
  195. package/test/media/media_source_engine_unit.js +133 -153
  196. package/test/media/playhead_unit.js +3 -0
  197. package/test/media/presentation_timeline_unit.js +51 -0
  198. package/test/media/segment_index_unit.js +52 -0
  199. package/test/media/segment_prefetch_unit.js +243 -0
  200. package/test/media/streaming_engine_integration.js +9 -3
  201. package/test/media/streaming_engine_unit.js +440 -59
  202. package/test/mss/mss_parser_content_protection_unit.js +49 -0
  203. package/test/mss/mss_parser_unit.js +472 -0
  204. package/test/mss/mss_player_integration.js +123 -0
  205. package/test/offline/manifest_convert_unit.js +9 -0
  206. package/test/offline/storage_integration.js +6 -1
  207. package/test/player_integration.js +4 -1
  208. package/test/player_unit.js +386 -133
  209. package/test/polyfill/media_capabilities_unit.js +18 -0
  210. package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
  211. package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
  212. package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
  213. package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
  214. package/test/test/assets/hls-raw-aac/manifest.m3u8 +4 -0
  215. package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +14 -0
  216. package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
  217. package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
  218. package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
  219. package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
  220. package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
  221. package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
  222. package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
  223. package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
  224. package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +31 -0
  225. package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
  226. package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
  227. package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
  228. package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
  229. package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
  230. package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
  231. package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
  232. package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
  233. package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +31 -0
  234. package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +13 -0
  235. package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
  236. package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
  237. package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
  238. package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
  239. package/test/test/assets/hls-raw-mp3/playlist.m3u8 +4 -0
  240. package/test/test/assets/hls-ts-aac/playlist.m3u8 +23 -0
  241. package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
  242. package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
  243. package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
  244. package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
  245. package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
  246. package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
  247. package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
  248. package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
  249. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
  250. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
  251. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
  252. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
  253. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
  254. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
  255. package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +19 -0
  256. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
  257. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
  258. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
  259. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
  260. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
  261. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
  262. package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +19 -0
  263. package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
  264. package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
  265. package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
  266. package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
  267. package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
  268. package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
  269. package/test/test/assets/hls-ts-h264/prog_index.m3u8 +25 -0
  270. package/test/test/assets/hls-ts-mp3/manifest.m3u8 +13 -0
  271. package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
  272. package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
  273. package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
  274. package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
  275. package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +17 -0
  276. package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
  277. package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
  278. package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
  279. package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
  280. package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
  281. package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
  282. package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +4 -0
  283. package/test/test/boot.js +7 -2
  284. package/test/test/util/fake_ad.js +99 -0
  285. package/test/test/util/fake_ad_manager.js +7 -1
  286. package/test/test/util/fake_networking_engine.js +41 -14
  287. package/test/test/util/fake_segment_prefetch.js +81 -0
  288. package/test/test/util/manifest_generator.js +19 -5
  289. package/test/test/util/mss_parser_util.js +115 -0
  290. package/test/test/util/offline_utils.js +1 -0
  291. package/test/test/util/simple_fakes.js +12 -3
  292. package/test/test/util/streaming_engine_util.js +14 -4
  293. package/test/test/util/ttml_utils.js +2 -2
  294. package/test/test/util/ui_utils.js +5 -1
  295. package/test/text/cue_integration.js +1 -1
  296. package/test/text/srt_text_parser_unit.js +78 -0
  297. package/test/text/text_engine_unit.js +17 -8
  298. package/test/text/ui_text_displayer_unit.js +4 -4
  299. package/test/text/vtt_text_parser_unit.js +59 -40
  300. package/test/text/web_vtt_generator_unit.js +9 -3
  301. package/test/{media/transmuxer_integration.js → transmuxer/muxjs_transmuxer_integration.js} +30 -33
  302. package/test/transmuxer/transmuxer_engine_integration.js +60 -0
  303. package/test/transmuxer/transmuxer_integration.js +296 -0
  304. package/test/util/cmcd_manager_unit.js +162 -13
  305. package/test/util/language_utils_unit.js +9 -2
  306. package/test/util/mp4_box_parsers_unit.js +39 -4
  307. package/test/util/periods_unit.js +34 -26
  308. package/test/util/stream_utils_unit.js +60 -107
  309. package/ui/controls.js +19 -1
  310. package/ui/controls.less +1 -0
  311. package/ui/externs/ui.js +13 -3
  312. package/ui/language_utils.js +15 -0
  313. package/ui/less/thumbnails.less +26 -0
  314. package/ui/locales/oc.json +42 -0
  315. package/ui/pip_button.js +83 -2
  316. package/ui/range_element.js +15 -0
  317. package/ui/resolution_selection.js +9 -2
  318. package/ui/seek_bar.js +230 -1
  319. package/ui/ui.js +5 -0
  320. package/lib/cea/i_caption_decoder.js +0 -51
  321. package/lib/cea/i_cea_parser.js +0 -68
@@ -252,6 +252,92 @@ shaka.ads.ClientSideAd = class {
252
252
  return this.ad_.getDescription();
253
253
  }
254
254
 
255
+ /**
256
+ * @override
257
+ * @export
258
+ */
259
+ getVastMediaBitrate() {
260
+ return this.ad_.getVastMediaBitrate();
261
+ }
262
+
263
+ /**
264
+ * @override
265
+ * @export
266
+ */
267
+ getVastMediaHeight() {
268
+ return this.ad_.getVastMediaHeight();
269
+ }
270
+
271
+ /**
272
+ * @override
273
+ * @export
274
+ */
275
+ getVastMediaWidth() {
276
+ return this.ad_.getVastMediaWidth();
277
+ }
278
+
279
+ /**
280
+ * @override
281
+ * @export
282
+ */
283
+ getAdId() {
284
+ return this.ad_.getAdId();
285
+ }
286
+
287
+ /**
288
+ * @override
289
+ * @export
290
+ */
291
+ getCreativeAdId() {
292
+ return this.ad_.getCreativeAdId();
293
+ }
294
+
295
+ /**
296
+ * @override
297
+ * @export
298
+ */
299
+ getAdvertiserName() {
300
+ return this.ad_.getAdvertiserName();
301
+ }
302
+
303
+ /**
304
+ * @override
305
+ * @export
306
+ */
307
+ getMediaUrl() {
308
+ return this.ad_.getMediaUrl();
309
+ }
310
+
311
+ /**
312
+ * @override
313
+ * @export
314
+ */
315
+ getTimeOffset() {
316
+ const podInfo = this.ad_.getAdPodInfo();
317
+ if (podInfo == null) {
318
+ // Defaults to 0 if this ad is not part of a pod, or the pod is not part
319
+ // of an ad playlist.
320
+ return 0;
321
+ }
322
+
323
+ return podInfo.getTimeOffset();
324
+ }
325
+
326
+ /**
327
+ * @override
328
+ * @export
329
+ */
330
+ getPodIndex() {
331
+ const podInfo = this.ad_.getAdPodInfo();
332
+ if (podInfo == null) {
333
+ // Defaults to 0 if this ad is not part of a pod, or the pod is not part
334
+ // of an ad playlist.
335
+ return 0;
336
+ }
337
+
338
+ return podInfo.getPodIndex();
339
+ }
340
+
255
341
  /**
256
342
  * @override
257
343
  * @export
@@ -24,15 +24,22 @@ shaka.ads.ClientSideAdManager = class {
24
24
  * @param {HTMLElement} adContainer
25
25
  * @param {HTMLMediaElement} video
26
26
  * @param {string} locale
27
+ * @param {?google.ima.AdsRenderingSettings} adsRenderingSettings
27
28
  * @param {function(!shaka.util.FakeEvent)} onEvent
28
29
  */
29
- constructor(adContainer, video, locale, onEvent) {
30
+ constructor(adContainer, video, locale, adsRenderingSettings, onEvent) {
30
31
  /** @private {HTMLElement} */
31
32
  this.adContainer_ = adContainer;
32
33
 
33
34
  /** @private {HTMLMediaElement} */
34
35
  this.video_ = video;
35
36
 
37
+ /** @private {boolean} */
38
+ this.videoPlayed_ = false;
39
+
40
+ /** @private {?shaka.extern.AdsConfiguration} */
41
+ this.config_ = null;
42
+
36
43
  /** @private {ResizeObserver} */
37
44
  this.resizeObserver_ = null;
38
45
 
@@ -50,6 +57,8 @@ shaka.ads.ClientSideAdManager = class {
50
57
 
51
58
  google.ima.settings.setLocale(locale);
52
59
 
60
+ google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true);
61
+
53
62
  const adDisplayContainer = new google.ima.AdDisplayContainer(
54
63
  this.adContainer_,
55
64
  this.video_);
@@ -67,7 +76,11 @@ shaka.ads.ClientSideAdManager = class {
67
76
  /** @private {google.ima.AdsManager} */
68
77
  this.imaAdsManager_ = null;
69
78
 
70
- this.eventManager_.listenOnce(this.adsLoader_,
79
+ /** @private {!google.ima.AdsRenderingSettings} */
80
+ this.adsRenderingSettings_ =
81
+ adsRenderingSettings || new google.ima.AdsRenderingSettings();
82
+
83
+ this.eventManager_.listen(this.adsLoader_,
71
84
  google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, (e) => {
72
85
  this.onAdsManagerLoaded_(
73
86
  /** @type {!google.ima.AdsManagerLoadedEvent} */ (e));
@@ -82,6 +95,20 @@ shaka.ads.ClientSideAdManager = class {
82
95
  this.eventManager_.listen(this.video_, 'ended', () => {
83
96
  this.adsLoader_.contentComplete();
84
97
  });
98
+
99
+ this.eventManager_.listenOnce(this.video_, 'play', () => {
100
+ this.videoPlayed_ = true;
101
+ });
102
+ }
103
+
104
+ /**
105
+ * Called by the AdManager to provide an updated configuration any time it
106
+ * changes.
107
+ *
108
+ * @param {shaka.extern.AdsConfiguration} config
109
+ */
110
+ configure(config) {
111
+ this.config_ = config;
85
112
  }
86
113
 
87
114
  /**
@@ -92,10 +119,32 @@ shaka.ads.ClientSideAdManager = class {
92
119
  imaRequest.adTagUrl || imaRequest.adsResponse,
93
120
  'The ad tag needs to be set up before requesting ads, ' +
94
121
  'or adsResponse must be filled.');
122
+ // Destroy the current AdsManager, in case the tag you requested previously
123
+ // contains post-rolls (don't play those now).
124
+ if (this.imaAdsManager_) {
125
+ this.imaAdsManager_.destroy();
126
+ }
127
+ // Your AdsLoader will be set up on page-load. You should re-use the same
128
+ // AdsLoader for every request.
129
+ if (this.adsLoader_) {
130
+ // Reset the IMA SDK.
131
+ this.adsLoader_.contentComplete();
132
+ }
95
133
  this.requestAdsStartTime_ = Date.now() / 1000;
96
134
  this.adsLoader_.requestAds(imaRequest);
97
135
  }
98
136
 
137
+ /**
138
+ * @param {!google.ima.AdsRenderingSettings} adsRenderingSettings
139
+ */
140
+ updateAdsRenderingSettings(adsRenderingSettings) {
141
+ this.adsRenderingSettings_ = adsRenderingSettings;
142
+ if (this.imaAdsManager_) {
143
+ this.imaAdsManager_.updateAdsRenderingSettings(
144
+ this.adsRenderingSettings_);
145
+ }
146
+ }
147
+
99
148
  /**
100
149
  * Stop all currently playing ads.
101
150
  */
@@ -133,6 +182,10 @@ shaka.ads.ClientSideAdManager = class {
133
182
  shaka.log.warning(
134
183
  'There was an ad error from the IMA SDK: ' + e.getError());
135
184
  shaka.log.warning('Resuming playback.');
185
+
186
+ const data = (new Map()).set('originalEvent', e);
187
+ this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.AD_ERROR, data));
188
+
136
189
  this.onAdComplete_(/* adEvent= */ null);
137
190
  // Remove ad breaks from the timeline
138
191
  this.onEvent_(
@@ -153,7 +206,37 @@ shaka.ads.ClientSideAdManager = class {
153
206
  this.onEvent_(new shaka.util.FakeEvent(shaka.ads.AdManager.ADS_LOADED,
154
207
  (new Map()).set('loadTime', loadTime)));
155
208
 
156
- this.imaAdsManager_ = e.getAdsManager(this.video_);
209
+ if (!this.config_.customPlayheadTracker) {
210
+ this.imaAdsManager_ = e.getAdsManager(this.video_,
211
+ this.adsRenderingSettings_);
212
+ } else {
213
+ const videoPlayHead = {
214
+ currentTime: this.video_.currentTime,
215
+ };
216
+
217
+ this.imaAdsManager_ = e.getAdsManager(videoPlayHead,
218
+ this.adsRenderingSettings_);
219
+
220
+ if (this.video_.muted) {
221
+ this.imaAdsManager_.setVolume(0);
222
+ } else {
223
+ this.imaAdsManager_.setVolume(this.video_.volume);
224
+ }
225
+
226
+ this.eventManager_.listen(this.video_, 'timeupdate', () => {
227
+ if (!this.video_.duration) {
228
+ return;
229
+ }
230
+ videoPlayHead.currentTime = this.video_.currentTime;
231
+ });
232
+ this.eventManager_.listen(this.video_, 'volumechange', () => {
233
+ if (this.video_.muted) {
234
+ this.imaAdsManager_.setVolume(0);
235
+ } else {
236
+ this.imaAdsManager_.setVolume(this.video_.volume);
237
+ }
238
+ });
239
+ }
157
240
 
158
241
  this.onEvent_(new shaka.util.FakeEvent(
159
242
  shaka.ads.AdManager.IMA_AD_MANAGER_LOADED,
@@ -219,9 +302,14 @@ shaka.ads.ClientSideAdManager = class {
219
302
  // seen the ads actually play until requestAds() is called.
220
303
  // Note: We listen for a play event to avoid autoplay issues that might
221
304
  // crash IMA.
222
- this.eventManager_.listenOnce(this.video_, 'play', () => {
305
+ if (this.videoPlayed_) {
223
306
  this.imaAdsManager_.start();
224
- });
307
+ } else {
308
+ this.eventManager_.listenOnce(this.video_, 'play', () => {
309
+ this.videoPlayed_ = true;
310
+ this.imaAdsManager_.start();
311
+ });
312
+ }
225
313
  } catch (adError) {
226
314
  // If there was a problem with the VAST response,
227
315
  // we we won't be getting an ad. Hide ad UI if we showed it already
@@ -221,6 +221,92 @@ shaka.ads.ServerSideAd = class {
221
221
  return this.ad_.getDescription();
222
222
  }
223
223
 
224
+ /**
225
+ * @override
226
+ * @export
227
+ */
228
+ getVastMediaBitrate() {
229
+ return 0;
230
+ }
231
+
232
+ /**
233
+ * @override
234
+ * @export
235
+ */
236
+ getVastMediaHeight() {
237
+ return this.ad_.getVastMediaHeight();
238
+ }
239
+
240
+ /**
241
+ * @override
242
+ * @export
243
+ */
244
+ getVastMediaWidth() {
245
+ return this.ad_.getVastMediaWidth();
246
+ }
247
+
248
+ /**
249
+ * @override
250
+ * @export
251
+ */
252
+ getAdId() {
253
+ return this.ad_.getAdId();
254
+ }
255
+
256
+ /**
257
+ * @override
258
+ * @export
259
+ */
260
+ getCreativeAdId() {
261
+ return this.ad_.getCreativeAdId();
262
+ }
263
+
264
+ /**
265
+ * @override
266
+ * @export
267
+ */
268
+ getAdvertiserName() {
269
+ return this.ad_.getAdvertiserName();
270
+ }
271
+
272
+ /**
273
+ * @override
274
+ * @export
275
+ */
276
+ getMediaUrl() {
277
+ return null;
278
+ }
279
+
280
+ /**
281
+ * @override
282
+ * @export
283
+ */
284
+ getTimeOffset() {
285
+ const podInfo = this.ad_.getAdPodInfo();
286
+ if (podInfo == null) {
287
+ // Defaults to 0 if this ad is not part of a pod, or the pod is not part
288
+ // of an ad playlist.
289
+ return 0;
290
+ }
291
+
292
+ return podInfo.getTimeOffset();
293
+ }
294
+
295
+ /**
296
+ * @override
297
+ * @export
298
+ */
299
+ getPodIndex() {
300
+ const podInfo = this.ad_.getAdPodInfo();
301
+ if (podInfo == null) {
302
+ // Defaults to 0 if this ad is not part of a pod, or the pod is not part
303
+ // of an ad playlist.
304
+ return 0;
305
+ }
306
+
307
+ return podInfo.getPodIndex();
308
+ }
309
+
224
310
  /**
225
311
  * @override
226
312
  * @export
@@ -35,6 +35,9 @@ shaka.ads.ServerSideAdManager = class {
35
35
  /** @private {HTMLMediaElement} */
36
36
  this.video_ = video;
37
37
 
38
+ /** @private {?shaka.extern.AdsConfiguration} */
39
+ this.config_ = null;
40
+
38
41
  /** @private
39
42
  {?shaka.util.PublicPromise.<string>} */
40
43
  this.streamPromise_ = null;
@@ -168,6 +171,16 @@ shaka.ads.ServerSideAdManager = class {
168
171
  });
169
172
  }
170
173
 
174
+ /**
175
+ * Called by the AdManager to provide an updated configuration any time it
176
+ * changes.
177
+ *
178
+ * @param {shaka.extern.AdsConfiguration} config
179
+ */
180
+ configure(config) {
181
+ this.config_ = config;
182
+ }
183
+
171
184
  /**
172
185
  * @param {!google.ima.dai.api.StreamRequest} streamRequest
173
186
  * @param {string=} backupUrl
@@ -325,6 +325,7 @@ shaka.cast.CastUtils.PlayerGetterMethods = {
325
325
  'keySystem': 10,
326
326
  'seekRange': 1,
327
327
  'getLoadMode': 10,
328
+ 'getManifestType': 10,
328
329
  };
329
330
 
330
331
 
@@ -9,7 +9,6 @@ goog.provide('shaka.cea.Cea608DataChannel');
9
9
  goog.require('shaka.cea.Cea608Memory');
10
10
  goog.require('shaka.cea.CeaUtils');
11
11
  goog.require('shaka.log');
12
- goog.requireType('shaka.cea.ICaptionDecoder');
13
12
 
14
13
 
15
14
  /**
@@ -54,7 +53,7 @@ shaka.cea.Cea608DataChannel = class {
54
53
  * Points to current buffer.
55
54
  * @private {!shaka.cea.Cea608Memory}
56
55
  */
57
- this.curbuf_ = this.displayedMemory_;
56
+ this.curbuf_ = this.nonDisplayedMemory_;
58
57
 
59
58
  /**
60
59
  * End time of the previous caption, serves as start time of next caption.
@@ -73,14 +72,25 @@ shaka.cea.Cea608DataChannel = class {
73
72
  * Resets channel state.
74
73
  */
75
74
  reset() {
76
- this.type_ = shaka.cea.Cea608DataChannel.CaptionType.PAINTON;
77
- this.curbuf_ = this.displayedMemory_;
75
+ this.type_ = shaka.cea.Cea608DataChannel.CaptionType.NONE;
76
+ this.curbuf_ = this.nonDisplayedMemory_;
78
77
  this.lastcp_ = null;
79
78
  this.displayedMemory_.reset();
80
79
  this.nonDisplayedMemory_.reset();
81
80
  this.text_.reset();
82
81
  }
83
82
 
83
+ /**
84
+ * Set the initial PTS, which may not be 0 if we start decoding at a later
85
+ * point in the stream. Without this, the first cue's startTime can be way
86
+ * off.
87
+ *
88
+ * @param {number} pts
89
+ */
90
+ firstPts(pts) {
91
+ this.prevEndTime_ = pts;
92
+ }
93
+
84
94
  /**
85
95
  * Gets the row index from a Preamble Address Code byte pair.
86
96
  * @param {number} b1 Byte 1.
@@ -155,12 +165,12 @@ shaka.cea.Cea608DataChannel = class {
155
165
  }
156
166
  buf.setRow(row);
157
167
 
158
- this.curbuf_.setUnderline(underline);
159
- this.curbuf_.setItalics(italics);
160
- this.curbuf_.setTextColor(textColor);
168
+ buf.setUnderline(underline);
169
+ buf.setItalics(italics);
170
+ buf.setTextColor(textColor);
161
171
 
162
172
  // Clear the background color, since new row (PAC) should reset ALL styles.
163
- this.curbuf_.setBackgroundColor(shaka.cea.CeaUtils.DEFAULT_BG_COLOR);
173
+ buf.setBackgroundColor(shaka.cea.CeaUtils.DEFAULT_BG_COLOR);
164
174
  }
165
175
 
166
176
  /**
@@ -214,7 +224,7 @@ shaka.cea.Cea608DataChannel = class {
214
224
  /**
215
225
  * The Cea608DataChannel control methods implement all CC control operations.
216
226
  * @param {!shaka.cea.Cea608DataChannel.Cea608Packet} ccPacket
217
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
227
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
218
228
  * @private
219
229
  */
220
230
  controlMiscellaneous_(ccPacket) {
@@ -280,7 +290,7 @@ shaka.cea.Cea608DataChannel = class {
280
290
  * Any currently buffered line needs to be emitted, along
281
291
  * with a window scroll action.
282
292
  * @param {number} pts in seconds.
283
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
293
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
284
294
  * @private
285
295
  */
286
296
  controlCr_(pts) {
@@ -313,7 +323,7 @@ shaka.cea.Cea608DataChannel = class {
313
323
  * This means must force emit entire display buffer.
314
324
  * @param {number} scrollSize New scroll window size.
315
325
  * @param {number} pts
316
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
326
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
317
327
  * @private
318
328
  */
319
329
  controlRu_(scrollSize, pts) {
@@ -357,7 +367,7 @@ shaka.cea.Cea608DataChannel = class {
357
367
  * Mode check:
358
368
  * EDM affects all captioning modes (but not Text mode);
359
369
  * @param {number} pts
360
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
370
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
361
371
  * @private
362
372
  */
363
373
  controlEdm_(pts) {
@@ -404,7 +414,7 @@ shaka.cea.Cea608DataChannel = class {
404
414
  * This forces Pop-On mode, and swaps the displayed and nondisplayed memories.
405
415
  * @private
406
416
  * @param {number} pts
407
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
417
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
408
418
  */
409
419
  controlEoc_(pts) {
410
420
  let parsedClosedCaption = null;
@@ -502,7 +512,7 @@ shaka.cea.Cea608DataChannel = class {
502
512
  * Three types of control codes:
503
513
  * Preamble Address Codes, Mid-Row Codes, and Miscellaneous Control Codes.
504
514
  * @param {!shaka.cea.Cea608DataChannel.Cea608Packet} ccPacket
505
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
515
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
506
516
  */
507
517
  handleControlCode(ccPacket) {
508
518
  const b1 = ccPacket.ccData1;
@@ -8,7 +8,6 @@ goog.provide('shaka.cea.Cea608Memory');
8
8
 
9
9
  goog.require('shaka.cea.CeaUtils');
10
10
  goog.require('shaka.text.Cue');
11
- goog.requireType('shaka.cea.ICaptionDecoder');
12
11
 
13
12
 
14
13
  /**
@@ -77,12 +76,16 @@ shaka.cea.Cea608Memory = class {
77
76
  * Emits a closed caption based on the state of the buffer.
78
77
  * @param {number} startTime Start time of the cue.
79
78
  * @param {number} endTime End time of the cue.
80
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
79
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
81
80
  */
82
81
  forceEmit(startTime, endTime) {
83
82
  const stream = `CC${(this.fieldNum_<< 1) | this.channelNum_ +1}`;
84
83
  const topLevelCue = new shaka.text.Cue(
85
84
  startTime, endTime, /* payload= */ '');
85
+ topLevelCue.lineInterpretation =
86
+ shaka.text.Cue.lineInterpretation.PERCENTAGE;
87
+ const maxRows = shaka.cea.Cea608Memory.CC_ROWS + 1;
88
+ topLevelCue.line = this.row_ / maxRows * 100;
86
89
  return shaka.cea.CeaUtils.getParsedCaption(
87
90
  topLevelCue, stream, this.rows_, startTime, endTime);
88
91
  }
@@ -8,7 +8,6 @@ goog.provide('shaka.cea.Cea708Service');
8
8
 
9
9
  goog.require('shaka.cea.Cea708Window');
10
10
  goog.require('shaka.cea.DtvccPacket');
11
- goog.require('shaka.cea.ICaptionDecoder');
12
11
 
13
12
 
14
13
  /**
@@ -44,7 +43,7 @@ shaka.cea.Cea708Service = class {
44
43
  /**
45
44
  * Processes a CEA-708 control code.
46
45
  * @param {!shaka.cea.DtvccPacket} dtvccPacket
47
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
46
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
48
47
  * @throws {!shaka.util.Error}
49
48
  */
50
49
  handleCea708ControlCode(dtvccPacket) {
@@ -156,7 +155,7 @@ shaka.cea.Cea708Service = class {
156
155
  * Handles C0 group data.
157
156
  * @param {number} controlCode
158
157
  * @param {number} pts
159
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
158
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
160
159
  * @private
161
160
  */
162
161
  handleC0_(controlCode, pts) {
@@ -207,7 +206,7 @@ shaka.cea.Cea708Service = class {
207
206
  * @param {!shaka.cea.DtvccPacket} dtvccPacket
208
207
  * @param {number} captionCommand
209
208
  * @param {number} pts in seconds
210
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
209
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
211
210
  * @throws {!shaka.util.Error} a possible out-of-range buffer read.
212
211
  * @private
213
212
  */
@@ -318,7 +317,7 @@ shaka.cea.Cea708Service = class {
318
317
  /**
319
318
  * @param {number} windowsBitmap
320
319
  * @param {number} pts
321
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
320
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
322
321
  * @private
323
322
  */
324
323
  clearWindows_(windowsBitmap, pts) {
@@ -356,7 +355,7 @@ shaka.cea.Cea708Service = class {
356
355
  /**
357
356
  * @param {number} windowsBitmap
358
357
  * @param {number} pts
359
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
358
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
360
359
  * @private
361
360
  */
362
361
  hideWindows_(windowsBitmap, pts) {
@@ -377,7 +376,7 @@ shaka.cea.Cea708Service = class {
377
376
  /**
378
377
  * @param {number} windowsBitmap
379
378
  * @param {number} pts
380
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
379
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
381
380
  * @private
382
381
  */
383
382
  toggleWindows_(windowsBitmap, pts) {
@@ -402,7 +401,7 @@ shaka.cea.Cea708Service = class {
402
401
  /**
403
402
  * @param {number} windowsBitmap
404
403
  * @param {number} pts
405
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
404
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
406
405
  * @private
407
406
  */
408
407
  deleteWindows_(windowsBitmap, pts) {
@@ -424,7 +423,7 @@ shaka.cea.Cea708Service = class {
424
423
  * Emits anything currently present in any of the windows, and then
425
424
  * deletes all windows, cancels all delays, reinitializes the service.
426
425
  * @param {number} pts
427
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
426
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
428
427
  * @private
429
428
  */
430
429
  reset_(pts) {
@@ -8,7 +8,6 @@ goog.provide('shaka.cea.Cea708Window');
8
8
 
9
9
  goog.require('shaka.cea.CeaUtils');
10
10
  goog.require('shaka.cea.CeaUtils.StyledChar');
11
- goog.require('shaka.cea.ICaptionDecoder');
12
11
  goog.require('shaka.text.Cue');
13
12
  goog.require('shaka.util.Functional');
14
13
 
@@ -288,7 +287,7 @@ shaka.cea.Cea708Window = class {
288
287
  /**
289
288
  * @param {number} endTime
290
289
  * @param {number} serviceNumber Number of the service emitting this caption.
291
- * @return {?shaka.cea.ICaptionDecoder.ClosedCaption}
290
+ * @return {?shaka.extern.ICaptionDecoder.ClosedCaption}
292
291
  */
293
292
  forceEmit(endTime, serviceNumber) {
294
293
  const stream = `svc${serviceNumber}`;