diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkSampleStream.java b/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkSampleStream.java index f327564e90..39963426b6 100644 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkSampleStream.java +++ b/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkSampleStream.java @@ -19,10 +19,14 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DecoderInputBuffer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; -import com.google.android.exoplayer2.SequenceableLoader; import com.google.android.exoplayer2.extractor.DefaultTrackOutput; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.SampleStream; +import com.google.android.exoplayer2.source.SequenceableLoader; +import com.google.android.exoplayer2.source.chunk.BaseMediaChunk; +import com.google.android.exoplayer2.source.chunk.Chunk; +import com.google.android.exoplayer2.source.chunk.ChunkHolder; +import com.google.android.exoplayer2.source.chunk.ChunkSource; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.util.Assertions; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/AdaptiveMediaSourceEventListener.java b/library/src/main/java/com/google/android/exoplayer2/source/AdaptiveMediaSourceEventListener.java index a1d17b35c4..96aa4e692c 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/AdaptiveMediaSourceEventListener.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/AdaptiveMediaSourceEventListener.java @@ -17,7 +17,7 @@ package com.google.android.exoplayer2.source; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.chunk.FormatEvaluator; +import com.google.android.exoplayer2.source.chunk.FormatEvaluator; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.Assertions; diff --git a/library/src/main/java/com/google/android/exoplayer2/BehindLiveWindowException.java b/library/src/main/java/com/google/android/exoplayer2/source/BehindLiveWindowException.java similarity index 94% rename from library/src/main/java/com/google/android/exoplayer2/BehindLiveWindowException.java rename to library/src/main/java/com/google/android/exoplayer2/source/BehindLiveWindowException.java index 45938730ed..8e0441dfcf 100644 --- a/library/src/main/java/com/google/android/exoplayer2/BehindLiveWindowException.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/BehindLiveWindowException.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2; +package com.google.android.exoplayer2.source; import java.io.IOException; diff --git a/library/src/main/java/com/google/android/exoplayer2/CompositeSequenceableLoader.java b/library/src/main/java/com/google/android/exoplayer2/source/CompositeSequenceableLoader.java similarity index 95% rename from library/src/main/java/com/google/android/exoplayer2/CompositeSequenceableLoader.java rename to library/src/main/java/com/google/android/exoplayer2/source/CompositeSequenceableLoader.java index 3be4f065dd..140e63c144 100644 --- a/library/src/main/java/com/google/android/exoplayer2/CompositeSequenceableLoader.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/CompositeSequenceableLoader.java @@ -13,7 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2; +package com.google.android.exoplayer2.source; + +import com.google.android.exoplayer2.C; /** * A {@link SequenceableLoader} that encapsulates multiple other {@link SequenceableLoader}s. diff --git a/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java index 7e058e40aa..2765821b1c 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/ExtractorMediaSource.java @@ -20,7 +20,6 @@ import com.google.android.exoplayer2.DecoderInputBuffer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; import com.google.android.exoplayer2.ParserException; -import com.google.android.exoplayer2.SequenceableLoader; import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.extractor.DefaultExtractorInput; import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java index 131094c774..1e4dc95d1f 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/MediaPeriod.java @@ -16,7 +16,6 @@ package com.google.android.exoplayer2.source; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.SequenceableLoader; import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.upstream.Allocator; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java index 9a9b598a12..f48fa708fd 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/MergingMediaPeriod.java @@ -16,8 +16,6 @@ package com.google.android.exoplayer2.source; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.CompositeSequenceableLoader; -import com.google.android.exoplayer2.SequenceableLoader; import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.upstream.Allocator; diff --git a/library/src/main/java/com/google/android/exoplayer2/SequenceableLoader.java b/library/src/main/java/com/google/android/exoplayer2/source/SequenceableLoader.java similarity index 94% rename from library/src/main/java/com/google/android/exoplayer2/SequenceableLoader.java rename to library/src/main/java/com/google/android/exoplayer2/source/SequenceableLoader.java index 8b9d663eb9..f1caf6931e 100644 --- a/library/src/main/java/com/google/android/exoplayer2/SequenceableLoader.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/SequenceableLoader.java @@ -13,7 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2; +package com.google.android.exoplayer2.source; + +import com.google.android.exoplayer2.C; /** * An loader that can proceed in approximate synchronization with other loaders. diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/BaseMediaChunk.java b/library/src/main/java/com/google/android/exoplayer2/source/chunk/BaseMediaChunk.java similarity index 98% rename from library/src/main/java/com/google/android/exoplayer2/chunk/BaseMediaChunk.java rename to library/src/main/java/com/google/android/exoplayer2/source/chunk/BaseMediaChunk.java index 993b6fe12f..6073952dfe 100644 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/BaseMediaChunk.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/chunk/BaseMediaChunk.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.chunk; +package com.google.android.exoplayer2.source.chunk; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.extractor.DefaultTrackOutput; diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/Chunk.java b/library/src/main/java/com/google/android/exoplayer2/source/chunk/Chunk.java similarity index 98% rename from library/src/main/java/com/google/android/exoplayer2/chunk/Chunk.java rename to library/src/main/java/com/google/android/exoplayer2/source/chunk/Chunk.java index d4b749f896..9e9f153cd9 100644 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/Chunk.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/chunk/Chunk.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.chunk; +package com.google.android.exoplayer2.source.chunk; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkExtractorWrapper.java b/library/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkExtractorWrapper.java similarity index 98% rename from library/src/main/java/com/google/android/exoplayer2/chunk/ChunkExtractorWrapper.java rename to library/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkExtractorWrapper.java index d19e039d79..fdb520e0bb 100644 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkExtractorWrapper.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkExtractorWrapper.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.chunk; +package com.google.android.exoplayer2.source.chunk; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.drm.DrmInitData; diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkHolder.java b/library/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkHolder.java similarity index 95% rename from library/src/main/java/com/google/android/exoplayer2/chunk/ChunkHolder.java rename to library/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkHolder.java index d07469ae0e..6b7f5688ae 100644 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkHolder.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkHolder.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.chunk; +package com.google.android.exoplayer2.source.chunk; /** * Holds a chunk or an indication that the end of the stream has been reached. diff --git a/library/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java b/library/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java new file mode 100644 index 0000000000..b3744fc879 --- /dev/null +++ b/library/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSampleStream.java @@ -0,0 +1,341 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.android.exoplayer2.source.chunk; + +import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.DecoderInputBuffer; +import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.FormatHolder; +import com.google.android.exoplayer2.extractor.DefaultTrackOutput; +import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; +import com.google.android.exoplayer2.source.SampleStream; +import com.google.android.exoplayer2.source.SequenceableLoader; +import com.google.android.exoplayer2.upstream.Allocator; +import com.google.android.exoplayer2.upstream.Loader; +import com.google.android.exoplayer2.util.Assertions; + +import java.io.IOException; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +/** + * A {@link SampleStream} that loads media in {@link Chunk}s, obtained from a {@link ChunkSource}. + */ +public class ChunkSampleStream implements SampleStream, SequenceableLoader, + Loader.Callback { + + private final int trackType; + private final T chunkSource; + private final SequenceableLoader.Callback> callback; + private final EventDispatcher eventDispatcher; + private final int minLoadableRetryCount; + private final LinkedList mediaChunks; + private final List readOnlyMediaChunks; + private final DefaultTrackOutput sampleQueue; + private final ChunkHolder nextChunkHolder; + private final Loader loader; + + private Format downstreamFormat; + + private long lastSeekPositionUs; + private long pendingResetPositionUs; + + private boolean loadingFinished; + + /** + * @param trackType The type of the track. One of the {@link C} {@code TRACK_TYPE_*} constants. + * @param chunkSource A {@link ChunkSource} from which chunks to load are obtained. + * @param callback An {@link Callback} for the stream. + * @param allocator An {@link Allocator} from which allocations can be obtained. + * @param positionUs The position from which to start loading media. + * @param minLoadableRetryCount The minimum number of times that the source should retry a load + * before propagating an error. + * @param eventDispatcher A dispatcher to notify of events. + */ + public ChunkSampleStream(int trackType, T chunkSource, + SequenceableLoader.Callback> callback, Allocator allocator, + long positionUs, int minLoadableRetryCount, EventDispatcher eventDispatcher) { + this.trackType = trackType; + this.chunkSource = chunkSource; + this.callback = callback; + this.eventDispatcher = eventDispatcher; + this.minLoadableRetryCount = minLoadableRetryCount; + loader = new Loader("Loader:ChunkSampleStream"); + nextChunkHolder = new ChunkHolder(); + mediaChunks = new LinkedList<>(); + readOnlyMediaChunks = Collections.unmodifiableList(mediaChunks); + sampleQueue = new DefaultTrackOutput(allocator); + pendingResetPositionUs = C.UNSET_TIME_US; + lastSeekPositionUs = positionUs; + pendingResetPositionUs = positionUs; + } + + /** + * Returns the {@link ChunkSource} used by this stream. + * + * @return The {@link ChunkSource}. + */ + public T getChunkSource() { + return chunkSource; + } + + /** + * Returns an estimate of the position up to which data is buffered. + * + * @return An estimate of the absolute position in microseconds up to which data is buffered, or + * {@link C#END_OF_SOURCE_US} if the track is fully buffered. + */ + public long getBufferedPositionUs() { + if (loadingFinished) { + return C.END_OF_SOURCE_US; + } else if (isPendingReset()) { + return pendingResetPositionUs; + } else { + long bufferedPositionUs = lastSeekPositionUs; + BaseMediaChunk lastMediaChunk = mediaChunks.getLast(); + BaseMediaChunk lastCompletedMediaChunk = lastMediaChunk.isLoadCompleted() ? lastMediaChunk + : mediaChunks.size() > 1 ? mediaChunks.get(mediaChunks.size() - 2) : null; + if (lastCompletedMediaChunk != null) { + bufferedPositionUs = Math.max(bufferedPositionUs, lastCompletedMediaChunk.endTimeUs); + } + return Math.max(bufferedPositionUs, sampleQueue.getLargestQueuedTimestampUs()); + } + } + + /** + * Seeks to the specified position in microseconds. + * + * @param positionUs The seek position in microseconds. + */ + public void seekToUs(long positionUs) { + lastSeekPositionUs = positionUs; + // If we're not pending a reset, see if we can seek within the sample queue. + boolean seekInsideBuffer = !isPendingReset() && sampleQueue.skipToKeyframeBefore(positionUs); + if (seekInsideBuffer) { + // We succeeded. All we need to do is discard any chunks that we've moved past. + while (mediaChunks.size() > 1 + && mediaChunks.get(1).getFirstSampleIndex() <= sampleQueue.getReadIndex()) { + mediaChunks.removeFirst(); + } + } else { + // We failed, and need to restart. + pendingResetPositionUs = positionUs; + loadingFinished = false; + mediaChunks.clear(); + if (loader.isLoading()) { + loader.cancelLoading(); + } else { + sampleQueue.reset(true); + } + } + } + + /** + * Releases the stream. + *

+ * This method should be called when the stream is no longer required. + */ + public void release() { + chunkSource.release(); + sampleQueue.disable(); + loader.release(); + } + + // SampleStream implementation. + + @Override + public boolean isReady() { + return loadingFinished || (!isPendingReset() && !sampleQueue.isEmpty()); + } + + @Override + public void maybeThrowError() throws IOException { + loader.maybeThrowError(); + if (!loader.isLoading()) { + chunkSource.maybeThrowError(); + } + } + + @Override + public int readData(FormatHolder formatHolder, DecoderInputBuffer buffer) { + if (isPendingReset()) { + return C.RESULT_NOTHING_READ; + } + + while (mediaChunks.size() > 1 + && mediaChunks.get(1).getFirstSampleIndex() <= sampleQueue.getReadIndex()) { + mediaChunks.removeFirst(); + } + BaseMediaChunk currentChunk = mediaChunks.getFirst(); + + Format format = currentChunk.format; + if (!format.equals(downstreamFormat)) { + eventDispatcher.downstreamFormatChanged(trackType, format, + currentChunk.formatEvaluatorTrigger, currentChunk.formatEvaluatorData, + currentChunk.startTimeUs); + } + downstreamFormat = format; + + return sampleQueue.readData(formatHolder, buffer, loadingFinished, lastSeekPositionUs); + } + + // Loader.Callback implementation. + + @Override + public void onLoadCompleted(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs) { + chunkSource.onChunkLoadCompleted(loadable); + eventDispatcher.loadCompleted(loadable.dataSpec, loadable.type, trackType, loadable.format, + loadable.formatEvaluatorTrigger, loadable.formatEvaluatorData, loadable.startTimeUs, + loadable.endTimeUs, elapsedRealtimeMs, loadDurationMs, loadable.bytesLoaded()); + callback.onContinueLoadingRequested(this); + } + + @Override + public void onLoadCanceled(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, + boolean released) { + eventDispatcher.loadCanceled(loadable.dataSpec, loadable.type, trackType, loadable.format, + loadable.formatEvaluatorTrigger, loadable.formatEvaluatorData, loadable.startTimeUs, + loadable.endTimeUs, elapsedRealtimeMs, loadDurationMs, loadable.bytesLoaded()); + if (!released) { + sampleQueue.reset(true); + callback.onContinueLoadingRequested(this); + } + } + + @Override + public int onLoadError(Chunk loadable, long elapsedRealtimeMs, long loadDurationMs, + IOException error) { + long bytesLoaded = loadable.bytesLoaded(); + boolean isMediaChunk = isMediaChunk(loadable); + boolean cancelable = !isMediaChunk || bytesLoaded == 0 || mediaChunks.size() > 1; + boolean canceled = false; + if (chunkSource.onChunkLoadError(loadable, cancelable, error)) { + canceled = true; + if (isMediaChunk) { + BaseMediaChunk removed = mediaChunks.removeLast(); + Assertions.checkState(removed == loadable); + sampleQueue.discardUpstreamSamples(removed.getFirstSampleIndex()); + if (mediaChunks.isEmpty()) { + pendingResetPositionUs = lastSeekPositionUs; + } + } + } + eventDispatcher.loadError(loadable.dataSpec, loadable.type, trackType, loadable.format, + loadable.formatEvaluatorTrigger, loadable.formatEvaluatorData, loadable.startTimeUs, + loadable.endTimeUs, elapsedRealtimeMs, loadDurationMs, bytesLoaded, error, + canceled); + if (canceled) { + callback.onContinueLoadingRequested(this); + return Loader.DONT_RETRY; + } else { + return Loader.RETRY; + } + } + + // SequenceableLoader implementation + + @Override + public boolean continueLoading(long positionUs) { + if (loader.isLoading()) { + return false; + } + + chunkSource.getNextChunk(mediaChunks.isEmpty() ? null : mediaChunks.getLast(), + pendingResetPositionUs != C.UNSET_TIME_US ? pendingResetPositionUs : positionUs, + nextChunkHolder); + boolean endOfStream = nextChunkHolder.endOfStream; + Chunk loadable = nextChunkHolder.chunk; + nextChunkHolder.clear(); + + if (endOfStream) { + loadingFinished = true; + return true; + } + + if (loadable == null) { + return false; + } + + if (isMediaChunk(loadable)) { + pendingResetPositionUs = C.UNSET_TIME_US; + BaseMediaChunk mediaChunk = (BaseMediaChunk) loadable; + mediaChunk.init(sampleQueue); + mediaChunks.add(mediaChunk); + } + long elapsedRealtimeMs = loader.startLoading(loadable, this, minLoadableRetryCount); + eventDispatcher.loadStarted(loadable.dataSpec, loadable.type, trackType, loadable.format, + loadable.formatEvaluatorTrigger, loadable.formatEvaluatorData, loadable.startTimeUs, + loadable.endTimeUs, elapsedRealtimeMs); + return true; + } + + @Override + public long getNextLoadPositionUs() { + if (isPendingReset()) { + return pendingResetPositionUs; + } else { + return loadingFinished ? C.END_OF_SOURCE_US : mediaChunks.getLast().endTimeUs; + } + } + + // Internal methods + + // TODO[REFACTOR]: Call maybeDiscardUpstream for DASH and SmoothStreaming. + /** + * Discards media chunks from the back of the buffer if conditions have changed such that it's + * preferable to re-buffer the media at a different quality. + * + * @param positionUs The current playback position in microseconds. + */ + private void maybeDiscardUpstream(long positionUs) { + int queueSize = chunkSource.getPreferredQueueSize(positionUs, readOnlyMediaChunks); + discardUpstreamMediaChunks(Math.max(1, queueSize)); + } + + private boolean isMediaChunk(Chunk chunk) { + return chunk instanceof BaseMediaChunk; + } + + private boolean isPendingReset() { + return pendingResetPositionUs != C.UNSET_TIME_US; + } + + /** + * Discard upstream media chunks until the queue length is equal to the length specified. + * + * @param queueLength The desired length of the queue. + * @return True if chunks were discarded. False otherwise. + */ + private boolean discardUpstreamMediaChunks(int queueLength) { + if (mediaChunks.size() <= queueLength) { + return false; + } + long startTimeUs = 0; + long endTimeUs = mediaChunks.getLast().endTimeUs; + + BaseMediaChunk removed = null; + while (mediaChunks.size() > queueLength) { + removed = mediaChunks.removeLast(); + startTimeUs = removed.startTimeUs; + loadingFinished = false; + } + sampleQueue.discardUpstreamSamples(removed.getFirstSampleIndex()); + eventDispatcher.upstreamDiscarded(trackType, startTimeUs, endTimeUs); + return true; + } + +} diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkSource.java b/library/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSource.java similarity index 98% rename from library/src/main/java/com/google/android/exoplayer2/chunk/ChunkSource.java rename to library/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSource.java index f44348e612..e36400c492 100644 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/ChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/chunk/ChunkSource.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.chunk; +package com.google.android.exoplayer2.source.chunk; import java.io.IOException; import java.util.List; diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/ContainerMediaChunk.java b/library/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java similarity index 96% rename from library/src/main/java/com/google/android/exoplayer2/chunk/ContainerMediaChunk.java rename to library/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java index 7ac2baaa2b..00da17337b 100644 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/ContainerMediaChunk.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/chunk/ContainerMediaChunk.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.chunk; +package com.google.android.exoplayer2.source.chunk; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.chunk.ChunkExtractorWrapper.SingleTrackMetadataOutput; import com.google.android.exoplayer2.extractor.DefaultExtractorInput; import com.google.android.exoplayer2.extractor.DefaultTrackOutput; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.SeekMap; +import com.google.android.exoplayer2.source.chunk.ChunkExtractorWrapper.SingleTrackMetadataOutput; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.Util; diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/DataChunk.java b/library/src/main/java/com/google/android/exoplayer2/source/chunk/DataChunk.java similarity index 98% rename from library/src/main/java/com/google/android/exoplayer2/chunk/DataChunk.java rename to library/src/main/java/com/google/android/exoplayer2/source/chunk/DataChunk.java index 1fe3bc0eae..a1c576bce4 100644 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/DataChunk.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/chunk/DataChunk.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.chunk; +package com.google.android.exoplayer2.source.chunk; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/FormatEvaluator.java b/library/src/main/java/com/google/android/exoplayer2/source/chunk/FormatEvaluator.java similarity index 99% rename from library/src/main/java/com/google/android/exoplayer2/chunk/FormatEvaluator.java rename to library/src/main/java/com/google/android/exoplayer2/source/chunk/FormatEvaluator.java index 2aa2277be6..9e4f2497c4 100644 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/FormatEvaluator.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/chunk/FormatEvaluator.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.chunk; +package com.google.android.exoplayer2.source.chunk; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.upstream.BandwidthMeter; diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/InitializationChunk.java b/library/src/main/java/com/google/android/exoplayer2/source/chunk/InitializationChunk.java similarity index 97% rename from library/src/main/java/com/google/android/exoplayer2/chunk/InitializationChunk.java rename to library/src/main/java/com/google/android/exoplayer2/source/chunk/InitializationChunk.java index b207f4a511..3bc2921f87 100644 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/InitializationChunk.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/chunk/InitializationChunk.java @@ -13,16 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.chunk; +package com.google.android.exoplayer2.source.chunk; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.chunk.ChunkExtractorWrapper.SingleTrackMetadataOutput; import com.google.android.exoplayer2.extractor.DefaultExtractorInput; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.extractor.TrackOutput; +import com.google.android.exoplayer2.source.chunk.ChunkExtractorWrapper.SingleTrackMetadataOutput; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.ParsableByteArray; diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/MediaChunk.java b/library/src/main/java/com/google/android/exoplayer2/source/chunk/MediaChunk.java similarity index 97% rename from library/src/main/java/com/google/android/exoplayer2/chunk/MediaChunk.java rename to library/src/main/java/com/google/android/exoplayer2/source/chunk/MediaChunk.java index cbde6def15..fc608bd18d 100644 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/MediaChunk.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/chunk/MediaChunk.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.chunk; +package com.google.android.exoplayer2.source.chunk; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; diff --git a/library/src/main/java/com/google/android/exoplayer2/chunk/SingleSampleMediaChunk.java b/library/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java similarity index 98% rename from library/src/main/java/com/google/android/exoplayer2/chunk/SingleSampleMediaChunk.java rename to library/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java index 1525b216e7..c25544bff3 100644 --- a/library/src/main/java/com/google/android/exoplayer2/chunk/SingleSampleMediaChunk.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/chunk/SingleSampleMediaChunk.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer2.chunk; +package com.google.android.exoplayer2.source.chunk; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/dash/DashChunkSource.java b/library/src/main/java/com/google/android/exoplayer2/source/dash/DashChunkSource.java index 900769bf2d..b35fe8c064 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/dash/DashChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/dash/DashChunkSource.java @@ -15,25 +15,25 @@ */ package com.google.android.exoplayer2.source.dash; -import com.google.android.exoplayer2.BehindLiveWindowException; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format.DecreasingBandwidthComparator; -import com.google.android.exoplayer2.chunk.Chunk; -import com.google.android.exoplayer2.chunk.ChunkExtractorWrapper; -import com.google.android.exoplayer2.chunk.ChunkHolder; -import com.google.android.exoplayer2.chunk.ChunkSource; -import com.google.android.exoplayer2.chunk.ContainerMediaChunk; -import com.google.android.exoplayer2.chunk.FormatEvaluator; -import com.google.android.exoplayer2.chunk.FormatEvaluator.Evaluation; -import com.google.android.exoplayer2.chunk.InitializationChunk; -import com.google.android.exoplayer2.chunk.MediaChunk; -import com.google.android.exoplayer2.chunk.SingleSampleMediaChunk; import com.google.android.exoplayer2.extractor.ChunkIndex; import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.extractor.mkv.MatroskaExtractor; import com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor; +import com.google.android.exoplayer2.source.BehindLiveWindowException; import com.google.android.exoplayer2.source.TrackGroup; +import com.google.android.exoplayer2.source.chunk.Chunk; +import com.google.android.exoplayer2.source.chunk.ChunkExtractorWrapper; +import com.google.android.exoplayer2.source.chunk.ChunkHolder; +import com.google.android.exoplayer2.source.chunk.ChunkSource; +import com.google.android.exoplayer2.source.chunk.ContainerMediaChunk; +import com.google.android.exoplayer2.source.chunk.FormatEvaluator; +import com.google.android.exoplayer2.source.chunk.FormatEvaluator.Evaluation; +import com.google.android.exoplayer2.source.chunk.InitializationChunk; +import com.google.android.exoplayer2.source.chunk.MediaChunk; +import com.google.android.exoplayer2.source.chunk.SingleSampleMediaChunk; import com.google.android.exoplayer2.source.dash.mpd.AdaptationSet; import com.google.android.exoplayer2.source.dash.mpd.MediaPresentationDescription; import com.google.android.exoplayer2.source.dash.mpd.Period; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java index e6ae55555e..cf267ac585 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/dash/DashMediaSource.java @@ -16,21 +16,21 @@ package com.google.android.exoplayer2.source.dash; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.CompositeSequenceableLoader; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; -import com.google.android.exoplayer2.SequenceableLoader; import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.chunk.ChunkSampleStream; -import com.google.android.exoplayer2.chunk.FormatEvaluator; -import com.google.android.exoplayer2.chunk.FormatEvaluator.AdaptiveEvaluator; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; +import com.google.android.exoplayer2.source.CompositeSequenceableLoader; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.SampleStream; +import com.google.android.exoplayer2.source.SequenceableLoader; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.chunk.FormatEvaluator; +import com.google.android.exoplayer2.source.chunk.FormatEvaluator.AdaptiveEvaluator; import com.google.android.exoplayer2.source.dash.mpd.AdaptationSet; import com.google.android.exoplayer2.source.dash.mpd.MediaPresentationDescription; import com.google.android.exoplayer2.source.dash.mpd.MediaPresentationDescriptionParser; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java index d19a211f02..2f25e8a9bc 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java @@ -15,19 +15,19 @@ */ package com.google.android.exoplayer2.source.hls; -import com.google.android.exoplayer2.BehindLiveWindowException; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.chunk.Chunk; -import com.google.android.exoplayer2.chunk.ChunkHolder; -import com.google.android.exoplayer2.chunk.DataChunk; -import com.google.android.exoplayer2.chunk.FormatEvaluator; -import com.google.android.exoplayer2.chunk.FormatEvaluator.Evaluation; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.mp3.Mp3Extractor; import com.google.android.exoplayer2.extractor.ts.AdtsExtractor; import com.google.android.exoplayer2.extractor.ts.PtsTimestampAdjuster; import com.google.android.exoplayer2.extractor.ts.TsExtractor; +import com.google.android.exoplayer2.source.BehindLiveWindowException; +import com.google.android.exoplayer2.source.chunk.Chunk; +import com.google.android.exoplayer2.source.chunk.ChunkHolder; +import com.google.android.exoplayer2.source.chunk.DataChunk; +import com.google.android.exoplayer2.source.chunk.FormatEvaluator; +import com.google.android.exoplayer2.source.chunk.FormatEvaluator.Evaluation; import com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist; import com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParser; import com.google.android.exoplayer2.source.hls.playlist.Variant; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java index 83a5da50f5..96d11bf9f6 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java @@ -16,10 +16,10 @@ package com.google.android.exoplayer2.source.hls; import com.google.android.exoplayer2.Format; -import com.google.android.exoplayer2.chunk.MediaChunk; import com.google.android.exoplayer2.extractor.DefaultExtractorInput; import com.google.android.exoplayer2.extractor.Extractor; import com.google.android.exoplayer2.extractor.ExtractorInput; +import com.google.android.exoplayer2.source.chunk.MediaChunk; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.Util; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java index 3235753089..08048a358a 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaSource.java @@ -16,18 +16,18 @@ package com.google.android.exoplayer2.source.hls; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.CompositeSequenceableLoader; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; import com.google.android.exoplayer2.TrackSelection; -import com.google.android.exoplayer2.chunk.FormatEvaluator; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; +import com.google.android.exoplayer2.source.CompositeSequenceableLoader; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.SampleStream; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.chunk.FormatEvaluator; import com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist; import com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist; import com.google.android.exoplayer2.source.hls.playlist.HlsPlaylist; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java index 03edf40ce0..7b758a4cc0 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsSampleStreamWrapper.java @@ -19,18 +19,18 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DecoderInputBuffer; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.FormatHolder; -import com.google.android.exoplayer2.SequenceableLoader; import com.google.android.exoplayer2.TrackSelection; -import com.google.android.exoplayer2.chunk.Chunk; -import com.google.android.exoplayer2.chunk.ChunkHolder; import com.google.android.exoplayer2.extractor.DefaultTrackOutput; import com.google.android.exoplayer2.extractor.DefaultTrackOutput.UpstreamFormatChangedListener; import com.google.android.exoplayer2.extractor.ExtractorOutput; import com.google.android.exoplayer2.extractor.SeekMap; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; import com.google.android.exoplayer2.source.SampleStream; +import com.google.android.exoplayer2.source.SequenceableLoader; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.chunk.Chunk; +import com.google.android.exoplayer2.source.chunk.ChunkHolder; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.Loader; import com.google.android.exoplayer2.util.Assertions; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingChunkSource.java b/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingChunkSource.java index 211d345fdc..d61650372c 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingChunkSource.java @@ -15,22 +15,22 @@ */ package com.google.android.exoplayer2.source.smoothstreaming; -import com.google.android.exoplayer2.BehindLiveWindowException; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format.DecreasingBandwidthComparator; -import com.google.android.exoplayer2.chunk.Chunk; -import com.google.android.exoplayer2.chunk.ChunkExtractorWrapper; -import com.google.android.exoplayer2.chunk.ChunkHolder; -import com.google.android.exoplayer2.chunk.ChunkSource; -import com.google.android.exoplayer2.chunk.ContainerMediaChunk; -import com.google.android.exoplayer2.chunk.FormatEvaluator; -import com.google.android.exoplayer2.chunk.FormatEvaluator.Evaluation; -import com.google.android.exoplayer2.chunk.MediaChunk; import com.google.android.exoplayer2.extractor.mp4.FragmentedMp4Extractor; import com.google.android.exoplayer2.extractor.mp4.Track; import com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox; +import com.google.android.exoplayer2.source.BehindLiveWindowException; import com.google.android.exoplayer2.source.TrackGroup; +import com.google.android.exoplayer2.source.chunk.Chunk; +import com.google.android.exoplayer2.source.chunk.ChunkExtractorWrapper; +import com.google.android.exoplayer2.source.chunk.ChunkHolder; +import com.google.android.exoplayer2.source.chunk.ChunkSource; +import com.google.android.exoplayer2.source.chunk.ContainerMediaChunk; +import com.google.android.exoplayer2.source.chunk.FormatEvaluator; +import com.google.android.exoplayer2.source.chunk.FormatEvaluator.Evaluation; +import com.google.android.exoplayer2.source.chunk.MediaChunk; import com.google.android.exoplayer2.source.smoothstreaming.SmoothStreamingManifest.StreamElement; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingMediaSource.java b/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingMediaSource.java index 33b4dbaa14..1c9cd658b0 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingMediaSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/SmoothStreamingMediaSource.java @@ -16,22 +16,22 @@ package com.google.android.exoplayer2.source.smoothstreaming; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.CompositeSequenceableLoader; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; -import com.google.android.exoplayer2.SequenceableLoader; import com.google.android.exoplayer2.TrackSelection; import com.google.android.exoplayer2.chunk.ChunkSampleStream; -import com.google.android.exoplayer2.chunk.FormatEvaluator; -import com.google.android.exoplayer2.chunk.FormatEvaluator.AdaptiveEvaluator; import com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener; import com.google.android.exoplayer2.source.AdaptiveMediaSourceEventListener.EventDispatcher; +import com.google.android.exoplayer2.source.CompositeSequenceableLoader; import com.google.android.exoplayer2.source.MediaPeriod; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.SampleStream; +import com.google.android.exoplayer2.source.SequenceableLoader; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.chunk.FormatEvaluator; +import com.google.android.exoplayer2.source.chunk.FormatEvaluator.AdaptiveEvaluator; import com.google.android.exoplayer2.source.smoothstreaming.SmoothStreamingManifest.ProtectionElement; import com.google.android.exoplayer2.source.smoothstreaming.SmoothStreamingManifest.StreamElement; import com.google.android.exoplayer2.upstream.Allocator;