From 91b0d55fb308043c9ff845b39dbcd738803a98d0 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 27 Apr 2022 16:05:33 +0100 Subject: [PATCH] Fix calculations that may lose precision compared to their target type PiperOrigin-RevId: 444861268 --- .../main/java/com/google/android/exoplayer2/util/Util.java | 2 +- .../google/android/exoplayer2/extractor/amr/AmrExtractor.java | 3 ++- .../android/exoplayer2/extractor/mkv/MatroskaExtractor.java | 4 ++-- .../google/android/exoplayer2/extractor/mp3/VbriSeeker.java | 2 +- .../google/android/exoplayer2/extractor/ts/AdtsExtractor.java | 3 ++- .../android/exoplayer2/testutil/FakeAdaptiveDataSet.java | 3 ++- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java b/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java index 962fd48233..4cd3bd5a4e 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/Util.java @@ -1243,7 +1243,7 @@ public final class Util { long time = dateTime.getTimeInMillis(); if (timezoneShift != 0) { - time -= timezoneShift * 60000; + time -= timezoneShift * 60000L; } return time; diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/amr/AmrExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/amr/AmrExtractor.java index f556a2e247..d313b073ee 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/amr/AmrExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/amr/AmrExtractor.java @@ -412,6 +412,7 @@ public final class AmrExtractor implements Extractor { * @return The stream bitrate. */ private static int getBitrateFromFrameSize(int frameSize, long durationUsPerFrame) { - return (int) ((frameSize * C.BITS_PER_BYTE * C.MICROS_PER_SECOND) / durationUsPerFrame); + return (int) + ((frameSize * ((long) C.BITS_PER_BYTE) * C.MICROS_PER_SECOND) / durationUsPerFrame); } } diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java index 86710a5f3c..eb60880cda 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java @@ -1740,9 +1740,9 @@ public class MatroskaExtractor implements Extractor { checkArgument(timeUs != C.TIME_UNSET); byte[] timeCodeData; int hours = (int) (timeUs / (3600 * C.MICROS_PER_SECOND)); - timeUs -= (hours * 3600 * C.MICROS_PER_SECOND); + timeUs -= (hours * 3600L * C.MICROS_PER_SECOND); int minutes = (int) (timeUs / (60 * C.MICROS_PER_SECOND)); - timeUs -= (minutes * 60 * C.MICROS_PER_SECOND); + timeUs -= (minutes * 60L * C.MICROS_PER_SECOND); int seconds = (int) (timeUs / C.MICROS_PER_SECOND); timeUs -= (seconds * C.MICROS_PER_SECOND); int lastValue = (int) (timeUs / lastTimecodeValueScalingFactor); diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/VbriSeeker.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/VbriSeeker.java index f2532863c4..0ee5fc94e2 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/VbriSeeker.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp3/VbriSeeker.java @@ -89,7 +89,7 @@ import com.google.android.exoplayer2.util.Util; default: return null; } - position += segmentSize * scale; + position += segmentSize * ((long) scale); } if (inputLength != C.LENGTH_UNSET && inputLength != position) { Log.w(TAG, "VBRI data size mismatch: " + inputLength + ", " + position); diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java index 827a72c1b9..e704f2ff89 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/ts/AdtsExtractor.java @@ -363,6 +363,7 @@ public final class AdtsExtractor implements Extractor { * @return The stream bitrate. */ private static int getBitrateFromFrameSize(int frameSize, long durationUsPerFrame) { - return (int) ((frameSize * C.BITS_PER_BYTE * C.MICROS_PER_SECOND) / durationUsPerFrame); + return (int) + ((frameSize * ((long) C.BITS_PER_BYTE) * C.MICROS_PER_SECOND) / durationUsPerFrame); } } diff --git a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeAdaptiveDataSet.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeAdaptiveDataSet.java index 1ed0f4696f..fd48d4de6e 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeAdaptiveDataSet.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/FakeAdaptiveDataSet.java @@ -142,7 +142,8 @@ public final class FakeAdaptiveDataSet extends FakeDataSet { for (int i = 0; i < trackGroup.length; i++) { String uri = getUri(i); Format format = trackGroup.getFormat(i); - double avgChunkLength = format.bitrate * chunkDurationUs / (8 * C.MICROS_PER_SECOND); + double avgChunkLength = + format.bitrate * chunkDurationUs / ((double) (8 * C.MICROS_PER_SECOND)); FakeData newData = this.newData(uri); for (int j = 0; j < fullChunks; j++) { newData.appendReadData((int) (avgChunkLength * bitrateFactors[j]));