Skip to content

Commit

Permalink
Fix MP4 parser issue in reading bitrates from esds boxes.
Browse files Browse the repository at this point in the history
As per MP4 spec, bitrates in esds boxes can be a 32 bit number which doesn't fits in Java int type, so now reading it as a long value. Our class for holding media format, only allows bitrates value to be an int as we don't expect the bitrates to be greater than or equal to 2^31. So we're limiting the values for bitrates to Integer.MAX_VALUE.

#minor-release

PiperOrigin-RevId: 458423162
(cherry picked from commit 9e10286)
  • Loading branch information
rohitjoins committed Jul 1, 2022
1 parent 3709e90 commit 3d79536
Showing 1 changed file with 13 additions and 8 deletions.
Expand Up @@ -45,6 +45,7 @@
import com.google.android.exoplayer2.video.HevcConfig;
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;
Expand Down Expand Up @@ -1303,7 +1304,9 @@ private static void parseVideoSampleEntry(
}

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();
Expand Down Expand Up @@ -1609,7 +1612,9 @@ private static void parseAudioSampleEntry(
.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();
Expand Down Expand Up @@ -1683,8 +1688,8 @@ private static EsdsData parseEsdsFromParent(ParsableByteArray parent, int positi
}

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
Expand Down Expand Up @@ -1943,14 +1948,14 @@ public StsdData(int numberOfEntries) {
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;
Expand Down

0 comments on commit 3d79536

Please sign in to comment.