Rabbit-R1/switch port/java/sources/androidx/media3/exoplayer/util/SntpClient.java

252 lines
8.9 KiB
Java
Raw Normal View History

2024-05-21 16:08:36 -05:00
package androidx.media3.exoplayer.util;
import android.os.SystemClock;
import androidx.media3.exoplayer.upstream.Loader;
import com.google.common.base.Ascii;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;
import java.util.ConcurrentModificationException;
/* loaded from: classes2.dex */
public final class SntpClient {
public static final String DEFAULT_NTP_HOST = "time.android.com";
private static final int NTP_LEAP_NOSYNC = 3;
private static final int NTP_MODE_BROADCAST = 5;
private static final int NTP_MODE_CLIENT = 3;
private static final int NTP_MODE_SERVER = 4;
private static final int NTP_PACKET_SIZE = 48;
private static final int NTP_PORT = 123;
private static final int NTP_STRATUM_DEATH = 0;
private static final int NTP_STRATUM_MAX = 15;
private static final int NTP_VERSION = 3;
private static final long OFFSET_1900_TO_1970 = 2208988800L;
private static final int ORIGINATE_TIME_OFFSET = 24;
private static final int RECEIVE_TIME_OFFSET = 32;
private static final int TIMEOUT_MS = 10000;
private static final int TRANSMIT_TIME_OFFSET = 40;
private static long elapsedRealtimeOffsetMs = 0;
private static boolean isInitialized = false;
private static String ntpHost = "time.android.com";
private static final Object loaderLock = new Object();
private static final Object valueLock = new Object();
/* loaded from: classes2.dex */
public interface InitializationCallback {
void onInitializationFailed(IOException iOException);
void onInitialized();
}
static /* synthetic */ long access$400() throws IOException {
return loadNtpTimeOffsetMs();
}
private SntpClient() {
}
public static String getNtpHost() {
String str;
synchronized (valueLock) {
str = ntpHost;
}
return str;
}
public static void setNtpHost(String str) {
synchronized (valueLock) {
if (!ntpHost.equals(str)) {
ntpHost = str;
isInitialized = false;
}
}
}
public static boolean isInitialized() {
boolean z;
synchronized (valueLock) {
z = isInitialized;
}
return z;
}
public static long getElapsedRealtimeOffsetMs() {
long j;
synchronized (valueLock) {
j = isInitialized ? elapsedRealtimeOffsetMs : -9223372036854775807L;
}
return j;
}
public static void initialize(Loader loader, InitializationCallback initializationCallback) {
if (isInitialized()) {
if (initializationCallback != null) {
initializationCallback.onInitialized();
}
} else {
if (loader == null) {
loader = new Loader("SntpClient");
}
loader.startLoading(new NtpTimeLoadable(), new NtpTimeCallback(initializationCallback), 1);
}
}
private static long loadNtpTimeOffsetMs() throws IOException {
InetAddress byName = InetAddress.getByName(getNtpHost());
DatagramSocket datagramSocket = new DatagramSocket();
try {
datagramSocket.setSoTimeout(10000);
byte[] bArr = new byte[48];
DatagramPacket datagramPacket = new DatagramPacket(bArr, 48, byName, NTP_PORT);
bArr[0] = Ascii.ESC;
long currentTimeMillis = System.currentTimeMillis();
long elapsedRealtime = SystemClock.elapsedRealtime();
writeTimestamp(bArr, 40, currentTimeMillis);
datagramSocket.send(datagramPacket);
datagramSocket.receive(new DatagramPacket(bArr, 48));
long elapsedRealtime2 = SystemClock.elapsedRealtime();
long j = currentTimeMillis + (elapsedRealtime2 - elapsedRealtime);
byte b = bArr[0];
int i = bArr[1] & 255;
long readTimestamp = readTimestamp(bArr, 24);
long readTimestamp2 = readTimestamp(bArr, 32);
long readTimestamp3 = readTimestamp(bArr, 40);
checkValidServerReply((byte) ((b >> 6) & 3), (byte) (b & 7), i, readTimestamp3);
long j2 = (j + (((readTimestamp2 - readTimestamp) + (readTimestamp3 - j)) / 2)) - elapsedRealtime2;
datagramSocket.close();
return j2;
} catch (Throwable th) {
try {
datagramSocket.close();
} catch (Throwable th2) {
th.addSuppressed(th2);
}
throw th;
}
}
private static long readTimestamp(byte[] bArr, int i) {
long read32 = read32(bArr, i);
long read322 = read32(bArr, i + 4);
if (read32 == 0 && read322 == 0) {
return 0L;
}
return ((read32 - OFFSET_1900_TO_1970) * 1000) + ((read322 * 1000) / 4294967296L);
}
private static void writeTimestamp(byte[] bArr, int i, long j) {
if (j == 0) {
Arrays.fill(bArr, i, i + 8, (byte) 0);
return;
}
long j2 = j / 1000;
long j3 = j - (j2 * 1000);
long j4 = j2 + OFFSET_1900_TO_1970;
bArr[i] = (byte) (j4 >> 24);
bArr[i + 1] = (byte) (j4 >> 16);
bArr[i + 2] = (byte) (j4 >> 8);
bArr[i + 3] = (byte) j4;
long j5 = (j3 * 4294967296L) / 1000;
bArr[i + 4] = (byte) (j5 >> 24);
bArr[i + 5] = (byte) (j5 >> 16);
bArr[i + 6] = (byte) (j5 >> 8);
bArr[i + 7] = (byte) (Math.random() * 255.0d);
}
private static long read32(byte[] bArr, int i) {
int i2 = bArr[i];
int i3 = bArr[i + 1];
int i4 = bArr[i + 2];
int i5 = bArr[i + 3];
if ((i2 & 128) == 128) {
i2 = (i2 & 127) + 128;
}
if ((i3 & 128) == 128) {
i3 = (i3 & 127) + 128;
}
if ((i4 & 128) == 128) {
i4 = (i4 & 127) + 128;
}
if ((i5 & 128) == 128) {
i5 = (i5 & 127) + 128;
}
return (i2 << 24) + (i3 << 16) + (i4 << 8) + i5;
}
private static void checkValidServerReply(byte b, byte b2, int i, long j) throws IOException {
if (b == 3) {
throw new IOException("SNTP: Unsynchronized server");
}
if (b2 != 4 && b2 != 5) {
throw new IOException("SNTP: Untrusted mode: " + ((int) b2));
}
if (i == 0 || i > 15) {
throw new IOException("SNTP: Untrusted stratum: " + i);
}
if (j == 0) {
throw new IOException("SNTP: Zero transmitTime");
}
}
/* loaded from: classes2.dex */
private static final class NtpTimeLoadable implements Loader.Loadable {
@Override // androidx.media3.exoplayer.upstream.Loader.Loadable
public void cancelLoad() {
}
private NtpTimeLoadable() {
}
@Override // androidx.media3.exoplayer.upstream.Loader.Loadable
public void load() throws IOException {
synchronized (SntpClient.loaderLock) {
synchronized (SntpClient.valueLock) {
if (SntpClient.isInitialized) {
return;
}
long access$400 = SntpClient.access$400();
synchronized (SntpClient.valueLock) {
long unused = SntpClient.elapsedRealtimeOffsetMs = access$400;
boolean unused2 = SntpClient.isInitialized = true;
}
}
}
}
}
/* loaded from: classes2.dex */
private static final class NtpTimeCallback implements Loader.Callback<Loader.Loadable> {
private final InitializationCallback callback;
@Override // androidx.media3.exoplayer.upstream.Loader.Callback
public void onLoadCanceled(Loader.Loadable loadable, long j, long j2, boolean z) {
}
public NtpTimeCallback(InitializationCallback initializationCallback) {
this.callback = initializationCallback;
}
@Override // androidx.media3.exoplayer.upstream.Loader.Callback
public void onLoadCompleted(Loader.Loadable loadable, long j, long j2) {
if (this.callback != null) {
if (!SntpClient.isInitialized()) {
this.callback.onInitializationFailed(new IOException(new ConcurrentModificationException()));
} else {
this.callback.onInitialized();
}
}
}
@Override // androidx.media3.exoplayer.upstream.Loader.Callback
public Loader.LoadErrorAction onLoadError(Loader.Loadable loadable, long j, long j2, IOException iOException, int i) {
InitializationCallback initializationCallback = this.callback;
if (initializationCallback != null) {
initializationCallback.onInitializationFailed(iOException);
}
return Loader.DONT_RETRY;
}
}
}