Commit f90d0a26 by Oliver Woodman

Merge pull request #9023 from DolbyLaboratories:dev-v2-multicodecs

PiperOrigin-RevId: 379440699
parents 0b97f089 d176891c
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
* Fix `IncorrectContextUseViolation` strict mode warning on Android 11 * Fix `IncorrectContextUseViolation` strict mode warning on Android 11
([#8246](https://github.com/google/ExoPlayer/pull/8246)). ([#8246](https://github.com/google/ExoPlayer/pull/8246)).
* Audio: * Audio:
* Fix track selection for E-AC-3 streams.
* Use `AudioTrack.isDirectPlaybackSupported` to check for encoded audio * Use `AudioTrack.isDirectPlaybackSupported` to check for encoded audio
passthrough capability from API 29 onwards, instead of using the HDMI passthrough capability from API 29 onwards, instead of using the HDMI
audio plug intent audio plug intent
......
...@@ -91,6 +91,13 @@ public final class Ac3Util { ...@@ -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 <a href="https://mp4ra.org/#/codecs">MP4RA registered codec
* types</a>.
*/
public static final String E_AC_3_CODEC_STRING = "ec+3";
/** Maximum rate for an AC-3 audio stream, in bytes per second. */ /** 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; 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. */ /** Maximum rate for an E-AC-3 audio stream, in bytes per second. */
......
...@@ -20,6 +20,7 @@ import androidx.annotation.Nullable; ...@@ -20,6 +20,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.audio.AacUtil; import com.google.android.exoplayer2.audio.AacUtil;
import com.google.android.exoplayer2.audio.Ac3Util;
import com.google.common.base.Ascii; import com.google.common.base.Ascii;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.regex.Matcher; import java.util.regex.Matcher;
...@@ -375,7 +376,7 @@ public final class MimeTypes { ...@@ -375,7 +376,7 @@ public final class MimeTypes {
return MimeTypes.AUDIO_AC3; return MimeTypes.AUDIO_AC3;
} else if (codec.startsWith("ec-3") || codec.startsWith("dec3")) { } else if (codec.startsWith("ec-3") || codec.startsWith("dec3")) {
return MimeTypes.AUDIO_E_AC3; 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; return MimeTypes.AUDIO_E_AC3_JOC;
} else if (codec.startsWith("ac-4") || codec.startsWith("dac4")) { } else if (codec.startsWith("ac-4") || codec.startsWith("dac4")) {
return MimeTypes.AUDIO_AC4; return MimeTypes.AUDIO_AC4;
......
...@@ -24,6 +24,7 @@ import androidx.annotation.Nullable; ...@@ -24,6 +24,7 @@ import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.ParserException; 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;
import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData;
import com.google.android.exoplayer2.extractor.mp4.PsshAtomUtil; import com.google.android.exoplayer2.extractor.mp4.PsshAtomUtil;
...@@ -765,6 +766,9 @@ public class DashManifestParser extends DefaultHandler ...@@ -765,6 +766,9 @@ public class DashManifestParser extends DefaultHandler
@Nullable String sampleMimeType = getSampleMimeType(containerMimeType, codecs); @Nullable String sampleMimeType = getSampleMimeType(containerMimeType, codecs);
if (MimeTypes.AUDIO_E_AC3.equals(sampleMimeType)) { if (MimeTypes.AUDIO_E_AC3.equals(sampleMimeType)) {
sampleMimeType = parseEac3SupplementalProperties(supplementalProperties); 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.SelectionFlags int selectionFlags = parseSelectionFlagsFromRoleDescriptors(roleDescriptors);
@C.RoleFlags int roleFlags = parseRoleFlagsFromRoleDescriptors(roleDescriptors); @C.RoleFlags int roleFlags = parseRoleFlagsFromRoleDescriptors(roleDescriptors);
......
...@@ -26,6 +26,7 @@ import androidx.annotation.Nullable; ...@@ -26,6 +26,7 @@ import androidx.annotation.Nullable;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.ParserException; 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;
import com.google.android.exoplayer2.drm.DrmInitData.SchemeData; import com.google.android.exoplayer2.drm.DrmInitData.SchemeData;
import com.google.android.exoplayer2.extractor.mp4.PsshAtomUtil; import com.google.android.exoplayer2.extractor.mp4.PsshAtomUtil;
...@@ -515,6 +516,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli ...@@ -515,6 +516,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
formatBuilder.setChannelCount(channelCount); formatBuilder.setChannelCount(channelCount);
if (MimeTypes.AUDIO_E_AC3.equals(sampleMimeType) && channelsString.endsWith("/JOC")) { if (MimeTypes.AUDIO_E_AC3.equals(sampleMimeType) && channelsString.endsWith("/JOC")) {
sampleMimeType = MimeTypes.AUDIO_E_AC3_JOC; sampleMimeType = MimeTypes.AUDIO_E_AC3_JOC;
formatBuilder.setCodecs(Ac3Util.E_AC_3_CODEC_STRING);
} }
} }
formatBuilder.setSampleMimeType(sampleMimeType); formatBuilder.setSampleMimeType(sampleMimeType);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment