shaka-player 4.2.6 → 4.2.7

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 (37) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/deps.js +1 -1
  3. package/dist/locales.js +32 -32
  4. package/dist/shaka-player.compiled.d.ts +10 -0
  5. package/dist/shaka-player.compiled.debug.d.ts +10 -0
  6. package/dist/shaka-player.compiled.debug.externs.js +12 -0
  7. package/dist/shaka-player.compiled.debug.js +144 -139
  8. package/dist/shaka-player.compiled.debug.map +3 -3
  9. package/dist/shaka-player.compiled.externs.js +12 -0
  10. package/dist/shaka-player.compiled.js +384 -381
  11. package/dist/shaka-player.compiled.map +3 -3
  12. package/dist/shaka-player.ui.d.ts +10 -0
  13. package/dist/shaka-player.ui.debug.d.ts +10 -0
  14. package/dist/shaka-player.ui.debug.externs.js +12 -0
  15. package/dist/shaka-player.ui.debug.js +156 -152
  16. package/dist/shaka-player.ui.debug.map +3 -3
  17. package/dist/shaka-player.ui.externs.js +12 -0
  18. package/dist/shaka-player.ui.js +495 -493
  19. package/dist/shaka-player.ui.map +3 -3
  20. package/lib/hls/hls_parser.js +52 -15
  21. package/lib/media/media_source_engine.js +34 -4
  22. package/lib/media/segment_index.js +5 -10
  23. package/lib/media/segment_reference.js +39 -0
  24. package/lib/media/streaming_engine.js +15 -3
  25. package/lib/player.js +7 -1
  26. package/lib/text/ui_text_displayer.js +24 -4
  27. package/lib/text/web_vtt_generator.js +21 -9
  28. package/lib/util/dom_utils.js +3 -1
  29. package/lib/util/stream_utils.js +6 -0
  30. package/lib/util/timer.js +17 -0
  31. package/package.json +1 -1
  32. package/test/hls/hls_live_unit.js +8 -30
  33. package/test/hls/hls_parser_unit.js +30 -0
  34. package/test/media/segment_index_unit.js +28 -0
  35. package/test/player_integration.js +27 -0
  36. package/test/player_unit.js +4 -2
  37. package/test/text/ui_text_displayer_unit.js +70 -0
@@ -532,6 +532,34 @@ describe('SegmentIndex', /** @suppress {accessControls} */ () => {
532
532
  goog.asserts.assert(position1 != null, 'Position should not be null!');
533
533
  expect(index1.get(position1)).toBe(references2[1]);
534
534
  });
535
+
536
+ it('does not duplicate references with rounding errors', () => {
537
+ /** @type {!Array.<!shaka.media.SegmentReference>} */
538
+ const references1 = [
539
+ makeReference(uri(10), 10, 20),
540
+ makeReference(uri(20), 20, 30),
541
+ ];
542
+ const index1 = new shaka.media.SegmentIndex(references1);
543
+
544
+ // 0.24 microseconds: an insignificant rounding error.
545
+ const tinyError = 0.24e-6;
546
+
547
+ /** @type {!Array.<!shaka.media.SegmentReference>} */
548
+ const references2 = [
549
+ makeReference(uri(10), 10, 20),
550
+ // The difference between this and the equivalent old reference is an
551
+ // insignificant rounding error.
552
+ makeReference(uri(20), 20 + tinyError, 30 + tinyError),
553
+ makeReference(uri(30), 30 + tinyError, 40),
554
+ ];
555
+
556
+ index1.merge(references2);
557
+ expect(index1.references.length).toBe(3);
558
+ expect(index1.references[0]).toEqual(references1[0]);
559
+ // The new references replaced the old one.
560
+ expect(index1.references[1]).toEqual(references2[1]);
561
+ expect(index1.references[2]).toEqual(references2[2]);
562
+ });
535
563
  });
536
564
 
537
565
  describe('evict', () => {
@@ -72,6 +72,33 @@ describe('Player', () => {
72
72
  });
73
73
  }); // describe('attach')
74
74
 
