From eb282639c59e9c5ba5390bb6d5403a822bd35cbd Mon Sep 17 00:00:00 2001 From: Rik Heijdens Date: Tue, 20 Oct 2015 14:51:31 -0400 Subject: [PATCH 1/6] Parse NAME label from HLS Master Playlist The HlsPlaylistParser now parses the "NAME" property from the MasterHlsPlaylist and saves it in the Variant --- .../com/google/android/exoplayer/hls/HlsChunkSource.java | 2 +- .../google/android/exoplayer/hls/HlsPlaylistParser.java | 8 ++++++-- .../java/com/google/android/exoplayer/hls/Variant.java | 4 +++- 3 files changed, 10 insertions(+), 4 deletions(-) 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 f70d1900f6..6f91fb1ce2 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 @@ -184,7 +184,7 @@ public class HlsChunkSource { playlistParser = new HlsPlaylistParser(); if (playlist.type == HlsPlaylist.TYPE_MEDIA) { - variants = new Variant[] {new Variant(0, playlistUrl, 0, null, -1, -1)}; + variants = new Variant[] {new Variant(0, null, playlistUrl, 0, null, -1, -1)}; variantPlaylists = new HlsMediaPlaylist[1]; variantLastPlaylistLoadTimesMs = new long[1]; variantBlacklistTimes = new long[1]; diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java index 8db6eb2484..6fd4ca8f16 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java @@ -143,6 +143,7 @@ public final class HlsPlaylistParser implements UriLoadable.Parser String codecs = null; int width = -1; int height = -1; + String name = null; boolean expectingStreamInfUrl = false; String line; @@ -152,18 +153,20 @@ public final class HlsPlaylistParser implements UriLoadable.Parser String type = HlsParserUtil.parseStringAttr(line, TYPE_ATTR_REGEX, TYPE_ATTR); if (SUBTITLES_TYPE.equals(type)) { // We assume all subtitles belong to the same group. - String name = HlsParserUtil.parseStringAttr(line, NAME_ATTR_REGEX, NAME_ATTR); + name = HlsParserUtil.parseStringAttr(line, NAME_ATTR_REGEX, NAME_ATTR); String uri = HlsParserUtil.parseStringAttr(line, URI_ATTR_REGEX, URI_ATTR); String language = HlsParserUtil.parseOptionalStringAttr(line, LANGUAGE_ATTR_REGEX); boolean isDefault = HlsParserUtil.parseOptionalBooleanAttr(line, DEFAULT_ATTR_REGEX); boolean autoSelect = HlsParserUtil.parseOptionalBooleanAttr(line, AUTOSELECT_ATTR_REGEX); subtitles.add(new Subtitle(name, uri, language, isDefault, autoSelect)); + name = null; } else { // TODO: Support other types of media tag. } } else if (line.startsWith(STREAM_INF_TAG)) { bitrate = HlsParserUtil.parseIntAttr(line, BANDWIDTH_ATTR_REGEX, BANDWIDTH_ATTR); codecs = HlsParserUtil.parseOptionalStringAttr(line, CODECS_ATTR_REGEX); + name = HlsParserUtil.parseStringAttr(line, NAME_ATTR_REGEX, NAME_ATTR); String resolutionString = HlsParserUtil.parseOptionalStringAttr(line, RESOLUTION_ATTR_REGEX); if (resolutionString != null) { @@ -184,9 +187,10 @@ public final class HlsPlaylistParser implements UriLoadable.Parser } expectingStreamInfUrl = true; } else if (!line.startsWith("#") && expectingStreamInfUrl) { - variants.add(new Variant(variants.size(), line, bitrate, codecs, width, height)); + variants.add(new Variant(variants.size(), name, line, bitrate, codecs, width, height)); bitrate = 0; codecs = null; + name = null; width = -1; height = -1; expectingStreamInfUrl = false; diff --git a/library/src/main/java/com/google/android/exoplayer/hls/Variant.java b/library/src/main/java/com/google/android/exoplayer/hls/Variant.java index 61d6fb54ae..b80553b679 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/Variant.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/Variant.java @@ -26,9 +26,11 @@ public final class Variant implements FormatWrapper { public final String url; public final Format format; + public final String name; - public Variant(int index, String url, int bitrate, String codecs, int width, int height) { + public Variant(int index, String name, String url, int bitrate, String codecs, int width, int height) { this.url = url; + this.name = name; format = new Format(Integer.toString(index), MimeTypes.APPLICATION_M3U8, width, height, -1, -1, -1, bitrate, null, codecs); } From 10f3be6d509428c4bc9f4a1610dda0271dbdcdd8 Mon Sep 17 00:00:00 2001 From: Rik Heijdens Date: Tue, 20 Oct 2015 15:01:44 -0400 Subject: [PATCH 2/6] Hls NAME parsing changes - NAME is optionial now in the Hls Manifest - Use the id field in Format to store the NAME instead of a field in Variant to mimic DASH's behaviour (see the DASH Id PR, which is not merged yet at this time). --- .../android/exoplayer/hls/HlsPlaylistParser.java | 2 +- .../com/google/android/exoplayer/hls/Variant.java | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java index 6fd4ca8f16..8e517d9469 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java @@ -166,7 +166,7 @@ public final class HlsPlaylistParser implements UriLoadable.Parser } else if (line.startsWith(STREAM_INF_TAG)) { bitrate = HlsParserUtil.parseIntAttr(line, BANDWIDTH_ATTR_REGEX, BANDWIDTH_ATTR); codecs = HlsParserUtil.parseOptionalStringAttr(line, CODECS_ATTR_REGEX); - name = HlsParserUtil.parseStringAttr(line, NAME_ATTR_REGEX, NAME_ATTR); + name = HlsParserUtil.parseOptionalStringAttr(line, NAME_ATTR_REGEX); String resolutionString = HlsParserUtil.parseOptionalStringAttr(line, RESOLUTION_ATTR_REGEX); if (resolutionString != null) { diff --git a/library/src/main/java/com/google/android/exoplayer/hls/Variant.java b/library/src/main/java/com/google/android/exoplayer/hls/Variant.java index b80553b679..665d1fbf57 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/Variant.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/Variant.java @@ -26,13 +26,16 @@ public final class Variant implements FormatWrapper { public final String url; public final Format format; - public final String name; public Variant(int index, String name, String url, int bitrate, String codecs, int width, int height) { this.url = url; - this.name = name; - format = new Format(Integer.toString(index), MimeTypes.APPLICATION_M3U8, width, height, -1, -1, - -1, bitrate, null, codecs); + if (name != null) { + format = new Format(name, MimeTypes.APPLICATION_M3U8, width, height, -1, -1, + -1, bitrate, null, codecs); + } else { + format = new Format(Integer.toString(index), MimeTypes.APPLICATION_M3U8, width, height, -1, -1, + -1, bitrate, null, codecs); + } } @Override From 1c1f5af5d2830932c770a712d7a608369f706ddf Mon Sep 17 00:00:00 2001 From: Rik Heijdens Date: Wed, 28 Oct 2015 11:02:44 -0400 Subject: [PATCH 3/6] Changed the use of the name variable --- .../com/google/android/exoplayer/hls/HlsPlaylistParser.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java index 8e517d9469..87d3fb4eff 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsPlaylistParser.java @@ -153,13 +153,12 @@ public final class HlsPlaylistParser implements UriLoadable.Parser String type = HlsParserUtil.parseStringAttr(line, TYPE_ATTR_REGEX, TYPE_ATTR); if (SUBTITLES_TYPE.equals(type)) { // We assume all subtitles belong to the same group. - name = HlsParserUtil.parseStringAttr(line, NAME_ATTR_REGEX, NAME_ATTR); + String subtitleName = HlsParserUtil.parseStringAttr(line, NAME_ATTR_REGEX, NAME_ATTR); String uri = HlsParserUtil.parseStringAttr(line, URI_ATTR_REGEX, URI_ATTR); String language = HlsParserUtil.parseOptionalStringAttr(line, LANGUAGE_ATTR_REGEX); boolean isDefault = HlsParserUtil.parseOptionalBooleanAttr(line, DEFAULT_ATTR_REGEX); boolean autoSelect = HlsParserUtil.parseOptionalBooleanAttr(line, AUTOSELECT_ATTR_REGEX); - subtitles.add(new Subtitle(name, uri, language, isDefault, autoSelect)); - name = null; + subtitles.add(new Subtitle(subtitleName, uri, language, isDefault, autoSelect)); } else { // TODO: Support other types of media tag. } From 022c1ad6ddf1b5b968772811105e20c591476f4c Mon Sep 17 00:00:00 2001 From: Rik Heijdens Date: Wed, 28 Oct 2015 11:10:58 -0400 Subject: [PATCH 4/6] Store HLS trackname in the Variant class instead of Format class --- .../com/google/android/exoplayer/hls/Variant.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/hls/Variant.java b/library/src/main/java/com/google/android/exoplayer/hls/Variant.java index 665d1fbf57..0ddd4a9631 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/Variant.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/Variant.java @@ -26,16 +26,13 @@ public final class Variant implements FormatWrapper { public final String url; public final Format format; + public final String name; public Variant(int index, String name, String url, int bitrate, String codecs, int width, int height) { this.url = url; - if (name != null) { - format = new Format(name, MimeTypes.APPLICATION_M3U8, width, height, -1, -1, - -1, bitrate, null, codecs); - } else { - format = new Format(Integer.toString(index), MimeTypes.APPLICATION_M3U8, width, height, -1, -1, - -1, bitrate, null, codecs); - } + this.name = name; + format = new Format(Integer.toString(index), MimeTypes.APPLICATION_M3U8, width, height, -1, -1, + -1, bitrate, null, codecs); } @Override @@ -43,4 +40,8 @@ public final class Variant implements FormatWrapper { return format; } + public String getName() { + return name; + } + } From 4a77d1a44e6eb0883625fda1575a831a5fec8b2b Mon Sep 17 00:00:00 2001 From: Rik Heijdens Date: Wed, 28 Oct 2015 11:14:05 -0400 Subject: [PATCH 5/6] Remove unnecessary getter --- .../main/java/com/google/android/exoplayer/hls/Variant.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/hls/Variant.java b/library/src/main/java/com/google/android/exoplayer/hls/Variant.java index 0ddd4a9631..80846d0011 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/Variant.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/Variant.java @@ -40,8 +40,4 @@ public final class Variant implements FormatWrapper { return format; } - public String getName() { - return name; - } - } From d49d3e2cd3f92d87737eed9b5c4a35224a0bca6f Mon Sep 17 00:00:00 2001 From: Rik Heijdens Date: Wed, 28 Oct 2015 16:57:29 -0400 Subject: [PATCH 6/6] Changed formatName to something more concise And fixed the indentation --- .../main/java/com/google/android/exoplayer/hls/Variant.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/hls/Variant.java b/library/src/main/java/com/google/android/exoplayer/hls/Variant.java index 80846d0011..b34ace69fb 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/Variant.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/Variant.java @@ -31,8 +31,9 @@ public final class Variant implements FormatWrapper { public Variant(int index, String name, String url, int bitrate, String codecs, int width, int height) { this.url = url; this.name = name; - format = new Format(Integer.toString(index), MimeTypes.APPLICATION_M3U8, width, height, -1, -1, - -1, bitrate, null, codecs); + String formatName = name != null ? name : Integer.toString(index); + format = new Format(formatName, MimeTypes.APPLICATION_M3U8, width, height, -1, -1, + -1, bitrate, null, codecs); } @Override