diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 90cd7722ac..5bc7b29b77 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -12,6 +12,8 @@ ([#2092](https://github.com/google/ExoPlayer/issues/2092)). * Fix parsing of H265 short term reference picture sets ([#10316](https://github.com/google/ExoPlayer/issues/10316)). + * Fix parsing of bitrates from `esds` boxes + ([#10381](https://github.com/google/ExoPlayer/issues/10381)). * Metadata: * `MetadataRenderer` can now be configured to render metadata as soon as they are available. Create an instance with diff --git a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java index b26366dae3..4543d32819 100644 --- a/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java +++ b/libraries/extractor/src/main/java/androidx/media3/extractor/mp4/AtomParsers.java @@ -45,6 +45,7 @@ import androidx.media3.extractor.OpusUtil; import androidx.media3.extractor.metadata.mp4.SmtaMetadataEntry; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; +import com.google.common.primitives.Ints; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; @@ -1303,7 +1304,9 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; } if (esdsData != null) { - formatBuilder.setAverageBitrate(esdsData.bitrate).setPeakBitrate(esdsData.peakBitrate); + formatBuilder + .setAverageBitrate(Ints.saturatedCast(esdsData.bitrate)) + .setPeakBitrate(Ints.saturatedCast(esdsData.peakBitrate)); } out.format = formatBuilder.build(); @@ -1609,7 +1612,9 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; .setLanguage(language); if (esdsData != null) { - formatBuilder.setAverageBitrate(esdsData.bitrate).setPeakBitrate(esdsData.peakBitrate); + formatBuilder + .setAverageBitrate(Ints.saturatedCast(esdsData.bitrate)) + .setPeakBitrate(Ints.saturatedCast(esdsData.peakBitrate)); } out.format = formatBuilder.build(); @@ -1683,8 +1688,8 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; } parent.skipBytes(4); - int peakBitrate = parent.readUnsignedIntToInt(); - int bitrate = parent.readUnsignedIntToInt(); + long peakBitrate = parent.readUnsignedInt(); + long bitrate = parent.readUnsignedInt(); // Start of the DecoderSpecificInfo. parent.skipBytes(1); // DecoderSpecificInfo tag @@ -1943,14 +1948,14 @@ import org.checkerframework.checker.nullness.compatqual.NullableType; private static final class EsdsData { private final @NullableType String mimeType; private final byte @NullableType [] initializationData; - private final int bitrate; - private final int peakBitrate; + private final long bitrate; + private final long peakBitrate; public EsdsData( @NullableType String mimeType, byte @NullableType [] initializationData, - int bitrate, - int peakBitrate) { + long bitrate, + long peakBitrate) { this.mimeType = mimeType; this.initializationData = initializationData; this.bitrate = bitrate;