From 9ecf959613b6d1d9f76dd37fdeaf495f77fdf691 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 990ee2c7bf..44ba911eac 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -4,6 +4,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 6922e56b84..8762244558 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 @@ -167,7 +167,9 @@ public final class DashDownloader extends SegmentDownloader