Commit 25f17acd by aquilescanta Committed by Ian Baker

Move LoadEventInfo creation to the caller

LoadEventInfo needs to also be sent to the LoadErrorHandlingPolicy.

PiperOrigin-RevId: 308066998
parent a0423461
...@@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source; ...@@ -18,6 +18,7 @@ package com.google.android.exoplayer2.source;
import android.net.Uri; import android.net.Uri;
import android.os.SystemClock; import android.os.SystemClock;
import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.DataSpec;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
...@@ -51,6 +52,20 @@ public final class LoadEventInfo { ...@@ -51,6 +52,20 @@ public final class LoadEventInfo {
public final long bytesLoaded; public final long bytesLoaded;
/** /**
* Equivalent to {@link #LoadEventInfo(DataSpec, Uri, Map, long, long, long)
* LoadEventInfo(dataSpec, dataSpec.uri, Collections.emptyMap(), elapsedRealtimeMs, 0, 0)}.
*/
public LoadEventInfo(DataSpec dataSpec, long elapsedRealtimeMs) {
this(
dataSpec,
dataSpec.uri,
Collections.emptyMap(),
elapsedRealtimeMs,
/* loadDurationMs= */ 0,
/* bytesLoaded= */ 0);
}
/**
* Creates load event info. * Creates load event info.
* *
* @param dataSpec Defines the requested data. * @param dataSpec Defines the requested data.
......
...@@ -15,20 +15,15 @@ ...@@ -15,20 +15,15 @@
*/ */
package com.google.android.exoplayer2.source; package com.google.android.exoplayer2.source;
import android.net.Uri;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId; import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.upstream.DataSpec;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.CopyOnWriteMultiset; import com.google.android.exoplayer2.util.CopyOnWriteMultiset;
import com.google.android.exoplayer2.util.MediaSourceEventDispatcher; import com.google.android.exoplayer2.util.MediaSourceEventDispatcher;
import java.io.IOException; import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/** Interface for callbacks to be notified of {@link MediaSource} events. */ /** Interface for callbacks to be notified of {@link MediaSource} events. */
public interface MediaSourceEventListener { public interface MediaSourceEventListener {
...@@ -201,37 +196,29 @@ public interface MediaSourceEventListener { ...@@ -201,37 +196,29 @@ public interface MediaSourceEventListener {
MediaSourceEventListener.class); MediaSourceEventListener.class);
} }
public void loadStarted(DataSpec dataSpec, int dataType, long elapsedRealtimeMs) { public void loadStarted(LoadEventInfo loadEventInfo, int dataType) {
loadStarted( loadStarted(
dataSpec, loadEventInfo,
dataType, dataType,
C.TRACK_TYPE_UNKNOWN, /* trackType= */ C.TRACK_TYPE_UNKNOWN,
null, /* trackFormat= */ null,
C.SELECTION_REASON_UNKNOWN, /* trackSelectionReason= */ C.SELECTION_REASON_UNKNOWN,
null, /* trackSelectionData= */ null,
C.TIME_UNSET, /* mediaStartTimeUs= */ C.TIME_UNSET,
C.TIME_UNSET, /* mediaEndTimeUs= */ C.TIME_UNSET);
elapsedRealtimeMs);
} }
public void loadStarted( public void loadStarted(
DataSpec dataSpec, LoadEventInfo loadEventInfo,
int dataType, int dataType,
int trackType, int trackType,
@Nullable Format trackFormat, @Nullable Format trackFormat,
int trackSelectionReason, int trackSelectionReason,
@Nullable Object trackSelectionData, @Nullable Object trackSelectionData,
long mediaStartTimeUs, long mediaStartTimeUs,
long mediaEndTimeUs, long mediaEndTimeUs) {
long elapsedRealtimeMs) {
loadStarted( loadStarted(
new LoadEventInfo( loadEventInfo,
dataSpec,
dataSpec.uri,
/* responseHeaders= */ Collections.emptyMap(),
elapsedRealtimeMs,
/* loadDurationMs= */ 0,
/* bytesLoaded= */ 0),
new MediaLoadData( new MediaLoadData(
dataType, dataType,
trackType, trackType,
...@@ -249,47 +236,29 @@ public interface MediaSourceEventListener { ...@@ -249,47 +236,29 @@ public interface MediaSourceEventListener {
MediaSourceEventListener.class); MediaSourceEventListener.class);
} }
public void loadCompleted( public void loadCompleted(LoadEventInfo loadEventInfo, int dataType) {
DataSpec dataSpec,
Uri uri,
Map<String, List<String>> responseHeaders,
int dataType,
long elapsedRealtimeMs,
long loadDurationMs,
long bytesLoaded) {
loadCompleted( loadCompleted(
dataSpec, loadEventInfo,
uri,
responseHeaders,
dataType, dataType,
C.TRACK_TYPE_UNKNOWN, /* trackType= */ C.TRACK_TYPE_UNKNOWN,
null, /* trackFormat= */ null,
C.SELECTION_REASON_UNKNOWN, /* trackSelectionReason= */ C.SELECTION_REASON_UNKNOWN,
null, /* trackSelectionData= */ null,
C.TIME_UNSET, /* mediaStartTimeUs= */ C.TIME_UNSET,
C.TIME_UNSET, /* mediaEndTimeUs= */ C.TIME_UNSET);
elapsedRealtimeMs,
loadDurationMs,
bytesLoaded);
} }
public void loadCompleted( public void loadCompleted(
DataSpec dataSpec, LoadEventInfo loadEventInfo,
Uri uri,
Map<String, List<String>> responseHeaders,
int dataType, int dataType,
int trackType, int trackType,
@Nullable Format trackFormat, @Nullable Format trackFormat,
int trackSelectionReason, int trackSelectionReason,
@Nullable Object trackSelectionData, @Nullable Object trackSelectionData,
long mediaStartTimeUs, long mediaStartTimeUs,
long mediaEndTimeUs, long mediaEndTimeUs) {
long elapsedRealtimeMs,
long loadDurationMs,
long bytesLoaded) {
loadCompleted( loadCompleted(
new LoadEventInfo( loadEventInfo,
dataSpec, uri, responseHeaders, elapsedRealtimeMs, loadDurationMs, bytesLoaded),
new MediaLoadData( new MediaLoadData(
dataType, dataType,
trackType, trackType,
...@@ -307,47 +276,29 @@ public interface MediaSourceEventListener { ...@@ -307,47 +276,29 @@ public interface MediaSourceEventListener {
MediaSourceEventListener.class); MediaSourceEventListener.class);
} }
public void loadCanceled( public void loadCanceled(LoadEventInfo loadEventInfo, int dataType) {
DataSpec dataSpec,
Uri uri,
Map<String, List<String>> responseHeaders,
int dataType,
long elapsedRealtimeMs,
long loadDurationMs,
long bytesLoaded) {
loadCanceled( loadCanceled(
dataSpec, loadEventInfo,
uri,
responseHeaders,
dataType, dataType,
C.TRACK_TYPE_UNKNOWN, /* trackType= */ C.TRACK_TYPE_UNKNOWN,
null, /* trackFormat= */ null,
C.SELECTION_REASON_UNKNOWN, /* trackSelectionReason= */ C.SELECTION_REASON_UNKNOWN,
null, /* trackSelectionData= */ null,
C.TIME_UNSET, /* mediaStartTimeUs= */ C.TIME_UNSET,
C.TIME_UNSET, /* mediaEndTimeUs= */ C.TIME_UNSET);
elapsedRealtimeMs,
loadDurationMs,
bytesLoaded);
} }
public void loadCanceled( public void loadCanceled(
DataSpec dataSpec, LoadEventInfo loadEventInfo,
Uri uri,
Map<String, List<String>> responseHeaders,
int dataType, int dataType,
int trackType, int trackType,
@Nullable Format trackFormat, @Nullable Format trackFormat,
int trackSelectionReason, int trackSelectionReason,
@Nullable Object trackSelectionData, @Nullable Object trackSelectionData,
long mediaStartTimeUs, long mediaStartTimeUs,
long mediaEndTimeUs, long mediaEndTimeUs) {
long elapsedRealtimeMs,
long loadDurationMs,
long bytesLoaded) {
loadCanceled( loadCanceled(
new LoadEventInfo( loadEventInfo,
dataSpec, uri, responseHeaders, elapsedRealtimeMs, loadDurationMs, bytesLoaded),
new MediaLoadData( new MediaLoadData(
dataType, dataType,
trackType, trackType,
...@@ -366,37 +317,22 @@ public interface MediaSourceEventListener { ...@@ -366,37 +317,22 @@ public interface MediaSourceEventListener {
} }
public void loadError( public void loadError(
DataSpec dataSpec, LoadEventInfo loadEventInfo, int dataType, IOException error, boolean wasCanceled) {
Uri uri,
Map<String, List<String>> responseHeaders,
int dataType,
long elapsedRealtimeMs,
long loadDurationMs,
long bytesLoaded,
IOException error,
boolean wasCanceled) {
loadError( loadError(
dataSpec, loadEventInfo,
uri,
responseHeaders,
dataType, dataType,
C.TRACK_TYPE_UNKNOWN, /* trackType= */ C.TRACK_TYPE_UNKNOWN,
null, /* trackFormat= */ null,
C.SELECTION_REASON_UNKNOWN, /* trackSelectionReason= */ C.SELECTION_REASON_UNKNOWN,
null, /* trackSelectionData= */ null,
C.TIME_UNSET, /* mediaStartTimeUs= */ C.TIME_UNSET,
C.TIME_UNSET, /* mediaEndTimeUs= */ C.TIME_UNSET,
elapsedRealtimeMs,
loadDurationMs,
bytesLoaded,
error, error,
wasCanceled); wasCanceled);
} }
public void loadError( public void loadError(
DataSpec dataSpec, LoadEventInfo loadEventInfo,
Uri uri,
Map<String, List<String>> responseHeaders,
int dataType, int dataType,
int trackType, int trackType,
@Nullable Format trackFormat, @Nullable Format trackFormat,
...@@ -404,14 +340,10 @@ public interface MediaSourceEventListener { ...@@ -404,14 +340,10 @@ public interface MediaSourceEventListener {
@Nullable Object trackSelectionData, @Nullable Object trackSelectionData,
long mediaStartTimeUs, long mediaStartTimeUs,
long mediaEndTimeUs, long mediaEndTimeUs,
long elapsedRealtimeMs,
long loadDurationMs,
long bytesLoaded,
IOException error, IOException error,
boolean wasCanceled) { boolean wasCanceled) {
loadError( loadError(
new LoadEventInfo( loadEventInfo,
dataSpec, uri, responseHeaders, elapsedRealtimeMs, loadDurationMs, bytesLoaded),
new MediaLoadData( new MediaLoadData(
dataType, dataType,
trackType, trackType,
......
...@@ -552,20 +552,22 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -552,20 +552,22 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
: largestQueuedTimestampUs + DEFAULT_LAST_SAMPLE_DURATION_US; : largestQueuedTimestampUs + DEFAULT_LAST_SAMPLE_DURATION_US;
listener.onSourceInfoRefreshed(durationUs, isSeekable, isLive); listener.onSourceInfoRefreshed(durationUs, isSeekable, isLive);
} }
StatsDataSource dataSource = loadable.dataSource;
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
loadable.dataSpec, new LoadEventInfo(
loadable.dataSource.getLastOpenedUri(), loadable.dataSpec,
loadable.dataSource.getLastResponseHeaders(), dataSource.getLastOpenedUri(),
dataSource.getLastResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
dataSource.getBytesRead()),
C.DATA_TYPE_MEDIA, C.DATA_TYPE_MEDIA,
C.TRACK_TYPE_UNKNOWN, C.TRACK_TYPE_UNKNOWN,
/* trackFormat= */ null, /* trackFormat= */ null,
C.SELECTION_REASON_UNKNOWN, C.SELECTION_REASON_UNKNOWN,
/* trackSelectionData= */ null, /* trackSelectionData= */ null,
/* mediaStartTimeUs= */ loadable.seekTimeUs, /* mediaStartTimeUs= */ loadable.seekTimeUs,
durationUs, durationUs);
elapsedRealtimeMs,
loadDurationMs,
loadable.dataSource.getBytesRead());
copyLengthFromLoader(loadable); copyLengthFromLoader(loadable);
loadingFinished = true; loadingFinished = true;
Assertions.checkNotNull(callback).onContinueLoadingRequested(this); Assertions.checkNotNull(callback).onContinueLoadingRequested(this);
...@@ -574,20 +576,22 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -574,20 +576,22 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@Override @Override
public void onLoadCanceled( public void onLoadCanceled(
ExtractingLoadable loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) { ExtractingLoadable loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) {
StatsDataSource dataSource = loadable.dataSource;
eventDispatcher.loadCanceled( eventDispatcher.loadCanceled(
loadable.dataSpec, new LoadEventInfo(
loadable.dataSource.getLastOpenedUri(), loadable.dataSpec,
loadable.dataSource.getLastResponseHeaders(), dataSource.getLastOpenedUri(),
dataSource.getLastResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
dataSource.getBytesRead()),
C.DATA_TYPE_MEDIA, C.DATA_TYPE_MEDIA,
C.TRACK_TYPE_UNKNOWN, C.TRACK_TYPE_UNKNOWN,
/* trackFormat= */ null, /* trackFormat= */ null,
C.SELECTION_REASON_UNKNOWN, C.SELECTION_REASON_UNKNOWN,
/* trackSelectionData= */ null, /* trackSelectionData= */ null,
/* mediaStartTimeUs= */ loadable.seekTimeUs, /* mediaStartTimeUs= */ loadable.seekTimeUs,
durationUs, durationUs);
elapsedRealtimeMs,
loadDurationMs,
loadable.dataSource.getBytesRead());
if (!released) { if (!released) {
copyLengthFromLoader(loadable); copyLengthFromLoader(loadable);
for (SampleQueue sampleQueue : sampleQueues) { for (SampleQueue sampleQueue : sampleQueues) {
...@@ -621,10 +625,15 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -621,10 +625,15 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
: Loader.DONT_RETRY; : Loader.DONT_RETRY;
} }
StatsDataSource dataSource = loadable.dataSource;
eventDispatcher.loadError( eventDispatcher.loadError(
loadable.dataSpec, new LoadEventInfo(
loadable.dataSource.getLastOpenedUri(), loadable.dataSpec,
loadable.dataSource.getLastResponseHeaders(), dataSource.getLastOpenedUri(),
dataSource.getLastResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
dataSource.getBytesRead()),
C.DATA_TYPE_MEDIA, C.DATA_TYPE_MEDIA,
C.TRACK_TYPE_UNKNOWN, C.TRACK_TYPE_UNKNOWN,
/* trackFormat= */ null, /* trackFormat= */ null,
...@@ -632,9 +641,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -632,9 +641,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/* trackSelectionData= */ null, /* trackSelectionData= */ null,
/* mediaStartTimeUs= */ loadable.seekTimeUs, /* mediaStartTimeUs= */ loadable.seekTimeUs,
durationUs, durationUs,
elapsedRealtimeMs,
loadDurationMs,
loadable.dataSource.getBytesRead(),
error, error,
!loadErrorAction.isRetry()); !loadErrorAction.isRetry());
return loadErrorAction; return loadErrorAction;
...@@ -776,16 +782,16 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -776,16 +782,16 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
long elapsedRealtimeMs = long elapsedRealtimeMs =
loader.startLoading( loader.startLoading(
loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(dataType)); loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(dataType));
DataSpec dataSpec = loadable.dataSpec;
eventDispatcher.loadStarted( eventDispatcher.loadStarted(
loadable.dataSpec, new LoadEventInfo(dataSpec, elapsedRealtimeMs),
C.DATA_TYPE_MEDIA, C.DATA_TYPE_MEDIA,
C.TRACK_TYPE_UNKNOWN, C.TRACK_TYPE_UNKNOWN,
/* trackFormat= */ null, /* trackFormat= */ null,
C.SELECTION_REASON_UNKNOWN, C.SELECTION_REASON_UNKNOWN,
/* trackSelectionData= */ null, /* trackSelectionData= */ null,
/* mediaStartTimeUs= */ loadable.seekTimeUs, /* mediaStartTimeUs= */ loadable.seekTimeUs,
durationUs, durationUs);
elapsedRealtimeMs);
} }
/** /**
......
...@@ -160,15 +160,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -160,15 +160,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/* callback= */ this, /* callback= */ this,
loadErrorHandlingPolicy.getMinimumLoadableRetryCount(C.DATA_TYPE_MEDIA)); loadErrorHandlingPolicy.getMinimumLoadableRetryCount(C.DATA_TYPE_MEDIA));
eventDispatcher.loadStarted( eventDispatcher.loadStarted(
dataSpec, new LoadEventInfo(dataSpec, elapsedRealtimeMs),
C.DATA_TYPE_MEDIA, C.DATA_TYPE_MEDIA,
C.TRACK_TYPE_UNKNOWN, C.TRACK_TYPE_UNKNOWN,
format, format,
C.SELECTION_REASON_UNKNOWN, C.SELECTION_REASON_UNKNOWN,
/* trackSelectionData= */ null, /* trackSelectionData= */ null,
/* mediaStartTimeUs= */ 0, /* mediaStartTimeUs= */ 0,
durationUs, durationUs);
elapsedRealtimeMs);
return true; return true;
} }
...@@ -217,39 +216,43 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -217,39 +216,43 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
sampleSize = (int) loadable.dataSource.getBytesRead(); sampleSize = (int) loadable.dataSource.getBytesRead();
sampleData = Assertions.checkNotNull(loadable.sampleData); sampleData = Assertions.checkNotNull(loadable.sampleData);
loadingFinished = true; loadingFinished = true;
StatsDataSource dataSource = loadable.dataSource;
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
loadable.dataSpec, new LoadEventInfo(
loadable.dataSource.getLastOpenedUri(), loadable.dataSpec,
loadable.dataSource.getLastResponseHeaders(), dataSource.getLastOpenedUri(),
dataSource.getLastResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
sampleSize),
C.DATA_TYPE_MEDIA, C.DATA_TYPE_MEDIA,
C.TRACK_TYPE_UNKNOWN, C.TRACK_TYPE_UNKNOWN,
format, format,
C.SELECTION_REASON_UNKNOWN, C.SELECTION_REASON_UNKNOWN,
/* trackSelectionData= */ null, /* trackSelectionData= */ null,
/* mediaStartTimeUs= */ 0, /* mediaStartTimeUs= */ 0,
durationUs, durationUs);
elapsedRealtimeMs,
loadDurationMs,
sampleSize);
} }
@Override @Override
public void onLoadCanceled( public void onLoadCanceled(
SourceLoadable loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) { SourceLoadable loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) {
StatsDataSource dataSource = loadable.dataSource;
eventDispatcher.loadCanceled( eventDispatcher.loadCanceled(
loadable.dataSpec, new LoadEventInfo(
loadable.dataSource.getLastOpenedUri(), loadable.dataSpec,
loadable.dataSource.getLastResponseHeaders(), dataSource.getLastOpenedUri(),
dataSource.getLastResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
dataSource.getBytesRead()),
C.DATA_TYPE_MEDIA, C.DATA_TYPE_MEDIA,
C.TRACK_TYPE_UNKNOWN, C.TRACK_TYPE_UNKNOWN,
/* trackFormat= */ null, /* trackFormat= */ null,
C.SELECTION_REASON_UNKNOWN, C.SELECTION_REASON_UNKNOWN,
/* trackSelectionData= */ null, /* trackSelectionData= */ null,
/* mediaStartTimeUs= */ 0, /* mediaStartTimeUs= */ 0,
durationUs, durationUs);
elapsedRealtimeMs,
loadDurationMs,
loadable.dataSource.getBytesRead());
} }
@Override @Override
...@@ -277,10 +280,15 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -277,10 +280,15 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
? Loader.createRetryAction(/* resetErrorCount= */ false, retryDelay) ? Loader.createRetryAction(/* resetErrorCount= */ false, retryDelay)
: Loader.DONT_RETRY_FATAL; : Loader.DONT_RETRY_FATAL;
} }
StatsDataSource dataSource = loadable.dataSource;
eventDispatcher.loadError( eventDispatcher.loadError(
loadable.dataSpec, new LoadEventInfo(
loadable.dataSource.getLastOpenedUri(), loadable.dataSpec,
loadable.dataSource.getLastResponseHeaders(), dataSource.getLastOpenedUri(),
dataSource.getLastResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
dataSource.getBytesRead()),
C.DATA_TYPE_MEDIA, C.DATA_TYPE_MEDIA,
C.TRACK_TYPE_UNKNOWN, C.TRACK_TYPE_UNKNOWN,
format, format,
...@@ -288,9 +296,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ...@@ -288,9 +296,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/* trackSelectionData= */ null, /* trackSelectionData= */ null,
/* mediaStartTimeUs= */ 0, /* mediaStartTimeUs= */ 0,
durationUs, durationUs,
elapsedRealtimeMs,
loadDurationMs,
loadable.dataSource.getBytesRead(),
error, error,
/* wasCanceled= */ !action.isRetry()); /* wasCanceled= */ !action.isRetry());
return action; return action;
......
...@@ -45,7 +45,6 @@ import java.lang.annotation.Retention; ...@@ -45,7 +45,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
import org.checkerframework.checker.nullness.compatqual.NullableType; import org.checkerframework.checker.nullness.compatqual.NullableType;
import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
...@@ -356,13 +355,8 @@ public final class AdsMediaSource extends CompositeMediaSource<MediaPeriodId> { ...@@ -356,13 +355,8 @@ public final class AdsMediaSource extends CompositeMediaSource<MediaPeriodId> {
} }
createEventDispatcher(/* mediaPeriodId= */ null) createEventDispatcher(/* mediaPeriodId= */ null)
.loadError( .loadError(
dataSpec, new LoadEventInfo(dataSpec, /* elapsedRealtimeMs= */ SystemClock.elapsedRealtime()),
dataSpec.uri,
/* responseHeaders= */ Collections.emptyMap(),
C.DATA_TYPE_AD, C.DATA_TYPE_AD,
/* elapsedRealtimeMs= */ SystemClock.elapsedRealtime(),
/* loadDurationMs= */ 0,
/* bytesLoaded= */ 0,
error, error,
/* wasCanceled= */ true); /* wasCanceled= */ true);
} }
...@@ -384,13 +378,9 @@ public final class AdsMediaSource extends CompositeMediaSource<MediaPeriodId> { ...@@ -384,13 +378,9 @@ public final class AdsMediaSource extends CompositeMediaSource<MediaPeriodId> {
public void onPrepareError(MediaPeriodId mediaPeriodId, final IOException exception) { public void onPrepareError(MediaPeriodId mediaPeriodId, final IOException exception) {
createEventDispatcher(mediaPeriodId) createEventDispatcher(mediaPeriodId)
.loadError( .loadError(
new DataSpec(adUri), new LoadEventInfo(
adUri, new DataSpec(adUri), /* elapsedRealtimeMs= */ SystemClock.elapsedRealtime()),
/* responseHeaders= */ Collections.emptyMap(),
C.DATA_TYPE_AD, C.DATA_TYPE_AD,
C.TRACK_TYPE_UNKNOWN,
/* loadDurationMs= */ 0,
/* bytesLoaded= */ 0,
AdLoadException.createForAd(exception), AdLoadException.createForAd(exception),
/* wasCanceled= */ true); /* wasCanceled= */ true);
mainHandler.post( mainHandler.post(
......
...@@ -23,6 +23,7 @@ import com.google.android.exoplayer2.SeekParameters; ...@@ -23,6 +23,7 @@ import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer; import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.drm.DrmSession; import com.google.android.exoplayer2.drm.DrmSession;
import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.source.LoadEventInfo;
import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher;
import com.google.android.exoplayer2.source.SampleQueue; import com.google.android.exoplayer2.source.SampleQueue;
import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.source.SampleStream;
...@@ -396,19 +397,20 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S ...@@ -396,19 +397,20 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
public void onLoadCompleted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs) { public void onLoadCompleted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs) {
chunkSource.onChunkLoadCompleted(loadable); chunkSource.onChunkLoadCompleted(loadable);
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.getResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded()),
loadable.type, loadable.type,
primaryTrackType, primaryTrackType,
loadable.trackFormat, loadable.trackFormat,
loadable.trackSelectionReason, loadable.trackSelectionReason,
loadable.trackSelectionData, loadable.trackSelectionData,
loadable.startTimeUs, loadable.startTimeUs,
loadable.endTimeUs, loadable.endTimeUs);
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded());
callback.onContinueLoadingRequested(this); callback.onContinueLoadingRequested(this);
} }
...@@ -416,19 +418,20 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S ...@@ -416,19 +418,20 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
public void onLoadCanceled( public void onLoadCanceled(
Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) { Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) {
eventDispatcher.loadCanceled( eventDispatcher.loadCanceled(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.getResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded()),
loadable.type, loadable.type,
primaryTrackType, primaryTrackType,
loadable.trackFormat, loadable.trackFormat,
loadable.trackSelectionReason, loadable.trackSelectionReason,
loadable.trackSelectionData, loadable.trackSelectionData,
loadable.startTimeUs, loadable.startTimeUs,
loadable.endTimeUs, loadable.endTimeUs);
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded());
if (!released) { if (!released) {
primarySampleQueue.reset(); primarySampleQueue.reset();
for (SampleQueue embeddedSampleQueue : embeddedSampleQueues) { for (SampleQueue embeddedSampleQueue : embeddedSampleQueues) {
...@@ -484,9 +487,13 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S ...@@ -484,9 +487,13 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
boolean canceled = !loadErrorAction.isRetry(); boolean canceled = !loadErrorAction.isRetry();
eventDispatcher.loadError( eventDispatcher.loadError(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.getResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
bytesLoaded),
loadable.type, loadable.type,
primaryTrackType, primaryTrackType,
loadable.trackFormat, loadable.trackFormat,
...@@ -494,9 +501,6 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S ...@@ -494,9 +501,6 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
loadable.trackSelectionData, loadable.trackSelectionData,
loadable.startTimeUs, loadable.startTimeUs,
loadable.endTimeUs, loadable.endTimeUs,
elapsedRealtimeMs,
loadDurationMs,
bytesLoaded,
error, error,
canceled); canceled);
if (canceled) { if (canceled) {
...@@ -555,15 +559,14 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S ...@@ -555,15 +559,14 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
loader.startLoading( loader.startLoading(
loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type));
eventDispatcher.loadStarted( eventDispatcher.loadStarted(
loadable.dataSpec, new LoadEventInfo(loadable.dataSpec, elapsedRealtimeMs),
loadable.type, loadable.type,
primaryTrackType, primaryTrackType,
loadable.trackFormat, loadable.trackFormat,
loadable.trackSelectionReason, loadable.trackSelectionReason,
loadable.trackSelectionData, loadable.trackSelectionData,
loadable.startTimeUs, loadable.startTimeUs,
loadable.endTimeUs, loadable.endTimeUs);
elapsedRealtimeMs);
return true; return true;
} }
......
...@@ -33,6 +33,7 @@ import com.google.android.exoplayer2.offline.StreamKey; ...@@ -33,6 +33,7 @@ import com.google.android.exoplayer2.offline.StreamKey;
import com.google.android.exoplayer2.source.BaseMediaSource; import com.google.android.exoplayer2.source.BaseMediaSource;
import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory; import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory;
import com.google.android.exoplayer2.source.DefaultCompositeSequenceableLoaderFactory; import com.google.android.exoplayer2.source.DefaultCompositeSequenceableLoaderFactory;
import com.google.android.exoplayer2.source.LoadEventInfo;
import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaPeriod;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.MediaSourceEventListener; import com.google.android.exoplayer2.source.MediaSourceEventListener;
...@@ -754,13 +755,14 @@ public final class DashMediaSource extends BaseMediaSource { ...@@ -754,13 +755,14 @@ public final class DashMediaSource extends BaseMediaSource {
/* package */ void onManifestLoadCompleted(ParsingLoadable<DashManifest> loadable, /* package */ void onManifestLoadCompleted(ParsingLoadable<DashManifest> loadable,
long elapsedRealtimeMs, long loadDurationMs) { long elapsedRealtimeMs, long loadDurationMs) {
manifestEventDispatcher.loadCompleted( manifestEventDispatcher.loadCompleted(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.type, loadable.getResponseHeaders(),
elapsedRealtimeMs, elapsedRealtimeMs,
loadDurationMs, loadDurationMs,
loadable.bytesLoaded()); loadable.bytesLoaded()),
loadable.type);
DashManifest newManifest = loadable.getResult(); DashManifest newManifest = loadable.getResult();
int oldPeriodCount = manifest == null ? 0 : manifest.getPeriodCount(); int oldPeriodCount = manifest == null ? 0 : manifest.getPeriodCount();
...@@ -856,13 +858,14 @@ public final class DashMediaSource extends BaseMediaSource { ...@@ -856,13 +858,14 @@ public final class DashMediaSource extends BaseMediaSource {
? Loader.DONT_RETRY_FATAL ? Loader.DONT_RETRY_FATAL
: Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs); : Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs);
manifestEventDispatcher.loadError( manifestEventDispatcher.loadError(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.getResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded()),
loadable.type, loadable.type,
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded(),
error, error,
!loadErrorAction.isRetry()); !loadErrorAction.isRetry());
return loadErrorAction; return loadErrorAction;
...@@ -871,13 +874,14 @@ public final class DashMediaSource extends BaseMediaSource { ...@@ -871,13 +874,14 @@ public final class DashMediaSource extends BaseMediaSource {
/* package */ void onUtcTimestampLoadCompleted(ParsingLoadable<Long> loadable, /* package */ void onUtcTimestampLoadCompleted(ParsingLoadable<Long> loadable,
long elapsedRealtimeMs, long loadDurationMs) { long elapsedRealtimeMs, long loadDurationMs) {
manifestEventDispatcher.loadCompleted( manifestEventDispatcher.loadCompleted(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.type, loadable.getResponseHeaders(),
elapsedRealtimeMs, elapsedRealtimeMs,
loadDurationMs, loadDurationMs,
loadable.bytesLoaded()); loadable.bytesLoaded()),
loadable.type);
onUtcTimestampResolved(loadable.getResult() - elapsedRealtimeMs); onUtcTimestampResolved(loadable.getResult() - elapsedRealtimeMs);
} }
...@@ -887,15 +891,16 @@ public final class DashMediaSource extends BaseMediaSource { ...@@ -887,15 +891,16 @@ public final class DashMediaSource extends BaseMediaSource {
long loadDurationMs, long loadDurationMs,
IOException error) { IOException error) {
manifestEventDispatcher.loadError( manifestEventDispatcher.loadError(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.getResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded()),
loadable.type, loadable.type,
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded(),
error, error,
true); /* wasCanceled= */ true);
onUtcTimestampResolutionError(error); onUtcTimestampResolutionError(error);
return Loader.DONT_RETRY; return Loader.DONT_RETRY;
} }
...@@ -903,13 +908,14 @@ public final class DashMediaSource extends BaseMediaSource { ...@@ -903,13 +908,14 @@ public final class DashMediaSource extends BaseMediaSource {
/* package */ void onLoadCanceled(ParsingLoadable<?> loadable, long elapsedRealtimeMs, /* package */ void onLoadCanceled(ParsingLoadable<?> loadable, long elapsedRealtimeMs,
long loadDurationMs) { long loadDurationMs) {
manifestEventDispatcher.loadCanceled( manifestEventDispatcher.loadCanceled(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.type, loadable.getResponseHeaders(),
elapsedRealtimeMs, elapsedRealtimeMs,
loadDurationMs, loadDurationMs,
loadable.bytesLoaded()); loadable.bytesLoaded()),
loadable.type);
} }
// Internal methods. // Internal methods.
...@@ -1122,7 +1128,8 @@ public final class DashMediaSource extends BaseMediaSource { ...@@ -1122,7 +1128,8 @@ public final class DashMediaSource extends BaseMediaSource {
private <T> void startLoading(ParsingLoadable<T> loadable, private <T> void startLoading(ParsingLoadable<T> loadable,
Loader.Callback<ParsingLoadable<T>> callback, int minRetryCount) { Loader.Callback<ParsingLoadable<T>> callback, int minRetryCount) {
long elapsedRealtimeMs = loader.startLoading(loadable, callback, minRetryCount); long elapsedRealtimeMs = loader.startLoading(loadable, callback, minRetryCount);
manifestEventDispatcher.loadStarted(loadable.dataSpec, loadable.type, elapsedRealtimeMs); manifestEventDispatcher.loadStarted(
new LoadEventInfo(loadable.dataSpec, elapsedRealtimeMs), loadable.type);
} }
private static final class PeriodSeekInfo { private static final class PeriodSeekInfo {
......
...@@ -36,6 +36,7 @@ import com.google.android.exoplayer2.metadata.Metadata; ...@@ -36,6 +36,7 @@ import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.metadata.emsg.EventMessage; import com.google.android.exoplayer2.metadata.emsg.EventMessage;
import com.google.android.exoplayer2.metadata.emsg.EventMessageDecoder; import com.google.android.exoplayer2.metadata.emsg.EventMessageDecoder;
import com.google.android.exoplayer2.metadata.id3.PrivFrame; import com.google.android.exoplayer2.metadata.id3.PrivFrame;
import com.google.android.exoplayer2.source.LoadEventInfo;
import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher;
import com.google.android.exoplayer2.source.SampleQueue; import com.google.android.exoplayer2.source.SampleQueue;
import com.google.android.exoplayer2.source.SampleQueue.UpstreamFormatChangedListener; import com.google.android.exoplayer2.source.SampleQueue.UpstreamFormatChangedListener;
...@@ -674,15 +675,14 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -674,15 +675,14 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
loader.startLoading( loader.startLoading(
loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type));
eventDispatcher.loadStarted( eventDispatcher.loadStarted(
loadable.dataSpec, new LoadEventInfo(loadable.dataSpec, elapsedRealtimeMs),
loadable.type, loadable.type,
trackType, trackType,
loadable.trackFormat, loadable.trackFormat,
loadable.trackSelectionReason, loadable.trackSelectionReason,
loadable.trackSelectionData, loadable.trackSelectionData,
loadable.startTimeUs, loadable.startTimeUs,
loadable.endTimeUs, loadable.endTimeUs);
elapsedRealtimeMs);
return true; return true;
} }
...@@ -702,19 +702,20 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -702,19 +702,20 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
public void onLoadCompleted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs) { public void onLoadCompleted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs) {
chunkSource.onChunkLoadCompleted(loadable); chunkSource.onChunkLoadCompleted(loadable);
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.getResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded()),
loadable.type, loadable.type,
trackType, trackType,
loadable.trackFormat, loadable.trackFormat,
loadable.trackSelectionReason, loadable.trackSelectionReason,
loadable.trackSelectionData, loadable.trackSelectionData,
loadable.startTimeUs, loadable.startTimeUs,
loadable.endTimeUs, loadable.endTimeUs);
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded());
if (!prepared) { if (!prepared) {
continueLoading(lastSeekPositionUs); continueLoading(lastSeekPositionUs);
} else { } else {
...@@ -726,19 +727,20 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -726,19 +727,20 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
public void onLoadCanceled( public void onLoadCanceled(
Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) { Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) {
eventDispatcher.loadCanceled( eventDispatcher.loadCanceled(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.getResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded()),
loadable.type, loadable.type,
trackType, trackType,
loadable.trackFormat, loadable.trackFormat,
loadable.trackSelectionReason, loadable.trackSelectionReason,
loadable.trackSelectionData, loadable.trackSelectionData,
loadable.startTimeUs, loadable.startTimeUs,
loadable.endTimeUs, loadable.endTimeUs);
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded());
if (!released) { if (!released) {
resetSampleQueues(); resetSampleQueues();
if (enabledTrackGroupCount > 0) { if (enabledTrackGroupCount > 0) {
...@@ -786,9 +788,13 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -786,9 +788,13 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
} }
eventDispatcher.loadError( eventDispatcher.loadError(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.getResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
bytesLoaded),
loadable.type, loadable.type,
trackType, trackType,
loadable.trackFormat, loadable.trackFormat,
...@@ -796,9 +802,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; ...@@ -796,9 +802,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
loadable.trackSelectionData, loadable.trackSelectionData,
loadable.startTimeUs, loadable.startTimeUs,
loadable.endTimeUs, loadable.endTimeUs,
elapsedRealtimeMs,
loadDurationMs,
bytesLoaded,
error, error,
/* wasCanceled= */ !loadErrorAction.isRetry()); /* wasCanceled= */ !loadErrorAction.isRetry());
......
...@@ -21,6 +21,7 @@ import android.os.SystemClock; ...@@ -21,6 +21,7 @@ import android.os.SystemClock;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.source.LoadEventInfo;
import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher;
import com.google.android.exoplayer2.source.hls.HlsDataSourceFactory; 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.HlsMasterPlaylist.Variant;
...@@ -135,9 +136,8 @@ public final class DefaultHlsPlaylistTracker ...@@ -135,9 +136,8 @@ public final class DefaultHlsPlaylistTracker
this, this,
loadErrorHandlingPolicy.getMinimumLoadableRetryCount(masterPlaylistLoadable.type)); loadErrorHandlingPolicy.getMinimumLoadableRetryCount(masterPlaylistLoadable.type));
eventDispatcher.loadStarted( eventDispatcher.loadStarted(
masterPlaylistLoadable.dataSpec, new LoadEventInfo(masterPlaylistLoadable.dataSpec, elapsedRealtime),
masterPlaylistLoadable.type, masterPlaylistLoadable.type);
elapsedRealtime);
} }
@Override @Override
...@@ -242,13 +242,14 @@ public final class DefaultHlsPlaylistTracker ...@@ -242,13 +242,14 @@ public final class DefaultHlsPlaylistTracker
primaryBundle.loadPlaylist(); primaryBundle.loadPlaylist();
} }
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
C.DATA_TYPE_MANIFEST, loadable.getResponseHeaders(),
elapsedRealtimeMs, elapsedRealtimeMs,
loadDurationMs, loadDurationMs,
loadable.bytesLoaded()); loadable.bytesLoaded()),
C.DATA_TYPE_MANIFEST);
} }
@Override @Override
...@@ -258,13 +259,14 @@ public final class DefaultHlsPlaylistTracker ...@@ -258,13 +259,14 @@ public final class DefaultHlsPlaylistTracker
long loadDurationMs, long loadDurationMs,
boolean released) { boolean released) {
eventDispatcher.loadCanceled( eventDispatcher.loadCanceled(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
C.DATA_TYPE_MANIFEST, loadable.getResponseHeaders(),
elapsedRealtimeMs, elapsedRealtimeMs,
loadDurationMs, loadDurationMs,
loadable.bytesLoaded()); loadable.bytesLoaded()),
C.DATA_TYPE_MANIFEST);
} }
@Override @Override
...@@ -279,13 +281,14 @@ public final class DefaultHlsPlaylistTracker ...@@ -279,13 +281,14 @@ public final class DefaultHlsPlaylistTracker
loadable.type, loadDurationMs, error, errorCount); loadable.type, loadDurationMs, error, errorCount);
boolean isFatal = retryDelayMs == C.TIME_UNSET; boolean isFatal = retryDelayMs == C.TIME_UNSET;
eventDispatcher.loadError( eventDispatcher.loadError(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.getResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded()),
C.DATA_TYPE_MANIFEST, C.DATA_TYPE_MANIFEST,
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded(),
error, error,
isFatal); isFatal);
return isFatal return isFatal
...@@ -521,13 +524,14 @@ public final class DefaultHlsPlaylistTracker ...@@ -521,13 +524,14 @@ public final class DefaultHlsPlaylistTracker
if (result instanceof HlsMediaPlaylist) { if (result instanceof HlsMediaPlaylist) {
processLoadedPlaylist((HlsMediaPlaylist) result, loadDurationMs); processLoadedPlaylist((HlsMediaPlaylist) result, loadDurationMs);
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
C.DATA_TYPE_MANIFEST, loadable.getResponseHeaders(),
elapsedRealtimeMs, elapsedRealtimeMs,
loadDurationMs, loadDurationMs,
loadable.bytesLoaded()); loadable.bytesLoaded()),
C.DATA_TYPE_MANIFEST);
} else { } else {
playlistError = new ParserException("Loaded playlist has unexpected type."); playlistError = new ParserException("Loaded playlist has unexpected type.");
} }
...@@ -540,13 +544,14 @@ public final class DefaultHlsPlaylistTracker ...@@ -540,13 +544,14 @@ public final class DefaultHlsPlaylistTracker
long loadDurationMs, long loadDurationMs,
boolean released) { boolean released) {
eventDispatcher.loadCanceled( eventDispatcher.loadCanceled(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
C.DATA_TYPE_MANIFEST, loadable.getResponseHeaders(),
elapsedRealtimeMs, elapsedRealtimeMs,
loadDurationMs, loadDurationMs,
loadable.bytesLoaded()); loadable.bytesLoaded()),
C.DATA_TYPE_MANIFEST);
} }
@Override @Override
...@@ -582,13 +587,14 @@ public final class DefaultHlsPlaylistTracker ...@@ -582,13 +587,14 @@ public final class DefaultHlsPlaylistTracker
} }
eventDispatcher.loadError( eventDispatcher.loadError(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.getResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded()),
C.DATA_TYPE_MANIFEST, C.DATA_TYPE_MANIFEST,
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded(),
error, error,
/* wasCanceled= */ !loadErrorAction.isRetry()); /* wasCanceled= */ !loadErrorAction.isRetry());
...@@ -612,9 +618,8 @@ public final class DefaultHlsPlaylistTracker ...@@ -612,9 +618,8 @@ public final class DefaultHlsPlaylistTracker
this, this,
loadErrorHandlingPolicy.getMinimumLoadableRetryCount(mediaPlaylistLoadable.type)); loadErrorHandlingPolicy.getMinimumLoadableRetryCount(mediaPlaylistLoadable.type));
eventDispatcher.loadStarted( eventDispatcher.loadStarted(
mediaPlaylistLoadable.dataSpec, new LoadEventInfo(mediaPlaylistLoadable.dataSpec, elapsedRealtime),
mediaPlaylistLoadable.type, mediaPlaylistLoadable.type);
elapsedRealtime);
} }
private void processLoadedPlaylist(HlsMediaPlaylist loadedPlaylist, long loadDurationMs) { private void processLoadedPlaylist(HlsMediaPlaylist loadedPlaylist, long loadDurationMs) {
......
...@@ -30,6 +30,7 @@ import com.google.android.exoplayer2.offline.StreamKey; ...@@ -30,6 +30,7 @@ import com.google.android.exoplayer2.offline.StreamKey;
import com.google.android.exoplayer2.source.BaseMediaSource; import com.google.android.exoplayer2.source.BaseMediaSource;
import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory; import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory;
import com.google.android.exoplayer2.source.DefaultCompositeSequenceableLoaderFactory; import com.google.android.exoplayer2.source.DefaultCompositeSequenceableLoaderFactory;
import com.google.android.exoplayer2.source.LoadEventInfo;
import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaPeriod;
import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.MediaSourceEventListener; import com.google.android.exoplayer2.source.MediaSourceEventListener;
...@@ -621,13 +622,14 @@ public final class SsMediaSource extends BaseMediaSource ...@@ -621,13 +622,14 @@ public final class SsMediaSource extends BaseMediaSource
public void onLoadCompleted( public void onLoadCompleted(
ParsingLoadable<SsManifest> loadable, long elapsedRealtimeMs, long loadDurationMs) { ParsingLoadable<SsManifest> loadable, long elapsedRealtimeMs, long loadDurationMs) {
manifestEventDispatcher.loadCompleted( manifestEventDispatcher.loadCompleted(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.type, loadable.getResponseHeaders(),
elapsedRealtimeMs, elapsedRealtimeMs,
loadDurationMs, loadDurationMs,
loadable.bytesLoaded()); loadable.bytesLoaded()),
loadable.type);
manifest = loadable.getResult(); manifest = loadable.getResult();
manifestLoadStartTimestamp = elapsedRealtimeMs - loadDurationMs; manifestLoadStartTimestamp = elapsedRealtimeMs - loadDurationMs;
processManifest(); processManifest();
...@@ -641,13 +643,14 @@ public final class SsMediaSource extends BaseMediaSource ...@@ -641,13 +643,14 @@ public final class SsMediaSource extends BaseMediaSource
long loadDurationMs, long loadDurationMs,
boolean released) { boolean released) {
manifestEventDispatcher.loadCanceled( manifestEventDispatcher.loadCanceled(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.type, loadable.getResponseHeaders(),
elapsedRealtimeMs, elapsedRealtimeMs,
loadDurationMs, loadDurationMs,
loadable.bytesLoaded()); loadable.bytesLoaded()),
loadable.type);
} }
@Override @Override
...@@ -665,13 +668,14 @@ public final class SsMediaSource extends BaseMediaSource ...@@ -665,13 +668,14 @@ public final class SsMediaSource extends BaseMediaSource
? Loader.DONT_RETRY_FATAL ? Loader.DONT_RETRY_FATAL
: Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs); : Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs);
manifestEventDispatcher.loadError( manifestEventDispatcher.loadError(
loadable.dataSpec, new LoadEventInfo(
loadable.getUri(), loadable.dataSpec,
loadable.getResponseHeaders(), loadable.getUri(),
loadable.getResponseHeaders(),
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded()),
loadable.type, loadable.type,
elapsedRealtimeMs,
loadDurationMs,
loadable.bytesLoaded(),
error, error,
!loadErrorAction.isRetry()); !loadErrorAction.isRetry());
return loadErrorAction; return loadErrorAction;
...@@ -767,7 +771,8 @@ public final class SsMediaSource extends BaseMediaSource ...@@ -767,7 +771,8 @@ public final class SsMediaSource extends BaseMediaSource
long elapsedRealtimeMs = long elapsedRealtimeMs =
manifestLoader.startLoading( manifestLoader.startLoading(
loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type));
manifestEventDispatcher.loadStarted(loadable.dataSpec, loadable.type, elapsedRealtimeMs); manifestEventDispatcher.loadStarted(
new LoadEventInfo(loadable.dataSpec, elapsedRealtimeMs), loadable.type);
} }
} }
...@@ -23,6 +23,7 @@ import android.os.SystemClock; ...@@ -23,6 +23,7 @@ import android.os.SystemClock;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.SeekParameters; import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.source.LoadEventInfo;
import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaPeriod;
import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher;
import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.source.SampleStream;
...@@ -121,15 +122,14 @@ public class FakeMediaPeriod implements MediaPeriod { ...@@ -121,15 +122,14 @@ public class FakeMediaPeriod implements MediaPeriod {
@Override @Override
public synchronized void prepare(Callback callback, long positionUs) { public synchronized void prepare(Callback callback, long positionUs) {
eventDispatcher.loadStarted( eventDispatcher.loadStarted(
FAKE_DATA_SPEC, new LoadEventInfo(FAKE_DATA_SPEC, SystemClock.elapsedRealtime()),
C.DATA_TYPE_MEDIA, C.DATA_TYPE_MEDIA,
C.TRACK_TYPE_UNKNOWN, C.TRACK_TYPE_UNKNOWN,
/* trackFormat= */ null, /* trackFormat= */ null,
C.SELECTION_REASON_UNKNOWN, C.SELECTION_REASON_UNKNOWN,
/* trackSelectionData= */ null, /* trackSelectionData= */ null,
/* mediaStartTimeUs= */ 0, /* mediaStartTimeUs= */ 0,
/* mediaEndTimeUs = */ C.TIME_UNSET, /* mediaEndTimeUs = */ C.TIME_UNSET);
SystemClock.elapsedRealtime());
prepareCallback = callback; prepareCallback = callback;
if (deferOnPrepared) { if (deferOnPrepared) {
playerHandler = Util.createHandler(); playerHandler = Util.createHandler();
...@@ -273,18 +273,19 @@ public class FakeMediaPeriod implements MediaPeriod { ...@@ -273,18 +273,19 @@ public class FakeMediaPeriod implements MediaPeriod {
prepared = true; prepared = true;
Util.castNonNull(prepareCallback).onPrepared(this); Util.castNonNull(prepareCallback).onPrepared(this);
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
FAKE_DATA_SPEC, new LoadEventInfo(
FAKE_DATA_SPEC.uri, FAKE_DATA_SPEC,
/* responseHeaders= */ Collections.emptyMap(), FAKE_DATA_SPEC.uri,
/* responseHeaders= */ Collections.emptyMap(),
SystemClock.elapsedRealtime(),
/* loadDurationMs= */ 0,
/* bytesLoaded= */ 100),
C.DATA_TYPE_MEDIA, C.DATA_TYPE_MEDIA,
C.TRACK_TYPE_UNKNOWN, C.TRACK_TYPE_UNKNOWN,
/* trackFormat= */ null, /* trackFormat= */ null,
C.SELECTION_REASON_UNKNOWN, C.SELECTION_REASON_UNKNOWN,
/* trackSelectionData= */ null, /* trackSelectionData= */ null,
/* mediaStartTimeUs= */ 0, /* mediaStartTimeUs= */ 0,
/* mediaEndTimeUs = */ C.TIME_UNSET, /* mediaEndTimeUs = */ C.TIME_UNSET);
SystemClock.elapsedRealtime(),
/* loadDurationMs= */ 0,
/* bytesLoaded= */ 100);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment