Add LoadErrorHandlingPolicy cleanup callbacks
Implementors should use the new callbacks to clean up any resources associated with the corresponding LoadEventInfo ids. PiperOrigin-RevId: 309198455
This commit is contained in:
parent
b0a59a6b62
commit
c4f65eb84a
@ -553,7 +553,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
listener.onSourceInfoRefreshed(durationUs, isSeekable, isLive);
|
||||
}
|
||||
StatsDataSource dataSource = loadable.dataSource;
|
||||
eventDispatcher.loadCompleted(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -561,7 +561,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
dataSource.getLastResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
dataSource.getBytesRead()),
|
||||
dataSource.getBytesRead());
|
||||
loadErrorHandlingPolicy.onLoadCompleted(loadEventInfo);
|
||||
eventDispatcher.loadCompleted(
|
||||
loadEventInfo,
|
||||
C.DATA_TYPE_MEDIA,
|
||||
C.TRACK_TYPE_UNKNOWN,
|
||||
/* trackFormat= */ null,
|
||||
@ -578,7 +581,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
public void onLoadCanceled(
|
||||
ExtractingLoadable loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) {
|
||||
StatsDataSource dataSource = loadable.dataSource;
|
||||
eventDispatcher.loadCanceled(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -586,7 +589,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
dataSource.getLastResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
dataSource.getBytesRead()),
|
||||
dataSource.getBytesRead());
|
||||
loadErrorHandlingPolicy.onLoadCanceled(loadEventInfo);
|
||||
eventDispatcher.loadCanceled(
|
||||
loadEventInfo,
|
||||
C.DATA_TYPE_MEDIA,
|
||||
C.TRACK_TYPE_UNKNOWN,
|
||||
/* trackFormat= */ null,
|
||||
|
@ -218,7 +218,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
sampleData = Assertions.checkNotNull(loadable.sampleData);
|
||||
loadingFinished = true;
|
||||
StatsDataSource dataSource = loadable.dataSource;
|
||||
eventDispatcher.loadCompleted(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -226,7 +226,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
dataSource.getLastResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
sampleSize),
|
||||
sampleSize);
|
||||
loadErrorHandlingPolicy.onLoadCompleted(loadEventInfo);
|
||||
eventDispatcher.loadCompleted(
|
||||
loadEventInfo,
|
||||
C.DATA_TYPE_MEDIA,
|
||||
C.TRACK_TYPE_UNKNOWN,
|
||||
format,
|
||||
@ -240,7 +243,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
public void onLoadCanceled(
|
||||
SourceLoadable loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) {
|
||||
StatsDataSource dataSource = loadable.dataSource;
|
||||
eventDispatcher.loadCanceled(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -248,7 +251,10 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||
dataSource.getLastResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
dataSource.getBytesRead()),
|
||||
dataSource.getBytesRead());
|
||||
loadErrorHandlingPolicy.onLoadCanceled(loadEventInfo);
|
||||
eventDispatcher.loadCanceled(
|
||||
loadEventInfo,
|
||||
C.DATA_TYPE_MEDIA,
|
||||
C.TRACK_TYPE_UNKNOWN,
|
||||
/* trackFormat= */ null,
|
||||
|
@ -405,7 +405,7 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
||||
@Override
|
||||
public void onLoadCompleted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs) {
|
||||
chunkSource.onChunkLoadCompleted(loadable);
|
||||
eventDispatcher.loadCompleted(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -413,7 +413,10 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCompleted(loadEventInfo);
|
||||
eventDispatcher.loadCompleted(
|
||||
loadEventInfo,
|
||||
loadable.type,
|
||||
primaryTrackType,
|
||||
loadable.trackFormat,
|
||||
@ -427,7 +430,7 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
||||
@Override
|
||||
public void onLoadCanceled(
|
||||
Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) {
|
||||
eventDispatcher.loadCanceled(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -435,7 +438,10 @@ public class ChunkSampleStream<T extends ChunkSource> implements SampleStream, S
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCanceled(loadEventInfo);
|
||||
eventDispatcher.loadCanceled(
|
||||
loadEventInfo,
|
||||
loadable.type,
|
||||
primaryTrackType,
|
||||
loadable.trackFormat,
|
||||
|
@ -136,6 +136,22 @@ public interface LoadErrorHandlingPolicy {
|
||||
loadErrorInfo.errorCount);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the load associated with the given {@link LoadEventInfo} completes.
|
||||
*
|
||||
* <p>Implementations of this interface should avoid resource leaks by releasing resources
|
||||
* associated to the given {@link LoadEventInfo#loadTaskId}.
|
||||
*/
|
||||
default void onLoadCompleted(LoadEventInfo loadEventInfo) {}
|
||||
|
||||
/**
|
||||
* Called when the load associated with the given {@link LoadEventInfo} is canceled.
|
||||
*
|
||||
* <p>Implementations of this interface should avoid resource leaks by releasing resources
|
||||
* associated to the given {@link LoadEventInfo#loadTaskId}.
|
||||
*/
|
||||
default void onLoadCanceled(LoadEventInfo loadEventInfo) {}
|
||||
|
||||
/**
|
||||
* Returns the minimum number of times to retry a load in the case of a load error, before
|
||||
* propagating the error.
|
||||
|
@ -754,7 +754,7 @@ public final class DashMediaSource extends BaseMediaSource {
|
||||
|
||||
/* package */ void onManifestLoadCompleted(ParsingLoadable<DashManifest> loadable,
|
||||
long elapsedRealtimeMs, long loadDurationMs) {
|
||||
manifestEventDispatcher.loadCompleted(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -762,8 +762,9 @@ public final class DashMediaSource extends BaseMediaSource {
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
loadable.type);
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCompleted(loadEventInfo);
|
||||
manifestEventDispatcher.loadCompleted(loadEventInfo, loadable.type);
|
||||
DashManifest newManifest = loadable.getResult();
|
||||
|
||||
int oldPeriodCount = manifest == null ? 0 : manifest.getPeriodCount();
|
||||
@ -875,7 +876,7 @@ public final class DashMediaSource extends BaseMediaSource {
|
||||
|
||||
/* package */ void onUtcTimestampLoadCompleted(ParsingLoadable<Long> loadable,
|
||||
long elapsedRealtimeMs, long loadDurationMs) {
|
||||
manifestEventDispatcher.loadCompleted(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -883,8 +884,9 @@ public final class DashMediaSource extends BaseMediaSource {
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
loadable.type);
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCompleted(loadEventInfo);
|
||||
manifestEventDispatcher.loadCompleted(loadEventInfo, loadable.type);
|
||||
onUtcTimestampResolved(loadable.getResult() - elapsedRealtimeMs);
|
||||
}
|
||||
|
||||
@ -911,7 +913,7 @@ public final class DashMediaSource extends BaseMediaSource {
|
||||
|
||||
/* package */ void onLoadCanceled(ParsingLoadable<?> loadable, long elapsedRealtimeMs,
|
||||
long loadDurationMs) {
|
||||
manifestEventDispatcher.loadCanceled(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -919,8 +921,9 @@ public final class DashMediaSource extends BaseMediaSource {
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
loadable.type);
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCanceled(loadEventInfo);
|
||||
manifestEventDispatcher.loadCanceled(loadEventInfo, loadable.type);
|
||||
}
|
||||
|
||||
// Internal methods.
|
||||
|
@ -702,7 +702,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||
@Override
|
||||
public void onLoadCompleted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs) {
|
||||
chunkSource.onChunkLoadCompleted(loadable);
|
||||
eventDispatcher.loadCompleted(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -710,7 +710,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCompleted(loadEventInfo);
|
||||
eventDispatcher.loadCompleted(
|
||||
loadEventInfo,
|
||||
loadable.type,
|
||||
trackType,
|
||||
loadable.trackFormat,
|
||||
@ -728,7 +731,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||
@Override
|
||||
public void onLoadCanceled(
|
||||
Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, boolean released) {
|
||||
eventDispatcher.loadCanceled(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -736,7 +739,10 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull;
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCanceled(loadEventInfo);
|
||||
eventDispatcher.loadCanceled(
|
||||
loadEventInfo,
|
||||
loadable.type,
|
||||
trackType,
|
||||
loadable.trackFormat,
|
||||
|
@ -242,7 +242,7 @@ public final class DefaultHlsPlaylistTracker
|
||||
} else {
|
||||
primaryBundle.loadPlaylist();
|
||||
}
|
||||
eventDispatcher.loadCompleted(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -250,8 +250,9 @@ public final class DefaultHlsPlaylistTracker
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
C.DATA_TYPE_MANIFEST);
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCompleted(loadEventInfo);
|
||||
eventDispatcher.loadCompleted(loadEventInfo, C.DATA_TYPE_MANIFEST);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -260,7 +261,7 @@ public final class DefaultHlsPlaylistTracker
|
||||
long elapsedRealtimeMs,
|
||||
long loadDurationMs,
|
||||
boolean released) {
|
||||
eventDispatcher.loadCanceled(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -268,8 +269,9 @@ public final class DefaultHlsPlaylistTracker
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
C.DATA_TYPE_MANIFEST);
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCanceled(loadEventInfo);
|
||||
eventDispatcher.loadCanceled(loadEventInfo, C.DATA_TYPE_MANIFEST);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -525,9 +527,7 @@ public final class DefaultHlsPlaylistTracker
|
||||
public void onLoadCompleted(
|
||||
ParsingLoadable<HlsPlaylist> loadable, long elapsedRealtimeMs, long loadDurationMs) {
|
||||
HlsPlaylist result = loadable.getResult();
|
||||
if (result instanceof HlsMediaPlaylist) {
|
||||
processLoadedPlaylist((HlsMediaPlaylist) result, loadDurationMs);
|
||||
eventDispatcher.loadCompleted(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -535,8 +535,11 @@ public final class DefaultHlsPlaylistTracker
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
C.DATA_TYPE_MANIFEST);
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCompleted(loadEventInfo);
|
||||
if (result instanceof HlsMediaPlaylist) {
|
||||
processLoadedPlaylist((HlsMediaPlaylist) result, loadDurationMs);
|
||||
eventDispatcher.loadCompleted(loadEventInfo, C.DATA_TYPE_MANIFEST);
|
||||
} else {
|
||||
playlistError = new ParserException("Loaded playlist has unexpected type.");
|
||||
}
|
||||
@ -548,7 +551,7 @@ public final class DefaultHlsPlaylistTracker
|
||||
long elapsedRealtimeMs,
|
||||
long loadDurationMs,
|
||||
boolean released) {
|
||||
eventDispatcher.loadCanceled(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -556,8 +559,9 @@ public final class DefaultHlsPlaylistTracker
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
C.DATA_TYPE_MANIFEST);
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCanceled(loadEventInfo);
|
||||
eventDispatcher.loadCanceled(loadEventInfo, C.DATA_TYPE_MANIFEST);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -621,7 +621,7 @@ public final class SsMediaSource extends BaseMediaSource
|
||||
@Override
|
||||
public void onLoadCompleted(
|
||||
ParsingLoadable<SsManifest> loadable, long elapsedRealtimeMs, long loadDurationMs) {
|
||||
manifestEventDispatcher.loadCompleted(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -629,8 +629,9 @@ public final class SsMediaSource extends BaseMediaSource
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
loadable.type);
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCompleted(loadEventInfo);
|
||||
manifestEventDispatcher.loadCompleted(loadEventInfo, loadable.type);
|
||||
manifest = loadable.getResult();
|
||||
manifestLoadStartTimestamp = elapsedRealtimeMs - loadDurationMs;
|
||||
processManifest();
|
||||
@ -643,7 +644,7 @@ public final class SsMediaSource extends BaseMediaSource
|
||||
long elapsedRealtimeMs,
|
||||
long loadDurationMs,
|
||||
boolean released) {
|
||||
manifestEventDispatcher.loadCanceled(
|
||||
LoadEventInfo loadEventInfo =
|
||||
new LoadEventInfo(
|
||||
loadable.loadTaskId,
|
||||
loadable.dataSpec,
|
||||
@ -651,8 +652,9 @@ public final class SsMediaSource extends BaseMediaSource
|
||||
loadable.getResponseHeaders(),
|
||||
elapsedRealtimeMs,
|
||||
loadDurationMs,
|
||||
loadable.bytesLoaded()),
|
||||
loadable.type);
|
||||
loadable.bytesLoaded());
|
||||
loadErrorHandlingPolicy.onLoadCanceled(loadEventInfo);
|
||||
manifestEventDispatcher.loadCanceled(loadEventInfo, loadable.type);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Loading…
x
Reference in New Issue
Block a user