shaka-player 3.3.4 → 4.0.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 (184) hide show
  1. package/.github/workflows/build-and-test.yaml +0 -1
  2. package/.github/workflows/demo-version-index.yaml +8 -0
  3. package/.github/workflows/release-please.yaml +23 -2
  4. package/.github/workflows/selenium-lab-tests.yaml +0 -1
  5. package/.github/workflows/sync-labels.yaml +33 -0
  6. package/.github/workflows/update-issues.yaml +29 -0
  7. package/.github/workflows/validate-pr-title.yaml +35 -0
  8. package/AUTHORS +1 -0
  9. package/CHANGELOG.md +198 -32
  10. package/CONTRIBUTORS +1 -0
  11. package/README.md +10 -7
  12. package/app-engine/demo-version-index/README.md +3 -3
  13. package/app-engine/demo-version-index/app.yaml +27 -1
  14. package/app-engine/demo-version-index/generate.py +164 -0
  15. package/app-engine/demo-version-index/main.py +4 -155
  16. package/app-engine/demo-version-index/requirements.txt +0 -1
  17. package/build/README.md +2 -2
  18. package/build/compiler.py +1 -1
  19. package/build/generateTsDefs.py +0 -2
  20. package/build/shaka-lab.yaml +0 -2
  21. package/build/test.py +7 -1
  22. package/build/types/core +0 -1
  23. package/build/types/polyfill +0 -3
  24. package/demo/common/asset.js +17 -1
  25. package/demo/common/assets.js +29 -0
  26. package/demo/common/message_ids.js +6 -3
  27. package/demo/config.js +10 -11
  28. package/demo/custom.js +39 -0
  29. package/demo/demo_utils.js +0 -1
  30. package/demo/locales/en.json +6 -3
  31. package/demo/locales/source.json +22 -10
  32. package/demo/main.js +9 -6
  33. package/demo/search.js +2 -1
  34. package/dist/controls.css +1 -1
  35. package/dist/demo.compiled.debug.js +71 -64
  36. package/dist/demo.compiled.debug.map +3 -3
  37. package/dist/demo.compiled.js +71 -64
  38. package/dist/demo.compiled.map +3 -3
  39. package/dist/demo.css +1 -1
  40. package/dist/demo.css.map +1 -1
  41. package/dist/deps.js +16 -20
  42. package/dist/locales.js +31 -29
  43. package/dist/receiver.compiled.debug.js +32 -28
  44. package/dist/receiver.compiled.debug.map +3 -3
  45. package/dist/receiver.compiled.js +32 -28
  46. package/dist/receiver.compiled.map +3 -3
  47. package/dist/shaka-player.compiled.d.ts +78 -83
  48. package/dist/shaka-player.compiled.debug.d.ts +78 -83
  49. package/dist/shaka-player.compiled.debug.externs.js +126 -126
  50. package/dist/shaka-player.compiled.debug.js +426 -483
  51. package/dist/shaka-player.compiled.debug.map +4 -4
  52. package/dist/shaka-player.compiled.externs.js +126 -126
  53. package/dist/shaka-player.compiled.js +838 -856
  54. package/dist/shaka-player.compiled.map +4 -4
  55. package/dist/shaka-player.ui.d.ts +80 -83
  56. package/dist/shaka-player.ui.debug.d.ts +80 -83
  57. package/dist/shaka-player.ui.debug.externs.js +134 -126
  58. package/dist/shaka-player.ui.debug.js +488 -543
  59. package/dist/shaka-player.ui.debug.map +4 -4
  60. package/dist/shaka-player.ui.externs.js +134 -126
  61. package/dist/shaka-player.ui.js +980 -994
  62. package/dist/shaka-player.ui.map +4 -4
  63. package/docs/tutorials/config.md +0 -2
  64. package/docs/tutorials/drm-config.md +5 -0
  65. package/docs/tutorials/fairplay.md +7 -22
  66. package/docs/tutorials/faq.md +0 -11
  67. package/docs/tutorials/index.json +2 -8
  68. package/docs/tutorials/plugins.md +1 -3
  69. package/docs/tutorials/upgrade.md +83 -11
  70. package/externs/polyfill.js +15 -0
  71. package/externs/shaka/manifest.js +5 -1
  72. package/externs/shaka/net.js +12 -0
  73. package/externs/shaka/offline.js +5 -1
  74. package/externs/shaka/player.js +39 -32
  75. package/externs/shaka/text.js +12 -12
  76. package/externs/sourcebuffer.js +15 -0
  77. package/lib/ads/client_side_ad.js +13 -2
  78. package/lib/ads/client_side_ad_manager.js +22 -4
  79. package/lib/cast/cast_utils.js +0 -1
  80. package/lib/dash/content_protection.js +85 -5
  81. package/lib/dash/dash_parser.js +1 -1
  82. package/lib/hls/hls_parser.js +378 -743
  83. package/lib/hls/manifest_text_parser.js +2 -3
  84. package/lib/media/drm_engine.js +102 -53
  85. package/lib/media/gap_jumping_controller.js +10 -45
  86. package/lib/media/media_source_engine.js +87 -15
  87. package/lib/media/playhead.js +2 -5
  88. package/lib/media/presentation_timeline.js +1 -2
  89. package/lib/media/segment_index.js +13 -46
  90. package/lib/media/segment_reference.js +47 -1
  91. package/lib/media/streaming_engine.js +29 -11
  92. package/lib/media/time_ranges_utils.js +4 -9
  93. package/lib/net/networking_engine.js +3 -0
  94. package/lib/offline/indexeddb/v1_storage_cell.js +1 -0
  95. package/lib/offline/indexeddb/v2_storage_cell.js +1 -0
  96. package/lib/offline/manifest_converter.js +1 -0
  97. package/lib/offline/storage.js +100 -132
  98. package/lib/player.js +17 -201
  99. package/lib/polyfill/media_capabilities.js +12 -6
  100. package/lib/polyfill/mediasource.js +0 -28
  101. package/lib/polyfill/patchedmediakeys_nop.js +2 -0
  102. package/lib/polyfill/patchedmediakeys_webkit.js +2 -0
  103. package/lib/text/cue.js +0 -6
  104. package/lib/text/lrc_text_parser.js +8 -0
  105. package/lib/text/mp4_ttml_parser.js +8 -0
  106. package/lib/text/mp4_vtt_parser.js +8 -0
  107. package/lib/text/sbv_text_parser.js +8 -0
  108. package/lib/text/simple_text_displayer.js +1 -7
  109. package/lib/text/srt_text_parser.js +8 -0
  110. package/lib/text/ssa_text_parser.js +8 -0
  111. package/lib/text/text_engine.js +19 -3
  112. package/lib/text/ttml_text_parser.js +8 -0
  113. package/lib/text/ui_text_displayer.js +1 -7
  114. package/lib/text/vtt_text_parser.js +24 -2
  115. package/lib/text/web_vtt_generator.js +1 -7
  116. package/lib/util/error.js +9 -13
  117. package/lib/util/fairplay_utils.js +109 -0
  118. package/lib/util/functional.js +0 -42
  119. package/lib/util/mime_utils.js +2 -0
  120. package/lib/util/platform.js +45 -0
  121. package/lib/util/player_configuration.js +12 -6
  122. package/lib/util/pssh.js +23 -4
  123. package/lib/util/stream_utils.js +92 -22
  124. package/lib/util/uint8array_utils.js +0 -16
  125. package/lib/util/xml_utils.js +1 -1
  126. package/package.json +1 -1
  127. package/roadmap.md +19 -19
  128. package/shaka-player.uncompiled.js +0 -3
  129. package/test/cast/cast_utils_unit.js +1 -0
  130. package/test/dash/dash_parser_content_protection_unit.js +44 -0
  131. package/test/dash/dash_parser_manifest_unit.js +0 -24
  132. package/test/dash/dash_parser_segment_template_unit.js +3 -4
  133. package/test/demo/demo_unit.js +2 -1
  134. package/test/hls/hls_live_unit.js +99 -220
  135. package/test/hls/hls_parser_unit.js +515 -432
  136. package/test/media/drm_engine_unit.js +86 -120
  137. package/test/media/media_source_engine_integration.js +26 -3
  138. package/test/media/media_source_engine_unit.js +7 -6
  139. package/test/media/playhead_unit.js +27 -191
  140. package/test/media/segment_index_unit.js +15 -25
  141. package/test/media/streaming_engine_integration.js +4 -39
  142. package/test/media/streaming_engine_unit.js +3 -2
  143. package/test/media/time_ranges_utils_unit.js +0 -5
  144. package/test/offline/manifest_convert_unit.js +34 -4
  145. package/test/offline/offline_manifest_parser_unit.js +1 -0
  146. package/test/offline/storage_integration.js +5 -4
  147. package/test/player_external.js +0 -6
  148. package/test/player_integration.js +16 -0
  149. package/test/player_unit.js +26 -0
  150. package/test/test/util/fake_media_source_engine.js +11 -4
  151. package/test/test/util/manifest_generator.js +3 -1
  152. package/test/test/util/manifest_parser_util.js +4 -1
  153. package/test/test/util/offline_utils.js +1 -0
  154. package/test/test/util/streaming_engine_util.js +1 -0
  155. package/test/test/util/test_scheme.js +24 -1
  156. package/test/test/util/util.js +4 -4
  157. package/test/text/cue_integration.js +2 -2
  158. package/test/text/lrc_text_parser_unit.js +6 -7
  159. package/test/text/mp4_ttml_parser_unit.js +6 -4
  160. package/test/text/mp4_vtt_parser_unit.js +6 -5
  161. package/test/text/sbv_text_parser_unit.js +5 -6
  162. package/test/text/srt_text_parser_unit.js +5 -6
  163. package/test/text/ssa_text_parser_unit.js +17 -29
  164. package/test/text/text_engine_unit.js +45 -5
  165. package/test/text/ttml_text_parser_unit.js +77 -77
  166. package/test/text/vtt_text_parser_unit.js +55 -57
  167. package/test/ui/ui_integration.js +0 -16
  168. package/test/ui/ui_unit.js +27 -0
  169. package/test/util/cmcd_manager_unit.js +3 -0
  170. package/test/util/stream_utils_unit.js +23 -7
  171. package/ui/controls.js +65 -40
  172. package/ui/fullscreen_button.js +26 -6
  173. package/ui/less/containers.less +3 -3
  174. package/ui/locales/en.json +1 -0
  175. package/ui/locales/source.json +5 -0
  176. package/ui/resolution_selection.js +31 -33
  177. package/ui/ui.js +0 -17
  178. package/docs/tutorials/upgrade-v2-5.md +0 -441
  179. package/docs/tutorials/upgrade-v3.md +0 -38
  180. package/lib/polyfill/mathround.js +0 -49
  181. package/lib/polyfill/patchedmediakeys_apple.js +0 -744
  182. package/lib/polyfill/patchedmediakeys_ms.js +0 -698
  183. package/lib/util/mutex.js +0 -52
  184. package/test/util/functional_unit.js +0 -82
