Bug #3391 org.opencv.android.NativeCameraView crashes after latest OpenCV Manager...
authorAlexander Smorkalov <alexander.smorkalov@itseez.com>
Tue, 25 Feb 2014 07:50:55 +0000 (11:50 +0400)
committerAlexander Smorkalov <alexander.smorkalov@itseez.com>
Tue, 25 Feb 2014 07:54:03 +0000 (11:54 +0400)
The crash was cased by massive Mat objects leak in NativeCameraView class.

modules/java/generator/src/java/android+NativeCameraView.java

index 62d0775..8035d04 100644 (file)
@@ -22,6 +22,7 @@ public class NativeCameraView extends CameraBridgeViewBase {
     private Thread mThread;
 
     protected VideoCapture mCamera;
+    protected NativeCameraFrame mFrame;
 
     public NativeCameraView(Context context, int cameraId) {
         super(context, cameraId);
@@ -97,6 +98,8 @@ public class NativeCameraView extends CameraBridgeViewBase {
             if (mCamera.isOpened() == false)
                 return false;
 
+            mFrame = new NativeCameraFrame(mCamera);
+
             java.util.List<Size> sizes = mCamera.getSupportedPreviewSizes();
 
             /* Select the size that fits surface considering maximum size allowed */
@@ -127,9 +130,8 @@ public class NativeCameraView extends CameraBridgeViewBase {
 
     private void releaseCamera() {
         synchronized (this) {
-            if (mCamera != null) {
-                mCamera.release();
-            }
+            if (mFrame != null) mFrame.release();
+            if (mCamera != null) mCamera.release();
         }
     }
 
@@ -153,6 +155,11 @@ public class NativeCameraView extends CameraBridgeViewBase {
             mRgba = new Mat();
         }
 
+        public void release() {
+            if (mGray != null) mGray.release();
+            if (mRgba != null) mRgba.release();
+        }
+
         private VideoCapture mCapture;
         private Mat mRgba;
         private Mat mGray;
@@ -167,7 +174,7 @@ public class NativeCameraView extends CameraBridgeViewBase {
                     break;
                 }
 
-                deliverAndDrawFrame(new NativeCameraFrame(mCamera));
+                deliverAndDrawFrame(mFrame);
 
             } while (!mStopThread);
         }