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