Handle camera1 session creation errors more gracefully

Specifically, defer getting the camera index so the error can be
reported instead of crashing:

Fatal Exception: java.lang.IllegalArgumentException: No such camera: Camera 1, Facing front, Orientation 270
       at org.webrtc.Camera1Enumerator.getCameraIndex(Camera1Enumerator.java:170)
       at org.webrtc.Camera1Capturer.createCameraSession(Camera1Capturer.java:31)
       at org.webrtc.CameraCapturer$5.run(CameraCapturer.java:272)
       at android.os.Handler.handleCallback(Handler.java:790)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:214)
       at android.os.HandlerThread.run(HandlerThread.java:65)

Bug: webrtc:13032
Change-Id: Ida6bc65046770c11c2b3ee832906e8454cec10df
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/227290
Reviewed-by: Xavier Lepaul‎ <xalep@webrtc.org>
Commit-Queue: Xavier Lepaul‎ <xalep@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#34855}
This commit is contained in:
Saúl Ibarra Corretgé
2021-07-30 16:44:01 +02:00
committed by WebRTC LUCI CQ
parent 68952fed31
commit 27edde3182
2 changed files with 12 additions and 5 deletions

View File

@ -28,7 +28,6 @@ public class Camera1Capturer extends CameraCapturer {
SurfaceTextureHelper surfaceTextureHelper, String cameraName, int width, int height, SurfaceTextureHelper surfaceTextureHelper, String cameraName, int width, int height,
int framerate) { int framerate) {
Camera1Session.create(createSessionCallback, events, captureToTexture, applicationContext, Camera1Session.create(createSessionCallback, events, captureToTexture, applicationContext,
surfaceTextureHelper, Camera1Enumerator.getCameraIndex(cameraName), width, height, surfaceTextureHelper, cameraName, width, height, framerate);
framerate);
} }
} }

View File

@ -52,12 +52,20 @@ class Camera1Session implements CameraSession {
@SuppressWarnings("ByteBufferBackingArray") @SuppressWarnings("ByteBufferBackingArray")
public static void create(final CreateSessionCallback callback, final Events events, public static void create(final CreateSessionCallback callback, final Events events,
final boolean captureToTexture, final Context applicationContext, final boolean captureToTexture, final Context applicationContext,
final SurfaceTextureHelper surfaceTextureHelper, final int cameraId, final int width, final SurfaceTextureHelper surfaceTextureHelper, final String cameraName,
final int height, final int framerate) { final int width, final int height, final int framerate) {
final long constructionTimeNs = System.nanoTime(); final long constructionTimeNs = System.nanoTime();
Logging.d(TAG, "Open camera " + cameraId); Logging.d(TAG, "Open camera " + cameraName);
events.onCameraOpening(); events.onCameraOpening();
final int cameraId;
try {
cameraId = Camera1Enumerator.getCameraIndex(cameraName);
} catch (IllegalArgumentException e) {
callback.onFailure(FailureType.ERROR, e.getMessage());
return;
}
final android.hardware.Camera camera; final android.hardware.Camera camera;
try { try {
camera = android.hardware.Camera.open(cameraId); camera = android.hardware.Camera.open(cameraId);