diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 31745c9c75..c22e1e648d 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -45,6 +45,7 @@
* Fix `IncorrectContextUseViolation` strict mode warning on Android 11
([#8246](https://github.com/google/ExoPlayer/pull/8246)).
* Audio:
+ * Fix track selection for E-AC-3 streams.
* Use `AudioTrack.isDirectPlaybackSupported` to check for encoded audio
passthrough capability from API 29 onwards, instead of using the HDMI
audio plug intent
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java b/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java
index f3dfb20f9b..c799166f6b 100644
--- a/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java
+++ b/library/common/src/main/java/com/google/android/exoplayer2/audio/Ac3Util.java
@@ -91,6 +91,13 @@ public final class Ac3Util {
}
}
+ /**
+ * A non-standard codec string for E-AC-3. Use of this constant allows for disambiguation between
+ * regular AC-3 ("ec-3") and E-AC-3 ("ec+3") streams from the codec string alone. The standard is
+ * to use "ec-3" for both, as per the MP4RA registered codec
+ * types.
+ */
+ public static final String E_AC_3_CODEC_STRING = "ec+3";
/** Maximum rate for an AC-3 audio stream, in bytes per second. */
public static final int AC3_MAX_RATE_BYTES_PER_SECOND = 640 * 1000 / 8;
/** Maximum rate for an E-AC-3 audio stream, in bytes per second. */
diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java
index ba7fb0090b..066cdc9ea4 100644
--- a/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java
+++ b/library/common/src/main/java/com/google/android/exoplayer2/util/MimeTypes.java
@@ -20,6 +20,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.audio.AacUtil;
+import com.google.android.exoplayer2.audio.Ac3Util;
import com.google.common.base.Ascii;
import java.util.ArrayList;
import java.util.regex.Matcher;
@@ -375,7 +376,7 @@ public final class MimeTypes {
return MimeTypes.AUDIO_AC3;
} else if (codec.startsWith("ec-3") || codec.startsWith("dec3")) {
return MimeTypes.AUDIO_E_AC3;
- } else if (codec.startsWith("ec+3")) {
+ } else if (codec.startsWith(Ac3Util.E_AC_3_CODEC_STRING)) {
return MimeTypes.AUDIO_E_AC3_JOC;
} else if (codec.startsWith("ac-4") || codec.startsWith("dac4")) {
return MimeTypes.AUDIO_AC4;
diff --git a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java
index 09b3894744..958d9359b3 100644
--- a/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java
+++ b/library/dash/src/main/java/com/google/android/exoplayer2/source/dash/manifest/DashManifestParser.java
@@ -24,6 +24,7 @@ import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.ParserException;
+import com.google.android.exoplayer2.audio.Ac3Util;
import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.drm.DrmInitData.SchemeData;
import com.google.android.exoplayer2.extractor.mp4.PsshAtomUtil;
@@ -765,6 +766,9 @@ public class DashManifestParser extends DefaultHandler
@Nullable String sampleMimeType = getSampleMimeType(containerMimeType, codecs);
if (MimeTypes.AUDIO_E_AC3.equals(sampleMimeType)) {
sampleMimeType = parseEac3SupplementalProperties(supplementalProperties);
+ if (MimeTypes.AUDIO_E_AC3_JOC.equals(sampleMimeType)) {
+ codecs = Ac3Util.E_AC_3_CODEC_STRING;
+ }
}
@C.SelectionFlags int selectionFlags = parseSelectionFlagsFromRoleDescriptors(roleDescriptors);
@C.RoleFlags int roleFlags = parseRoleFlagsFromRoleDescriptors(roleDescriptors);
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 c8d16efe43..d567852011 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
@@ -26,6 +26,7 @@ import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.ParserException;
+import com.google.android.exoplayer2.audio.Ac3Util;
import com.google.android.exoplayer2.drm.DrmInitData;
import com.google.android.exoplayer2.drm.DrmInitData.SchemeData;
import com.google.android.exoplayer2.extractor.mp4.PsshAtomUtil;
@@ -515,6 +516,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser