mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2024-12-30 11:02:31 -06:00
208 lines
6.9 KiB
Java
208 lines
6.9 KiB
Java
package androidx.media3.exoplayer.mediacodec;
|
|
|
|
import android.media.MediaCodec;
|
|
import android.media.MediaFormat;
|
|
import android.os.Handler;
|
|
import android.os.HandlerThread;
|
|
import androidx.media3.common.util.Assertions;
|
|
import androidx.media3.common.util.Util;
|
|
import java.util.ArrayDeque;
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
/* loaded from: classes2.dex */
|
|
public final class AsynchronousMediaCodecCallback extends MediaCodec.Callback {
|
|
private final HandlerThread callbackThread;
|
|
private MediaFormat currentFormat;
|
|
private Handler handler;
|
|
private IllegalStateException internalException;
|
|
private MediaCodec.CodecException mediaCodecException;
|
|
private long pendingFlushCount;
|
|
private MediaFormat pendingOutputFormat;
|
|
private boolean shutDown;
|
|
private final Object lock = new Object();
|
|
private final IntArrayQueue availableInputBuffers = new IntArrayQueue();
|
|
private final IntArrayQueue availableOutputBuffers = new IntArrayQueue();
|
|
private final ArrayDeque<MediaCodec.BufferInfo> bufferInfos = new ArrayDeque<>();
|
|
private final ArrayDeque<MediaFormat> formats = new ArrayDeque<>();
|
|
|
|
private boolean isFlushingOrShutdown() {
|
|
return this.pendingFlushCount > 0 || this.shutDown;
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
public AsynchronousMediaCodecCallback(HandlerThread handlerThread) {
|
|
this.callbackThread = handlerThread;
|
|
}
|
|
|
|
public void initialize(MediaCodec mediaCodec) {
|
|
Assertions.checkState(this.handler == null);
|
|
this.callbackThread.start();
|
|
Handler handler = new Handler(this.callbackThread.getLooper());
|
|
mediaCodec.setCallback(this, handler);
|
|
this.handler = handler;
|
|
}
|
|
|
|
public void shutdown() {
|
|
synchronized (this.lock) {
|
|
this.shutDown = true;
|
|
this.callbackThread.quit();
|
|
flushInternal();
|
|
}
|
|
}
|
|
|
|
public int dequeueInputBufferIndex() {
|
|
synchronized (this.lock) {
|
|
maybeThrowException();
|
|
int i = -1;
|
|
if (isFlushingOrShutdown()) {
|
|
return -1;
|
|
}
|
|
if (!this.availableInputBuffers.isEmpty()) {
|
|
i = this.availableInputBuffers.remove();
|
|
}
|
|
return i;
|
|
}
|
|
}
|
|
|
|
public int dequeueOutputBufferIndex(MediaCodec.BufferInfo bufferInfo) {
|
|
synchronized (this.lock) {
|
|
maybeThrowException();
|
|
if (isFlushingOrShutdown()) {
|
|
return -1;
|
|
}
|
|
if (this.availableOutputBuffers.isEmpty()) {
|
|
return -1;
|
|
}
|
|
int remove = this.availableOutputBuffers.remove();
|
|
if (remove >= 0) {
|
|
Assertions.checkStateNotNull(this.currentFormat);
|
|
MediaCodec.BufferInfo remove2 = this.bufferInfos.remove();
|
|
bufferInfo.set(remove2.offset, remove2.size, remove2.presentationTimeUs, remove2.flags);
|
|
} else if (remove == -2) {
|
|
this.currentFormat = this.formats.remove();
|
|
}
|
|
return remove;
|
|
}
|
|
}
|
|
|
|
public MediaFormat getOutputFormat() {
|
|
MediaFormat mediaFormat;
|
|
synchronized (this.lock) {
|
|
mediaFormat = this.currentFormat;
|
|
if (mediaFormat == null) {
|
|
throw new IllegalStateException();
|
|
}
|
|
}
|
|
return mediaFormat;
|
|
}
|
|
|
|
public void flush() {
|
|
synchronized (this.lock) {
|
|
this.pendingFlushCount++;
|
|
((Handler) Util.castNonNull(this.handler)).post(new Runnable() { // from class: androidx.media3.exoplayer.mediacodec.AsynchronousMediaCodecCallback$$ExternalSyntheticLambda0
|
|
@Override // java.lang.Runnable
|
|
public final void run() {
|
|
AsynchronousMediaCodecCallback.this.onFlushCompleted();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
@Override // android.media.MediaCodec.Callback
|
|
public void onInputBufferAvailable(MediaCodec mediaCodec, int i) {
|
|
synchronized (this.lock) {
|
|
this.availableInputBuffers.add(i);
|
|
}
|
|
}
|
|
|
|
@Override // android.media.MediaCodec.Callback
|
|
public void onOutputBufferAvailable(MediaCodec mediaCodec, int i, MediaCodec.BufferInfo bufferInfo) {
|
|
synchronized (this.lock) {
|
|
MediaFormat mediaFormat = this.pendingOutputFormat;
|
|
if (mediaFormat != null) {
|
|
addOutputFormat(mediaFormat);
|
|
this.pendingOutputFormat = null;
|
|
}
|
|
this.availableOutputBuffers.add(i);
|
|
this.bufferInfos.add(bufferInfo);
|
|
}
|
|
}
|
|
|
|
@Override // android.media.MediaCodec.Callback
|
|
public void onError(MediaCodec mediaCodec, MediaCodec.CodecException codecException) {
|
|
synchronized (this.lock) {
|
|
this.mediaCodecException = codecException;
|
|
}
|
|
}
|
|
|
|
@Override // android.media.MediaCodec.Callback
|
|
public void onOutputFormatChanged(MediaCodec mediaCodec, MediaFormat mediaFormat) {
|
|
synchronized (this.lock) {
|
|
addOutputFormat(mediaFormat);
|
|
this.pendingOutputFormat = null;
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public void onFlushCompleted() {
|
|
synchronized (this.lock) {
|
|
if (this.shutDown) {
|
|
return;
|
|
}
|
|
long j = this.pendingFlushCount - 1;
|
|
this.pendingFlushCount = j;
|
|
if (j > 0) {
|
|
return;
|
|
}
|
|
if (j < 0) {
|
|
setInternalException(new IllegalStateException());
|
|
} else {
|
|
flushInternal();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void flushInternal() {
|
|
if (!this.formats.isEmpty()) {
|
|
this.pendingOutputFormat = this.formats.getLast();
|
|
}
|
|
this.availableInputBuffers.clear();
|
|
this.availableOutputBuffers.clear();
|
|
this.bufferInfos.clear();
|
|
this.formats.clear();
|
|
}
|
|
|
|
private void addOutputFormat(MediaFormat mediaFormat) {
|
|
this.availableOutputBuffers.add(-2);
|
|
this.formats.add(mediaFormat);
|
|
}
|
|
|
|
private void maybeThrowException() {
|
|
maybeThrowInternalException();
|
|
maybeThrowMediaCodecException();
|
|
}
|
|
|
|
private void maybeThrowInternalException() {
|
|
IllegalStateException illegalStateException = this.internalException;
|
|
if (illegalStateException == null) {
|
|
return;
|
|
}
|
|
this.internalException = null;
|
|
throw illegalStateException;
|
|
}
|
|
|
|
private void maybeThrowMediaCodecException() {
|
|
MediaCodec.CodecException codecException = this.mediaCodecException;
|
|
if (codecException == null) {
|
|
return;
|
|
}
|
|
this.mediaCodecException = null;
|
|
throw codecException;
|
|
}
|
|
|
|
private void setInternalException(IllegalStateException illegalStateException) {
|
|
synchronized (this.lock) {
|
|
this.internalException = illegalStateException;
|
|
}
|
|
}
|
|
}
|