diff --git a/library/src/androidTest/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylistParserTest.java b/library/src/androidTest/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylistParserTest.java index 9ee35acb09..1bd1fab352 100644 --- a/library/src/androidTest/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylistParserTest.java +++ b/library/src/androidTest/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylistParserTest.java @@ -56,7 +56,7 @@ public class HlsMasterPlaylistParserTest extends TestCase { HlsMasterPlaylist masterPlaylist = (HlsMasterPlaylist) playlist; - List variants = masterPlaylist.variants; + List variants = masterPlaylist.variants; assertNotNull(variants); assertEquals(5, variants.size()); 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 6f73258fc1..948f97e887 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 @@ -31,9 +31,9 @@ import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.chunk.Chunk; import com.google.android.exoplayer2.source.chunk.ChunkedTrackBlacklistUtil; import com.google.android.exoplayer2.source.chunk.DataChunk; +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.HlsPlaylistParser; -import com.google.android.exoplayer2.source.hls.playlist.Variant; import com.google.android.exoplayer2.trackselection.BaseTrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.upstream.DataSource; @@ -107,7 +107,7 @@ import java.util.Locale; private final DataSource dataSource; private final HlsPlaylistParser playlistParser; private final PtsTimestampAdjusterProvider timestampAdjusterProvider; - private final Variant[] variants; + private final HlsMasterPlaylist.HlsUrl[] variants; private final HlsMediaPlaylist[] variantPlaylists; private final TrackGroup trackGroup; private final long[] variantLastPlaylistLoadTimesMs; @@ -135,7 +135,7 @@ import java.util.Locale; * multiple {@link HlsChunkSource}s are used for a single playback, they should all share the * same provider. */ - public HlsChunkSource(String baseUri, Variant[] variants, DataSource dataSource, + public HlsChunkSource(String baseUri, HlsMasterPlaylist.HlsUrl[] variants, DataSource dataSource, PtsTimestampAdjusterProvider timestampAdjusterProvider) { this.baseUri = baseUri; this.variants = variants; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java index 071d1f94ab..3937e562e5 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaPeriod.java @@ -34,7 +34,6 @@ 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; import com.google.android.exoplayer2.source.hls.playlist.HlsPlaylistParser; -import com.google.android.exoplayer2.source.hls.playlist.Variant; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.upstream.Allocator; import com.google.android.exoplayer2.upstream.DataSource; @@ -321,7 +320,8 @@ import java.util.List; if (playlist instanceof HlsMediaPlaylist) { Format format = Format.createContainerFormat("0", MimeTypes.APPLICATION_M3U8, null, null, Format.NO_VALUE); - Variant[] variants = new Variant[] {new Variant(playlist.baseUri, format, null)}; + HlsMasterPlaylist.HlsUrl[] variants = new HlsMasterPlaylist.HlsUrl[] { + new HlsMasterPlaylist.HlsUrl(playlist.baseUri, format, null)}; sampleStreamWrappers.add(buildSampleStreamWrapper(C.TRACK_TYPE_DEFAULT, baseUri, variants, null, null)); return sampleStreamWrappers; @@ -330,11 +330,11 @@ import java.util.List; HlsMasterPlaylist masterPlaylist = (HlsMasterPlaylist) playlist; // Build the default stream wrapper. - List selectedVariants = new ArrayList<>(masterPlaylist.variants); - ArrayList definiteVideoVariants = new ArrayList<>(); - ArrayList definiteAudioOnlyVariants = new ArrayList<>(); + List selectedVariants = new ArrayList<>(masterPlaylist.variants); + ArrayList definiteVideoVariants = new ArrayList<>(); + ArrayList definiteAudioOnlyVariants = new ArrayList<>(); for (int i = 0; i < selectedVariants.size(); i++) { - Variant variant = selectedVariants.get(i); + HlsMasterPlaylist.HlsUrl variant = selectedVariants.get(i); if (variant.format.height > 0 || variantHasExplicitCodecWithPrefix(variant, "avc")) { definiteVideoVariants.add(variant); } else if (variantHasExplicitCodecWithPrefix(variant, "mp4a")) { @@ -354,25 +354,25 @@ import java.util.List; // Leave the enabled variants unchanged. They're likely either all video or all audio. } if (!selectedVariants.isEmpty()) { - Variant[] variants = new Variant[selectedVariants.size()]; + HlsMasterPlaylist.HlsUrl[] variants = new HlsMasterPlaylist.HlsUrl[selectedVariants.size()]; selectedVariants.toArray(variants); sampleStreamWrappers.add(buildSampleStreamWrapper(C.TRACK_TYPE_DEFAULT, baseUri, variants, masterPlaylist.muxedAudioFormat, masterPlaylist.muxedCaptionFormat)); } // Build the audio stream wrapper if applicable. - List audioVariants = masterPlaylist.audios; + List audioVariants = masterPlaylist.audios; if (!audioVariants.isEmpty()) { - Variant[] variants = new Variant[audioVariants.size()]; + HlsMasterPlaylist.HlsUrl[] variants = new HlsMasterPlaylist.HlsUrl[audioVariants.size()]; audioVariants.toArray(variants); sampleStreamWrappers.add(buildSampleStreamWrapper(C.TRACK_TYPE_AUDIO, baseUri, variants, null, null)); } // Build the text stream wrapper if applicable. - List subtitleVariants = masterPlaylist.subtitles; + List subtitleVariants = masterPlaylist.subtitles; if (!subtitleVariants.isEmpty()) { - Variant[] variants = new Variant[subtitleVariants.size()]; + HlsMasterPlaylist.HlsUrl[] variants = new HlsMasterPlaylist.HlsUrl[subtitleVariants.size()]; subtitleVariants.toArray(variants); sampleStreamWrappers.add(buildSampleStreamWrapper(C.TRACK_TYPE_TEXT, baseUri, variants, null, null)); @@ -382,7 +382,7 @@ import java.util.List; } private HlsSampleStreamWrapper buildSampleStreamWrapper(int trackType, String baseUri, - Variant[] variants, Format muxedAudioFormat, Format muxedCaptionFormat) { + HlsMasterPlaylist.HlsUrl[] variants, Format muxedAudioFormat, Format muxedCaptionFormat) { DataSource dataSource = dataSourceFactory.createDataSource(); HlsChunkSource defaultChunkSource = new HlsChunkSource(baseUri, variants, dataSource, timestampAdjusterProvider); @@ -391,7 +391,8 @@ import java.util.List; eventDispatcher); } - private static boolean variantHasExplicitCodecWithPrefix(Variant variant, String prefix) { + private static boolean variantHasExplicitCodecWithPrefix(HlsMasterPlaylist.HlsUrl variant, + String prefix) { String codecs = variant.codecs; if (TextUtils.isEmpty(codecs)) { return false; diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java index 3b9fd1c0b9..6d52a5f728 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylist.java @@ -24,15 +24,15 @@ import java.util.List; */ public final class HlsMasterPlaylist extends HlsPlaylist { - public final List variants; - public final List audios; - public final List subtitles; + public final List variants; + public final List audios; + public final List subtitles; public final Format muxedAudioFormat; public final Format muxedCaptionFormat; - public HlsMasterPlaylist(String baseUri, List variants, List audios, - List subtitles, Format muxedAudioFormat, Format muxedCaptionFormat) { + public HlsMasterPlaylist(String baseUri, List variants, List audios, + List subtitles, Format muxedAudioFormat, Format muxedCaptionFormat) { super(baseUri, HlsPlaylist.TYPE_MASTER); this.variants = Collections.unmodifiableList(variants); this.audios = Collections.unmodifiableList(audios); @@ -41,4 +41,21 @@ public final class HlsMasterPlaylist extends HlsPlaylist { this.muxedCaptionFormat = muxedCaptionFormat; } + /** + * Represents a url in an HLS master playlist. + */ + public static final class HlsUrl { + + public final String url; + public final Format format; + public final String codecs; + + public HlsUrl(String url, Format format, String codecs) { + this.url = url; + this.format = format; + this.codecs = codecs; + } + + } + } diff --git a/library/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java b/library/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java index b9afdb9f4a..3bceb0237e 100644 --- a/library/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java +++ b/library/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java @@ -122,9 +122,9 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser variants = new ArrayList<>(); - ArrayList audios = new ArrayList<>(); - ArrayList subtitles = new ArrayList<>(); + ArrayList variants = new ArrayList<>(); + ArrayList audios = new ArrayList<>(); + ArrayList subtitles = new ArrayList<>(); int bitrate = 0; String codecs = null; int width = Format.NO_VALUE; @@ -163,7 +163,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser