shaka-player 4.3.10 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (316) hide show
  1. package/.github/workflows/release-please.yaml +7 -0
  2. package/AUTHORS +9 -0
  3. package/CHANGELOG.md +295 -200
  4. package/CONTRIBUTORS +8 -0
  5. package/LICENSE +32 -0
  6. package/README.md +63 -10
  7. package/demo/autoTemplate.txt +40 -5
  8. package/demo/close_button.js +11 -0
  9. package/demo/common/asset.js +13 -1
  10. package/demo/common/assets.js +53 -3
  11. package/demo/common/message_ids.js +25 -1
  12. package/demo/config.js +69 -10
  13. package/demo/customWarning.txt +2 -2
  14. package/demo/index.html +3 -1
  15. package/demo/locales/en.json +26 -2
  16. package/demo/locales/source.json +105 -9
  17. package/demo/main.js +52 -9
  18. package/demo/search.js +3 -1
  19. package/demo/service_worker.js +3 -0
  20. package/dist/controls.css +1 -1
  21. package/dist/controls.css.map +1 -1
  22. package/dist/demo.compiled.debug.js +124 -112
  23. package/dist/demo.compiled.debug.map +3 -3
  24. package/dist/demo.compiled.js +124 -112
  25. package/dist/demo.compiled.map +3 -3
  26. package/dist/deps.js +46 -28
  27. package/dist/locales.js +28 -28
  28. package/dist/receiver.compiled.debug.js +52 -46
  29. package/dist/receiver.compiled.debug.map +3 -3
  30. package/dist/receiver.compiled.js +52 -46
  31. package/dist/receiver.compiled.map +3 -3
  32. package/dist/shaka-player.compiled.d.ts +676 -391
  33. package/dist/shaka-player.compiled.debug.d.ts +676 -391
  34. package/dist/shaka-player.compiled.debug.externs.js +1188 -616
  35. package/dist/shaka-player.compiled.debug.js +1045 -700
  36. package/dist/shaka-player.compiled.debug.map +4 -4
  37. package/dist/shaka-player.compiled.externs.js +1188 -616
  38. package/dist/shaka-player.compiled.js +1094 -933
  39. package/dist/shaka-player.compiled.map +4 -4
  40. package/dist/shaka-player.ui.d.ts +677 -392
  41. package/dist/shaka-player.ui.debug.d.ts +677 -392
  42. package/dist/shaka-player.ui.debug.externs.js +1023 -451
  43. package/dist/shaka-player.ui.debug.js +1100 -739
  44. package/dist/shaka-player.ui.debug.map +4 -4
  45. package/dist/shaka-player.ui.externs.js +1023 -451
  46. package/dist/shaka-player.ui.js +1244 -1071
  47. package/dist/shaka-player.ui.map +4 -4
  48. package/docs/tutorials/ad_monetization.md +15 -1
  49. package/docs/tutorials/application-level-redirects.md +1 -1
  50. package/docs/tutorials/config.md +9 -5
  51. package/docs/tutorials/drm-config.md +61 -0
  52. package/docs/tutorials/fairplay.md +19 -4
  53. package/docs/tutorials/license-server-auth.md +4 -4
  54. package/docs/tutorials/license-wrapping.md +2 -2
  55. package/docs/tutorials/ui-customization.md +7 -3
  56. package/docs/tutorials/ui.md +7 -7
  57. package/docs/tutorials/upgrade.md +3 -0
  58. package/externs/ima.js +123 -2
  59. package/externs/isoboxer.js +217 -0
  60. package/externs/mediakeys.js +18 -0
  61. package/externs/mux.js +1 -105
  62. package/externs/pictureinpicture.js +48 -0
  63. package/externs/shaka/ads.js +61 -1
  64. package/externs/shaka/cea.js +110 -0
  65. package/externs/shaka/codecs.js +32 -0
  66. package/externs/shaka/manifest.js +101 -1
  67. package/externs/shaka/manifest_parser.js +0 -10
  68. package/externs/shaka/net.js +36 -7
  69. package/externs/shaka/offline.js +8 -1
  70. package/externs/shaka/player.js +220 -21
  71. package/externs/shaka/text.js +1 -382
  72. package/externs/shaka/transmuxer.js +59 -0
  73. package/karma.conf.js +13 -0
  74. package/lib/abr/simple_abr_manager.js +6 -3
  75. package/lib/ads/ad_manager.js +60 -2
  76. package/lib/ads/client_side_ad.js +86 -0
  77. package/lib/ads/client_side_ad_manager.js +79 -3
  78. package/lib/ads/server_side_ad.js +86 -0
  79. package/lib/ads/server_side_ad_manager.js +13 -0
  80. package/lib/cast/cast_utils.js +1 -0
  81. package/lib/cea/cea608_data_channel.js +24 -14
  82. package/lib/cea/cea608_memory.js +5 -2
  83. package/lib/cea/cea708_service.js +8 -9
  84. package/lib/cea/cea708_window.js +1 -2
  85. package/lib/cea/cea_decoder.js +23 -6
  86. package/lib/cea/cea_utils.js +25 -2
  87. package/lib/cea/dummy_caption_decoder.js +21 -0
  88. package/lib/cea/dummy_cea_parser.js +1 -3
  89. package/lib/cea/mp4_cea_parser.js +15 -10
  90. package/lib/cea/ts_cea_parser.js +69 -0
  91. package/lib/dash/content_protection.js +32 -2
  92. package/lib/dash/dash_parser.js +93 -31
  93. package/lib/dash/mpd_utils.js +6 -25
  94. package/lib/dash/segment_base.js +12 -14
  95. package/lib/dash/segment_list.js +10 -6
  96. package/lib/dash/segment_template.js +349 -32
  97. package/lib/dependencies/all.js +8 -0
  98. package/lib/hls/hls_classes.js +33 -8
  99. package/lib/hls/hls_parser.js +805 -191
  100. package/lib/hls/manifest_text_parser.js +4 -14
  101. package/lib/media/adaptation_set_criteria.js +43 -3
  102. package/lib/media/closed_caption_parser.js +74 -12
  103. package/lib/media/drm_engine.js +189 -49
  104. package/lib/media/gap_jumping_controller.js +1 -1
  105. package/lib/media/manifest_parser.js +34 -0
  106. package/lib/media/media_source_capabilities.js +10 -0
  107. package/lib/media/media_source_engine.js +475 -231
  108. package/lib/media/playhead.js +1 -1
  109. package/lib/media/presentation_timeline.js +62 -0
  110. package/lib/media/segment_index.js +50 -14
  111. package/lib/media/segment_prefetch.js +277 -0
  112. package/lib/media/segment_reference.js +70 -4
  113. package/lib/media/streaming_engine.js +258 -81
  114. package/lib/media/video_wrapper.js +15 -7
  115. package/lib/mss/content_protection.js +353 -0
  116. package/lib/mss/mss_parser.js +1081 -0
  117. package/lib/net/networking_engine.js +60 -10
  118. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  119. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  120. package/lib/offline/manifest_converter.js +6 -0
  121. package/lib/offline/storage.js +2 -4
  122. package/lib/player.js +309 -105
  123. package/lib/polyfill/media_capabilities.js +43 -3
  124. package/lib/polyfill/patchedmediakeys_apple.js +5 -0
  125. package/lib/polyfill/patchedmediakeys_nop.js +5 -0
  126. package/lib/polyfill/patchedmediakeys_webkit.js +5 -0
  127. package/lib/text/cue.js +208 -130
  128. package/lib/text/lrc_text_parser.js +2 -2
  129. package/lib/text/mp4_vtt_parser.js +2 -2
  130. package/lib/text/sbv_text_parser.js +1 -1
  131. package/lib/text/simple_text_displayer.js +2 -1
  132. package/lib/text/srt_text_parser.js +9 -1
  133. package/lib/text/ssa_text_parser.js +2 -2
  134. package/lib/text/text_engine.js +3 -21
  135. package/lib/text/text_utils.js +71 -20
  136. package/lib/text/ui_text_displayer.js +14 -14
  137. package/lib/text/vtt_text_parser.js +22 -14
  138. package/lib/transmuxer/aac_transmuxer.js +224 -0
  139. package/lib/transmuxer/ac3.js +142 -0
  140. package/lib/transmuxer/ac3_transmuxer.js +212 -0
  141. package/lib/transmuxer/adts.js +232 -0
  142. package/lib/transmuxer/ec3.js +103 -0
  143. package/lib/transmuxer/ec3_transmuxer.js +212 -0
  144. package/lib/transmuxer/h264.js +324 -0
  145. package/lib/transmuxer/mp3_transmuxer.js +204 -0
  146. package/lib/transmuxer/mpeg_audio.js +196 -0
  147. package/lib/transmuxer/mpeg_ts_transmuxer.js +182 -0
  148. package/lib/transmuxer/mss_transmuxer.js +389 -0
  149. package/lib/{media/transmuxer.js → transmuxer/muxjs_transmuxer.js} +34 -80
  150. package/lib/transmuxer/transmuxer_engine.js +161 -0
  151. package/lib/transmuxer/ts_transmuxer.js +738 -0
  152. package/lib/util/cmcd_manager.js +131 -71
  153. package/lib/util/error.js +62 -26
  154. package/lib/util/exp_golomb.js +220 -0
  155. package/lib/util/fairplay_utils.js +64 -13
  156. package/lib/util/id3_utils.js +56 -3
  157. package/lib/util/language_utils.js +11 -8
  158. package/lib/util/manifest_parser_utils.js +3 -0
  159. package/lib/util/mime_utils.js +44 -7
  160. package/lib/util/mp4_box_parsers.js +233 -5
  161. package/lib/util/mp4_generator.js +1381 -0
  162. package/lib/util/periods.js +40 -34
  163. package/lib/util/platform.js +17 -3
  164. package/lib/util/player_configuration.js +38 -1
  165. package/lib/util/stream_utils.js +138 -27
  166. package/lib/util/text_parser.js +1 -1
  167. package/lib/util/ts_parser.js +470 -47
  168. package/lib/util/xml_utils.js +16 -3
  169. package/maintained-branches.md +2 -2
  170. package/package.json +3 -1
  171. package/roadmap.md +21 -6
  172. package/shaka-player.uncompiled.js +18 -0
  173. package/test/abr/simple_abr_manager_unit.js +32 -4
  174. package/test/ads/ad_manager_unit.js +18 -2
  175. package/test/cast/cast_utils_unit.js +7 -2
  176. package/test/cea/cea608_memory_unit.js +24 -0
  177. package/test/cea/cea_decoder_unit.js +33 -0
  178. package/test/dash/dash_parser_content_protection_unit.js +93 -3
  179. package/test/dash/dash_parser_live_unit.js +56 -13
  180. package/test/dash/dash_parser_manifest_unit.js +70 -2
  181. package/test/dash/dash_parser_segment_base_unit.js +14 -9
  182. package/test/dash/dash_parser_segment_template_unit.js +286 -6
  183. package/test/demo/demo_unit.js +5 -1
  184. package/test/hls/hls_live_unit.js +188 -28
  185. package/test/hls/hls_parser_unit.js +250 -109
  186. package/test/hls/manifest_text_parser_unit.js +18 -13
  187. package/test/media/adaptation_set_criteria_unit.js +46 -14
  188. package/test/media/adaptation_set_unit.js +2 -0
  189. package/test/media/drm_engine_integration.js +11 -8
  190. package/test/media/drm_engine_unit.js +220 -7
  191. package/test/media/media_source_engine_integration.js +122 -38
  192. package/test/media/media_source_engine_unit.js +133 -153
  193. package/test/media/playhead_unit.js +3 -0
  194. package/test/media/presentation_timeline_unit.js +51 -0
  195. package/test/media/segment_index_unit.js +52 -0
  196. package/test/media/segment_prefetch_unit.js +243 -0
  197. package/test/media/streaming_engine_integration.js +9 -3
  198. package/test/media/streaming_engine_unit.js +440 -59
  199. package/test/mss/mss_parser_content_protection_unit.js +49 -0
  200. package/test/mss/mss_parser_unit.js +472 -0
  201. package/test/mss/mss_player_integration.js +123 -0
  202. package/test/offline/manifest_convert_unit.js +9 -0
  203. package/test/offline/storage_integration.js +6 -1
  204. package/test/player_unit.js +386 -133
  205. package/test/polyfill/media_capabilities_unit.js +18 -0
  206. package/test/test/assets/hls-raw-aac/fileSequence0.aac +0 -0
  207. package/test/test/assets/hls-raw-aac/fileSequence1.aac +0 -0
  208. package/test/test/assets/hls-raw-aac/fileSequence2.aac +0 -0
  209. package/test/test/assets/hls-raw-aac/fileSequence3.aac +0 -0
  210. package/test/test/assets/hls-raw-aac/manifest.m3u8 +4 -0
  211. package/test/test/assets/hls-raw-aac/stream.m4a.m3u8 +14 -0
  212. package/test/test/assets/hls-raw-ac3/fileSequence0.ac3 +0 -0
  213. package/test/test/assets/hls-raw-ac3/fileSequence1.ac3 +0 -0
  214. package/test/test/assets/hls-raw-ac3/fileSequence2.ac3 +0 -0
  215. package/test/test/assets/hls-raw-ac3/fileSequence3.ac3 +0 -0
  216. package/test/test/assets/hls-raw-ac3/fileSequence4.ac3 +0 -0
  217. package/test/test/assets/hls-raw-ac3/fileSequence5.ac3 +0 -0
  218. package/test/test/assets/hls-raw-ac3/fileSequence6.ac3 +0 -0
  219. package/test/test/assets/hls-raw-ac3/fileSequence7.ac3 +0 -0
  220. package/test/test/assets/hls-raw-ac3/prog_index.m3u8 +31 -0
  221. package/test/test/assets/hls-raw-ec3/fileSequence0.ec3 +0 -0
  222. package/test/test/assets/hls-raw-ec3/fileSequence1.ec3 +0 -0
  223. package/test/test/assets/hls-raw-ec3/fileSequence2.ec3 +0 -0
  224. package/test/test/assets/hls-raw-ec3/fileSequence3.ec3 +0 -0
  225. package/test/test/assets/hls-raw-ec3/fileSequence4.ec3 +0 -0
  226. package/test/test/assets/hls-raw-ec3/fileSequence5.ec3 +0 -0
  227. package/test/test/assets/hls-raw-ec3/fileSequence6.ec3 +0 -0
  228. package/test/test/assets/hls-raw-ec3/fileSequence7.ec3 +0 -0
  229. package/test/test/assets/hls-raw-ec3/prog_index.m3u8 +31 -0
  230. package/test/test/assets/hls-raw-mp3/chunklist_w905519204.m3u8 +13 -0
  231. package/test/test/assets/hls-raw-mp3/media_w905519204_0.mp3 +0 -0
  232. package/test/test/assets/hls-raw-mp3/media_w905519204_1.mp3 +0 -0
  233. package/test/test/assets/hls-raw-mp3/media_w905519204_2.mp3 +0 -0
  234. package/test/test/assets/hls-raw-mp3/media_w905519204_3.mp3 +0 -0
  235. package/test/test/assets/hls-raw-mp3/playlist.m3u8 +4 -0
  236. package/test/test/assets/hls-ts-aac/playlist.m3u8 +23 -0
  237. package/test/test/assets/hls-ts-aac/segment_0.ts +0 -0
  238. package/test/test/assets/hls-ts-aac/segment_1.ts +0 -0
  239. package/test/test/assets/hls-ts-aac/segment_2.ts +0 -0
  240. package/test/test/assets/hls-ts-aac/segment_3.ts +0 -0
  241. package/test/test/assets/hls-ts-aac/segment_4.ts +0 -0
  242. package/test/test/assets/hls-ts-aac/segment_5.ts +0 -0
  243. package/test/test/assets/hls-ts-aac/segment_6.ts +0 -0
  244. package/test/test/assets/hls-ts-aac/segment_7.ts +0 -0
  245. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0000.ts +0 -0
  246. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0001.ts +0 -0
  247. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0002.ts +0 -0
  248. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0003.ts +0 -0
  249. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0004.ts +0 -0
  250. package/test/test/assets/hls-ts-ac3/ChID_voices_6ch_640kbps_dd_sub_0005.ts +0 -0
  251. package/test/test/assets/hls-ts-ac3/prog_index.m3u8 +19 -0
  252. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0000.ts +0 -0
  253. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0001.ts +0 -0
  254. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0002.ts +0 -0
  255. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0003.ts +0 -0
  256. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0004.ts +0 -0
  257. package/test/test/assets/hls-ts-ec3/ChID_voices_6ch_256kbps_ddp_sub_0005.ts +0 -0
  258. package/test/test/assets/hls-ts-ec3/prog_index.m3u8 +19 -0
  259. package/test/test/assets/hls-ts-h264/fileSequence0.ts +0 -0
  260. package/test/test/assets/hls-ts-h264/fileSequence1.ts +0 -0
  261. package/test/test/assets/hls-ts-h264/fileSequence2.ts +0 -0
  262. package/test/test/assets/hls-ts-h264/fileSequence3.ts +0 -0
  263. package/test/test/assets/hls-ts-h264/fileSequence4.ts +0 -0
  264. package/test/test/assets/hls-ts-h264/fileSequence5.ts +0 -0
  265. package/test/test/assets/hls-ts-h264/prog_index.m3u8 +25 -0
  266. package/test/test/assets/hls-ts-mp3/manifest.m3u8 +13 -0
  267. package/test/test/assets/hls-ts-mp3/media_w239891843_0.ts +0 -0
  268. package/test/test/assets/hls-ts-mp3/media_w239891843_1.ts +0 -0
  269. package/test/test/assets/hls-ts-mp3/media_w239891843_2.ts +0 -0
  270. package/test/test/assets/hls-ts-mp3/media_w239891843_3.ts +0 -0
  271. package/test/test/assets/hls-ts-muxed-aac-h264/chunk.m3u8 +17 -0
  272. package/test/test/assets/hls-ts-muxed-aac-h264/n_0_0_0.ts +0 -0
  273. package/test/test/assets/hls-ts-muxed-aac-h264/n_1_0_0.ts +0 -0
  274. package/test/test/assets/hls-ts-muxed-aac-h264/n_2_0_0.ts +0 -0
  275. package/test/test/assets/hls-ts-muxed-aac-h264/n_3_0_0.ts +0 -0
  276. package/test/test/assets/hls-ts-muxed-aac-h264/n_4_0_0.ts +0 -0
  277. package/test/test/assets/hls-ts-muxed-aac-h264/n_5_0_0.ts +0 -0
  278. package/test/test/assets/hls-ts-muxed-aac-h264/playlist.m3u8 +4 -0
  279. package/test/test/boot.js +7 -2
  280. package/test/test/util/fake_ad.js +99 -0
  281. package/test/test/util/fake_ad_manager.js +7 -1
  282. package/test/test/util/fake_networking_engine.js +41 -14
  283. package/test/test/util/fake_segment_prefetch.js +81 -0
  284. package/test/test/util/manifest_generator.js +19 -5
  285. package/test/test/util/mss_parser_util.js +115 -0
  286. package/test/test/util/offline_utils.js +1 -0
  287. package/test/test/util/simple_fakes.js +12 -3
  288. package/test/test/util/streaming_engine_util.js +14 -4
  289. package/test/test/util/ttml_utils.js +2 -2
  290. package/test/text/cue_integration.js +1 -1
  291. package/test/text/srt_text_parser_unit.js +78 -0
  292. package/test/text/text_engine_unit.js +17 -8
  293. package/test/text/ui_text_displayer_unit.js +4 -4
  294. package/test/text/vtt_text_parser_unit.js +59 -40
  295. package/test/text/web_vtt_generator_unit.js +9 -3
  296. package/test/{media/transmuxer_integration.js → transmuxer/muxjs_transmuxer_integration.js} +30 -33
  297. package/test/transmuxer/transmuxer_engine_integration.js +60 -0
  298. package/test/transmuxer/transmuxer_integration.js +296 -0
  299. package/test/util/cmcd_manager_unit.js +162 -13
  300. package/test/util/language_utils_unit.js +9 -2
  301. package/test/util/mp4_box_parsers_unit.js +39 -4
  302. package/test/util/periods_unit.js +34 -26
  303. package/test/util/stream_utils_unit.js +60 -107
  304. package/ui/controls.js +19 -1
  305. package/ui/controls.less +1 -0
  306. package/ui/externs/ui.js +11 -1
  307. package/ui/language_utils.js +15 -0
  308. package/ui/less/thumbnails.less +26 -0
  309. package/ui/locales/oc.json +42 -0
  310. package/ui/pip_button.js +83 -2
  311. package/ui/range_element.js +15 -0
  312. package/ui/resolution_selection.js +9 -2
  313. package/ui/seek_bar.js +223 -0
  314. package/ui/ui.js +5 -0
  315. package/lib/cea/i_caption_decoder.js +0 -51
  316. package/lib/cea/i_cea_parser.js +0 -68
