From 12ed18c74cac660433a6ed796fd26e423adfcc19 Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Thu, 14 Feb 2019 15:42:16 +0000 Subject: [PATCH] Add encryption information to initialization segments PiperOrigin-RevId: 233953493 --- .../source/hls/playlist/HlsMediaPlaylist.java | 13 ++++- .../hls/playlist/HlsPlaylistParser.java | 34 +++++++---- .../playlist/HlsMediaPlaylistParserTest.java | 57 +++++++++++++++++++ 3 files changed, 90 insertions(+), 14 deletions(-) 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 81d4e7a818..5200de048b 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 @@ -88,8 +88,15 @@ public final class HlsMediaPlaylist extends HlsPlaylist { * @param uri See {@link #url}. * @param byterangeOffset See {@link #byterangeOffset}. * @param byterangeLength See {@link #byterangeLength}. + * @param fullSegmentEncryptionKeyUri See {@link #fullSegmentEncryptionKeyUri}. + * @param encryptionIV See {@link #encryptionIV}. */ - public Segment(String uri, long byterangeOffset, long byterangeLength) { + public Segment( + String uri, + long byterangeOffset, + long byterangeLength, + String fullSegmentEncryptionKeyUri, + String encryptionIV) { this( uri, /* initializationSegment= */ null, @@ -98,8 +105,8 @@ public final class HlsMediaPlaylist extends HlsPlaylist { /* relativeDiscontinuitySequence= */ -1, /* relativeStartTimeUs= */ C.TIME_UNSET, /* drmInitData= */ null, - /* fullSegmentEncryptionKeyUri= */ null, - /* encryptionIV= */ null, + fullSegmentEncryptionKeyUri, + encryptionIV, byterangeOffset, byterangeLength, /* hasGapTag= */ false); 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 26e1e1a9a7..58d1597d95 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 @@ -455,8 +455,8 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser currentSchemeDatas = new TreeMap<>(); String encryptionScheme = null; DrmInitData cachedDrmInitData = null; @@ -489,7 +489,19 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser segments = playlist.segments; + Segment initSegment1 = segments.get(0).initializationSegment; + assertThat(initSegment1.fullSegmentEncryptionKeyUri) + .isEqualTo("https://priv.example.com/key.php?r=2680"); + assertThat(initSegment1.encryptionIV).isEqualTo("0x1566B"); + Segment initSegment2 = segments.get(1).initializationSegment; + assertThat(initSegment2.fullSegmentEncryptionKeyUri).isNull(); + assertThat(initSegment2.encryptionIV).isNull(); + } + + @Test + public void testEncryptedMapTagWithNoIvFails() throws IOException { + Uri playlistUri = Uri.parse("https://example.com/test3.m3u8"); + String playlistString = + "#EXTM3U\n" + + "#EXT-X-VERSION:3\n" + + "#EXT-X-TARGETDURATION:5\n" + + "#EXT-X-MEDIA-SEQUENCE:10\n" + + "#EXT-X-KEY:METHOD=AES-128," + + "URI=\"https://priv.example.com/key.php?r=2680\"\n" + + "#EXT-X-MAP:URI=\"init1.ts\"" + + "#EXTINF:5.005,\n" + + "02/00/32.ts\n"; + InputStream inputStream = new ByteArrayInputStream(Util.getUtf8Bytes(playlistString)); + + try { + new HlsPlaylistParser().parse(playlistUri, inputStream); + fail(); + } catch (ParserException e) { + // Expected because the initialization segment does not have a defined initialization vector, + // although it is affected by an EXT-X-KEY tag. + } + } + @Test public void testMasterPlaylistAttributeInheritance() throws IOException { Uri playlistUri = Uri.parse("https://example.com/test3.m3u8");