From 6b03d4bc40827096fc3b2af8bf620a491399d346 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Thu, 23 Jan 2020 10:16:43 +0000 Subject: [PATCH] Make resolveSeekPositionUs an instance method PiperOrigin-RevId: 291125686 --- .../android/exoplayer2/SeekParameters.java | 36 +++++++++++++++++ .../source/ProgressiveMediaPeriod.java | 4 +- .../google/android/exoplayer2/util/Util.java | 39 ------------------- .../source/dash/DefaultDashChunkSource.java | 2 +- .../smoothstreaming/DefaultSsChunkSource.java | 3 +- .../exoplayer2/testutil/FakeChunkSource.java | 3 +- 6 files changed, 41 insertions(+), 46 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SeekParameters.java b/library/core/src/main/java/com/google/android/exoplayer2/SeekParameters.java index 7a0ad67a28..7b31896c2d 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SeekParameters.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SeekParameters.java @@ -17,6 +17,7 @@ package com.google.android.exoplayer2; import androidx.annotation.Nullable; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.Util; /** * Parameters that apply to seeking. @@ -71,6 +72,41 @@ public final class SeekParameters { this.toleranceAfterUs = toleranceAfterUs; } + /** + * Resolves a seek based on the parameters, given the requested seek position and two candidate + * sync points. + * + * @param positionUs The requested seek position, in microseocnds. + * @param firstSyncUs The first candidate seek point, in micrseconds. + * @param secondSyncUs The second candidate seek point, in microseconds. May equal {@code + * firstSyncUs} if there's only one candidate. + * @return The resolved seek position, in microseconds. + */ + public long resolveSeekPositionUs(long positionUs, long firstSyncUs, long secondSyncUs) { + if (toleranceBeforeUs == 0 && toleranceAfterUs == 0) { + return positionUs; + } + long minPositionUs = + Util.subtractWithOverflowDefault(positionUs, toleranceBeforeUs, Long.MIN_VALUE); + long maxPositionUs = Util.addWithOverflowDefault(positionUs, toleranceAfterUs, Long.MAX_VALUE); + boolean firstSyncPositionValid = minPositionUs <= firstSyncUs && firstSyncUs <= maxPositionUs; + boolean secondSyncPositionValid = + minPositionUs <= secondSyncUs && secondSyncUs <= maxPositionUs; + if (firstSyncPositionValid && secondSyncPositionValid) { + if (Math.abs(firstSyncUs - positionUs) <= Math.abs(secondSyncUs - positionUs)) { + return firstSyncUs; + } else { + return secondSyncUs; + } + } else if (firstSyncPositionValid) { + return firstSyncUs; + } else if (secondSyncPositionValid) { + return secondSyncUs; + } else { + return minPositionUs; + } + } + @Override public boolean equals(@Nullable Object obj) { if (this == obj) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java index 97b6add251..688c30afbf 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ProgressiveMediaPeriod.java @@ -446,8 +446,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; return 0; } SeekPoints seekPoints = seekMap.getSeekPoints(positionUs); - return Util.resolveSeekPositionUs( - positionUs, seekParameters, seekPoints.first.timeUs, seekPoints.second.timeUs); + return seekParameters.resolveSeekPositionUs( + positionUs, seekPoints.first.timeUs, seekPoints.second.timeUs); } // SampleStream methods. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/Util.java b/library/core/src/main/java/com/google/android/exoplayer2/util/Util.java index a9a74cdfbb..2f1046c2c1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/Util.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/Util.java @@ -51,7 +51,6 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ExoPlayerLibraryInfo; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; -import com.google.android.exoplayer2.SeekParameters; import com.google.android.exoplayer2.upstream.DataSource; import java.io.ByteArrayOutputStream; import java.io.Closeable; @@ -1140,44 +1139,6 @@ public final class Util { return Math.round((double) mediaDuration / speed); } - /** - * Resolves a seek given the requested seek position, a {@link SeekParameters} and two candidate - * sync points. - * - * @param positionUs The requested seek position, in microseocnds. - * @param seekParameters The {@link SeekParameters}. - * @param firstSyncUs The first candidate seek point, in micrseconds. - * @param secondSyncUs The second candidate seek point, in microseconds. May equal {@code - * firstSyncUs} if there's only one candidate. - * @return The resolved seek position, in microseconds. - */ - public static long resolveSeekPositionUs( - long positionUs, SeekParameters seekParameters, long firstSyncUs, long secondSyncUs) { - if (SeekParameters.EXACT.equals(seekParameters)) { - return positionUs; - } - long minPositionUs = - subtractWithOverflowDefault(positionUs, seekParameters.toleranceBeforeUs, Long.MIN_VALUE); - long maxPositionUs = - addWithOverflowDefault(positionUs, seekParameters.toleranceAfterUs, Long.MAX_VALUE); - boolean firstSyncPositionValid = minPositionUs <= firstSyncUs && firstSyncUs <= maxPositionUs; - boolean secondSyncPositionValid = - minPositionUs <= secondSyncUs && secondSyncUs <= maxPositionUs; - if (firstSyncPositionValid && secondSyncPositionValid) { - if (Math.abs(firstSyncUs - positionUs) <= Math.abs(secondSyncUs - positionUs)) { - return firstSyncUs; - } else { - return secondSyncUs; - } - } else if (firstSyncPositionValid) { - return firstSyncUs; - } else if (secondSyncPositionValid) { - return secondSyncUs; - } else { - return minPositionUs; - } - } - /** * Converts a list of integers to a primitive array. * 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 340c5b9b64..c4a05113a4 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 @@ -198,7 +198,7 @@ public class DefaultDashChunkSource implements DashChunkSource { firstSyncUs < positionUs && segmentNum < representationHolder.getSegmentCount() - 1 ? representationHolder.getSegmentStartTimeUs(segmentNum + 1) : firstSyncUs; - return Util.resolveSeekPositionUs(positionUs, seekParameters, firstSyncUs, secondSyncUs); + return seekParameters.resolveSeekPositionUs(positionUs, firstSyncUs, secondSyncUs); } } // We don't have a segment index to adjust the seek position with yet. diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java index 22dfb04f13..ec4616a71e 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java @@ -38,7 +38,6 @@ import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.LoaderErrorThrower; import com.google.android.exoplayer2.upstream.TransferListener; -import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.List; @@ -129,7 +128,7 @@ public class DefaultSsChunkSource implements SsChunkSource { firstSyncUs < positionUs && chunkIndex < streamElement.chunkCount - 1 ? streamElement.getStartTimeUs(chunkIndex + 1) : firstSyncUs; - return Util.resolveSeekPositionUs(positionUs, seekParameters, firstSyncUs, secondSyncUs); + return seekParameters.resolveSeekPositionUs(positionUs, firstSyncUs, secondSyncUs); } @Override diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeChunkSource.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeChunkSource.java index 54c700933a..aab221c8af 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeChunkSource.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeChunkSource.java @@ -32,7 +32,6 @@ import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.MimeTypes; -import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.util.List; @@ -90,7 +89,7 @@ public final class FakeChunkSource implements ChunkSource { firstSyncUs < positionUs && chunkIndex < dataSet.getChunkCount() - 1 ? dataSet.getStartTime(chunkIndex + 1) : firstSyncUs; - return Util.resolveSeekPositionUs(positionUs, seekParameters, firstSyncUs, secondSyncUs); + return seekParameters.resolveSeekPositionUs(positionUs, firstSyncUs, secondSyncUs); } @Override