From 788132b9dc9f5dd9aa46f413b16f43433c9c7702 Mon Sep 17 00:00:00 2001 From: tonihei Date: Tue, 7 Mar 2023 15:05:20 +0000 Subject: [PATCH] Make DefaultDashChunkSource more robust against empty segment timelines Segment timelines are technically allowed to be empty, but not all places add the necessary checks. Issue: google/ExoPlayer#11014 PiperOrigin-RevId: 514722205 --- RELEASENOTES.md | 3 +++ .../media3/exoplayer/dash/DefaultDashChunkSource.java | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) 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);