diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ContainerMediaChunk.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ContainerMediaChunk.java index b2dff4d01e..c9164134ad 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ContainerMediaChunk.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/source/chunk/ContainerMediaChunk.java @@ -135,6 +135,7 @@ public class ContainerMediaChunk extends BaseMediaChunk { nextLoadPosition = input.getPosition() - dataSpec.position; } } finally { + onLoadIterationEnded(); DataSourceUtil.closeQuietly(dataSource); } loadCompleted = !loadCanceled; @@ -151,6 +152,30 @@ public class ContainerMediaChunk extends BaseMediaChunk { return baseMediaChunkOutput; } + /** + * Method that is called to signal that a {@link #load()} has concluded. This is called in both + * successful and error scenarios. + */ + protected void onLoadIterationEnded() {} + + /** + * Returns whether the current chunk's load has been canceled from {@link #cancelLoad()} + * + * @return true if {@link #cancelLoad()} was invoked + */ + public final boolean isLoadCanceled() { + return loadCanceled; + } + + /** + * Retrieves the next position to load in the chunk on a {@link #load()} + * + * @return the position to load from + */ + public final long getNextLoadPosition() { + return nextLoadPosition; + } + private void maybeWriteEmptySamples(BaseMediaChunkOutput output) { if (!MimeTypes.isImage(trackFormat.containerMimeType)) { return;