@@ -8,7 +8,6 @@ describe('VttTextParser', () => {
8
8
  const Cue = shaka.text.Cue;
9
9
  const CueRegion = shaka.text.CueRegion;
10
10
  const originalLogWarning = shaka.log.warning;
11
- const anyString = jasmine.any(String);
12
11
 
13
12
  /** @type {!jasmine.Spy} */
14
13
  let logWarningSpy;
@@ -161,38 +160,30 @@ describe('VttTextParser', () => {
161
160
  });
162
161
 
163
162
  it('rejects invalid time values', () => {
164
- errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
163
+ verifyHelper([],
165
164
  'WEBVTT\n\n00.020 --> 0:00.040\nTest',
166
- {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0},
167
- anyString);
168
- errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
165
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
166
+ verifyHelper([],
169
167
  'WEBVTT\n\n0:00.020 --> 0:00.040\nTest',
170
- {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0},
171
- anyString);
172
- errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
168
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
169
+ verifyHelper([],
173
170
  'WEBVTT\n\n00:00.20 --> 0:00.040\nTest',
174
- {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0},
175
- anyString);
176
- errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
171
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
172
+ verifyHelper([],
177
173
  'WEBVTT\n\n00:100.20 --> 0:00.040\nTest',
178
- {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0},
179
- anyString);
180
- errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
174
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
175
+ verifyHelper([],
181
176
  'WEBVTT\n\n00:00.020 --> 0:00.040\nTest',
182
- {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0},
183
- anyString);
184
- errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
177
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
178
+ verifyHelper([],
185
179
  'WEBVTT\n\n00:00:00:00.020 --> 0:00.040\nTest',
186
- {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0},
187
- anyString);
188
- errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
180
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
181
+ verifyHelper([],
189
182
  'WEBVTT\n\n00:61.020 --> 0:00.040\nTest',
190
- {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0},
191
- anyString);
192
- errorHelper(shaka.util.Error.Code.INVALID_TEXT_CUE,
183
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
184
+ verifyHelper([],
193
185
  'WEBVTT\n\n61:00.020 --> 0:00.040\nTest',
194
- {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0},
195
- anyString);
186
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
196
187
  });
197
188
 
198
189
  it('supports vertical setting', () => {
@@ -934,7 +925,7 @@ describe('VttTextParser', () => {
934
925
  startTime: 20,
935
926
  endTime: 40,
936
927
  payload: 'Test',
937
- color: '#FF0',
928
+ color: 'yellow',
938
929
  },
939
930
  ],
940
931
  },
@@ -946,8 +937,8 @@ describe('VttTextParser', () => {
946
937
  startTime: 40,
947
938
  endTime: 50,
948
939
  payload: 'Test2',
949
- color: '#0FF',
950
- backgroundColor: '#00F',
940
+ color: 'cyan',
941
+ backgroundColor: 'blue',
951
942
  },
952
943
  ],
953
944
  },
@@ -959,8 +950,8 @@ describe('VttTextParser', () => {
959
950
  startTime: 50,
960
951
  endTime: 60,
961
952
  payload: 'Test 3',
962
- color: '#F0F',
963
- backgroundColor: '#000',
953
+ color: 'magenta',
954
+ backgroundColor: 'black',
964
955
  },
965
956
  ],
966
957
  },
@@ -978,7 +969,7 @@ describe('VttTextParser', () => {
978
969
  startTime: 60,
979
970
  endTime: 70,
980
971
  payload: 'Test4.1',
981
- color: '#FF0',
972
+ color: 'yellow',
982
973
  },
983
974
  {
984
975
  startTime: 60,
@@ -995,7 +986,7 @@ describe('VttTextParser', () => {
995
986
  startTime: 60,
996
987
  endTime: 70,
997
988
  payload: 'Test4.2',
998
- color: '#00F',
989
+ color: 'blue',
999
990
  },
1000
991
  ],
1001
992
  },
@@ -1008,13 +999,13 @@ describe('VttTextParser', () => {
1008
999
  startTime: 70,
1009
1000
  endTime: 80,
1010
1001
  payload: 'Test5.1',
1011
- color: '#F00',
1002
+ color: 'red',
1012
1003
  },
1013
1004
  {
1014
1005
  startTime: 70,
1015
1006
  endTime: 80,
1016
1007
  payload: 'Test5.2',
1017
- color: '#0F0',
1008
+ color: 'lime',
1018
1009
  },
1019
1010
  ],
1020
1011
  },
@@ -1039,7 +1030,7 @@ describe('VttTextParser', () => {
1039
1030
  startTime: 100,
1040
1031
  endTime: 110,
1041
1032
  payload: 'forward slash 1/2 in text',
1042
- color: '#0F0',
1033
+ color: 'lime',
1043
1034
  },
1044
1035
  ],
1045
1036
  },
@@ -1156,8 +1147,8 @@ describe('VttTextParser', () => {
1156
1147
  startTime: 10,
1157
1148
  endTime: 20,
1158
1149
  payload: 'Example 1',
1159
- color: '#F00',
1160
- backgroundColor: '#FF0',
1150
+ color: 'red',
1151
+ backgroundColor: 'yellow',
1161
1152
  fontSize: '10px',
1162
1153
  },
1163
1154
  ],
@@ -1165,7 +1156,7 @@ describe('VttTextParser', () => {
1165
1156
  ],
1166
1157
  'WEBVTT\n\n' +
1167
1158
  'STYLE\n' +
1168
- '::cue(.bg_blue) { font-size: 10px; background-color: #FF0 }\n\n' +
1159
+ '::cue(.bg_blue) { font-size: 10px; background-color: yellow }\n\n' +
1169
1160
  '00:00:10.000 --> 00:00:20.000\n' +
1170
1161
  '<c.red.bg_blue>Example 1</c>\n\n',
1171
1162
  {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
@@ -1183,7 +1174,7 @@ describe('VttTextParser', () => {
1183
1174
  startTime: 10,
1184
1175
  endTime: 20,
1185
1176
  payload: '1',
1186
- color: '#F0F',
1177
+ color: 'magenta',
1187
1178
  },
1188
1179
  {
1189
1180
  startTime: 10,
@@ -1195,7 +1186,7 @@ describe('VttTextParser', () => {
1195
1186
  startTime: 10,
1196
1187
  endTime: 20,
1197
1188
  payload: '2',
1198
- color: '#F0F',
1189
+ color: 'magenta',
1199
1190
  fontStyle: Cue.fontStyle.ITALIC,
1200
1191
  },
1201
1192
  ],
@@ -1223,6 +1214,34 @@ describe('VttTextParser', () => {
1223
1214
  {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
1224
1215
  });
1225
1216
 
1217
+ it('supports an extra newline inside the cue body', () => {
1218
+ verifyHelper(
1219
+ [
1220
+ {startTime: 20, endTime: 40, payload: 'Test'},
1221
+ {startTime: 40, endTime: 50, payload: 'Test2'},
1222
+ ],
1223
+ 'WEBVTT\n\n' +
1224
+ '00:00:20.000 --> 00:00:40.000\n' +
1225
+ 'Test\n\nExtra line\n\n' +
1226
+ '00:00:40.000 --> 00:00:50.000\n' +
1227
+ 'Test2',
1228
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
1229
+ });
1230
+
1231
+ it('supports an extra newline before the cue body', () => {
1232
+ verifyHelper(
1233
+ [
1234
+ {startTime: 20, endTime: 40, payload: ''},
1235
+ {startTime: 40, endTime: 50, payload: 'Test2'},
1236
+ ],
1237
+ 'WEBVTT\n\n' +
1238
+ '00:00:20.000 --> 00:00:40.000\n' +
1239
+ '\nTest\n\n' +
1240
+ '00:00:40.000 --> 00:00:50.000\n' +
1241
+ 'Test2',
1242
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
1243
+ });
1244
+
1226
1245
  /**
1227
1246
  * @param {!Array} cues
1228
1247
  * @param {string} text
@@ -13,11 +13,17 @@ describe('WebVttGenerator', () => {
13
13
  const shakaCue1 = new shaka.text.Cue(20, 40, 'Test');
14
14
  shakaCue1.textAlign = shaka.text.Cue.textAlign.LEFT;
15
15
  shakaCue1.writingMode = shaka.text.Cue.writingMode.VERTICAL_LEFT_TO_RIGHT;
16
+ shakaCue1.color = 'red';
17
+ shakaCue1.backgroundColor = '#f0f';
16
18
  const shakaCue2 = new shaka.text.Cue(40, 50, 'Test2');
17
19
  shakaCue2.textAlign = shaka.text.Cue.textAlign.RIGHT;
18
20
  shakaCue2.writingMode = shaka.text.Cue.writingMode.VERTICAL_RIGHT_TO_LEFT;
21
+ shakaCue2.color = '#0f0';
22
+ shakaCue2.backgroundColor = 'lime';
19
23
  const shakaCue3 = new shaka.text.Cue(50, 51, 'Test3');
20
24
  shakaCue3.textAlign = shaka.text.Cue.textAlign.CENTER;
25
+ shakaCue3.color = '#ffff00';
26
+ shakaCue3.backgroundColor = '#00ffff';
21
27
  const shakaCue4 = new shaka.text.Cue(52, 53, 'Test4');
22
28
  shakaCue4.textAlign = shaka.text.Cue.textAlign.START;
23
29
  const shakaCue5 = new shaka.text.Cue(53, 54, 'Test5');
@@ -36,11 +42,11 @@ describe('WebVttGenerator', () => {
36
42
  adCuePoints,
37
43
  'WEBVTT\n\n' +
38
44
  '00:00:20.000 --> 00:00:40.000 align:left vertical:lr\n' +
39
- 'Test\n\n' +
45
+ '<c.red.bg_magenta>Test</c>\n\n' +
40
46
  '00:00:40.000 --> 00:00:50.000 align:right vertical:rl\n' +
41
- 'Test2\n\n' +
47
+ '<c.lime.bg_lime>Test2</c>\n\n' +
42
48
  '00:00:50.000 --> 00:00:51.000 align:middle\n' +
43
- 'Test3\n\n' +
49
+ '<c.yellow.bg_cyan>Test3</c>\n\n' +
44
50
  '00:00:52.000 --> 00:00:53.000 align:start\n' +
45
51
  'Test4\n\n' +
46
52
  '00:00:53.000 --> 00:00:54.000 align:end\n' +
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- describe('Transmuxer', () => {
7
+ describe('MuxjsTransmuxer', () => {
8
8
  const ContentType = shaka.util.ManifestParserUtils.ContentType;
9
9
 
10
10
  const videoSegmentUri = '/base/test/test/assets/video.ts';
@@ -12,9 +12,6 @@ describe('Transmuxer', () => {
12
12
  const mp4MimeType = 'video/mp4; codecs="avc1.42E01E"';
13
13
  const transportStreamVideoMimeType = 'video/mp2t; codecs="avc1.42E01E"';
14
14
  const transportStreamAudioMimeType = 'video/mp2t; codecs="mp4a.40.2"';
15
- const aacAudioMimeType = 'audio/aac';
16
-
17
- const transmuxerMimeType = 'fake/mimeType';
18
15
 
19
16
  /** @type {!ArrayBuffer} */
20
17
  let videoSegment;
@@ -23,9 +20,12 @@ describe('Transmuxer', () => {
23
20
  /** @type {!ArrayBuffer} */
24
21
  let emptySegment;
25
22
 
26
- /** @type {!shaka.media.Transmuxer} */
23
+ /** @type {?shaka.transmuxer.MuxjsTransmuxer} */
27
24
  let transmuxer;
28
25
 
26
+ function useTsTransmuxer() {
27
+ transmuxer = new shaka.transmuxer.MuxjsTransmuxer('video/mp2t');
28
+ }
29
29
 
30
30
  beforeAll(async () => {
31
31
  const responses = await Promise.all([
@@ -38,7 +38,7 @@ describe('Transmuxer', () => {
38
38
  });
39
39
 
40
40
  beforeEach(() => {
41
- transmuxer = new shaka.media.Transmuxer(transmuxerMimeType);
41
+ transmuxer = null;
42
42
  });
43
43
 
44
44
  afterEach(async () => {
@@ -46,42 +46,41 @@ describe('Transmuxer', () => {
46
46
  });
47
47
 
48
48
  describe('isSupported', () => {
49
- const Transmuxer = shaka.media.Transmuxer;
50
-
51
49
  it('returns whether the content type is supported', () => {
52
- expect(Transmuxer.isSupported(
50
+ useTsTransmuxer();
51
+ expect(transmuxer.isSupported(
53
52
  mp4MimeType, ContentType.VIDEO)).toBe(false);
54
- expect(Transmuxer.isSupported(
53
+ expect(transmuxer.isSupported(
55
54
  transportStreamVideoMimeType, ContentType.VIDEO)).toBe(true);
56
55
  });
57
56
 
58
57
  // Issue #1991
59
58
  it('handles upper-case MIME types', () => {
59
+ useTsTransmuxer();
60
60
  const mimeType = transportStreamVideoMimeType.replace('mp2t', 'MP2T');
61
- expect(Transmuxer.isSupported(mimeType, ContentType.VIDEO)).toBe(true);
61
+ expect(transmuxer.isSupported(
62
+ mimeType, ContentType.VIDEO)).toBe(true);
62
63
  });
63
64
  });
64
65
 
65
66
  describe('convertCodecs', () => {
66
67
  const convertCodecs =
67
- (type, codecs) => shaka.media.Transmuxer.convertCodecs(type, codecs);
68
+ (type, codecs) => transmuxer.convertCodecs(type, codecs);
68
69
 
69
- it('returns converted codecs', () => {
70
+ it('returns converted codecs for TS', () => {
71
+ useTsTransmuxer();
70
72
  const convertedVideoCodecs =
71
73
  convertCodecs(ContentType.VIDEO, transportStreamVideoMimeType);
72
74
  const convertedAudioCodecs =
73
75
  convertCodecs(ContentType.AUDIO, transportStreamAudioMimeType);
74
- const convertedAacCodecs =
75
- convertCodecs(ContentType.AUDIO, aacAudioMimeType);
76
76
  const expectedVideoCodecs = 'video/mp4; codecs="avc1.42E01E"';
77
77
  const expectedAudioCodecs = 'audio/mp4; codecs="mp4a.40.2"';
78
- const expectedAacCodecs = 'audio/mp4; codecs="mp4a.40.2"';
79
78
  expect(convertedVideoCodecs).toBe(expectedVideoCodecs);
80
79
  expect(convertedAudioCodecs).toBe(expectedAudioCodecs);
81
- expect(convertedAacCodecs).toBe(expectedAacCodecs);
82
80
  });
83
81
 
84
82
  it('converts legacy avc1 codec strings', () => {
83
+ useTsTransmuxer();
85
84
  expect(
86
85
  convertCodecs(
87
86
  ContentType.VIDEO, 'video/mp2t; codecs="avc1.100.42"'))
@@ -96,62 +95,60 @@ describe('Transmuxer', () => {
96
95
 
97
96
  // Issue #1991
98
97
  it('handles upper-case MIME types', () => {
98
+ useTsTransmuxer();
99
99
  expect(convertCodecs(
100
100
  ContentType.VIDEO, 'video/MP2T; codecs="avc1.420001"'))
101
101
  .toBe('video/mp4; codecs="avc1.420001"');
102
102
  });
103
103
  });
104
104
 
105
- it('getOrginalMimeType returns the correct mimeType', () => {
106
- expect(transmuxer.getOrginalMimeType()).toBe(transmuxerMimeType);
107
- });
108
-
109
105
  describe('transmuxing', () => {
110
106
  it('transmux video from TS to MP4', async () => {
107
+ useTsTransmuxer();
111
108
  let sawMDAT = false;
112
109
 
113
110
  const transmuxedData = await transmuxer.transmux(videoSegment);
114
- expect(transmuxedData.data).toEqual(jasmine.any(Uint8Array));
115
- expect(transmuxedData.data.length).toBeGreaterThan(0);
116
- expect(transmuxedData.captions).toEqual(jasmine.any(Array));
111
+ expect(transmuxedData).toEqual(jasmine.any(Uint8Array));
112
+ expect(transmuxedData.length).toBeGreaterThan(0);
117
113
  new shaka.util.Mp4Parser()
118
114
  .box('mdat', shaka.util.Mp4Parser.allData((data) => {
119
115
  sawMDAT = true;
120
116
  expect(data.byteLength).toBeGreaterThan(0);
121
117
  }))
122
- .parse(transmuxedData.data);
118
+ .parse(transmuxedData);
123
119
  expect(sawMDAT).toBeTruthy();
124
120
  });
125
121
 
126
122
  it('transmux audio from TS to MP4', async () => {
123
+ useTsTransmuxer();
127
124
  let sawMDAT = false;
128
125
  const transmuxedData = await transmuxer.transmux(audioSegment);
129
- expect(transmuxedData.data).toEqual(jasmine.any(Uint8Array));
130
- expect(transmuxedData.data.length).toBeGreaterThan(0);
131
- expect(transmuxedData.captions).toEqual(jasmine.any(Array));
126
+ expect(transmuxedData).toEqual(jasmine.any(Uint8Array));
127
+ expect(transmuxedData.length).toBeGreaterThan(0);
132
128
  new shaka.util.Mp4Parser()
133
129
  .box('mdat', shaka.util.Mp4Parser.allData((data) => {
134
130
  sawMDAT = true;
135
131
  expect(data.byteLength).toBeGreaterThan(0);
136
132
  }))
137
- .parse(transmuxedData.data);
133
+ .parse(transmuxedData);
138
134
  expect(sawMDAT).toBeTruthy();
139
135
  });
140
136
 
141
137
  it('transmux empty video from TS to MP4', async () => {
138
+ useTsTransmuxer();
142
139
  let sawMDAT = false;
143
140
  const transmuxedData = await transmuxer.transmux(emptySegment);
144
- expect(transmuxedData.data).toEqual(jasmine.any(Uint8Array));
145
- expect(transmuxedData.captions).toEqual([]);
141
+ expect(transmuxedData).toEqual(jasmine.any(Uint8Array));
146
142
  new shaka.util.Mp4Parser()
147
143
  .box('mdat', shaka.util.Mp4Parser.allData((data) => {
148
144
  sawMDAT = true;
149
145
  }))
150
- .parse(transmuxedData.data);
146
+ .parse(transmuxedData);
151
147
  expect(sawMDAT).toBeFalsy();
152
148
  });
153
149
 
154
150
  it('passes through true timestamps', async () => {
151
+ useTsTransmuxer();
155
152
  let parsed = false;
156
153
  const expectedMp4Timestamp = 5166000; // in timescale units
157
154
  let mp4Timestamp;
@@ -171,7 +168,7 @@ describe('Transmuxer', () => {
171
168
  mp4Timestamp = parsedTFDTBox.baseMediaDecodeTime;
172
169
  parsed = true;
173
170
  })
174
- .parse(transmuxedData.data);
171
+ .parse(transmuxedData);
175
172
 
176
173
  expect(parsed).toBe(true);
177
174
  expect(mp4Timestamp).toBe(expectedMp4Timestamp);
@@ -0,0 +1,60 @@
1
+ /*! @license
2
+ * Shaka Player
3
+ * Copyright 2016 Google LLC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ describe('TransmuxerEngine', () => {
8
+ const ContentType = shaka.util.ManifestParserUtils.ContentType;
9
+
10
+ const mp4MimeType = 'video/mp4; codecs="avc1.42E01E"';
11
+ const transportStreamVideoMimeType = 'video/mp2t; codecs="avc1.42E01E"';
12
+ const transportStreamAudioMimeType = 'video/mp2t; codecs="mp4a.40.2"';
13
+ const aacAudioMimeType = 'audio/aac';
14
+
15
+ describe('isSupported', () => {
16
+ const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;
17
+
18
+ it('returns whether the content type is supported', () => {
19
+ expect(TransmuxerEngine.isSupported(
20
+ mp4MimeType, ContentType.VIDEO)).toBe(false);
21
+ expect(TransmuxerEngine.isSupported(
22
+ transportStreamVideoMimeType, ContentType.VIDEO)).toBe(true);
23
+ });
24
+
25
+ // Issue #1991
26
+ it('handles upper-case MIME types', () => {
27
+ const mimeType = transportStreamVideoMimeType.replace('mp2t', 'MP2T');
28
+ expect(TransmuxerEngine.isSupported(
29
+ mimeType, ContentType.VIDEO)).toBe(true);
30
+ });
31
+ });
32
+
33
+ describe('convertCodecs', () => {
34
+ const TransmuxerEngine = shaka.transmuxer.TransmuxerEngine;
35
+ const convertCodecs =
36
+ (type, codecs) => TransmuxerEngine.convertCodecs(type, codecs);
37
+
38
+ it('returns converted codecs', () => {
39
+ const convertedVideoCodecs =
40
+ convertCodecs(ContentType.VIDEO, transportStreamVideoMimeType);
41
+ const convertedAudioCodecs =
42
+ convertCodecs(ContentType.AUDIO, transportStreamAudioMimeType);
43
+ const convertedAacCodecs =
44
+ convertCodecs(ContentType.AUDIO, aacAudioMimeType);
45
+ const expectedVideoCodecs = 'video/mp4; codecs="avc1.42E01E"';
46
+ const expectedAudioCodecs = 'audio/mp4; codecs="mp4a.40.2"';
47
+ const expectedAacCodecs = 'audio/mp4; codecs="mp4a.40.2"';
48
+ expect(convertedVideoCodecs).toBe(expectedVideoCodecs);
49
+ expect(convertedAudioCodecs).toBe(expectedAudioCodecs);
50
+ expect(convertedAacCodecs).toBe(expectedAacCodecs);
51
+ });
52
+
53
+ // Issue #1991
54
+ it('handles upper-case MIME types', () => {
55
+ expect(convertCodecs(
56
+ ContentType.VIDEO, 'video/MP2T; codecs="avc1.420001"'))
57
+ .toBe('video/mp4; codecs="avc1.420001"');
58
+ });
59
+ });
60
+ });