Rabbit-R1/android (non root)/java/sources/androidx/media3/exoplayer/video/FixedFrameRateEstimator.java

157 lines
5.7 KiB
Java
Raw Normal View History

2024-05-21 16:08:36 -05:00
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);
}
}
}