From 0dea11a0ebd90c0747c8c6dfd187aeaea4d824ad Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 15:59:54 -0700 Subject: [PATCH 01/13] Fix unguarded availability in Camera plugin --- packages/camera/CHANGELOG.md | 6 +- packages/camera/ios/Classes/CameraPlugin.m | 77 ++++++++++++---------- packages/camera/pubspec.yaml | 2 +- 3 files changed, 47 insertions(+), 38 deletions(-) diff --git a/packages/camera/CHANGELOG.md b/packages/camera/CHANGELOG.md index 88c0ed8c7625..2cf34dd55588 100644 --- a/packages/camera/CHANGELOG.md +++ b/packages/camera/CHANGELOG.md @@ -1,10 +1,14 @@ +## 0.5.8+5 + +* Fix compilation/availability issues on iOS. + ## 0.5.8+4 * Fixed bug caused by casting a `CameraAccessException` on Android. ## 0.5.8+3 -* Fix bug in usage example in README.md +* Fix bug in usage example in README.md ## 0.5.8+2 diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 42cdb6d5fdf9..02f66e4c5410 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -204,7 +204,7 @@ - (void)startVideoRecordingAtPath:(NSString *)path result:(FlutterResult)result; - (void)stopVideoRecordingWithResult:(FlutterResult)result; - (void)startImageStreamWithMessenger:(NSObject *)messenger; - (void)stopImageStream; -- (void)captureToFile:(NSString *)filename result:(FlutterResult)result; +- (void)captureToFile:(NSString *)filename result:(FlutterResult)result API_AVAILABLE(ios(10)); @end @implementation FLTCam { @@ -288,6 +288,14 @@ - (void)captureToFile:(NSString *)path result:(FlutterResult)result { - (void)setCaptureSessionPreset:(ResolutionPreset)resolutionPreset { switch (resolutionPreset) { case max: + case ultraHigh: + if (@available(iOS 9.0, *)) { + if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset3840x2160]) { + _captureSession.sessionPreset = AVCaptureSessionPreset3840x2160; + _previewSize = CGSizeMake(3840, 2160); + break; + } + } if ([_captureSession canSetSessionPreset:AVCaptureSessionPresetHigh]) { _captureSession.sessionPreset = AVCaptureSessionPresetHigh; _previewSize = @@ -295,12 +303,6 @@ - (void)setCaptureSessionPreset:(ResolutionPreset)resolutionPreset { _captureDevice.activeFormat.highResolutionStillImageDimensions.height); break; } - case ultraHigh: - if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset3840x2160]) { - _captureSession.sessionPreset = AVCaptureSessionPreset3840x2160; - _previewSize = CGSizeMake(3840, 2160); - break; - } case veryHigh: if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset1920x1080]) { _captureSession.sessionPreset = AVCaptureSessionPreset1920x1080; @@ -800,34 +802,36 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result } - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"availableCameras" isEqualToString:call.method]) { - AVCaptureDeviceDiscoverySession *discoverySession = [AVCaptureDeviceDiscoverySession - discoverySessionWithDeviceTypes:@[ AVCaptureDeviceTypeBuiltInWideAngleCamera ] - mediaType:AVMediaTypeVideo - position:AVCaptureDevicePositionUnspecified]; - NSArray *devices = discoverySession.devices; - NSMutableArray *> *reply = - [[NSMutableArray alloc] initWithCapacity:devices.count]; - for (AVCaptureDevice *device in devices) { - NSString *lensFacing; - switch ([device position]) { - case AVCaptureDevicePositionBack: - lensFacing = @"back"; - break; - case AVCaptureDevicePositionFront: - lensFacing = @"front"; - break; - case AVCaptureDevicePositionUnspecified: - lensFacing = @"external"; - break; + if (@available(iOS 10.0, *)) { + if ([@"availableCameras" isEqualToString:call.method]) { + AVCaptureDeviceDiscoverySession *discoverySession = [AVCaptureDeviceDiscoverySession + discoverySessionWithDeviceTypes:@[ AVCaptureDeviceTypeBuiltInWideAngleCamera ] + mediaType:AVMediaTypeVideo + position:AVCaptureDevicePositionUnspecified]; + NSArray *devices = discoverySession.devices; + NSMutableArray *> *reply = + [[NSMutableArray alloc] initWithCapacity:devices.count]; + for (AVCaptureDevice *device in devices) { + NSString *lensFacing; + switch ([device position]) { + case AVCaptureDevicePositionBack: + lensFacing = @"back"; + break; + case AVCaptureDevicePositionFront: + lensFacing = @"front"; + break; + case AVCaptureDevicePositionUnspecified: + lensFacing = @"external"; + break; + } + [reply addObject:@{ + @"name" : [device uniqueID], + @"lensFacing" : lensFacing, + @"sensorOrientation" : @90, + }]; } - [reply addObject:@{ - @"name" : [device uniqueID], - @"lensFacing" : lensFacing, - @"sensorOrientation" : @90, - }]; + result(reply); } - result(reply); } else if ([@"initialize" isEqualToString:call.method]) { NSString *cameraName = call.arguments[@"cameraName"]; NSString *resolutionPreset = call.arguments[@"resolutionPreset"]; @@ -880,9 +884,10 @@ - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)re } else { NSDictionary *argsMap = call.arguments; NSUInteger textureId = ((NSNumber *)argsMap[@"textureId"]).unsignedIntegerValue; - - if ([@"takePicture" isEqualToString:call.method]) { - [_camera captureToFile:call.arguments[@"path"] result:result]; + if (@available(iOS 10.0, *)) { + if ([@"takePicture" isEqualToString:call.method]) { + [_camera captureToFile:call.arguments[@"path"] result:result]; + } } else if ([@"dispose" isEqualToString:call.method]) { [_registry unregisterTexture:textureId]; [_camera close]; diff --git a/packages/camera/pubspec.yaml b/packages/camera/pubspec.yaml index a93c016e1f10..01c7907792b2 100644 --- a/packages/camera/pubspec.yaml +++ b/packages/camera/pubspec.yaml @@ -2,7 +2,7 @@ name: camera description: A Flutter plugin for getting information about and controlling the camera on Android and iOS. Supports previewing the camera feed, capturing images, capturing video, and streaming image buffers to dart. -version: 0.5.8+4 +version: 0.5.8+5 homepage: https://github.com/flutter/plugins/tree/master/packages/camera From f31a05cad5006a1de6bc0981011e90a0eb8adcfd Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 16:13:33 -0700 Subject: [PATCH 02/13] format --- packages/camera/ios/Classes/CameraPlugin.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 02f66e4c5410..7e43bb4e878b 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -807,7 +807,7 @@ - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)re AVCaptureDeviceDiscoverySession *discoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[ AVCaptureDeviceTypeBuiltInWideAngleCamera ] mediaType:AVMediaTypeVideo - position:AVCaptureDevicePositionUnspecified]; + position:AVCaptureDevicePositionUnspecified]; NSArray *devices = discoverySession.devices; NSMutableArray *> *reply = [[NSMutableArray alloc] initWithCapacity:devices.count]; From 94b45db6d87d48506612f898ce6c9c047302b5a6 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 16:27:16 -0700 Subject: [PATCH 03/13] cirrus update --- .cirrus.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.yml b/.cirrus.yml index 8120b79842d3..d27ce6865e55 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -157,7 +157,7 @@ task: - find . -name "*.podspec" | xargs grep -l "osx" | xargs rm # Skip the dummy podspecs used to placate the tool. - find . -name "*_web*.podspec" -o -name "*_mac*.podspec" | xargs rm - - ./script/incremental_build.sh podspecs --no-analyze camera --ignore-warnings camera + - ./script/incremental_build.sh podspecs - name: build-ipas+drive-examples env: PATH: $PATH:/usr/local/bin From 673273017093b0c830e607d1ae65f1d6f69e3c29 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 16:51:31 -0700 Subject: [PATCH 04/13] more --- packages/camera/ios/Classes/CameraPlugin.m | 42 ++++++++++++++-------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 7e43bb4e878b..66d3e60c9ff4 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -24,6 +24,13 @@ @interface FLTSavePhotoDelegate : NSObject result:(FlutterResult)result motionManager:(CMMotionManager *)motionManager cameraPosition:(AVCaptureDevicePosition)cameraPosition; + +- (void)captureOutput:(AVCapturePhotoOutput *)output +didFinishProcessingPhotoSampleBuffer:(CMSampleBufferRef)photoSampleBuffer + previewPhotoSampleBuffer:(CMSampleBufferRef)previewPhotoSampleBuffer + resolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings + bracketSettings:(AVCaptureBracketedStillImageSettings *)bracketSettings + error:(NSError *)error API_AVAILABLE(ios(10)); @end @interface FLTImageStreamHandler : NSObject @@ -160,14 +167,14 @@ @interface FLTCam : NSObject @property(readonly, nonatomic) int64_t textureId; -@property(nonatomic, copy) void (^onFrameAvailable)(); +@property(nonatomic, copy) void (^onFrameAvailable)(void); @property BOOL enableAudio; @property(nonatomic) FlutterEventChannel *eventChannel; @property(nonatomic) FLTImageStreamHandler *imageStreamHandler; @property(nonatomic) FlutterEventSink eventSink; @property(readonly, nonatomic) AVCaptureSession *captureSession; @property(readonly, nonatomic) AVCaptureDevice *captureDevice; -@property(readonly, nonatomic) AVCapturePhotoOutput *capturePhotoOutput; +@property(readonly, nonatomic) AVCapturePhotoOutput *capturePhotoOutput API_AVAILABLE(ios(10)); @property(readonly, nonatomic) AVCaptureVideoDataOutput *captureVideoOutput; @property(readonly, nonatomic) AVCaptureInput *captureVideoInput; @property(readonly) CVPixelBufferRef volatile latestPixelBuffer; @@ -254,9 +261,12 @@ - (instancetype)initWithCameraName:(NSString *)cameraName [_captureSession addInputWithNoConnections:_captureVideoInput]; [_captureSession addOutputWithNoConnections:_captureVideoOutput]; [_captureSession addConnection:connection]; - _capturePhotoOutput = [AVCapturePhotoOutput new]; - [_capturePhotoOutput setHighResolutionCaptureEnabled:YES]; - [_captureSession addOutput:_capturePhotoOutput]; + + if (@available(iOS 10.0, *)) { + _capturePhotoOutput = [AVCapturePhotoOutput new]; + [_capturePhotoOutput setHighResolutionCaptureEnabled:YES]; + [_captureSession addOutput:_capturePhotoOutput]; + } _motionManager = [[CMMotionManager alloc] init]; [_motionManager startAccelerometerUpdates]; @@ -273,16 +283,18 @@ - (void)stop { } - (void)captureToFile:(NSString *)path result:(FlutterResult)result { - AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings]; - if (_resolutionPreset == max) { - [settings setHighResolutionPhotoEnabled:YES]; + if (@available(iOS 10.0, *)) { + AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings]; + if (_resolutionPreset == max) { + [settings setHighResolutionPhotoEnabled:YES]; + } + [_capturePhotoOutput + capturePhotoWithSettings:settings + delegate:[[FLTSavePhotoDelegate alloc] initWithPath:path + result:result + motionManager:_motionManager + cameraPosition:_captureDevice.position]]; } - [_capturePhotoOutput - capturePhotoWithSettings:settings - delegate:[[FLTSavePhotoDelegate alloc] initWithPath:path - result:result - motionManager:_motionManager - cameraPosition:_captureDevice.position]]; } - (void)setCaptureSessionPreset:(ResolutionPreset)resolutionPreset { @@ -851,7 +863,7 @@ - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)re int64_t textureId = [_registry registerTexture:cam]; _camera = cam; cam.onFrameAvailable = ^{ - [_registry textureFrameAvailable:textureId]; + [self.registry textureFrameAvailable:textureId]; }; FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:[NSString From ac16333a1677d69a8eaa2dc191345c31cfe25258 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 16:55:32 -0700 Subject: [PATCH 05/13] jmagman review --- packages/camera/ios/Classes/CameraPlugin.m | 49 +++++----------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 66d3e60c9ff4..3233d7567a2d 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -19,18 +19,6 @@ @interface FLTSavePhotoDelegate : NSObject @property(readonly, nonatomic) FlutterResult result; @property(readonly, nonatomic) CMMotionManager *motionManager; @property(readonly, nonatomic) AVCaptureDevicePosition cameraPosition; - -- initWithPath:(NSString *)filename - result:(FlutterResult)result - motionManager:(CMMotionManager *)motionManager - cameraPosition:(AVCaptureDevicePosition)cameraPosition; - -- (void)captureOutput:(AVCapturePhotoOutput *)output -didFinishProcessingPhotoSampleBuffer:(CMSampleBufferRef)photoSampleBuffer - previewPhotoSampleBuffer:(CMSampleBufferRef)previewPhotoSampleBuffer - resolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings - bracketSettings:(AVCaptureBracketedStillImageSettings *)bracketSettings - error:(NSError *)error API_AVAILABLE(ios(10)); @end @interface FLTImageStreamHandler : NSObject @@ -75,7 +63,7 @@ - (void)captureOutput:(AVCapturePhotoOutput *)output previewPhotoSampleBuffer:(CMSampleBufferRef)previewPhotoSampleBuffer resolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings bracketSettings:(AVCaptureBracketedStillImageSettings *)bracketSettings - error:(NSError *)error { + error:(NSError *)error API_AVAILABLE(ios(10)) { selfReference = nil; if (error) { _result(getFlutterError(error)); @@ -199,19 +187,6 @@ @interface FLTCam : NSObject *)messenger; -- (void)stopImageStream; -- (void)captureToFile:(NSString *)filename result:(FlutterResult)result API_AVAILABLE(ios(10)); @end @implementation FLTCam { @@ -282,19 +257,17 @@ - (void)stop { [_captureSession stopRunning]; } -- (void)captureToFile:(NSString *)path result:(FlutterResult)result { - if (@available(iOS 10.0, *)) { - AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings]; - if (_resolutionPreset == max) { - [settings setHighResolutionPhotoEnabled:YES]; - } - [_capturePhotoOutput - capturePhotoWithSettings:settings - delegate:[[FLTSavePhotoDelegate alloc] initWithPath:path - result:result - motionManager:_motionManager - cameraPosition:_captureDevice.position]]; +- (void)captureToFile:(NSString *)path result:(FlutterResult)result API_AVAILABLE(ios(10)) { + AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings]; + if (_resolutionPreset == max) { + [settings setHighResolutionPhotoEnabled:YES]; } + [_capturePhotoOutput + capturePhotoWithSettings:settings + delegate:[[FLTSavePhotoDelegate alloc] initWithPath:path + result:result + motionManager:_motionManager + cameraPosition:_captureDevice.position]]; } - (void)setCaptureSessionPreset:(ResolutionPreset)resolutionPreset { From b97f499fb6d07d04f79e070758f1dd9efc319dd1 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 17:02:47 -0700 Subject: [PATCH 06/13] derp --- packages/camera/ios/Classes/CameraPlugin.m | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 3233d7567a2d..2176964d862c 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -265,9 +265,9 @@ - (void)captureToFile:(NSString *)path result:(FlutterResult)result API_AVAILABL [_capturePhotoOutput capturePhotoWithSettings:settings delegate:[[FLTSavePhotoDelegate alloc] initWithPath:path - result:result + result:result motionManager:_motionManager - cameraPosition:_captureDevice.position]]; + cameraPosition:_captureDevice.position]]; } - (void)setCaptureSessionPreset:(ResolutionPreset)resolutionPreset { @@ -787,8 +787,8 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result } - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)result { - if (@available(iOS 10.0, *)) { - if ([@"availableCameras" isEqualToString:call.method]) { + if ([@"availableCameras" isEqualToString:call.method]) { + if (@available(iOS 10.0, *)) { AVCaptureDeviceDiscoverySession *discoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[ AVCaptureDeviceTypeBuiltInWideAngleCamera ] mediaType:AVMediaTypeVideo @@ -816,6 +816,8 @@ - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)re }]; } result(reply); + } else { + result(FlutterMethodNotImplemented); } } else if ([@"initialize" isEqualToString:call.method]) { NSString *cameraName = call.arguments[@"cameraName"]; From a8710a2690138439deed0d70e3019af526225ef2 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 17:05:09 -0700 Subject: [PATCH 07/13] weakSelf --- packages/camera/ios/Classes/CameraPlugin.m | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 2176964d862c..d69269cc0f1e 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -837,8 +837,9 @@ - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)re } int64_t textureId = [_registry registerTexture:cam]; _camera = cam; + __weak CameraPlugin* weakSelf = self; cam.onFrameAvailable = ^{ - [self.registry textureFrameAvailable:textureId]; + [weakSelf.registry textureFrameAvailable:textureId]; }; FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:[NSString From a5a18b4a19436d8ceab52f66e8c8e32ed713cde0 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 17:10:09 -0700 Subject: [PATCH 08/13] format again --- packages/camera/ios/Classes/CameraPlugin.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index d69269cc0f1e..3d74184fbf48 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -837,7 +837,7 @@ - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)re } int64_t textureId = [_registry registerTexture:cam]; _camera = cam; - __weak CameraPlugin* weakSelf = self; + __weak CameraPlugin *weakSelf = self; cam.onFrameAvailable = ^{ [weakSelf.registry textureFrameAvailable:textureId]; }; From 76a83890e09e9ac176809057b9ea994ac5389dc2 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 17:12:53 -0700 Subject: [PATCH 09/13] .. --- packages/camera/ios/Classes/CameraPlugin.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 3d74184fbf48..1eaf11ce1c90 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -872,9 +872,11 @@ - (void)handleMethodCallAsync:(FlutterMethodCall *)call result:(FlutterResult)re } else { NSDictionary *argsMap = call.arguments; NSUInteger textureId = ((NSNumber *)argsMap[@"textureId"]).unsignedIntegerValue; - if (@available(iOS 10.0, *)) { - if ([@"takePicture" isEqualToString:call.method]) { + if ([@"takePicture" isEqualToString:call.method]) { + if (@available(iOS 10.0, *)) { [_camera captureToFile:call.arguments[@"path"] result:result]; + } else { + result(FlutterMethodNotImplemented); } } else if ([@"dispose" isEqualToString:call.method]) { [_registry unregisterTexture:textureId]; From ef301fad3054843bbdf0bca053753ef307314078 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 17:15:40 -0700 Subject: [PATCH 10/13] fix podspec --- packages/camera/ios/camera.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/ios/camera.podspec b/packages/camera/ios/camera.podspec index dfe566ca79cc..a79f27049e51 100644 --- a/packages/camera/ios/camera.podspec +++ b/packages/camera/ios/camera.podspec @@ -16,7 +16,7 @@ A new flutter plugin project. s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' s.platform = :ios, '8.0' - s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS' => 'armv7 arm64 x86_64' } + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' } s.test_spec 'Tests' do |test_spec| test_spec.source_files = 'Tests/**/*' From f3201029213e4243c541775133b7cfcc5304c458 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 18:00:14 -0700 Subject: [PATCH 11/13] copy --- packages/camera/ios/Classes/CameraPlugin.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 1eaf11ce1c90..693ce3f273d8 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -472,7 +472,7 @@ - (void)captureOutput:(AVCaptureOutput *)output if (_audioTimeOffset.value != 0) { CFRelease(sampleBuffer); - sampleBuffer = [self adjustTime:sampleBuffer by:_audioTimeOffset]; + sampleBuffer = [self copyAdjustTime:sampleBuffer by:_audioTimeOffset]; } [self newAudioSample:sampleBuffer]; @@ -482,7 +482,7 @@ - (void)captureOutput:(AVCaptureOutput *)output } } -- (CMSampleBufferRef)adjustTime:(CMSampleBufferRef)sample by:(CMTime)offset { +- (CMSampleBufferRef)copyAdjustTime:(CMSampleBufferRef)sample by:(CMTime)offset { CMItemCount count; CMSampleBufferGetSampleTimingInfoArray(sample, 0, nil, &count); CMSampleTimingInfo *pInfo = malloc(sizeof(CMSampleTimingInfo) * count); From 1e3368f7ad16ea036a709e2cd2f19f1f32a62813 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 21:40:30 -0700 Subject: [PATCH 12/13] different way --- packages/camera/ios/Classes/CameraPlugin.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/camera/ios/Classes/CameraPlugin.m b/packages/camera/ios/Classes/CameraPlugin.m index 693ce3f273d8..525c1286717a 100644 --- a/packages/camera/ios/Classes/CameraPlugin.m +++ b/packages/camera/ios/Classes/CameraPlugin.m @@ -472,7 +472,7 @@ - (void)captureOutput:(AVCaptureOutput *)output if (_audioTimeOffset.value != 0) { CFRelease(sampleBuffer); - sampleBuffer = [self copyAdjustTime:sampleBuffer by:_audioTimeOffset]; + sampleBuffer = [self adjustTime:sampleBuffer by:_audioTimeOffset]; } [self newAudioSample:sampleBuffer]; @@ -482,7 +482,7 @@ - (void)captureOutput:(AVCaptureOutput *)output } } -- (CMSampleBufferRef)copyAdjustTime:(CMSampleBufferRef)sample by:(CMTime)offset { +- (CMSampleBufferRef)adjustTime:(CMSampleBufferRef)sample by:(CMTime)offset CF_RETURNS_RETAINED { CMItemCount count; CMSampleBufferGetSampleTimingInfoArray(sample, 0, nil, &count); CMSampleTimingInfo *pInfo = malloc(sizeof(CMSampleTimingInfo) * count); From c6f8bcac1cfad606ad22492fafc653a41ae1f8fe Mon Sep 17 00:00:00 2001 From: Dan Field Date: Wed, 12 Aug 2020 22:11:48 -0700 Subject: [PATCH 13/13] cleanup podspec --- packages/camera/ios/camera.podspec | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/camera/ios/camera.podspec b/packages/camera/ios/camera.podspec index a79f27049e51..960f102e7706 100644 --- a/packages/camera/ios/camera.podspec +++ b/packages/camera/ios/camera.podspec @@ -4,17 +4,19 @@ Pod::Spec.new do |s| s.name = 'camera' s.version = '0.0.1' - s.summary = 'A new flutter plugin project.' + s.summary = 'Flutter Camera' s.description = <<-DESC -A new flutter plugin project. +A Flutter plugin to use the camera from your Flutter app. DESC - s.homepage = 'http://example.com' - s.license = { :file => '../LICENSE' } - s.author = { 'Your Company' => 'email@example.com' } - s.source = { :path => '.' } + s.homepage = 'https://github.com/flutter/plugins' + s.license = { :type => 'BSD', :file => '../LICENSE' } + s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } + s.source = { :http => 'https://github.com/flutter/plugins/tree/master/packages/camera' } + s.documentation_url = 'https://pub.dev/packages/camera' s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' + s.platform = :ios, '8.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }