Skip to content

Commit d59a658

Browse files
committed
fix: Fix memory leak on Metadata and EMSG timelines
Fixes #8535
1 parent 9a17243 commit d59a658

File tree

2 files changed

+29
-9
lines changed

2 files changed

+29
-9
lines changed

lib/media/region_timeline.js

+7-7
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@ goog.require('shaka.util.Timer');
2323
*/
2424
shaka.media.RegionTimeline = class extends shaka.util.FakeEventTarget {
2525
/**
26-
* @param {!function():{start: number, end: number}} getSeekRange
26+
* @param {!function():{start: number, end: number}} getFilterRange
2727
*/
28-
constructor(getSeekRange) {
28+
constructor(getFilterRange) {
2929
super();
3030

3131
/** @private {!Map<string, T>} */
3232
this.regions_ = new Map();
3333

3434
/** @private {!function():{start: number, end: number}} */
35-
this.getSeekRange_ = getSeekRange;
35+
this.getFilterRange_ = getFilterRange;
3636

3737
/**
3838
* Make sure all of the regions we're tracking are within the
@@ -72,15 +72,15 @@ shaka.media.RegionTimeline = class extends shaka.util.FakeEventTarget {
7272
/**
7373
* @private
7474
*/
75-
filterBySeekRange_() {
76-
const seekRange = this.getSeekRange_();
75+
filterByRange_() {
76+
const filterRange = this.getFilterRange_();
7777
for (const [key, region] of this.regions_) {
7878
// Only consider the seek range start here.
7979
// Future regions might become relevant eventually,
8080
// but regions that are in the past and can't ever be
8181
// seeked to will never come up again, and there's no
8282
// reason to store or process them.
83-
if (region.endTime < seekRange.start) {
83+
if (region.endTime < filterRange.start) {
8484
this.regions_.delete(key);
8585
const event = new shaka.util.FakeEvent('regionremove', new Map([
8686
['region', region],
@@ -99,7 +99,7 @@ shaka.media.RegionTimeline = class extends shaka.util.FakeEventTarget {
9999
return;
100100
}
101101
this.filterTimer_ = new shaka.util.Timer(() => {
102-
this.filterBySeekRange_();
102+
this.filterByRange_();
103103
}).tickEvery(
104104
/* seconds= */ shaka.media.RegionTimeline.REGION_FILTER_INTERVAL);
105105
}

lib/player.js

+22-2
Original file line numberDiff line numberDiff line change
@@ -1791,8 +1791,28 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
17911791
// Make sure that the app knows of the new buffering state.
17921792
this.updateBufferState_();
17931793

1794+
const bufferRange = () => {
1795+
const bufferedInfo = this.getBufferedInfo();
1796+
const range = {
1797+
start: 0,
1798+
end: 0,
1799+
};
1800+
if (bufferedInfo.total.length) {
1801+
range.start = Infinity;
1802+
for (const buffered of bufferedInfo.total) {
1803+
if (buffered.start < range.start) {
1804+
range.start = buffered.start;
1805+
}
1806+
if (buffered.end > range.end) {
1807+
range.end = buffered.end;
1808+
}
1809+
}
1810+
}
1811+
return range;
1812+
};
1813+
17941814
this.metadataRegionTimeline_ =
1795-
new shaka.media.RegionTimeline(() => this.seekRange());
1815+
new shaka.media.RegionTimeline(bufferRange);
17961816

17971817
if (shouldUseSrcEquals) {
17981818
await mutexWrapOperation(async () => {
@@ -1805,7 +1825,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
18051825
}, 'srcEqualsInner_');
18061826
} else {
18071827
this.emsgRegionTimeline_ =
1808-
new shaka.media.RegionTimeline(() => this.seekRange());
1828+
new shaka.media.RegionTimeline(bufferRange);
18091829
// Wait for the manifest to be parsed.
18101830
await mutexWrapOperation(async () => {
18111831
await preloadManager.waitForManifest();

0 commit comments

Comments
 (0)