diff --git a/library/src/main/java/com/google/android/exoplayer/Format.java b/library/src/main/java/com/google/android/exoplayer/Format.java index 0d8883238c..c96d84572f 100644 --- a/library/src/main/java/com/google/android/exoplayer/Format.java +++ b/library/src/main/java/com/google/android/exoplayer/Format.java @@ -60,6 +60,11 @@ public final class Format implements Parcelable { * Indicates that the track must be displayed. Only applies to text tracks. */ public static final int SELECTION_FLAG_FORCED = 2; + /** + * Indicates that the player may choose to play the track in absence of an explicit user + * preference. + */ + public static final int SELECTION_FLAG_AUTOSELECT = 4; /** * A value for {@link #subsampleOffsetUs} to indicate that subsample timestamps are relative to @@ -391,6 +396,7 @@ public final class Format implements Parcelable { String codecs = this.codecs == null ? manifestFormat.codecs : this.codecs; int bitrate = this.bitrate == NO_VALUE ? manifestFormat.bitrate : this.bitrate; float frameRate = this.frameRate == NO_VALUE ? manifestFormat.frameRate : this.frameRate; + int selectionFlags = this.selectionFlags | manifestFormat.selectionFlags; String language = this.language == null ? manifestFormat.language : this.language; DrmInitData drmInitData = (preferManifestDrmInitData && manifestFormat.drmInitData != null) || this.drmInitData == null ? manifestFormat.drmInitData : this.drmInitData; diff --git a/library/src/main/java/com/google/android/exoplayer/hls/HlsTrackStreamWrapper.java b/library/src/main/java/com/google/android/exoplayer/hls/HlsTrackStreamWrapper.java index d6c529eff3..3c73a97ee6 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/HlsTrackStreamWrapper.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/HlsTrackStreamWrapper.java @@ -510,7 +510,8 @@ import java.util.List; return sampleFormat; } return sampleFormat.copyWithContainerInfo(containerFormat.id, containerFormat.bitrate, - containerFormat.width, containerFormat.height, 0, containerFormat.language); + containerFormat.width, containerFormat.height, containerFormat.selectionFlags, + containerFormat.language); } private void maybeStartLoading() { diff --git a/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsParserUtil.java b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsParserUtil.java index 5e23c55f19..bfd61531ac 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsParserUtil.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsParserUtil.java @@ -25,6 +25,9 @@ import java.util.regex.Pattern; */ /* package */ final class HlsParserUtil { + private static final String BOOLEAN_TRUE_VALUE = "YES"; + private static final String BOOLEAN_FALSE_VALUE = "NO"; + private HlsParserUtil() {} public static String parseStringAttr(String line, Pattern pattern, String tag) @@ -54,4 +57,17 @@ import java.util.regex.Pattern; return null; } + public static boolean parseBooleanAttribute(String line, Pattern pattern, boolean defaultValue) { + Matcher matcher = pattern.matcher(line); + if (matcher.find()) { + return matcher.group(1).equals(BOOLEAN_TRUE_VALUE); + } + return defaultValue; + } + + public static Pattern compileBooleanAttrPattern(String attribute) { + return Pattern.compile(attribute + "=(" + BOOLEAN_FALSE_VALUE + "|" + BOOLEAN_TRUE_VALUE + ")"); + + } + } diff --git a/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsPlaylistParser.java b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsPlaylistParser.java index 24556b59d3..e96596cd12 100644 --- a/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsPlaylistParser.java +++ b/library/src/main/java/com/google/android/exoplayer/hls/playlist/HlsPlaylistParser.java @@ -62,6 +62,9 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser