From 03a9fd46c73af68fda89526531f9f9f6b2ed0515 Mon Sep 17 00:00:00 2001 From: panxiaochun <997856423@qq.com> Date: Fri, 28 Oct 2016 11:18:33 +0800 Subject: [PATCH 1/3] fix the problem: leak memory when repeatedly start and stop --- modules/videoio/src/cap_ios_abstract_camera.mm | 6 +++--- modules/videoio/src/cap_ios_video_camera.mm | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/videoio/src/cap_ios_abstract_camera.mm b/modules/videoio/src/cap_ios_abstract_camera.mm index 79e0c3d7a9..437b920240 100644 --- a/modules/videoio/src/cap_ios_abstract_camera.mm +++ b/modules/videoio/src/cap_ios_abstract_camera.mm @@ -203,11 +203,11 @@ } [self.captureSession stopRunning]; - self.captureSession = nil; + [self.captureSession release]; } - self.captureVideoPreviewLayer = nil; - self.videoCaptureConnection = nil; + [self.captureVideoPreviewLayer release]; + [self.videoCaptureConnection release]; captureSessionLoaded = NO; } diff --git a/modules/videoio/src/cap_ios_video_camera.mm b/modules/videoio/src/cap_ios_video_camera.mm index 54471cee2d..c9c17dbe2b 100644 --- a/modules/videoio/src/cap_ios_video_camera.mm +++ b/modules/videoio/src/cap_ios_video_camera.mm @@ -131,7 +131,7 @@ static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;} { [super stop]; - self.videoDataOutput = nil; + [self.videoDataOutput release]; if (videoDataOutputQueue) { dispatch_release(videoDataOutputQueue); } @@ -144,11 +144,11 @@ static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;} } else { NSLog(@"[Camera] Recording Error: asset writer status is not writing"); } - self.recordAssetWriter = nil; + [self.recordAssetWriter release]; } - self.recordAssetWriterInput = nil; - self.recordPixelBufferAdaptor = nil; + [self.recordAssetWriterInput release]; + [self.recordPixelBufferAdaptor release]; } if (self.customPreviewLayer) { From f888f47102d0084f6ab7aba0c4f82fe89638b519 Mon Sep 17 00:00:00 2001 From: panxiaochun <997856423@qq.com> Date: Fri, 28 Oct 2016 14:48:49 +0800 Subject: [PATCH 2/3] remove self. in release method --- modules/videoio/src/cap_ios_abstract_camera.mm | 6 +++--- modules/videoio/src/cap_ios_video_camera.mm | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/videoio/src/cap_ios_abstract_camera.mm b/modules/videoio/src/cap_ios_abstract_camera.mm index 437b920240..032ab850fa 100644 --- a/modules/videoio/src/cap_ios_abstract_camera.mm +++ b/modules/videoio/src/cap_ios_abstract_camera.mm @@ -203,11 +203,11 @@ } [self.captureSession stopRunning]; - [self.captureSession release]; + [captureSession release]; } - [self.captureVideoPreviewLayer release]; - [self.videoCaptureConnection release]; + [captureVideoPreviewLayer release]; + [videoCaptureConnection release]; captureSessionLoaded = NO; } diff --git a/modules/videoio/src/cap_ios_video_camera.mm b/modules/videoio/src/cap_ios_video_camera.mm index c9c17dbe2b..6c4c21f164 100644 --- a/modules/videoio/src/cap_ios_video_camera.mm +++ b/modules/videoio/src/cap_ios_video_camera.mm @@ -131,7 +131,7 @@ static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;} { [super stop]; - [self.videoDataOutput release]; + [videoDataOutput release]; if (videoDataOutputQueue) { dispatch_release(videoDataOutputQueue); } @@ -144,11 +144,11 @@ static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;} } else { NSLog(@"[Camera] Recording Error: asset writer status is not writing"); } - [self.recordAssetWriter release]; + [recordAssetWriter release]; } - [self.recordAssetWriterInput release]; - [self.recordPixelBufferAdaptor release]; + [recordAssetWriterInput release]; + [recordPixelBufferAdaptor release]; } if (self.customPreviewLayer) { From bec3479f9eed3332c0628dc67330a620618bee50 Mon Sep 17 00:00:00 2001 From: panxiaochun <997856423@qq.com> Date: Fri, 28 Oct 2016 15:50:37 +0800 Subject: [PATCH 3/3] fix the problem:repeatedly stop cause app crash --- modules/videoio/src/cap_ios_video_camera.mm | 44 +++++++++++---------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/modules/videoio/src/cap_ios_video_camera.mm b/modules/videoio/src/cap_ios_video_camera.mm index 6c4c21f164..8a19a47f2f 100644 --- a/modules/videoio/src/cap_ios_video_camera.mm +++ b/modules/videoio/src/cap_ios_video_camera.mm @@ -129,31 +129,33 @@ static CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;} - (void)stop; { - [super stop]; + if (self.running == YES) { + [super stop]; - [videoDataOutput release]; - if (videoDataOutputQueue) { - dispatch_release(videoDataOutputQueue); - } - - if (self.recordVideo == YES) { - 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"); - } - [recordAssetWriter release]; + [videoDataOutput release]; + if (videoDataOutputQueue) { + dispatch_release(videoDataOutputQueue); } - [recordAssetWriterInput release]; - [recordPixelBufferAdaptor release]; - } + if (self.recordVideo == YES) { + 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"); + } + [recordAssetWriter release]; + } - if (self.customPreviewLayer) { - [self.customPreviewLayer removeFromSuperlayer]; - self.customPreviewLayer = nil; + [recordAssetWriterInput release]; + [recordPixelBufferAdaptor release]; + } + + if (self.customPreviewLayer) { + [self.customPreviewLayer removeFromSuperlayer]; + self.customPreviewLayer = nil; + } } }