Cleaner fix for crash on double-stop of CvVideoCamera
authorDavid Wolever <david@wolever.net>
Thu, 4 Aug 2016 16:44:07 +0000 (12:44 -0400)
committerDavid Wolever <david@wolever.net>
Thu, 4 Aug 2016 16:44:07 +0000 (12:44 -0400)
modules/videoio/src/cap_ios_abstract_camera.mm
modules/videoio/src/cap_ios_video_camera.mm

index 565807c..328c161 100644 (file)
 
     // Release any retained subviews of the main view.
     // e.g. self.myOutlet = nil;
-    for (AVCaptureInput *input in self.captureSession.inputs) {
-        [self.captureSession removeInput:input];
-    }
+    if (self.captureSession) {
+        for (AVCaptureInput *input in self.captureSession.inputs) {
+            [self.captureSession removeInput:input];
+        }
 
-    for (AVCaptureOutput *output in self.captureSession.outputs) {
-        [self.captureSession removeOutput:output];
+        for (AVCaptureOutput *output in self.captureSession.outputs) {
+            [self.captureSession removeOutput:output];
+        }
+
+        [self.captureSession stopRunning];
+        self.captureSession = nil;
     }
 
-    [self.captureSession stopRunning];
-    self.captureSession = nil;
     self.captureVideoPreviewLayer = nil;
     self.videoCaptureConnection = nil;
     captureSessionLoaded = NO;
index 8d48309..ee074af 100644 (file)
@@ -122,10 +122,6 @@ static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;}
 
 - (void)stop;
 {
-    if (self.running == NO) {
-        return;
-    }
-
     [super stop];
 
     self.videoDataOutput = nil;
@@ -134,21 +130,24 @@ static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;}
     }
 
     if (self.recordVideo == YES) {
-
-        if (self.recordAssetWriter.status == AVAssetWriterStatusWriting) {
-            [self.recordAssetWriter finishWriting];
-            NSLog(@"[Camera] recording stopped");
-        } else {
-            NSLog(@"[Camera] Recording Error: asset writer status is not writing");
+        if (self.recordAssetWriter) {
+            if (self.recordAssetWriter.status == AVAssetWriterStatusWriting) {
+                [self.recordAssetWriter finishWriting];
+                NSLog(@"[Camera] recording stopped");
+            } else {
+                NSLog(@"[Camera] Recording Error: asset writer status is not writing");
+            }
+            self.recordAssetWriter = nil;
         }
 
-        self.recordAssetWriter = nil;
         self.recordAssetWriterInput = nil;
         self.recordPixelBufferAdaptor = nil;
     }
 
-    [self.customPreviewLayer removeFromSuperlayer];
-    self.customPreviewLayer = nil;
+    if (self.customPreviewLayer) {
+        [self.customPreviewLayer removeFromSuperlayer];
+        self.customPreviewLayer = nil;
+    }
 }
 
 // TODO fix