From 56aecf66147cb3757dc7efd6b0fc77e5abc95fa8 Mon Sep 17 00:00:00 2001 From: tonihei Date: Mon, 20 Aug 2018 16:36:25 -0700 Subject: [PATCH] Make HLS and SS chunk iterators private. They don't need to be accessed publicly and are can be moved into the respective chunk sources. This is the same structure used for Dash. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=209507217 --- .../exoplayer2/source/hls/HlsChunkSource.java | 47 +++++++++++++ .../HlsMediaPlaylistSegmentIterator.java | 67 ------------------- .../smoothstreaming/DefaultSsChunkSource.java | 40 +++++++++++ .../smoothstreaming/manifest/SsManifest.java | 42 ------------ 4 files changed, 87 insertions(+), 109 deletions(-) delete mode 100644 library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylistSegmentIterator.java diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java index ae50c93b83..9b8473ee56 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsChunkSource.java @@ -22,8 +22,10 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.source.BehindLiveWindowException; import com.google.android.exoplayer2.source.TrackGroup; +import com.google.android.exoplayer2.source.chunk.BaseMediaChunkIterator; import com.google.android.exoplayer2.source.chunk.Chunk; import com.google.android.exoplayer2.source.chunk.DataChunk; +import com.google.android.exoplayer2.source.chunk.MediaChunkIterator; import com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist.HlsUrl; import com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist; import com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment; @@ -554,4 +556,49 @@ import java.util.List; } + /** {@link MediaChunkIterator} wrapping a {@link HlsMediaPlaylist}. */ + private static final class HlsMediaPlaylistSegmentIterator extends BaseMediaChunkIterator { + + private final HlsMediaPlaylist playlist; + private final long startOfPlaylistInPeriodUs; + + /** + * Creates iterator. + * + * @param playlist The {@link HlsMediaPlaylist} to wrap. + * @param startOfPlaylistInPeriodUs The start time of the playlist in the period, in + * microseconds. + * @param chunkIndex The chunk index in the playlist at which the iterator will start. + */ + public HlsMediaPlaylistSegmentIterator( + HlsMediaPlaylist playlist, long startOfPlaylistInPeriodUs, int chunkIndex) { + super(/* fromIndex= */ chunkIndex, /* toIndex= */ playlist.segments.size() - 1); + this.playlist = playlist; + this.startOfPlaylistInPeriodUs = startOfPlaylistInPeriodUs; + } + + @Override + public DataSpec getDataSpec() { + checkInBounds(); + Segment segment = playlist.segments.get((int) getCurrentIndex()); + Uri chunkUri = UriUtil.resolveToUri(playlist.baseUri, segment.url); + return new DataSpec( + chunkUri, segment.byterangeOffset, segment.byterangeLength, /* key= */ null); + } + + @Override + public long getChunkStartTimeUs() { + checkInBounds(); + Segment segment = playlist.segments.get((int) getCurrentIndex()); + return startOfPlaylistInPeriodUs + segment.relativeStartTimeUs; + } + + @Override + public long getChunkEndTimeUs() { + checkInBounds(); + Segment segment = playlist.segments.get((int) getCurrentIndex()); + long segmentStartTimeInPeriodUs = startOfPlaylistInPeriodUs + segment.relativeStartTimeUs; + return segmentStartTimeInPeriodUs + segment.durationUs; + } + } } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylistSegmentIterator.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylistSegmentIterator.java deleted file mode 100644 index 4c654dc572..0000000000 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylistSegmentIterator.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2018 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.hls.playlist; - -import android.net.Uri; -import com.google.android.exoplayer2.source.chunk.BaseMediaChunkIterator; -import com.google.android.exoplayer2.source.chunk.MediaChunkIterator; -import com.google.android.exoplayer2.upstream.DataSpec; -import com.google.android.exoplayer2.util.UriUtil; - -/** {@link MediaChunkIterator} wrapping a {@link HlsMediaPlaylist}. */ -public final class HlsMediaPlaylistSegmentIterator extends BaseMediaChunkIterator { - - private final HlsMediaPlaylist playlist; - private final long startOfPlaylistInPeriodUs; - - /** - * Creates iterator. - * - * @param playlist The {@link HlsMediaPlaylist} to wrap. - * @param startOfPlaylistInPeriodUs The start time of the playlist in the period, in microseconds. - * @param chunkIndex The chunk index in the playlist at which the iterator will start. - */ - public HlsMediaPlaylistSegmentIterator( - HlsMediaPlaylist playlist, long startOfPlaylistInPeriodUs, int chunkIndex) { - super(/* fromIndex= */ chunkIndex, /* toIndex= */ playlist.segments.size() - 1); - this.playlist = playlist; - this.startOfPlaylistInPeriodUs = startOfPlaylistInPeriodUs; - } - - @Override - public DataSpec getDataSpec() { - checkInBounds(); - HlsMediaPlaylist.Segment segment = playlist.segments.get((int) getCurrentIndex()); - Uri chunkUri = UriUtil.resolveToUri(playlist.baseUri, segment.url); - return new DataSpec( - chunkUri, segment.byterangeOffset, segment.byterangeLength, /* key= */ null); - } - - @Override - public long getChunkStartTimeUs() { - checkInBounds(); - HlsMediaPlaylist.Segment segment = playlist.segments.get((int) getCurrentIndex()); - return startOfPlaylistInPeriodUs + segment.relativeStartTimeUs; - } - - @Override - public long getChunkEndTimeUs() { - checkInBounds(); - HlsMediaPlaylist.Segment segment = playlist.segments.get((int) getCurrentIndex()); - long segmentStartTimeInPeriodUs = startOfPlaylistInPeriodUs + segment.relativeStartTimeUs; - return segmentStartTimeInPeriodUs + segment.durationUs; - } -} diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java index 831d21eeb7..9491298368 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/DefaultSsChunkSource.java @@ -24,11 +24,13 @@ 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.chunk.BaseMediaChunkIterator; 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.ContainerMediaChunk; import com.google.android.exoplayer2.source.chunk.MediaChunk; +import com.google.android.exoplayer2.source.chunk.MediaChunkIterator; import com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest; import com.google.android.exoplayer2.source.smoothstreaming.manifest.SsManifest.StreamElement; import com.google.android.exoplayer2.trackselection.TrackSelection; @@ -297,4 +299,42 @@ public class DefaultSsChunkSource implements SsChunkSource { return lastChunkEndTimeUs - playbackPositionUs; } + /** {@link MediaChunkIterator} wrapping a track of a {@link StreamElement}. */ + private static final class StreamElementIterator extends BaseMediaChunkIterator { + + private final StreamElement streamElement; + private final int trackIndex; + + /** + * Creates iterator. + * + * @param streamElement The {@link StreamElement} to wrap. + * @param trackIndex The track index in the stream element. + * @param chunkIndex The chunk index at which the iterator will start. + */ + public StreamElementIterator(StreamElement streamElement, int trackIndex, int chunkIndex) { + super(/* fromIndex= */ chunkIndex, /* toIndex= */ streamElement.chunkCount - 1); + this.streamElement = streamElement; + this.trackIndex = trackIndex; + } + + @Override + public DataSpec getDataSpec() { + checkInBounds(); + Uri uri = streamElement.buildRequestUri(trackIndex, (int) getCurrentIndex()); + return new DataSpec(uri); + } + + @Override + public long getChunkStartTimeUs() { + checkInBounds(); + return streamElement.getStartTimeUs((int) getCurrentIndex()); + } + + @Override + public long getChunkEndTimeUs() { + long chunkStartTimeUs = getChunkStartTimeUs(); + return chunkStartTimeUs + streamElement.getChunkDurationUs((int) getCurrentIndex()); + } + } } diff --git a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java index 51284f06c4..2c508f0fde 100644 --- a/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java +++ b/library/smoothstreaming/src/main/java/com/google/android/exoplayer2/source/smoothstreaming/manifest/SsManifest.java @@ -20,9 +20,6 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.offline.FilterableManifest; import com.google.android.exoplayer2.offline.StreamKey; -import com.google.android.exoplayer2.source.chunk.BaseMediaChunkIterator; -import com.google.android.exoplayer2.source.chunk.MediaChunkIterator; -import com.google.android.exoplayer2.upstream.DataSpec; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.UriUtil; import com.google.android.exoplayer2.util.Util; @@ -51,45 +48,6 @@ public class SsManifest implements FilterableManifest { } } - /** {@link MediaChunkIterator} wrapping a track of a {@link StreamElement}. */ - public static final class StreamElementIterator extends BaseMediaChunkIterator { - - private final StreamElement streamElement; - private final int trackIndex; - - /** - * Creates iterator. - * - * @param streamElement The {@link StreamElement} to wrap. - * @param trackIndex The track index in the stream element. - * @param chunkIndex The chunk index at which the iterator will start. - */ - public StreamElementIterator(StreamElement streamElement, int trackIndex, int chunkIndex) { - super(/* fromIndex= */ chunkIndex, /* toIndex= */ streamElement.chunkCount - 1); - this.streamElement = streamElement; - this.trackIndex = trackIndex; - } - - @Override - public DataSpec getDataSpec() { - checkInBounds(); - Uri uri = streamElement.buildRequestUri(trackIndex, (int) getCurrentIndex()); - return new DataSpec(uri); - } - - @Override - public long getChunkStartTimeUs() { - checkInBounds(); - return streamElement.getStartTimeUs((int) getCurrentIndex()); - } - - @Override - public long getChunkEndTimeUs() { - long chunkStartTimeUs = getChunkStartTimeUs(); - return chunkStartTimeUs + streamElement.getChunkDurationUs((int) getCurrentIndex()); - } - } - /** * Represents a StreamIndex element. */