mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2024-12-30 11:02:31 -06:00
157 lines
5.7 KiB
Java
157 lines
5.7 KiB
Java
|
package androidx.media3.exoplayer.video;
|
||
|
|
||
|
import java.util.Arrays;
|
||
|
|
||
|
/* loaded from: classes2.dex */
|
||
|
final class FixedFrameRateEstimator {
|
||
|
public static final int CONSECUTIVE_MATCHING_FRAME_DURATIONS_FOR_SYNC = 15;
|
||
|
static final long MAX_MATCHING_FRAME_DIFFERENCE_NS = 1000000;
|
||
|
private boolean candidateMatcherActive;
|
||
|
private int framesWithoutSyncCount;
|
||
|
private boolean switchToCandidateMatcherWhenSynced;
|
||
|
private Matcher currentMatcher = new Matcher();
|
||
|
private Matcher candidateMatcher = new Matcher();
|
||
|
private long lastFramePresentationTimeNs = -9223372036854775807L;
|
||
|
|
||
|
public int getFramesWithoutSyncCount() {
|
||
|
return this.framesWithoutSyncCount;
|
||
|
}
|
||
|
|
||
|
public void reset() {
|
||
|
this.currentMatcher.reset();
|
||
|
this.candidateMatcher.reset();
|
||
|
this.candidateMatcherActive = false;
|
||
|
this.lastFramePresentationTimeNs = -9223372036854775807L;
|
||
|
this.framesWithoutSyncCount = 0;
|
||
|
}
|
||
|
|
||
|
public void onNextFrame(long j) {
|
||
|
this.currentMatcher.onNextFrame(j);
|
||
|
if (this.currentMatcher.isSynced() && !this.switchToCandidateMatcherWhenSynced) {
|
||
|
this.candidateMatcherActive = false;
|
||
|
} else if (this.lastFramePresentationTimeNs != -9223372036854775807L) {
|
||
|
if (!this.candidateMatcherActive || this.candidateMatcher.isLastFrameOutlier()) {
|
||
|
this.candidateMatcher.reset();
|
||
|
this.candidateMatcher.onNextFrame(this.lastFramePresentationTimeNs);
|
||
|
}
|
||
|
this.candidateMatcherActive = true;
|
||
|
this.candidateMatcher.onNextFrame(j);
|
||
|
}
|
||
|
if (this.candidateMatcherActive && this.candidateMatcher.isSynced()) {
|
||
|
Matcher matcher = this.currentMatcher;
|
||
|
this.currentMatcher = this.candidateMatcher;
|
||
|
this.candidateMatcher = matcher;
|
||
|
this.candidateMatcherActive = false;
|
||
|
this.switchToCandidateMatcherWhenSynced = false;
|
||
|
}
|
||
|
this.lastFramePresentationTimeNs = j;
|
||
|
this.framesWithoutSyncCount = this.currentMatcher.isSynced() ? 0 : this.framesWithoutSyncCount + 1;
|
||
|
}
|
||
|
|
||
|
public boolean isSynced() {
|
||
|
return this.currentMatcher.isSynced();
|
||
|
}
|
||
|
|
||
|
public long getMatchingFrameDurationSumNs() {
|
||
|
if (isSynced()) {
|
||
|
return this.currentMatcher.getMatchingFrameDurationSumNs();
|
||
|
}
|
||
|
return -9223372036854775807L;
|
||
|
}
|
||
|
|
||
|
public long getFrameDurationNs() {
|
||
|
if (isSynced()) {
|
||
|
return this.currentMatcher.getFrameDurationNs();
|
||
|
}
|
||
|
return -9223372036854775807L;
|
||
|
}
|
||
|
|
||
|
public float getFrameRate() {
|
||
|
if (isSynced()) {
|
||
|
return (float) (1.0E9d / this.currentMatcher.getFrameDurationNs());
|
||
|
}
|
||
|
return -1.0f;
|
||
|
}
|
||
|
|
||
|
/* JADX INFO: Access modifiers changed from: private */
|
||
|
/* loaded from: classes2.dex */
|
||
|
public static final class Matcher {
|
||
|
private long firstFrameDurationNs;
|
||
|
private long firstFramePresentationTimeNs;
|
||
|
private long frameCount;
|
||
|
private long lastFramePresentationTimeNs;
|
||
|
private long matchingFrameCount;
|
||
|
private long matchingFrameDurationSumNs;
|
||
|
private int recentFrameOutlierCount;
|
||
|
private final boolean[] recentFrameOutlierFlags = new boolean[15];
|
||
|
|
||
|
public long getMatchingFrameDurationSumNs() {
|
||
|
return this.matchingFrameDurationSumNs;
|
||
|
}
|
||
|
|
||
|
public boolean isSynced() {
|
||
|
return this.frameCount > 15 && this.recentFrameOutlierCount == 0;
|
||
|
}
|
||
|
|
||
|
public void reset() {
|
||
|
this.frameCount = 0L;
|
||
|
this.matchingFrameCount = 0L;
|
||
|
this.matchingFrameDurationSumNs = 0L;
|
||
|
this.recentFrameOutlierCount = 0;
|
||
|
Arrays.fill(this.recentFrameOutlierFlags, false);
|
||
|
}
|
||
|
|
||
|
public boolean isLastFrameOutlier() {
|
||
|
long j = this.frameCount;
|
||
|
if (j == 0) {
|
||
|
return false;
|
||
|
}
|
||
|
return this.recentFrameOutlierFlags[getRecentFrameOutlierIndex(j - 1)];
|
||
|
}
|
||
|
|
||
|
public long getFrameDurationNs() {
|
||
|
long j = this.matchingFrameCount;
|
||
|
if (j == 0) {
|
||
|
return 0L;
|
||
|
}
|
||
|
return this.matchingFrameDurationSumNs / j;
|
||
|
}
|
||
|
|
||
|
public void onNextFrame(long j) {
|
||
|
long j2 = this.frameCount;
|
||
|
if (j2 == 0) {
|
||
|
this.firstFramePresentationTimeNs = j;
|
||
|
} else if (j2 == 1) {
|
||
|
long j3 = j - this.firstFramePresentationTimeNs;
|
||
|
this.firstFrameDurationNs = j3;
|
||
|
this.matchingFrameDurationSumNs = j3;
|
||
|
this.matchingFrameCount = 1L;
|
||
|
} else {
|
||
|
long j4 = j - this.lastFramePresentationTimeNs;
|
||
|
int recentFrameOutlierIndex = getRecentFrameOutlierIndex(j2);
|
||
|
if (Math.abs(j4 - this.firstFrameDurationNs) <= 1000000) {
|
||
|
this.matchingFrameCount++;
|
||
|
this.matchingFrameDurationSumNs += j4;
|
||
|
boolean[] zArr = this.recentFrameOutlierFlags;
|
||
|
if (zArr[recentFrameOutlierIndex]) {
|
||
|
zArr[recentFrameOutlierIndex] = false;
|
||
|
this.recentFrameOutlierCount--;
|
||
|
}
|
||
|
} else {
|
||
|
boolean[] zArr2 = this.recentFrameOutlierFlags;
|
||
|
if (!zArr2[recentFrameOutlierIndex]) {
|
||
|
zArr2[recentFrameOutlierIndex] = true;
|
||
|
this.recentFrameOutlierCount++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
this.frameCount++;
|
||
|
this.lastFramePresentationTimeNs = j;
|
||
|
}
|
||
|
|
||
|
private static int getRecentFrameOutlierIndex(long j) {
|
||
|
return (int) (j % 15);
|
||
|
}
|
||
|
}
|
||
|
}
|