mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Pass LoadErrorInfo to LoadErrorHandlingPolcy
Issue: #7309 PiperOrigin-RevId: 309749566
This commit is contained in:
parent
862a6e4dd2
commit
fff3f99f4a
@ -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,
|
||||
|
@ -41,6 +41,7 @@ import com.google.android.exoplayer2.upstream.Allocator;
|
||||
import com.google.android.exoplayer2.upstream.DataSource;
|
||||
import com.google.android.exoplayer2.upstream.DataSpec;
|
||||
import com.google.android.exoplayer2.upstream.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 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
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 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
: 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,
|
||||
|
@ -26,6 +26,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelection;
|
||||
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 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
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 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
? 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,
|
||||
|
@ -25,12 +25,14 @@ import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
|
||||
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 class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
||||
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 class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
||||
|
||||
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 class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
||||
|
||||
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,
|
||||
|
@ -34,6 +34,7 @@ import com.google.android.exoplayer2.source.BaseMediaSource;
|
||||
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.Allocator;
|
||||
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 @@ public final class DashMediaSource extends BaseMediaSource {
|
||||
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 @@ public final class DashMediaSource extends BaseMediaSource {
|
||||
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);
|
||||
}
|
||||
|
@ -38,6 +38,7 @@ import com.google.android.exoplayer2.metadata.emsg.EventMessage;
|
||||
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.trackselection.TrackSelection;
|
||||
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 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||
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 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||
}
|
||||
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 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||
|
||||
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,
|
||||
|
@ -22,12 +22,14 @@ import androidx.annotation.Nullable;
|
||||
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 final class DefaultHlsPlaylistTracker
|
||||
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 final class DefaultHlsPlaylistTracker
|
||||
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 final class DefaultHlsPlaylistTracker
|
||||
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 final class DefaultHlsPlaylistTracker
|
||||
}
|
||||
|
||||
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 final class DefaultHlsPlaylistTracker
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
@ -31,6 +31,7 @@ import com.google.android.exoplayer2.source.BaseMediaSource;
|
||||
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.Allocator;
|
||||
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 final class SsMediaSource extends BaseMediaSource
|
||||
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 final class SsMediaSource extends BaseMediaSource
|
||||
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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user