75
+ describe('destroy', () => {
76
+ // Regression test for:
77
+ // https://github.com/shaka-project/shaka-player/issues/4850
78
+ it('does not leave any lingering timers', async () => {
79
+ shaka.util.Timer.activeTimers.clear();
80
+
81
+ // Unlike the other tests in this file, this uses an uncompiled build of
82
+ // Shaka, so that we don't need to expose shaka.util.Timer.activeTimers.
83
+ player = new shaka.Player(video);
84
+ waiter.setPlayer(player);
85
+
86
+ // Play the video for a little while.
87
+ await player.load('test:sintel');
88
+ video.play();
89
+ await waiter.waitUntilPlayheadReachesOrFailOnTimeout(video, 1, 10);
90
+
91
+ // Destroy the player.
92
+ await player.destroy();
93
+
94
+ // Are there any timers left?
95
+ for (const timer of shaka.util.Timer.activeTimers.keys()) {
96
+ const stackTrace = shaka.util.Timer.activeTimers.get(timer);
97
+ fail('Lingering timer exists! Stack trace of creation: ' + stackTrace);
98
+ }
99
+ });
100
+ });
101
+
75
102
  describe('updateStartTime() in manifestparsed event handler', () => {
76
103
  it('does not get segments prior to startTime', async () => {
77
104
  player.addEventListener('manifestparsed', () => {
@@ -3390,7 +3390,9 @@ describe('Player', () => {
3390
3390
  variant.addAudio(0, (stream) => {
3391
3391
  stream.channelsCount = 6;
3392
3392
  stream.audioSamplingRate = 48000;
3393
- stream.codecs = 'ac-3';
3393
+ // ac-3 is rewritten as ec-3 on Tizen, so for the stability of this
3394
+ // test case, use ec-3.
3395
+ stream.codecs = 'ec-3';
3394
3396
  });
3395
3397
  });
3396
3398
 
@@ -3415,7 +3417,7 @@ describe('Player', () => {
3415
3417
  expect(abrManager.variants.length).toBe(1);
3416
3418
  // It should be the 6-channel variant, based on our preference.
3417
3419
  expect(abrManager.variants[0].audio.channelsCount).toBe(6);
3418
- expect(abrManager.variants[0].audio.codecs).toBe('ac-3');
3420
+ expect(abrManager.variants[0].audio.codecs).toBe('ec-3');
3419
3421
  });
3420
3422
  });
3421
3423
 
@@ -537,4 +537,74 @@ describe('UITextDisplayer', () => {
537
537
  '.shaka-text-region');
538
538
  expect(allRegionElements.length).toBe(1);
539
539
  });
540
+
541
+ it('creates separate regions when dimensions differ but id same', () => {
542
+ const identicalRegionId = 'regionId';
543
+
544
+ const cueRegion1 = new shaka.text.CueRegion();
545
+ const cueRegion2 = new shaka.text.CueRegion();
546
+ cueRegion1.id = identicalRegionId;
547
+ cueRegion2.id = identicalRegionId;
548
+
549
+ cueRegion1.height = 80;
550
+ cueRegion1.heightUnits = shaka.text.CueRegion.units.PERCENTAGE;
551
+ cueRegion1.width = 80;
552
+ cueRegion1.widthUnits = shaka.text.CueRegion.units.PERCENTAGE;
553
+
554
+ cueRegion2.height = 160; // the only difference!
555
+ cueRegion2.heightUnits = shaka.text.CueRegion.units.PERCENTAGE;
556
+ cueRegion2.width = 80;
557
+ cueRegion2.widthUnits = shaka.text.CueRegion.units.PERCENTAGE;
558
+
559
+ cueRegion1.viewportAnchorX = 10;
560
+ cueRegion1.viewportAnchorY = 10;
561
+ cueRegion1.viewportAnchorUnits = shaka.text.CueRegion.units.PERCENTAGE;
562
+
563
+ cueRegion2.viewportAnchorX = 10;
564
+ cueRegion2.viewportAnchorY = 10;
565
+ cueRegion2.viewportAnchorUnits = shaka.text.CueRegion.units.PERCENTAGE;
566
+
567
+ // These all attach to the same region, but only one region element should
568
+ // be created.
569
+ const firstBatchOfCues = [
570
+ new shaka.text.Cue(0, 100, ''),
571
+ new shaka.text.Cue(0, 100, ''),
572
+ new shaka.text.Cue(0, 100, ''),
573
+ ];
574
+ for (const cue of firstBatchOfCues) {
575
+ cue.displayAlign = shaka.text.Cue.displayAlign.CENTER;
576
+ cue.region = cueRegion1;
577
+ }
578
+
579
+ // Another batch for the other region
580
+ const secondBatchOfCues = [
581
+ new shaka.text.Cue(0, 100, ''),
582
+ new shaka.text.Cue(0, 100, ''),
583
+ new shaka.text.Cue(0, 100, ''),
584
+ ];
585
+ for (const cue of secondBatchOfCues) {
586
+ cue.displayAlign = shaka.text.Cue.displayAlign.CENTER;
587
+ cue.region = cueRegion2;
588
+ }
589
+
590
+ textDisplayer.setTextVisibility(true);
591
+ textDisplayer.append(firstBatchOfCues);
592
+ textDisplayer.append(secondBatchOfCues);
593
+ updateCaptions();
594
+
595
+ const textContainer = videoContainer.querySelector('.shaka-text-container');
596
+ const allRegionElements = textContainer.querySelectorAll(
597
+ '.shaka-text-region');
598
+
599
+ // Verify that the nested cues are attached to respective region element.
600
+ expect(allRegionElements.length).toBe(2);
601
+
602
+ const childrenOfOne = Array.from(allRegionElements[0].childNodes).filter(
603
+ (e) => e.nodeType == Node.ELEMENT_NODE);
604
+ expect(childrenOfOne.length).toBe(3);
605
+
606
+ const childrenOfTwo = Array.from(allRegionElements[1].childNodes).filter(
607
+ (e) => e.nodeType == Node.ELEMENT_NODE);
608
+ expect(childrenOfTwo.length).toBe(3);
609
+ });
540
610
  });