Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Unified Diff: webrtc/api/android/java/src/org/webrtc/CameraCapturer.java

Issue 2238263002: Make CameraCapturer.switchCamera try again if session is still opening. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Changes according to magjed's comments. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/api/android/java/src/org/webrtc/Camera2Session.java ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/api/android/java/src/org/webrtc/CameraCapturer.java
diff --git a/webrtc/api/android/java/src/org/webrtc/CameraCapturer.java b/webrtc/api/android/java/src/org/webrtc/CameraCapturer.java
index 75712cc57031f255b4e19f92c021d83ab1bb0c34..7e7d2362bd9b640f18964b6ab1420e7cf0b3095f 100644
--- a/webrtc/api/android/java/src/org/webrtc/CameraCapturer.java
+++ b/webrtc/api/android/java/src/org/webrtc/CameraCapturer.java
@@ -10,17 +10,19 @@
package org.webrtc;
-import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-
import android.content.Context;
import android.os.Handler;
-import android.os.SystemClock;
import java.util.Arrays;
-import java.util.List;
@SuppressWarnings("deprecation")
public abstract class CameraCapturer implements CameraVideoCapturer {
+ enum SwitchState {
+ IDLE, // No switch requested.
+ PENDING, // Waiting for previous capture session to open.
+ IN_PROGRESS, // Waiting for new switched capture session to start.
+ }
+
private static final String TAG = "CameraCapturer";
private final static int MAX_OPEN_CAMERA_ATTEMPTS = 3;
private final static int OPEN_CAMERA_DELAY_MS = 500;
@@ -39,12 +41,17 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
currentSession = session;
stateLock.notifyAll();
- if (switchEventsHandler != null) {
- switchEventsHandler.onCameraSwitchDone(
- cameraEnumerator.isFrontFacing(cameraName));
- switchEventsHandler = null;
+ if (switchState == SwitchState.IN_PROGRESS) {
+ if (switchEventsHandler != null) {
+ switchEventsHandler.onCameraSwitchDone(
+ cameraEnumerator.isFrontFacing(cameraName));
+ switchEventsHandler = null;
+ }
+ switchState = SwitchState.IDLE;
+ } else if (switchState == SwitchState.PENDING) {
+ switchState = SwitchState.IDLE;
+ switchCameraInternal(switchEventsHandler);
}
- switchInProgress = false;
}
}
@@ -58,11 +65,13 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
sessionOpening = false;
stateLock.notifyAll();
- if (switchEventsHandler != null) {
- switchEventsHandler.onCameraSwitchError(error);
- switchEventsHandler = null;
+ if (switchState != SwitchState.IDLE) {
+ if (switchEventsHandler != null) {
+ switchEventsHandler.onCameraSwitchError(error);
+ switchEventsHandler = null;
+ }
+ switchState = SwitchState.IDLE;
}
- switchInProgress = false;
eventsHandler.onCameraError(error);
} else {
@@ -76,8 +85,6 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
// Initialized on initialize
// -------------------------
- // Use postOnCameraThread() instead of posting directly to the handler - this way all
- // callbacks with a specifed token can be removed at once.
private Handler cameraThreadHandler;
private Context applicationContext;
private CapturerObserver capturerObserver;
@@ -91,7 +98,7 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
private int height; /* guarded by stateLock */
private int framerate; /* guarded by stateLock */
private int openAttemptsRemaining; /* guarded by stateLock */
- private boolean switchInProgress; /* guarded by stateLock */
+ private SwitchState switchState = SwitchState.IDLE; /* guarded by stateLock */
private CameraSwitchHandler switchEventsHandler; /* guarded by stateLock */
public CameraCapturer(
@@ -219,6 +226,16 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
@Override
public void switchCamera(final CameraSwitchHandler switchEventsHandler) {
Logging.d(TAG, "switchCamera");
+ cameraThreadHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ switchCameraInternal(switchEventsHandler);
+ }
+ });
+ }
+
+ private void switchCameraInternal(final CameraSwitchHandler switchEventsHandler) {
+ Logging.d(TAG, "switchCamera internal");
final String[] deviceNames = cameraEnumerator.getDeviceNames();
@@ -230,7 +247,7 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
}
synchronized (stateLock) {
- if (switchInProgress) {
+ if (switchState != SwitchState.IDLE) {
Logging.d(TAG, "switchCamera switchInProgress");
if (switchEventsHandler != null) {
switchEventsHandler.onCameraSwitchError("Camera switch already in progress.");
@@ -238,12 +255,12 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
return;
}
+ this.switchEventsHandler = switchEventsHandler;
if (sessionOpening) {
- Logging.d(TAG, "switchCamera sessionOpening");
- if (switchEventsHandler != null) {
- switchEventsHandler.onCameraSwitchError("Session is still opening.");
- }
+ switchState = SwitchState.PENDING;
return;
+ } else {
+ switchState = SwitchState.IN_PROGRESS;
}
if (currentSession == null) {
@@ -261,8 +278,6 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
int cameraNameIndex = Arrays.asList(deviceNames).indexOf(cameraName);
cameraName = deviceNames[(cameraNameIndex + 1) % deviceNames.length];
- switchInProgress = true;
- this.switchEventsHandler = switchEventsHandler;
sessionOpening = true;
openAttemptsRemaining = 1;
createSessionInternal(0);
« no previous file with comments | « webrtc/api/android/java/src/org/webrtc/Camera2Session.java ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698