From c2356e398976f8a975f58acc1e8a76d93f336afd Mon Sep 17 00:00:00 2001 From: Googler Date: Fri, 5 Apr 2024 15:08:06 -0700 Subject: [PATCH] Rollback of https://github.com/androidx/media/commit/c5e894e2d63aae9d0014e01fff99b34cd5ba3ec5 PiperOrigin-RevId: 622292092 --- RELEASENOTES.md | 4 - .../DefaultRendererCapabilitiesList.java | 5 -- .../exoplayer/RendererCapabilitiesList.java | 3 - .../exoplayer/offline/DownloadHelper.java | 79 ++++--------------- .../exoplayer/offline/DownloadHelperTest.java | 32 +------- 5 files changed, 17 insertions(+), 106 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c70da553601..322d68af8cd 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -82,10 +82,6 @@ if playback is ongoing or stops the service otherwise. * UI: * Downloads: - * Ensure that `DownloadHelper` doesn't leak unreleased `Renderer` - instances, which can eventually result in an app crashing with - `IllegalStateException: Too many receivers, total of 1000, registered - for pid` ([#1224](https://github.com/androidx/media/issues/1224)). * OkHttp Extension: * Cronet Extension: * RTMP Extension: diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRendererCapabilitiesList.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRendererCapabilitiesList.java index 23b10e20006..729581eb6a5 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRendererCapabilitiesList.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/DefaultRendererCapabilitiesList.java @@ -84,11 +84,6 @@ public RendererCapabilities[] getRendererCapabilities() { return rendererCapabilities; } - @Override - public int size() { - return renderers.length; - } - @Override public void release() { for (Renderer renderer : renderers) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RendererCapabilitiesList.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RendererCapabilitiesList.java index 73c4f12741a..4ecbde15d25 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RendererCapabilitiesList.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/RendererCapabilitiesList.java @@ -31,9 +31,6 @@ interface Factory { /** Returns an array of {@link RendererCapabilities}. */ RendererCapabilities[] getRendererCapabilities(); - /** Returns the number of {@link RendererCapabilities}. */ - int size(); - /** Releases any resources associated with this {@link RendererCapabilitiesList}. */ void release(); } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java index 2c7cc364142..a44a58fe5a2 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/offline/DownloadHelper.java @@ -38,12 +38,10 @@ import androidx.media3.common.util.Util; import androidx.media3.datasource.DataSource; import androidx.media3.datasource.TransferListener; -import androidx.media3.exoplayer.DefaultRendererCapabilitiesList; import androidx.media3.exoplayer.ExoPlaybackException; import androidx.media3.exoplayer.LoadingInfo; import androidx.media3.exoplayer.Renderer; import androidx.media3.exoplayer.RendererCapabilities; -import androidx.media3.exoplayer.RendererCapabilitiesList; import androidx.media3.exoplayer.RenderersFactory; import androidx.media3.exoplayer.analytics.PlayerId; import androidx.media3.exoplayer.audio.AudioRendererEventListener; @@ -146,12 +144,12 @@ public interface Callback { public static class LiveContentUnsupportedException extends IOException {} /** - * @deprecated This method leaks un-released {@link Renderer} instances. There is no direct - * replacement. Equivalent functionality can be implemented by constructing the renderer - * instances, calling {@link Renderer#getCapabilities()} on each one, then releasing the - * renderers when the capabilities are no longer required. + * Extracts renderer capabilities for the renderers created by the provided renderers factory. + * + * @param renderersFactory A {@link RenderersFactory}. + * @return The {@link RendererCapabilities} for each renderer created by the {@code + * renderersFactory}. */ - @Deprecated public static RendererCapabilities[] getRendererCapabilities(RenderersFactory renderersFactory) { Renderer[] renderers = renderersFactory.createRenderers( @@ -276,9 +274,8 @@ public static DownloadHelper forMediaItem( mediaItem, castNonNull(dataSourceFactory), drmSessionManager), trackSelectionParameters, renderersFactory != null - ? new DefaultRendererCapabilitiesList.Factory(renderersFactory) - .createRendererCapabilitiesList() - : new UnreleaseableRendererCapabilitiesList(new RendererCapabilities[0])); + ? getRendererCapabilities(renderersFactory) + : new RendererCapabilities[0]); } /** @@ -311,7 +308,7 @@ public static MediaSource createMediaSource( private final MediaItem.LocalConfiguration localConfiguration; @Nullable private final MediaSource mediaSource; private final DefaultTrackSelector trackSelector; - private final RendererCapabilitiesList rendererCapabilities; + private final RendererCapabilities[] rendererCapabilities; private final SparseIntArray scratchSet; private final Handler callbackHandler; private final Timeline.Window window; @@ -325,26 +322,6 @@ public static MediaSource createMediaSource( private List @MonotonicNonNull [][] immutableTrackSelectionsByPeriodAndRenderer; - /** - * @deprecated The {@link Renderer} instances used to produce {@code rendererCapabilities} must be - * kept alive for the lifetime of this {@code DownloadHelper} instance and then released (to - * avoid a resource leak). Use {@link DownloadHelper#DownloadHelper(MediaItem, MediaSource, - * TrackSelectionParameters, RendererCapabilitiesList)} instead to avoid needing to manually - * manage this bookkeeping. - */ - @Deprecated - public DownloadHelper( - MediaItem mediaItem, - @Nullable MediaSource mediaSource, - TrackSelectionParameters trackSelectionParameters, - RendererCapabilities[] rendererCapabilities) { - this( - mediaItem, - mediaSource, - trackSelectionParameters, - new UnreleaseableRendererCapabilitiesList(rendererCapabilities)); - } - /** * Creates download helper. * @@ -353,14 +330,14 @@ public DownloadHelper( * selection needs to be made. * @param trackSelectionParameters {@link TrackSelectionParameters} for selecting tracks for * downloading. - * @param rendererCapabilities The {@link RendererCapabilitiesList} of the renderers for which - * tracks are selected. + * @param rendererCapabilities The {@link RendererCapabilities} of the renderers for which tracks + * are selected. */ public DownloadHelper( MediaItem mediaItem, @Nullable MediaSource mediaSource, TrackSelectionParameters trackSelectionParameters, - RendererCapabilitiesList rendererCapabilities) { + RendererCapabilities[] rendererCapabilities) { this.localConfiguration = checkNotNull(mediaItem.localConfiguration); this.mediaSource = mediaSource; this.trackSelector = @@ -394,7 +371,6 @@ public void release() { mediaPreparer.release(); } trackSelector.release(); - rendererCapabilities.release(); } /** @@ -486,7 +462,7 @@ public List getTrackSelections(int periodIndex, int rendererI */ public void clearTrackSelections(int periodIndex) { assertPreparedWithMedia(); - for (int i = 0; i < rendererCapabilities.size(); i++) { + for (int i = 0; i < rendererCapabilities.length; i++) { trackSelectionsByPeriodAndRenderer[periodIndex][i].clear(); } } @@ -545,7 +521,7 @@ public void addAudioLanguagesToSelection(String... languages) { // Prefer highest supported bitrate for downloads. parametersBuilder.setForceHighestSupportedBitrate(true); // Disable all non-audio track types supported by the renderers. - for (RendererCapabilities capabilities : rendererCapabilities.getRendererCapabilities()) { + for (RendererCapabilities capabilities : rendererCapabilities) { @C.TrackType int trackType = capabilities.getTrackType(); parametersBuilder.setTrackTypeDisabled( trackType, /* disabled= */ trackType != C.TRACK_TYPE_AUDIO); @@ -586,7 +562,7 @@ public void addTextLanguagesToSelection( // Prefer highest supported bitrate for downloads. parametersBuilder.setForceHighestSupportedBitrate(true); // Disable all non-text track types supported by the renderers. - for (RendererCapabilities capabilities : rendererCapabilities.getRendererCapabilities()) { + for (RendererCapabilities capabilities : rendererCapabilities) { @C.TrackType int trackType = capabilities.getTrackType(); parametersBuilder.setTrackTypeDisabled( trackType, /* disabled= */ trackType != C.TRACK_TYPE_TEXT); @@ -718,7 +694,7 @@ private void onMediaPrepared() throws ExoPlaybackException { checkNotNull(mediaPreparer.mediaPeriods); checkNotNull(mediaPreparer.timeline); int periodCount = mediaPreparer.mediaPeriods.length; - int rendererCount = rendererCapabilities.size(); + int rendererCount = rendererCapabilities.length; trackSelectionsByPeriodAndRenderer = (List[][]) new List[periodCount][rendererCount]; immutableTrackSelectionsByPeriodAndRenderer = @@ -786,7 +762,7 @@ private void assertPreparedWithMedia() { private TrackSelectorResult runTrackSelection(int periodIndex) throws ExoPlaybackException { TrackSelectorResult trackSelectorResult = trackSelector.selectTracks( - rendererCapabilities.getRendererCapabilities(), + rendererCapabilities, trackGroupArrays[periodIndex], new MediaPeriodId(mediaPreparer.timeline.getUidOfPeriod(periodIndex)), mediaPreparer.timeline); @@ -1090,27 +1066,4 @@ public void removeEventListener(EventListener eventListener) { // Do nothing. } } - - private static final class UnreleaseableRendererCapabilitiesList - implements RendererCapabilitiesList { - - private final RendererCapabilities[] rendererCapabilities; - - private UnreleaseableRendererCapabilitiesList(RendererCapabilities[] rendererCapabilities) { - this.rendererCapabilities = rendererCapabilities; - } - - @Override - public RendererCapabilities[] getRendererCapabilities() { - return rendererCapabilities; - } - - @Override - public int size() { - return rendererCapabilities.length; - } - - @Override - public void release() {} - } } diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/offline/DownloadHelperTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/offline/DownloadHelperTest.java index 3ddb088dc54..8d49f4f7ab6 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/offline/DownloadHelperTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/offline/DownloadHelperTest.java @@ -29,7 +29,6 @@ import androidx.media3.common.TrackGroup; import androidx.media3.common.TrackSelectionOverride; import androidx.media3.common.TrackSelectionParameters; -import androidx.media3.exoplayer.DefaultRendererCapabilitiesList; import androidx.media3.exoplayer.Renderer; import androidx.media3.exoplayer.RenderersFactory; import androidx.media3.exoplayer.offline.DownloadHelper.Callback; @@ -40,7 +39,6 @@ import androidx.media3.exoplayer.trackselection.ExoTrackSelection; import androidx.media3.exoplayer.trackselection.MappingTrackSelector.MappedTrackInfo; import androidx.media3.exoplayer.upstream.Allocator; -import androidx.media3.test.utils.FakeDataSource; import androidx.media3.test.utils.FakeMediaPeriod; import androidx.media3.test.utils.FakeMediaSource; import androidx.media3.test.utils.FakeRenderer; @@ -125,8 +123,7 @@ public void setUp() { testMediaItem, new TestMediaSource(), DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT, - new DefaultRendererCapabilitiesList.Factory(renderersFactory) - .createRendererCapabilitiesList()); + DownloadHelper.getRendererCapabilities(renderersFactory)); } @Test @@ -442,33 +439,6 @@ public void getDownloadRequest_createsDownloadRequest_withMultipleOverridesOfSam new StreamKey(/* periodIndex= */ 0, /* groupIndex= */ 2, /* streamIndex= */ 0)); } - // https://github.com/androidx/media/issues/1224 - @Test - public void prepareThenRelease_renderersReleased() throws Exception { - // We can't use this.downloadHelper because we need access to the FakeRenderer instances for - // later assertions, so we recreate a local DownloadHelper. - FakeRenderer videoRenderer = new FakeRenderer(C.TRACK_TYPE_VIDEO); - FakeRenderer audioRenderer = new FakeRenderer(C.TRACK_TYPE_AUDIO); - FakeRenderer textRenderer = new FakeRenderer(C.TRACK_TYPE_TEXT); - RenderersFactory renderersFactory = - (handler, videoListener, audioListener, metadata, text) -> - new Renderer[] {textRenderer, audioRenderer, videoRenderer}; - - DownloadHelper downloadHelper = - DownloadHelper.forMediaItem( - testMediaItem, - DownloadHelper.DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT, - renderersFactory, - new FakeDataSource.Factory()); - - prepareDownloadHelper(downloadHelper); - downloadHelper.release(); - - assertThat(videoRenderer.isReleased).isTrue(); - assertThat(audioRenderer.isReleased).isTrue(); - assertThat(textRenderer.isReleased).isTrue(); - } - private static void prepareDownloadHelper(DownloadHelper downloadHelper) throws Exception { AtomicReference prepareException = new AtomicReference<>(null); CountDownLatch preparedLatch = new CountDownLatch(1);