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:
sakal
2016-08-19 03:02:35 -07:00
committed by Commit bot
parent bcba64a0fa
commit 294fb050a0

View File

@ -12,6 +12,7 @@ package org.webrtc;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import java.util.Arrays;
@ -26,16 +27,18 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
private static final String TAG = "CameraCapturer";
private final static int MAX_OPEN_CAMERA_ATTEMPTS = 3;
private final static int OPEN_CAMERA_DELAY_MS = 500;
private final static int OPEN_CAMERA_TIMEOUT = 10000;
private final CameraEnumerator cameraEnumerator;
private final CameraEventsHandler eventsHandler;
private final Handler uiThreadHandler;
private final CameraSession.CreateSessionCallback createSessionCallback =
new CameraSession.CreateSessionCallback() {
@Override
public void onDone(CameraSession session) {
Logging.d(TAG, "Create session done");
uiThreadHandler.removeCallbacks(openCameraTimeoutRunnable);
synchronized (stateLock) {
sessionOpening = false;
currentSession = session;
@ -57,6 +60,7 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
@Override
public void onFailure(String error) {
uiThreadHandler.removeCallbacks(openCameraTimeoutRunnable);
synchronized (stateLock) {
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
// -------------------------
private Handler cameraThreadHandler;
@ -121,6 +132,7 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
this.eventsHandler = eventsHandler;
this.cameraEnumerator = cameraEnumerator;
this.cameraName = cameraName;
uiThreadHandler = new Handler(Looper.getMainLooper());
final String[] deviceNames = cameraEnumerator.getDeviceNames();
@ -164,6 +176,7 @@ public abstract class CameraCapturer implements CameraVideoCapturer {
}
private void createSessionInternal(int delayMs) {
uiThreadHandler.postDelayed(openCameraTimeoutRunnable, delayMs + OPEN_CAMERA_TIMEOUT);
cameraThreadHandler.postDelayed(new Runnable() {
@Override
public void run() {