Add a timeout for starting the camera on CameraCapturer.
This allows to at least get a camera error back if the camera thread freezes. Application can use this as a signal to restart the program. R=magjed@webrtc.org Review-Url: https://codereview.webrtc.org/2257123002 Cr-Commit-Position: refs/heads/master@{#13830}
This commit is contained in:
@ -12,6 +12,7 @@ package org.webrtc;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
@ -26,16 +27,18 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
|
|||||||
private static final String TAG = "CameraCapturer";
|
private static final String TAG = "CameraCapturer";
|
||||||
private final static int MAX_OPEN_CAMERA_ATTEMPTS = 3;
|
private final static int MAX_OPEN_CAMERA_ATTEMPTS = 3;
|
||||||
private final static int OPEN_CAMERA_DELAY_MS = 500;
|
private final static int OPEN_CAMERA_DELAY_MS = 500;
|
||||||
|
private final static int OPEN_CAMERA_TIMEOUT = 10000;
|
||||||
|
|
||||||
private final CameraEnumerator cameraEnumerator;
|
private final CameraEnumerator cameraEnumerator;
|
||||||
private final CameraEventsHandler eventsHandler;
|
private final CameraEventsHandler eventsHandler;
|
||||||
|
private final Handler uiThreadHandler;
|
||||||
|
|
||||||
private final CameraSession.CreateSessionCallback createSessionCallback =
|
private final CameraSession.CreateSessionCallback createSessionCallback =
|
||||||
new CameraSession.CreateSessionCallback() {
|
new CameraSession.CreateSessionCallback() {
|
||||||
@Override
|
@Override
|
||||||
public void onDone(CameraSession session) {
|
public void onDone(CameraSession session) {
|
||||||
Logging.d(TAG, "Create session done");
|
Logging.d(TAG, "Create session done");
|
||||||
|
uiThreadHandler.removeCallbacks(openCameraTimeoutRunnable);
|
||||||
synchronized (stateLock) {
|
synchronized (stateLock) {
|
||||||
sessionOpening = false;
|
sessionOpening = false;
|
||||||
currentSession = session;
|
currentSession = session;
|
||||||
@ -57,6 +60,7 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(String error) {
|
public void onFailure(String error) {
|
||||||
|
uiThreadHandler.removeCallbacks(openCameraTimeoutRunnable);
|
||||||
synchronized (stateLock) {
|
synchronized (stateLock) {
|
||||||
openAttemptsRemaining--;
|
openAttemptsRemaining--;
|
||||||
|
|
||||||
@ -83,6 +87,13 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private final Runnable openCameraTimeoutRunnable = new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
eventsHandler.onCameraError("Camera failed to start within timeout.");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Initialized on initialize
|
// Initialized on initialize
|
||||||
// -------------------------
|
// -------------------------
|
||||||
private Handler cameraThreadHandler;
|
private Handler cameraThreadHandler;
|
||||||
@ -121,6 +132,7 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
|
|||||||
this.eventsHandler = eventsHandler;
|
this.eventsHandler = eventsHandler;
|
||||||
this.cameraEnumerator = cameraEnumerator;
|
this.cameraEnumerator = cameraEnumerator;
|
||||||
this.cameraName = cameraName;
|
this.cameraName = cameraName;
|
||||||
|
uiThreadHandler = new Handler(Looper.getMainLooper());
|
||||||
|
|
||||||
final String[] deviceNames = cameraEnumerator.getDeviceNames();
|
final String[] deviceNames = cameraEnumerator.getDeviceNames();
|
||||||
|
|
||||||
@ -164,6 +176,7 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void createSessionInternal(int delayMs) {
|
private void createSessionInternal(int delayMs) {
|
||||||
|
uiThreadHandler.postDelayed(openCameraTimeoutRunnable, delayMs + OPEN_CAMERA_TIMEOUT);
|
||||||
cameraThreadHandler.postDelayed(new Runnable() {
|
cameraThreadHandler.postDelayed(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|||||||
Reference in New Issue
Block a user