Commit e62338e8 by christosts Committed by Ian Baker

Add TrackSelector.release()

The TrackSelector is released when the player is released. The
TrackSelector can be reused if TrackSelector.init() is called again.

PiperOrigin-RevId: 446439717
parent ee3a1830
...@@ -969,6 +969,7 @@ import java.util.concurrent.TimeoutException; ...@@ -969,6 +969,7 @@ import java.util.concurrent.TimeoutException;
playbackInfo.bufferedPositionUs = playbackInfo.positionUs; playbackInfo.bufferedPositionUs = playbackInfo.positionUs;
playbackInfo.totalBufferedDurationUs = 0; playbackInfo.totalBufferedDurationUs = 0;
analyticsCollector.release(); analyticsCollector.release();
trackSelector.release();
removeSurfaceCallbacks(); removeSurfaceCallbacks();
if (ownedSurface != null) { if (ownedSurface != null) {
ownedSurface.release(); ownedSurface.release();
......
...@@ -513,6 +513,7 @@ public final class DownloadHelper { ...@@ -513,6 +513,7 @@ public final class DownloadHelper {
if (mediaPreparer != null) { if (mediaPreparer != null) {
mediaPreparer.release(); mediaPreparer.release();
} }
trackSelector.release();
} }
/** /**
......
...@@ -15,9 +15,12 @@ ...@@ -15,9 +15,12 @@
*/ */
package com.google.android.exoplayer2.trackselection; package com.google.android.exoplayer2.trackselection;
import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.ExoPlaybackException; import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.Renderer;
import com.google.android.exoplayer2.RendererCapabilities; import com.google.android.exoplayer2.RendererCapabilities;
import com.google.android.exoplayer2.RendererConfiguration; import com.google.android.exoplayer2.RendererConfiguration;
...@@ -25,7 +28,6 @@ import com.google.android.exoplayer2.Timeline; ...@@ -25,7 +28,6 @@ import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.BandwidthMeter;
import com.google.android.exoplayer2.util.Assertions;
/** /**
* The component of an {@link ExoPlayer} responsible for selecting tracks to be consumed by each of * The component of an {@link ExoPlayer} responsible for selecting tracks to be consumed by each of
...@@ -63,6 +65,8 @@ import com.google.android.exoplayer2.util.Assertions; ...@@ -63,6 +65,8 @@ import com.google.android.exoplayer2.util.Assertions;
* track selection for the currently playing period differs from the one that was invalidated. * track selection for the currently playing period differs from the one that was invalidated.
* Implementing subclasses can trigger invalidation by calling {@link #invalidate()}, which * Implementing subclasses can trigger invalidation by calling {@link #invalidate()}, which
* will call {@link InvalidationListener#onTrackSelectionsInvalidated()}. * will call {@link InvalidationListener#onTrackSelectionsInvalidated()}.
* <li>When the player is {@linkplain Player#release() released}, it will release the track
* selector by calling {@link #release()}.
* </ul> * </ul>
* *
* <h2>Renderer configuration</h2> * <h2>Renderer configuration</h2>
...@@ -111,6 +115,15 @@ public abstract class TrackSelector { ...@@ -111,6 +115,15 @@ public abstract class TrackSelector {
} }
/** /**
* Called by the player to release the selector. The selector cannot be used until {@link
* #init(InvalidationListener, BandwidthMeter)} is called again.
*/
public final void release() {
this.listener = null;
this.bandwidthMeter = null;
}
/**
* Called by the player to perform a track selection. * Called by the player to perform a track selection.
* *
* @param rendererCapabilities The {@link RendererCapabilities} of the renderers for which tracks * @param rendererCapabilities The {@link RendererCapabilities} of the renderers for which tracks
...@@ -174,9 +187,10 @@ public abstract class TrackSelector { ...@@ -174,9 +187,10 @@ public abstract class TrackSelector {
/** /**
* Returns a bandwidth meter which can be used by track selections to select tracks. Must only be * Returns a bandwidth meter which can be used by track selections to select tracks. Must only be
* called after {@link #init(InvalidationListener, BandwidthMeter)} has been called. * called when the track selector is {@linkplain #init(InvalidationListener, BandwidthMeter)
* initialized}.
*/ */
protected final BandwidthMeter getBandwidthMeter() { protected final BandwidthMeter getBandwidthMeter() {
return Assertions.checkNotNull(bandwidthMeter); return checkStateNotNull(bandwidthMeter);
} }
} }
...@@ -61,6 +61,7 @@ import com.google.common.collect.ImmutableMap; ...@@ -61,6 +61,7 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.BeforeClass; import org.junit.BeforeClass;
import org.junit.Test; import org.junit.Test;
...@@ -145,6 +146,11 @@ public final class DefaultTrackSelectorTest { ...@@ -145,6 +146,11 @@ public final class DefaultTrackSelectorTest {
trackSelector.init(invalidationListener, bandwidthMeter); trackSelector.init(invalidationListener, bandwidthMeter);
} }
@After
public void tearDown() {
trackSelector.release();
}
@Test @Test
public void parameters_buildUponThenBuild_isEqual() { public void parameters_buildUponThenBuild_isEqual() {
Parameters parameters = buildParametersForEqualsTest(); Parameters parameters = buildParametersForEqualsTest();
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
package com.google.android.exoplayer2.trackselection; package com.google.android.exoplayer2.trackselection;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.fail; import static org.junit.Assert.assertThrows;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
...@@ -59,12 +59,7 @@ public class TrackSelectorTest { ...@@ -59,12 +59,7 @@ public class TrackSelectorTest {
@Test @Test
public void getBandwidthMeter_beforeInitialization_throwsException() { public void getBandwidthMeter_beforeInitialization_throwsException() {
try { assertThrows(IllegalStateException.class, () -> trackSelector.getBandwidthMeter());
trackSelector.getBandwidthMeter();
fail();
} catch (Exception e) {
// Expected.
}
} }
@Test @Test
...@@ -73,6 +68,30 @@ public class TrackSelectorTest { ...@@ -73,6 +68,30 @@ public class TrackSelectorTest {
BandwidthMeter bandwidthMeter = Mockito.mock(BandwidthMeter.class); BandwidthMeter bandwidthMeter = Mockito.mock(BandwidthMeter.class);
trackSelector.init(invalidationListener, bandwidthMeter); trackSelector.init(invalidationListener, bandwidthMeter);
assertThat(trackSelector.getBandwidthMeter()).isEqualTo(bandwidthMeter); assertThat(trackSelector.getBandwidthMeter()).isSameInstanceAs(bandwidthMeter);
}
@Test
public void getBandwidthMeter_afterRelease_throwsException() {
InvalidationListener invalidationListener = Mockito.mock(InvalidationListener.class);
BandwidthMeter bandwidthMeter = Mockito.mock(BandwidthMeter.class);
trackSelector.init(invalidationListener, bandwidthMeter);
trackSelector.release();
assertThrows(IllegalStateException.class, () -> trackSelector.getBandwidthMeter());
}
@Test
public void initialize_afterRelease() {
InvalidationListener invalidationListener = Mockito.mock(InvalidationListener.class);
BandwidthMeter bandwidthMeter = Mockito.mock(BandwidthMeter.class);
trackSelector.init(invalidationListener, bandwidthMeter);
trackSelector.release();
BandwidthMeter anotherBandwidthMeter = Mockito.mock(BandwidthMeter.class);
trackSelector.init(invalidationListener, anotherBandwidthMeter);
assertThat(trackSelector.getBandwidthMeter()).isSameInstanceAs(anotherBandwidthMeter);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment