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..ae00933fd8 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 @@ -29,6 +29,7 @@ import androidx.media3.extractor.DefaultExtractorInput; import androidx.media3.extractor.Extractor; import androidx.media3.extractor.ExtractorInput; import androidx.media3.extractor.TrackOutput; +import com.google.errorprone.annotations.ForOverride; import java.io.IOException; /** A {@link BaseMediaChunk} that uses an {@link Extractor} to decode sample data. */ @@ -135,6 +136,7 @@ public class ContainerMediaChunk extends BaseMediaChunk { nextLoadPosition = input.getPosition() - dataSpec.position; } } finally { + onLoadEnded(); DataSourceUtil.closeQuietly(dataSource); } loadCompleted = !loadCanceled; @@ -151,6 +153,23 @@ 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 before the {@link DataSource} is closed. + */ + @ForOverride + protected void onLoadEnded() {} + + /** Returns whether the current chunk's load has been canceled from {@link #cancelLoad()}. */ + public final boolean isLoadCanceled() { + return loadCanceled; + } + + /** Returns the next position to load in the chunk on a {@link #load()}. */ + public final long getNextLoadPosition() { + return nextLoadPosition; + } + private void maybeWriteEmptySamples(BaseMediaChunkOutput output) { if (!MimeTypes.isImage(trackFormat.containerMimeType)) { return;