Expose ViECaptureImpl::DisconnectCaptureDevice() to JNI of WebRTCDemo and call it before releasing camera to deregister the corresponding framecallback. Also stop camera after stop remote rendering as the correct termination order.

BUG=4448
TEST=Manual Test
R=glaznev@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/46649004

Cr-Commit-Position: refs/heads/master@{#8785}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8785 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/examples/android/media_demo/jni/video_engine_jni.cc b/webrtc/examples/android/media_demo/jni/video_engine_jni.cc
index bb61a46..d2c9002 100644
--- a/webrtc/examples/android/media_demo/jni/video_engine_jni.cc
+++ b/webrtc/examples/android/media_demo/jni/video_engine_jni.cc
@@ -538,6 +538,12 @@
   return vie_data->capture->ConnectCaptureDevice(camera_num, channel);
 }
 
+JOWW(jint, VideoEngine_disconnectCaptureDevice)(JNIEnv* jni, jobject j_vie,
+                                                jint channel) {
+  VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
+  return vie_data->capture->DisconnectCaptureDevice(channel);
+}
+
 JOWW(jint, VideoEngine_startCapture)(JNIEnv* jni, jobject j_vie,
                                      jint camera_num) {
   VideoEngineData* vie_data = GetVideoEngineData(jni, j_vie);
diff --git a/webrtc/examples/android/media_demo/src/org/webrtc/webrtcdemo/MediaEngine.java b/webrtc/examples/android/media_demo/src/org/webrtc/webrtcdemo/MediaEngine.java
index 5fe7896..85841db 100644
--- a/webrtc/examples/android/media_demo/src/org/webrtc/webrtcdemo/MediaEngine.java
+++ b/webrtc/examples/android/media_demo/src/org/webrtc/webrtcdemo/MediaEngine.java
@@ -468,7 +468,6 @@
       return;
     }
     check(vie.stopSend(videoChannel) == 0, "StopSend");
-    stopCamera();
     check(vie.stopReceive(videoChannel) == 0, "StopReceive");
     if (externalCodec != null) {
       check(vie.deRegisterExternalReceiveCodec(videoChannel,
@@ -480,6 +479,7 @@
       check(vie.stopRender(videoChannel) == 0, "StopRender");
       check(vie.removeRenderer(videoChannel) == 0, "RemoveRenderer");
     }
+    stopCamera(); // Stop capturer after remote renderer.
     svRemote = null;
     vieRunning = false;
   }
@@ -612,6 +612,8 @@
   private void stopCamera() {
     check(vie.stopCapture(currentCameraHandle) == 0, "Failed StopCapture");
     svLocal = null;
+    check(vie.disconnectCaptureDevice(videoChannel) == 0,
+        "Failed to disconnect capture device");
     check(vie.releaseCaptureDevice(currentCameraHandle) == 0,
         "Failed ReleaseCaptureDevice");
   }
diff --git a/webrtc/examples/android/media_demo/src/org/webrtc/webrtcdemo/VideoEngine.java b/webrtc/examples/android/media_demo/src/org/webrtc/webrtcdemo/VideoEngine.java
index 086fe30..b712c80 100644
--- a/webrtc/examples/android/media_demo/src/org/webrtc/webrtcdemo/VideoEngine.java
+++ b/webrtc/examples/android/media_demo/src/org/webrtc/webrtcdemo/VideoEngine.java
@@ -84,6 +84,7 @@
   public native CameraDesc getCaptureDevice(int index);
   public native int allocateCaptureDevice(CameraDesc camera);
   public native int connectCaptureDevice(int cameraId, int channel);
+  public native int disconnectCaptureDevice(int channel);
   public native int startCapture(int cameraId);
   public native int stopCapture(int cameraId);
   public native int releaseCaptureDevice(int cameraId);