Fix seeking with repeated periods
newPlayingPeriodHolder could be set then updated if seeking to a repeated period that was loaded more than once. This led to MediaPeriodHolders leaking. Only set newPlayingPeriodHolder once so that any later holders with the same period identifier get released. Also add a regression test. FakeMediaSource checks that all created MediaPeriods were released when it is released. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=172591937
This commit is contained in:
parent
fc5e8ee516
commit
1e79d6eb84
@ -261,6 +261,22 @@ public final class ExoPlayerTest extends TestCase {
|
|||||||
assertTrue(renderer.isEnded);
|
assertTrue(renderer.isEnded);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testPeriodHoldersReleasedAfterSeekWithRepeatModeAll() throws Exception {
|
||||||
|
Timeline fakeTimeline = new FakeTimeline(new TimelineWindowDefinition(true, false, 100000));
|
||||||
|
FakeRenderer renderer = new FakeRenderer(Builder.VIDEO_FORMAT);
|
||||||
|
ActionSchedule actionSchedule = new ActionSchedule.Builder("testPeriodHoldersReleased")
|
||||||
|
.setRepeatMode(Player.REPEAT_MODE_ALL)
|
||||||
|
.waitForPositionDiscontinuity()
|
||||||
|
.seek(0) // Seek with repeat mode set to REPEAT_MODE_ALL.
|
||||||
|
.waitForPositionDiscontinuity()
|
||||||
|
.setRepeatMode(Player.REPEAT_MODE_OFF) // Turn off repeat so that playback can finish.
|
||||||
|
.build();
|
||||||
|
new ExoPlayerTestRunner.Builder()
|
||||||
|
.setTimeline(fakeTimeline).setRenderers(renderer).setActionSchedule(actionSchedule)
|
||||||
|
.build().start().blockUntilEnded(TIMEOUT_MS);
|
||||||
|
assertTrue(renderer.isEnded);
|
||||||
|
}
|
||||||
|
|
||||||
public void testSeekProcessedCallback() throws Exception {
|
public void testSeekProcessedCallback() throws Exception {
|
||||||
Timeline timeline = new FakeTimeline(
|
Timeline timeline = new FakeTimeline(
|
||||||
new TimelineWindowDefinition(true, false, 100000),
|
new TimelineWindowDefinition(true, false, 100000),
|
||||||
|
@ -753,7 +753,8 @@ import java.io.IOException;
|
|||||||
// Clear the timeline, but keep the requested period if it is already prepared.
|
// Clear the timeline, but keep the requested period if it is already prepared.
|
||||||
MediaPeriodHolder periodHolder = playingPeriodHolder;
|
MediaPeriodHolder periodHolder = playingPeriodHolder;
|
||||||
while (periodHolder != null) {
|
while (periodHolder != null) {
|
||||||
if (shouldKeepPeriodHolder(periodId, periodPositionUs, periodHolder)) {
|
if (newPlayingPeriodHolder == null
|
||||||
|
&& shouldKeepPeriodHolder(periodId, periodPositionUs, periodHolder)) {
|
||||||
newPlayingPeriodHolder = periodHolder;
|
newPlayingPeriodHolder = periodHolder;
|
||||||
} else {
|
} else {
|
||||||
periodHolder.release();
|
periodHolder.release();
|
||||||
|
@ -116,4 +116,5 @@ public class FakeMediaSource implements MediaSource {
|
|||||||
}
|
}
|
||||||
return new TrackGroupArray(trackGroups);
|
return new TrackGroupArray(trackGroups);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user