diff --git a/packages/camera/camera_platform_interface/AUTHORS b/packages/camera/camera_platform_interface/AUTHORS index 0d1bfa6a90c..d21929d105f 100644 --- a/packages/camera/camera_platform_interface/AUTHORS +++ b/packages/camera/camera_platform_interface/AUTHORS @@ -65,3 +65,4 @@ Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> Mairramer +Rui Craveiro \ No newline at end of file diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index 6c90a8a5c3e..7c011acbcbe 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.12.0 + +* Adds support for video stabilization. + ## 2.11.0 * Adds a flag to configure a recording to be persistent across camera changes. See diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index 6fc4f8e17b5..152437a7331 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -281,6 +281,34 @@ abstract class CameraPlatform extends PlatformInterface { throw UnimplementedError('setZoomLevel() is not implemented.'); } + /// Gets a list of video stabilization modes that are supported for the selected camera. + Future> getSupportedVideoStabilizationModes( + int cameraId, + ) => Future>.value([]); + + /// Sets the video stabilization mode for the selected camera. + Future setVideoStabilizationMode( + int cameraId, + VideoStabilizationMode mode, + ) { + throw UnimplementedError('setVideoStabilizationMode() is not implemented.'); + } + + /// Gets the fallback mode of video stabilization [mode]. + /// + /// This method returns the video stabilization mode that [setVideoStabilizationMode] + /// should set when the device does not support the given [mode]. + static VideoStabilizationMode? getFallbackVideoStabilizationMode( + VideoStabilizationMode mode, + ) { + return switch (mode) { + VideoStabilizationMode.off => null, + VideoStabilizationMode.level1 => VideoStabilizationMode.off, + VideoStabilizationMode.level2 => VideoStabilizationMode.level1, + VideoStabilizationMode.level3 => VideoStabilizationMode.level2, + }; + } + /// Pause the active preview on the current frame for the selected camera. Future pausePreview(int cameraId) { throw UnimplementedError('pausePreview() is not implemented.'); diff --git a/packages/camera/camera_platform_interface/lib/src/types/types.dart b/packages/camera/camera_platform_interface/lib/src/types/types.dart index 2bdc8407e6d..5f51756490e 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/types.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/types.dart @@ -13,3 +13,4 @@ export 'image_format_group.dart'; export 'media_settings.dart'; export 'resolution_preset.dart'; export 'video_capture_options.dart'; +export 'video_stabilization_mode.dart'; diff --git a/packages/camera/camera_platform_interface/lib/src/types/video_stabilization_mode.dart b/packages/camera/camera_platform_interface/lib/src/types/video_stabilization_mode.dart new file mode 100644 index 00000000000..97d704360bf --- /dev/null +++ b/packages/camera/camera_platform_interface/lib/src/types/video_stabilization_mode.dart @@ -0,0 +1,18 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/// The possible video stabilization modes that can be capturing video. +enum VideoStabilizationMode { + /// Video stabilization is disabled. + off, + + /// Least stabilized video stabilization mode with the least latency. + level1, + + /// More stabilized video with more latency. + level2, + + /// Most stabilized video with the most latency. + level3, +} diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index ec310739676..f3e45edb835 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.11.0 +version: 2.12.0 environment: sdk: ^3.7.0 diff --git a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart index d664c7d7283..e252ba9e613 100644 --- a/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart +++ b/packages/camera/camera_platform_interface/test/camera_platform_interface_test.dart @@ -531,6 +531,48 @@ void main() { expect(cameraPlatform.supportsImageStreaming(), false); }, ); + + test( + 'getFallbackVideoStabilizationMode returns level2 for mode level3', + () { + final VideoStabilizationMode? fallbackMode = + CameraPlatform.getFallbackVideoStabilizationMode( + VideoStabilizationMode.level3, + ); + + expect(fallbackMode, VideoStabilizationMode.level2); + }, + ); + + test( + 'getFallbackVideoStabilizationMode returns level1 for mode level2', + () { + final VideoStabilizationMode? fallbackMode = + CameraPlatform.getFallbackVideoStabilizationMode( + VideoStabilizationMode.level2, + ); + + expect(fallbackMode, VideoStabilizationMode.level1); + }, + ); + + test('getFallbackVideoStabilizationMode returns off for mode level1', () { + final VideoStabilizationMode? fallbackMode = + CameraPlatform.getFallbackVideoStabilizationMode( + VideoStabilizationMode.level1, + ); + + expect(fallbackMode, VideoStabilizationMode.off); + }); + + test('getFallbackVideoStabilizationMode returns null for mode off', () { + final VideoStabilizationMode? fallbackMode = + CameraPlatform.getFallbackVideoStabilizationMode( + VideoStabilizationMode.off, + ); + + expect(fallbackMode, null); + }); }); group('exports', () { diff --git a/packages/camera/camera_platform_interface/test/types/video_stabilization_mode_test.dart b/packages/camera/camera_platform_interface/test/types/video_stabilization_mode_test.dart new file mode 100644 index 00000000000..d090717af07 --- /dev/null +++ b/packages/camera/camera_platform_interface/test/types/video_stabilization_mode_test.dart @@ -0,0 +1,23 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:camera_platform_interface/src/types/video_stabilization_mode.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('VideoStabilizationMode should contain 4 options', () { + const List values = VideoStabilizationMode.values; + + expect(values.length, 4); + }); + + test('VideoStabilizationMode enum should have items in correct index', () { + const List values = VideoStabilizationMode.values; + + expect(values[0], VideoStabilizationMode.off); + expect(values[1], VideoStabilizationMode.level1); + expect(values[2], VideoStabilizationMode.level2); + expect(values[3], VideoStabilizationMode.level3); + }); +}