From 6f62b499c505fbf33bfa15dd3509922166e29611 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Wed, 25 Nov 2015 16:50:30 +0000 Subject: [PATCH] Merge seek/playback positions in ChunkSource interface. --- .../exoplayer/dash/DashChunkSourceTest.java | 6 +++--- .../android/exoplayer/chunk/ChunkSampleSource.java | 3 ++- .../android/exoplayer/chunk/ChunkSource.java | 10 +++++----- .../exoplayer/chunk/SingleSampleChunkSource.java | 4 ++-- .../android/exoplayer/dash/DashChunkSource.java | 14 +++++++------- .../SmoothStreamingChunkSource.java | 8 ++++---- 6 files changed, 23 insertions(+), 22 deletions(-) diff --git a/library/src/androidTest/java/com/google/android/exoplayer/dash/DashChunkSourceTest.java b/library/src/androidTest/java/com/google/android/exoplayer/dash/DashChunkSourceTest.java index 955d10ada5..d1e75b8838 100644 --- a/library/src/androidTest/java/com/google/android/exoplayer/dash/DashChunkSourceTest.java +++ b/library/src/androidTest/java/com/google/android/exoplayer/dash/DashChunkSourceTest.java @@ -128,7 +128,7 @@ public class DashChunkSourceTest extends InstrumentationTestCase { ChunkOperationHolder out = new ChunkOperationHolder(); // request first chunk; should get back initialization chunk - chunkSource.getChunkOperation(queue, 0, 0, out); + chunkSource.getChunkOperation(queue, 0, out); assertNotNull(out.chunk); assertNotNull(((InitializationChunk) out.chunk).dataSpec); @@ -386,7 +386,7 @@ public class DashChunkSourceTest extends InstrumentationTestCase { private static void checkLiveEdgeConsistency(DashChunkSource chunkSource, List queue, ChunkOperationHolder out, long seekPositionMs, long availableRangeStartMs, long availableRangeEndMs, long chunkStartTimeMs, long chunkEndTimeMs) { - chunkSource.getChunkOperation(queue, seekPositionMs * 1000, 0, out); + chunkSource.getChunkOperation(queue, seekPositionMs * 1000, out); TimeRange availableRange = chunkSource.getAvailableRange(); checkAvailableRange(availableRange, availableRangeStartMs * 1000, availableRangeEndMs * 1000); if (chunkStartTimeMs < availableRangeEndMs) { @@ -487,7 +487,7 @@ public class DashChunkSourceTest extends InstrumentationTestCase { // request "eleventh" chunk; this chunk isn't available yet, so we should get null out.chunk = null; - chunkSource.getChunkOperation(queue, seekPositionMs * 1000, 0, out); + chunkSource.getChunkOperation(queue, seekPositionMs * 1000, out); assertNull(out.chunk); } diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java b/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java index 71c5773db1..9235458ade 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSampleSource.java @@ -533,7 +533,8 @@ public class ChunkSampleSource implements SampleSource, SampleSourceReader, Load private void doChunkOperation() { currentLoadableHolder.endOfStream = false; currentLoadableHolder.queueSize = readOnlyMediaChunks.size(); - chunkSource.getChunkOperation(readOnlyMediaChunks, pendingResetPositionUs, downstreamPositionUs, + chunkSource.getChunkOperation(readOnlyMediaChunks, + pendingResetPositionUs != NO_RESET_PENDING ? pendingResetPositionUs : downstreamPositionUs, currentLoadableHolder); loadingFinished = currentLoadableHolder.endOfStream; } diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSource.java b/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSource.java index b90fc5bf15..922025aae2 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/ChunkSource.java @@ -92,9 +92,9 @@ public interface ChunkSource { * This method should only be called when the source is enabled. * * @param queue A representation of the currently buffered {@link MediaChunk}s. - * @param seekPositionUs If the queue is empty, this parameter must specify the seek position. If - * the queue is non-empty then this parameter is ignored. - * @param playbackPositionUs The current playback position. + * @param playbackPositionUs The current playback position. If the queue is empty then this + * parameter is the position from which playback is expected to start (or restart) and hence + * should be interpreted as a seek position. * @param out A holder for the next operation, whose {@link ChunkOperationHolder#endOfStream} is * initially set to false, whose {@link ChunkOperationHolder#queueSize} is initially equal to * the length of the queue, and whose {@link ChunkOperationHolder#chunk} is initially equal to @@ -103,8 +103,8 @@ public interface ChunkSource { * unchanged. Note that leaving the chunk unchanged is both preferred and more efficient than * replacing it with a new but identical chunk. */ - void getChunkOperation(List queue, long seekPositionUs, - long playbackPositionUs, ChunkOperationHolder out); + void getChunkOperation(List queue, long playbackPositionUs, + ChunkOperationHolder out); /** * Invoked when the {@link ChunkSampleSource} has finished loading a chunk obtained from this diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/SingleSampleChunkSource.java b/library/src/main/java/com/google/android/exoplayer/chunk/SingleSampleChunkSource.java index c8662cc12c..12fd645fa9 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/SingleSampleChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/SingleSampleChunkSource.java @@ -80,8 +80,8 @@ public final class SingleSampleChunkSource implements ChunkSource { } @Override - public void getChunkOperation(List queue, long seekPositionUs, - long playbackPositionUs, ChunkOperationHolder out) { + public void getChunkOperation(List queue, long playbackPositionUs, + ChunkOperationHolder out) { if (!queue.isEmpty()) { // We've already provided the single sample. out.endOfStream = true; diff --git a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java index cd388b312a..8c7350e1d5 100644 --- a/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/dash/DashChunkSource.java @@ -346,8 +346,8 @@ public class DashChunkSource implements ChunkSource, Output { } @Override - public final void getChunkOperation(List queue, long seekPositionUs, - long playbackPositionUs, ChunkOperationHolder out) { + public final void getChunkOperation(List queue, long playbackPositionUs, + ChunkOperationHolder out) { if (fatalError != null) { out.chunk = null; return; @@ -389,16 +389,16 @@ public class DashChunkSource implements ChunkSource, Output { if (startAtLiveEdge) { // We want live streams to start at the live edge instead of the beginning of the // manifest - seekPositionUs = Math.max(availableRangeValues[0], + playbackPositionUs = Math.max(availableRangeValues[0], availableRangeValues[1] - liveEdgeLatencyUs); } else { // we subtract 1 from the upper bound because it's exclusive for that bound - seekPositionUs = Math.min(seekPositionUs, availableRangeValues[1] - 1); - seekPositionUs = Math.max(seekPositionUs, availableRangeValues[0]); + playbackPositionUs = Math.min(playbackPositionUs, availableRangeValues[1] - 1); + playbackPositionUs = Math.max(playbackPositionUs, availableRangeValues[0]); } } - periodHolder = findPeriodHolder(seekPositionUs); + periodHolder = findPeriodHolder(playbackPositionUs); startingNewPeriod = true; } else { if (startAtLiveEdge) { @@ -476,7 +476,7 @@ public class DashChunkSource implements ChunkSource, Output { return; } - int segmentNum = queue.isEmpty() ? representationHolder.getSegmentNum(seekPositionUs) + int segmentNum = queue.isEmpty() ? representationHolder.getSegmentNum(playbackPositionUs) : startingNewPeriod ? representationHolder.getFirstAvailableSegmentNum() : queue.get(out.queueSize - 1).chunkIndex + 1; Chunk nextMediaChunk = newMediaChunk(periodHolder, representationHolder, dataSource, diff --git a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java index 8f83a817ac..79405466f6 100644 --- a/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/smoothstreaming/SmoothStreamingChunkSource.java @@ -236,8 +236,8 @@ public class SmoothStreamingChunkSource implements ChunkSource, } @Override - public final void getChunkOperation(List queue, long seekPositionUs, - long playbackPositionUs, ChunkOperationHolder out) { + public final void getChunkOperation(List queue, long playbackPositionUs, + ChunkOperationHolder out) { if (fatalError != null) { out.chunk = null; return; @@ -281,9 +281,9 @@ public class SmoothStreamingChunkSource implements ChunkSource, int chunkIndex; if (queue.isEmpty()) { if (live) { - seekPositionUs = getLiveSeekPosition(currentManifest, liveEdgeLatencyUs); + playbackPositionUs = getLiveSeekPosition(currentManifest, liveEdgeLatencyUs); } - chunkIndex = streamElement.getChunkIndex(seekPositionUs); + chunkIndex = streamElement.getChunkIndex(playbackPositionUs); } else { MediaChunk previous = queue.get(out.queueSize - 1); chunkIndex = previous.chunkIndex + 1 - currentManifestChunkOffset;