mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2024-12-27 09:32:27 -06:00
80 lines
2.8 KiB
Java
80 lines
2.8 KiB
Java
|
package androidx.media3.extractor;
|
||
|
|
||
|
import androidx.media3.extractor.SeekMap;
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
public class ConstantBitrateSeekMap implements SeekMap {
|
||
|
private final boolean allowSeeksIfLengthUnknown;
|
||
|
private final int bitrate;
|
||
|
private final long dataSize;
|
||
|
private final long durationUs;
|
||
|
private final long firstFrameBytePosition;
|
||
|
private final int frameSize;
|
||
|
private final long inputLength;
|
||
|
|
||
|
@Override // androidx.media3.extractor.SeekMap
|
||
|
public long getDurationUs() {
|
||
|
return this.durationUs;
|
||
|
}
|
||
|
|
||
|
@Override // androidx.media3.extractor.SeekMap
|
||
|
public boolean isSeekable() {
|
||
|
return this.dataSize != -1 || this.allowSeeksIfLengthUnknown;
|
||
|
}
|
||
|
|
||
|
public ConstantBitrateSeekMap(long j, long j2, int i, int i2) {
|
||
|
this(j, j2, i, i2, false);
|
||
|
}
|
||
|
|
||
|
public ConstantBitrateSeekMap(long j, long j2, int i, int i2, boolean z) {
|
||
|
this.inputLength = j;
|
||
|
this.firstFrameBytePosition = j2;
|
||
|
this.frameSize = i2 == -1 ? 1 : i2;
|
||
|
this.bitrate = i;
|
||
|
this.allowSeeksIfLengthUnknown = z;
|
||
|
if (j == -1) {
|
||
|
this.dataSize = -1L;
|
||
|
this.durationUs = -9223372036854775807L;
|
||
|
} else {
|
||
|
this.dataSize = j - j2;
|
||
|
this.durationUs = getTimeUsAtPosition(j, j2, i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override // androidx.media3.extractor.SeekMap
|
||
|
public SeekMap.SeekPoints getSeekPoints(long j) {
|
||
|
if (this.dataSize == -1 && !this.allowSeeksIfLengthUnknown) {
|
||
|
return new SeekMap.SeekPoints(new SeekPoint(0L, this.firstFrameBytePosition));
|
||
|
}
|
||
|
long framePositionForTimeUs = getFramePositionForTimeUs(j);
|
||
|
long timeUsAtPosition = getTimeUsAtPosition(framePositionForTimeUs);
|
||
|
SeekPoint seekPoint = new SeekPoint(timeUsAtPosition, framePositionForTimeUs);
|
||
|
if (this.dataSize != -1 && timeUsAtPosition < j) {
|
||
|
int i = this.frameSize;
|
||
|
if (i + framePositionForTimeUs < this.inputLength) {
|
||
|
long j2 = framePositionForTimeUs + i;
|
||
|
return new SeekMap.SeekPoints(seekPoint, new SeekPoint(getTimeUsAtPosition(j2), j2));
|
||
|
}
|
||
|
}
|
||
|
return new SeekMap.SeekPoints(seekPoint);
|
||
|
}
|
||
|
|
||
|
public long getTimeUsAtPosition(long j) {
|
||
|
return getTimeUsAtPosition(j, this.firstFrameBytePosition, this.bitrate);
|
||
|
}
|
||
|
|
||
|
private static long getTimeUsAtPosition(long j, long j2, int i) {
|
||
|
return (Math.max(0L, j - j2) * 8000000) / i;
|
||
|
}
|
||
|
|
||
|
private long getFramePositionForTimeUs(long j) {
|
||
|
int i = this.frameSize;
|
||
|
long j2 = (((j * this.bitrate) / 8000000) / i) * i;
|
||
|
long j3 = this.dataSize;
|
||
|
if (j3 != -1) {
|
||
|
j2 = Math.min(j2, j3 - i);
|
||
|
}
|
||
|
return this.firstFrameBytePosition + Math.max(j2, 0L);
|
||
|
}
|
||
|
}
|