diff --git a/RELEASENOTES.md b/RELEASENOTES.md index b40eed00b6..966d76176c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -23,6 +23,9 @@ instead. * Remove `Transformer.startTransformation(MediaItem, ParcelFileDescriptor)`. +* DASH: + * Fix handling of empty segment timelines + ([#11014](https://github.com/google/ExoPlayer/issues/11014)). * Remove deprecated symbols: * Remove `DefaultAudioSink` constructors, use `DefaultAudioSink.Builder` instead. diff --git a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DefaultDashChunkSource.java b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DefaultDashChunkSource.java index 31fe7ac8dc..d1c598e5ac 100644 --- a/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DefaultDashChunkSource.java +++ b/libraries/exoplayer_dash/src/main/java/androidx/media3/exoplayer/dash/DefaultDashChunkSource.java @@ -236,9 +236,12 @@ public class DefaultDashChunkSource implements DashChunkSource { // Segments are aligned across representations, so any segment index will do. for (RepresentationHolder representationHolder : representationHolders) { if (representationHolder.segmentIndex != null) { + long segmentCount = representationHolder.getSegmentCount(); + if (segmentCount == 0) { + continue; + } long segmentNum = representationHolder.getSegmentNum(positionUs); long firstSyncUs = representationHolder.getSegmentStartTimeUs(segmentNum); - long segmentCount = representationHolder.getSegmentCount(); long secondSyncUs = firstSyncUs < positionUs && (segmentCount == DashSegmentIndex.INDEX_UNBOUNDED @@ -594,7 +597,7 @@ public class DefaultDashChunkSource implements DashChunkSource { } private long getAvailableLiveDurationUs(long nowUnixTimeUs, long playbackPositionUs) { - if (!manifest.dynamic) { + if (!manifest.dynamic || representationHolders[0].getSegmentCount() == 0) { return C.TIME_UNSET; } long lastSegmentNum = representationHolders[0].getLastAvailableSegmentNum(nowUnixTimeUs);