From 5a84e09a0e28ce9f333df92c4a2ed579ae8bb570 Mon Sep 17 00:00:00 2001 From: bachinger Date: Tue, 9 Apr 2024 10:29:54 -0700 Subject: [PATCH] Use zero offset when delegating EMSG sample data When delegating EMSG samples in `HlsSampleStreamWrapper`, the offset passed into `sampleMetadata(..)` of the delegate `TrackOutput` must be zero because it is called immediately after `sampleData(..)` is called. The condition to trigger this issue is that more than one metadata samples are pending in `pendingMetadataSampleInfos` of `FragmentedMp4Extractor` which produces non-zero offsets. Issue: androidx/media#1002 Issue: androidx/media#1203 PiperOrigin-RevId: 623210835 --- RELEASENOTES.md | 4 ++++ .../androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c97e9ba046..e6e68257cb 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -25,6 +25,10 @@ * Cronet Extension: * RTMP Extension: * HLS Extension: + * Fix bug where pending EMSG samples waiting for a discontinuity were + delegated in `HlsSampleStreamWrapper` with an incorrect offset causing + an `IndexOutOfBoundsException` or an `IllegalArgumentException` + ([#1002](https://github.com/androidx/media/issues/1002)). * DASH Extension: * Smooth Streaming Extension: * RTSP Extension: diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java index aebff9592d..b9961c603c 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java @@ -1882,7 +1882,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; int sampleSize = sampleForDelegate.bytesLeft(); delegate.sampleData(sampleForDelegate, sampleSize); - delegate.sampleMetadata(timeUs, flags, sampleSize, offset, cryptoData); + delegate.sampleMetadata(timeUs, flags, sampleSize, /* offset= */ 0, cryptoData); } private boolean emsgContainsExpectedWrappedFormat(EventMessage emsg) {