@@ -51,7 +51,8 @@ let ExtraMetadataType;
51
51
  * textLanguages: (!Array.<string>|undefined),
52
52
  * duration: number,
53
53
  * licenseServers: (!Object.<string, string>|undefined),
54
- * licenseRequestHeaders: (!Object.<string, string>|undefined)
54
+ * licenseRequestHeaders: (!Object.<string, string>|undefined),
55
+ * sequenceMode: boolean
55
56
  * }}
56
57
  */
57
58
  let MetadataType;
@@ -278,6 +279,7 @@ shaka.test.TestScheme = class {
278
279
 
279
280
  const manifest = shaka.test.ManifestGenerator.generate((manifest) => {
280
281
  manifest.presentationTimeline.setDuration(data.duration);
282
+ manifest.sequenceMode = data.sequenceMode;
281
283
 
282
284
  const videoResolutions = data.videoResolutions || [undefined];
283
285
  const audioLanguages = data.audioLanguages ||
@@ -511,6 +513,16 @@ shaka.test.TestScheme.DATA = {
511
513
  audio: sintelAudioSegment,
512
514
  text: vttSegment,
513
515
  duration: 30,
516
+ sequenceMode: false,
517
+ },
518
+
519
+ // Like 'sintel', but flagged as sequence mode.
520
+ 'sintel_sequence': {
521
+ video: sintelVideoSegment,
522
+ audio: sintelAudioSegment,
523
+ text: vttSegment,
524
+ duration: 30,
525
+ sequenceMode: true,
514
526
  },
515
527
 
516
528
  // Like 'sintel', but much longer to test buffering and seeking.
@@ -518,6 +530,7 @@ shaka.test.TestScheme.DATA = {
518
530
  video: sintelVideoSegment,
519
531
  audio: sintelAudioSegment,
520
532
  duration: 300,
533
+ sequenceMode: false,
521
534
  },
522
535
 
523
536
  // Like 'sintel' above, but with languages and delayed setup.
@@ -534,6 +547,7 @@ shaka.test.TestScheme.DATA = {
534
547
  language: 'fa', // Necessary to repro #1696
535
548
  }),
536
549
  duration: 30,
550
+ sequenceMode: false,
537
551
  },
538
552
 
539
553
  'sintel_multi_lingual_multi_res': {
@@ -547,17 +561,20 @@ shaka.test.TestScheme.DATA = {
547
561
  audioLanguages: ['en', 'es'],
548
562
  textLanguages: ['zh', 'fr'],
549
563
  duration: 30,
564
+ sequenceMode: false,
550
565
  },
551
566
 
552
567
  'sintel_audio_only': {
553
568
  audio: sintelAudioSegment,
554
569
  duration: 30,
570
+ sequenceMode: false,
555
571
  },
556
572
 
557
573
  'sintel_no_text': {
558
574
  video: sintelVideoSegment,
559
575
  audio: sintelAudioSegment,
560
576
  duration: 30,
577
+ sequenceMode: false,
561
578
  },
562
579
 
563
580
  // https://github.com/shaka-project/shaka-player/issues/2553
@@ -566,6 +583,7 @@ shaka.test.TestScheme.DATA = {
566
583
  text: vttSegment,
567
584
  textLanguages: ['de', 'de'], // one of these is the "forced subs" track
568
585
  duration: 30,
586
+ sequenceMode: false,
569
587
  },
570
588
 
571
589
  'sintel-enc': {
@@ -574,6 +592,7 @@ shaka.test.TestScheme.DATA = {
574
592
  text: vttSegment,
575
593
  licenseServers: widevineDrmServers,
576
594
  duration: 30,
595
+ sequenceMode: false,
577
596
  },
578
597
 
579
598
  'multidrm': {
@@ -583,6 +602,7 @@ shaka.test.TestScheme.DATA = {
583
602
  licenseServers: axinomDrmServers,
584
603
  licenseRequestHeaders: axinomDrmHeaders,
585
604
  duration: 30,
605
+ sequenceMode: false,
586
606
  },
587
607
 
588
608
  'multidrm_no_init_data': {
@@ -595,6 +615,7 @@ shaka.test.TestScheme.DATA = {
595
615
  licenseServers: axinomDrmServers,
596
616
  licenseRequestHeaders: axinomDrmHeaders,
597
617
  duration: 30,
618
+ sequenceMode: false,
598
619
  },
599
620
 
600
621
  'cea-708_ts': {
@@ -608,6 +629,7 @@ shaka.test.TestScheme.DATA = {
608
629
  mimeType: 'application/cea-608',
609
630
  },
610
631
  duration: 30,
632
+ sequenceMode: false,
611
633
  },
612
634
 
613
635
  'cea-708_mp4': {
@@ -622,6 +644,7 @@ shaka.test.TestScheme.DATA = {
622
644
  closedCaptions: new Map([['CC1', 'en']]),
623
645
  },
624
646
  duration: 30,
647
+ sequenceMode: false,
625
648
  },
626
649
  };
627
650
 
@@ -453,13 +453,13 @@ shaka.test.Util = class {
453
453
  */
454
454
  shaka.test.Util.customMatchers_ = {
455
455
  // Custom matcher for Element objects.
456
- toEqualElement: (util, customEqualityTesters) => {
456
+ toEqualElement: (util) => {
457
457
  return {
458
458
  compare: shaka.test.Util.expectToEqualElementCompare_,
459
459
  };
460
460
  },
461
461
  // Custom matcher for working with spies.
462
- toHaveBeenCalledOnceMore: (util, customEqualityTesters) => {
462
+ toHaveBeenCalledOnceMore: (util) => {
463
463
  return {
464
464
  compare: (actual, expected) => {
465
465
  const callCount = actual.calls.count();
@@ -479,7 +479,7 @@ shaka.test.Util.customMatchers_ = {
479
479
  },
480
480
  };
481
481
  },
482
- toHaveBeenCalledOnceMoreWith: (util, customEqualityTesters) => {
482
+ toHaveBeenCalledOnceMoreWith: (util) => {
483
483
  return {
484
484
  compare: (actual, expected) => {
485
485
  const callCount = actual.calls.count();
@@ -492,7 +492,7 @@ shaka.test.Util.customMatchers_ = {
492
492
  if (callCount != 1) {
493
493
  result.pass = false;
494
494
  result.message = 'Expected to be called once, not ' + callCount;
495
- } else if (!util.equals(callArgs, expected, customEqualityTesters)) {
495
+ } else if (!util.equals(callArgs, expected)) {
496
496
  result.pass = false;
497
497
  result.message =
498
498
  'Expected to be called with ' + expected + ' not ' + callArgs;
@@ -19,7 +19,7 @@ describe('Cue', () => {
19
19
  'WEBVTT\n\n' +
20
20
  '00:00:20.000 --> 00:00:40.000\n' +
21
21
  'Test',
22
- {periodStart: 7, segmentStart: 10, segmentEnd: 60});
22
+ {periodStart: 7, segmentStart: 10, segmentEnd: 60, vttOffset: 7});
23
23
  expect(cues.length).toBe(1);
24
24
  expect(cues[0].startTime).toBe(27);
25
25
  expect(cues[0].endTime).toBe(47);
@@ -34,7 +34,7 @@ describe('Cue', () => {
34
34
  'ID1\n' +
35
35
  '00:00:20.000 --> 00:00:40.000 align:middle size:56% vertical:lr\n' +
36
36
  'Test',
37
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
37
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
38
38
  expect(cues.length).toBe(1);
39
39
  });
40
40
 
@@ -8,7 +8,7 @@ describe('LrcTextParser', () => {
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 start of the file', () => {
@@ -18,7 +18,7 @@ describe('LrcTextParser', () => {
18
18
  ],
19
19
  '\n\n' +
20
20
  '[00:00.00]Test',
21
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
21
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
22
22
  });
23
23
 
24
24
  it('handles a blank line at the end of the file', () => {
@@ -28,7 +28,7 @@ describe('LrcTextParser', () => {
28
28
  ],
29
29
  '[00:00.00]Test' +
30
30
  '\n\n',
31
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
31
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
32
32
  });
33
33
 
34
34
  it('handles no blank line at the end of the file', () => {
@@ -37,8 +37,7 @@ describe('LrcTextParser', () => {
37
37
  {startTime: 0, endTime: 2, payload: 'Test'},
38
38
  ],
39
39
  '[00:00.00]Test',
40
- {periodStart: 0, segmentStart: 0, segmentEnd: 0,
41
- });
40
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
42
41
  });
43
42
 
44
43
  it('supports multiple cues', () => {
@@ -51,7 +50,7 @@ describe('LrcTextParser', () => {
51
50
  '[00:00.00]Test\n' +
52
51
  '[00:10.00]Test2\n' +
53
52
  '[00:20.00]Test3',
54
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
53
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
55
54
  });
56
55
 
57
56
  it('supports different time formats', () => {
@@ -70,7 +69,7 @@ describe('LrcTextParser', () => {
70
69
  '[00:30,1]Test4\n' +
71
70
  '[00:40,001]Test5\n' +
72
71
  '[00:50,02]Test6',
73
- {periodStart: 0, segmentStart: 0, segmentEnd: 0});
72
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0});
74
73
  });
75
74
 
76
75
  /**
@@ -41,7 +41,7 @@ describe('Mp4TtmlParser', () => {
41
41
  it('handles media segments with multiple mdats', () => {
42
42
  const parser = new shaka.text.Mp4TtmlParser();
43
43
  parser.parseInit(ttmlInitSegment);
44
- const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
44
+ const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
45
45
  const ret = parser.parseMedia(ttmlSegmentMultipleMDAT, time);
46
46
  // Bodies.
47
47
  expect(ret.length).toBe(2);
@@ -54,8 +54,10 @@ describe('Mp4TtmlParser', () => {
54
54
  });
55
55
 
56
56
  it('accounts for offset', () => {
57
- const time1 = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
58
- const time2 = {periodStart: 7, segmentStart: 0, segmentEnd: 0};
57
+ const time1 =
58
+ {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
59
+ const time2 =
60
+ {periodStart: 7, segmentStart: 0, segmentEnd: 0, vttOffset: 7};
59
61
 
60
62
  const parser = new shaka.text.Mp4TtmlParser();
61
63
  parser.parseInit(ttmlInitSegment);
@@ -159,7 +161,7 @@ describe('Mp4TtmlParser', () => {
159
161
  ];
160
162
  const parser = new shaka.text.Mp4TtmlParser();
161
163
  parser.parseInit(ttmlInitSegment);
162
- const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0};
164
+ const time = {periodStart: 0, segmentStart: 0, segmentEnd: 0, vttOffset: 0};
163
165
  const result = parser.parseMedia(ttmlSegment, time);
164
166
  shaka.test.TtmlUtils.verifyHelper(
165
167
  cues, result, {startTime: 23, endTime: 53.5});
@@ -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', () => {