From 6dde1e67d3a3462cf6a40d290a76bcf32147652e Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Thu, 24 Jan 2019 18:12:27 +0000 Subject: [PATCH] Parse CHANNELS attribute from EXT-X-MEDIA PiperOrigin-RevId: 230743198 --- RELEASENOTES.md | 3 ++- .../hls/playlist/HlsPlaylistParser.java | 11 ++++++++- .../playlist/HlsMasterPlaylistParserTest.java | 23 +++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 6afe9bda35..91e3c1127b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -2,7 +2,8 @@ ### dev-v2 (not yet released) ### -* Increase `minSdkVersion` to 16 (Jellybean). +* HLS: + * Parse CHANNELS attribute from EXT-X-MEDIA. * Support for playing spherical videos on Daydream. * Improve decoder re-use between playbacks. TODO: Write and link a blog post here ([#2826](https://github.com/google/ExoPlayer/issues/2826)). 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 7dba626e70..9e13d6fa0f 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 @@ -101,6 +101,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser variableDefinitions) { + String channelsString = parseOptionalStringAttr(line, REGEX_CHANNELS, variableDefinitions); + return channelsString != null + ? Integer.parseInt(Util.splitAtFirst(channelsString, "/")[0]) + : Format.NO_VALUE; + } + private static @Nullable SchemeData parsePlayReadySchemeData( String line, Map variableDefinitions) throws ParserException { String keyFormatVersions = diff --git a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylistParserTest.java b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylistParserTest.java index 9701171ce9..8b69ba0db2 100644 --- a/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylistParserTest.java +++ b/library/hls/src/test/java/com/google/android/exoplayer2/source/hls/playlist/HlsMasterPlaylistParserTest.java @@ -81,6 +81,18 @@ public class HlsMasterPlaylistParserTest { + "CODECS=\"mp4a.40.2,avc1.66.30\",RESOLUTION=304x128\n" + "http://example.com/low.m3u8\n"; + private static final String PLAYLIST_WITH_CHANNELS_ATTRIBUTE = + " #EXTM3U \n" + + "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audio\",CHANNELS=\"6\",NAME=\"Eng6\"," + + "URI=\"something.m3u8\"\n" + + "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audio\",CHANNELS=\"2/6\",NAME=\"Eng26\"," + + "URI=\"something2.m3u8\"\n" + + "#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audio\",NAME=\"Eng\"," + + "URI=\"something3.m3u8\"\n" + + "#EXT-X-STREAM-INF:BANDWIDTH=1280000," + + "CODECS=\"mp4a.40.2,avc1.66.30\",AUDIO=\"audio\",RESOLUTION=304x128\n" + + "http://example.com/low.m3u8\n"; + private static final String PLAYLIST_WITHOUT_CC = " #EXTM3U \n" + "#EXT-X-MEDIA:TYPE=CLOSED-CAPTIONS," @@ -216,6 +228,17 @@ public class HlsMasterPlaylistParserTest { assertThat(closedCaptionFormat.language).isEqualTo("es"); } + @Test + public void testPlaylistWithChannelsAttribute() throws IOException { + HlsMasterPlaylist playlist = + parseMasterPlaylist(PLAYLIST_URI, PLAYLIST_WITH_CHANNELS_ATTRIBUTE); + List audios = playlist.audios; + assertThat(audios).hasSize(3); + assertThat(audios.get(0).format.channelCount).isEqualTo(6); + assertThat(audios.get(1).format.channelCount).isEqualTo(2); + assertThat(audios.get(2).format.channelCount).isEqualTo(Format.NO_VALUE); + } + @Test public void testPlaylistWithoutClosedCaptions() throws IOException { HlsMasterPlaylist playlist = parseMasterPlaylist(PLAYLIST_URI, PLAYLIST_WITHOUT_CC);