From fff3f99f4a413f3ccb00df3d322223ba9a30d7d2 Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Mon, 4 May 2020 16:36:55 +0100 Subject: [PATCH] Pass LoadErrorInfo to LoadErrorHandlingPolcy Issue: #7309 PiperOrigin-RevId: 309749566 --- .../exoplayer2/source/MediaLoadData.java | 32 ++++++----- .../source/ProgressiveMediaPeriod.java | 33 ++++++++---- .../source/SingleSampleMediaPeriod.java | 32 +++++++---- .../source/chunk/ChunkSampleStream.java | 39 +++++++++----- .../source/dash/DashMediaSource.java | 27 +++++----- .../source/hls/HlsSampleStreamWrapper.java | 40 ++++++++------ .../playlist/DefaultHlsPlaylistTracker.java | 53 +++++++++---------- .../source/smoothstreaming/SsMediaSource.java | 27 +++++----- 8 files changed, 168 insertions(+), 115 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java index 7d9d5e5969f..0de79e92192 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MediaLoadData.java @@ -55,22 +55,28 @@ public final class MediaLoadData { */ public final long mediaEndTimeMs; + /** Creates an instance with the given {@link #dataType}. */ + public MediaLoadData(int dataType) { + this( + dataType, + /* trackType= */ C.TRACK_TYPE_UNKNOWN, + /* trackFormat= */ null, + /* trackSelectionReason= */ C.SELECTION_REASON_UNKNOWN, + /* trackSelectionData= */ null, + /* mediaStartTimeMs= */ C.TIME_UNSET, + /* mediaEndTimeMs= */ C.TIME_UNSET); + } + /** * Creates media load data. * - * @param dataType One of the {@link C} {@code DATA_TYPE_*} constants defining the type of data. - * @param trackType One of the {@link C} {@code TRACK_TYPE_*} constants if the data corresponds to - * media of a specific type. {@link C#TRACK_TYPE_UNKNOWN} otherwise. - * @param trackFormat The format of the track to which the data belongs. Null if the data does not - * belong to a track. - * @param trackSelectionReason One of the {@link C} {@code SELECTION_REASON_*} constants if the - * data belongs to a track. {@link C#SELECTION_REASON_UNKNOWN} otherwise. - * @param trackSelectionData Optional data associated with the selection of the track to which the - * data belongs. Null if the data does not belong to a track. - * @param mediaStartTimeMs The start time of the media, or {@link C#TIME_UNSET} if the data does - * not belong to a specific media period. - * @param mediaEndTimeMs The end time of the media, or {@link C#TIME_UNSET} if the data does not - * belong to a specific media period or the end time is unknown. + * @param dataType See {@link #dataType}. + * @param trackType See {@link #trackType}. + * @param trackFormat See {@link #trackFormat}. + * @param trackSelectionReason See {@link #trackSelectionReason}. + * @param trackSelectionData See {@link #trackSelectionData}. + * @param mediaStartTimeMs See {@link #mediaStartTimeMs}. + * @param mediaEndTimeMs See {@link #mediaEndTimeMs}. */ public MediaLoadData( int dataType, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java index 64307b028e8..32c96e14f72 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java @@ -41,6 +41,7 @@ import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; +import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo; import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.upstream.Loader.LoadErrorAction; import com.google.android.exoplayer2.upstream.Loader.Loadable; @@ -620,9 +621,29 @@ public LoadErrorAction onLoadError( IOException error, int errorCount) { copyLengthFromLoader(loadable); + StatsDataSource dataSource = loadable.dataSource; + LoadEventInfo loadEventInfo = + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + dataSource.getLastOpenedUri(), + dataSource.getLastResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + dataSource.getBytesRead()); + MediaLoadData mediaLoadData = + new MediaLoadData( + C.DATA_TYPE_MEDIA, + C.TRACK_TYPE_UNKNOWN, + /* trackFormat= */ null, + C.SELECTION_REASON_UNKNOWN, + /* trackSelectionData= */ null, + /* mediaStartTimeMs= */ C.usToMs(loadable.seekTimeUs), + C.usToMs(durationUs)); LoadErrorAction loadErrorAction; long retryDelayMs = - loadErrorHandlingPolicy.getRetryDelayMsFor(dataType, loadDurationMs, error, errorCount); + loadErrorHandlingPolicy.getRetryDelayMsFor( + new LoadErrorInfo(loadEventInfo, mediaLoadData, error, errorCount)); if (retryDelayMs == C.TIME_UNSET) { loadErrorAction = Loader.DONT_RETRY_FATAL; } else /* the load should be retried */ { @@ -634,17 +655,9 @@ public LoadErrorAction onLoadError( : Loader.DONT_RETRY; } - StatsDataSource dataSource = loadable.dataSource; boolean wasCanceled = !loadErrorAction.isRetry(); eventDispatcher.loadError( - new LoadEventInfo( - loadable.loadTaskId, - loadable.dataSpec, - dataSource.getLastOpenedUri(), - dataSource.getLastResponseHeaders(), - elapsedRealtimeMs, - loadDurationMs, - dataSource.getBytesRead()), + loadEventInfo, C.DATA_TYPE_MEDIA, C.TRACK_TYPE_UNKNOWN, /* trackFormat= */ null, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java index 224acd7e153..34d1bbd86c6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/SingleSampleMediaPeriod.java @@ -26,6 +26,7 @@ import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; +import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo; import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.upstream.Loader.LoadErrorAction; import com.google.android.exoplayer2.upstream.Loader.Loadable; @@ -271,9 +272,28 @@ public LoadErrorAction onLoadError( long loadDurationMs, IOException error, int errorCount) { + StatsDataSource dataSource = loadable.dataSource; + LoadEventInfo loadEventInfo = + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + dataSource.getLastOpenedUri(), + dataSource.getLastResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + dataSource.getBytesRead()); + MediaLoadData mediaLoadData = + new MediaLoadData( + C.DATA_TYPE_MEDIA, + C.TRACK_TYPE_UNKNOWN, + format, + C.SELECTION_REASON_UNKNOWN, + /* trackSelectionData= */ null, + /* mediaStartTimeMs= */ 0, + C.usToMs(durationUs)); long retryDelay = loadErrorHandlingPolicy.getRetryDelayMsFor( - C.DATA_TYPE_MEDIA, loadDurationMs, error, errorCount); + new LoadErrorInfo(loadEventInfo, mediaLoadData, error, errorCount)); boolean errorCanBePropagated = retryDelay == C.TIME_UNSET || errorCount @@ -289,17 +309,9 @@ public LoadErrorAction onLoadError( ? Loader.createRetryAction(/* resetErrorCount= */ false, retryDelay) : Loader.DONT_RETRY_FATAL; } - StatsDataSource dataSource = loadable.dataSource; boolean wasCanceled = !action.isRetry(); eventDispatcher.loadError( - new LoadEventInfo( - loadable.loadTaskId, - loadable.dataSpec, - dataSource.getLastOpenedUri(), - dataSource.getLastResponseHeaders(), - elapsedRealtimeMs, - loadDurationMs, - dataSource.getBytesRead()), + loadEventInfo, C.DATA_TYPE_MEDIA, C.TRACK_TYPE_UNKNOWN, format, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java index 7c715e59792..c9a552a7cfb 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java @@ -25,12 +25,14 @@ import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.source.LoadEventInfo; +import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.SampleQueue; import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.source.SequenceableLoader; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; +import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo; import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.upstream.Loader.LoadErrorAction; import com.google.android.exoplayer2.util.Assertions; @@ -470,10 +472,30 @@ public LoadErrorAction onLoadError( int lastChunkIndex = mediaChunks.size() - 1; boolean cancelable = bytesLoaded == 0 || !isMediaChunk || !haveReadFromMediaChunk(lastChunkIndex); + LoadEventInfo loadEventInfo = + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + loadable.getUri(), + loadable.getResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + bytesLoaded); + MediaLoadData mediaLoadData = + new MediaLoadData( + loadable.type, + primaryTrackType, + loadable.trackFormat, + loadable.trackSelectionReason, + loadable.trackSelectionData, + C.usToMs(loadable.startTimeUs), + C.usToMs(loadable.endTimeUs)); + LoadErrorInfo loadErrorInfo = + new LoadErrorInfo(loadEventInfo, mediaLoadData, error, errorCount); + long blacklistDurationMs = cancelable - ? loadErrorHandlingPolicy.getBlacklistDurationMsFor( - loadable.type, loadDurationMs, error, errorCount) + ? loadErrorHandlingPolicy.getBlacklistDurationMsFor(loadErrorInfo) : C.TIME_UNSET; @Nullable LoadErrorAction loadErrorAction = null; if (chunkSource.onChunkLoadError(loadable, cancelable, error, blacklistDurationMs)) { @@ -493,9 +515,7 @@ public LoadErrorAction onLoadError( if (loadErrorAction == null) { // The load was not cancelled. Either the load must be retried or the error propagated. - long retryDelayMs = - loadErrorHandlingPolicy.getRetryDelayMsFor( - loadable.type, loadDurationMs, error, errorCount); + long retryDelayMs = loadErrorHandlingPolicy.getRetryDelayMsFor(loadErrorInfo); loadErrorAction = retryDelayMs != C.TIME_UNSET ? Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs) @@ -504,14 +524,7 @@ public LoadErrorAction onLoadError( boolean canceled = !loadErrorAction.isRetry(); eventDispatcher.loadError( - new LoadEventInfo( - loadable.loadTaskId, - loadable.dataSpec, - loadable.getUri(), - loadable.getResponseHeaders(), - elapsedRealtimeMs, - loadDurationMs, - bytesLoaded), + loadEventInfo, loadable.type, primaryTrackType, loadable.trackFormat, diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index b2c44e4a692..4b749568160 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -34,6 +34,7 @@ import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory; import com.google.android.exoplayer2.source.DefaultCompositeSequenceableLoaderFactory; import com.google.android.exoplayer2.source.LoadEventInfo; +import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSourceEventListener; @@ -49,6 +50,7 @@ import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; +import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo; import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.upstream.Loader.LoadErrorAction; import com.google.android.exoplayer2.upstream.LoaderErrorThrower; @@ -852,15 +854,7 @@ protected void releaseSourceInternal() { long loadDurationMs, IOException error, int errorCount) { - long retryDelayMs = - loadErrorHandlingPolicy.getRetryDelayMsFor( - C.DATA_TYPE_MANIFEST, loadDurationMs, error, errorCount); - LoadErrorAction loadErrorAction = - retryDelayMs == C.TIME_UNSET - ? Loader.DONT_RETRY_FATAL - : Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs); - boolean wasCanceled = !loadErrorAction.isRetry(); - manifestEventDispatcher.loadError( + LoadEventInfo loadEventInfo = new LoadEventInfo( loadable.loadTaskId, loadable.dataSpec, @@ -868,10 +862,17 @@ protected void releaseSourceInternal() { loadable.getResponseHeaders(), elapsedRealtimeMs, loadDurationMs, - loadable.bytesLoaded()), - loadable.type, - error, - wasCanceled); + loadable.bytesLoaded()); + MediaLoadData mediaLoadData = new MediaLoadData(loadable.type); + LoadErrorInfo loadErrorInfo = + new LoadErrorInfo(loadEventInfo, mediaLoadData, error, errorCount); + long retryDelayMs = loadErrorHandlingPolicy.getRetryDelayMsFor(loadErrorInfo); + LoadErrorAction loadErrorAction = + retryDelayMs == C.TIME_UNSET + ? Loader.DONT_RETRY_FATAL + : Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs); + boolean wasCanceled = !loadErrorAction.isRetry(); + manifestEventDispatcher.loadError(loadEventInfo, loadable.type, error, wasCanceled); if (wasCanceled) { loadErrorHandlingPolicy.onLoadTaskConcluded(loadable.loadTaskId); } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 69649297af9..3707549fcb4 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -38,6 +38,7 @@ import com.google.android.exoplayer2.metadata.emsg.EventMessageDecoder; import com.google.android.exoplayer2.metadata.id3.PrivFrame; import com.google.android.exoplayer2.source.LoadEventInfo; +import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.SampleQueue; import com.google.android.exoplayer2.source.SampleQueue.UpstreamFormatChangedListener; @@ -51,6 +52,7 @@ import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.DataReader; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; +import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo; import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.upstream.Loader.LoadErrorAction; import com.google.android.exoplayer2.util.Assertions; @@ -768,11 +770,28 @@ public LoadErrorAction onLoadError( long bytesLoaded = loadable.bytesLoaded(); boolean isMediaChunk = isMediaChunk(loadable); boolean blacklistSucceeded = false; + LoadEventInfo loadEventInfo = + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + loadable.getUri(), + loadable.getResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + bytesLoaded); + MediaLoadData mediaLoadData = + new MediaLoadData( + loadable.type, + trackType, + loadable.trackFormat, + loadable.trackSelectionReason, + loadable.trackSelectionData, + C.usToMs(loadable.startTimeUs), + C.usToMs(loadable.endTimeUs)); + LoadErrorInfo loadErrorInfo = + new LoadErrorInfo(loadEventInfo, mediaLoadData, error, errorCount); LoadErrorAction loadErrorAction; - - long blacklistDurationMs = - loadErrorHandlingPolicy.getBlacklistDurationMsFor( - loadable.type, loadDurationMs, error, errorCount); + long blacklistDurationMs = loadErrorHandlingPolicy.getBlacklistDurationMsFor(loadErrorInfo); if (blacklistDurationMs != C.TIME_UNSET) { blacklistSucceeded = chunkSource.maybeBlacklistTrack(loadable, blacklistDurationMs); } @@ -787,9 +806,7 @@ public LoadErrorAction onLoadError( } loadErrorAction = Loader.DONT_RETRY; } else /* did not blacklist */ { - long retryDelayMs = - loadErrorHandlingPolicy.getRetryDelayMsFor( - loadable.type, loadDurationMs, error, errorCount); + long retryDelayMs = loadErrorHandlingPolicy.getRetryDelayMsFor(loadErrorInfo); loadErrorAction = retryDelayMs != C.TIME_UNSET ? Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs) @@ -798,14 +815,7 @@ public LoadErrorAction onLoadError( boolean wasCanceled = !loadErrorAction.isRetry(); eventDispatcher.loadError( - new LoadEventInfo( - loadable.loadTaskId, - loadable.dataSpec, - loadable.getUri(), - loadable.getResponseHeaders(), - elapsedRealtimeMs, - loadDurationMs, - bytesLoaded), + loadEventInfo, loadable.type, trackType, loadable.trackFormat, diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java index d4126d42d01..f1794477855 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/DefaultHlsPlaylistTracker.java @@ -22,12 +22,14 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.source.LoadEventInfo; +import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.hls.HlsDataSourceFactory; import com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist.Variant; import com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; +import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo; import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.upstream.Loader.LoadErrorAction; import com.google.android.exoplayer2.upstream.ParsingLoadable; @@ -281,11 +283,7 @@ public LoadErrorAction onLoadError( long loadDurationMs, IOException error, int errorCount) { - long retryDelayMs = - loadErrorHandlingPolicy.getRetryDelayMsFor( - loadable.type, loadDurationMs, error, errorCount); - boolean isFatal = retryDelayMs == C.TIME_UNSET; - eventDispatcher.loadError( + LoadEventInfo loadEventInfo = new LoadEventInfo( loadable.loadTaskId, loadable.dataSpec, @@ -293,10 +291,13 @@ public LoadErrorAction onLoadError( loadable.getResponseHeaders(), elapsedRealtimeMs, loadDurationMs, - loadable.bytesLoaded()), - C.DATA_TYPE_MANIFEST, - error, - isFatal); + loadable.bytesLoaded()); + MediaLoadData mediaLoadData = new MediaLoadData(loadable.type); + long retryDelayMs = + loadErrorHandlingPolicy.getRetryDelayMsFor( + new LoadErrorInfo(loadEventInfo, mediaLoadData, error, errorCount)); + boolean isFatal = retryDelayMs == C.TIME_UNSET; + eventDispatcher.loadError(loadEventInfo, loadable.type, error, isFatal); if (isFatal) { loadErrorHandlingPolicy.onLoadTaskConcluded(loadable.loadTaskId); } @@ -576,11 +577,20 @@ public LoadErrorAction onLoadError( long loadDurationMs, IOException error, int errorCount) { + LoadEventInfo loadEventInfo = + new LoadEventInfo( + loadable.loadTaskId, + loadable.dataSpec, + loadable.getUri(), + loadable.getResponseHeaders(), + elapsedRealtimeMs, + loadDurationMs, + loadable.bytesLoaded()); + MediaLoadData mediaLoadData = new MediaLoadData(loadable.type); + LoadErrorInfo loadErrorInfo = + new LoadErrorInfo(loadEventInfo, mediaLoadData, error, errorCount); LoadErrorAction loadErrorAction; - - long blacklistDurationMs = - loadErrorHandlingPolicy.getBlacklistDurationMsFor( - loadable.type, loadDurationMs, error, errorCount); + long blacklistDurationMs = loadErrorHandlingPolicy.getBlacklistDurationMsFor(loadErrorInfo); boolean shouldBlacklist = blacklistDurationMs != C.TIME_UNSET; boolean blacklistingFailed = @@ -590,9 +600,7 @@ public LoadErrorAction onLoadError( } if (blacklistingFailed) { - long retryDelay = - loadErrorHandlingPolicy.getRetryDelayMsFor( - loadable.type, loadDurationMs, error, errorCount); + long retryDelay = loadErrorHandlingPolicy.getRetryDelayMsFor(loadErrorInfo); loadErrorAction = retryDelay != C.TIME_UNSET ? Loader.createRetryAction(false, retryDelay) @@ -602,18 +610,7 @@ public LoadErrorAction onLoadError( } boolean wasCanceled = !loadErrorAction.isRetry(); - eventDispatcher.loadError( - new LoadEventInfo( - loadable.loadTaskId, - loadable.dataSpec, - loadable.getUri(), - loadable.getResponseHeaders(), - elapsedRealtimeMs, - loadDurationMs, - loadable.bytesLoaded()), - C.DATA_TYPE_MANIFEST, - error, - wasCanceled); + eventDispatcher.loadError(loadEventInfo, loadable.type, error, wasCanceled); if (wasCanceled) { loadErrorHandlingPolicy.onLoadTaskConcluded(loadable.loadTaskId); } diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java index 0a901005265..03506284ece 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SsMediaSource.java @@ -31,6 +31,7 @@ import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory; import com.google.android.exoplayer2.source.DefaultCompositeSequenceableLoaderFactory; import com.google.android.exoplayer2.source.LoadEventInfo; +import com.google.android.exoplayer2.source.MediaLoadData; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSourceEventListener; @@ -46,6 +47,7 @@ import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy; import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy; +import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo; import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.upstream.Loader.LoadErrorAction; import com.google.android.exoplayer2.upstream.LoaderErrorThrower; @@ -664,15 +666,7 @@ public LoadErrorAction onLoadError( long loadDurationMs, IOException error, int errorCount) { - long retryDelayMs = - loadErrorHandlingPolicy.getRetryDelayMsFor( - C.DATA_TYPE_MANIFEST, loadDurationMs, error, errorCount); - LoadErrorAction loadErrorAction = - retryDelayMs == C.TIME_UNSET - ? Loader.DONT_RETRY_FATAL - : Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs); - boolean wasCanceled = !loadErrorAction.isRetry(); - manifestEventDispatcher.loadError( + LoadEventInfo loadEventInfo = new LoadEventInfo( loadable.loadTaskId, loadable.dataSpec, @@ -680,10 +674,17 @@ public LoadErrorAction onLoadError( loadable.getResponseHeaders(), elapsedRealtimeMs, loadDurationMs, - loadable.bytesLoaded()), - loadable.type, - error, - wasCanceled); + loadable.bytesLoaded()); + MediaLoadData mediaLoadData = new MediaLoadData(loadable.type); + long retryDelayMs = + loadErrorHandlingPolicy.getRetryDelayMsFor( + new LoadErrorInfo(loadEventInfo, mediaLoadData, error, errorCount)); + LoadErrorAction loadErrorAction = + retryDelayMs == C.TIME_UNSET + ? Loader.DONT_RETRY_FATAL + : Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs); + boolean wasCanceled = !loadErrorAction.isRetry(); + manifestEventDispatcher.loadError(loadEventInfo, loadable.type, error, wasCanceled); if (wasCanceled) { loadErrorHandlingPolicy.onLoadTaskConcluded(loadable.loadTaskId); }