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 f3cc43b8a1d..df054c7253f 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 @@ -320,7 +320,8 @@ public void getNextChunk(HlsMediaChunk previous, long playbackPositionUs, long l } DataSpec initDataSpec = null; - Segment initSegment = mediaPlaylist.initializationSegment; + Segment initSegment = + mediaPlaylist.initializationSegments.get(segment.relativeDiscontinuitySequence); if (initSegment != null) { Uri initSegmentUri = UriUtil.resolveToUri(mediaPlaylist.baseUri, initSegment.url); initDataSpec = new DataSpec(initSegmentUri, initSegment.byterangeOffset, diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.java index 3d14283e866..79a927281d6 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/offline/HlsDownloader.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.source.hls.offline; import android.net.Uri; +import android.util.SparseArray; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.offline.DownloaderConstructorHelper; import com.google.android.exoplayer2.offline.SegmentDownloader; @@ -90,9 +91,9 @@ protected List getSegments(DataSource dataSource, HlsMasterPlaylist man continue; } - HlsMediaPlaylist.Segment initSegment = mediaPlaylist.initializationSegment; - if (initSegment != null) { - addSegment(segments, mediaPlaylist, initSegment, encryptionKeyUris); + SparseArray initSegments = mediaPlaylist.initializationSegments; + for (int i = 0; i < initSegments.size(); i++) { + addSegment(segments, mediaPlaylist, initSegments.valueAt(i), encryptionKeyUris); } List hlsSegments = mediaPlaylist.segments; diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java index 9a9517e2d44..40368fcff45 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsMediaPlaylist.java @@ -17,6 +17,7 @@ import android.support.annotation.IntDef; import android.support.annotation.NonNull; +import android.util.SparseArray; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.drm.DrmInitData; import java.lang.annotation.Retention; @@ -183,9 +184,9 @@ public int compareTo(@NonNull Long relativeStartTimeUs) { */ public final DrmInitData drmInitData; /** - * The initialization segment, as defined by #EXT-X-MAP. + * The initialization segments, as defined by #EXT-X-MAP. */ - public final Segment initializationSegment; + public final SparseArray initializationSegments; /** * The list of segments in the playlist. */ @@ -210,7 +211,7 @@ public int compareTo(@NonNull Long relativeStartTimeUs) { * @param hasEndTag See {@link #hasEndTag}. * @param hasProgramDateTime See {@link #hasProgramDateTime}. * @param drmInitData See {@link #drmInitData}. - * @param initializationSegment See {@link #initializationSegment}. + * @param initializationSegments See {@link #initializationSegments}. * @param segments See {@link #segments}. */ public HlsMediaPlaylist( @@ -228,7 +229,7 @@ public HlsMediaPlaylist( boolean hasEndTag, boolean hasProgramDateTime, DrmInitData drmInitData, - Segment initializationSegment, + SparseArray initializationSegments, List segments) { super(baseUri, tags); this.playlistType = playlistType; @@ -242,7 +243,7 @@ public HlsMediaPlaylist( this.hasEndTag = hasEndTag; this.hasProgramDateTime = hasProgramDateTime; this.drmInitData = drmInitData; - this.initializationSegment = initializationSegment; + this.initializationSegments = initializationSegments; this.segments = Collections.unmodifiableList(segments); if (!segments.isEmpty()) { Segment last = segments.get(segments.size() - 1); @@ -293,7 +294,7 @@ public long getEndTimeUs() { public HlsMediaPlaylist copyWith(long startTimeUs, int discontinuitySequence) { return new HlsMediaPlaylist(playlistType, baseUri, tags, startOffsetUs, startTimeUs, true, discontinuitySequence, mediaSequence, version, targetDurationUs, hasIndependentSegmentsTag, - hasEndTag, hasProgramDateTime, drmInitData, initializationSegment, segments); + hasEndTag, hasProgramDateTime, drmInitData, initializationSegments, segments); } /** @@ -308,7 +309,7 @@ public HlsMediaPlaylist copyWithEndTag() { } return new HlsMediaPlaylist(playlistType, baseUri, tags, startOffsetUs, startTimeUs, hasDiscontinuitySequence, discontinuitySequence, mediaSequence, version, targetDurationUs, - hasIndependentSegmentsTag, true, hasProgramDateTime, drmInitData, initializationSegment, + hasIndependentSegmentsTag, true, hasProgramDateTime, drmInitData, initializationSegments, segments); } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java index acd0746e720..07b9f9a5e69 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java @@ -17,6 +17,7 @@ import android.net.Uri; import android.util.Base64; +import android.util.SparseArray; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.ParserException; @@ -345,7 +346,7 @@ private static HlsMediaPlaylist parseMediaPlaylist(LineIterator iterator, String long targetDurationUs = C.TIME_UNSET; boolean hasIndependentSegmentsTag = false; boolean hasEndTag = false; - Segment initializationSegment = null; + SparseArray initializationSegments = new SparseArray<>(); List segments = new ArrayList<>(); List tags = new ArrayList<>(); @@ -392,7 +393,8 @@ private static HlsMediaPlaylist parseMediaPlaylist(LineIterator iterator, String segmentByteRangeOffset = Long.parseLong(splitByteRange[1]); } } - initializationSegment = new Segment(uri, segmentByteRangeOffset, segmentByteRangeLength); + initializationSegments.put(relativeDiscontinuitySequence, + new Segment(uri, segmentByteRangeOffset, segmentByteRangeLength)); segmentByteRangeOffset = 0; segmentByteRangeLength = C.LENGTH_UNSET; } else if (line.startsWith(TAG_TARGET_DURATION)) { @@ -493,7 +495,7 @@ private static HlsMediaPlaylist parseMediaPlaylist(LineIterator iterator, String return new HlsMediaPlaylist(playlistType, baseUri, tags, startOffsetUs, playlistStartTimeUs, hasDiscontinuitySequence, playlistDiscontinuitySequence, mediaSequence, version, targetDurationUs, hasIndependentSegmentsTag, hasEndTag, playlistStartTimeUs != 0, - drmInitData, initializationSegment, segments); + drmInitData, initializationSegments, segments); } private static SchemeData parseWidevineSchemeData(String line, String keyFormat)