CrackMe.apk
Download file
package com.google.android.exoplayer2.audio;
import com.google.android.exoplayer2.audio.AudioProcessor;
import com.google.android.exoplayer2.util.Assertions;
import com.google.android.exoplayer2.util.Util;
import java.nio.ByteBuffer;
public final class SilenceSkippingAudioProcessor extends BaseAudioProcessor {
public static final long DEFAULT_MINIMUM_SILENCE_DURATION_US = 150000;
public static final long DEFAULT_PADDING_SILENCE_US = 20000;
public static final short DEFAULT_SILENCE_THRESHOLD_LEVEL = 1024;
private static final int STATE_MAYBE_SILENT = 1;
private static final int STATE_NOISY = 0;
private static final int STATE_SILENT = 2;
private int bytesPerFrame;
private boolean enabled;
private boolean hasOutputNoise;
private byte[] maybeSilenceBuffer;
private int maybeSilenceBufferSize;
private final long minimumSilenceDurationUs;
private byte[] paddingBuffer;
private final long paddingSilenceUs;
private int paddingSize;
private final short silenceThresholdLevel;
private long skippedFrames;
private int state;
public SilenceSkippingAudioProcessor() {
this(DEFAULT_MINIMUM_SILENCE_DURATION_US, DEFAULT_PADDING_SILENCE_US, DEFAULT_SILENCE_THRESHOLD_LEVEL);
}
public SilenceSkippingAudioProcessor(long j, long j2, short s) {
Assertions.checkArgument(j2 <= j);
this.minimumSilenceDurationUs = j;
this.paddingSilenceUs = j2;
this.silenceThresholdLevel = s;
this.maybeSilenceBuffer = Util.EMPTY_BYTE_ARRAY;
this.paddingBuffer = Util.EMPTY_BYTE_ARRAY;
}
public void setEnabled(boolean z) {
this.enabled = z;
}
public long getSkippedFrames() {
return this.skippedFrames;
}
public AudioProcessor.AudioFormat onConfigure(AudioProcessor.AudioFormat audioFormat) throws AudioProcessor.UnhandledAudioFormatException {
if (audioFormat.encoding == 2) {
return this.enabled ? audioFormat : AudioProcessor.AudioFormat.NOT_SET;
}
throw new AudioProcessor.UnhandledAudioFormatException(audioFormat);
}
public boolean isActive() {
return this.enabled;
}
public void queueInput(ByteBuffer byteBuffer) {
while (byteBuffer.hasRemaining() && !hasPendingOutput()) {
int i = this.state;
if (i == 0) {
processNoisy(byteBuffer);
} else if (i == 1) {
processMaybeSilence(byteBuffer);
} else if (i == 2) {
processSilence(byteBuffer);
} else {
throw new IllegalStateException();
}
}
}
/* access modifiers changed from: protected */
public void onQueueEndOfStream() {
int i = this.maybeSilenceBufferSize;
if (i > 0) {
output(this.maybeSilenceBuffer, i);
}
if (!this.hasOutputNoise) {
this.skippedFrames += (long) (this.paddingSize / this.bytesPerFrame);
}
}
/* access modifiers changed from: protected */
public void onFlush() {
if (this.enabled) {
this.bytesPerFrame = this.inputAudioFormat.bytesPerFrame;
int durationUsToFrames = durationUsToFrames(this.minimumSilenceDurationUs) * this.bytesPerFrame;
if (this.maybeSilenceBuffer.length != durationUsToFrames) {
this.maybeSilenceBuffer = new byte[durationUsToFrames];
}
int durationUsToFrames2 = durationUsToFrames(this.paddingSilenceUs) * this.bytesPerFrame;
this.paddingSize = durationUsToFrames2;
if (this.paddingBuffer.length != durationUsToFrames2) {
this.paddingBuffer = new byte[durationUsToFrames2];
}
}
this.state = 0;
this.skippedFrames = 0;
this.maybeSilenceBufferSize = 0;
this.hasOutputNoise = false;
}
/* access modifiers changed from: protected */
public void onReset() {
this.enabled = false;
this.paddingSize = 0;
this.maybeSilenceBuffer = Util.EMPTY_BYTE_ARRAY;
this.paddingBuffer = Util.EMPTY_BYTE_ARRAY;
}
private void processNoisy(ByteBuffer byteBuffer) {
int limit = byteBuffer.limit();
byteBuffer.limit(Math.min(limit, byteBuffer.position() + this.maybeSilenceBuffer.length));
int findNoiseLimit = findNoiseLimit(byteBuffer);
if (findNoiseLimit == byteBuffer.position()) {
this.state = 1;
} else {
byteBuffer.limit(findNoiseLimit);
output(byteBuffer);
}
byteBuffer.limit(limit);
}
private void processMaybeSilence(ByteBuffer byteBuffer) {
int limit = byteBuffer.limit();
int findNoisePosition = findNoisePosition(byteBuffer);
int position = findNoisePosition - byteBuffer.position();
byte[] bArr = this.maybeSilenceBuffer;
int length = bArr.length;
int i = this.maybeSilenceBufferSize;
int i2 = length - i;
if (findNoisePosition >= limit || position >= i2) {
int min = Math.min(position, i2);
byteBuffer.limit(byteBuffer.position() + min);
byteBuffer.get(this.maybeSilenceBuffer, this.maybeSilenceBufferSize, min);
int i3 = this.maybeSilenceBufferSize + min;
this.maybeSilenceBufferSize = i3;
byte[] bArr2 = this.maybeSilenceBuffer;
if (i3 == bArr2.length) {
if (this.hasOutputNoise) {
output(bArr2, this.paddingSize);
this.skippedFrames += (long) ((this.maybeSilenceBufferSize - (this.paddingSize * 2)) / this.bytesPerFrame);
} else {
this.skippedFrames += (long) ((i3 - this.paddingSize) / this.bytesPerFrame);
}
updatePaddingBuffer(byteBuffer, this.maybeSilenceBuffer, this.maybeSilenceBufferSize);
this.maybeSilenceBufferSize = 0;
this.state = 2;
}
byteBuffer.limit(limit);
return;
}
output(bArr, i);
this.maybeSilenceBufferSize = 0;
this.state = 0;
}
private void processSilence(ByteBuffer byteBuffer) {
int limit = byteBuffer.limit();
int findNoisePosition = findNoisePosition(byteBuffer);
byteBuffer.limit(findNoisePosition);
this.skippedFrames += (long) (byteBuffer.remaining() / this.bytesPerFrame);
updatePaddingBuffer(byteBuffer, this.paddingBuffer, this.paddingSize);
if (findNoisePosition < limit) {
output(this.paddingBuffer, this.paddingSize);
this.state = 0;
byteBuffer.limit(limit);
}
}
private void output(byte[] bArr, int i) {
replaceOutputBuffer(i).put(bArr, 0, i).flip();
if (i > 0) {
this.hasOutputNoise = true;
}
}
private void output(ByteBuffer byteBuffer) {
int remaining = byteBuffer.remaining();
replaceOutputBuffer(remaining).put(byteBuffer).flip();
if (remaining > 0) {
this.hasOutputNoise = true;
}
}
private void updatePaddingBuffer(ByteBuffer byteBuffer, byte[] bArr, int i) {
int min = Math.min(byteBuffer.remaining(), this.paddingSize);
int i2 = this.paddingSize - min;
System.arraycopy(bArr, i - i2, this.paddingBuffer, 0, i2);
byteBuffer.position(byteBuffer.limit() - min);
byteBuffer.get(this.paddingBuffer, i2, min);
}
private int durationUsToFrames(long j) {
return (int) ((j * ((long) this.inputAudioFormat.sampleRate)) / 1000000);
}
private int findNoisePosition(ByteBuffer byteBuffer) {
for (int position = byteBuffer.position(); position < byteBuffer.limit(); position += 2) {
if (Math.abs(byteBuffer.getShort(position)) > this.silenceThresholdLevel) {
int i = this.bytesPerFrame;
return i * (position / i);
}
}
return byteBuffer.limit();
}
private int findNoiseLimit(ByteBuffer byteBuffer) {
int limit = byteBuffer.limit();
while (true) {
limit -= 2;
if (limit < byteBuffer.position()) {
return byteBuffer.position();
}
if (Math.abs(byteBuffer.getShort(limit)) > this.silenceThresholdLevel) {
int i = this.bytesPerFrame;
return ((limit / i) * i) + i;
}
}
}
}
Download file