Commit 85a9d563 by christosts Committed by Tofunmi Adigun-Hameed

Fix seeking bug in opus

Fix a bug when seeking in an opus container. The calculations inside
DefaultOggSeeker may overflow a long primitive.

Issue: androidx/media#391

#minor-release

PiperOrigin-RevId: 534128513
(cherry picked from commit 5535cd18ec50862425adadd231778752bfe12ba1)
parent 0e937ff9
...@@ -28,6 +28,7 @@ import com.google.android.exoplayer2.util.Assertions; ...@@ -28,6 +28,7 @@ import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.io.EOFException; import java.io.EOFException;
import java.io.IOException; import java.io.IOException;
import java.math.BigInteger;
/** Seeks in an Ogg stream. */ /** Seeks in an Ogg stream. */
/* package */ final class DefaultOggSeeker implements OggSeeker { /* package */ final class DefaultOggSeeker implements OggSeeker {
...@@ -260,7 +261,12 @@ import java.io.IOException; ...@@ -260,7 +261,12 @@ import java.io.IOException;
long targetGranule = streamReader.convertTimeToGranule(timeUs); long targetGranule = streamReader.convertTimeToGranule(timeUs);
long estimatedPosition = long estimatedPosition =
payloadStartPosition payloadStartPosition
+ (targetGranule * (payloadEndPosition - payloadStartPosition) / totalGranules) // Use BigInteger arithmetic to avoid long overflow
// https://github.com/androidx/media/issues/391
+ BigInteger.valueOf(targetGranule)
.multiply(BigInteger.valueOf(payloadEndPosition - payloadStartPosition))
.divide(BigInteger.valueOf(totalGranules))
.longValue()
- DEFAULT_OFFSET; - DEFAULT_OFFSET;
estimatedPosition = estimatedPosition =
Util.constrainValue(estimatedPosition, payloadStartPosition, payloadEndPosition - 1); Util.constrainValue(estimatedPosition, payloadStartPosition, payloadEndPosition - 1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment