Skip to content

Commit 939d5c4

Browse files
committed
[camera_avfoundation] Adds support for video stabilization
- Implements getSupportedVideoStabilizationModes() and setVideoStabilizationMode() methods in AVFoundationCamera.
1 parent e5750bc commit 939d5c4

File tree

23 files changed

+652
-27
lines changed

23 files changed

+652
-27
lines changed

packages/camera/camera_avfoundation/AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,4 @@ Aleksandr Yurkovskiy <sanekyy@gmail.com>
6464
Anton Borries <mail@antonborri.es>
6565
Alex Li <google@alexv525.com>
6666
Rahul Raj <64.rahulraj@gmail.com>
67+
Rui Craveiro <ruicraveiro@squarealfa.com>

packages/camera/camera_avfoundation/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.10.0
2+
3+
* Adds video stabilization.
4+
15
## 0.9.22+6
26

37
* Updates to Pigeon 26.

packages/camera/camera_avfoundation/example/ios/Runner.xcodeproj/project.pbxproj

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
archiveVersion = 1;
44
classes = {
55
};
6-
objectVersion = 60;
6+
objectVersion = 54;
77
objects = {
88

99
/* Begin PBXBuildFile section */
@@ -340,8 +340,6 @@
340340
03BB766E2665316900CE5A93 /* PBXTargetDependency */,
341341
);
342342
name = RunnerTests;
343-
packageProductDependencies = (
344-
);
345343
productName = camera_exampleTests;
346344
productReference = 03BB76682665316900CE5A93 /* RunnerTests.xctest */;
347345
productType = "com.apple.product-type.bundle.unit-test";
@@ -401,7 +399,7 @@
401399
);
402400
mainGroup = 97C146E51CF9000F007C117D;
403401
packageReferences = (
404-
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */,
402+
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */,
405403
);
406404
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
407405
projectDirPath = "";
@@ -879,7 +877,7 @@
879877
/* End XCConfigurationList section */
880878

881879
/* Begin XCLocalSwiftPackageReference section */
882-
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage" */ = {
880+
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = {
883881
isa = XCLocalSwiftPackageReference;
884882
relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage;
885883
};

packages/camera/camera_avfoundation/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
buildConfiguration = "Debug"
4545
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
4646
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
47+
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
4748
shouldUseLaunchSchemeArgsEnv = "YES">
4849
<MacroExpansion>
4950
<BuildableReference
@@ -71,6 +72,7 @@
7172
buildConfiguration = "Debug"
7273
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
7374
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
75+
customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit"
7476
launchStyle = "0"
7577
useCustomWorkingDirectory = "NO"
7678
ignoresPersistentStateOnLaunch = "NO"

packages/camera/camera_avfoundation/example/ios/RunnerTests/Mocks/MockCamera.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ final class MockCamera: NSObject, Camera {
4141
var setDescriptionWhileRecordingStub: ((String, ((FlutterError?) -> Void)?) -> Void)?
4242
var startImageStreamStub: ((FlutterBinaryMessenger, (FlutterError?) -> Void) -> Void)?
4343
var stopImageStreamStub: (() -> Void)?
44+
var setVideoStabilizationModeStub:
45+
((FCPPlatformVideoStabilizationMode, (FlutterError?) -> Void) -> Void)?
46+
var getIsVideoStabilizationModeSupportedStub: ((FCPPlatformVideoStabilizationMode) -> Bool)?
4447

4548
var dartAPI: FCPCameraEventApi? {
4649
get {
@@ -185,6 +188,16 @@ final class MockCamera: NSObject, Camera {
185188
resumePreviewStub?()
186189
}
187190

191+
func setVideoStabilizationMode(
192+
_ mode: FCPPlatformVideoStabilizationMode, withCompletion: @escaping (FlutterError?) -> Void
193+
) {
194+
setVideoStabilizationModeStub?(mode, withCompletion)
195+
}
196+
197+
func isVideoStabilizationModeSupported(_ mode: FCPPlatformVideoStabilizationMode) -> Bool {
198+
return getIsVideoStabilizationModeSupportedStub?(mode) ?? false
199+
}
200+
188201
func setDescriptionWhileRecording(
189202
_ cameraName: String,
190203
withCompletion completion: @escaping (FlutterError?) -> Void

packages/camera/camera_avfoundation/example/ios/RunnerTests/Mocks/MockCaptureConnection.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ final class MockCaptureConnection: NSObject, FLTCaptureConnection {
2626
var inputPorts: [AVCaptureInput.Port] = []
2727
var isVideoMirroringSupported = false
2828
var isVideoOrientationSupported = false
29+
var preferredVideoStabilizationMode = AVCaptureVideoStabilizationMode.off
2930
}

packages/camera/camera_avfoundation/example/ios/RunnerTests/Mocks/MockCaptureDevice.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,12 @@ class MockCaptureDevice: NSObject, CaptureDevice {
116116

117117
var iso: Float { 0 }
118118

119+
func isVideoStabilizationModeSupported(_ videoStabilizationMode: AVCaptureVideoStabilizationMode)
120+
-> Bool
121+
{
122+
return false
123+
}
124+
119125
func lockForConfiguration() throws {
120126
try lockForConfigurationStub?()
121127
}

packages/camera/camera_avfoundation/ios/camera_avfoundation/Sources/camera_avfoundation/Camera.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ protocol Camera: FlutterTexture, AVCaptureVideoDataOutputSampleBufferDelegate,
102102

103103
func setZoomLevel(_ zoom: CGFloat, withCompletion: @escaping (_ error: FlutterError?) -> Void)
104104

105+
func setVideoStabilizationMode(
106+
_ mode: FCPPlatformVideoStabilizationMode,
107+
withCompletion: @escaping (_ error: FlutterError?) -> Void)
108+
109+
func isVideoStabilizationModeSupported(_ mode: FCPPlatformVideoStabilizationMode) -> Bool
110+
105111
func setFlashMode(
106112
_ mode: FCPPlatformFlashMode,
107113
withCompletion: @escaping (_ error: FlutterError?) -> Void

packages/camera/camera_avfoundation/ios/camera_avfoundation/Sources/camera_avfoundation/CameraPlugin.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,28 @@ extension CameraPlugin: FCPCameraApi {
514514
}
515515
}
516516

517+
public func setVideoStabilizationMode(
518+
_ mode: FCPPlatformVideoStabilizationMode, completion: @escaping (FlutterError?) -> Void
519+
) {
520+
captureSessionQueue.async { [weak self] in
521+
self?.camera?.setVideoStabilizationMode(mode, withCompletion: completion)
522+
}
523+
}
524+
525+
public func isVideoStabilizationModeSupported(
526+
_ mode: FCPPlatformVideoStabilizationMode,
527+
completion: @escaping (NSNumber?, FlutterError?) -> Void
528+
) {
529+
captureSessionQueue.async { [weak self] in
530+
531+
if let isSupported = self?.camera?.isVideoStabilizationModeSupported(mode) {
532+
completion(NSNumber(value: isSupported), nil)
533+
} else {
534+
completion(nil, nil)
535+
}
536+
}
537+
}
538+
517539
public func pausePreview(completion: @escaping (FlutterError?) -> Void) {
518540
captureSessionQueue.async { [weak self] in
519541
self?.camera?.pausePreview()

packages/camera/camera_avfoundation/ios/camera_avfoundation/Sources/camera_avfoundation/CaptureDevice.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,10 @@ protocol CaptureDevice: NSObjectProtocol {
5858
var minAvailableVideoZoomFactor: CGFloat { get }
5959
var videoZoomFactor: CGFloat { get set }
6060

61+
// Video Stabilization
62+
func isVideoStabilizationModeSupported(_ videoStabilizationMode: AVCaptureVideoStabilizationMode)
63+
-> Bool
64+
6165
// Camera Properties
6266
var lensAperture: Float { get }
6367
var exposureDuration: CMTime { get }
@@ -99,6 +103,13 @@ extension AVCaptureDevice: CaptureDevice {
99103
var flutterFormats: [FLTCaptureDeviceFormat] {
100104
return self.formats.map { FLTDefaultCaptureDeviceFormat.init(format: $0) }
101105
}
106+
107+
func isVideoStabilizationModeSupported(_ videoStabilizationMode: AVCaptureVideoStabilizationMode)
108+
-> Bool
109+
{
110+
return self.activeFormat.isVideoStabilizationModeSupported(videoStabilizationMode)
111+
}
112+
102113
}
103114

104115
extension AVCaptureInput: CaptureInput {

0 commit comments

Comments
 (0)