diff --git a/webrtc/api/android/java/src/org/webrtc/Camera1Session.java b/webrtc/api/android/java/src/org/webrtc/Camera1Session.java index 11b8b78bd2..dae7910f70 100644 --- a/webrtc/api/android/java/src/org/webrtc/Camera1Session.java +++ b/webrtc/api/android/java/src/org/webrtc/Camera1Session.java @@ -202,7 +202,11 @@ public class Camera1Session implements CameraSession { Logging.e(TAG, errorMessage); state = SessionState.STOPPED; stopInternal(); - events.onCameraError(Camera1Session.this, errorMessage); + if (error == android.hardware.Camera.CAMERA_ERROR_EVICTED) { + events.onCameraDisconnected(Camera1Session.this); + } else { + events.onCameraError(Camera1Session.this, errorMessage); + } } }); diff --git a/webrtc/api/android/java/src/org/webrtc/Camera2Session.java b/webrtc/api/android/java/src/org/webrtc/Camera2Session.java index 6ff73c5aed..ad4ffd69b1 100644 --- a/webrtc/api/android/java/src/org/webrtc/Camera2Session.java +++ b/webrtc/api/android/java/src/org/webrtc/Camera2Session.java @@ -98,7 +98,14 @@ public class Camera2Session implements CameraSession { @Override public void onDisconnected(CameraDevice camera) { checkIsOnCameraThread(); - reportError("Camera disconnected."); + final boolean startFailure = (captureSession == null); + state = SessionState.STOPPED; + stopInternal(); + if (startFailure) { + callback.onFailure("Camera disconnected / evicted."); + } else { + events.onCameraDisconnected(Camera2Session.this); + } } @Override diff --git a/webrtc/api/android/java/src/org/webrtc/CameraCapturer.java b/webrtc/api/android/java/src/org/webrtc/CameraCapturer.java index c94538bf74..86f5f217c1 100644 --- a/webrtc/api/android/java/src/org/webrtc/CameraCapturer.java +++ b/webrtc/api/android/java/src/org/webrtc/CameraCapturer.java @@ -118,6 +118,19 @@ public abstract class CameraCapturer implements CameraVideoCapturer { } } + @Override + public void onCameraDisconnected(CameraSession session) { + checkIsOnCameraThread(); + synchronized (stateLock) { + if (session != currentSession) { + Logging.w(TAG, "onCameraDisconnected from another session."); + return; + } + eventsHandler.onCameraDisconnected(); + stopCapture(); + } + } + @Override public void onCameraClosed(CameraSession session) { checkIsOnCameraThread(); @@ -204,6 +217,8 @@ public abstract class CameraCapturer implements CameraVideoCapturer { @Override public void onCameraError(String errorDescription) {} @Override + public void onCameraDisconnected() {} + @Override public void onCameraFreezed(String errorDescription) {} @Override public void onCameraOpening(String cameraName) {} diff --git a/webrtc/api/android/java/src/org/webrtc/CameraSession.java b/webrtc/api/android/java/src/org/webrtc/CameraSession.java index 6e64927c9e..7feb0462ce 100644 --- a/webrtc/api/android/java/src/org/webrtc/CameraSession.java +++ b/webrtc/api/android/java/src/org/webrtc/CameraSession.java @@ -21,6 +21,7 @@ public interface CameraSession { public interface Events { void onCameraOpening(); void onCameraError(CameraSession session, String error); + void onCameraDisconnected(CameraSession session); void onCameraClosed(CameraSession session); void onByteBufferFrameCaptured( CameraSession session, byte[] data, int width, int height, int rotation, long timestamp); diff --git a/webrtc/api/android/java/src/org/webrtc/CameraVideoCapturer.java b/webrtc/api/android/java/src/org/webrtc/CameraVideoCapturer.java index 1a66fcc37b..283d5d1f2b 100644 --- a/webrtc/api/android/java/src/org/webrtc/CameraVideoCapturer.java +++ b/webrtc/api/android/java/src/org/webrtc/CameraVideoCapturer.java @@ -25,6 +25,9 @@ public interface CameraVideoCapturer extends VideoCapturer { // or any camera exception happens on camera thread. void onCameraError(String errorDescription); + // Called when camera is disconnected. + void onCameraDisconnected(); + // Invoked when camera stops receiving frames. void onCameraFreezed(String errorDescription); diff --git a/webrtc/api/android/java/src/org/webrtc/VideoCapturerAndroid.java b/webrtc/api/android/java/src/org/webrtc/VideoCapturerAndroid.java index 939c86992f..e0b0dcd46f 100644 --- a/webrtc/api/android/java/src/org/webrtc/VideoCapturerAndroid.java +++ b/webrtc/api/android/java/src/org/webrtc/VideoCapturerAndroid.java @@ -95,7 +95,11 @@ public class VideoCapturerAndroid } Logging.e(TAG, errorMessage); if (eventsHandler != null) { - eventsHandler.onCameraError(errorMessage); + if (error == android.hardware.Camera.CAMERA_ERROR_EVICTED) { + eventsHandler.onCameraDisconnected(); + } else { + eventsHandler.onCameraError(errorMessage); + } } } }; diff --git a/webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java b/webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java index 9d424bb8a6..299114fe9e 100644 --- a/webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java +++ b/webrtc/api/androidtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java @@ -195,6 +195,9 @@ class CameraVideoCapturerTestFixtures { cameraClosed = true; } + @Override + public void onCameraDisconnected() {} + @Override public void onCameraFreezed(String errorDescription) { synchronized (onCameraFreezedLock) {