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