diff --git a/RELEASENOTES.md b/RELEASENOTES.md index db545efa7e..bc04f4302d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -50,6 +50,8 @@ implementation details of an `Extractor` you must first call `Extractor.getUnderlyingInstance`. * Audio: + * Add support for 24/32-bit big endian PCM in MP4 and Matroska, and parse + PCM encoding for `lpcm` in MP4. * Audio Offload: * Add `AudioSink.getFormatOffloadSupport(Format)` that retrieves level of offload support the sink can provide for the format through a diff --git a/libraries/common/src/main/java/androidx/media3/common/C.java b/libraries/common/src/main/java/androidx/media3/common/C.java index 87d8cd8064..661b485746 100644 --- a/libraries/common/src/main/java/androidx/media3/common/C.java +++ b/libraries/common/src/main/java/androidx/media3/common/C.java @@ -166,10 +166,12 @@ public final class C { /** * Represents an audio encoding, or an invalid or unset value. One of {@link Format#NO_VALUE}, * {@link #ENCODING_INVALID}, {@link #ENCODING_PCM_8BIT}, {@link #ENCODING_PCM_16BIT}, {@link - * #ENCODING_PCM_16BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_24BIT}, {@link #ENCODING_PCM_32BIT}, - * {@link #ENCODING_PCM_FLOAT}, {@link #ENCODING_MP3}, {@link #ENCODING_AC3}, {@link - * #ENCODING_E_AC3}, {@link #ENCODING_E_AC3_JOC}, {@link #ENCODING_AC4}, {@link #ENCODING_DTS}, - * {@link #ENCODING_DTS_HD}, {@link #ENCODING_DOLBY_TRUEHD} or {@link #ENCODING_OPUS}. + * #ENCODING_PCM_16BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_24BIT}, {@link + * #ENCODING_PCM_24BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_32BIT}, {@link + * #ENCODING_PCM_32BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_FLOAT}, {@link #ENCODING_MP3}, {@link + * #ENCODING_AC3}, {@link #ENCODING_E_AC3}, {@link #ENCODING_E_AC3_JOC}, {@link #ENCODING_AC4}, + * {@link #ENCODING_DTS}, {@link #ENCODING_DTS_HD}, {@link #ENCODING_DOLBY_TRUEHD} or {@link + * #ENCODING_OPUS}. */ @UnstableApi @Documented @@ -182,7 +184,9 @@ public final class C { ENCODING_PCM_16BIT, ENCODING_PCM_16BIT_BIG_ENDIAN, ENCODING_PCM_24BIT, + ENCODING_PCM_24BIT_BIG_ENDIAN, ENCODING_PCM_32BIT, + ENCODING_PCM_32BIT_BIG_ENDIAN, ENCODING_PCM_FLOAT, ENCODING_MP3, ENCODING_AAC_LC, @@ -206,8 +210,9 @@ public final class C { /** * Represents a PCM audio encoding, or an invalid or unset value. One of {@link Format#NO_VALUE}, * {@link #ENCODING_INVALID}, {@link #ENCODING_PCM_8BIT}, {@link #ENCODING_PCM_16BIT}, {@link - * #ENCODING_PCM_16BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_24BIT}, {@link #ENCODING_PCM_32BIT}, - * {@link #ENCODING_PCM_FLOAT}. + * #ENCODING_PCM_16BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_24BIT}, {@link + * #ENCODING_PCM_24BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_32BIT}, {@link + * #ENCODING_PCM_32BIT_BIG_ENDIAN}, {@link #ENCODING_PCM_FLOAT}. */ @UnstableApi @Documented @@ -220,7 +225,9 @@ public final class C { ENCODING_PCM_16BIT, ENCODING_PCM_16BIT_BIG_ENDIAN, ENCODING_PCM_24BIT, + ENCODING_PCM_24BIT_BIG_ENDIAN, ENCODING_PCM_32BIT, + ENCODING_PCM_32BIT_BIG_ENDIAN, ENCODING_PCM_FLOAT }) public @interface PcmEncoding {} @@ -240,9 +247,15 @@ public final class C { /** PCM encoding with 24 bits per sample. */ @UnstableApi public static final int ENCODING_PCM_24BIT = 0x20000000; + /** Like {@link #ENCODING_PCM_24BIT} but with the bytes in big endian order. */ + @UnstableApi public static final int ENCODING_PCM_24BIT_BIG_ENDIAN = 0x50000000; + /** PCM encoding with 32 bits per sample. */ @UnstableApi public static final int ENCODING_PCM_32BIT = 0x30000000; + /** Like {@link #ENCODING_PCM_32BIT} but with the bytes in big endian order. */ + @UnstableApi public static final int ENCODING_PCM_32BIT_BIG_ENDIAN = 0x60000000; + /** See {@link AudioFormat#ENCODING_PCM_FLOAT}. */ @UnstableApi public static final int ENCODING_PCM_FLOAT = AudioFormat.ENCODING_PCM_FLOAT; diff --git a/libraries/common/src/main/java/androidx/media3/common/audio/ToInt16PcmAudioProcessor.java b/libraries/common/src/main/java/androidx/media3/common/audio/ToInt16PcmAudioProcessor.java index 94d594141c..ccd72b1e4c 100644 --- a/libraries/common/src/main/java/androidx/media3/common/audio/ToInt16PcmAudioProcessor.java +++ b/libraries/common/src/main/java/androidx/media3/common/audio/ToInt16PcmAudioProcessor.java @@ -31,7 +31,9 @@ import java.nio.ByteBuffer; *
Equivalent to {@link MediaFormat#KEY_PCM_ENCODING}, except it allows additional values * defined by {@link C.PcmEncoding}, including {@link C#ENCODING_PCM_16BIT_BIG_ENDIAN}, {@link - * C#ENCODING_PCM_24BIT}, and {@link C#ENCODING_PCM_32BIT}. + * C#ENCODING_PCM_24BIT}, {@link C#ENCODING_PCM_24BIT_BIG_ENDIAN}, {@link C#ENCODING_PCM_32BIT} + * and {@link C#ENCODING_PCM_32BIT_BIG_ENDIAN}. */ // The constant value must not be changed, because it's also set by the framework MediaParser API. public static final String KEY_PCM_ENCODING_EXTENDED = "exo-pcm-encoding-int"; @@ -445,6 +446,8 @@ public final class MediaFormatUtil { break; case Format.NO_VALUE: case C.ENCODING_PCM_16BIT_BIG_ENDIAN: + case C.ENCODING_PCM_24BIT_BIG_ENDIAN: + case C.ENCODING_PCM_32BIT_BIG_ENDIAN: default: // No matching value. Do nothing. return; diff --git a/libraries/common/src/main/java/androidx/media3/common/util/Util.java b/libraries/common/src/main/java/androidx/media3/common/util/Util.java index e66d409478..6d53487af0 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/Util.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/Util.java @@ -1863,7 +1863,9 @@ public final class Util { || encoding == C.ENCODING_PCM_16BIT || encoding == C.ENCODING_PCM_16BIT_BIG_ENDIAN || encoding == C.ENCODING_PCM_24BIT + || encoding == C.ENCODING_PCM_24BIT_BIG_ENDIAN || encoding == C.ENCODING_PCM_32BIT + || encoding == C.ENCODING_PCM_32BIT_BIG_ENDIAN || encoding == C.ENCODING_PCM_FLOAT; } @@ -1876,7 +1878,9 @@ public final class Util { @UnstableApi public static boolean isEncodingHighResolutionPcm(@C.PcmEncoding int encoding) { return encoding == C.ENCODING_PCM_24BIT + || encoding == C.ENCODING_PCM_24BIT_BIG_ENDIAN || encoding == C.ENCODING_PCM_32BIT + || encoding == C.ENCODING_PCM_32BIT_BIG_ENDIAN || encoding == C.ENCODING_PCM_FLOAT; } @@ -1992,8 +1996,10 @@ public final class Util { case C.ENCODING_PCM_16BIT_BIG_ENDIAN: return channelCount * 2; case C.ENCODING_PCM_24BIT: + case C.ENCODING_PCM_24BIT_BIG_ENDIAN: return channelCount * 3; case C.ENCODING_PCM_32BIT: + case C.ENCODING_PCM_32BIT_BIG_ENDIAN: case C.ENCODING_PCM_FLOAT: return channelCount * 4; case C.ENCODING_INVALID: diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java index dddcacbc02..73fa7805a8 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioSink.java @@ -1726,7 +1726,9 @@ public final class DefaultAudioSink implements AudioSink { case C.ENCODING_PCM_16BIT: case C.ENCODING_PCM_16BIT_BIG_ENDIAN: case C.ENCODING_PCM_24BIT: + case C.ENCODING_PCM_24BIT_BIG_ENDIAN: case C.ENCODING_PCM_32BIT: + case C.ENCODING_PCM_32BIT_BIG_ENDIAN: case C.ENCODING_PCM_8BIT: case C.ENCODING_PCM_FLOAT: case C.ENCODING_AAC_ER_BSAC: diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java index 9819ab0380..5e178f0523 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/DefaultAudioTrackBufferSizeProvider.java @@ -282,7 +282,9 @@ public class DefaultAudioTrackBufferSizeProvider case C.ENCODING_PCM_16BIT: case C.ENCODING_PCM_16BIT_BIG_ENDIAN: case C.ENCODING_PCM_24BIT: + case C.ENCODING_PCM_24BIT_BIG_ENDIAN: case C.ENCODING_PCM_32BIT: + case C.ENCODING_PCM_32BIT_BIG_ENDIAN: case C.ENCODING_PCM_8BIT: case C.ENCODING_PCM_FLOAT: case C.ENCODING_AAC_ER_BSAC: diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessor.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessor.java index 7531daaaad..9faaae4df1 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessor.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/audio/ToFloatPcmAudioProcessor.java @@ -29,7 +29,9 @@ import java.nio.ByteBuffer; * *