Bug 1420585 - remove unnecessary stopCapture which causes deadlock. r?jib draft
authorMunro Mengjue Chiang <mchiang@mozilla.com>
Fri, 05 Jan 2018 15:50:23 +0800
changeset 720200 1fd60858132e0ff182586b28c35594976906389a
parent 716014 3acb14b949150529ec761f845f9a3d61ee341dac
child 720201 0b5e6d24f9c3af36402395ec54784b7fd08c48f9
push id95474
push userbmo:mchiang@mozilla.com
push dateMon, 15 Jan 2018 02:47:46 +0000
reviewersjib
bugs1420585
milestone59.0a1
Bug 1420585 - remove unnecessary stopCapture which causes deadlock. r?jib MozReview-Commit-ID: F8xcOSPihDN
media/webrtc/trunk/webrtc/modules/video_capture/android/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java
--- a/media/webrtc/trunk/webrtc/modules/video_capture/android/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java
+++ b/media/webrtc/trunk/webrtc/modules/video_capture/android/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java
@@ -243,21 +243,23 @@ public class VideoCaptureAndroid impleme
       averageDurationMs = 1000000.0f / (max_mfps / frameDropRatio);
       camera.startPreview();
       exchange(result, true);
       return;
     } catch (RuntimeException e) {
       error = e;
     }
     Log.e(TAG, "startCapture failed", error);
-    if (camera != null) {
-      Exchanger<Boolean> resultDropper = new Exchanger<Boolean>();
-      stopCaptureOnCameraThread(resultDropper);
-      exchange(resultDropper, false);
-    }
+    // For some devices, camera.setParameters(parameters) would throw
+    // an exception when a specific resolution is set. Originally,
+    // stopCaptureOnCameraThread() is called here to clear up the state.
+    // However, stopCaptureOnCameraThread(), which uses Exchanger to
+    // synchronize and swap data with MediaManager thread, is supposed to be
+    // called by MediaManager thread like we did at stopCapture(). Calling
+    // this function directly in CameraThread will cause deadlock.
     exchange(result, false);
     return;
   }
 
   // Called by native code.  Returns true when camera is known to be stopped.
   @WebRTCJNITarget
   private synchronized boolean stopCapture() {
     Log.d(TAG, "stopCapture");