diff --git a/demo/src/main/java/com/google/android/exoplayer/demo/Samples.java b/demo/src/main/java/com/google/android/exoplayer/demo/Samples.java index 8b1336142c..ee2c3f1cb6 100644 --- a/demo/src/main/java/com/google/android/exoplayer/demo/Samples.java +++ b/demo/src/main/java/com/google/android/exoplayer/demo/Samples.java @@ -138,6 +138,9 @@ package com.google.android.exoplayer.demo; new Sample("Apple master playlist", "uid:hls:applemaster", "https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/" + "bipbop_4x3_variant.m3u8", DemoUtil.TYPE_HLS_MASTER, false, true), + new Sample("Apple master playlist advanced", "uid:hls:applemasteradvanced", + "https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_16x9/" + + "bipbop_16x9_variant.m3u8", DemoUtil.TYPE_HLS_MASTER, false, true), new Sample("Apple single media playlist", "uid:hls:applesinglemedia", "https://devimages.apple.com.edgekey.net/streaming/examples/bipbop_4x3/gear1/" + "prog_index.m3u8", DemoUtil.TYPE_HLS_MEDIA, false, true), 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 06cf2a68d2..b58350024f 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 @@ -239,7 +239,8 @@ public class HlsChunkSource { } else { dataSource = upstreamDataSource; } - DataSpec dataSpec = new DataSpec(chunkUri, 0, C.LENGTH_UNBOUNDED, null); + DataSpec dataSpec = new DataSpec(chunkUri, segment.byterangeOffset, segment.byterangeLength, + null); // Configure the extractor that will read the chunk. TsExtractor extractor; diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylist.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylist.java index 7e8136cab3..29df5562df 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylist.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylist.java @@ -35,9 +35,12 @@ public final class HlsMediaPlaylist { public final String encryptionMethod; public final String encryptionKeyUri; public final String encryptionIV; + public final int byterangeOffset; + public final int byterangeLength; public Segment(String uri, double durationSecs, boolean discontinuity, long startTimeUs, - String encryptionMethod, String encryptionKeyUri, String encryptionIV) { + String encryptionMethod, String encryptionKeyUri, String encryptionIV, + int byterangeOffset, int byterangeLength) { this.url = uri; this.durationSecs = durationSecs; this.discontinuity = discontinuity; @@ -45,6 +48,8 @@ public final class HlsMediaPlaylist { this.encryptionMethod = encryptionMethod; this.encryptionKeyUri = encryptionKeyUri; this.encryptionIV = encryptionIV; + this.byterangeOffset = byterangeOffset; + this.byterangeLength = byterangeLength; } @Override diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylistParser.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylistParser.java index 319bf15485..abae63301a 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylistParser.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsMediaPlaylistParser.java @@ -15,6 +15,7 @@ */ package com.google.android.exoplayer.hls; +import com.google.android.exoplayer.C; import com.google.android.exoplayer.hls.HlsMediaPlaylist.Segment; import com.google.android.exoplayer.util.ManifestParser; @@ -41,6 +42,7 @@ public final class HlsMediaPlaylistParser implements ManifestParser 1) { + segmentByterangeOffset = Integer.parseInt(splitByteRange[1]); + } } else if (line.equals(DISCONTINUITY_TAG)) { segmentDiscontinuity = true; } else if (!line.startsWith("#")) { segmentMediaSequence++; + if (segmentByterangeLength == C.LENGTH_UNBOUNDED) { + segmentByterangeOffset = 0; + } segments.add(new Segment(line, segmentDurationSecs, segmentDiscontinuity, segmentStartTimeUs, segmentEncryptionMethod, segmentEncryptionKeyUri, - segmentEncryptionIV)); + segmentEncryptionIV, segmentByterangeOffset, segmentByterangeLength)); segmentStartTimeUs += (long) (segmentDurationSecs * 1000000); segmentDiscontinuity = false; segmentDurationSecs = 0.0; + if (segmentByterangeLength != C.LENGTH_UNBOUNDED) { + segmentByterangeOffset += segmentByterangeLength; + } + segmentByterangeLength = C.LENGTH_UNBOUNDED; } else if (line.equals(ENDLIST_TAG)) { live = false; break;