From d6878f152c9af863ad5928df8e90897b902c1540 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 8 Jun 2018 15:03:39 -0700 Subject: [PATCH] Offset SIDX timestamps by presentationTimeOffset ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=199856613 --- RELEASENOTES.md | 2 ++ .../exoplayer2/source/dash/DashWrappingSegmentIndex.java | 9 ++++++--- .../exoplayer2/source/dash/DefaultDashChunkSource.java | 5 ++++- .../exoplayer2/source/dash/offline/DashDownloader.java | 4 +++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7507e8bec4..28011c993c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -28,6 +28,8 @@ * IMA: Don't advertise support for video/mpeg ad media, as we don't have an extractor for this ([#4297](https://github.com/google/ExoPlayer/issues/4297)). +* DASH: Fix playback getting stuck when playing representations that have both + sidx atoms and non-zero presentationTimeOffset values. * Mitigate memory leaks when `MediaSource` loads are slow to cancel ([#4249](https://github.com/google/ExoPlayer/issues/4249)). * Fix inconsistent `Player.EventListener` invocations for recursive player state diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashWrappingSegmentIndex.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashWrappingSegmentIndex.java index 078305a687..3eca7892c4 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashWrappingSegmentIndex.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DashWrappingSegmentIndex.java @@ -25,12 +25,15 @@ import com.google.android.exoplayer2.source.dash.manifest.RangedUri; public final class DashWrappingSegmentIndex implements DashSegmentIndex { private final ChunkIndex chunkIndex; + private final long timeOffsetUs; /** * @param chunkIndex The {@link ChunkIndex} to wrap. + * @param timeOffsetUs An offset to subtract from the times in the wrapped index, in microseconds. */ - public DashWrappingSegmentIndex(ChunkIndex chunkIndex) { + public DashWrappingSegmentIndex(ChunkIndex chunkIndex, long timeOffsetUs) { this.chunkIndex = chunkIndex; + this.timeOffsetUs = timeOffsetUs; } @Override @@ -45,7 +48,7 @@ public final class DashWrappingSegmentIndex implements DashSegmentIndex { @Override public long getTimeUs(long segmentNum) { - return chunkIndex.timesUs[(int) segmentNum]; + return chunkIndex.timesUs[(int) segmentNum] - timeOffsetUs; } @Override @@ -61,7 +64,7 @@ public final class DashWrappingSegmentIndex implements DashSegmentIndex { @Override public long getSegmentNum(long timeUs, long periodDurationUs) { - return chunkIndex.getChunkIndex(timeUs); + return chunkIndex.getChunkIndex(timeUs + timeOffsetUs); } @Override diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java index 4cb14d6614..c00410f57e 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/DefaultDashChunkSource.java @@ -354,7 +354,10 @@ public class DefaultDashChunkSource implements DashChunkSource { if (representationHolder.segmentIndex == null) { SeekMap seekMap = representationHolder.extractorWrapper.getSeekMap(); if (seekMap != null) { - representationHolder.segmentIndex = new DashWrappingSegmentIndex((ChunkIndex) seekMap); + representationHolder.segmentIndex = + new DashWrappingSegmentIndex( + (ChunkIndex) seekMap, + representationHolder.representation.presentationTimeOffsetUs); } } } diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java index 35f57adff0..68120d6177 100644 --- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java +++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/offline/DashDownloader.java @@ -163,7 +163,9 @@ public final class DashDownloader extends SegmentDownloader { return index; } ChunkIndex seekMap = DashUtil.loadChunkIndex(dataSource, trackType, representation); - return seekMap == null ? null : new DashWrappingSegmentIndex(seekMap); + return seekMap == null + ? null + : new DashWrappingSegmentIndex(seekMap, representation.presentationTimeOffsetUs); } }