Skip to content

Commit c8c7ec6

Browse files
christostsicbaker
authored andcommitted
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
1 parent e651812 commit c8c7ec6

File tree

5 files changed

+52
-11
lines changed

5 files changed

+52
-11
lines changed

Diff for: libraries/exoplayer/src/main/java/androidx/media3/exoplayer/ExoPlayerImpl.java

+1
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,7 @@ public void release() {
980980
playbackInfo.bufferedPositionUs = playbackInfo.positionUs;
981981
playbackInfo.totalBufferedDurationUs = 0;
982982
analyticsCollector.release();
983+
trackSelector.release();
983984
removeSurfaceCallbacks();
984985
if (ownedSurface != null) {
985986
ownedSurface.release();

Diff for: libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java

+1
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,7 @@ public void release() {
516516
if (mediaPreparer != null) {
517517
mediaPreparer.release();
518518
}
519+
trackSelector.release();
519520
}
520521

521522
/**

Diff for: libraries/exoplayer/src/main/java/androidx/media3/exoplayer/trackselection/TrackSelector.java

+17-3
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515
*/
1616
package androidx.media3.exoplayer.trackselection;
1717

18+
import static androidx.media3.common.util.Assertions.checkStateNotNull;
19+
1820
import androidx.annotation.Nullable;
21+
import androidx.media3.common.Player;
1922
import androidx.media3.common.Timeline;
2023
import androidx.media3.common.TrackSelectionParameters;
21-
import androidx.media3.common.util.Assertions;
2224
import androidx.media3.common.util.UnstableApi;
2325
import androidx.media3.exoplayer.ExoPlaybackException;
2426
import androidx.media3.exoplayer.ExoPlayer;
@@ -65,6 +67,8 @@
6567
* track selection for the currently playing period differs from the one that was invalidated.
6668
* Implementing subclasses can trigger invalidation by calling {@link #invalidate()}, which
6769
* will call {@link InvalidationListener#onTrackSelectionsInvalidated()}.
70+
* <li>When the player is {@linkplain Player#release() released}, it will release the track
71+
* selector by calling {@link #release()}.
6872
* </ul>
6973
*
7074
* <h2>Renderer configuration</h2>
@@ -113,6 +117,15 @@ public final void init(InvalidationListener listener, BandwidthMeter bandwidthMe
113117
this.bandwidthMeter = bandwidthMeter;
114118
}
115119

120+
/**
121+
* Called by the player to release the selector. The selector cannot be used until {@link
122+
* #init(InvalidationListener, BandwidthMeter)} is called again.
123+
*/
124+
public final void release() {
125+
this.listener = null;
126+
this.bandwidthMeter = null;
127+
}
128+
116129
/**
117130
* Called by the player to perform a track selection.
118131
*
@@ -177,9 +190,10 @@ protected final void invalidate() {
177190

178191
/**
179192
* Returns a bandwidth meter which can be used by track selections to select tracks. Must only be
180-
* called after {@link #init(InvalidationListener, BandwidthMeter)} has been called.
193+
* called when the track selector is {@linkplain #init(InvalidationListener, BandwidthMeter)
194+
* initialized}.
181195
*/
182196
protected final BandwidthMeter getBandwidthMeter() {
183-
return Assertions.checkNotNull(bandwidthMeter);
197+
return checkStateNotNull(bandwidthMeter);
184198
}
185199
}

Diff for: libraries/exoplayer/src/test/java/androidx/media3/exoplayer/trackselection/DefaultTrackSelectorTest.java

+6
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import com.google.common.collect.ImmutableSet;
6363
import java.util.HashMap;
6464
import java.util.Map;
65+
import org.junit.After;
6566
import org.junit.Before;
6667
import org.junit.BeforeClass;
6768
import org.junit.Test;
@@ -146,6 +147,11 @@ public void setUp() {
146147
trackSelector.init(invalidationListener, bandwidthMeter);
147148
}
148149

150+
@After
151+
public void tearDown() {
152+
trackSelector.release();
153+
}
154+
149155
@Test
150156
public void parameters_buildUponThenBuild_isEqual() {
151157
Parameters parameters = buildParametersForEqualsTest();

Diff for: libraries/exoplayer/src/test/java/androidx/media3/exoplayer/trackselection/TrackSelectorTest.java

+27-8
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
package androidx.media3.exoplayer.trackselection;
1717

1818
import static com.google.common.truth.Truth.assertThat;
19-
import static org.junit.Assert.fail;
19+
import static org.junit.Assert.assertThrows;
2020

2121
import androidx.annotation.Nullable;
2222
import androidx.media3.common.Timeline;
@@ -59,12 +59,7 @@ public void onSelectionActivated(@Nullable Object info) {}
5959

6060
@Test
6161
public void getBandwidthMeter_beforeInitialization_throwsException() {
62-
try {
63-
trackSelector.getBandwidthMeter();
64-
fail();
65-
} catch (Exception e) {
66-
// Expected.
67-
}
62+
assertThrows(IllegalStateException.class, () -> trackSelector.getBandwidthMeter());
6863
}
6964

7065
@Test
@@ -73,6 +68,30 @@ public void getBandwidthMeter_afterInitialization_returnsProvidedBandwidthMeter(
7368
BandwidthMeter bandwidthMeter = Mockito.mock(BandwidthMeter.class);
7469
trackSelector.init(invalidationListener, bandwidthMeter);
7570

76-
assertThat(trackSelector.getBandwidthMeter()).isEqualTo(bandwidthMeter);
71+
assertThat(trackSelector.getBandwidthMeter()).isSameInstanceAs(bandwidthMeter);
72+
}
73+
74+
@Test
75+
public void getBandwidthMeter_afterRelease_throwsException() {
76+
InvalidationListener invalidationListener = Mockito.mock(InvalidationListener.class);
77+
BandwidthMeter bandwidthMeter = Mockito.mock(BandwidthMeter.class);
78+
trackSelector.init(invalidationListener, bandwidthMeter);
79+
80+
trackSelector.release();
81+
82+
assertThrows(IllegalStateException.class, () -> trackSelector.getBandwidthMeter());
83+
}
84+
85+
@Test
86+
public void initialize_afterRelease() {
87+
InvalidationListener invalidationListener = Mockito.mock(InvalidationListener.class);
88+
BandwidthMeter bandwidthMeter = Mockito.mock(BandwidthMeter.class);
89+
trackSelector.init(invalidationListener, bandwidthMeter);
90+
91+
trackSelector.release();
92+
BandwidthMeter anotherBandwidthMeter = Mockito.mock(BandwidthMeter.class);
93+
trackSelector.init(invalidationListener, anotherBandwidthMeter);
94+
95+
assertThat(trackSelector.getBandwidthMeter()).isSameInstanceAs(anotherBandwidthMeter);
7796
}
7897
}

0 commit comments

Comments
 (0)