shaka-player 3.3.4 → 4.0.1

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 (201) hide show
  1. package/.github/config.yml +1 -0
  2. package/.github/workflows/build-and-test.yaml +0 -1
  3. package/.github/workflows/demo-version-index.yaml +8 -0
  4. package/.github/workflows/release-please.yaml +19 -3
  5. package/.github/workflows/selenium-lab-tests.yaml +0 -1
  6. package/.github/workflows/sync-labels.yaml +33 -0
  7. package/.github/workflows/update-issues.yaml +29 -0
  8. package/.github/workflows/validate-pr-title.yaml +35 -0
  9. package/AUTHORS +1 -0
  10. package/CHANGELOG.md +209 -28
  11. package/CONTRIBUTORS +1 -0
  12. package/README.md +10 -7
  13. package/app-engine/demo-version-index/README.md +3 -3
  14. package/app-engine/demo-version-index/app.yaml +27 -1
  15. package/app-engine/demo-version-index/generate.py +164 -0
  16. package/app-engine/demo-version-index/main.py +4 -155
  17. package/app-engine/demo-version-index/requirements.txt +0 -1
  18. package/build/README.md +2 -2
  19. package/build/compiler.py +1 -1
  20. package/build/generateTsDefs.py +0 -2
  21. package/build/misspellings.txt +1 -0
  22. package/build/shaka-lab.yaml +0 -2
  23. package/build/test.py +7 -1
  24. package/build/types/core +0 -1
  25. package/build/types/polyfill +0 -3
  26. package/demo/common/asset.js +17 -1
  27. package/demo/common/assets.js +29 -0
  28. package/demo/common/message_ids.js +6 -3
  29. package/demo/config.js +10 -11
  30. package/demo/custom.js +39 -0
  31. package/demo/demo_utils.js +0 -1
  32. package/demo/locales/en.json +6 -3
  33. package/demo/locales/source.json +22 -10
  34. package/demo/main.js +9 -6
  35. package/demo/search.js +2 -1
  36. package/dist/controls.css +1 -1
  37. package/dist/demo.compiled.debug.js +71 -64
  38. package/dist/demo.compiled.debug.map +3 -3
  39. package/dist/demo.compiled.js +71 -64
  40. package/dist/demo.compiled.map +3 -3
  41. package/dist/demo.css +1 -1
  42. package/dist/demo.css.map +1 -1
  43. package/dist/deps.js +16 -20
  44. package/dist/locales.js +33 -31
  45. package/dist/receiver.compiled.debug.js +32 -28
  46. package/dist/receiver.compiled.debug.map +3 -3
  47. package/dist/receiver.compiled.js +32 -28
  48. package/dist/receiver.compiled.map +3 -3
  49. package/dist/shaka-player.compiled.d.ts +78 -82
  50. package/dist/shaka-player.compiled.debug.d.ts +78 -82
  51. package/dist/shaka-player.compiled.debug.externs.js +127 -126
  52. package/dist/shaka-player.compiled.debug.js +471 -523
  53. package/dist/shaka-player.compiled.debug.map +4 -4
  54. package/dist/shaka-player.compiled.externs.js +127 -126
  55. package/dist/shaka-player.compiled.js +844 -858
  56. package/dist/shaka-player.compiled.map +4 -4
  57. package/dist/shaka-player.ui.d.ts +80 -82
  58. package/dist/shaka-player.ui.debug.d.ts +80 -82
  59. package/dist/shaka-player.ui.debug.externs.js +135 -126
  60. package/dist/shaka-player.ui.debug.js +531 -581
  61. package/dist/shaka-player.ui.debug.map +4 -4
  62. package/dist/shaka-player.ui.externs.js +135 -126
  63. package/dist/shaka-player.ui.js +991 -1001
  64. package/dist/shaka-player.ui.map +4 -4
  65. package/docs/tutorials/config.md +0 -2
  66. package/docs/tutorials/drm-config.md +5 -0
  67. package/docs/tutorials/fairplay.md +7 -22
  68. package/docs/tutorials/faq.md +0 -11
  69. package/docs/tutorials/index.json +2 -8
  70. package/docs/tutorials/plugins.md +1 -3
  71. package/docs/tutorials/upgrade.md +85 -11
  72. package/externs/polyfill.js +15 -0
  73. package/externs/shaka/manifest.js +5 -1
  74. package/externs/shaka/net.js +12 -0
  75. package/externs/shaka/offline.js +5 -1
  76. package/externs/shaka/player.js +39 -21
  77. package/externs/shaka/text.js +12 -12
  78. package/externs/sourcebuffer.js +15 -0
  79. package/karma.conf.js +4 -0
  80. package/lib/ads/client_side_ad.js +13 -2
  81. package/lib/ads/client_side_ad_manager.js +22 -4
  82. package/lib/cast/cast_utils.js +0 -1
  83. package/lib/dash/content_protection.js +85 -5
  84. package/lib/dash/dash_parser.js +3 -3
  85. package/lib/hls/hls_parser.js +391 -747
  86. package/lib/hls/manifest_text_parser.js +2 -3
  87. package/lib/media/drm_engine.js +102 -37
  88. package/lib/media/gap_jumping_controller.js +10 -45
  89. package/lib/media/media_source_engine.js +157 -31
  90. package/lib/media/playhead.js +2 -5
  91. package/lib/media/presentation_timeline.js +1 -2
  92. package/lib/media/segment_index.js +13 -46
  93. package/lib/media/segment_reference.js +47 -1
  94. package/lib/media/streaming_engine.js +28 -11
  95. package/lib/media/time_ranges_utils.js +4 -9
  96. package/lib/net/networking_engine.js +3 -0
  97. package/lib/offline/indexeddb/storage_mechanism.js +4 -2
  98. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  99. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  100. package/lib/offline/manifest_converter.js +1 -0
  101. package/lib/offline/storage.js +100 -132
  102. package/lib/player.js +181 -307
  103. package/lib/polyfill/media_capabilities.js +12 -6
  104. package/lib/polyfill/mediasource.js +0 -28
  105. package/lib/polyfill/patchedmediakeys_nop.js +2 -0
  106. package/lib/polyfill/patchedmediakeys_webkit.js +2 -0
  107. package/lib/text/cue.js +0 -6
  108. package/lib/text/lrc_text_parser.js +8 -0
  109. package/lib/text/mp4_ttml_parser.js +8 -0
  110. package/lib/text/mp4_vtt_parser.js +8 -0
  111. package/lib/text/sbv_text_parser.js +8 -0
  112. package/lib/text/simple_text_displayer.js +1 -7
  113. package/lib/text/srt_text_parser.js +8 -0
  114. package/lib/text/ssa_text_parser.js +8 -0
  115. package/lib/text/text_engine.js +19 -3
  116. package/lib/text/ttml_text_parser.js +8 -0
  117. package/lib/text/ui_text_displayer.js +1 -7
  118. package/lib/text/vtt_text_parser.js +27 -5
  119. package/lib/text/web_vtt_generator.js +1 -7
  120. package/lib/util/config_utils.js +25 -0
  121. package/lib/util/error.js +16 -13
  122. package/lib/util/fairplay_utils.js +109 -0
  123. package/lib/util/functional.js +0 -42
  124. package/lib/util/manifest_parser_utils.js +1 -1
  125. package/lib/util/mime_utils.js +50 -1
  126. package/lib/util/periods.js +5 -4
  127. package/lib/util/platform.js +45 -0
  128. package/lib/util/player_configuration.js +26 -20
  129. package/lib/util/pssh.js +23 -4
  130. package/lib/util/stream_utils.js +96 -24
  131. package/lib/util/uint8array_utils.js +0 -16
  132. package/lib/util/xml_utils.js +1 -1
  133. package/package.json +4 -1
  134. package/roadmap.md +19 -19
  135. package/shaka-player.uncompiled.js +0 -3
  136. package/test/cast/cast_utils_unit.js +1 -0
  137. package/test/dash/dash_parser_content_protection_unit.js +44 -0
  138. package/test/dash/dash_parser_manifest_unit.js +0 -24
  139. package/test/dash/dash_parser_segment_template_unit.js +3 -4
  140. package/test/demo/demo_unit.js +2 -1
  141. package/test/hls/hls_live_unit.js +121 -220
  142. package/test/hls/hls_parser_unit.js +515 -432
  143. package/test/hls/manifest_text_parser_unit.js +19 -0
  144. package/test/media/drm_engine_unit.js +86 -120
  145. package/test/media/media_source_engine_integration.js +26 -3
  146. package/test/media/media_source_engine_unit.js +7 -6
  147. package/test/media/playhead_unit.js +27 -191
  148. package/test/media/segment_index_unit.js +15 -25
  149. package/test/media/streaming_engine_integration.js +4 -39
  150. package/test/media/streaming_engine_unit.js +3 -2
  151. package/test/media/time_ranges_utils_unit.js +0 -5
  152. package/test/offline/indexeddb_storage_unit.js +1 -1
  153. package/test/offline/manifest_convert_unit.js +34 -4
  154. package/test/offline/offline_manifest_parser_unit.js +1 -0
  155. package/test/offline/storage_compatibility_unit.js +1 -1
  156. package/test/offline/storage_integration.js +5 -4
  157. package/test/player_external.js +7 -7
  158. package/test/player_integration.js +22 -10
  159. package/test/player_src_equals_integration.js +81 -83
  160. package/test/player_unit.js +124 -1
  161. package/test/test/boot.js +9 -0
  162. package/test/test/externs/filters.js +4 -0
  163. package/test/test/util/fake_media_source_engine.js +11 -4
  164. package/test/test/util/manifest_generator.js +3 -1
  165. package/test/test/util/manifest_parser_util.js +4 -1
  166. package/test/test/util/offline_utils.js +1 -0
  167. package/test/test/util/simple_fakes.js +31 -2
  168. package/test/test/util/streaming_engine_util.js +1 -0
  169. package/test/test/util/test_scheme.js +24 -1
  170. package/test/test/util/util.js +4 -4
  171. package/test/text/cue_integration.js +2 -2
  172. package/test/text/lrc_text_parser_unit.js +6 -7
  173. package/test/text/mp4_ttml_parser_unit.js +6 -4
  174. package/test/text/mp4_vtt_parser_unit.js +6 -5
  175. package/test/text/sbv_text_parser_unit.js +5 -6
  176. package/test/text/srt_text_parser_unit.js +5 -6
  177. package/test/text/ssa_text_parser_unit.js +17 -29
  178. package/test/text/text_engine_unit.js +45 -5
  179. package/test/text/ttml_text_parser_unit.js +77 -77
  180. package/test/text/vtt_text_parser_unit.js +116 -59
  181. package/test/ui/ui_integration.js +0 -16
  182. package/test/ui/ui_unit.js +27 -0
  183. package/test/util/cmcd_manager_unit.js +3 -0
  184. package/test/util/mime_utils_unit.js +54 -0
  185. package/test/util/periods_unit.js +79 -0
  186. package/test/util/stream_utils_unit.js +23 -7
  187. package/ui/controls.js +65 -40
  188. package/ui/fullscreen_button.js +26 -6
  189. package/ui/less/containers.less +3 -3
  190. package/ui/locales/en.json +1 -0
  191. package/ui/locales/source.json +5 -0
  192. package/ui/resolution_selection.js +31 -33
  193. package/ui/ui.js +0 -17
  194. package/docs/tutorials/gsoc-ideas-list.md +0 -3
  195. package/docs/tutorials/upgrade-v2-5.md +0 -441
  196. package/docs/tutorials/upgrade-v3.md +0 -38
  197. package/lib/polyfill/mathround.js +0 -49
  198. package/lib/polyfill/patchedmediakeys_apple.js +0 -744
  199. package/lib/polyfill/patchedmediakeys_ms.js +0 -698
  200. package/lib/util/mutex.js +0 -52
  201. package/test/util/functional_unit.js +0 -82
@@ -65,7 +65,7 @@ describe('Mp4VttParser', () => {
65
65
 
66
66
  const parser = new shaka.text.Mp4VttParser();
67
67
  parser.parseInit(vttInitSegment);
68
- const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
68
+ const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
69
69
  const result = parser.parseMedia(vttSegment, time);
70
70
  verifyHelper(cues, result);
71
71
  });
@@ -93,7 +93,7 @@ describe('Mp4VttParser', () => {
93
93
 
94
94
  const parser = new shaka.text.Mp4VttParser();
95
95
  parser.parseInit(vttInitSegment);
96
- const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
96
+ const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
97
97
  const result = parser.parseMedia(vttSegmentMultiPayload, time);
98
98
  verifyHelper(cues, result);
99
99
  });
@@ -121,7 +121,7 @@ describe('Mp4VttParser', () => {
121
121
 
122
122
  const parser = new shaka.text.Mp4VttParser();
123
123
  parser.parseInit(vttInitSegment);
124
- const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
124
+ const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
125
125
  const result = parser.parseMedia(vttSegSettings, time);
126
126
  verifyHelper(cues, result);
127
127
  });
@@ -143,7 +143,7 @@ describe('Mp4VttParser', () => {
143
143
 
144
144
  const parser = new shaka.text.Mp4VttParser();
145
145
  parser.parseInit(vttInitSegment);
146
- const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
146
+ const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
147
147
  const result = parser.parseMedia(vttSegNoDuration, time);
148
148
  verifyHelper(cues, result);
149
149
  });
