From 1ebaaaebd5ba35928efbfd47e04e885fcc516583 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Tue, 10 Mar 2015 19:07:19 +0000 Subject: [PATCH] Parse EXT-X-MEDIA tags with SUBTITLES type. Not yet used by anything. Issue: #151 --- .../exoplayer/hls/HlsMasterPlaylist.java | 4 +- .../android/exoplayer/hls/HlsParserUtil.java | 26 +++++--- .../exoplayer/hls/HlsPlaylistParser.java | 62 ++++++++++++++----- .../android/exoplayer/hls/Subtitle.java | 37 +++++++++++ 4 files changed, 106 insertions(+), 23 deletions(-) create mode 100644 library/src/main/java/com/google/android/exoplayer/hls/Subtitle.java diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsMasterPlaylist.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsMasterPlaylist.java index 0a2b008d2f..15c4784d10 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsMasterPlaylist.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsMasterPlaylist.java @@ -23,10 +23,12 @@ import java.util.List; public final class HlsMasterPlaylist extends HlsPlaylist { public final List variants; + public final List subtitles; - public HlsMasterPlaylist(String baseUri, List variants) { + public HlsMasterPlaylist(String baseUri, List variants, List subtitles) { super(baseUri, HlsPlaylist.TYPE_MASTER); this.variants = variants; + this.subtitles = subtitles; } } diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsParserUtil.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsParserUtil.java index 366bab1178..e5cbe97897 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsParserUtil.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsParserUtil.java @@ -25,6 +25,8 @@ import java.util.regex.Pattern; */ /* package */ class HlsParserUtil { + private static final String BOOLEAN_YES = "YES"; + private HlsParserUtil() {} public static String parseStringAttr(String line, Pattern pattern, String tag) @@ -36,14 +38,6 @@ import java.util.regex.Pattern; throw new ParserException(String.format("Couldn't match %s tag in %s", tag, line)); } - public static String parseOptionalStringAttr(String line, Pattern pattern) { - Matcher matcher = pattern.matcher(line); - if (matcher.find() && matcher.groupCount() == 1) { - return matcher.group(1); - } - return null; - } - public static int parseIntAttr(String line, Pattern pattern, String tag) throws ParserException { return Integer.parseInt(parseStringAttr(line, pattern, tag)); @@ -54,4 +48,20 @@ import java.util.regex.Pattern; return Double.parseDouble(parseStringAttr(line, pattern, tag)); } + public static String parseOptionalStringAttr(String line, Pattern pattern) { + Matcher matcher = pattern.matcher(line); + if (matcher.find() && matcher.groupCount() == 1) { + return matcher.group(1); + } + return null; + } + + public static boolean parseOptionalBoolAttr(String line, Pattern pattern) { + Matcher matcher = pattern.matcher(line); + if (matcher.find() && matcher.groupCount() == 1) { + return BOOLEAN_YES.equals(matcher.group(1)); + } + return false; + } + } 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 3fe3d15fd5..76db4d773e 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 @@ -37,12 +37,8 @@ import java.util.regex.Pattern; public final class HlsPlaylistParser implements NetworkLoadable.Parser { private static final String VERSION_TAG = "#EXT-X-VERSION"; - private static final String STREAM_INF_TAG = "#EXT-X-STREAM-INF"; - private static final String BANDWIDTH_ATTR = "BANDWIDTH"; - private static final String CODECS_ATTR = "CODECS"; - private static final String RESOLUTION_ATTR = "RESOLUTION"; - + private static final String MEDIA_TAG = "#EXT-X-MEDIA"; private static final String DISCONTINUITY_TAG = "#EXT-X-DISCONTINUITY"; private static final String MEDIA_DURATION_TAG = "#EXTINF"; private static final String MEDIA_SEQUENCE_TAG = "#EXT-X-MEDIA-SEQUENCE"; @@ -51,17 +47,29 @@ public final class HlsPlaylistParser implements NetworkLoadable.Parser variants = new ArrayList(); + ArrayList variants = new ArrayList(); + ArrayList subtitles = new ArrayList(); int bandwidth = 0; String[] codecs = null; int width = -1; int height = -1; int variantIndex = 0; + boolean expectingStreamInfUrl = false; String line; while (iterator.hasNext()) { line = iterator.next(); - if (line.startsWith(STREAM_INF_TAG)) { + if (line.startsWith(MEDIA_TAG)) { + 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); + String uri = HlsParserUtil.parseStringAttr(line, URI_ATTR_REGEX, URI_ATTR); + String language = HlsParserUtil.parseOptionalStringAttr(line, LANGUAGE_ATTR_REGEX); + boolean isDefault = HlsParserUtil.parseOptionalBoolAttr(line, DEFAULT_ATTR_REGEX); + boolean autoSelect = HlsParserUtil.parseOptionalBoolAttr(line, AUTOSELECT_ATTR_REGEX); + subtitles.add(new Subtitle(name, uri, language, isDefault, autoSelect)); + } else { + // TODO: Support other types of media tag. + } + } else if (line.startsWith(STREAM_INF_TAG)) { bandwidth = HlsParserUtil.parseIntAttr(line, BANDWIDTH_ATTR_REGEX, BANDWIDTH_ATTR); String codecsString = HlsParserUtil.parseOptionalStringAttr(line, CODECS_ATTR_REGEX); if (codecsString != null) { @@ -145,15 +176,18 @@ public final class HlsPlaylistParser implements NetworkLoadable.Parser