Add loadTaskId to LoadEventInfo

To be used by the LoadErrorHandlingPolicy.

PiperOrigin-RevId: 308657905
This commit is contained in:
aquilescanta 2020-04-27 19:08:18 +01:00 committed by Oliver Woodman
parent 0ba397cd4e
commit b5112492be
13 changed files with 84 additions and 32 deletions

View File

@ -34,6 +34,8 @@ public final class LoadEventInfo {
return idSource.getAndIncrement(); return idSource.getAndIncrement();
} }
/** Identifies the load task to which this event corresponds. */
public final long loadTaskId;
/** Defines the requested data. */ /** Defines the requested data. */
public final DataSpec dataSpec; public final DataSpec dataSpec;
/** /**
@ -52,11 +54,13 @@ public final class LoadEventInfo {
public final long bytesLoaded; public final long bytesLoaded;
/** /**
* Equivalent to {@link #LoadEventInfo(DataSpec, Uri, Map, long, long, long) * Equivalent to {@link #LoadEventInfo(long, DataSpec, Uri, Map, long, long, long)
* LoadEventInfo(dataSpec, dataSpec.uri, Collections.emptyMap(), elapsedRealtimeMs, 0, 0)}. * LoadEventInfo(loadTaskId, dataSpec, dataSpec.uri, Collections.emptyMap(), elapsedRealtimeMs, 0,
* 0)}.
*/ */
public LoadEventInfo(DataSpec dataSpec, long elapsedRealtimeMs) { public LoadEventInfo(long loadTaskId, DataSpec dataSpec, long elapsedRealtimeMs) {
this( this(
loadTaskId,
dataSpec, dataSpec,
dataSpec.uri, dataSpec.uri,
Collections.emptyMap(), Collections.emptyMap(),
@ -68,25 +72,23 @@ public final class LoadEventInfo {
/** /**
* Creates load event info. * Creates load event info.
* *
* @param dataSpec Defines the requested data. * @param loadTaskId See {@link #loadTaskId}.
* @param uri The {@link Uri} from which data is being read. The uri must be identical to the one * @param dataSpec See {@link #dataSpec}.
* in {@code dataSpec.uri} unless redirection has occurred. If redirection has occurred, this * @param uri See {@link #uri}.
* is the uri after redirection. * @param responseHeaders See {@link #responseHeaders}.
* @param responseHeaders The response headers associated with the load, or an empty map if * @param elapsedRealtimeMs See {@link #elapsedRealtimeMs}.
* unavailable. * @param loadDurationMs See {@link #loadDurationMs}.
* @param elapsedRealtimeMs The value of {@link SystemClock#elapsedRealtime} at the time of the * @param bytesLoaded See {@link #bytesLoaded}.
* load event.
* @param loadDurationMs The duration of the load up to the event time.
* @param bytesLoaded The number of bytes that were loaded up to the event time. For compressed
* network responses, this is the decompressed size.
*/ */
public LoadEventInfo( public LoadEventInfo(
long loadTaskId,
DataSpec dataSpec, DataSpec dataSpec,
Uri uri, Uri uri,
Map<String, List<String>> responseHeaders, Map<String, List<String>> responseHeaders,
long elapsedRealtimeMs, long elapsedRealtimeMs,
long loadDurationMs, long loadDurationMs,
long bytesLoaded) { long bytesLoaded) {
this.loadTaskId = loadTaskId;
this.dataSpec = dataSpec; this.dataSpec = dataSpec;
this.uri = uri; this.uri = uri;
this.responseHeaders = responseHeaders; this.responseHeaders = responseHeaders;

View File

@ -555,6 +555,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
StatsDataSource dataSource = loadable.dataSource; StatsDataSource dataSource = loadable.dataSource;
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
dataSource.getLastOpenedUri(), dataSource.getLastOpenedUri(),
dataSource.getLastResponseHeaders(), dataSource.getLastResponseHeaders(),
@ -579,6 +580,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
StatsDataSource dataSource = loadable.dataSource; StatsDataSource dataSource = loadable.dataSource;
eventDispatcher.loadCanceled( eventDispatcher.loadCanceled(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
dataSource.getLastOpenedUri(), dataSource.getLastOpenedUri(),
dataSource.getLastResponseHeaders(), dataSource.getLastResponseHeaders(),
@ -628,6 +630,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
StatsDataSource dataSource = loadable.dataSource; StatsDataSource dataSource = loadable.dataSource;
eventDispatcher.loadError( eventDispatcher.loadError(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
dataSource.getLastOpenedUri(), dataSource.getLastOpenedUri(),
dataSource.getLastResponseHeaders(), dataSource.getLastResponseHeaders(),
@ -789,7 +792,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(dataType)); loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(dataType));
DataSpec dataSpec = loadable.dataSpec; DataSpec dataSpec = loadable.dataSpec;
eventDispatcher.loadStarted( eventDispatcher.loadStarted(
new LoadEventInfo(dataSpec, elapsedRealtimeMs), new LoadEventInfo(loadable.loadTaskId, dataSpec, elapsedRealtimeMs),
C.DATA_TYPE_MEDIA, C.DATA_TYPE_MEDIA,
C.TRACK_TYPE_UNKNOWN, C.TRACK_TYPE_UNKNOWN,
/* trackFormat= */ null, /* trackFormat= */ null,
@ -928,6 +931,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/** Loads the media stream and extracts sample data from it. */ /** Loads the media stream and extracts sample data from it. */
/* package */ final class ExtractingLoadable implements Loadable, IcyDataSource.Listener { /* package */ final class ExtractingLoadable implements Loadable, IcyDataSource.Listener {
private final long loadTaskId;
private final Uri uri; private final Uri uri;
private final StatsDataSource dataSource; private final StatsDataSource dataSource;
private final ProgressiveMediaExtractor progressiveMediaExtractor; private final ProgressiveMediaExtractor progressiveMediaExtractor;
@ -959,6 +963,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
this.positionHolder = new PositionHolder(); this.positionHolder = new PositionHolder();
this.pendingExtractorSeek = true; this.pendingExtractorSeek = true;
this.length = C.LENGTH_UNSET; this.length = C.LENGTH_UNSET;
loadTaskId = LoadEventInfo.getNewId();
dataSpec = buildDataSpec(/* position= */ 0); dataSpec = buildDataSpec(/* position= */ 0);
} }

View File

@ -154,13 +154,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
if (transferListener != null) { if (transferListener != null) {
dataSource.addTransferListener(transferListener); dataSource.addTransferListener(transferListener);
} }
SourceLoadable loadable = new SourceLoadable(dataSpec, dataSource);
long elapsedRealtimeMs = long elapsedRealtimeMs =
loader.startLoading( loader.startLoading(
new SourceLoadable(dataSpec, dataSource), loadable,
/* callback= */ this, /* callback= */ this,
loadErrorHandlingPolicy.getMinimumLoadableRetryCount(C.DATA_TYPE_MEDIA)); loadErrorHandlingPolicy.getMinimumLoadableRetryCount(C.DATA_TYPE_MEDIA));
eventDispatcher.loadStarted( eventDispatcher.loadStarted(
new LoadEventInfo(dataSpec, elapsedRealtimeMs), new LoadEventInfo(loadable.loadTaskId, dataSpec, elapsedRealtimeMs),
C.DATA_TYPE_MEDIA, C.DATA_TYPE_MEDIA,
C.TRACK_TYPE_UNKNOWN, C.TRACK_TYPE_UNKNOWN,
format, format,
@ -219,6 +220,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
StatsDataSource dataSource = loadable.dataSource; StatsDataSource dataSource = loadable.dataSource;
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
dataSource.getLastOpenedUri(), dataSource.getLastOpenedUri(),
dataSource.getLastResponseHeaders(), dataSource.getLastResponseHeaders(),
@ -240,6 +242,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
StatsDataSource dataSource = loadable.dataSource; StatsDataSource dataSource = loadable.dataSource;
eventDispatcher.loadCanceled( eventDispatcher.loadCanceled(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
dataSource.getLastOpenedUri(), dataSource.getLastOpenedUri(),
dataSource.getLastResponseHeaders(), dataSource.getLastResponseHeaders(),
@ -283,6 +286,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
StatsDataSource dataSource = loadable.dataSource; StatsDataSource dataSource = loadable.dataSource;
eventDispatcher.loadError( eventDispatcher.loadError(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
dataSource.getLastOpenedUri(), dataSource.getLastOpenedUri(),
dataSource.getLastResponseHeaders(), dataSource.getLastResponseHeaders(),
@ -382,6 +386,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/* package */ static final class SourceLoadable implements Loadable { /* package */ static final class SourceLoadable implements Loadable {
public final long loadTaskId;
public final DataSpec dataSpec; public final DataSpec dataSpec;
private final StatsDataSource dataSource; private final StatsDataSource dataSource;
@ -389,6 +394,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@Nullable private byte[] sampleData; @Nullable private byte[] sampleData;
public SourceLoadable(DataSpec dataSpec, DataSource dataSource) { public SourceLoadable(DataSpec dataSpec, DataSource dataSource) {
this.loadTaskId = LoadEventInfo.getNewId();
this.dataSpec = dataSpec; this.dataSpec = dataSpec;
this.dataSource = new StatsDataSource(dataSource); this.dataSource = new StatsDataSource(dataSource);
} }

View File

@ -355,7 +355,10 @@ public final class AdsMediaSource extends CompositeMediaSource<MediaPeriodId> {
} }
createEventDispatcher(/* mediaPeriodId= */ null) createEventDispatcher(/* mediaPeriodId= */ null)
.loadError( .loadError(
new LoadEventInfo(dataSpec, /* elapsedRealtimeMs= */ SystemClock.elapsedRealtime()), new LoadEventInfo(
LoadEventInfo.getNewId(),
dataSpec,
/* elapsedRealtimeMs= */ SystemClock.elapsedRealtime()),
C.DATA_TYPE_AD, C.DATA_TYPE_AD,
error, error,
/* wasCanceled= */ true); /* wasCanceled= */ true);
@ -379,7 +382,9 @@ public final class AdsMediaSource extends CompositeMediaSource<MediaPeriodId> {
createEventDispatcher(mediaPeriodId) createEventDispatcher(mediaPeriodId)
.loadError( .loadError(
new LoadEventInfo( new LoadEventInfo(
new DataSpec(adUri), /* elapsedRealtimeMs= */ SystemClock.elapsedRealtime()), LoadEventInfo.getNewId(),
new DataSpec(adUri),
/* elapsedRealtimeMs= */ SystemClock.elapsedRealtime()),
C.DATA_TYPE_AD, C.DATA_TYPE_AD,
AdLoadException.createForAd(exception), AdLoadException.createForAd(exception),
/* wasCanceled= */ true); /* wasCanceled= */ true);

View File

@ -19,6 +19,7 @@ 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.source.LoadEventInfo;
import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.DataSpec;
import com.google.android.exoplayer2.upstream.Loader.Loadable; import com.google.android.exoplayer2.upstream.Loader.Loadable;
@ -33,9 +34,9 @@ import java.util.Map;
*/ */
public abstract class Chunk implements Loadable { public abstract class Chunk implements Loadable {
/** /** Identifies the load task for this loadable. */
* The {@link DataSpec} that defines the data to be loaded. public final long loadTaskId;
*/ /** The {@link DataSpec} that defines the data to be loaded. */
public final DataSpec dataSpec; public final DataSpec dataSpec;
/** /**
* The type of the chunk. One of the {@code DATA_TYPE_*} constants defined in {@link C}. For * The type of the chunk. One of the {@code DATA_TYPE_*} constants defined in {@link C}. For
@ -95,6 +96,7 @@ public abstract class Chunk implements Loadable {
this.trackSelectionData = trackSelectionData; this.trackSelectionData = trackSelectionData;
this.startTimeUs = startTimeUs; this.startTimeUs = startTimeUs;
this.endTimeUs = endTimeUs; this.endTimeUs = endTimeUs;
loadTaskId = LoadEventInfo.getNewId();
} }
/** /**

View File

@ -407,6 +407,7 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
chunkSource.onChunkLoadCompleted(loadable); chunkSource.onChunkLoadCompleted(loadable);
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -428,6 +429,7 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) { Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) {
eventDispatcher.loadCanceled( eventDispatcher.loadCanceled(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -497,6 +499,7 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
boolean canceled = !loadErrorAction.isRetry(); boolean canceled = !loadErrorAction.isRetry();
eventDispatcher.loadError( eventDispatcher.loadError(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -568,7 +571,7 @@ 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(
new LoadEventInfo(loadable.dataSpec, elapsedRealtimeMs), new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs),
loadable.type, loadable.type,
primaryTrackType, primaryTrackType,
loadable.trackFormat, loadable.trackFormat,

View File

@ -19,6 +19,7 @@ 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.ParserException; import com.google.android.exoplayer2.ParserException;
import com.google.android.exoplayer2.source.LoadEventInfo;
import com.google.android.exoplayer2.upstream.Loader.Loadable; import com.google.android.exoplayer2.upstream.Loader.Loadable;
import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
@ -87,9 +88,9 @@ public final class ParsingLoadable<T> implements Loadable {
return Assertions.checkNotNull(loadable.getResult()); return Assertions.checkNotNull(loadable.getResult());
} }
/** /** Identifies the load task for this loadable. */
* The {@link DataSpec} that defines the data to be loaded. public final long loadTaskId;
*/ /** The {@link DataSpec} that defines the data to be loaded. */
public final DataSpec dataSpec; public final DataSpec dataSpec;
/** /**
* The type of the data. One of the {@code DATA_TYPE_*} constants defined in {@link C}. For * The type of the data. One of the {@code DATA_TYPE_*} constants defined in {@link C}. For
@ -128,6 +129,7 @@ public final class ParsingLoadable<T> implements Loadable {
this.dataSpec = dataSpec; this.dataSpec = dataSpec;
this.type = type; this.type = type;
this.parser = parser; this.parser = parser;
loadTaskId = LoadEventInfo.getNewId();
} }
/** Returns the loaded object, or null if an object has not been loaded. */ /** Returns the loaded object, or null if an object has not been loaded. */

View File

@ -756,6 +756,7 @@ public final class DashMediaSource extends BaseMediaSource {
long elapsedRealtimeMs, long loadDurationMs) { long elapsedRealtimeMs, long loadDurationMs) {
manifestEventDispatcher.loadCompleted( manifestEventDispatcher.loadCompleted(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -859,6 +860,7 @@ public final class DashMediaSource extends BaseMediaSource {
: Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs); : Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs);
manifestEventDispatcher.loadError( manifestEventDispatcher.loadError(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -875,6 +877,7 @@ public final class DashMediaSource extends BaseMediaSource {
long elapsedRealtimeMs, long loadDurationMs) { long elapsedRealtimeMs, long loadDurationMs) {
manifestEventDispatcher.loadCompleted( manifestEventDispatcher.loadCompleted(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -892,6 +895,7 @@ public final class DashMediaSource extends BaseMediaSource {
IOException error) { IOException error) {
manifestEventDispatcher.loadError( manifestEventDispatcher.loadError(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -909,6 +913,7 @@ public final class DashMediaSource extends BaseMediaSource {
long loadDurationMs) { long loadDurationMs) {
manifestEventDispatcher.loadCanceled( manifestEventDispatcher.loadCanceled(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -1129,7 +1134,8 @@ public final class DashMediaSource extends BaseMediaSource {
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( manifestEventDispatcher.loadStarted(
new LoadEventInfo(loadable.dataSpec, elapsedRealtimeMs), loadable.type); new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs),
loadable.type);
} }
private static final class PeriodSeekInfo { private static final class PeriodSeekInfo {

View File

@ -676,7 +676,7 @@ 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(
new LoadEventInfo(loadable.dataSpec, elapsedRealtimeMs), new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs),
loadable.type, loadable.type,
trackType, trackType,
loadable.trackFormat, loadable.trackFormat,
@ -704,6 +704,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
chunkSource.onChunkLoadCompleted(loadable); chunkSource.onChunkLoadCompleted(loadable);
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -729,6 +730,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) { Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) {
eventDispatcher.loadCanceled( eventDispatcher.loadCanceled(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -790,6 +792,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
eventDispatcher.loadError( eventDispatcher.loadError(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),

View File

@ -136,7 +136,8 @@ public final class DefaultHlsPlaylistTracker
this, this,
loadErrorHandlingPolicy.getMinimumLoadableRetryCount(masterPlaylistLoadable.type)); loadErrorHandlingPolicy.getMinimumLoadableRetryCount(masterPlaylistLoadable.type));
eventDispatcher.loadStarted( eventDispatcher.loadStarted(
new LoadEventInfo(masterPlaylistLoadable.dataSpec, elapsedRealtime), new LoadEventInfo(
masterPlaylistLoadable.loadTaskId, masterPlaylistLoadable.dataSpec, elapsedRealtime),
masterPlaylistLoadable.type); masterPlaylistLoadable.type);
} }
@ -243,6 +244,7 @@ public final class DefaultHlsPlaylistTracker
} }
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -260,6 +262,7 @@ public final class DefaultHlsPlaylistTracker
boolean released) { boolean released) {
eventDispatcher.loadCanceled( eventDispatcher.loadCanceled(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -282,6 +285,7 @@ public final class DefaultHlsPlaylistTracker
boolean isFatal = retryDelayMs == C.TIME_UNSET; boolean isFatal = retryDelayMs == C.TIME_UNSET;
eventDispatcher.loadError( eventDispatcher.loadError(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -525,6 +529,7 @@ public final class DefaultHlsPlaylistTracker
processLoadedPlaylist((HlsMediaPlaylist) result, loadDurationMs); processLoadedPlaylist((HlsMediaPlaylist) result, loadDurationMs);
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -545,6 +550,7 @@ public final class DefaultHlsPlaylistTracker
boolean released) { boolean released) {
eventDispatcher.loadCanceled( eventDispatcher.loadCanceled(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -588,6 +594,7 @@ public final class DefaultHlsPlaylistTracker
eventDispatcher.loadError( eventDispatcher.loadError(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -618,7 +625,8 @@ public final class DefaultHlsPlaylistTracker
this, this,
loadErrorHandlingPolicy.getMinimumLoadableRetryCount(mediaPlaylistLoadable.type)); loadErrorHandlingPolicy.getMinimumLoadableRetryCount(mediaPlaylistLoadable.type));
eventDispatcher.loadStarted( eventDispatcher.loadStarted(
new LoadEventInfo(mediaPlaylistLoadable.dataSpec, elapsedRealtime), new LoadEventInfo(
mediaPlaylistLoadable.loadTaskId, mediaPlaylistLoadable.dataSpec, elapsedRealtime),
mediaPlaylistLoadable.type); mediaPlaylistLoadable.type);
} }

View File

@ -623,6 +623,7 @@ public final class SsMediaSource extends BaseMediaSource
ParsingLoadable<SsManifest> loadable, long elapsedRealtimeMs, long loadDurationMs) { ParsingLoadable<SsManifest> loadable, long elapsedRealtimeMs, long loadDurationMs) {
manifestEventDispatcher.loadCompleted( manifestEventDispatcher.loadCompleted(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -644,6 +645,7 @@ public final class SsMediaSource extends BaseMediaSource
boolean released) { boolean released) {
manifestEventDispatcher.loadCanceled( manifestEventDispatcher.loadCanceled(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -669,6 +671,7 @@ public final class SsMediaSource extends BaseMediaSource
: Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs); : Loader.createRetryAction(/* resetErrorCount= */ false, retryDelayMs);
manifestEventDispatcher.loadError( manifestEventDispatcher.loadError(
new LoadEventInfo( new LoadEventInfo(
loadable.loadTaskId,
loadable.dataSpec, loadable.dataSpec,
loadable.getUri(), loadable.getUri(),
loadable.getResponseHeaders(), loadable.getResponseHeaders(),
@ -772,7 +775,8 @@ public final class SsMediaSource extends BaseMediaSource
manifestLoader.startLoading( manifestLoader.startLoading(
loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type)); loadable, this, loadErrorHandlingPolicy.getMinimumLoadableRetryCount(loadable.type));
manifestEventDispatcher.loadStarted( manifestEventDispatcher.loadStarted(
new LoadEventInfo(loadable.dataSpec, elapsedRealtimeMs), loadable.type); new LoadEventInfo(loadable.loadTaskId, loadable.dataSpec, elapsedRealtimeMs),
loadable.type);
} }
} }

View File

@ -50,6 +50,7 @@ public class FakeMediaPeriod implements MediaPeriod {
private final TrackGroupArray trackGroupArray; private final TrackGroupArray trackGroupArray;
private final List<SampleStream> sampleStreams; private final List<SampleStream> sampleStreams;
private final EventDispatcher eventDispatcher; private final EventDispatcher eventDispatcher;
private final long fakePreparationLoadTaskId;
@Nullable private Handler playerHandler; @Nullable private Handler playerHandler;
@Nullable private Callback prepareCallback; @Nullable private Callback prepareCallback;
@ -82,6 +83,7 @@ public class FakeMediaPeriod implements MediaPeriod {
this.deferOnPrepared = deferOnPrepared; this.deferOnPrepared = deferOnPrepared;
discontinuityPositionUs = C.TIME_UNSET; discontinuityPositionUs = C.TIME_UNSET;
sampleStreams = new ArrayList<>(); sampleStreams = new ArrayList<>();
fakePreparationLoadTaskId = LoadEventInfo.getNewId();
eventDispatcher.mediaPeriodCreated(); eventDispatcher.mediaPeriodCreated();
} }
@ -122,7 +124,7 @@ 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(
new LoadEventInfo(FAKE_DATA_SPEC, SystemClock.elapsedRealtime()), new LoadEventInfo(fakePreparationLoadTaskId, 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,
@ -274,6 +276,7 @@ public class FakeMediaPeriod implements MediaPeriod {
Util.castNonNull(prepareCallback).onPrepared(this); Util.castNonNull(prepareCallback).onPrepared(this);
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
new LoadEventInfo( new LoadEventInfo(
fakePreparationLoadTaskId,
FAKE_DATA_SPEC, FAKE_DATA_SPEC,
FAKE_DATA_SPEC.uri, FAKE_DATA_SPEC.uri,
/* responseHeaders= */ Collections.emptyMap(), /* responseHeaders= */ Collections.emptyMap(),

View File

@ -261,8 +261,10 @@ public class FakeMediaSource extends BaseMediaSource {
/* mediaEndTimeMs = */ C.TIME_UNSET); /* mediaEndTimeMs = */ C.TIME_UNSET);
long elapsedRealTimeMs = SystemClock.elapsedRealtime(); long elapsedRealTimeMs = SystemClock.elapsedRealtime();
EventDispatcher eventDispatcher = createEventDispatcher(/* mediaPeriodId= */ null); EventDispatcher eventDispatcher = createEventDispatcher(/* mediaPeriodId= */ null);
long loadTaskId = LoadEventInfo.getNewId();
eventDispatcher.loadStarted( eventDispatcher.loadStarted(
new LoadEventInfo( new LoadEventInfo(
loadTaskId,
FAKE_DATA_SPEC, FAKE_DATA_SPEC,
FAKE_DATA_SPEC.uri, FAKE_DATA_SPEC.uri,
/* responseHeaders= */ Collections.emptyMap(), /* responseHeaders= */ Collections.emptyMap(),
@ -272,6 +274,7 @@ public class FakeMediaSource extends BaseMediaSource {
mediaLoadData); mediaLoadData);
eventDispatcher.loadCompleted( eventDispatcher.loadCompleted(
new LoadEventInfo( new LoadEventInfo(
loadTaskId,
FAKE_DATA_SPEC, FAKE_DATA_SPEC,
FAKE_DATA_SPEC.uri, FAKE_DATA_SPEC.uri,
/* responseHeaders= */ Collections.emptyMap(), /* responseHeaders= */ Collections.emptyMap(),