mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2025-01-09 13:43:22 +00:00
428 lines
20 KiB
Java
428 lines
20 KiB
Java
package org.webrtc;
|
|
|
|
import android.content.Context;
|
|
import android.os.Handler;
|
|
import android.os.Looper;
|
|
import io.sentry.protocol.ViewHierarchyNode;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
import org.webrtc.CameraSession;
|
|
import org.webrtc.CameraVideoCapturer;
|
|
|
|
/* loaded from: classes3.dex */
|
|
abstract class CameraCapturer implements CameraVideoCapturer {
|
|
private static final int MAX_OPEN_CAMERA_ATTEMPTS = 3;
|
|
private static final int OPEN_CAMERA_DELAY_MS = 500;
|
|
private static final int OPEN_CAMERA_TIMEOUT = 10000;
|
|
private static final String TAG = "CameraCapturer";
|
|
private Context applicationContext;
|
|
private final CameraEnumerator cameraEnumerator;
|
|
private String cameraName;
|
|
private CameraVideoCapturer.CameraStatistics cameraStatistics;
|
|
private Handler cameraThreadHandler;
|
|
private CapturerObserver capturerObserver;
|
|
private CameraSession currentSession;
|
|
private final CameraVideoCapturer.CameraEventsHandler eventsHandler;
|
|
private boolean firstFrameObserved;
|
|
private int framerate;
|
|
private int height;
|
|
private int openAttemptsRemaining;
|
|
private String pendingCameraName;
|
|
private boolean sessionOpening;
|
|
private SurfaceTextureHelper surfaceHelper;
|
|
private CameraVideoCapturer.CameraSwitchHandler switchEventsHandler;
|
|
private final Handler uiThreadHandler;
|
|
private int width;
|
|
private final CameraSession.CreateSessionCallback createSessionCallback = new CameraSession.CreateSessionCallback() { // from class: org.webrtc.CameraCapturer.1
|
|
@Override // org.webrtc.CameraSession.CreateSessionCallback
|
|
public void onDone(CameraSession cameraSession) {
|
|
CameraCapturer.this.checkIsOnCameraThread();
|
|
Logging.d(CameraCapturer.TAG, "Create session done. Switch state: " + CameraCapturer.this.switchState);
|
|
CameraCapturer.this.uiThreadHandler.removeCallbacks(CameraCapturer.this.openCameraTimeoutRunnable);
|
|
synchronized (CameraCapturer.this.stateLock) {
|
|
CameraCapturer.this.capturerObserver.onCapturerStarted(true);
|
|
CameraCapturer.this.sessionOpening = false;
|
|
CameraCapturer.this.currentSession = cameraSession;
|
|
CameraCapturer.this.cameraStatistics = new CameraVideoCapturer.CameraStatistics(CameraCapturer.this.surfaceHelper, CameraCapturer.this.eventsHandler);
|
|
CameraCapturer.this.firstFrameObserved = false;
|
|
CameraCapturer.this.stateLock.notifyAll();
|
|
if (CameraCapturer.this.switchState == SwitchState.IN_PROGRESS) {
|
|
CameraCapturer.this.switchState = SwitchState.IDLE;
|
|
if (CameraCapturer.this.switchEventsHandler != null) {
|
|
CameraCapturer.this.switchEventsHandler.onCameraSwitchDone(CameraCapturer.this.cameraEnumerator.isFrontFacing(CameraCapturer.this.cameraName));
|
|
CameraCapturer.this.switchEventsHandler = null;
|
|
}
|
|
} else if (CameraCapturer.this.switchState == SwitchState.PENDING) {
|
|
String str = CameraCapturer.this.pendingCameraName;
|
|
CameraCapturer.this.pendingCameraName = null;
|
|
CameraCapturer.this.switchState = SwitchState.IDLE;
|
|
CameraCapturer cameraCapturer = CameraCapturer.this;
|
|
cameraCapturer.switchCameraInternal(cameraCapturer.switchEventsHandler, str);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // org.webrtc.CameraSession.CreateSessionCallback
|
|
public void onFailure(CameraSession.FailureType failureType, String str) {
|
|
CameraCapturer.this.checkIsOnCameraThread();
|
|
CameraCapturer.this.uiThreadHandler.removeCallbacks(CameraCapturer.this.openCameraTimeoutRunnable);
|
|
synchronized (CameraCapturer.this.stateLock) {
|
|
CameraCapturer.this.capturerObserver.onCapturerStarted(false);
|
|
CameraCapturer.access$1710(CameraCapturer.this);
|
|
if (CameraCapturer.this.openAttemptsRemaining <= 0) {
|
|
Logging.w(CameraCapturer.TAG, "Opening camera failed, passing: " + str);
|
|
CameraCapturer.this.sessionOpening = false;
|
|
CameraCapturer.this.stateLock.notifyAll();
|
|
if (CameraCapturer.this.switchState != SwitchState.IDLE) {
|
|
if (CameraCapturer.this.switchEventsHandler != null) {
|
|
CameraCapturer.this.switchEventsHandler.onCameraSwitchError(str);
|
|
CameraCapturer.this.switchEventsHandler = null;
|
|
}
|
|
CameraCapturer.this.switchState = SwitchState.IDLE;
|
|
}
|
|
if (failureType == CameraSession.FailureType.DISCONNECTED) {
|
|
CameraCapturer.this.eventsHandler.onCameraDisconnected();
|
|
} else {
|
|
CameraCapturer.this.eventsHandler.onCameraError(str);
|
|
}
|
|
} else {
|
|
Logging.w(CameraCapturer.TAG, "Opening camera failed, retry: " + str);
|
|
CameraCapturer.this.createSessionInternal(500);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
private final CameraSession.Events cameraSessionEventsHandler = new CameraSession.Events() { // from class: org.webrtc.CameraCapturer.2
|
|
@Override // org.webrtc.CameraSession.Events
|
|
public void onCameraOpening() {
|
|
CameraCapturer.this.checkIsOnCameraThread();
|
|
synchronized (CameraCapturer.this.stateLock) {
|
|
if (CameraCapturer.this.currentSession == null) {
|
|
CameraCapturer.this.eventsHandler.onCameraOpening(CameraCapturer.this.cameraName);
|
|
} else {
|
|
Logging.w(CameraCapturer.TAG, "onCameraOpening while session was open.");
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // org.webrtc.CameraSession.Events
|
|
public void onCameraError(CameraSession cameraSession, String str) {
|
|
CameraCapturer.this.checkIsOnCameraThread();
|
|
synchronized (CameraCapturer.this.stateLock) {
|
|
if (cameraSession == CameraCapturer.this.currentSession) {
|
|
CameraCapturer.this.eventsHandler.onCameraError(str);
|
|
CameraCapturer.this.stopCapture();
|
|
} else {
|
|
Logging.w(CameraCapturer.TAG, "onCameraError from another session: " + str);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // org.webrtc.CameraSession.Events
|
|
public void onCameraDisconnected(CameraSession cameraSession) {
|
|
CameraCapturer.this.checkIsOnCameraThread();
|
|
synchronized (CameraCapturer.this.stateLock) {
|
|
if (cameraSession == CameraCapturer.this.currentSession) {
|
|
CameraCapturer.this.eventsHandler.onCameraDisconnected();
|
|
CameraCapturer.this.stopCapture();
|
|
} else {
|
|
Logging.w(CameraCapturer.TAG, "onCameraDisconnected from another session.");
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // org.webrtc.CameraSession.Events
|
|
public void onCameraClosed(CameraSession cameraSession) {
|
|
CameraCapturer.this.checkIsOnCameraThread();
|
|
synchronized (CameraCapturer.this.stateLock) {
|
|
if (cameraSession == CameraCapturer.this.currentSession || CameraCapturer.this.currentSession == null) {
|
|
CameraCapturer.this.eventsHandler.onCameraClosed();
|
|
} else {
|
|
Logging.d(CameraCapturer.TAG, "onCameraClosed from another session.");
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // org.webrtc.CameraSession.Events
|
|
public void onFrameCaptured(CameraSession cameraSession, VideoFrame videoFrame) {
|
|
CameraCapturer.this.checkIsOnCameraThread();
|
|
synchronized (CameraCapturer.this.stateLock) {
|
|
if (cameraSession == CameraCapturer.this.currentSession) {
|
|
if (!CameraCapturer.this.firstFrameObserved) {
|
|
CameraCapturer.this.eventsHandler.onFirstFrameAvailable();
|
|
CameraCapturer.this.firstFrameObserved = true;
|
|
}
|
|
CameraCapturer.this.cameraStatistics.addFrame();
|
|
CameraCapturer.this.capturerObserver.onFrameCaptured(videoFrame);
|
|
return;
|
|
}
|
|
Logging.w(CameraCapturer.TAG, "onFrameCaptured from another session.");
|
|
}
|
|
}
|
|
};
|
|
private final Runnable openCameraTimeoutRunnable = new Runnable() { // from class: org.webrtc.CameraCapturer.3
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
CameraCapturer.this.eventsHandler.onCameraError("Camera failed to start within timeout.");
|
|
}
|
|
};
|
|
private final Object stateLock = new Object();
|
|
private SwitchState switchState = SwitchState.IDLE;
|
|
|
|
/* JADX INFO: Access modifiers changed from: package-private */
|
|
/* loaded from: classes3.dex */
|
|
public enum SwitchState {
|
|
IDLE,
|
|
PENDING,
|
|
IN_PROGRESS
|
|
}
|
|
|
|
protected abstract void createCameraSession(CameraSession.CreateSessionCallback createSessionCallback, CameraSession.Events events, Context context, SurfaceTextureHelper surfaceTextureHelper, String str, int i, int i2, int i3);
|
|
|
|
@Override // org.webrtc.VideoCapturer
|
|
public boolean isScreencast() {
|
|
return false;
|
|
}
|
|
|
|
static /* synthetic */ int access$1710(CameraCapturer cameraCapturer) {
|
|
int i = cameraCapturer.openAttemptsRemaining;
|
|
cameraCapturer.openAttemptsRemaining = i - 1;
|
|
return i;
|
|
}
|
|
|
|
public CameraCapturer(String str, CameraVideoCapturer.CameraEventsHandler cameraEventsHandler, CameraEnumerator cameraEnumerator) {
|
|
this.eventsHandler = cameraEventsHandler == null ? new CameraVideoCapturer.CameraEventsHandler() { // from class: org.webrtc.CameraCapturer.4
|
|
@Override // org.webrtc.CameraVideoCapturer.CameraEventsHandler
|
|
public void onCameraClosed() {
|
|
}
|
|
|
|
@Override // org.webrtc.CameraVideoCapturer.CameraEventsHandler
|
|
public void onCameraDisconnected() {
|
|
}
|
|
|
|
@Override // org.webrtc.CameraVideoCapturer.CameraEventsHandler
|
|
public void onCameraError(String str2) {
|
|
}
|
|
|
|
@Override // org.webrtc.CameraVideoCapturer.CameraEventsHandler
|
|
public void onCameraFreezed(String str2) {
|
|
}
|
|
|
|
@Override // org.webrtc.CameraVideoCapturer.CameraEventsHandler
|
|
public void onCameraOpening(String str2) {
|
|
}
|
|
|
|
@Override // org.webrtc.CameraVideoCapturer.CameraEventsHandler
|
|
public void onFirstFrameAvailable() {
|
|
}
|
|
} : cameraEventsHandler;
|
|
this.cameraEnumerator = cameraEnumerator;
|
|
this.cameraName = str;
|
|
List asList = Arrays.asList(cameraEnumerator.getDeviceNames());
|
|
this.uiThreadHandler = new Handler(Looper.getMainLooper());
|
|
if (asList.isEmpty()) {
|
|
throw new RuntimeException("No cameras attached.");
|
|
}
|
|
if (!asList.contains(this.cameraName)) {
|
|
throw new IllegalArgumentException("Camera name " + this.cameraName + " does not match any known camera device.");
|
|
}
|
|
}
|
|
|
|
@Override // org.webrtc.VideoCapturer
|
|
public void initialize(SurfaceTextureHelper surfaceTextureHelper, Context context, CapturerObserver capturerObserver) {
|
|
this.applicationContext = context;
|
|
this.capturerObserver = capturerObserver;
|
|
this.surfaceHelper = surfaceTextureHelper;
|
|
this.cameraThreadHandler = surfaceTextureHelper.getHandler();
|
|
}
|
|
|
|
@Override // org.webrtc.VideoCapturer
|
|
public void startCapture(int i, int i2, int i3) {
|
|
Logging.d(TAG, "startCapture: " + i + ViewHierarchyNode.JsonKeys.X + i2 + "@" + i3);
|
|
if (this.applicationContext == null) {
|
|
throw new RuntimeException("CameraCapturer must be initialized before calling startCapture.");
|
|
}
|
|
synchronized (this.stateLock) {
|
|
if (!this.sessionOpening && this.currentSession == null) {
|
|
this.width = i;
|
|
this.height = i2;
|
|
this.framerate = i3;
|
|
this.sessionOpening = true;
|
|
this.openAttemptsRemaining = 3;
|
|
createSessionInternal(0);
|
|
return;
|
|
}
|
|
Logging.w(TAG, "Session already open");
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public void createSessionInternal(int i) {
|
|
this.uiThreadHandler.postDelayed(this.openCameraTimeoutRunnable, i + 10000);
|
|
this.cameraThreadHandler.postDelayed(new Runnable() { // from class: org.webrtc.CameraCapturer.5
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
CameraCapturer cameraCapturer = CameraCapturer.this;
|
|
cameraCapturer.createCameraSession(cameraCapturer.createSessionCallback, CameraCapturer.this.cameraSessionEventsHandler, CameraCapturer.this.applicationContext, CameraCapturer.this.surfaceHelper, CameraCapturer.this.cameraName, CameraCapturer.this.width, CameraCapturer.this.height, CameraCapturer.this.framerate);
|
|
}
|
|
}, i);
|
|
}
|
|
|
|
@Override // org.webrtc.VideoCapturer
|
|
public void stopCapture() {
|
|
Logging.d(TAG, "Stop capture");
|
|
synchronized (this.stateLock) {
|
|
while (this.sessionOpening) {
|
|
Logging.d(TAG, "Stop capture: Waiting for session to open");
|
|
try {
|
|
this.stateLock.wait();
|
|
} catch (InterruptedException unused) {
|
|
Logging.w(TAG, "Stop capture interrupted while waiting for the session to open.");
|
|
Thread.currentThread().interrupt();
|
|
return;
|
|
}
|
|
}
|
|
if (this.currentSession != null) {
|
|
Logging.d(TAG, "Stop capture: Nulling session");
|
|
this.cameraStatistics.release();
|
|
this.cameraStatistics = null;
|
|
final CameraSession cameraSession = this.currentSession;
|
|
this.cameraThreadHandler.post(new Runnable() { // from class: org.webrtc.CameraCapturer.6
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
cameraSession.stop();
|
|
}
|
|
});
|
|
this.currentSession = null;
|
|
this.capturerObserver.onCapturerStopped();
|
|
} else {
|
|
Logging.d(TAG, "Stop capture: No session open");
|
|
}
|
|
}
|
|
Logging.d(TAG, "Stop capture done");
|
|
}
|
|
|
|
@Override // org.webrtc.VideoCapturer
|
|
public void changeCaptureFormat(int i, int i2, int i3) {
|
|
Logging.d(TAG, "changeCaptureFormat: " + i + ViewHierarchyNode.JsonKeys.X + i2 + "@" + i3);
|
|
synchronized (this.stateLock) {
|
|
stopCapture();
|
|
startCapture(i, i2, i3);
|
|
}
|
|
}
|
|
|
|
@Override // org.webrtc.VideoCapturer
|
|
public void dispose() {
|
|
Logging.d(TAG, "dispose");
|
|
stopCapture();
|
|
}
|
|
|
|
@Override // org.webrtc.CameraVideoCapturer
|
|
public void switchCamera(final CameraVideoCapturer.CameraSwitchHandler cameraSwitchHandler) {
|
|
Logging.d(TAG, "switchCamera");
|
|
this.cameraThreadHandler.post(new Runnable() { // from class: org.webrtc.CameraCapturer.7
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
List asList = Arrays.asList(CameraCapturer.this.cameraEnumerator.getDeviceNames());
|
|
if (asList.size() < 2) {
|
|
CameraCapturer.this.reportCameraSwitchError("No camera to switch to.", cameraSwitchHandler);
|
|
} else {
|
|
CameraCapturer.this.switchCameraInternal(cameraSwitchHandler, (String) asList.get((asList.indexOf(CameraCapturer.this.cameraName) + 1) % asList.size()));
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override // org.webrtc.CameraVideoCapturer
|
|
public void switchCamera(final CameraVideoCapturer.CameraSwitchHandler cameraSwitchHandler, final String str) {
|
|
Logging.d(TAG, "switchCamera");
|
|
this.cameraThreadHandler.post(new Runnable() { // from class: org.webrtc.CameraCapturer.8
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
CameraCapturer.this.switchCameraInternal(cameraSwitchHandler, str);
|
|
}
|
|
});
|
|
}
|
|
|
|
public void printStackTrace() {
|
|
Handler handler = this.cameraThreadHandler;
|
|
Thread thread = handler != null ? handler.getLooper().getThread() : null;
|
|
if (thread != null) {
|
|
StackTraceElement[] stackTrace = thread.getStackTrace();
|
|
if (stackTrace.length > 0) {
|
|
Logging.d(TAG, "CameraCapturer stack trace:");
|
|
for (StackTraceElement stackTraceElement : stackTrace) {
|
|
Logging.d(TAG, stackTraceElement.toString());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public void reportCameraSwitchError(String str, CameraVideoCapturer.CameraSwitchHandler cameraSwitchHandler) {
|
|
Logging.e(TAG, str);
|
|
if (cameraSwitchHandler != null) {
|
|
cameraSwitchHandler.onCameraSwitchError(str);
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public void switchCameraInternal(CameraVideoCapturer.CameraSwitchHandler cameraSwitchHandler, String str) {
|
|
Logging.d(TAG, "switchCamera internal");
|
|
if (!Arrays.asList(this.cameraEnumerator.getDeviceNames()).contains(str)) {
|
|
reportCameraSwitchError("Attempted to switch to unknown camera device " + str, cameraSwitchHandler);
|
|
return;
|
|
}
|
|
synchronized (this.stateLock) {
|
|
if (this.switchState != SwitchState.IDLE) {
|
|
reportCameraSwitchError("Camera switch already in progress.", cameraSwitchHandler);
|
|
return;
|
|
}
|
|
boolean z = this.sessionOpening;
|
|
if (!z && this.currentSession == null) {
|
|
reportCameraSwitchError("switchCamera: camera is not running.", cameraSwitchHandler);
|
|
return;
|
|
}
|
|
this.switchEventsHandler = cameraSwitchHandler;
|
|
if (z) {
|
|
this.switchState = SwitchState.PENDING;
|
|
this.pendingCameraName = str;
|
|
return;
|
|
}
|
|
this.switchState = SwitchState.IN_PROGRESS;
|
|
Logging.d(TAG, "switchCamera: Stopping session");
|
|
this.cameraStatistics.release();
|
|
this.cameraStatistics = null;
|
|
final CameraSession cameraSession = this.currentSession;
|
|
this.cameraThreadHandler.post(new Runnable() { // from class: org.webrtc.CameraCapturer.9
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
cameraSession.stop();
|
|
}
|
|
});
|
|
this.currentSession = null;
|
|
this.cameraName = str;
|
|
this.sessionOpening = true;
|
|
this.openAttemptsRemaining = 1;
|
|
createSessionInternal(0);
|
|
Logging.d(TAG, "switchCamera done");
|
|
}
|
|
}
|
|
|
|
/* JADX INFO: Access modifiers changed from: private */
|
|
public void checkIsOnCameraThread() {
|
|
if (Thread.currentThread() == this.cameraThreadHandler.getLooper().getThread()) {
|
|
return;
|
|
}
|
|
Logging.e(TAG, "Check is on camera thread failed.");
|
|
throw new RuntimeException("Not on camera thread.");
|
|
}
|
|
|
|
protected String getCameraName() {
|
|
String str;
|
|
synchronized (this.stateLock) {
|
|
str = this.cameraName;
|
|
}
|
|
return str;
|
|
}
|
|
}
|