diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/player/SourceBuilder.java b/demo/src/main/java/com/google/android/exoplayer/demo/player/SourceBuilder.java index 25feb67f9d..e83b8da589 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/player/SourceBuilder.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/player/SourceBuilder.java @@ -30,10 +30,10 @@ import com.google.android.exoplayer.dash.mpd.MediaPresentationDescriptionParser; import com.google.android.exoplayer.drm.MediaDrmCallback; import com.google.android.exoplayer.extractor.ExtractorSampleSource; import com.google.android.exoplayer.hls.HlsChunkSource; -import com.google.android.exoplayer.hls.HlsPlaylist; -import com.google.android.exoplayer.hls.HlsPlaylistParser; import com.google.android.exoplayer.hls.HlsSampleSource; import com.google.android.exoplayer.hls.PtsTimestampAdjusterProvider; +import com.google.android.exoplayer.hls.playlist.HlsPlaylist; +import com.google.android.exoplayer.hls.playlist.HlsPlaylistParser; import com.google.android.exoplayer.smoothstreaming.SmoothStreamingChunkSource; import com.google.android.exoplayer.smoothstreaming.SmoothStreamingManifest; import com.google.android.exoplayer.smoothstreaming.SmoothStreamingManifestParser; diff --git a/library/src/androidTest/java/com/google/android/exoplayer/hls/HlsMasterPlaylistParserTest.java b/library/src/androidTest/java/com/google/android/exoplayer/hls/playlist/HlsMasterPlaylistParserTest.java similarity index 98% rename from library/src/androidTest/java/com/google/android/exoplayer/hls/HlsMasterPlaylistParserTest.java rename to library/src/androidTest/java/com/google/android/exoplayer/hls/playlist/HlsMasterPlaylistParserTest.java index bd61a5da34..47783f9eb9 100644 --- a/library/src/androidTest/java/com/google/android/exoplayer/hls/HlsMasterPlaylistParserTest.java +++ b/library/src/androidTest/java/com/google/android/exoplayer/hls/playlist/HlsMasterPlaylistParserTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer.hls; +package com.google.android.exoplayer.hls.playlist; import com.google.android.exoplayer.C; diff --git a/library/src/androidTest/java/com/google/android/exoplayer/hls/HlsMediaPlaylistParserTest.java b/library/src/androidTest/java/com/google/android/exoplayer/hls/playlist/HlsMediaPlaylistParserTest.java similarity index 99% rename from library/src/androidTest/java/com/google/android/exoplayer/hls/HlsMediaPlaylistParserTest.java rename to library/src/androidTest/java/com/google/android/exoplayer/hls/playlist/HlsMediaPlaylistParserTest.java index 7075e7ebce..086e4ebdd9 100644 --- a/library/src/androidTest/java/com/google/android/exoplayer/hls/HlsMediaPlaylistParserTest.java +++ b/library/src/androidTest/java/com/google/android/exoplayer/hls/playlist/HlsMediaPlaylistParserTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer.hls; +package com.google.android.exoplayer.hls.playlist; import com.google.android.exoplayer.C; diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/BaseMediaChunk.java b/library/src/main/java/com/google/android/exoplayer/chunk/BaseMediaChunk.java index 400c03d769..3483ed68d5 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/BaseMediaChunk.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/BaseMediaChunk.java @@ -17,18 +17,18 @@ package com.google.android.exoplayer.chunk; import com.google.android.exoplayer.Format; import com.google.android.exoplayer.drm.DrmInitData; -import com.google.android.exoplayer.extractor.RollingSampleBuffer; +import com.google.android.exoplayer.extractor.DefaultTrackOutput; import com.google.android.exoplayer.upstream.DataSource; import com.google.android.exoplayer.upstream.DataSpec; /** * A base implementation of {@link MediaChunk}, for chunks that contain a single track. *

- * Loaded samples are output to a {@link RollingSampleBuffer}. + * Loaded samples are output to a {@link DefaultTrackOutput}. */ public abstract class BaseMediaChunk extends MediaChunk { - private RollingSampleBuffer trackOutput; + private DefaultTrackOutput trackOutput; private int firstSampleIndex; /** @@ -46,19 +46,19 @@ public abstract class BaseMediaChunk extends MediaChunk { } /** - * Initializes the chunk for loading, setting the {@link RollingSampleBuffer} that will receive + * Initializes the chunk for loading, setting the {@link DefaultTrackOutput} that will receive * samples as they are loaded. * * @param trackOutput The output that will receive the loaded samples. */ - public void init(RollingSampleBuffer trackOutput) { + public void init(DefaultTrackOutput trackOutput) { this.trackOutput = trackOutput; this.firstSampleIndex = trackOutput.getWriteIndex(); } /** * Returns the index of the first sample in the output that was passed to - * {@link #init(RollingSampleBuffer)} that will originate from this chunk. + * {@link #init(DefaultTrackOutput)} that will originate from this chunk. */ public final int getFirstSampleIndex() { return firstSampleIndex; @@ -72,9 +72,9 @@ public abstract class BaseMediaChunk extends MediaChunk { public abstract DrmInitData getDrmInitData(); /** - * Returns the track output most recently passed to {@link #init(RollingSampleBuffer)}. + * Returns the track output most recently passed to {@link #init(DefaultTrackOutput)}. */ - protected final RollingSampleBuffer getTrackOutput() { + protected final DefaultTrackOutput getTrackOutput() { return trackOutput; } 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 d008d2da98..9356c47fe5 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 @@ -26,7 +26,7 @@ import com.google.android.exoplayer.TrackGroupArray; import com.google.android.exoplayer.TrackSelection; import com.google.android.exoplayer.TrackStream; import com.google.android.exoplayer.chunk.ChunkSampleSourceEventListener.EventDispatcher; -import com.google.android.exoplayer.extractor.RollingSampleBuffer; +import com.google.android.exoplayer.extractor.DefaultTrackOutput; import com.google.android.exoplayer.upstream.Loader; import com.google.android.exoplayer.upstream.Loader.Loadable; import com.google.android.exoplayer.util.Assertions; @@ -56,7 +56,7 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call private final ChunkHolder nextChunkHolder; private final LinkedList mediaChunks; private final List readOnlyMediaChunks; - private final RollingSampleBuffer sampleQueue; + private final DefaultTrackOutput sampleQueue; private final int bufferSizeContribution; private final EventDispatcher eventDispatcher; @@ -125,7 +125,7 @@ public class ChunkSampleSource implements SampleSource, TrackStream, Loader.Call nextChunkHolder = new ChunkHolder(); mediaChunks = new LinkedList<>(); readOnlyMediaChunks = Collections.unmodifiableList(mediaChunks); - sampleQueue = new RollingSampleBuffer(loadControl.getAllocator()); + sampleQueue = new DefaultTrackOutput(loadControl.getAllocator()); pendingResetPositionUs = C.UNSET_TIME_US; } diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/ContainerMediaChunk.java b/library/src/main/java/com/google/android/exoplayer/chunk/ContainerMediaChunk.java index e6739c8a90..67d8da8d5f 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/ContainerMediaChunk.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/ContainerMediaChunk.java @@ -19,9 +19,9 @@ import com.google.android.exoplayer.Format; import com.google.android.exoplayer.chunk.ChunkExtractorWrapper.SingleTrackMetadataOutput; import com.google.android.exoplayer.drm.DrmInitData; import com.google.android.exoplayer.extractor.DefaultExtractorInput; +import com.google.android.exoplayer.extractor.DefaultTrackOutput; import com.google.android.exoplayer.extractor.Extractor; import com.google.android.exoplayer.extractor.ExtractorInput; -import com.google.android.exoplayer.extractor.RollingSampleBuffer; import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.upstream.DataSource; import com.google.android.exoplayer.upstream.DataSpec; @@ -111,7 +111,7 @@ public class ContainerMediaChunk extends BaseMediaChunk implements SingleTrackMe loadDataSpec.absoluteStreamPosition, dataSource.open(loadDataSpec)); if (bytesLoaded == 0) { // Set the target to ourselves. - RollingSampleBuffer trackOutput = getTrackOutput(); + DefaultTrackOutput trackOutput = getTrackOutput(); trackOutput.formatWithOffset(sampleFormat, sampleOffsetUs); extractorWrapper.init(this, trackOutput); } diff --git a/library/src/main/java/com/google/android/exoplayer/chunk/SingleSampleMediaChunk.java b/library/src/main/java/com/google/android/exoplayer/chunk/SingleSampleMediaChunk.java index 241d4c4f3e..82a3dc8696 100644 --- a/library/src/main/java/com/google/android/exoplayer/chunk/SingleSampleMediaChunk.java +++ b/library/src/main/java/com/google/android/exoplayer/chunk/SingleSampleMediaChunk.java @@ -19,8 +19,8 @@ import com.google.android.exoplayer.C; import com.google.android.exoplayer.Format; import com.google.android.exoplayer.drm.DrmInitData; import com.google.android.exoplayer.extractor.DefaultExtractorInput; +import com.google.android.exoplayer.extractor.DefaultTrackOutput; import com.google.android.exoplayer.extractor.ExtractorInput; -import com.google.android.exoplayer.extractor.RollingSampleBuffer; import com.google.android.exoplayer.upstream.DataSource; import com.google.android.exoplayer.upstream.DataSpec; import com.google.android.exoplayer.util.Util; @@ -91,7 +91,7 @@ public final class SingleSampleMediaChunk extends BaseMediaChunk { length += bytesLoaded; } ExtractorInput extractorInput = new DefaultExtractorInput(dataSource, bytesLoaded, length); - RollingSampleBuffer trackOutput = getTrackOutput(); + DefaultTrackOutput trackOutput = getTrackOutput(); trackOutput.formatWithOffset(sampleFormat, 0); // Load the sample data. int result = 0; diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/RollingSampleBuffer.java b/library/src/main/java/com/google/android/exoplayer/extractor/DefaultTrackOutput.java similarity index 99% rename from library/src/main/java/com/google/android/exoplayer/extractor/RollingSampleBuffer.java rename to library/src/main/java/com/google/android/exoplayer/extractor/DefaultTrackOutput.java index 76bc58c60d..c39151f2f6 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/RollingSampleBuffer.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/DefaultTrackOutput.java @@ -29,9 +29,10 @@ import java.nio.ByteBuffer; import java.util.concurrent.LinkedBlockingDeque; /** - * A rolling buffer of sample data and corresponding sample information. + * A {@link TrackOutput} that buffers extracted samples in a queue and allows for consumption from + * that queue. */ -public final class RollingSampleBuffer implements TrackOutput { +public final class DefaultTrackOutput implements TrackOutput { private static final int INITIAL_SCRATCH_SIZE = 32; @@ -60,7 +61,7 @@ public final class RollingSampleBuffer implements TrackOutput { /** * @param allocator An {@link Allocator} from which allocations for sample data can be obtained. */ - public RollingSampleBuffer(Allocator allocator) { + public DefaultTrackOutput(Allocator allocator) { this.allocator = allocator; allocationLength = allocator.getIndividualAllocationLength(); infoQueue = new InfoQueue(); diff --git a/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java b/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java index 1c95184de6..47c6281754 100644 --- a/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/extractor/ExtractorSampleSource.java @@ -208,7 +208,7 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu private boolean prepared; private boolean seenFirstTrackSelection; private int enabledTrackCount; - private RollingSampleBuffer[] sampleQueues; + private DefaultTrackOutput[] sampleQueues; private TrackGroupArray tracks; private long durationUs; private boolean[] pendingMediaFormat; @@ -324,7 +324,7 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu } extractorHolder = new ExtractorHolder(extractors, this); pendingResetPositionUs = C.UNSET_TIME_US; - sampleQueues = new RollingSampleBuffer[0]; + sampleQueues = new DefaultTrackOutput[0]; } // SampleSource implementation. @@ -425,7 +425,7 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu return pendingResetPositionUs; } else { long largestQueuedTimestampUs = Long.MIN_VALUE; - for (RollingSampleBuffer sampleQueue : sampleQueues) { + for (DefaultTrackOutput sampleQueue : sampleQueues) { largestQueuedTimestampUs = Math.max(largestQueuedTimestampUs, sampleQueue.getLargestQueuedTimestampUs()); } @@ -473,7 +473,7 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu return TrackStream.NOTHING_READ; } - RollingSampleBuffer sampleQueue = sampleQueues[track]; + DefaultTrackOutput sampleQueue = sampleQueues[track]; if (pendingMediaFormat[track]) { formatHolder.format = sampleQueue.getUpstreamFormat(); formatHolder.drmInitData = drmInitData; @@ -538,7 +538,7 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu @Override public TrackOutput track(int id) { sampleQueues = Arrays.copyOf(sampleQueues, sampleQueues.length + 1); - RollingSampleBuffer sampleQueue = new RollingSampleBuffer(allocator); + DefaultTrackOutput sampleQueue = new DefaultTrackOutput(allocator); sampleQueues[sampleQueues.length - 1] = sampleQueue; return sampleQueue; } @@ -634,14 +634,14 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu private int getExtractedSamplesCount() { int extractedSamplesCount = 0; - for (RollingSampleBuffer sampleQueue : sampleQueues) { + for (DefaultTrackOutput sampleQueue : sampleQueues) { extractedSamplesCount += sampleQueue.getWriteIndex(); } return extractedSamplesCount; } private boolean haveFormatsForAllTracks() { - for (RollingSampleBuffer sampleQueue : sampleQueues) { + for (DefaultTrackOutput sampleQueue : sampleQueues) { if (sampleQueue.getUpstreamFormat() == null) { return false; } @@ -664,7 +664,7 @@ public final class ExtractorSampleSource implements SampleSource, ExtractorOutpu } private void clearSampleQueues() { - for (RollingSampleBuffer sampleQueue : sampleQueues) { + for (DefaultTrackOutput sampleQueue : sampleQueues) { sampleQueue.clear(); } } diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java index 924c21d513..344b2ea1c1 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsChunkSource.java @@ -28,6 +28,11 @@ import com.google.android.exoplayer.extractor.mp3.Mp3Extractor; import com.google.android.exoplayer.extractor.ts.AdtsExtractor; import com.google.android.exoplayer.extractor.ts.PtsTimestampAdjuster; import com.google.android.exoplayer.extractor.ts.TsExtractor; +import com.google.android.exoplayer.hls.playlist.HlsMasterPlaylist; +import com.google.android.exoplayer.hls.playlist.HlsMediaPlaylist; +import com.google.android.exoplayer.hls.playlist.HlsPlaylist; +import com.google.android.exoplayer.hls.playlist.HlsPlaylistParser; +import com.google.android.exoplayer.hls.playlist.Variant; import com.google.android.exoplayer.upstream.DataSource; import com.google.android.exoplayer.upstream.DataSpec; import com.google.android.exoplayer.upstream.HttpDataSource.InvalidResponseCodeException; @@ -325,7 +330,7 @@ public class HlsChunkSource { * should be interpreted as a seek position. * @param out A holder to populate. */ - public void getNextChunk(TsChunk previous, long playbackPositionUs, ChunkHolder out) { + public void getNextChunk(HlsMediaChunk previous, long playbackPositionUs, ChunkHolder out) { int variantIndex = getNextVariantIndex(previous, playbackPositionUs); boolean switchingVariant = previous != null && variants[variantIndex].format != previous.format; @@ -450,7 +455,7 @@ public class HlsChunkSource { extractorNeedsInit = false; } - out.chunk = new TsChunk(dataSource, dataSpec, trigger, format, startTimeUs, endTimeUs, + out.chunk = new HlsMediaChunk(dataSource, dataSpec, trigger, format, startTimeUs, endTimeUs, chunkMediaSequence, segment.discontinuitySequenceNumber, extractor, extractorNeedsInit, switchingVariant, encryptionKey, encryptionIv); } @@ -576,7 +581,7 @@ public class HlsChunkSource { return false; } - private int getNextVariantIndex(TsChunk previous, long playbackPositionUs) { + private int getNextVariantIndex(HlsMediaChunk previous, long playbackPositionUs) { clearStaleBlacklistedVariants(); if (enabledVariants.length > 1) { long bufferedDurationUs; diff --git a/library/src/main/java/com/google/android/exoplayer/hls/TsChunk.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsMediaChunk.java similarity index 96% rename from library/src/main/java/com/google/android/exoplayer/hls/TsChunk.java rename to library/src/main/java/com/google/android/exoplayer/hls/HlsMediaChunk.java index 7784232422..8c1df7b49b 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/TsChunk.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsMediaChunk.java @@ -27,9 +27,9 @@ import com.google.android.exoplayer.util.Util; import java.io.IOException; /** - * An MPEG2TS chunk. + * An HLS {@link MediaChunk}. */ -public final class TsChunk extends MediaChunk { +/* package */ final class HlsMediaChunk extends MediaChunk { /** * The discontinuity sequence number of the chunk. @@ -65,7 +65,7 @@ public final class TsChunk extends MediaChunk { * @param encryptionKey For AES encryption chunks, the encryption key. * @param encryptionIv For AES encryption chunks, the encryption initialization vector. */ - public TsChunk(DataSource dataSource, DataSpec dataSpec, int trigger, Format format, + public HlsMediaChunk(DataSource dataSource, DataSpec dataSpec, int trigger, Format format, long startTimeUs, long endTimeUs, int chunkIndex, int discontinuitySequenceNumber, Extractor extractor, boolean extractorNeedsInit, boolean shouldSpliceIn, byte[] encryptionKey, byte[] encryptionIv) { diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsOutput.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsOutput.java index 4d7a9919da..c11da36171 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsOutput.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsOutput.java @@ -16,8 +16,8 @@ package com.google.android.exoplayer.hls; import com.google.android.exoplayer.drm.DrmInitData; +import com.google.android.exoplayer.extractor.DefaultTrackOutput; import com.google.android.exoplayer.extractor.ExtractorOutput; -import com.google.android.exoplayer.extractor.RollingSampleBuffer; import com.google.android.exoplayer.extractor.SeekMap; import com.google.android.exoplayer.upstream.Allocator; @@ -29,10 +29,10 @@ import android.util.SparseArray; /* package */ final class HlsOutput implements ExtractorOutput { private final Allocator allocator; - private final SparseArray sampleQueues = new SparseArray<>(); + private final SparseArray sampleQueues = new SparseArray<>(); private boolean prepared; - private RollingSampleBuffer[] trackOutputArray; + private DefaultTrackOutput[] trackOutputArray; private volatile boolean tracksBuilt; public HlsOutput(Allocator allocator) { @@ -53,12 +53,12 @@ import android.util.SparseArray; return false; } else { if (trackOutputArray == null) { - trackOutputArray = new RollingSampleBuffer[sampleQueues.size()]; + trackOutputArray = new DefaultTrackOutput[sampleQueues.size()]; for (int i = 0; i < trackOutputArray.length; i++) { trackOutputArray[i] = sampleQueues.valueAt(i); } } - for (RollingSampleBuffer sampleQueue : trackOutputArray) { + for (DefaultTrackOutput sampleQueue : trackOutputArray) { if (sampleQueue.getUpstreamFormat() == null) { return false; } @@ -71,7 +71,7 @@ import android.util.SparseArray; /** * Returns the array of track outputs, or null if the output is not yet prepared. */ - public RollingSampleBuffer[] getTrackOutputs() { + public DefaultTrackOutput[] getTrackOutputs() { return trackOutputArray; } @@ -98,11 +98,11 @@ import android.util.SparseArray; // ExtractorOutput implementation. Called by the loading thread. @Override - public RollingSampleBuffer track(int id) { + public DefaultTrackOutput track(int id) { if (sampleQueues.indexOfKey(id) >= 0) { return sampleQueues.get(id); } - RollingSampleBuffer trackOutput = new RollingSampleBuffer(allocator); + DefaultTrackOutput trackOutput = new DefaultTrackOutput(allocator); sampleQueues.put(id, trackOutput); return trackOutput; } diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java index bf53335225..bac90a7406 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsSampleSource.java @@ -29,7 +29,7 @@ import com.google.android.exoplayer.chunk.Chunk; import com.google.android.exoplayer.chunk.ChunkHolder; import com.google.android.exoplayer.chunk.ChunkSampleSourceEventListener; import com.google.android.exoplayer.chunk.ChunkSampleSourceEventListener.EventDispatcher; -import com.google.android.exoplayer.extractor.RollingSampleBuffer; +import com.google.android.exoplayer.extractor.DefaultTrackOutput; import com.google.android.exoplayer.upstream.Loader; import com.google.android.exoplayer.upstream.Loader.Loadable; import com.google.android.exoplayer.util.Assertions; @@ -60,7 +60,7 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { private final Loader loader; private final HlsChunkSource chunkSource; - private final LinkedList tsChunks = new LinkedList(); + private final LinkedList mediaChunks = new LinkedList(); private final HlsOutput output; private final int bufferSizeContribution; private final ChunkHolder nextChunkHolder; @@ -71,7 +71,7 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { private boolean seenFirstTrackSelection; private int enabledTrackCount; - private RollingSampleBuffer[] trackOutputs; + private DefaultTrackOutput[] sampleQueues; private Format downstreamFormat; // Tracks are complicated in HLS. See documentation of buildTracks for details. @@ -89,8 +89,8 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { private boolean loadingFinished; private Chunk currentLoadable; - private TsChunk currentTsLoadable; - private TsChunk previousTsLoadable; + private HlsMediaChunk currentMediaChunkLoadable; + private HlsMediaChunk previousMediaChunkLoadable; private long currentLoadStartTimeMs; @@ -135,7 +135,7 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { return true; } if (output.prepare()) { - trackOutputs = output.getTrackOutputs(); + sampleQueues = output.getTrackOutputs(); buildTracks(); prepared = true; return true; @@ -231,14 +231,14 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { return C.END_OF_SOURCE_US; } else { long bufferedPositionUs = downstreamPositionUs; - if (previousTsLoadable != null) { + if (previousMediaChunkLoadable != null) { // Buffered position should be at least as large as the end time of the previously loaded // chunk. - bufferedPositionUs = Math.max(previousTsLoadable.endTimeUs, bufferedPositionUs); + bufferedPositionUs = Math.max(previousMediaChunkLoadable.endTimeUs, bufferedPositionUs); } - for (RollingSampleBuffer trackOutput : trackOutputs) { + for (DefaultTrackOutput sampleQueue : sampleQueues) { bufferedPositionUs = Math.max(bufferedPositionUs, - trackOutput.getLargestQueuedTimestampUs()); + sampleQueue.getLargestQueuedTimestampUs()); } return bufferedPositionUs; } @@ -268,7 +268,7 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { if (isPendingReset()) { return false; } - return !trackOutputs[group].isEmpty(); + return !sampleQueues[group].isEmpty(); } /* package */ void maybeThrowError() throws IOException { @@ -289,7 +289,7 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { return TrackStream.NOTHING_READ; } - TsChunk currentChunk = tsChunks.getFirst(); + HlsMediaChunk currentChunk = mediaChunks.getFirst(); Format currentFormat = currentChunk.format; if (downstreamFormat == null || !downstreamFormat.equals(currentFormat)) { eventDispatcher.downstreamFormatChanged(currentFormat, currentChunk.trigger, @@ -297,7 +297,7 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { downstreamFormat = currentFormat; } - RollingSampleBuffer sampleQueue = trackOutputs[group]; + DefaultTrackOutput sampleQueue = sampleQueues[group]; if (sampleQueue.isEmpty()) { if (loadingFinished) { buffer.addFlag(C.BUFFER_FLAG_END_OF_STREAM); @@ -315,8 +315,8 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { if (sampleQueue.readSample(buffer)) { long sampleTimeUs = buffer.timeUs; - while (tsChunks.size() > 1 && tsChunks.get(1).startTimeUs <= sampleTimeUs) { - tsChunks.removeFirst(); + while (mediaChunks.size() > 1 && mediaChunks.get(1).startTimeUs <= sampleTimeUs) { + mediaChunks.removeFirst(); } if (sampleTimeUs < lastSeekPositionUs) { buffer.addFlag(C.BUFFER_FLAG_DECODE_ONLY); @@ -335,12 +335,13 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { long now = SystemClock.elapsedRealtime(); long loadDurationMs = now - currentLoadStartTimeMs; chunkSource.onChunkLoadCompleted(currentLoadable); - if (isTsChunk(currentLoadable)) { - Assertions.checkState(currentLoadable == currentTsLoadable); - previousTsLoadable = currentTsLoadable; - eventDispatcher.loadCompleted(currentLoadable.bytesLoaded(), currentTsLoadable.type, - currentTsLoadable.trigger, currentTsLoadable.format, currentTsLoadable.startTimeUs, - currentTsLoadable.endTimeUs, now, loadDurationMs); + if (isMediaChunk(currentLoadable)) { + Assertions.checkState(currentLoadable == currentMediaChunkLoadable); + previousMediaChunkLoadable = currentMediaChunkLoadable; + eventDispatcher.loadCompleted(currentLoadable.bytesLoaded(), currentMediaChunkLoadable.type, + currentMediaChunkLoadable.trigger, currentMediaChunkLoadable.format, + currentMediaChunkLoadable.startTimeUs, currentMediaChunkLoadable.endTimeUs, now, + loadDurationMs); } else { eventDispatcher.loadCompleted(currentLoadable.bytesLoaded(), currentLoadable.type, currentLoadable.trigger, currentLoadable.format, -1, -1, now, loadDurationMs); @@ -363,12 +364,12 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { @Override public int onLoadError(Loadable loadable, IOException e) { long bytesLoaded = currentLoadable.bytesLoaded(); - boolean cancelable = !isTsChunk(currentLoadable) || bytesLoaded == 0; + boolean cancelable = !isMediaChunk(currentLoadable) || bytesLoaded == 0; if (chunkSource.onChunkLoadError(currentLoadable, cancelable, e)) { eventDispatcher.loadError(e); eventDispatcher.loadCanceled(bytesLoaded); clearCurrentLoadable(); - if (previousTsLoadable == null && !isPendingReset()) { + if (previousMediaChunkLoadable == null && !isPendingReset()) { pendingResetPositionUs = lastSeekPositionUs; } maybeStartLoading(); @@ -415,9 +416,9 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { // of the single track of this type. int primaryExtractorTrackType = PRIMARY_TYPE_NONE; int primaryExtractorTrackIndex = -1; - int extractorTrackCount = trackOutputs.length; + int extractorTrackCount = sampleQueues.length; for (int i = 0; i < extractorTrackCount; i++) { - String sampleMimeType = trackOutputs[i].getUpstreamFormat().sampleMimeType; + String sampleMimeType = sampleQueues[i].getUpstreamFormat().sampleMimeType; int trackType; if (MimeTypes.isVideo(sampleMimeType)) { trackType = PRIMARY_TYPE_VIDEO; @@ -450,7 +451,7 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { // Construct the set of exposed track groups. TrackGroup[] trackGroups = new TrackGroup[extractorTrackCount]; for (int i = 0; i < extractorTrackCount; i++) { - Format sampleFormat = trackOutputs[i].getUpstreamFormat(); + Format sampleFormat = sampleQueues[i].getUpstreamFormat(); if (i == primaryExtractorTrackIndex) { Format[] formats = new Format[chunkSourceTrackCount]; for (int j = 0; j < chunkSourceTrackCount; j++) { @@ -522,7 +523,7 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { } for (int i = 0; i < groupEnabledStates.length; i++) { if (!groupEnabledStates[i]) { - trackOutputs[i].skipAllSamples(); + sampleQueues[i].skipAllSamples(); } } } @@ -539,14 +540,14 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { } private void clearState() { - tsChunks.clear(); + mediaChunks.clear(); output.clear(); clearCurrentLoadable(); - previousTsLoadable = null; + previousMediaChunkLoadable = null; } private void clearCurrentLoadable() { - currentTsLoadable = null; + currentMediaChunkLoadable = null; currentLoadable = null; } @@ -557,7 +558,7 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { return; } - chunkSource.getNextChunk(previousTsLoadable, + chunkSource.getNextChunk(previousMediaChunkLoadable, pendingResetPositionUs != C.UNSET_TIME_US ? pendingResetPositionUs : downstreamPositionUs, nextChunkHolder); boolean endOfStream = nextChunkHolder.endOfStream; @@ -578,16 +579,16 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { currentLoadStartTimeMs = SystemClock.elapsedRealtime(); currentLoadable = nextLoadable; - if (isTsChunk(currentLoadable)) { - TsChunk tsChunk = (TsChunk) currentLoadable; + if (isMediaChunk(currentLoadable)) { + HlsMediaChunk mediaChunk = (HlsMediaChunk) currentLoadable; if (isPendingReset()) { pendingResetPositionUs = C.UNSET_TIME_US; } - tsChunk.init(output); - tsChunks.addLast(tsChunk); - eventDispatcher.loadStarted(tsChunk.dataSpec.length, tsChunk.type, tsChunk.trigger, - tsChunk.format, tsChunk.startTimeUs, tsChunk.endTimeUs); - currentTsLoadable = tsChunk; + mediaChunk.init(output); + mediaChunks.addLast(mediaChunk); + eventDispatcher.loadStarted(mediaChunk.dataSpec.length, mediaChunk.type, mediaChunk.trigger, + mediaChunk.format, mediaChunk.startTimeUs, mediaChunk.endTimeUs); + currentMediaChunkLoadable = mediaChunk; } else { eventDispatcher.loadStarted(currentLoadable.dataSpec.length, currentLoadable.type, currentLoadable.trigger, currentLoadable.format, -1, -1); @@ -607,13 +608,13 @@ public final class HlsSampleSource implements SampleSource, Loader.Callback { if (isPendingReset()) { return pendingResetPositionUs; } else { - return loadingFinished ? C.UNSET_TIME_US : (currentTsLoadable != null - ? currentTsLoadable.endTimeUs : previousTsLoadable.endTimeUs); + return loadingFinished ? C.UNSET_TIME_US : (currentMediaChunkLoadable != null + ? currentMediaChunkLoadable.endTimeUs : previousMediaChunkLoadable.endTimeUs); } } - private boolean isTsChunk(Chunk chunk) { - return chunk instanceof TsChunk; + private boolean isMediaChunk(Chunk chunk) { + return chunk instanceof HlsMediaChunk; } private boolean isPendingReset() { diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsMasterPlaylist.java b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsMasterPlaylist.java similarity index 96% rename from library/src/main/java/com/google/android/exoplayer/hls/HlsMasterPlaylist.java rename to library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsMasterPlaylist.java index d88ba2b526..107ca7c1a1 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsMasterPlaylist.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsMasterPlaylist.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer.hls; +package com.google.android.exoplayer.hls.playlist; import com.google.android.exoplayer.Format; diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylist.java b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsMediaPlaylist.java similarity index 98% rename from library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylist.java rename to library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsMediaPlaylist.java index acf21d21f4..87d535dff0 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylist.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsMediaPlaylist.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer.hls; +package com.google.android.exoplayer.hls.playlist; import com.google.android.exoplayer.C; diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsParserUtil.java b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsParserUtil.java similarity index 97% rename from library/src/main/java/com/google/android/exoplayer/hls/HlsParserUtil.java rename to library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsParserUtil.java index 23a64163ad..3a25a7d67d 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsParserUtil.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsParserUtil.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer.hls; +package com.google.android.exoplayer.hls.playlist; import com.google.android.exoplayer.ParserException; diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylist.java b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsPlaylist.java similarity index 86% rename from library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylist.java rename to library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsPlaylist.java index 4faddf3342..6f68469073 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylist.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsPlaylist.java @@ -13,15 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer.hls; +package com.google.android.exoplayer.hls.playlist; /** * Represents an HLS playlist. */ public abstract class HlsPlaylist { - public final static int TYPE_MASTER = 0; - public final static int TYPE_MEDIA = 1; + public static final int TYPE_MASTER = 0; + public static final int TYPE_MEDIA = 1; public final String baseUri; public final int type; diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsPlaylistParser.java similarity index 99% rename from library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java rename to library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsPlaylistParser.java index 7c8d2a978c..464fcf7e8d 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsPlaylistParser.java @@ -13,12 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer.hls; +package com.google.android.exoplayer.hls.playlist; import com.google.android.exoplayer.C; import com.google.android.exoplayer.Format; import com.google.android.exoplayer.ParserException; -import com.google.android.exoplayer.hls.HlsMediaPlaylist.Segment; +import com.google.android.exoplayer.hls.playlist.HlsMediaPlaylist.Segment; import com.google.android.exoplayer.upstream.UriLoadable; import com.google.android.exoplayer.util.MimeTypes; diff --git a/library/src/main/java/com/google/android/exoplayer/hls/Variant.java b/library/src/main/java/com/google/android/exoplayer/hls/playlist/Variant.java similarity index 94% rename from library/src/main/java/com/google/android/exoplayer/hls/Variant.java rename to library/src/main/java/com/google/android/exoplayer/hls/playlist/Variant.java index 3800014b27..c0a71bc00d 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/Variant.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/playlist/Variant.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.google.android.exoplayer.hls; +package com.google.android.exoplayer.hls.playlist; import com.google.android.exoplayer.Format;