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:
andrewlewis 2017-10-18 05:59:14 -07:00 committed by Oliver Woodman
parent fc5e8ee516
commit 1e79d6eb84
3 changed files with 19 additions and 1 deletions

View File

@ -261,6 +261,22 @@ public final class ExoPlayerTest extends TestCase {
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 {
Timeline timeline = new FakeTimeline(
new TimelineWindowDefinition(true, false, 100000),

View File

@ -753,7 +753,8 @@ import java.io.IOException;
// Clear the timeline, but keep the requested period if it is already prepared.
MediaPeriodHolder periodHolder = playingPeriodHolder;
while (periodHolder != null) {
if (shouldKeepPeriodHolder(periodId, periodPositionUs, periodHolder)) {
if (newPlayingPeriodHolder == null
&& shouldKeepPeriodHolder(periodId, periodPositionUs, periodHolder)) {
newPlayingPeriodHolder = periodHolder;
} else {
periodHolder.release();

View File

@ -116,4 +116,5 @@ public class FakeMediaSource implements MediaSource {
}
return new TrackGroupArray(trackGroups);
}
}