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

PiperOrigin-RevId: 379440699
This commit is contained in:
Oliver Woodman 2021-06-15 18:39:14 +01:00
commit f90d0a26a4
5 changed files with 16 additions and 1 deletions

View File

@ -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

View File

@ -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. */

View File

@ -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 {
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;

View File

@ -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
@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);

View File

@ -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
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);