From 98afaa60d05a1ac9645acf774ca222d68cc84f20 Mon Sep 17 00:00:00 2001 From: tonihei Date: Fri, 29 Jun 2018 07:29:02 -0700 Subject: [PATCH] Forward TransferListener to media sources. In the future, this allows to register the BandwidthMeter (managed by the player) as a listener to all media transfers related to this media source. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=202643946 --- RELEASENOTES.md | 11 +++++--- .../exoplayer2/ext/ima/ImaAdsMediaSource.java | 9 +++++-- .../exoplayer2/ExoPlayerImplInternal.java | 6 ++++- .../exoplayer2/source/BaseMediaSource.java | 25 +++++++++++++------ .../source/ClippingMediaSource.java | 8 ++++-- .../source/CompositeMediaSource.java | 13 ++++++++-- .../source/ConcatenatingMediaSource.java | 8 ++++-- .../source/ExtractorMediaSource.java | 6 ++++- .../exoplayer2/source/LoopingMediaSource.java | 8 ++++-- .../exoplayer2/source/MediaSource.java | 12 +++++++-- .../exoplayer2/source/MergingMediaSource.java | 8 ++++-- .../source/SingleSampleMediaSource.java | 6 ++++- .../exoplayer2/source/ads/AdsMediaSource.java | 8 ++++-- .../android/exoplayer2/ExoPlayerTest.java | 8 ++++-- .../source/dash/DashMediaSource.java | 6 ++++- .../exoplayer2/source/hls/HlsMediaSource.java | 6 ++++- .../source/smoothstreaming/SsMediaSource.java | 6 ++++- .../exoplayer2/testutil/FakeMediaSource.java | 6 ++++- .../testutil/MediaSourceTestRunner.java | 6 ++++- 19 files changed, 129 insertions(+), 37 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5cfd267ada..ca3a0f40de 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -18,8 +18,13 @@ * Add support for lazy preparation of playlist media sources in `ConcatenatingMediaSource` ([#3972](https://github.com/google/ExoPlayer/issues/3972)). -* Pass `BandwidthMeter` to `TrackSelection.Factory` which can be used to obtain - bandwidth estimates in the future. Always null at the moment. +* `BandwidthMeter` management (work in progress): + * Pass `BandwidthMeter` to `TrackSelection.Factory` which can be used to + obtain bandwidth estimates in the future. Always null at the moment. + * Add method to `BandwidthMeter` to return the `TransferListener` used to + gather bandwidth information. + * Pass `TransferListener` to `MediaSource`s to listen to media data transfers. + Always null at the moment. * Error handling: * Allow configuration of the Loader retry delay ([#3370](https://github.com/google/ExoPlayer/issues/3370)). @@ -29,8 +34,6 @@ * DRM: * Allow DrmInitData to carry a license server URL ([#3393](https://github.com/google/ExoPlayer/issues/3393)). -* Add method to `BandwidthMeter` to return the `TransferListener` used to gather - bandwidth information. * Add callback to `VideoListener` to notify of surface size changes. * Fix bug when reporting buffered position for multi-period windows and add two additional convenience methods `Player.getTotalBufferedDuration` and diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsMediaSource.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsMediaSource.java index 19ee3fe10b..4cae22487a 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsMediaSource.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsMediaSource.java @@ -27,6 +27,7 @@ import com.google.android.exoplayer2.source.MediaSource.SourceInfoRefreshListene import com.google.android.exoplayer2.source.ads.AdsMediaSource; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.TransferListener; import java.io.IOException; /** @@ -76,8 +77,12 @@ public final class ImaAdsMediaSource extends BaseMediaSource implements SourceIn } @Override - public void prepareSourceInternal(final ExoPlayer player, boolean isTopLevelSource) { - adsMediaSource.prepareSource(player, isTopLevelSource, /* listener= */ this); + public void prepareSourceInternal( + final ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { + adsMediaSource.prepareSource( + player, isTopLevelSource, /* listener= */ this, mediaTransferListener); } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index 817539bea4..a566653963 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -393,7 +393,11 @@ import java.util.Collections; loadControl.onPrepared(); this.mediaSource = mediaSource; setState(Player.STATE_BUFFERING); - mediaSource.prepareSource(player, /* isTopLevelSource= */ true, /* listener= */ this); + mediaSource.prepareSource( + player, + /* isTopLevelSource= */ true, + /* listener= */ this, + /* mediaTransferListener= */ null); handler.sendEmptyMessage(MSG_DO_SOME_WORK); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/BaseMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/BaseMediaSource.java index 32526361f5..c9b7968bc5 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/BaseMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/BaseMediaSource.java @@ -19,6 +19,7 @@ import android.os.Handler; import android.support.annotation.Nullable; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import java.util.ArrayList; @@ -34,9 +35,9 @@ public abstract class BaseMediaSource implements MediaSource { private final ArrayList sourceInfoListeners; private final MediaSourceEventListener.EventDispatcher eventDispatcher; - private ExoPlayer player; - private Timeline timeline; - private Object manifest; + private @Nullable ExoPlayer player; + private @Nullable Timeline timeline; + private @Nullable Object manifest; public BaseMediaSource() { sourceInfoListeners = new ArrayList<>(/* initialCapacity= */ 1); @@ -51,12 +52,19 @@ public abstract class BaseMediaSource implements MediaSource { * @param isTopLevelSource Whether this source has been passed directly to {@link * ExoPlayer#prepare(MediaSource)} or {@link ExoPlayer#prepare(MediaSource, boolean, * boolean)}. + * @param mediaTransferListener The transfer listener which should be informed of any media data + * transfers. May be null if no listener is available. Note that this listener should usually + * be only informed of transfers related to the media loads and not of auxiliary loads for + * manifests and other data. */ - protected abstract void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource); + protected abstract void prepareSourceInternal( + ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener); /** * Releases the source. This method is called exactly once after each call to {@link - * #prepareSourceInternal(ExoPlayer, boolean)}. + * #prepareSourceInternal(ExoPlayer, boolean, TransferListener)}. */ protected abstract void releaseSourceInternal(); @@ -129,12 +137,15 @@ public abstract class BaseMediaSource implements MediaSource { @Override public final void prepareSource( - ExoPlayer player, boolean isTopLevelSource, SourceInfoRefreshListener listener) { + ExoPlayer player, + boolean isTopLevelSource, + SourceInfoRefreshListener listener, + @Nullable TransferListener mediaTransferListener) { Assertions.checkArgument(this.player == null || this.player == player); sourceInfoListeners.add(listener); if (this.player == null) { this.player = player; - prepareSourceInternal(player, isTopLevelSource); + prepareSourceInternal(player, isTopLevelSource, mediaTransferListener); } else if (timeline != null) { listener.onSourceInfoRefreshed(/* source= */ this, timeline, manifest); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java index f633dd8f15..a6c34b643f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ClippingMediaSource.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import java.io.IOException; import java.lang.annotation.Retention; @@ -211,8 +212,11 @@ public final class ClippingMediaSource extends CompositeMediaSource { } @Override - public void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource) { - super.prepareSourceInternal(player, isTopLevelSource); + public void prepareSourceInternal( + ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { + super.prepareSourceInternal(player, isTopLevelSource, mediaTransferListener); prepareChildSource(/* id= */ null, mediaSource); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java index c36cc1e26a..9ef655c7ed 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/CompositeMediaSource.java @@ -21,6 +21,7 @@ import android.support.annotation.Nullable; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.MediaSourceEventListener.MediaLoadData; +import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.io.IOException; @@ -37,6 +38,7 @@ public abstract class CompositeMediaSource extends BaseMediaSource { private @Nullable ExoPlayer player; private @Nullable Handler eventHandler; + private @Nullable TransferListener mediaTransferListener; /** Create composite media source without child sources. */ protected CompositeMediaSource() { @@ -45,8 +47,12 @@ public abstract class CompositeMediaSource extends BaseMediaSource { @Override @CallSuper - public void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource) { + public void prepareSourceInternal( + ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { this.player = player; + this.mediaTransferListener = mediaTransferListener; eventHandler = new Handler(); } @@ -107,7 +113,10 @@ public abstract class CompositeMediaSource extends BaseMediaSource { childSources.put(id, new MediaSourceAndListener(mediaSource, sourceListener, eventListener)); mediaSource.addEventListener(Assertions.checkNotNull(eventHandler), eventListener); mediaSource.prepareSource( - Assertions.checkNotNull(player), /* isTopLevelSource= */ false, sourceListener); + Assertions.checkNotNull(player), + /* isTopLevelSource= */ false, + sourceListener, + mediaTransferListener); } /** diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java index 680eea6a3e..1a47390698 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ConcatenatingMediaSource.java @@ -26,6 +26,7 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.ConcatenatingMediaSource.MediaSourceHolder; import com.google.android.exoplayer2.source.ShuffleOrder.DefaultShuffleOrder; import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.util.ArrayList; @@ -373,8 +374,11 @@ public class ConcatenatingMediaSource extends CompositeMediaSource mediaTransferListener) { + super.prepareSourceInternal(player, isTopLevelSource, mediaTransferListener); this.player = player; playerApplicationHandler = new Handler(player.getApplicationLooper()); if (mediaSourcesPublic.isEmpty()) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java index c4a0487bd9..b96f0fee75 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java @@ -27,6 +27,7 @@ import com.google.android.exoplayer2.extractor.ExtractorsFactory; import com.google.android.exoplayer2.source.ads.AdsMediaSource; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import java.io.IOException; @@ -344,7 +345,10 @@ public final class ExtractorMediaSource extends BaseMediaSource } @Override - public void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource) { + public void prepareSourceInternal( + ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { notifySourceInfoRefreshed(timelineDurationUs, /* isSeekable= */ false); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/LoopingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/LoopingMediaSource.java index 774074b016..9d58f9ad6e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/LoopingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/LoopingMediaSource.java @@ -22,6 +22,7 @@ import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.ShuffleOrder.UnshuffledShuffleOrder; import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; /** @@ -60,8 +61,11 @@ public final class LoopingMediaSource extends CompositeMediaSource { } @Override - public void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource) { - super.prepareSourceInternal(player, isTopLevelSource); + public void prepareSourceInternal( + ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { + super.prepareSourceInternal(player, isTopLevelSource, mediaTransferListener); prepareChildSource(/* id= */ null, childSource); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java index 1a243a8bf0..e4c0f06a96 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaSource.java @@ -21,6 +21,7 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.TransferListener; import java.io.IOException; /** @@ -32,7 +33,7 @@ import java.io.IOException; * provide a new timeline whenever the structure of the media changes. The MediaSource * provides these timelines by calling {@link SourceInfoRefreshListener#onSourceInfoRefreshed} * on the {@link SourceInfoRefreshListener}s passed to {@link #prepareSource(ExoPlayer, - * boolean, SourceInfoRefreshListener)}. + * boolean, SourceInfoRefreshListener, TransferListener)}. *
  • To provide {@link MediaPeriod} instances for the periods in its timeline. MediaPeriods are * obtained by calling {@link #createPeriod(MediaPeriodId, Allocator)}, and provide a way for * the player to load and read the media. @@ -206,9 +207,16 @@ public interface MediaSource { * boolean)}. If {@code false}, this source is being prepared by another source (e.g. {@link * ConcatenatingMediaSource}) for composition. * @param listener The listener to be added. + * @param mediaTransferListener The transfer listener which should be informed of any media data + * transfers. May be null if no listener is available. Note that this listener should be only + * informed of transfers related to the media loads and not of auxiliary loads for manifests + * and other data. */ void prepareSource( - ExoPlayer player, boolean isTopLevelSource, SourceInfoRefreshListener listener); + ExoPlayer player, + boolean isTopLevelSource, + SourceInfoRefreshListener listener, + @Nullable TransferListener mediaTransferListener); /** * Throws any pending error encountered while loading or refreshing source information. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaSource.java index f9bf86081f..6c4fb6367e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MergingMediaSource.java @@ -20,6 +20,7 @@ import android.support.annotation.Nullable; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.TransferListener; import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -97,8 +98,11 @@ public final class MergingMediaSource extends CompositeMediaSource { } @Override - public void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource) { - super.prepareSourceInternal(player, isTopLevelSource); + public void prepareSourceInternal( + ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { + super.prepareSourceInternal(player, isTopLevelSource, mediaTransferListener); for (int i = 0; i < mediaSources.length; i++) { prepareChildSource(i, mediaSources[i]); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java index 2c651bef59..c873a42217 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaSource.java @@ -24,6 +24,7 @@ import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; +import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import java.io.IOException; @@ -268,7 +269,10 @@ public final class SingleSampleMediaSource extends BaseMediaSource { // MediaSource implementation. @Override - public void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource) { + public void prepareSourceInternal( + ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { refreshSourceInfo(timeline, /* manifest= */ null); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java index 5d765c78f5..36557fcd35 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java @@ -36,6 +36,7 @@ import com.google.android.exoplayer2.source.MediaSourceEventListener.MediaLoadDa import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; +import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import java.io.IOException; import java.lang.annotation.Retention; @@ -305,8 +306,11 @@ public final class AdsMediaSource extends CompositeMediaSource { } @Override - public void prepareSourceInternal(final ExoPlayer player, boolean isTopLevelSource) { - super.prepareSourceInternal(player, isTopLevelSource); + public void prepareSourceInternal( + final ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { + super.prepareSourceInternal(player, isTopLevelSource, mediaTransferListener); Assertions.checkArgument(isTopLevelSource); final ComponentListener componentListener = new ComponentListener(); this.componentListener = componentListener; diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 4264b3dd59..c0d2a77d6b 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -18,6 +18,7 @@ package com.google.android.exoplayer2; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; +import android.support.annotation.Nullable; import android.view.Surface; import com.google.android.exoplayer2.Player.EventListener; import com.google.android.exoplayer2.Timeline.Window; @@ -44,6 +45,7 @@ import com.google.android.exoplayer2.testutil.FakeTrackSelection; import com.google.android.exoplayer2.testutil.FakeTrackSelector; import com.google.android.exoplayer2.testutil.RobolectricUtil; import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.TransferListener; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -229,8 +231,10 @@ public final class ExoPlayerTest { new FakeMediaSource(timeline, new Object(), Builder.VIDEO_FORMAT) { @Override public synchronized void prepareSourceInternal( - ExoPlayer player, boolean isTopLevelSource) { - super.prepareSourceInternal(player, isTopLevelSource); + ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { + super.prepareSourceInternal(player, isTopLevelSource, mediaTransferListener); // We've queued a source info refresh on the playback thread's event queue. Allow the // test thread to prepare the player with the third source, and block this thread (the // playback thread) until the test thread's call to prepare() has returned. diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index d826e4165f..909fbb3347 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -46,6 +46,7 @@ import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.upstream.Loader.LoadErrorAction; import com.google.android.exoplayer2.upstream.LoaderErrorThrower; import com.google.android.exoplayer2.upstream.ParsingLoadable; +import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.io.BufferedReader; @@ -544,7 +545,10 @@ public final class DashMediaSource extends BaseMediaSource { // MediaSource implementation. @Override - public void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource) { + public void prepareSourceInternal( + ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { if (sideloadedManifest) { processManifest(false); } else { diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 2c1c0fc7c2..353452c431 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -40,6 +40,7 @@ import com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistTracker; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.ParsingLoadable; +import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import java.io.IOException; import java.util.List; @@ -367,7 +368,10 @@ public final class HlsMediaSource extends BaseMediaSource } @Override - public void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource) { + public void prepareSourceInternal( + ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { EventDispatcher eventDispatcher = createEventDispatcher(/* mediaPeriodId= */ null); playlistTracker.start(manifestUri, eventDispatcher, /* listener= */ this); } diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java index 19335a78fa..c1de4cc487 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java @@ -44,6 +44,7 @@ import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.upstream.Loader.LoadErrorAction; import com.google.android.exoplayer2.upstream.LoaderErrorThrower; import com.google.android.exoplayer2.upstream.ParsingLoadable; +import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import java.io.IOException; import java.util.ArrayList; @@ -462,7 +463,10 @@ public final class SsMediaSource extends BaseMediaSource // MediaSource implementation. @Override - public void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource) { + public void prepareSourceInternal( + ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { if (sideloadedManifest) { manifestLoaderErrorThrower = new LoaderErrorThrower.Dummy(); processManifest(); diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSource.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSource.java index 3b0823ad76..5e30a45031 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSource.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeMediaSource.java @@ -36,6 +36,7 @@ import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.DataSpec; +import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Assertions; import java.io.IOException; import java.util.ArrayList; @@ -86,7 +87,10 @@ public class FakeMediaSource extends BaseMediaSource { } @Override - public synchronized void prepareSourceInternal(ExoPlayer player, boolean isTopLevelSource) { + public synchronized void prepareSourceInternal( + ExoPlayer player, + boolean isTopLevelSource, + @Nullable TransferListener mediaTransferListener) { assertThat(preparedSource).isFalse(); preparedSource = true; releasedSource = false; diff --git a/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.java b/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.java index 5062b5c005..6995b67a7b 100644 --- a/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.java +++ b/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/MediaSourceTestRunner.java @@ -126,7 +126,11 @@ public class MediaSourceTestRunner { new Runnable() { @Override public void run() { - mediaSource.prepareSource(player, true, mediaSourceListener); + mediaSource.prepareSource( + player, + /* isTopLevelSource= */ true, + mediaSourceListener, + /* mediaTransferListener= */ null); try { // TODO: This only catches errors that are set synchronously in prepareSource. To // capture async errors we'll need to poll maybeThrowSourceInfoRefreshError until the