@@ -165,7 +165,8 @@ describe('Mp4VttParser', () => {
165
165
 
166
166
  const parser = new shaka.text.Mp4VttParser();
167
167
  parser.parseInit(vttInitSegment);
168
- const time = {periodStart: 10, segmentStart: 0, segmentEnd: 0};
168
+ const time =
169
+ {periodStart: 10, segmentStart: 0, segmentEnd: 0, vttOffset: 10};
169
170
  const result = parser.parseMedia(vttSegment, time);
170
171
  verifyHelper(cues, result);
171
172
  });
@@ -8,7 +8,7 @@ describe('SbvTextParser', () => {
8
8
  it('supports no cues', () => {
9
9
  verifyHelper([],
10
10
  '',
11
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
11
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
12
12
  });
13
13
 
14
14
  it('handles a blank line at the end of the file', () => {
@@ -18,7 +18,7 @@ describe('SbvTextParser', () => {
18
18
  ],
19
19
  '0:00:20.000,0:00:40.000\n' +
20
20
  'Test\n\n',
21
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
21
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
22
22
  });
23
23
 
24
24
  it('handles no blank line at the end of the file', () => {
@@ -28,8 +28,7 @@ describe('SbvTextParser', () => {
28
28
  ],
29
29
  '0:00:20.000,0:00:40.000\n' +
30
30
  'Test\n',
31
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
32
- });
31
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
33
32
  });
34
33
 
35
34
  it('handles no newline after the final text payload', () => {
@@ -39,7 +38,7 @@ describe('SbvTextParser', () => {
39
38
  ],
40
39
  '0:00:20.000,0:00:40.000\n' +
41
40
  'Test',
42
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
41
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
43
42
  });
44
43
 
45
44
  it('supports multiple cues', () => {
@@ -52,7 +51,7 @@ describe('SbvTextParser', () => {
52
51
  'Test\n\n' +
53
52
  '0:00:40.000,0:00:50.000\n' +
54
53
  'Test2',
55
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
54
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
56
55
  });
57
56
 
58
57
  /**
@@ -8,7 +8,7 @@ describe('SrtTextParser', () => {
8
8
  it('supports no cues', () => {
9
9
  verifyHelper([],
10
10
  '',
11
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
11
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
12
12
  });
13
13
 
14
14
  it('handles a blank line at the end of the file', () => {
@@ -19,7 +19,7 @@ describe('SrtTextParser', () => {
19
19
  '1\n' +
20
20
  '00:00:20,000 --> 00:00:40,000\n' +
21
21
  'Test\n\n',
22
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
22
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
23
23
  });
24
24
 
25
25
  it('handles no blank line at the end of the file', () => {
@@ -30,8 +30,7 @@ describe('SrtTextParser', () => {
30
30
  '1\n' +
31
31
  '00:00:20,000 --> 00:00:40,000\n' +
32
32
  'Test\n',
33
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
34
- });
33
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
35
34
  });
36
35
 
37
36
  it('handles no newline after the final text payload', () => {
@@ -42,7 +41,7 @@ describe('SrtTextParser', () => {
42
41
  '1\n' +
43
42
  '00:00:20,000 --> 00:00:40,000\n' +
44
43
  'Test',
45
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
44
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
46
45
  });
47
46
 
48
47
  it('supports multiple cues', () => {
@@ -57,7 +56,7 @@ describe('SrtTextParser', () => {
57
56
  '2\n' +
58
57
  '00:00:40,000 --> 00:00:50,000\n' +
59
58
  'Test2',
60
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
59
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
61
60
  });
62
61
 
63
62
  /**
@@ -10,7 +10,7 @@ describe('SsaTextParser', () => {
10
10
  it('supports no cues', () => {
11
11
  verifyHelper([],
12
12
  '',
13
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
13
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
14
14
  });
15
15
 
16
16
  it('handles a blank line at the start of the file', () => {
@@ -33,7 +33,7 @@ describe('SsaTextParser', () => {
33
33
  'Effect, Text\n' +
34
34
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
35
35
  ',,{\\pos(400,570)}Test',
36
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
36
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
37
37
  });
38
38
 
39
39
  it('handles a blank line at the end of the file', () => {
@@ -56,7 +56,7 @@ describe('SsaTextParser', () => {
56
56
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
57
57
  ',,{\\pos(400,570)}Test' +
58
58
  '\n\n',
59
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
59
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
60
60
  });
61
61
 
62
62
  it('handles no blank line at the end of the file', () => {
@@ -78,8 +78,7 @@ describe('SsaTextParser', () => {
78
78
  'Effect, Text\n' +
79
79
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
80
80
  ',,{\\pos(400,570)}Test',
81
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
82
- });
81
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
83
82
  });
84
83
 
85
84
  it('supports no styles', () => {
@@ -94,8 +93,7 @@ describe('SsaTextParser', () => {
94
93
  'Effect, Text\n' +
95
94
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
96
95
  ',,{\\pos(400,570)}Test',
97
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
98
- });
96
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
99
97
  });
100
98
 
101
99
  it('support no script info', () => {
@@ -115,8 +113,7 @@ describe('SsaTextParser', () => {
115
113
  'Effect, Text\n' +
116
114
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
117
115
  ',,{\\pos(400,570)}Test',
118
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
119
- });
116
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
120
117
  });
121
118
 
122
119
  it('supports only events', () => {
@@ -129,8 +126,7 @@ describe('SsaTextParser', () => {
129
126
  'Effect, Text\n' +
130
127
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
131
128
  ',,{\\pos(400,570)}Test',
132
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
133
- });
129
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
134
130
  });
135
131
 
136
132
  it('supports text with commas', () => {
@@ -143,8 +139,7 @@ describe('SsaTextParser', () => {
143
139
  'Effect, Text\n' +
144
140
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
145
141
  ',,{\\pos(400,570)}Test,1,Test2',
146
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
147
- });
142
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
148
143
  });
149
144
 
150
145
  it('supports different time formats', () => {
@@ -163,7 +158,7 @@ describe('SsaTextParser', () => {
163
158
  ',,{\\pos(400,570)}Test2\n' +
164
159
  'Dialogue: 0,0:00:08.01,0:00:10.001,DefaultVCD, NTP,0000,0000,0000' +
165
160
  ',,{\\pos(400,570)}Test3',
166
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
161
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
167
162
  });
168
163
 
169
164
  it('supports multiple cues', () => {
@@ -182,7 +177,7 @@ describe('SsaTextParser', () => {
182
177
  ',,{\\pos(400,570)}Test2\n' +
183
178
  'Dialogue: 0,0:00:08.01,0:00:10.10,DefaultVCD, NTP,0000,0000,0000' +
184
179
  ',,{\\pos(400,570)}Test3',
185
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
180
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
186
181
  });
187
182
 
188
183
  it('supports fontFamily style', () => {
@@ -207,8 +202,7 @@ describe('SsaTextParser', () => {
207
202
  'Effect, Text\n' +
208
203
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
209
204
  ',,{\\pos(400,570)}Test',
210
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
211
- });
205
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
212
206
  });
213
207
 
214
208
  it('supports color & backgroundColor style', () => {
@@ -234,8 +228,7 @@ describe('SsaTextParser', () => {
234
228
  'Effect, Text\n' +
235
229
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
236
230
  ',,{\\pos(400,570)}Test',
237
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
238
- });
231
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
239
232
  });
240
233
 
241
234
  it('supports bold style', () => {
@@ -260,8 +253,7 @@ describe('SsaTextParser', () => {
260
253
  'Effect, Text\n' +
261
254
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
262
255
  ',,{\\pos(400,570)}Test',
263
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
264
- });
256
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
265
257
  });
266
258
 
267
259
  it('supports italic style', () => {
@@ -286,8 +278,7 @@ describe('SsaTextParser', () => {
286
278
  'Effect, Text\n' +
287
279
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
288
280
  ',,{\\pos(400,570)}Test',
289
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
290
- });
281
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
291
282
  });
292
283
 
293
284
  it('supports underline style', () => {
@@ -312,8 +303,7 @@ describe('SsaTextParser', () => {
312
303
  'Effect, Text\n' +
313
304
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
314
305
  ',,{\\pos(400,570)}Test',
315
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
316
- });
306
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
317
307
  });
318
308
 
319
309
  it('supports letterSpacing style', () => {
@@ -338,8 +328,7 @@ describe('SsaTextParser', () => {
338
328
  'Effect, Text\n' +
339
329
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
340
330
  ',,{\\pos(400,570)}Test',
341
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
342
- });
331
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
343
332
  });
344
333
 
345
334
  it('supports V4 style', () => {
@@ -364,8 +353,7 @@ describe('SsaTextParser', () => {
364
353
  'Effect, Text\n' +
365
354
  'Dialogue: 0,0:00:00.00,0:00:02.00,DefaultVCD, NTP,0000,0000,0000' +
366
355
  ',,{\\pos(400,570)}Test',
367
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
368
- });
356
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
369
357
  });
370
358
 
371
359
  /**
@@ -19,6 +19,9 @@ describe('TextEngine', () => {
19
19
  /** @type {!jasmine.Spy} */
20
20
  let mockParseInit;
21
21
 
22
+ /** @type {!jasmine.Spy} */
23
+ let mockSetSequenceMode;
24
+
22
25
  /** @type {!jasmine.Spy} */
23
26
  let mockParseMedia;
24
27
 
@@ -27,11 +30,13 @@ describe('TextEngine', () => {
27
30
 
28
31
  beforeEach(() => {
29
32
  mockParseInit = jasmine.createSpy('mockParseInit');
33
+ mockSetSequenceMode = jasmine.createSpy('mockSetSequenceMode');
30
34
  mockParseMedia = jasmine.createSpy('mockParseMedia');
31
35
  // eslint-disable-next-line no-restricted-syntax
32
36
  mockParserPlugIn = function() {
33
37
  return {
34
38
  parseInit: mockParseInit,
39
+ setSequenceMode: mockSetSequenceMode,
35
40
  parseMedia: mockParseMedia,
36
41
  };
37
42
  };
@@ -41,7 +46,10 @@ describe('TextEngine', () => {
41
46
 
42
47
  TextEngine.registerParser(dummyMimeType, mockParserPlugIn);
43
48
  textEngine = new TextEngine(mockDisplayer);
44
- textEngine.initParser(dummyMimeType);
49
+ textEngine.initParser(
50
+ dummyMimeType,
51
+ /* sequenceMode= */ false,
52
+ /* segmentRelativeVttTiming= */ false);
45
53
  });
46
54
 
47
55
  afterEach(() => {
@@ -86,7 +94,7 @@ describe('TextEngine', () => {
86
94
  await textEngine.appendBuffer(dummyData, 0, 3);
87
95
  expect(mockParseMedia).toHaveBeenCalledOnceMoreWith([
88
96
  dummyData,
89
- {periodStart: 0, segmentStart: 0, segmentEnd: 3},
97
+ {periodStart: 0, segmentStart: 0, segmentEnd: 3, vttOffset: 0},
90
98
  ]);
91
99
 
92
100
  expect(mockDisplayer.appendSpy).toHaveBeenCalledOnceMoreWith([
@@ -101,7 +109,7 @@ describe('TextEngine', () => {
101
109
 
102
110
  expect(mockParseMedia).toHaveBeenCalledOnceMoreWith([
103
111
  dummyData,
104
- {periodStart: 0, segmentStart: 3, segmentEnd: 5},
112
+ {periodStart: 0, segmentStart: 3, segmentEnd: 5, vttOffset: 0},
105
113
  ]);
106
114
 
107
115
  expect(mockDisplayer.appendSpy).toHaveBeenCalledOnceMoreWith([
@@ -253,7 +261,7 @@ describe('TextEngine', () => {
253
261
 
254
262
  expect(mockParseMedia).toHaveBeenCalledOnceMoreWith([
255
263
  dummyData,
256
- {periodStart: 0, segmentStart: 0, segmentEnd: 3},
264
+ {periodStart: 0, segmentStart: 0, segmentEnd: 3, vttOffset: 0},
257
265
  ]);
258
266
  expect(mockDisplayer.appendSpy).toHaveBeenCalledOnceMoreWith([
259
267
  [
@@ -267,7 +275,7 @@ describe('TextEngine', () => {
267
275
 
268
276
  expect(mockParseMedia).toHaveBeenCalledOnceMoreWith([
269
277
  dummyData,
270
- {periodStart: 4, segmentStart: 4, segmentEnd: 7},
278
+ {periodStart: 4, segmentStart: 4, segmentEnd: 7, vttOffset: 4},
271
279
  ]);
272
280
  expect(mockDisplayer.appendSpy).toHaveBeenCalledOnceMoreWith([
273
281
  [
@@ -276,6 +284,38 @@ describe('TextEngine', () => {
276
284
  ],
277
285
  ]);
278
286
  });
287
+
288
+ it('vttOffset when segmentRelativeVttTiming is set', async () => {
289
+ textEngine.initParser(
290
+ dummyMimeType,
291
+ /* sequenceMode= */ false,
292
+ /* segmentRelativeVttTiming= */ true);
293
+
294
+ mockParseMedia.and.callFake((data, time) => {
295
+ return [
296
+ createFakeCue(time.periodStart + 0,
297
+ time.periodStart + 1),
298
+ createFakeCue(time.periodStart + 2,
299
+ time.periodStart + 3),
300
+ ];
301
+ });
302
+
303
+ await textEngine.appendBuffer(dummyData, 0, 3);
304
+
305
+ expect(mockParseMedia).toHaveBeenCalledOnceMoreWith([
306
+ dummyData,
307
+ {periodStart: 0, segmentStart: 0, segmentEnd: 3, vttOffset: 0},
308
+ ]);
309
+
310
+ textEngine.setTimestampOffset(8);
311
+ await textEngine.appendBuffer(dummyData, 4, 7);
312
+
313
+ // vttOffset should equal segmentStart instead of periodStart
314
+ expect(mockParseMedia).toHaveBeenCalledOnceMoreWith([
315
+ dummyData,
316
+ {periodStart: 8, segmentStart: 4, segmentEnd: 7, vttOffset: 4},
317
+ ]);
318
+ });
279
319
  });
280
320
 
281
321
  describe('bufferStart/bufferEnd', () => {