mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2024-12-25 16:42:30 -06:00
237 lines
11 KiB
Java
237 lines
11 KiB
Java
package androidx.media3.exoplayer;
|
|
|
|
import android.os.SystemClock;
|
|
import androidx.media3.common.MediaItem;
|
|
import androidx.media3.common.util.Assertions;
|
|
import androidx.media3.common.util.Util;
|
|
import com.google.common.primitives.Longs;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public final class DefaultLivePlaybackSpeedControl implements LivePlaybackSpeedControl {
|
|
public static final float DEFAULT_FALLBACK_MAX_PLAYBACK_SPEED = 1.03f;
|
|
public static final float DEFAULT_FALLBACK_MIN_PLAYBACK_SPEED = 0.97f;
|
|
public static final long DEFAULT_MAX_LIVE_OFFSET_ERROR_MS_FOR_UNIT_SPEED = 20;
|
|
public static final float DEFAULT_MIN_POSSIBLE_LIVE_OFFSET_SMOOTHING_FACTOR = 0.999f;
|
|
public static final long DEFAULT_MIN_UPDATE_INTERVAL_MS = 1000;
|
|
public static final float DEFAULT_PROPORTIONAL_CONTROL_FACTOR = 0.1f;
|
|
public static final long DEFAULT_TARGET_LIVE_OFFSET_INCREMENT_ON_REBUFFER_MS = 500;
|
|
private float adjustedPlaybackSpeed;
|
|
private long currentTargetLiveOffsetUs;
|
|
private final float fallbackMaxPlaybackSpeed;
|
|
private final float fallbackMinPlaybackSpeed;
|
|
private long idealTargetLiveOffsetUs;
|
|
private long lastPlaybackSpeedUpdateMs;
|
|
private final long maxLiveOffsetErrorUsForUnitSpeed;
|
|
private float maxPlaybackSpeed;
|
|
private long maxTargetLiveOffsetUs;
|
|
private long mediaConfigurationTargetLiveOffsetUs;
|
|
private float minPlaybackSpeed;
|
|
private final float minPossibleLiveOffsetSmoothingFactor;
|
|
private long minTargetLiveOffsetUs;
|
|
private final long minUpdateIntervalMs;
|
|
private final float proportionalControlFactor;
|
|
private long smoothedMinPossibleLiveOffsetDeviationUs;
|
|
private long smoothedMinPossibleLiveOffsetUs;
|
|
private long targetLiveOffsetOverrideUs;
|
|
private final long targetLiveOffsetRebufferDeltaUs;
|
|
|
|
private void maybeResetTargetLiveOffsetUs() {
|
|
long j = this.mediaConfigurationTargetLiveOffsetUs;
|
|
if (j != -9223372036854775807L) {
|
|
long j2 = this.targetLiveOffsetOverrideUs;
|
|
if (j2 != -9223372036854775807L) {
|
|
j = j2;
|
|
}
|
|
long j3 = this.minTargetLiveOffsetUs;
|
|
if (j3 != -9223372036854775807L && j < j3) {
|
|
j = j3;
|
|
}
|
|
long j4 = this.maxTargetLiveOffsetUs;
|
|
if (j4 != -9223372036854775807L && j > j4) {
|
|
j = j4;
|
|
}
|
|
} else {
|
|
j = -9223372036854775807L;
|
|
}
|
|
if (this.idealTargetLiveOffsetUs == j) {
|
|
return;
|
|
}
|
|
this.idealTargetLiveOffsetUs = j;
|
|
this.currentTargetLiveOffsetUs = j;
|
|
this.smoothedMinPossibleLiveOffsetUs = -9223372036854775807L;
|
|
this.smoothedMinPossibleLiveOffsetDeviationUs = -9223372036854775807L;
|
|
this.lastPlaybackSpeedUpdateMs = -9223372036854775807L;
|
|
}
|
|
|
|
private static long smooth(long j, long j2, float f) {
|
|
return (((float) j) * f) + ((1.0f - f) * ((float) j2));
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.LivePlaybackSpeedControl
|
|
public long getTargetLiveOffsetUs() {
|
|
return this.currentTargetLiveOffsetUs;
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.LivePlaybackSpeedControl
|
|
public void notifyRebuffer() {
|
|
long j = this.currentTargetLiveOffsetUs;
|
|
if (j == -9223372036854775807L) {
|
|
return;
|
|
}
|
|
long j2 = j + this.targetLiveOffsetRebufferDeltaUs;
|
|
this.currentTargetLiveOffsetUs = j2;
|
|
long j3 = this.maxTargetLiveOffsetUs;
|
|
if (j3 != -9223372036854775807L && j2 > j3) {
|
|
this.currentTargetLiveOffsetUs = j3;
|
|
}
|
|
this.lastPlaybackSpeedUpdateMs = -9223372036854775807L;
|
|
}
|
|
|
|
/* loaded from: classes2.dex */
|
|
public static final class Builder {
|
|
private float fallbackMinPlaybackSpeed = 0.97f;
|
|
private float fallbackMaxPlaybackSpeed = 1.03f;
|
|
private long minUpdateIntervalMs = 1000;
|
|
private float proportionalControlFactorUs = 1.0E-7f;
|
|
private long maxLiveOffsetErrorUsForUnitSpeed = Util.msToUs(20);
|
|
private long targetLiveOffsetIncrementOnRebufferUs = Util.msToUs(500);
|
|
private float minPossibleLiveOffsetSmoothingFactor = 0.999f;
|
|
|
|
public Builder setFallbackMinPlaybackSpeed(float f) {
|
|
Assertions.checkArgument(0.0f < f && f <= 1.0f);
|
|
this.fallbackMinPlaybackSpeed = f;
|
|
return this;
|
|
}
|
|
|
|
public Builder setFallbackMaxPlaybackSpeed(float f) {
|
|
Assertions.checkArgument(f >= 1.0f);
|
|
this.fallbackMaxPlaybackSpeed = f;
|
|
return this;
|
|
}
|
|
|
|
public Builder setMinUpdateIntervalMs(long j) {
|
|
Assertions.checkArgument(j > 0);
|
|
this.minUpdateIntervalMs = j;
|
|
return this;
|
|
}
|
|
|
|
public Builder setProportionalControlFactor(float f) {
|
|
Assertions.checkArgument(f > 0.0f);
|
|
this.proportionalControlFactorUs = f / 1000000.0f;
|
|
return this;
|
|
}
|
|
|
|
public Builder setMaxLiveOffsetErrorMsForUnitSpeed(long j) {
|
|
Assertions.checkArgument(j > 0);
|
|
this.maxLiveOffsetErrorUsForUnitSpeed = Util.msToUs(j);
|
|
return this;
|
|
}
|
|
|
|
public Builder setTargetLiveOffsetIncrementOnRebufferMs(long j) {
|
|
Assertions.checkArgument(j >= 0);
|
|
this.targetLiveOffsetIncrementOnRebufferUs = Util.msToUs(j);
|
|
return this;
|
|
}
|
|
|
|
public Builder setMinPossibleLiveOffsetSmoothingFactor(float f) {
|
|
Assertions.checkArgument(f >= 0.0f && f < 1.0f);
|
|
this.minPossibleLiveOffsetSmoothingFactor = f;
|
|
return this;
|
|
}
|
|
|
|
public DefaultLivePlaybackSpeedControl build() {
|
|
return new DefaultLivePlaybackSpeedControl(this.fallbackMinPlaybackSpeed, this.fallbackMaxPlaybackSpeed, this.minUpdateIntervalMs, this.proportionalControlFactorUs, this.maxLiveOffsetErrorUsForUnitSpeed, this.targetLiveOffsetIncrementOnRebufferUs, this.minPossibleLiveOffsetSmoothingFactor);
|
|
}
|
|
}
|
|
|
|
private DefaultLivePlaybackSpeedControl(float f, float f2, long j, float f3, long j2, long j3, float f4) {
|
|
this.fallbackMinPlaybackSpeed = f;
|
|
this.fallbackMaxPlaybackSpeed = f2;
|
|
this.minUpdateIntervalMs = j;
|
|
this.proportionalControlFactor = f3;
|
|
this.maxLiveOffsetErrorUsForUnitSpeed = j2;
|
|
this.targetLiveOffsetRebufferDeltaUs = j3;
|
|
this.minPossibleLiveOffsetSmoothingFactor = f4;
|
|
this.mediaConfigurationTargetLiveOffsetUs = -9223372036854775807L;
|
|
this.targetLiveOffsetOverrideUs = -9223372036854775807L;
|
|
this.minTargetLiveOffsetUs = -9223372036854775807L;
|
|
this.maxTargetLiveOffsetUs = -9223372036854775807L;
|
|
this.minPlaybackSpeed = f;
|
|
this.maxPlaybackSpeed = f2;
|
|
this.adjustedPlaybackSpeed = 1.0f;
|
|
this.lastPlaybackSpeedUpdateMs = -9223372036854775807L;
|
|
this.idealTargetLiveOffsetUs = -9223372036854775807L;
|
|
this.currentTargetLiveOffsetUs = -9223372036854775807L;
|
|
this.smoothedMinPossibleLiveOffsetUs = -9223372036854775807L;
|
|
this.smoothedMinPossibleLiveOffsetDeviationUs = -9223372036854775807L;
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.LivePlaybackSpeedControl
|
|
public void setLiveConfiguration(MediaItem.LiveConfiguration liveConfiguration) {
|
|
this.mediaConfigurationTargetLiveOffsetUs = Util.msToUs(liveConfiguration.targetOffsetMs);
|
|
this.minTargetLiveOffsetUs = Util.msToUs(liveConfiguration.minOffsetMs);
|
|
this.maxTargetLiveOffsetUs = Util.msToUs(liveConfiguration.maxOffsetMs);
|
|
this.minPlaybackSpeed = liveConfiguration.minPlaybackSpeed != -3.4028235E38f ? liveConfiguration.minPlaybackSpeed : this.fallbackMinPlaybackSpeed;
|
|
float f = liveConfiguration.maxPlaybackSpeed != -3.4028235E38f ? liveConfiguration.maxPlaybackSpeed : this.fallbackMaxPlaybackSpeed;
|
|
this.maxPlaybackSpeed = f;
|
|
if (this.minPlaybackSpeed == 1.0f && f == 1.0f) {
|
|
this.mediaConfigurationTargetLiveOffsetUs = -9223372036854775807L;
|
|
}
|
|
maybeResetTargetLiveOffsetUs();
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.LivePlaybackSpeedControl
|
|
public void setTargetLiveOffsetOverrideUs(long j) {
|
|
this.targetLiveOffsetOverrideUs = j;
|
|
maybeResetTargetLiveOffsetUs();
|
|
}
|
|
|
|
@Override // androidx.media3.exoplayer.LivePlaybackSpeedControl
|
|
public float getAdjustedPlaybackSpeed(long j, long j2) {
|
|
if (this.mediaConfigurationTargetLiveOffsetUs == -9223372036854775807L) {
|
|
return 1.0f;
|
|
}
|
|
updateSmoothedMinPossibleLiveOffsetUs(j, j2);
|
|
if (this.lastPlaybackSpeedUpdateMs != -9223372036854775807L && SystemClock.elapsedRealtime() - this.lastPlaybackSpeedUpdateMs < this.minUpdateIntervalMs) {
|
|
return this.adjustedPlaybackSpeed;
|
|
}
|
|
this.lastPlaybackSpeedUpdateMs = SystemClock.elapsedRealtime();
|
|
adjustTargetLiveOffsetUs(j);
|
|
long j3 = j - this.currentTargetLiveOffsetUs;
|
|
if (Math.abs(j3) < this.maxLiveOffsetErrorUsForUnitSpeed) {
|
|
this.adjustedPlaybackSpeed = 1.0f;
|
|
} else {
|
|
this.adjustedPlaybackSpeed = Util.constrainValue((this.proportionalControlFactor * ((float) j3)) + 1.0f, this.minPlaybackSpeed, this.maxPlaybackSpeed);
|
|
}
|
|
return this.adjustedPlaybackSpeed;
|
|
}
|
|
|
|
private void updateSmoothedMinPossibleLiveOffsetUs(long j, long j2) {
|
|
long j3 = j - j2;
|
|
long j4 = this.smoothedMinPossibleLiveOffsetUs;
|
|
if (j4 == -9223372036854775807L) {
|
|
this.smoothedMinPossibleLiveOffsetUs = j3;
|
|
this.smoothedMinPossibleLiveOffsetDeviationUs = 0L;
|
|
} else {
|
|
long max = Math.max(j3, smooth(j4, j3, this.minPossibleLiveOffsetSmoothingFactor));
|
|
this.smoothedMinPossibleLiveOffsetUs = max;
|
|
this.smoothedMinPossibleLiveOffsetDeviationUs = smooth(this.smoothedMinPossibleLiveOffsetDeviationUs, Math.abs(j3 - max), this.minPossibleLiveOffsetSmoothingFactor);
|
|
}
|
|
}
|
|
|
|
private void adjustTargetLiveOffsetUs(long j) {
|
|
long j2 = this.smoothedMinPossibleLiveOffsetUs + (this.smoothedMinPossibleLiveOffsetDeviationUs * 3);
|
|
if (this.currentTargetLiveOffsetUs > j2) {
|
|
float msToUs = (float) Util.msToUs(this.minUpdateIntervalMs);
|
|
this.currentTargetLiveOffsetUs = Longs.max(j2, this.idealTargetLiveOffsetUs, this.currentTargetLiveOffsetUs - (((this.adjustedPlaybackSpeed - 1.0f) * msToUs) + ((this.maxPlaybackSpeed - 1.0f) * msToUs)));
|
|
return;
|
|
}
|
|
long constrainValue = Util.constrainValue(j - (Math.max(0.0f, this.adjustedPlaybackSpeed - 1.0f) / this.proportionalControlFactor), this.currentTargetLiveOffsetUs, j2);
|
|
this.currentTargetLiveOffsetUs = constrainValue;
|
|
long j3 = this.maxTargetLiveOffsetUs;
|
|
if (j3 == -9223372036854775807L || constrainValue <= j3) {
|
|
return;
|
|
}
|
|
this.currentTargetLiveOffsetUs = j3;
|
|
}
|
|
}
|