From f927397579a212a6c32cda2a4e166ebcdc1a4111 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20B=C3=A9raud?= <adrien.beraud@savoirfairelinux.com> Date: Sat, 16 May 2020 16:31:34 -0400 Subject: [PATCH] camera: catch codec exception, fix leaks Change-Id: I6e0690d4f590474c2c0ebf9c7c414c04c2ec5471 --- .../java/cx/ring/services/CameraService.java | 32 +++++++++++++------ .../cx/ring/services/HardwareServiceImpl.java | 8 +++++ 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/ring-android/app/src/main/java/cx/ring/services/CameraService.java b/ring-android/app/src/main/java/cx/ring/services/CameraService.java index d6d917c7d..b9f2d97a9 100644 --- a/ring-android/app/src/main/java/cx/ring/services/CameraService.java +++ b/ring-android/app/src/main/java/cx/ring/services/CameraService.java @@ -512,7 +512,10 @@ public class CameraService { } } catch (Exception e) { Log.e(TAG, "Can't open codec", e); - codec = null; + if (codec != null) { + codec.release(); + codec = null; + } if (encoderInput != null) { encoderInput.release(); encoderInput = null; @@ -771,8 +774,12 @@ public class CameraService { @Override public void onCaptureStarted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, long timestamp, long frameNumber) { if (frameNumber == 1) { - codec.first.start(); - codecStarted[0] = true; + try { + codec.first.start(); + codecStarted[0] = true; + } catch (Exception e) { + listener.onError(); + } } } } : null, handler); @@ -820,12 +827,19 @@ public class CameraService { Log.w(TAG, "onClosed"); if (previewCamera == camera) previewCamera = null; - if (codec != null && codec.first != null) { - if (codecStarted[0]) - codec.first.signalEndOfInputStream(); - codec.first.release(); - if (codec.first == currentCodec) - currentCodec = null; + if (codec != null) { + if (codec.first != null) { + if (codecStarted[0]) + codec.first.signalEndOfInputStream(); + codec.first.release(); + if (codec.first == currentCodec) + currentCodec = null; + } + if (codec.second != null) + codec.second.release(); + } + if (reader != null) { + reader.close(); } s.release(); } diff --git a/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java b/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java index 6811d741e..c695f70db 100644 --- a/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java +++ b/ring-android/app/src/main/java/cx/ring/services/HardwareServiceImpl.java @@ -478,6 +478,10 @@ public class HardwareServiceImpl extends HardwareService implements AudioManager @Override public void startCapture(@Nullable String camId) { + if (mIsScreenSharing) { + cameraService.stopScreenSharing(); + mIsScreenSharing = false; + } mShouldCapture = true; if (mIsCapturing && mCapturingId != null && mCapturingId.equals(camId)) { return; @@ -544,6 +548,10 @@ public class HardwareServiceImpl extends HardwareService implements AudioManager Log.d(TAG, "stopCapture: " + cameraService.isOpen()); mShouldCapture = false; endCapture(); + if (mIsScreenSharing) { + cameraService.stopScreenSharing(); + mIsScreenSharing = false; + } } public void requestKeyFrame() { -- GitLab