From 97d778ad6afde5152901284386d7cc8a5eaea93a Mon Sep 17 00:00:00 2001 From: Simon Kim Date: Thu, 11 Aug 2016 10:58:09 +0900 Subject: [PATCH 1/3] Fix iOS GPUImageTests build by correcting file locations in xcodeproj --- framework/GPUImage-iOS.xcodeproj/project.pbxproj | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/framework/GPUImage-iOS.xcodeproj/project.pbxproj b/framework/GPUImage-iOS.xcodeproj/project.pbxproj index 52ac4fe4..688e9333 100755 --- a/framework/GPUImage-iOS.xcodeproj/project.pbxproj +++ b/framework/GPUImage-iOS.xcodeproj/project.pbxproj @@ -41,8 +41,6 @@ BCC49FB81CD6E3D900B63EEB /* MovieInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCC49FB71CD6E3D900B63EEB /* MovieInput.swift */; }; BCD03F0F1CA23D6300271751 /* Camera.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD03F0E1CA23D6300271751 /* Camera.swift */; }; BCD1B1301C66A262001F2BDC /* GPUImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCD1B1251C66A262001F2BDC /* GPUImage.framework */; }; - BCD1B1351C66A262001F2BDC /* GPUImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD1B1341C66A262001F2BDC /* GPUImageTests.swift */; }; - BCD1B1431C66A695001F2BDC /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = BCD1B1411C66A68E001F2BDC /* Info.plist */; }; BCD985D21CA48CC2001FF01F /* PictureInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD985D11CA48CC2001FF01F /* PictureInput.swift */; }; BCE316EB1CA0E5CC00323D5B /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BCE316EA1CA0E5CC00323D5B /* OpenGLES.framework */; }; BCE316FA1CA0E69800323D5B /* Framebuffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCE316F31CA0E69800323D5B /* Framebuffer.swift */; }; @@ -168,6 +166,7 @@ BCFB074C1CBF2BC1009B2333 /* ZoomBlur.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCFB073E1CBF2BC1009B2333 /* ZoomBlur.swift */; }; BCFB07991CBF4B44009B2333 /* TextureInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCFB07981CBF4B44009B2333 /* TextureInput.swift */; }; BCFB079C1CBF4B92009B2333 /* TextureOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCFB079B1CBF4B92009B2333 /* TextureOutput.swift */; }; + F449DE351D5C0CB900BCBC64 /* GPUImageTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F449DE341D5C0CB900BCBC64 /* GPUImageTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -227,7 +226,6 @@ BCD03F0E1CA23D6300271751 /* Camera.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Camera.swift; path = Source/iOS/Camera.swift; sourceTree = ""; }; BCD1B1251C66A262001F2BDC /* GPUImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GPUImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BCD1B12F1C66A262001F2BDC /* GPUImageTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GPUImageTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - BCD1B1341C66A262001F2BDC /* GPUImageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = GPUImageTests.swift; path = Tests/iOS/GPUImageTests.swift; sourceTree = ""; }; BCD1B13F1C66A676001F2BDC /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Source/iOS/Info.plist; sourceTree = SOURCE_ROOT; }; BCD1B1411C66A68E001F2BDC /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Tests/iOS/Info.plist; sourceTree = SOURCE_ROOT; }; BCD985D11CA48CC2001FF01F /* PictureInput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PictureInput.swift; path = Source/iOS/PictureInput.swift; sourceTree = ""; }; @@ -479,6 +477,7 @@ BCFB079B1CBF4B92009B2333 /* TextureOutput.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = TextureOutput.swift; path = Source/TextureOutput.swift; sourceTree = ""; }; BCFB079D1CBF4E39009B2333 /* FiveInput.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = FiveInput.vsh; path = Source/Operations/Shaders/FiveInput.vsh; sourceTree = ""; }; BCFB079E1CBF4E39009B2333 /* FourInput.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = FourInput.vsh; path = Source/Operations/Shaders/FourInput.vsh; sourceTree = ""; }; + F449DE341D5C0CB900BCBC64 /* GPUImageTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GPUImageTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -539,10 +538,10 @@ isa = PBXGroup; children = ( BCD1B1411C66A68E001F2BDC /* Info.plist */, - BCD1B1341C66A262001F2BDC /* GPUImageTests.swift */, + F449DE341D5C0CB900BCBC64 /* GPUImageTests.swift */, ); name = Tests; - path = GPUImageTests; + path = Tests/iOS; sourceTree = ""; }; BCE316E81CA0E59B00323D5B /* Base */ = { @@ -1007,7 +1006,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - BCD1B1431C66A695001F2BDC /* Info.plist in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1176,7 +1174,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BCD1B1351C66A262001F2BDC /* GPUImageTests.swift in Sources */, + F449DE351D5C0CB900BCBC64 /* GPUImageTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1326,7 +1324,7 @@ BCD1B13D1C66A262001F2BDC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - INFOPLIST_FILE = GPUImageTests/Info.plist; + INFOPLIST_FILE = Tests/iOS/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.sunsetlakesoftware.GPUImageTests; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1336,7 +1334,7 @@ BCD1B13E1C66A262001F2BDC /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - INFOPLIST_FILE = GPUImageTests/Info.plist; + INFOPLIST_FILE = Tests/iOS/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.sunsetlakesoftware.GPUImageTests; PRODUCT_NAME = "$(TARGET_NAME)"; From a7c6690bdecf856cf9dba8aad7f7c480974f0beb Mon Sep 17 00:00:00 2001 From: Simon Kim Date: Thu, 11 Aug 2016 11:03:04 +0900 Subject: [PATCH 2/3] Add CameraError test case to iOS GPUImageTests The test case reproduces runtime crash 'fatal error: unexpectedly found nil while unwrapping an Optional value' --- framework/Tests/iOS/GPUImageTests.swift | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/framework/Tests/iOS/GPUImageTests.swift b/framework/Tests/iOS/GPUImageTests.swift index b5b46a0b..7d2c1036 100755 --- a/framework/Tests/iOS/GPUImageTests.swift +++ b/framework/Tests/iOS/GPUImageTests.swift @@ -8,6 +8,7 @@ import XCTest @testable import GPUImage +import AVFoundation class GPUImageTests: XCTestCase { @@ -33,4 +34,17 @@ class GPUImageTests: XCTestCase { } } + func testCameraError() { + if ( PhysicalCameraLocation.BackFacing.device() == nil && PhysicalCameraLocation.FrontFacing.device() == nil) { + do { + let camera = try Camera(sessionPreset:AVCaptureSessionPreset640x480) + XCTFail("Camera():\(camera) should throw error on Simulator") + } catch { + XCTAssert(error is CameraError, "Exception should be CameraError") + } + } else { + XCTAssert(true, "Untestable condition: camera available") + } + } + } From 0ac2f88fcf25dcccaa3d124be538c9c23083fd63 Mon Sep 17 00:00:00 2001 From: Simon Kim Date: Wed, 10 Aug 2016 17:55:50 +0900 Subject: [PATCH 3/3] Fix crash at Camera.deinit when location.devices() returns nil in init() Setting nil to videoOutput before throwing an Exception in Camera.init() causes deinit() fails to access self.videoOutput. Instead, it's safer to initialize videoOutput with a proper value. With this change, testCameraError() in iOS GPUImageTests passes --- framework/Source/iOS/Camera.swift | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/framework/Source/iOS/Camera.swift b/framework/Source/iOS/Camera.swift index 845b6bd8..1f5b7fed 100755 --- a/framework/Source/iOS/Camera.swift +++ b/framework/Source/iOS/Camera.swift @@ -94,6 +94,9 @@ public class Camera: NSObject, ImageSource, AVCaptureVideoDataOutputSampleBuffer self.captureSession = AVCaptureSession() self.captureSession.beginConfiguration() + // Add the video frame output + videoOutput = AVCaptureVideoDataOutput() + videoOutput.alwaysDiscardsLateVideoFrames = false if let cameraDevice = cameraDevice { self.inputCamera = cameraDevice } else { @@ -101,7 +104,6 @@ public class Camera: NSObject, ImageSource, AVCaptureVideoDataOutputSampleBuffer self.inputCamera = device } else { self.videoInput = nil - self.videoOutput = nil self.yuvConversionShader = nil self.inputCamera = nil super.init() @@ -113,7 +115,6 @@ public class Camera: NSObject, ImageSource, AVCaptureVideoDataOutputSampleBuffer self.videoInput = try AVCaptureDeviceInput(device:inputCamera) } catch { self.videoInput = nil - self.videoOutput = nil self.yuvConversionShader = nil super.init() throw error @@ -122,9 +123,6 @@ public class Camera: NSObject, ImageSource, AVCaptureVideoDataOutputSampleBuffer captureSession.addInput(videoInput) } - // Add the video frame output - videoOutput = AVCaptureVideoDataOutput() - videoOutput.alwaysDiscardsLateVideoFrames = false if captureAsYUV { supportsFullYUVRange = false