From 8adcd35c75334dc1d0472de6b1db2c609e630867 Mon Sep 17 00:00:00 2001 From: Colin Kho Date: Fri, 27 Sep 2024 00:02:11 -0700 Subject: [PATCH 01/12] Incorporate MediaSourceEventListener.onLoadStarted with retryCount parameter with backward compatibility --- .../media3/exoplayer/MediaSourceList.java | 19 +++++ .../analytics/AnalyticsListener.java | 17 ++++ .../analytics/DefaultAnalyticsCollector.java | 14 ++++ .../source/CompositeMediaSource.java | 13 +++ .../source/MediaSourceEventListener.java | 80 ++++++++++++++++++- .../source/ProgressiveMediaPeriod.java | 30 ++++++- .../source/SingleSampleMediaPeriod.java | 3 +- .../ads/ServerSideAdInsertionMediaSource.java | 12 ++- .../source/chunk/ChunkSampleStream.java | 3 +- .../DefaultAnalyticsCollectorTest.java | 12 ++- .../source/ConcatenatingMediaSource2Test.java | 4 +- .../exoplayer/dash/DashMediaSource.java | 3 +- .../exoplayer/hls/HlsSampleStreamWrapper.java | 3 +- .../playlist/DefaultHlsPlaylistTracker.java | 6 +- .../smoothstreaming/SsMediaSource.java | 3 +- .../test/utils/FakeAdaptiveMediaPeriod.java | 3 +- .../media3/test/utils/FakeMediaPeriod.java | 3 +- .../media3/test/utils/FakeMediaSource.java | 3 +- .../test/utils/MediaSourceTestRunner.java | 10 +++ 19 files changed, 223 insertions(+), 18 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java index 64c20835ab..41a8aa392a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java @@ -576,6 +576,25 @@ import java.util.Set; } } + @Override + public void onLoadStarted( + int windowIndex, + @Nullable MediaSource.MediaPeriodId mediaPeriodId, + LoadEventInfo loadEventData, + MediaLoadData mediaLoadData, + int retryCount) { + @Nullable + Pair eventParameters = + getEventParameters(windowIndex, mediaPeriodId); + if (eventParameters != null) { + eventHandler.post( + () -> + eventListener.onLoadStarted( + eventParameters.first, eventParameters.second, + loadEventData, mediaLoadData, retryCount)); + } + } + @Override public void onLoadCompleted( int windowIndex, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java index 4418a683a6..b8ddc6f63f 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java @@ -851,9 +851,26 @@ public interface AnalyticsListener { * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. */ @UnstableApi + @Deprecated default void onLoadStarted( EventTime eventTime, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) {} + /** + * Called when a media source started loading data. + * + * @param eventTime The event time. + * @param loadEventInfo The {@link LoadEventInfo} defining the load event. + * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. + * @param retryCount The number of failed attempts since {@link #onLoadStarted} was called (this + * is zero for the first load attempt). + */ + @UnstableApi + default void onLoadStarted( + EventTime eventTime, + LoadEventInfo loadEventInfo, + MediaLoadData mediaLoadData, + int retryCount) {} + /** * Called when a media source completed loading data. * diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java index e9c2b7b9a5..6f685d83e5 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java @@ -410,6 +410,20 @@ public class DefaultAnalyticsCollector implements AnalyticsCollector { listener -> listener.onLoadStarted(eventTime, loadEventInfo, mediaLoadData)); } + @Override + public final void onLoadStarted( + int windowIndex, + @Nullable MediaPeriodId mediaPeriodId, + LoadEventInfo loadEventInfo, + MediaLoadData mediaLoadData, + int retryCount) { + EventTime eventTime = generateMediaPeriodEventTime(windowIndex, mediaPeriodId); + sendEvent( + eventTime, + AnalyticsListener.EVENT_LOAD_STARTED, + listener -> listener.onLoadStarted(eventTime, loadEventInfo, mediaLoadData, retryCount)); + } + @Override public final void onLoadCompleted( int windowIndex, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeMediaSource.java index 3b58c177ee..e2db8de4f6 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeMediaSource.java @@ -246,6 +246,19 @@ public abstract class CompositeMediaSource extends BaseMediaSource { } } + @Override + public void onLoadStarted( + int windowIndex, + @Nullable MediaPeriodId mediaPeriodId, + LoadEventInfo loadEventData, + MediaLoadData mediaLoadData, + int retryCount) { + if (maybeUpdateEventDispatcher(windowIndex, mediaPeriodId)) { + mediaSourceEventDispatcher.loadStarted( + loadEventData, maybeUpdateMediaLoadData(mediaLoadData, mediaPeriodId), retryCount); + } + } + @Override public void onLoadCompleted( int windowIndex, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java index 440625ed19..0ecae3b7dc 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java @@ -47,12 +47,37 @@ public interface MediaSourceEventListener { * LoadEventInfo#responseHeaders} will be empty. * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. */ + @Deprecated default void onLoadStarted( int windowIndex, @Nullable MediaPeriodId mediaPeriodId, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) {} + /** + * Called when a load begins. + * + * @param windowIndex The window index in the timeline of the media source this load belongs to. + * @param mediaPeriodId The {@link MediaPeriodId} this load belongs to. Null if the load does not + * belong to a specific media period. + * @param loadEventInfo The {@link LoadEventInfo} corresponding to the event. The value of {@link + * LoadEventInfo#uri} won't reflect potential redirection yet and {@link + * LoadEventInfo#responseHeaders} will be empty. + * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. + * @param retryCount The number of failed attempts since {@link #onLoadStarted} was called (this + * is zero for the first load attempt). + */ + default void onLoadStarted( + int windowIndex, + @Nullable MediaPeriodId mediaPeriodId, + LoadEventInfo loadEventInfo, + MediaLoadData mediaLoadData, + int retryCount) { + if (retryCount == 0) { + onLoadStarted(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData); + } + } + /** * Called when a load ends. * @@ -224,6 +249,7 @@ public interface MediaSourceEventListener { } /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ + @Deprecated public void loadStarted(LoadEventInfo loadEventInfo, @DataType int dataType) { loadStarted( loadEventInfo, @@ -236,7 +262,22 @@ public interface MediaSourceEventListener { /* mediaEndTimeUs= */ C.TIME_UNSET); } + /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData, int)}. */ + public void loadStarted(LoadEventInfo loadEventInfo, @DataType int dataType, int retryCount) { + loadStarted( + loadEventInfo, + dataType, + /* trackType= */ C.TRACK_TYPE_UNKNOWN, + /* trackFormat= */ null, + /* trackSelectionReason= */ C.SELECTION_REASON_UNKNOWN, + /* trackSelectionData= */ null, + /* mediaStartTimeUs= */ C.TIME_UNSET, + /* mediaEndTimeUs= */ C.TIME_UNSET, + /* retryCount= */ retryCount); + } + /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ + @Deprecated public void loadStarted( LoadEventInfo loadEventInfo, @DataType int dataType, @@ -258,11 +299,48 @@ public interface MediaSourceEventListener { usToMs(mediaEndTimeUs))); } + /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData, int)}. */ + public void loadStarted( + LoadEventInfo loadEventInfo, + @DataType int dataType, + @C.TrackType int trackType, + @Nullable Format trackFormat, + @C.SelectionReason int trackSelectionReason, + @Nullable Object trackSelectionData, + long mediaStartTimeUs, + long mediaEndTimeUs, + int retryCount) { + loadStarted( + loadEventInfo, + new MediaLoadData( + dataType, + trackType, + trackFormat, + trackSelectionReason, + trackSelectionData, + usToMs(mediaStartTimeUs), + usToMs(mediaEndTimeUs)), + retryCount); + } + /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ + @Deprecated public void loadStarted(LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { dispatchEvent( (listener) -> - listener.onLoadStarted(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData)); + listener.onLoadStarted( + windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData)); + } + + /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData, int)}. */ + public void loadStarted( + LoadEventInfo loadEventInfo, + MediaLoadData mediaLoadData, + int retryCount) { + dispatchEvent( + (listener) -> + listener.onLoadStarted( + windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData, retryCount)); } /** Dispatches {@link #onLoadCompleted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java index 59685136a1..4c032c415f 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java @@ -597,6 +597,33 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; // Loader.Callback implementation. + @Override + public void onLoadStarted( + ExtractingLoadable loadable, long elapsedRealtimeMs, long loadDurationMs, int retryCount) { + if (retryCount > 0) { + StatsDataSource dataSource = loadable.dataSource; + LoadEventInfo loadEventInfo = + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + dataSource.getLastOpenedUri(), + dataSource.getLastResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + dataSource.getBytesRead()); + mediaSourceEventDispatcher.loadStarted( + loadEventInfo, + C.DATA_TYPE_MEDIA, + C.TRACK_TYPE_UNKNOWN, + /* trackFormat= */ null, + C.SELECTION_REASON_UNKNOWN, + /* trackSelectionData= */ null, + /* mediaStartTimeUs= */ loadable.seekTimeUs, + durationUs, + retryCount); + } + } + @Override public void onLoadCompleted( ExtractingLoadable loadable, long elapsedRealtimeMs, long loadDurationMs) { @@ -893,7 +920,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; C.SELECTION_REASON_UNKNOWN, /* trackSelectionData= */ null, /* mediaStartTimeUs= */ loadable.seekTimeUs, - durationUs); + durationUs, + 0); } /** diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java index 9348819a8c..71c0ea9373 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java @@ -168,7 +168,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; C.SELECTION_REASON_UNKNOWN, /* trackSelectionData= */ null, /* mediaStartTimeUs= */ 0, - durationUs); + durationUs, + /* retryCount= */ 0); return true; } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java index 3ed590e3ea..42c9bb8e09 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java @@ -427,12 +427,13 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource int windowIndex, @Nullable MediaPeriodId mediaPeriodId, LoadEventInfo loadEventInfo, - MediaLoadData mediaLoadData) { + MediaLoadData mediaLoadData, + int retryCount) { @Nullable MediaPeriodImpl mediaPeriod = getMediaPeriodForEvent(mediaPeriodId, mediaLoadData, /* useLoadingPeriod= */ true); if (mediaPeriod == null) { - mediaSourceEventDispatcherWithoutId.loadStarted(loadEventInfo, mediaLoadData); + mediaSourceEventDispatcherWithoutId.loadStarted(loadEventInfo, mediaLoadData, retryCount); } else { mediaPeriod.sharedPeriod.onLoadStarted(loadEventInfo, mediaLoadData); mediaPeriod.mediaSourceEventDispatcher.loadStarted( @@ -440,7 +441,8 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource correctMediaLoadData( mediaPeriod, mediaLoadData, - checkNotNull(adPlaybackStates.get(mediaPeriod.mediaPeriodId.periodUid)))); + checkNotNull(adPlaybackStates.get(mediaPeriod.mediaPeriodId.periodUid))), + retryCount); } } @@ -750,7 +752,9 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource loadData.first, correctMediaLoadData(loadingPeriod, loadData.second, adPlaybackState)); mediaPeriod.mediaSourceEventDispatcher.loadStarted( - loadData.first, correctMediaLoadData(mediaPeriod, loadData.second, adPlaybackState)); + loadData.first, + correctMediaLoadData(mediaPeriod, loadData.second, adPlaybackState), + 0); } } this.loadingPeriod = mediaPeriod; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java index e2ee724462..a9daa15a7d 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java @@ -647,7 +647,8 @@ public class ChunkSampleStream loadable.trackSelectionReason, loadable.trackSelectionData, loadable.startTimeUs, - loadable.endTimeUs); + loadable.endTimeUs, + 0); return true; } diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java index d5a65b1c0f..f983517865 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java @@ -132,6 +132,7 @@ import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; @@ -1715,7 +1716,7 @@ public final class DefaultAnalyticsCollectorTest { ArgumentCaptor individualLoadStartedEventTimes = ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); verify(listener, atLeastOnce()) - .onLoadStarted(individualLoadStartedEventTimes.capture(), any(), any()); + .onLoadStarted(individualLoadStartedEventTimes.capture(), any(), any(), anyInt()); ArgumentCaptor individualLoadCompletedEventTimes = ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); verify(listener, atLeastOnce()) @@ -2199,6 +2200,15 @@ public final class DefaultAnalyticsCollectorTest { reportedEvents.add(new ReportedEvent(EVENT_LOAD_STARTED, eventTime)); } + @Override + public void onLoadStarted( + EventTime eventTime, + LoadEventInfo loadEventInfo, + MediaLoadData mediaLoadData, + int retryCount) { + reportedEvents.add(new ReportedEvent(EVENT_LOAD_STARTED, eventTime)); + } + @Override public void onLoadCompleted( EventTime eventTime, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/ConcatenatingMediaSource2Test.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/ConcatenatingMediaSource2Test.java index 56a6729215..951fc3c0a9 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/ConcatenatingMediaSource2Test.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/ConcatenatingMediaSource2Test.java @@ -20,6 +20,7 @@ import static androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUnti import static com.google.common.truth.Truth.assertThat; import static java.lang.Math.max; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.mock; @@ -625,7 +626,8 @@ public final class ConcatenatingMediaSource2Test { /* windowIndex= */ eq(0), /* mediaPeriodId= */ eq(mediaPeriodId), /* loadEventInfo= */ any(), - /* mediaLoadData= */ any()); + /* mediaLoadData= */ any(), + /* retryCount */ anyInt()); verify(eventListener) .onLoadCompleted( /* windowIndex= */ eq(0), diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java index 417f2ac40e..8ce3d11d54 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java @@ -1097,7 +1097,8 @@ public final class DashMediaSource extends BaseMediaSource { long elapsedRealtimeMs = loader.startLoading(loadable, callback, minRetryCount); manifestEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), - loadable.type); + loadable.type, + 0); } private static long getIntervalUntilNextManifestRefreshMs( diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java index 8779c83b40..e302e28d8d 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java @@ -819,7 +819,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; loadable.trackSelectionReason, loadable.trackSelectionData, loadable.startTimeUs, - loadable.endTimeUs); + loadable.endTimeUs, + 0); return true; } diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java index 9e2d786d18..5de1f11b5d 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java @@ -152,7 +152,8 @@ public final class DefaultHlsPlaylistTracker multivariantPlaylistLoadable.loadTaskId, multivariantPlaylistLoadable.dataSpec, elapsedRealtime), - multivariantPlaylistLoadable.type); + multivariantPlaylistLoadable.type, + 0); } @Override @@ -744,7 +745,8 @@ public final class DefaultHlsPlaylistTracker eventDispatcher.loadStarted( new LoadEventInfo( mediaPlaylistLoadable.loadTaskId, mediaPlaylistLoadable.dataSpec, elapsedRealtime), - mediaPlaylistLoadable.type); + mediaPlaylistLoadable.type, + 0); } private void processLoadedPlaylist( diff --git a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java index 7086deeb9f..45006371c7 100644 --- a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java +++ b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java @@ -664,6 +664,7 @@ public final class SsMediaSource extends BaseMediaSource loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); manifestEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), - loadable.type); + loadable.type, + 0); } } diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java index 87ad35b0ce..5a6b53c7b8 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java @@ -116,7 +116,8 @@ public class FakeAdaptiveMediaPeriod C.SELECTION_REASON_UNKNOWN, /* trackSelectionData= */ null, /* mediaStartTimeUs= */ 0, - /* mediaEndTimeUs= */ C.TIME_UNSET); + /* mediaEndTimeUs= */ C.TIME_UNSET, + /* retryCount= */ 0); this.callback = callback; prepared = true; Util.castNonNull(this.callback).onPrepared(this); diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaPeriod.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaPeriod.java index a8b9c06b5f..182d3ea4ed 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaPeriod.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaPeriod.java @@ -235,7 +235,8 @@ public class FakeMediaPeriod implements MediaPeriod { C.SELECTION_REASON_UNKNOWN, /* trackSelectionData= */ null, /* mediaStartTimeUs= */ 0, - /* mediaEndTimeUs= */ C.TIME_UNSET); + /* mediaEndTimeUs= */ C.TIME_UNSET, + 0); prepareCallback = callback; if (deferOnPrepared) { playerHandler = Util.createHandlerForCurrentLooper(); diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java index 4ec1f61bc5..314b58e02c 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java @@ -455,7 +455,8 @@ public class FakeMediaSource extends BaseMediaSource { elapsedRealTimeMs, /* loadDurationMs= */ 0, /* bytesLoaded= */ 0), - mediaLoadData); + mediaLoadData, + 0); eventDispatcher.loadCompleted( new LoadEventInfo( loadTaskId, diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/MediaSourceTestRunner.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/MediaSourceTestRunner.java index 07ccf80f28..6e003e92bf 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/MediaSourceTestRunner.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/MediaSourceTestRunner.java @@ -368,6 +368,16 @@ public class MediaSourceTestRunner { Assertions.checkState(Looper.myLooper() == playbackThread.getLooper()); } + @Override + public void onLoadStarted( + int windowIndex, + @Nullable MediaPeriodId mediaPeriodId, + LoadEventInfo loadEventInfo, + MediaLoadData mediaLoadData, + int retryCount) { + Assertions.checkState(Looper.myLooper() == playbackThread.getLooper()); + } + @Override public void onLoadCompleted( int windowIndex, From 5dbe1efa9ebfed4a3179597b2eb1aaf52b9d54eb Mon Sep 17 00:00:00 2001 From: Colin Kho Date: Wed, 9 Oct 2024 16:01:36 -0700 Subject: [PATCH 02/12] Treat onLoadStarted with retryCount to be a new method rather than redirect calls --- .../analytics/AnalyticsListener.java | 4 + .../analytics/DefaultAnalyticsCollector.java | 2 +- .../source/MediaSourceEventListener.java | 6 +- .../source/ProgressiveMediaPeriod.java | 3 +- .../source/SingleSampleMediaPeriod.java | 28 ++++++- .../ads/ServerSideAdInsertionMediaSource.java | 26 +++++- .../source/chunk/ChunkSampleStream.java | 19 ++++- .../DefaultAnalyticsCollectorTest.java | 83 ++++++++++++++++++- .../exoplayer/dash/DashMediaSource.java | 18 +++- .../exoplayer/hls/HlsSampleStreamWrapper.java | 18 +++- .../playlist/DefaultHlsPlaylistTracker.java | 21 ++++- .../smoothstreaming/SsMediaSource.java | 12 ++- .../test/utils/FakeAdaptiveMediaPeriod.java | 9 ++ .../media3/test/utils/FakeMediaPeriod.java | 11 ++- .../media3/test/utils/FakeMediaSource.java | 12 ++- 15 files changed, 245 insertions(+), 27 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java index b8ddc6f63f..e65178aba1 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java @@ -345,6 +345,10 @@ public interface AnalyticsListener { /** {@link Player#getDeviceVolume()} changed. */ @UnstableApi int EVENT_DEVICE_VOLUME_CHANGED = Player.EVENT_DEVICE_VOLUME_CHANGED; + /** A source started loading data. */ + @UnstableApi + int EVENT_ON_LOAD_STARTED = 999; + /** A source started loading data. */ @UnstableApi int EVENT_LOAD_STARTED = 1000; // Intentional gap to leave space for new Player events diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java index 6f685d83e5..2f3919f9fd 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java @@ -420,7 +420,7 @@ public class DefaultAnalyticsCollector implements AnalyticsCollector { EventTime eventTime = generateMediaPeriodEventTime(windowIndex, mediaPeriodId); sendEvent( eventTime, - AnalyticsListener.EVENT_LOAD_STARTED, + AnalyticsListener.EVENT_ON_LOAD_STARTED, listener -> listener.onLoadStarted(eventTime, loadEventInfo, mediaLoadData, retryCount)); } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java index 0ecae3b7dc..bbd5eca049 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java @@ -72,11 +72,7 @@ public interface MediaSourceEventListener { @Nullable MediaPeriodId mediaPeriodId, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData, - int retryCount) { - if (retryCount == 0) { - onLoadStarted(windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData); - } - } + int retryCount) {} /** * Called when a load ends. diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java index 4c032c415f..087da13b91 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java @@ -920,8 +920,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; C.SELECTION_REASON_UNKNOWN, /* trackSelectionData= */ null, /* mediaStartTimeUs= */ loadable.seekTimeUs, - durationUs, - 0); + durationUs); } /** diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java index 71c0ea9373..4dcf0e30f6 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java @@ -168,8 +168,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; C.SELECTION_REASON_UNKNOWN, /* trackSelectionData= */ null, /* mediaStartTimeUs= */ 0, - durationUs, - /* retryCount= */ 0); + durationUs); return true; } @@ -208,6 +207,31 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; // Loader.Callback implementation. + @Override + public void onLoadStarted(SourceLoadable loadable, long elapsedRealtimeMs, long loadDurationMs, + int retryCount) { + StatsDataSource dataSource = loadable.dataSource; + LoadEventInfo loadEventInfo = + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + dataSource.getLastOpenedUri(), + dataSource.getLastResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + sampleSize); + eventDispatcher.loadStarted( + loadEventInfo, + C.DATA_TYPE_MEDIA, + C.TRACK_TYPE_UNKNOWN, + format, + C.SELECTION_REASON_UNKNOWN, + /* trackSelectionData= */ null, + /* mediaStartTimeUs= */ 0, + durationUs, + retryCount); + } + @Override public void onLoadCompleted( SourceLoadable loadable, long elapsedRealtimeMs, long loadDurationMs) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java index 42c9bb8e09..6a52daf946 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java @@ -422,6 +422,28 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource } } + @Override + public void onLoadStarted( + int windowIndex, + @Nullable MediaPeriodId mediaPeriodId, + LoadEventInfo loadEventInfo, + MediaLoadData mediaLoadData) { + @Nullable + MediaPeriodImpl mediaPeriod = + getMediaPeriodForEvent(mediaPeriodId, mediaLoadData, /* useLoadingPeriod= */ true); + if (mediaPeriod == null) { + mediaSourceEventDispatcherWithoutId.loadStarted(loadEventInfo, mediaLoadData); + } else { + mediaPeriod.sharedPeriod.onLoadStarted(loadEventInfo, mediaLoadData); + mediaPeriod.mediaSourceEventDispatcher.loadStarted( + loadEventInfo, + correctMediaLoadData( + mediaPeriod, + mediaLoadData, + checkNotNull(adPlaybackStates.get(mediaPeriod.mediaPeriodId.periodUid)))); + } + } + @Override public void onLoadStarted( int windowIndex, @@ -751,10 +773,12 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource loadingPeriod.mediaSourceEventDispatcher.loadCompleted( loadData.first, correctMediaLoadData(loadingPeriod, loadData.second, adPlaybackState)); + mediaPeriod.mediaSourceEventDispatcher.loadStarted( + loadData.first, correctMediaLoadData(mediaPeriod, loadData.second, adPlaybackState)); mediaPeriod.mediaSourceEventDispatcher.loadStarted( loadData.first, correctMediaLoadData(mediaPeriod, loadData.second, adPlaybackState), - 0); + /* retryCount= */ 0); } } this.loadingPeriod = mediaPeriod; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java index a9daa15a7d..490b5fcbd2 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java @@ -429,6 +429,22 @@ public class ChunkSampleStream // Loader.Callback implementation. + + @Override + public void onLoadStarted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, + int retryCount) { + mediaSourceEventDispatcher.loadStarted( + new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), + loadable.type, + primaryTrackType, + loadable.trackFormat, + loadable.trackSelectionReason, + loadable.trackSelectionData, + loadable.startTimeUs, + loadable.endTimeUs, + retryCount); + } + @Override public void onLoadCompleted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs) { loadingChunk = null; @@ -647,8 +663,7 @@ public class ChunkSampleStream loadable.trackSelectionReason, loadable.trackSelectionData, loadable.startTimeUs, - loadable.endTimeUs, - 0); + loadable.endTimeUs); return true; } diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java index f983517865..eed88a2af8 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java @@ -32,6 +32,7 @@ import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_LOAD_C import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_LOAD_ERROR; import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_LOAD_STARTED; import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_MEDIA_ITEM_TRANSITION; +import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_ON_LOAD_STARTED; import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_PLAYBACK_PARAMETERS_CHANGED; import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_PLAYBACK_STATE_CHANGED; import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_PLAYER_ERROR; @@ -265,6 +266,9 @@ public final class DefaultAnalyticsCollectorTest { assertThat(listener.getEvents(EVENT_LOAD_STARTED)) .containsExactly(WINDOW_0 /* manifest */, period0 /* media */) .inOrder(); + assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + .containsExactly(WINDOW_0 /* manifest */, period0 /* media */) + .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) .containsExactly(WINDOW_0 /* manifest */, period0 /* media */) .inOrder(); @@ -334,6 +338,13 @@ public final class DefaultAnalyticsCollectorTest { period0 /* media */, period1 /* media */) .inOrder(); + assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + .containsExactly( + WINDOW_0 /* manifest */, + WINDOW_1 /* manifest */, + period0 /* media */, + period1 /* media */) + .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) .containsExactly( WINDOW_0 /* manifest */, @@ -412,6 +423,13 @@ public final class DefaultAnalyticsCollectorTest { period0 /* media */, period1 /* media */) .inOrder(); + assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + .containsExactly( + WINDOW_0 /* manifest */, + WINDOW_1 /* manifest */, + period0 /* media */, + period1 /* media */) + .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) .containsExactly( WINDOW_0 /* manifest */, @@ -494,6 +512,13 @@ public final class DefaultAnalyticsCollectorTest { period0 /* media */, period1 /* media */) .inOrder(); + assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + .containsExactly( + WINDOW_0 /* manifest */, + WINDOW_1 /* manifest */, + period0 /* media */, + period1 /* media */) + .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) .containsExactly( WINDOW_0 /* manifest */, @@ -591,6 +616,14 @@ public final class DefaultAnalyticsCollectorTest { period1Seq1 /* media */, period1Seq2 /* media */) .inOrder(); + assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + .containsExactly( + WINDOW_0 /* manifest */, + WINDOW_1 /* manifest */, + period0 /* media */, + period1Seq1 /* media */, + period1Seq2 /* media */) + .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) .containsExactly( WINDOW_0 /* manifest */, @@ -710,6 +743,13 @@ public final class DefaultAnalyticsCollectorTest { WINDOW_0 /* manifest */, period0Seq1 /* media */) .inOrder(); + assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + .containsExactly( + WINDOW_0 /* manifest */, + period0Seq0 /* media */, + WINDOW_0 /* manifest */, + period0Seq1 /* media */) + .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) .containsExactly( WINDOW_0 /* manifest */, @@ -804,6 +844,13 @@ public final class DefaultAnalyticsCollectorTest { WINDOW_0 /* manifest */, period0Seq0 /* media */) .inOrder(); + assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + .containsExactly( + WINDOW_0 /* manifest */, + period0Seq0 /* media */, + WINDOW_0 /* manifest */, + period0Seq0 /* media */) + .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) .containsExactly( WINDOW_0 /* manifest */, @@ -876,6 +923,10 @@ public final class DefaultAnalyticsCollectorTest { .containsExactly( WINDOW_0 /* manifest */, window0Period1Seq0 /* media */, window1Period0Seq1 /* media */) .inOrder(); + assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + .containsExactly( + WINDOW_0 /* manifest */, window0Period1Seq0 /* media */, window1Period0Seq1 /* media */) + .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) .containsExactly( WINDOW_0 /* manifest */, window0Period1Seq0 /* media */, window1Period0Seq1 /* media */) @@ -974,6 +1025,9 @@ public final class DefaultAnalyticsCollectorTest { assertThat(listener.getEvents(EVENT_LOAD_STARTED)) .containsExactly(WINDOW_0 /* manifest */, period0Seq0 /* media */, period1Seq1 /* media */) .inOrder(); + assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + .containsExactly(WINDOW_0 /* manifest */, period0Seq0 /* media */, period1Seq1 /* media */) + .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) .containsExactly(WINDOW_0 /* manifest */, period0Seq0 /* media */, period1Seq1 /* media */) .inOrder(); @@ -1179,6 +1233,16 @@ public final class DefaultAnalyticsCollectorTest { postrollAd, contentAfterPostroll) .inOrder(); + assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + .containsExactly( + WINDOW_0 /* content manifest */, + prerollAd, + contentAfterPreroll, + midrollAd, + contentAfterMidroll, + postrollAd, + contentAfterPostroll) + .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) .containsExactly( WINDOW_0 /* content manifest */, @@ -1338,6 +1402,14 @@ public final class DefaultAnalyticsCollectorTest { contentAfterMidroll, contentAfterMidroll) .inOrder(); + assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + .containsExactly( + WINDOW_0 /* content manifest */, + contentBeforeMidroll, + midrollAd, + contentAfterMidroll, + contentAfterMidroll) + .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) .containsExactly( WINDOW_0 /* content manifest */, @@ -1716,7 +1788,11 @@ public final class DefaultAnalyticsCollectorTest { ArgumentCaptor individualLoadStartedEventTimes = ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); verify(listener, atLeastOnce()) - .onLoadStarted(individualLoadStartedEventTimes.capture(), any(), any(), anyInt()); + .onLoadStarted(individualLoadStartedEventTimes.capture(), any(), any()); + ArgumentCaptor individualOnLoadStartedEventTimes = + ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); + verify(listener, atLeastOnce()) + .onLoadStarted(individualOnLoadStartedEventTimes.capture(), any(), any(), anyInt()); ArgumentCaptor individualLoadCompletedEventTimes = ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); verify(listener, atLeastOnce()) @@ -1844,6 +1920,9 @@ public final class DefaultAnalyticsCollectorTest { assertThat(individualLoadStartedEventTimes.getAllValues()) .containsAtLeastElementsIn(onEventsEventTimes.get(EVENT_LOAD_STARTED)) .inOrder(); + assertThat(individualOnLoadStartedEventTimes.getAllValues()) + .containsAtLeastElementsIn(onEventsEventTimes.get(EVENT_ON_LOAD_STARTED)) + .inOrder(); assertThat(individualLoadCompletedEventTimes.getAllValues()) .containsAtLeastElementsIn(onEventsEventTimes.get(EVENT_LOAD_COMPLETED)) .inOrder(); @@ -2206,7 +2285,7 @@ public final class DefaultAnalyticsCollectorTest { LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData, int retryCount) { - reportedEvents.add(new ReportedEvent(EVENT_LOAD_STARTED, eventTime)); + reportedEvents.add(new ReportedEvent(EVENT_ON_LOAD_STARTED, eventTime)); } @Override diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java index 8ce3d11d54..938c531571 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java @@ -629,6 +629,15 @@ public final class DashMediaSource extends BaseMediaSource { // Loadable callbacks. + /* package */ void onManifestLoadStarted( + ParsingLoadable loadable, long elapsedRealtimeMs, + long loadDurationMs, int retryCount) { + manifestEventDispatcher.loadStarted( + new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), + loadable.type, + retryCount); + } + /* package */ void onManifestLoadCompleted( ParsingLoadable loadable, long elapsedRealtimeMs, long loadDurationMs) { LoadEventInfo loadEventInfo = @@ -1097,8 +1106,7 @@ public final class DashMediaSource extends BaseMediaSource { long elapsedRealtimeMs = loader.startLoading(loadable, callback, minRetryCount); manifestEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), - loadable.type, - 0); + loadable.type); } private static long getIntervalUntilNextManifestRefreshMs( @@ -1390,6 +1398,12 @@ public final class DashMediaSource extends BaseMediaSource { private final class ManifestCallback implements Loader.Callback> { + @Override + public void onLoadStarted(ParsingLoadable loadable, long elapsedRealtimeMs, + long loadDurationMs, int retryCount) { + onManifestLoadStarted(loadable, elapsedRealtimeMs, loadDurationMs, retryCount); + } + @Override public void onLoadCompleted( ParsingLoadable loadable, long elapsedRealtimeMs, long loadDurationMs) { diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java index e302e28d8d..87f33f35e6 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java @@ -819,8 +819,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; loadable.trackSelectionReason, loadable.trackSelectionData, loadable.startTimeUs, - loadable.endTimeUs, - 0); + loadable.endTimeUs); return true; } @@ -861,6 +860,21 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; // Loader.Callback implementation. + + @Override + public void onLoadStarted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, + int retryCount) { + mediaSourceEventDispatcher.loadStarted( + new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), + loadable.type, + trackType, + loadable.trackFormat, + loadable.trackSelectionReason, + loadable.trackSelectionData, + loadable.startTimeUs, + loadable.endTimeUs); + } + @Override public void onLoadCompleted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs) { loadingChunk = null; diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java index 5de1f11b5d..544756f71d 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java @@ -152,8 +152,7 @@ public final class DefaultHlsPlaylistTracker multivariantPlaylistLoadable.loadTaskId, multivariantPlaylistLoadable.dataSpec, elapsedRealtime), - multivariantPlaylistLoadable.type, - 0); + multivariantPlaylistLoadable.type); } @Override @@ -255,6 +254,21 @@ public final class DefaultHlsPlaylistTracker // Loader.Callback implementation. + @Override + public void onLoadStarted( + ParsingLoadable loadable, + long elapsedRealtimeMs, + long loadDurationMs, + int retryCount) { + eventDispatcher.loadStarted( + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + elapsedRealtimeMs), + loadable.type, + retryCount); + } + @Override public void onLoadCompleted( ParsingLoadable loadable, long elapsedRealtimeMs, long loadDurationMs) { @@ -745,8 +759,7 @@ public final class DefaultHlsPlaylistTracker eventDispatcher.loadStarted( new LoadEventInfo( mediaPlaylistLoadable.loadTaskId, mediaPlaylistLoadable.dataSpec, elapsedRealtime), - mediaPlaylistLoadable.type, - 0); + mediaPlaylistLoadable.type); } private void processLoadedPlaylist( diff --git a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java index 45006371c7..7c45d8d5b0 100644 --- a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java +++ b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java @@ -497,6 +497,15 @@ public final class SsMediaSource extends BaseMediaSource // Loader.Callback implementation + @Override + public void onLoadStarted(ParsingLoadable loadable, long elapsedRealtimeMs, + long loadDurationMs, int retryCount) { + manifestEventDispatcher.loadStarted( + new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), + loadable.type, + /* retryCount= */ 0); + } + @Override public void onLoadCompleted( ParsingLoadable loadable, long elapsedRealtimeMs, long loadDurationMs) { @@ -664,7 +673,6 @@ public final class SsMediaSource extends BaseMediaSource loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); manifestEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), - loadable.type, - 0); + loadable.type); } } diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java index 5a6b53c7b8..23e6d40fc9 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java @@ -108,6 +108,15 @@ public class FakeAdaptiveMediaPeriod @Override public void prepare(Callback callback, long positionUs) { + mediaSourceEventDispatcher.loadStarted( + new LoadEventInfo(fakePreparationLoadTaskId, FAKE_DATA_SPEC, SystemClock.elapsedRealtime()), + C.DATA_TYPE_MEDIA, + C.TRACK_TYPE_UNKNOWN, + /* trackFormat= */ null, + C.SELECTION_REASON_UNKNOWN, + /* trackSelectionData= */ null, + /* mediaStartTimeUs= */ 0, + /* mediaEndTimeUs= */ C.TIME_UNSET); mediaSourceEventDispatcher.loadStarted( new LoadEventInfo(fakePreparationLoadTaskId, FAKE_DATA_SPEC, SystemClock.elapsedRealtime()), C.DATA_TYPE_MEDIA, diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaPeriod.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaPeriod.java index 182d3ea4ed..3aaa1ac96f 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaPeriod.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaPeriod.java @@ -227,6 +227,15 @@ public class FakeMediaPeriod implements MediaPeriod { @Override public synchronized void prepare(Callback callback, long positionUs) { + mediaSourceEventDispatcher.loadStarted( + new LoadEventInfo(fakePreparationLoadTaskId, FAKE_DATA_SPEC, SystemClock.elapsedRealtime()), + C.DATA_TYPE_MEDIA, + C.TRACK_TYPE_UNKNOWN, + /* trackFormat= */ null, + C.SELECTION_REASON_UNKNOWN, + /* trackSelectionData= */ null, + /* mediaStartTimeUs= */ 0, + /* mediaEndTimeUs= */ C.TIME_UNSET); mediaSourceEventDispatcher.loadStarted( new LoadEventInfo(fakePreparationLoadTaskId, FAKE_DATA_SPEC, SystemClock.elapsedRealtime()), C.DATA_TYPE_MEDIA, @@ -236,7 +245,7 @@ public class FakeMediaPeriod implements MediaPeriod { /* trackSelectionData= */ null, /* mediaStartTimeUs= */ 0, /* mediaEndTimeUs= */ C.TIME_UNSET, - 0); + /* retryCount= */ 0); prepareCallback = callback; if (deferOnPrepared) { playerHandler = Util.createHandlerForCurrentLooper(); diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java index 314b58e02c..eebdd59224 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java @@ -446,6 +446,16 @@ public class FakeMediaSource extends BaseMediaSource { MediaSourceEventListener.EventDispatcher eventDispatcher = createEventDispatcher(/* mediaPeriodId= */ null); long loadTaskId = LoadEventInfo.getNewId(); + eventDispatcher.loadStarted( + new LoadEventInfo( + loadTaskId, + FAKE_DATA_SPEC, + FAKE_DATA_SPEC.uri, + /* responseHeaders= */ ImmutableMap.of(), + elapsedRealTimeMs, + /* loadDurationMs= */ 0, + /* bytesLoaded= */ 0), + mediaLoadData); eventDispatcher.loadStarted( new LoadEventInfo( loadTaskId, @@ -456,7 +466,7 @@ public class FakeMediaSource extends BaseMediaSource { /* loadDurationMs= */ 0, /* bytesLoaded= */ 0), mediaLoadData, - 0); + /* retryCount= */ 0); eventDispatcher.loadCompleted( new LoadEventInfo( loadTaskId, From 16f65cee58210563f7838769e5fed9df9bbf95ee Mon Sep 17 00:00:00 2001 From: Colin Kho Date: Tue, 15 Oct 2024 10:56:17 -0700 Subject: [PATCH 03/12] Deprecate onLoadStarted w/o retry count on AnalyticsListener --- .../analytics/AnalyticsListener.java | 4 --- .../analytics/DefaultAnalyticsCollector.java | 4 +-- .../ads/ServerSideAdInsertionMediaSource.java | 28 --------------- .../DefaultAnalyticsCollectorTest.java | 35 ++++++++----------- 4 files changed, 16 insertions(+), 55 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java index e65178aba1..b8ddc6f63f 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java @@ -345,10 +345,6 @@ public interface AnalyticsListener { /** {@link Player#getDeviceVolume()} changed. */ @UnstableApi int EVENT_DEVICE_VOLUME_CHANGED = Player.EVENT_DEVICE_VOLUME_CHANGED; - /** A source started loading data. */ - @UnstableApi - int EVENT_ON_LOAD_STARTED = 999; - /** A source started loading data. */ @UnstableApi int EVENT_LOAD_STARTED = 1000; // Intentional gap to leave space for new Player events diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java index 2f3919f9fd..9525b51f57 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java @@ -406,7 +406,7 @@ public class DefaultAnalyticsCollector implements AnalyticsCollector { EventTime eventTime = generateMediaPeriodEventTime(windowIndex, mediaPeriodId); sendEvent( eventTime, - AnalyticsListener.EVENT_LOAD_STARTED, + C.INDEX_UNSET, listener -> listener.onLoadStarted(eventTime, loadEventInfo, mediaLoadData)); } @@ -420,7 +420,7 @@ public class DefaultAnalyticsCollector implements AnalyticsCollector { EventTime eventTime = generateMediaPeriodEventTime(windowIndex, mediaPeriodId); sendEvent( eventTime, - AnalyticsListener.EVENT_ON_LOAD_STARTED, + AnalyticsListener.EVENT_LOAD_STARTED, listener -> listener.onLoadStarted(eventTime, loadEventInfo, mediaLoadData, retryCount)); } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java index 6a52daf946..3ed590e3ea 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java @@ -444,30 +444,6 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource } } - @Override - public void onLoadStarted( - int windowIndex, - @Nullable MediaPeriodId mediaPeriodId, - LoadEventInfo loadEventInfo, - MediaLoadData mediaLoadData, - int retryCount) { - @Nullable - MediaPeriodImpl mediaPeriod = - getMediaPeriodForEvent(mediaPeriodId, mediaLoadData, /* useLoadingPeriod= */ true); - if (mediaPeriod == null) { - mediaSourceEventDispatcherWithoutId.loadStarted(loadEventInfo, mediaLoadData, retryCount); - } else { - mediaPeriod.sharedPeriod.onLoadStarted(loadEventInfo, mediaLoadData); - mediaPeriod.mediaSourceEventDispatcher.loadStarted( - loadEventInfo, - correctMediaLoadData( - mediaPeriod, - mediaLoadData, - checkNotNull(adPlaybackStates.get(mediaPeriod.mediaPeriodId.periodUid))), - retryCount); - } - } - @Override public void onLoadCompleted( int windowIndex, @@ -775,10 +751,6 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource correctMediaLoadData(loadingPeriod, loadData.second, adPlaybackState)); mediaPeriod.mediaSourceEventDispatcher.loadStarted( loadData.first, correctMediaLoadData(mediaPeriod, loadData.second, adPlaybackState)); - mediaPeriod.mediaSourceEventDispatcher.loadStarted( - loadData.first, - correctMediaLoadData(mediaPeriod, loadData.second, adPlaybackState), - /* retryCount= */ 0); } } this.loadingPeriod = mediaPeriod; diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java index eed88a2af8..b659c76c8e 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java @@ -32,7 +32,6 @@ import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_LOAD_C import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_LOAD_ERROR; import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_LOAD_STARTED; import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_MEDIA_ITEM_TRANSITION; -import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_ON_LOAD_STARTED; import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_PLAYBACK_PARAMETERS_CHANGED; import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_PLAYBACK_STATE_CHANGED; import static androidx.media3.exoplayer.analytics.AnalyticsListener.EVENT_PLAYER_ERROR; @@ -150,6 +149,7 @@ public final class DefaultAnalyticsCollectorTest { // Deprecated event constants. private static final long EVENT_PLAYER_STATE_CHANGED = 1L << 63; private static final long EVENT_SEEK_STARTED = 1L << 62; + private static final int DEPRECATED_EVENT_LOAD_STARTED = Integer.MIN_VALUE; private static final UUID DRM_SCHEME_UUID = UUID.nameUUIDFromBytes(TestUtil.createByteArray(7, 8, 9)); @@ -266,7 +266,7 @@ public final class DefaultAnalyticsCollectorTest { assertThat(listener.getEvents(EVENT_LOAD_STARTED)) .containsExactly(WINDOW_0 /* manifest */, period0 /* media */) .inOrder(); - assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + assertThat(listener.getEvents(DEPRECATED_EVENT_LOAD_STARTED)) .containsExactly(WINDOW_0 /* manifest */, period0 /* media */) .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) @@ -338,7 +338,7 @@ public final class DefaultAnalyticsCollectorTest { period0 /* media */, period1 /* media */) .inOrder(); - assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + assertThat(listener.getEvents(DEPRECATED_EVENT_LOAD_STARTED)) .containsExactly( WINDOW_0 /* manifest */, WINDOW_1 /* manifest */, @@ -423,7 +423,7 @@ public final class DefaultAnalyticsCollectorTest { period0 /* media */, period1 /* media */) .inOrder(); - assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + assertThat(listener.getEvents(DEPRECATED_EVENT_LOAD_STARTED)) .containsExactly( WINDOW_0 /* manifest */, WINDOW_1 /* manifest */, @@ -512,7 +512,7 @@ public final class DefaultAnalyticsCollectorTest { period0 /* media */, period1 /* media */) .inOrder(); - assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + assertThat(listener.getEvents(DEPRECATED_EVENT_LOAD_STARTED)) .containsExactly( WINDOW_0 /* manifest */, WINDOW_1 /* manifest */, @@ -616,7 +616,7 @@ public final class DefaultAnalyticsCollectorTest { period1Seq1 /* media */, period1Seq2 /* media */) .inOrder(); - assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + assertThat(listener.getEvents(DEPRECATED_EVENT_LOAD_STARTED)) .containsExactly( WINDOW_0 /* manifest */, WINDOW_1 /* manifest */, @@ -743,7 +743,7 @@ public final class DefaultAnalyticsCollectorTest { WINDOW_0 /* manifest */, period0Seq1 /* media */) .inOrder(); - assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + assertThat(listener.getEvents(DEPRECATED_EVENT_LOAD_STARTED)) .containsExactly( WINDOW_0 /* manifest */, period0Seq0 /* media */, @@ -844,7 +844,7 @@ public final class DefaultAnalyticsCollectorTest { WINDOW_0 /* manifest */, period0Seq0 /* media */) .inOrder(); - assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + assertThat(listener.getEvents(DEPRECATED_EVENT_LOAD_STARTED)) .containsExactly( WINDOW_0 /* manifest */, period0Seq0 /* media */, @@ -923,7 +923,7 @@ public final class DefaultAnalyticsCollectorTest { .containsExactly( WINDOW_0 /* manifest */, window0Period1Seq0 /* media */, window1Period0Seq1 /* media */) .inOrder(); - assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + assertThat(listener.getEvents(DEPRECATED_EVENT_LOAD_STARTED)) .containsExactly( WINDOW_0 /* manifest */, window0Period1Seq0 /* media */, window1Period0Seq1 /* media */) .inOrder(); @@ -1025,7 +1025,7 @@ public final class DefaultAnalyticsCollectorTest { assertThat(listener.getEvents(EVENT_LOAD_STARTED)) .containsExactly(WINDOW_0 /* manifest */, period0Seq0 /* media */, period1Seq1 /* media */) .inOrder(); - assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + assertThat(listener.getEvents(DEPRECATED_EVENT_LOAD_STARTED)) .containsExactly(WINDOW_0 /* manifest */, period0Seq0 /* media */, period1Seq1 /* media */) .inOrder(); assertThat(listener.getEvents(EVENT_LOAD_COMPLETED)) @@ -1233,7 +1233,7 @@ public final class DefaultAnalyticsCollectorTest { postrollAd, contentAfterPostroll) .inOrder(); - assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + assertThat(listener.getEvents(DEPRECATED_EVENT_LOAD_STARTED)) .containsExactly( WINDOW_0 /* content manifest */, prerollAd, @@ -1402,7 +1402,7 @@ public final class DefaultAnalyticsCollectorTest { contentAfterMidroll, contentAfterMidroll) .inOrder(); - assertThat(listener.getEvents(EVENT_ON_LOAD_STARTED)) + assertThat(listener.getEvents(DEPRECATED_EVENT_LOAD_STARTED)) .containsExactly( WINDOW_0 /* content manifest */, contentBeforeMidroll, @@ -1788,11 +1788,7 @@ public final class DefaultAnalyticsCollectorTest { ArgumentCaptor individualLoadStartedEventTimes = ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); verify(listener, atLeastOnce()) - .onLoadStarted(individualLoadStartedEventTimes.capture(), any(), any()); - ArgumentCaptor individualOnLoadStartedEventTimes = - ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); - verify(listener, atLeastOnce()) - .onLoadStarted(individualOnLoadStartedEventTimes.capture(), any(), any(), anyInt()); + .onLoadStarted(individualLoadStartedEventTimes.capture(), any(), any(), anyInt()); ArgumentCaptor individualLoadCompletedEventTimes = ArgumentCaptor.forClass(AnalyticsListener.EventTime.class); verify(listener, atLeastOnce()) @@ -1920,9 +1916,6 @@ public final class DefaultAnalyticsCollectorTest { assertThat(individualLoadStartedEventTimes.getAllValues()) .containsAtLeastElementsIn(onEventsEventTimes.get(EVENT_LOAD_STARTED)) .inOrder(); - assertThat(individualOnLoadStartedEventTimes.getAllValues()) - .containsAtLeastElementsIn(onEventsEventTimes.get(EVENT_ON_LOAD_STARTED)) - .inOrder(); assertThat(individualLoadCompletedEventTimes.getAllValues()) .containsAtLeastElementsIn(onEventsEventTimes.get(EVENT_LOAD_COMPLETED)) .inOrder(); @@ -2285,7 +2278,7 @@ public final class DefaultAnalyticsCollectorTest { LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData, int retryCount) { - reportedEvents.add(new ReportedEvent(EVENT_ON_LOAD_STARTED, eventTime)); + reportedEvents.add(new ReportedEvent(DEPRECATED_EVENT_LOAD_STARTED, eventTime)); } @Override From 5581529bfb87f35b2e6c1a6add340bd2e27df187 Mon Sep 17 00:00:00 2001 From: Colin Kho Date: Tue, 15 Oct 2024 11:03:47 -0700 Subject: [PATCH 04/12] Use long as test constant for DefaultAnalyticsCollectorTest --- .../exoplayer/analytics/DefaultAnalyticsCollectorTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java index b659c76c8e..a69a0ba69b 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java @@ -132,7 +132,6 @@ import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; @@ -149,7 +148,8 @@ public final class DefaultAnalyticsCollectorTest { // Deprecated event constants. private static final long EVENT_PLAYER_STATE_CHANGED = 1L << 63; private static final long EVENT_SEEK_STARTED = 1L << 62; - private static final int DEPRECATED_EVENT_LOAD_STARTED = Integer.MIN_VALUE; + // Start from +1 of the MIN because it will collide with 1L << 63 + private static final long DEPRECATED_EVENT_LOAD_STARTED = Long.MIN_VALUE + 1; private static final UUID DRM_SCHEME_UUID = UUID.nameUUIDFromBytes(TestUtil.createByteArray(7, 8, 9)); From e7f5d4d4410fa0bd8e55955dd66c9c295a91d243 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Wed, 23 Oct 2024 14:06:43 +0100 Subject: [PATCH 05/12] Remove backwards-compat onLoadStarted from MediaSourceEventListener --- .../media3/exoplayer/MediaSourceList.java | 17 ----- .../analytics/DefaultAnalyticsCollector.java | 13 ---- .../source/CompositeMediaSource.java | 12 ---- .../source/MediaSourceEventListener.java | 72 ++----------------- .../source/ProgressiveMediaPeriod.java | 2 +- .../source/SingleSampleMediaPeriod.java | 2 +- .../ads/ServerSideAdInsertionMediaSource.java | 12 ++-- .../source/chunk/ChunkSampleStream.java | 2 +- .../exoplayer/dash/DashMediaSource.java | 2 +- .../exoplayer/hls/HlsSampleStreamWrapper.java | 5 +- .../playlist/DefaultHlsPlaylistTracker.java | 4 +- .../smoothstreaming/SsMediaSource.java | 2 +- .../test/utils/FakeAdaptiveMediaPeriod.java | 9 --- .../media3/test/utils/FakeMediaPeriod.java | 9 --- .../media3/test/utils/FakeMediaSource.java | 10 --- .../test/utils/MediaSourceTestRunner.java | 9 --- 16 files changed, 22 insertions(+), 160 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java index 41a8aa392a..87d11a580c 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java @@ -559,23 +559,6 @@ import java.util.Set; // MediaSourceEventListener implementation - @Override - public void onLoadStarted( - int windowIndex, - @Nullable MediaSource.MediaPeriodId mediaPeriodId, - LoadEventInfo loadEventData, - MediaLoadData mediaLoadData) { - @Nullable - Pair eventParameters = - getEventParameters(windowIndex, mediaPeriodId); - if (eventParameters != null) { - eventHandler.post( - () -> - eventListener.onLoadStarted( - eventParameters.first, eventParameters.second, loadEventData, mediaLoadData)); - } - } - @Override public void onLoadStarted( int windowIndex, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java index 9525b51f57..3f80d131b9 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java @@ -397,19 +397,6 @@ public class DefaultAnalyticsCollector implements AnalyticsCollector { // MediaSourceEventListener implementation. - @Override - public final void onLoadStarted( - int windowIndex, - @Nullable MediaPeriodId mediaPeriodId, - LoadEventInfo loadEventInfo, - MediaLoadData mediaLoadData) { - EventTime eventTime = generateMediaPeriodEventTime(windowIndex, mediaPeriodId); - sendEvent( - eventTime, - C.INDEX_UNSET, - listener -> listener.onLoadStarted(eventTime, loadEventInfo, mediaLoadData)); - } - @Override public final void onLoadStarted( int windowIndex, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeMediaSource.java index e2db8de4f6..dcbe3aa436 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/CompositeMediaSource.java @@ -234,18 +234,6 @@ public abstract class CompositeMediaSource extends BaseMediaSource { // MediaSourceEventListener implementation - @Override - public void onLoadStarted( - int windowIndex, - @Nullable MediaPeriodId mediaPeriodId, - LoadEventInfo loadEventData, - MediaLoadData mediaLoadData) { - if (maybeUpdateEventDispatcher(windowIndex, mediaPeriodId)) { - mediaSourceEventDispatcher.loadStarted( - loadEventData, maybeUpdateMediaLoadData(mediaLoadData, mediaPeriodId)); - } - } - @Override public void onLoadStarted( int windowIndex, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java index bbd5eca049..1baa2a6432 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java @@ -46,25 +46,7 @@ public interface MediaSourceEventListener { * LoadEventInfo#uri} won't reflect potential redirection yet and {@link * LoadEventInfo#responseHeaders} will be empty. * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. - */ - @Deprecated - default void onLoadStarted( - int windowIndex, - @Nullable MediaPeriodId mediaPeriodId, - LoadEventInfo loadEventInfo, - MediaLoadData mediaLoadData) {} - - /** - * Called when a load begins. - * - * @param windowIndex The window index in the timeline of the media source this load belongs to. - * @param mediaPeriodId The {@link MediaPeriodId} this load belongs to. Null if the load does not - * belong to a specific media period. - * @param loadEventInfo The {@link LoadEventInfo} corresponding to the event. The value of {@link - * LoadEventInfo#uri} won't reflect potential redirection yet and {@link - * LoadEventInfo#responseHeaders} will be empty. - * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. - * @param retryCount The number of failed attempts since {@link #onLoadStarted} was called (this + * @param retryCount The number of failed attempts since this method was first called (this * is zero for the first load attempt). */ default void onLoadStarted( @@ -82,7 +64,7 @@ public interface MediaSourceEventListener { * belong to a specific media period. * @param loadEventInfo The {@link LoadEventInfo} corresponding to the event. The values of {@link * LoadEventInfo#elapsedRealtimeMs} and {@link LoadEventInfo#bytesLoaded} are relative to the - * corresponding {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)} + * corresponding {@link #onLoadStarted} * event. * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. */ @@ -100,7 +82,7 @@ public interface MediaSourceEventListener { * belong to a specific media period. * @param loadEventInfo The {@link LoadEventInfo} corresponding to the event. The values of {@link * LoadEventInfo#elapsedRealtimeMs} and {@link LoadEventInfo#bytesLoaded} are relative to the - * corresponding {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)} + * corresponding {@link #onLoadStarted} * event. * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. */ @@ -129,7 +111,7 @@ public interface MediaSourceEventListener { * belong to a specific media period. * @param loadEventInfo The {@link LoadEventInfo} corresponding to the event. The values of {@link * LoadEventInfo#elapsedRealtimeMs} and {@link LoadEventInfo#bytesLoaded} are relative to the - * corresponding {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)} + * corresponding {@link #onLoadStarted} * event. * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. * @param error The load error. @@ -244,20 +226,6 @@ public interface MediaSourceEventListener { } } - /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ - @Deprecated - public void loadStarted(LoadEventInfo loadEventInfo, @DataType int dataType) { - loadStarted( - loadEventInfo, - dataType, - /* trackType= */ C.TRACK_TYPE_UNKNOWN, - /* trackFormat= */ null, - /* trackSelectionReason= */ C.SELECTION_REASON_UNKNOWN, - /* trackSelectionData= */ null, - /* mediaStartTimeUs= */ C.TIME_UNSET, - /* mediaEndTimeUs= */ C.TIME_UNSET); - } - /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData, int)}. */ public void loadStarted(LoadEventInfo loadEventInfo, @DataType int dataType, int retryCount) { loadStarted( @@ -272,29 +240,6 @@ public interface MediaSourceEventListener { /* retryCount= */ retryCount); } - /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ - @Deprecated - public void loadStarted( - LoadEventInfo loadEventInfo, - @DataType int dataType, - @C.TrackType int trackType, - @Nullable Format trackFormat, - @C.SelectionReason int trackSelectionReason, - @Nullable Object trackSelectionData, - long mediaStartTimeUs, - long mediaEndTimeUs) { - loadStarted( - loadEventInfo, - new MediaLoadData( - dataType, - trackType, - trackFormat, - trackSelectionReason, - trackSelectionData, - usToMs(mediaStartTimeUs), - usToMs(mediaEndTimeUs))); - } - /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData, int)}. */ public void loadStarted( LoadEventInfo loadEventInfo, @@ -319,15 +264,6 @@ public interface MediaSourceEventListener { retryCount); } - /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData)}. */ - @Deprecated - public void loadStarted(LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { - dispatchEvent( - (listener) -> - listener.onLoadStarted( - windowIndex, mediaPeriodId, loadEventInfo, mediaLoadData)); - } - /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData, int)}. */ public void loadStarted( LoadEventInfo loadEventInfo, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java index 087da13b91..4af2980841 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java @@ -920,7 +920,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; C.SELECTION_REASON_UNKNOWN, /* trackSelectionData= */ null, /* mediaStartTimeUs= */ loadable.seekTimeUs, - durationUs); + durationUs, /* retryCount= */ 0); } /** diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java index 4dcf0e30f6..e24ad31bea 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java @@ -168,7 +168,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; C.SELECTION_REASON_UNKNOWN, /* trackSelectionData= */ null, /* mediaStartTimeUs= */ 0, - durationUs); + durationUs, /* retryCount= */ 0); return true; } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java index 3ed590e3ea..3fa5f0da5b 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java @@ -427,12 +427,14 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource int windowIndex, @Nullable MediaPeriodId mediaPeriodId, LoadEventInfo loadEventInfo, - MediaLoadData mediaLoadData) { + MediaLoadData mediaLoadData, int retryCount) { + // TODO file a bug to track updating this. + if (retryCount == 0) { @Nullable MediaPeriodImpl mediaPeriod = getMediaPeriodForEvent(mediaPeriodId, mediaLoadData, /* useLoadingPeriod= */ true); if (mediaPeriod == null) { - mediaSourceEventDispatcherWithoutId.loadStarted(loadEventInfo, mediaLoadData); + mediaSourceEventDispatcherWithoutId.loadStarted(loadEventInfo, mediaLoadData, /* retryCount= */ 0); } else { mediaPeriod.sharedPeriod.onLoadStarted(loadEventInfo, mediaLoadData); mediaPeriod.mediaSourceEventDispatcher.loadStarted( @@ -440,7 +442,9 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource correctMediaLoadData( mediaPeriod, mediaLoadData, - checkNotNull(adPlaybackStates.get(mediaPeriod.mediaPeriodId.periodUid)))); + checkNotNull(adPlaybackStates.get(mediaPeriod.mediaPeriodId.periodUid))), /* retryCount= */ 0); + + } } } @@ -750,7 +754,7 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource loadData.first, correctMediaLoadData(loadingPeriod, loadData.second, adPlaybackState)); mediaPeriod.mediaSourceEventDispatcher.loadStarted( - loadData.first, correctMediaLoadData(mediaPeriod, loadData.second, adPlaybackState)); + loadData.first, correctMediaLoadData(mediaPeriod, loadData.second, adPlaybackState), /* retryCount= */ 0); } } this.loadingPeriod = mediaPeriod; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java index 490b5fcbd2..87db87e608 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java @@ -663,7 +663,7 @@ public class ChunkSampleStream loadable.trackSelectionReason, loadable.trackSelectionData, loadable.startTimeUs, - loadable.endTimeUs); + loadable.endTimeUs, /* retryCount= */ 0); return true; } diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java index 938c531571..07c0f37ef2 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java @@ -1106,7 +1106,7 @@ public final class DashMediaSource extends BaseMediaSource { long elapsedRealtimeMs = loader.startLoading(loadable, callback, minRetryCount); manifestEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), - loadable.type); + loadable.type, /* retryCount= */ 0); } private static long getIntervalUntilNextManifestRefreshMs( diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java index 87f33f35e6..7297ce5561 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java @@ -811,6 +811,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; long elapsedRealtimeMs = loader.startLoading( loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); + // DO NOT SUBMIT is this duplicated with the line in onLoadStarted below on L868? mediaSourceEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), loadable.type, @@ -819,7 +820,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; loadable.trackSelectionReason, loadable.trackSelectionData, loadable.startTimeUs, - loadable.endTimeUs); + loadable.endTimeUs, /* retryCount= */ 0); return true; } @@ -872,7 +873,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; loadable.trackSelectionReason, loadable.trackSelectionData, loadable.startTimeUs, - loadable.endTimeUs); + loadable.endTimeUs, retryCount); } @Override diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java index 544756f71d..e603f9b473 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java @@ -152,7 +152,7 @@ public final class DefaultHlsPlaylistTracker multivariantPlaylistLoadable.loadTaskId, multivariantPlaylistLoadable.dataSpec, elapsedRealtime), - multivariantPlaylistLoadable.type); + multivariantPlaylistLoadable.type, /* retryCount= */ 0); } @Override @@ -759,7 +759,7 @@ public final class DefaultHlsPlaylistTracker eventDispatcher.loadStarted( new LoadEventInfo( mediaPlaylistLoadable.loadTaskId, mediaPlaylistLoadable.dataSpec, elapsedRealtime), - mediaPlaylistLoadable.type); + mediaPlaylistLoadable.type, /* retryCount= */ 0); } private void processLoadedPlaylist( diff --git a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java index 7c45d8d5b0..98d17a2c74 100644 --- a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java +++ b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java @@ -673,6 +673,6 @@ public final class SsMediaSource extends BaseMediaSource loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); manifestEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), - loadable.type); + loadable.type, /* retryCount= */ 0); } } diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java index 23e6d40fc9..5a6b53c7b8 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeAdaptiveMediaPeriod.java @@ -108,15 +108,6 @@ public class FakeAdaptiveMediaPeriod @Override public void prepare(Callback callback, long positionUs) { - mediaSourceEventDispatcher.loadStarted( - new LoadEventInfo(fakePreparationLoadTaskId, FAKE_DATA_SPEC, SystemClock.elapsedRealtime()), - C.DATA_TYPE_MEDIA, - C.TRACK_TYPE_UNKNOWN, - /* trackFormat= */ null, - C.SELECTION_REASON_UNKNOWN, - /* trackSelectionData= */ null, - /* mediaStartTimeUs= */ 0, - /* mediaEndTimeUs= */ C.TIME_UNSET); mediaSourceEventDispatcher.loadStarted( new LoadEventInfo(fakePreparationLoadTaskId, FAKE_DATA_SPEC, SystemClock.elapsedRealtime()), C.DATA_TYPE_MEDIA, diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaPeriod.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaPeriod.java index 3aaa1ac96f..a8740dd63d 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaPeriod.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaPeriod.java @@ -227,15 +227,6 @@ public class FakeMediaPeriod implements MediaPeriod { @Override public synchronized void prepare(Callback callback, long positionUs) { - mediaSourceEventDispatcher.loadStarted( - new LoadEventInfo(fakePreparationLoadTaskId, FAKE_DATA_SPEC, SystemClock.elapsedRealtime()), - C.DATA_TYPE_MEDIA, - C.TRACK_TYPE_UNKNOWN, - /* trackFormat= */ null, - C.SELECTION_REASON_UNKNOWN, - /* trackSelectionData= */ null, - /* mediaStartTimeUs= */ 0, - /* mediaEndTimeUs= */ C.TIME_UNSET); mediaSourceEventDispatcher.loadStarted( new LoadEventInfo(fakePreparationLoadTaskId, FAKE_DATA_SPEC, SystemClock.elapsedRealtime()), C.DATA_TYPE_MEDIA, diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java index eebdd59224..f1fd428482 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/FakeMediaSource.java @@ -446,16 +446,6 @@ public class FakeMediaSource extends BaseMediaSource { MediaSourceEventListener.EventDispatcher eventDispatcher = createEventDispatcher(/* mediaPeriodId= */ null); long loadTaskId = LoadEventInfo.getNewId(); - eventDispatcher.loadStarted( - new LoadEventInfo( - loadTaskId, - FAKE_DATA_SPEC, - FAKE_DATA_SPEC.uri, - /* responseHeaders= */ ImmutableMap.of(), - elapsedRealTimeMs, - /* loadDurationMs= */ 0, - /* bytesLoaded= */ 0), - mediaLoadData); eventDispatcher.loadStarted( new LoadEventInfo( loadTaskId, diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/MediaSourceTestRunner.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/MediaSourceTestRunner.java index 6e003e92bf..ac0c393c71 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/MediaSourceTestRunner.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/MediaSourceTestRunner.java @@ -359,15 +359,6 @@ public class MediaSourceTestRunner { // MediaSourceEventListener methods. - @Override - public void onLoadStarted( - int windowIndex, - @Nullable MediaPeriodId mediaPeriodId, - LoadEventInfo loadEventInfo, - MediaLoadData mediaLoadData) { - Assertions.checkState(Looper.myLooper() == playbackThread.getLooper()); - } - @Override public void onLoadStarted( int windowIndex, From b565f47d183ed52007fd88894a8da3d73cd7bdc2 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Wed, 23 Oct 2024 14:11:13 +0100 Subject: [PATCH 06/12] Reformat with google-java-format --- .../media3/exoplayer/MediaSourceList.java | 7 +++-- .../source/MediaSourceEventListener.java | 17 +++++------- .../source/ProgressiveMediaPeriod.java | 3 ++- .../source/SingleSampleMediaPeriod.java | 7 ++--- .../ads/ServerSideAdInsertionMediaSource.java | 26 +++++++++++-------- .../source/chunk/ChunkSampleStream.java | 8 +++--- .../exoplayer/dash/DashMediaSource.java | 20 +++++++++----- .../exoplayer/hls/HlsSampleStreamWrapper.java | 11 ++++---- .../playlist/DefaultHlsPlaylistTracker.java | 11 ++++---- .../smoothstreaming/SsMediaSource.java | 10 ++++--- 10 files changed, 67 insertions(+), 53 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java index 87d11a580c..0d534b1fe7 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/MediaSourceList.java @@ -573,8 +573,11 @@ import java.util.Set; eventHandler.post( () -> eventListener.onLoadStarted( - eventParameters.first, eventParameters.second, - loadEventData, mediaLoadData, retryCount)); + eventParameters.first, + eventParameters.second, + loadEventData, + mediaLoadData, + retryCount)); } } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java index 1baa2a6432..3a427f98f8 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java @@ -46,8 +46,8 @@ public interface MediaSourceEventListener { * LoadEventInfo#uri} won't reflect potential redirection yet and {@link * LoadEventInfo#responseHeaders} will be empty. * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. - * @param retryCount The number of failed attempts since this method was first called (this - * is zero for the first load attempt). + * @param retryCount The number of failed attempts since this method was first called (this is + * zero for the first load attempt). */ default void onLoadStarted( int windowIndex, @@ -64,8 +64,7 @@ public interface MediaSourceEventListener { * belong to a specific media period. * @param loadEventInfo The {@link LoadEventInfo} corresponding to the event. The values of {@link * LoadEventInfo#elapsedRealtimeMs} and {@link LoadEventInfo#bytesLoaded} are relative to the - * corresponding {@link #onLoadStarted} - * event. + * corresponding {@link #onLoadStarted} event. * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. */ default void onLoadCompleted( @@ -82,8 +81,7 @@ public interface MediaSourceEventListener { * belong to a specific media period. * @param loadEventInfo The {@link LoadEventInfo} corresponding to the event. The values of {@link * LoadEventInfo#elapsedRealtimeMs} and {@link LoadEventInfo#bytesLoaded} are relative to the - * corresponding {@link #onLoadStarted} - * event. + * corresponding {@link #onLoadStarted} event. * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. */ default void onLoadCanceled( @@ -111,8 +109,7 @@ public interface MediaSourceEventListener { * belong to a specific media period. * @param loadEventInfo The {@link LoadEventInfo} corresponding to the event. The values of {@link * LoadEventInfo#elapsedRealtimeMs} and {@link LoadEventInfo#bytesLoaded} are relative to the - * corresponding {@link #onLoadStarted} - * event. + * corresponding {@link #onLoadStarted} event. * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. * @param error The load error. * @param wasCanceled Whether the load was canceled as a result of the error. @@ -266,9 +263,7 @@ public interface MediaSourceEventListener { /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData, int)}. */ public void loadStarted( - LoadEventInfo loadEventInfo, - MediaLoadData mediaLoadData, - int retryCount) { + LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData, int retryCount) { dispatchEvent( (listener) -> listener.onLoadStarted( diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java index 4af2980841..b523d2f4f0 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java @@ -920,7 +920,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; C.SELECTION_REASON_UNKNOWN, /* trackSelectionData= */ null, /* mediaStartTimeUs= */ loadable.seekTimeUs, - durationUs, /* retryCount= */ 0); + durationUs, + /* retryCount= */ 0); } /** diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java index e24ad31bea..c7da1aadfd 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java @@ -168,7 +168,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; C.SELECTION_REASON_UNKNOWN, /* trackSelectionData= */ null, /* mediaStartTimeUs= */ 0, - durationUs, /* retryCount= */ 0); + durationUs, + /* retryCount= */ 0); return true; } @@ -208,8 +209,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; // Loader.Callback implementation. @Override - public void onLoadStarted(SourceLoadable loadable, long elapsedRealtimeMs, long loadDurationMs, - int retryCount) { + public void onLoadStarted( + SourceLoadable loadable, long elapsedRealtimeMs, long loadDurationMs, int retryCount) { StatsDataSource dataSource = loadable.dataSource; LoadEventInfo loadEventInfo = new LoadEventInfo( diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java index 3fa5f0da5b..2b1c569ec1 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java @@ -427,24 +427,26 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource int windowIndex, @Nullable MediaPeriodId mediaPeriodId, LoadEventInfo loadEventInfo, - MediaLoadData mediaLoadData, int retryCount) { + MediaLoadData mediaLoadData, + int retryCount) { // TODO file a bug to track updating this. if (retryCount == 0) { @Nullable MediaPeriodImpl mediaPeriod = getMediaPeriodForEvent(mediaPeriodId, mediaLoadData, /* useLoadingPeriod= */ true); if (mediaPeriod == null) { - mediaSourceEventDispatcherWithoutId.loadStarted(loadEventInfo, mediaLoadData, /* retryCount= */ 0); + mediaSourceEventDispatcherWithoutId.loadStarted( + loadEventInfo, mediaLoadData, /* retryCount= */ 0); } else { mediaPeriod.sharedPeriod.onLoadStarted(loadEventInfo, mediaLoadData); - mediaPeriod.mediaSourceEventDispatcher.loadStarted( - loadEventInfo, - correctMediaLoadData( - mediaPeriod, - mediaLoadData, - checkNotNull(adPlaybackStates.get(mediaPeriod.mediaPeriodId.periodUid))), /* retryCount= */ 0); - - } + mediaPeriod.mediaSourceEventDispatcher.loadStarted( + loadEventInfo, + correctMediaLoadData( + mediaPeriod, + mediaLoadData, + checkNotNull(adPlaybackStates.get(mediaPeriod.mediaPeriodId.periodUid))), + /* retryCount= */ 0); + } } } @@ -754,7 +756,9 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource loadData.first, correctMediaLoadData(loadingPeriod, loadData.second, adPlaybackState)); mediaPeriod.mediaSourceEventDispatcher.loadStarted( - loadData.first, correctMediaLoadData(mediaPeriod, loadData.second, adPlaybackState), /* retryCount= */ 0); + loadData.first, + correctMediaLoadData(mediaPeriod, loadData.second, adPlaybackState), + /* retryCount= */ 0); } } this.loadingPeriod = mediaPeriod; diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java index 87db87e608..0ba48bce0e 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java @@ -429,10 +429,9 @@ public class ChunkSampleStream // Loader.Callback implementation. - @Override - public void onLoadStarted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, - int retryCount) { + public void onLoadStarted( + Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, int retryCount) { mediaSourceEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), loadable.type, @@ -663,7 +662,8 @@ public class ChunkSampleStream loadable.trackSelectionReason, loadable.trackSelectionData, loadable.startTimeUs, - loadable.endTimeUs, /* retryCount= */ 0); + loadable.endTimeUs, + /* retryCount= */ 0); return true; } diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java index 07c0f37ef2..701c96dd0c 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java @@ -630,12 +630,14 @@ public final class DashMediaSource extends BaseMediaSource { // Loadable callbacks. /* package */ void onManifestLoadStarted( - ParsingLoadable loadable, long elapsedRealtimeMs, - long loadDurationMs, int retryCount) { - manifestEventDispatcher.loadStarted( + ParsingLoadable loadable, + long elapsedRealtimeMs, + long loadDurationMs, + int retryCount) { + manifestEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), loadable.type, - retryCount); + retryCount); } /* package */ void onManifestLoadCompleted( @@ -1106,7 +1108,8 @@ public final class DashMediaSource extends BaseMediaSource { long elapsedRealtimeMs = loader.startLoading(loadable, callback, minRetryCount); manifestEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), - loadable.type, /* retryCount= */ 0); + loadable.type, + /* retryCount= */ 0); } private static long getIntervalUntilNextManifestRefreshMs( @@ -1399,8 +1402,11 @@ public final class DashMediaSource extends BaseMediaSource { private final class ManifestCallback implements Loader.Callback> { @Override - public void onLoadStarted(ParsingLoadable loadable, long elapsedRealtimeMs, - long loadDurationMs, int retryCount) { + public void onLoadStarted( + ParsingLoadable loadable, + long elapsedRealtimeMs, + long loadDurationMs, + int retryCount) { onManifestLoadStarted(loadable, elapsedRealtimeMs, loadDurationMs, retryCount); } diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java index 7297ce5561..dca0e341ee 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java @@ -820,7 +820,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; loadable.trackSelectionReason, loadable.trackSelectionData, loadable.startTimeUs, - loadable.endTimeUs, /* retryCount= */ 0); + loadable.endTimeUs, + /* retryCount= */ 0); return true; } @@ -861,10 +862,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; // Loader.Callback implementation. - @Override - public void onLoadStarted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, - int retryCount) { + public void onLoadStarted( + Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, int retryCount) { mediaSourceEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), loadable.type, @@ -873,7 +873,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; loadable.trackSelectionReason, loadable.trackSelectionData, loadable.startTimeUs, - loadable.endTimeUs, retryCount); + loadable.endTimeUs, + retryCount); } @Override diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java index e603f9b473..93942d73df 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java @@ -152,7 +152,8 @@ public final class DefaultHlsPlaylistTracker multivariantPlaylistLoadable.loadTaskId, multivariantPlaylistLoadable.dataSpec, elapsedRealtime), - multivariantPlaylistLoadable.type, /* retryCount= */ 0); + multivariantPlaylistLoadable.type, + /* retryCount= */ 0); } @Override @@ -261,10 +262,7 @@ public final class DefaultHlsPlaylistTracker long loadDurationMs, int retryCount) { eventDispatcher.loadStarted( - new LoadEventInfo( - loadable.loadTaskId, - loadable.dataSpec, - elapsedRealtimeMs), + new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), loadable.type, retryCount); } @@ -759,7 +757,8 @@ public final class DefaultHlsPlaylistTracker eventDispatcher.loadStarted( new LoadEventInfo( mediaPlaylistLoadable.loadTaskId, mediaPlaylistLoadable.dataSpec, elapsedRealtime), - mediaPlaylistLoadable.type, /* retryCount= */ 0); + mediaPlaylistLoadable.type, + /* retryCount= */ 0); } private void processLoadedPlaylist( diff --git a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java index 98d17a2c74..8f5f12bbbd 100644 --- a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java +++ b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java @@ -498,8 +498,11 @@ public final class SsMediaSource extends BaseMediaSource // Loader.Callback implementation @Override - public void onLoadStarted(ParsingLoadable loadable, long elapsedRealtimeMs, - long loadDurationMs, int retryCount) { + public void onLoadStarted( + ParsingLoadable loadable, + long elapsedRealtimeMs, + long loadDurationMs, + int retryCount) { manifestEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), loadable.type, @@ -673,6 +676,7 @@ public final class SsMediaSource extends BaseMediaSource loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); manifestEventDispatcher.loadStarted( new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), - loadable.type, /* retryCount= */ 0); + loadable.type, + /* retryCount= */ 0); } } From d3298391b23cae13dc99a3ea3b4e32ace54dcbca Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Wed, 23 Oct 2024 14:26:21 +0100 Subject: [PATCH 07/12] Fix onLoadStarted event accumulation in DefaultAnalyticsCollectorTest --- .../exoplayer/analytics/DefaultAnalyticsCollectorTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java index a69a0ba69b..1c38f410bd 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java @@ -2269,7 +2269,7 @@ public final class DefaultAnalyticsCollectorTest { @Override public void onLoadStarted( EventTime eventTime, LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { - reportedEvents.add(new ReportedEvent(EVENT_LOAD_STARTED, eventTime)); + reportedEvents.add(new ReportedEvent(DEPRECATED_EVENT_LOAD_STARTED, eventTime)); } @Override @@ -2278,7 +2278,7 @@ public final class DefaultAnalyticsCollectorTest { LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData, int retryCount) { - reportedEvents.add(new ReportedEvent(DEPRECATED_EVENT_LOAD_STARTED, eventTime)); + reportedEvents.add(new ReportedEvent(EVENT_LOAD_STARTED, eventTime)); } @Override From 473a4a76800e3c9d03f3fad65cb0166afd8011d7 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Wed, 23 Oct 2024 14:29:19 +0100 Subject: [PATCH 08/12] Call both old and new onLoadStarted methods in DefaultAnalyticsCollector --- .../media3/exoplayer/analytics/AnalyticsListener.java | 7 ++----- .../exoplayer/analytics/DefaultAnalyticsCollector.java | 6 ++++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java index b8ddc6f63f..76a6591a2c 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java @@ -844,11 +844,8 @@ public interface AnalyticsListener { default void onPlaylistMetadataChanged(EventTime eventTime, MediaMetadata playlistMetadata) {} /** - * Called when a media source started loading data. - * - * @param eventTime The event time. - * @param loadEventInfo The {@link LoadEventInfo} defining the load event. - * @param mediaLoadData The {@link MediaLoadData} defining the data being loaded. + * @deprecated Implement {@link #onLoadStarted(EventTime, LoadEventInfo, MediaLoadData, int)} + * instead. */ @UnstableApi @Deprecated diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java index 3f80d131b9..adbb659ff4 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java @@ -397,6 +397,8 @@ public class DefaultAnalyticsCollector implements AnalyticsCollector { // MediaSourceEventListener implementation. + // Deliberately calling deprecated listener method for backwards compatibility. + @SuppressWarnings("deprecation") @Override public final void onLoadStarted( int windowIndex, @@ -405,6 +407,10 @@ public class DefaultAnalyticsCollector implements AnalyticsCollector { MediaLoadData mediaLoadData, int retryCount) { EventTime eventTime = generateMediaPeriodEventTime(windowIndex, mediaPeriodId); + sendEvent( + eventTime, + C.INDEX_UNSET, + listener -> listener.onLoadStarted(eventTime, loadEventInfo, mediaLoadData)); sendEvent( eventTime, AnalyticsListener.EVENT_LOAD_STARTED, From 7cf500bc2d3908171ced9c9856265835eee92987 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Wed, 23 Oct 2024 14:31:41 +0100 Subject: [PATCH 09/12] Fix compilation of MergingMediaSourceTest --- .../androidx/media3/exoplayer/analytics/AnalyticsListener.java | 2 +- .../media3/exoplayer/source/MergingMediaSourceTest.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java index 76a6591a2c..83785bfa05 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java @@ -845,7 +845,7 @@ public interface AnalyticsListener { /** * @deprecated Implement {@link #onLoadStarted(EventTime, LoadEventInfo, MediaLoadData, int)} - * instead. + * instead. */ @UnstableApi @Deprecated diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/MergingMediaSourceTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/MergingMediaSourceTest.java index b39328c399..5630e97945 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/MergingMediaSourceTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/source/MergingMediaSourceTest.java @@ -139,7 +139,8 @@ public class MergingMediaSourceTest { int windowIndex, @Nullable MediaPeriodId mediaPeriodId, LoadEventInfo loadEventInfo, - MediaLoadData mediaLoadData) { + MediaLoadData mediaLoadData, + int retryCount) { if (mediaPeriodId != null) { onLoadStartedMediaPeriodUids.add(mediaPeriodId.periodUid); } From 37f795ea825824a75eda60e47174cce9ccc80b48 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Wed, 23 Oct 2024 15:51:11 +0100 Subject: [PATCH 10/12] Try removing duplicate calls --- .../analytics/DefaultAnalyticsCollector.java | 2 +- .../source/MediaSourceEventListener.java | 2 +- .../source/ProgressiveMediaPeriod.java | 58 +++++++------------ .../source/SingleSampleMediaPeriod.java | 21 ++----- .../ads/ServerSideAdInsertionMediaSource.java | 12 ++-- .../source/chunk/ChunkSampleStream.java | 24 ++++---- .../exoplayer/dash/DashMediaSource.java | 15 +++-- .../exoplayer/hls/HlsSampleStreamWrapper.java | 25 ++++---- .../playlist/DefaultHlsPlaylistTracker.java | 32 ++++------ .../smoothstreaming/SsMediaSource.java | 9 ++- 10 files changed, 84 insertions(+), 116 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java index adbb659ff4..8b3bee79f3 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java @@ -409,7 +409,7 @@ public class DefaultAnalyticsCollector implements AnalyticsCollector { EventTime eventTime = generateMediaPeriodEventTime(windowIndex, mediaPeriodId); sendEvent( eventTime, - C.INDEX_UNSET, + /* eventFlag= */ C.INDEX_UNSET, listener -> listener.onLoadStarted(eventTime, loadEventInfo, mediaLoadData)); sendEvent( eventTime, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java index 3a427f98f8..d61cabc12f 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java @@ -234,7 +234,7 @@ public interface MediaSourceEventListener { /* trackSelectionData= */ null, /* mediaStartTimeUs= */ C.TIME_UNSET, /* mediaEndTimeUs= */ C.TIME_UNSET, - /* retryCount= */ retryCount); + retryCount); } /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData, int)}. */ diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java index b523d2f4f0..a8954050d7 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java @@ -600,28 +600,26 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; @Override public void onLoadStarted( ExtractingLoadable loadable, long elapsedRealtimeMs, long loadDurationMs, int retryCount) { - if (retryCount > 0) { - StatsDataSource dataSource = loadable.dataSource; - LoadEventInfo loadEventInfo = - new LoadEventInfo( - loadable.loadTaskId, - loadable.dataSpec, - dataSource.getLastOpenedUri(), - dataSource.getLastResponseHeaders(), - elapsedRealtimeMs, - loadDurationMs, - dataSource.getBytesRead()); - mediaSourceEventDispatcher.loadStarted( - loadEventInfo, - C.DATA_TYPE_MEDIA, - C.TRACK_TYPE_UNKNOWN, - /* trackFormat= */ null, - C.SELECTION_REASON_UNKNOWN, - /* trackSelectionData= */ null, - /* mediaStartTimeUs= */ loadable.seekTimeUs, - durationUs, - retryCount); - } + StatsDataSource dataSource = loadable.dataSource; + LoadEventInfo loadEventInfo = + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + dataSource.getLastOpenedUri(), + dataSource.getLastResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + /* bytesLoaded= */ 0); + mediaSourceEventDispatcher.loadStarted( + loadEventInfo, + C.DATA_TYPE_MEDIA, + C.TRACK_TYPE_UNKNOWN, + /* trackFormat= */ null, + C.SELECTION_REASON_UNKNOWN, + /* trackSelectionData= */ null, + /* mediaStartTimeUs= */ loadable.seekTimeUs, + durationUs, + retryCount); } @Override @@ -908,20 +906,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; pendingResetPositionUs = C.TIME_UNSET; } extractedSamplesCountAtStartOfLoad = getExtractedSamplesCount(); - long elapsedRealtimeMs = - loader.startLoading( - loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(dataType)); - DataSpec dataSpec = loadable.dataSpec; - mediaSourceEventDispatcher.loadStarted( - new LoadEventInfo(loadable.loadTaskId, dataSpec, elapsedRealtimeMs), - C.DATA_TYPE_MEDIA, - C.TRACK_TYPE_UNKNOWN, - /* trackFormat= */ null, - C.SELECTION_REASON_UNKNOWN, - /* trackSelectionData= */ null, - /* mediaStartTimeUs= */ loadable.seekTimeUs, - durationUs, - /* retryCount= */ 0); + loader.startLoading( + loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(dataType)); } /** diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java index c7da1aadfd..79e7b7151e 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java @@ -155,21 +155,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; dataSource.addTransferListener(transferListener); } SourceLoadable loadable = new SourceLoadable(dataSpec, dataSource); - long elapsedRealtimeMs = - loader.startLoading( - loadable, - /* callback= */ this, - loadErrorHandlingPolicy.getMinimumLoadableRetryCount(C.DATA_TYPE_MEDIA)); - eventDispatcher.loadStarted( - new LoadEventInfo(loadable.loadTaskId, dataSpec, elapsedRealtimeMs), - C.DATA_TYPE_MEDIA, - C.TRACK_TYPE_UNKNOWN, - format, - C.SELECTION_REASON_UNKNOWN, - /* trackSelectionData= */ null, - /* mediaStartTimeUs= */ 0, - durationUs, - /* retryCount= */ 0); + loader.startLoading( + loadable, + /* callback= */ this, + loadErrorHandlingPolicy.getMinimumLoadableRetryCount(C.DATA_TYPE_MEDIA)); return true; } @@ -220,7 +209,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; dataSource.getLastResponseHeaders(), elapsedRealtimeMs, loadDurationMs, - sampleSize); + /* bytesLoaded= */ 0); eventDispatcher.loadStarted( loadEventInfo, C.DATA_TYPE_MEDIA, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java index 2b1c569ec1..1b1d96b2f6 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java @@ -431,14 +431,14 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource int retryCount) { // TODO file a bug to track updating this. if (retryCount == 0) { - @Nullable - MediaPeriodImpl mediaPeriod = - getMediaPeriodForEvent(mediaPeriodId, mediaLoadData, /* useLoadingPeriod= */ true); - if (mediaPeriod == null) { + @Nullable + MediaPeriodImpl mediaPeriod = + getMediaPeriodForEvent(mediaPeriodId, mediaLoadData, /* useLoadingPeriod= */ true); + if (mediaPeriod == null) { mediaSourceEventDispatcherWithoutId.loadStarted( loadEventInfo, mediaLoadData, /* retryCount= */ 0); - } else { - mediaPeriod.sharedPeriod.onLoadStarted(loadEventInfo, mediaLoadData); + } else { + mediaPeriod.sharedPeriod.onLoadStarted(loadEventInfo, mediaLoadData); mediaPeriod.mediaSourceEventDispatcher.loadStarted( loadEventInfo, correctMediaLoadData( diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java index 0ba48bce0e..6c897a91df 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java @@ -433,7 +433,14 @@ public class ChunkSampleStream public void onLoadStarted( Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, int retryCount) { mediaSourceEventDispatcher.loadStarted( - new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + loadable.getUri(), + loadable.getResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + /* bytesLoaded= */ 0), loadable.type, primaryTrackType, loadable.trackFormat, @@ -651,19 +658,8 @@ public class ChunkSampleStream } else if (loadable instanceof InitializationChunk) { ((InitializationChunk) loadable).init(chunkOutput); } - long elapsedRealtimeMs = - loader.startLoading( - loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); - mediaSourceEventDispatcher.loadStarted( - new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), - loadable.type, - primaryTrackType, - loadable.trackFormat, - loadable.trackSelectionReason, - loadable.trackSelectionData, - loadable.startTimeUs, - loadable.endTimeUs, - /* retryCount= */ 0); + loader.startLoading( + loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); return true; } diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java index 701c96dd0c..de8686bb19 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java @@ -635,7 +635,14 @@ public final class DashMediaSource extends BaseMediaSource { long loadDurationMs, int retryCount) { manifestEventDispatcher.loadStarted( - new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + loadable.getUri(), + loadable.getResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + /* bytesLoaded= */ 0), loadable.type, retryCount); } @@ -1105,11 +1112,7 @@ public final class DashMediaSource extends BaseMediaSource { ParsingLoadable loadable, Loader.Callback> callback, int minRetryCount) { - long elapsedRealtimeMs = loader.startLoading(loadable, callback, minRetryCount); - manifestEventDispatcher.loadStarted( - new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), - loadable.type, - /* retryCount= */ 0); + loader.startLoading(loadable, callback, minRetryCount); } private static long getIntervalUntilNextManifestRefreshMs( diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java index dca0e341ee..9863ced91f 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java @@ -808,20 +808,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; initMediaChunkLoad((HlsMediaChunk) loadable); } loadingChunk = loadable; - long elapsedRealtimeMs = - loader.startLoading( - loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); - // DO NOT SUBMIT is this duplicated with the line in onLoadStarted below on L868? - mediaSourceEventDispatcher.loadStarted( - new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), - loadable.type, - trackType, - loadable.trackFormat, - loadable.trackSelectionReason, - loadable.trackSelectionData, - loadable.startTimeUs, - loadable.endTimeUs, - /* retryCount= */ 0); + loader.startLoading( + loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); return true; } @@ -866,7 +854,14 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; public void onLoadStarted( Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, int retryCount) { mediaSourceEventDispatcher.loadStarted( - new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + loadable.getUri(), + loadable.getResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + /* bytesLoaded= */ 0), loadable.type, trackType, loadable.trackFormat, diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java index 93942d73df..51c6d04e5e 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java @@ -141,19 +141,10 @@ public final class DefaultHlsPlaylistTracker playlistParserFactory.createPlaylistParser()); Assertions.checkState(initialPlaylistLoader == null); initialPlaylistLoader = new Loader("DefaultHlsPlaylistTracker:MultivariantPlaylist"); - long elapsedRealtime = - initialPlaylistLoader.startLoading( - multivariantPlaylistLoadable, - this, - loadErrorHandlingPolicy.getMinimumLoadableRetryCount( - multivariantPlaylistLoadable.type)); - eventDispatcher.loadStarted( - new LoadEventInfo( - multivariantPlaylistLoadable.loadTaskId, - multivariantPlaylistLoadable.dataSpec, - elapsedRealtime), - multivariantPlaylistLoadable.type, - /* retryCount= */ 0); + initialPlaylistLoader.startLoading( + multivariantPlaylistLoadable, + this, + loadErrorHandlingPolicy.getMinimumLoadableRetryCount(multivariantPlaylistLoadable.type)); } @Override @@ -262,7 +253,14 @@ public final class DefaultHlsPlaylistTracker long loadDurationMs, int retryCount) { eventDispatcher.loadStarted( - new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + loadable.getUri(), + loadable.getResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + /* bytesLoaded= */ 0), loadable.type, retryCount); } @@ -749,16 +747,10 @@ public final class DefaultHlsPlaylistTracker playlistRequestUri, C.DATA_TYPE_MANIFEST, mediaPlaylistParser); - long elapsedRealtime = mediaPlaylistLoader.startLoading( mediaPlaylistLoadable, /* callback= */ this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(mediaPlaylistLoadable.type)); - eventDispatcher.loadStarted( - new LoadEventInfo( - mediaPlaylistLoadable.loadTaskId, mediaPlaylistLoadable.dataSpec, elapsedRealtime), - mediaPlaylistLoadable.type, - /* retryCount= */ 0); } private void processLoadedPlaylist( diff --git a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java index 8f5f12bbbd..a8e9498740 100644 --- a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java +++ b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java @@ -504,7 +504,14 @@ public final class SsMediaSource extends BaseMediaSource long loadDurationMs, int retryCount) { manifestEventDispatcher.loadStarted( - new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + loadable.getUri(), + loadable.getResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + /* bytesLoaded= */ 0), loadable.type, /* retryCount= */ 0); } From 7d3e6b0f2789197b2c122ea0485d90f69aa37a9c Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Wed, 23 Oct 2024 17:16:14 +0100 Subject: [PATCH 11/12] Add release note --- RELEASENOTES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 33056df142..55c7a50d4c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -11,6 +11,8 @@ `TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)`. * Add `selectedAudioLanguage` parameter to `DefaultTrackSelector.selectVideoTrack()` method. + * Add `retryCount` parameter to `MediaSourceEventListener.onLoadStarted` + and corresponding `MediaSourceEventListener.EventDispatcher` methods. * Transformer: * Update parameters of `VideoFrameProcessor.registerInputStream` and `VideoFrameProcessor.Listener.onInputStreamRegistered` to use `Format`. From 683a5b8403966eac75b169e7aa2bafd0d7d3e4a3 Mon Sep 17 00:00:00 2001 From: Ian Baker Date: Thu, 24 Oct 2024 16:27:39 +0100 Subject: [PATCH 12/12] Fix review comments --- .../analytics/AnalyticsListener.java | 2 +- .../analytics/DefaultAnalyticsCollector.java | 9 ++-- .../source/MediaSourceEventListener.java | 44 +++++++++++++++++++ .../source/ProgressiveMediaPeriod.java | 2 +- .../source/SingleSampleMediaPeriod.java | 2 +- .../ads/ServerSideAdInsertionMediaSource.java | 2 +- .../source/chunk/ChunkSampleStream.java | 2 +- .../DefaultAnalyticsCollectorTest.java | 7 ++- .../exoplayer/dash/DashMediaSource.java | 2 +- .../exoplayer/hls/HlsSampleStreamWrapper.java | 2 +- .../playlist/DefaultHlsPlaylistTracker.java | 2 +- .../smoothstreaming/SsMediaSource.java | 13 ++---- 12 files changed, 63 insertions(+), 26 deletions(-) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java index 83785bfa05..e885057918 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/AnalyticsListener.java @@ -845,7 +845,7 @@ public interface AnalyticsListener { /** * @deprecated Implement {@link #onLoadStarted(EventTime, LoadEventInfo, MediaLoadData, int)} - * instead. + * instead, and check for {@code retryCount == 0} for equivalent behavior. */ @UnstableApi @Deprecated diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java index 8b3bee79f3..c12e798f54 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollector.java @@ -407,14 +407,13 @@ public class DefaultAnalyticsCollector implements AnalyticsCollector { MediaLoadData mediaLoadData, int retryCount) { EventTime eventTime = generateMediaPeriodEventTime(windowIndex, mediaPeriodId); - sendEvent( - eventTime, - /* eventFlag= */ C.INDEX_UNSET, - listener -> listener.onLoadStarted(eventTime, loadEventInfo, mediaLoadData)); sendEvent( eventTime, AnalyticsListener.EVENT_LOAD_STARTED, - listener -> listener.onLoadStarted(eventTime, loadEventInfo, mediaLoadData, retryCount)); + listener -> { + listener.onLoadStarted(eventTime, loadEventInfo, mediaLoadData); + listener.onLoadStarted(eventTime, loadEventInfo, mediaLoadData, retryCount); + }); } @Override diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java index d61cabc12f..4a15005e0a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/MediaSourceEventListener.java @@ -223,6 +223,15 @@ public interface MediaSourceEventListener { } } + /** + * @deprecated Use {link {@link #loadStarted(LoadEventInfo, int, int)} instead to pass {@code + * retryCount}. + */ + @Deprecated + public void loadStarted(LoadEventInfo loadEventInfo, @DataType int dataType) { + loadStarted(loadEventInfo, dataType, /* retryCount= */ 0); + } + /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData, int)}. */ public void loadStarted(LoadEventInfo loadEventInfo, @DataType int dataType, int retryCount) { loadStarted( @@ -237,6 +246,32 @@ public interface MediaSourceEventListener { retryCount); } + /** + * @deprecated Use {link {@link #loadStarted(LoadEventInfo, int, int, Format, int, Object, long, + * long, int)} )} instead to pass {@code retryCount}. + */ + @Deprecated + public void loadStarted( + LoadEventInfo loadEventInfo, + @DataType int dataType, + @C.TrackType int trackType, + @Nullable Format trackFormat, + @C.SelectionReason int trackSelectionReason, + @Nullable Object trackSelectionData, + long mediaStartTimeUs, + long mediaEndTimeUs) { + loadStarted( + loadEventInfo, + new MediaLoadData( + dataType, + trackType, + trackFormat, + trackSelectionReason, + trackSelectionData, + usToMs(mediaStartTimeUs), + usToMs(mediaEndTimeUs))); + } + /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData, int)}. */ public void loadStarted( LoadEventInfo loadEventInfo, @@ -261,6 +296,15 @@ public interface MediaSourceEventListener { retryCount); } + /** + * @deprecated Use {link {@link #loadStarted(LoadEventInfo, MediaLoadData, int)} instead to pass + * {@code retryCount}. + */ + @Deprecated + public void loadStarted(LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData) { + loadStarted(loadEventInfo, mediaLoadData, /* retryCount= */ 0); + } + /** Dispatches {@link #onLoadStarted(int, MediaPeriodId, LoadEventInfo, MediaLoadData, int)}. */ public void loadStarted( LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData, int retryCount) { diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java index a8954050d7..5c525f9798 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ProgressiveMediaPeriod.java @@ -609,7 +609,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; dataSource.getLastResponseHeaders(), elapsedRealtimeMs, loadDurationMs, - /* bytesLoaded= */ 0); + dataSource.getBytesRead()); mediaSourceEventDispatcher.loadStarted( loadEventInfo, C.DATA_TYPE_MEDIA, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java index 79e7b7151e..651e296078 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/SingleSampleMediaPeriod.java @@ -209,7 +209,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; dataSource.getLastResponseHeaders(), elapsedRealtimeMs, loadDurationMs, - /* bytesLoaded= */ 0); + dataSource.getBytesRead()); eventDispatcher.loadStarted( loadEventInfo, C.DATA_TYPE_MEDIA, diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java index 1b1d96b2f6..f37a86bdfa 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/ads/ServerSideAdInsertionMediaSource.java @@ -429,7 +429,7 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource LoadEventInfo loadEventInfo, MediaLoadData mediaLoadData, int retryCount) { - // TODO file a bug to track updating this. + // TODO: b/375408535 - Update this to support non-zero retry counts. if (retryCount == 0) { @Nullable MediaPeriodImpl mediaPeriod = diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java index 6c897a91df..006f63911b 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ChunkSampleStream.java @@ -440,7 +440,7 @@ public class ChunkSampleStream loadable.getResponseHeaders(), elapsedRealtimeMs, loadDurationMs, - /* bytesLoaded= */ 0), + loadable.dataSource.getBytesRead()), loadable.type, primaryTrackType, loadable.trackFormat, diff --git a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java index 1c38f410bd..916bb1421e 100644 --- a/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java +++ b/libraries/exoplayer/src/test/java/androidx/media3/exoplayer/analytics/DefaultAnalyticsCollectorTest.java @@ -146,10 +146,9 @@ import org.mockito.InOrder; public final class DefaultAnalyticsCollectorTest { // Deprecated event constants. - private static final long EVENT_PLAYER_STATE_CHANGED = 1L << 63; - private static final long EVENT_SEEK_STARTED = 1L << 62; - // Start from +1 of the MIN because it will collide with 1L << 63 - private static final long DEPRECATED_EVENT_LOAD_STARTED = Long.MIN_VALUE + 1; + private static final long EVENT_PLAYER_STATE_CHANGED = Long.MIN_VALUE; + private static final long EVENT_SEEK_STARTED = Long.MIN_VALUE + 1; + private static final long DEPRECATED_EVENT_LOAD_STARTED = Long.MIN_VALUE + 2; private static final UUID DRM_SCHEME_UUID = UUID.nameUUIDFromBytes(TestUtil.createByteArray(7, 8, 9)); diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java index de8686bb19..3bbbf9929c 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DashMediaSource.java @@ -642,7 +642,7 @@ public final class DashMediaSource extends BaseMediaSource { loadable.getResponseHeaders(), elapsedRealtimeMs, loadDurationMs, - /* bytesLoaded= */ 0), + loadable.bytesLoaded()), loadable.type, retryCount); } diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java index 9863ced91f..60b0333983 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java @@ -861,7 +861,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; loadable.getResponseHeaders(), elapsedRealtimeMs, loadDurationMs, - /* bytesLoaded= */ 0), + loadable.bytesLoaded()), loadable.type, trackType, loadable.trackFormat, diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java index 51c6d04e5e..a36b300bca 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/playlist/DefaultHlsPlaylistTracker.java @@ -260,7 +260,7 @@ public final class DefaultHlsPlaylistTracker loadable.getResponseHeaders(), elapsedRealtimeMs, loadDurationMs, - /* bytesLoaded= */ 0), + loadable.bytesLoaded()), loadable.type, retryCount); } diff --git a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java index a8e9498740..62a581c7d8 100644 --- a/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java +++ b/libraries/exoplayer_smoothstreaming/src/main/java/androidx/media3/exoplayer/smoothstreaming/SsMediaSource.java @@ -511,9 +511,9 @@ public final class SsMediaSource extends BaseMediaSource loadable.getResponseHeaders(), elapsedRealtimeMs, loadDurationMs, - /* bytesLoaded= */ 0), + loadable.bytesLoaded()), loadable.type, - /* retryCount= */ 0); + retryCount); } @Override @@ -678,12 +678,7 @@ public final class SsMediaSource extends BaseMediaSource ParsingLoadable loadable = new ParsingLoadable<>( manifestDataSource, manifestUri, C.DATA_TYPE_MANIFEST, manifestParser); - long elapsedRealtimeMs = - manifestLoader.startLoading( - loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); - manifestEventDispatcher.loadStarted( - new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs), - loadable.type, - /* retryCount= */ 0); + manifestLoader.startLoading( + loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); } }