From d3ec9b83093e20f04e396caa7664fd1844d47e3c Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Mon, 4 Sep 2023 11:42:32 +0300 Subject: [PATCH 01/16] PR that has only the platform interface package changes from the #3586 PR --- .../camera_platform_interface/CHANGELOG.md | 4 + .../lib/camera_platform_interface.dart | 1 + .../method_channel/method_channel_camera.dart | 21 +++++- .../platform_interface/camera_platform.dart | 17 ++++- .../lib/src/types/media_settings.dart | 60 +++++++++++++++ .../lib/src/types/types.dart | 1 + .../camera_platform_interface/pubspec.yaml | 2 +- .../test/camera_platform_interface_test.dart | 10 ++- .../method_channel_camera_test.dart | 74 +++++++++++++++---- 9 files changed, 166 insertions(+), 24 deletions(-) create mode 100644 packages/camera/camera_platform_interface/lib/src/types/media_settings.dart diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index 62a4140aa522..2d185ce0f1ec 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.6.0 + +* Adds support to control video fps and bitrate. See `CameraController.withSettings`. + ## 2.5.2 * Adds pub topics to package metadata. diff --git a/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart b/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart index 6fab99b3d694..25fc417a9cc4 100644 --- a/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart +++ b/packages/camera/camera_platform_interface/lib/camera_platform_interface.dart @@ -8,4 +8,5 @@ export 'package:cross_file/cross_file.dart'; export 'src/events/camera_event.dart'; export 'src/events/device_event.dart'; export 'src/platform_interface/camera_platform.dart'; +export 'src/types/media_settings.dart'; export 'src/types/types.dart'; diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index 14d20fc817b2..d2a7b6304ae2 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -88,15 +88,28 @@ class MethodChannelCamera extends CameraPlatform { CameraDescription cameraDescription, ResolutionPreset? resolutionPreset, { bool enableAudio = false, - }) async { + }) async => + createCameraWithSettings( + cameraDescription, + MediaSettings( + resolutionPreset: resolutionPreset, enableAudio: enableAudio)); + + @override + Future createCameraWithSettings( + CameraDescription cameraDescription, + MediaSettings? mediaSettings, + ) async { try { final Map? reply = await _channel .invokeMapMethod('create', { 'cameraName': cameraDescription.name, - 'resolutionPreset': resolutionPreset != null - ? _serializeResolutionPreset(resolutionPreset) + 'resolutionPreset': null != mediaSettings?.resolutionPreset + ? _serializeResolutionPreset(mediaSettings!.resolutionPreset!) : null, - 'enableAudio': enableAudio, + 'fps': mediaSettings?.fps, + 'videoBitrate': mediaSettings?.videoBitrate, + 'audioBitrate': mediaSettings?.audioBitrate, + 'enableAudio': mediaSettings?.enableAudio ?? false, }); return reply!['cameraId']! as int; 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 b43629d4e0c3..da1e7ada87b3 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 @@ -51,8 +51,21 @@ abstract class CameraPlatform extends PlatformInterface { CameraDescription cameraDescription, ResolutionPreset? resolutionPreset, { bool enableAudio = false, - }) { - throw UnimplementedError('createCamera() is not implemented.'); + }) => + createCameraWithSettings( + cameraDescription, + MediaSettings( + resolutionPreset: resolutionPreset, + enableAudio: enableAudio, + ), + ); + + /// Creates an uninitialized camera instance and returns the cameraId. + Future createCameraWithSettings( + CameraDescription cameraDescription, + MediaSettings? mediaSettings, + ) { + throw UnimplementedError('createCameraWithSettings() is not implemented.'); } /// Initializes the camera on the device. diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart new file mode 100644 index 000000000000..79026f11c374 --- /dev/null +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -0,0 +1,60 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// ignore_for_file: avoid_equals_and_hash_code_on_mutable_classes + +import 'resolution_preset.dart'; + +/// Recording media settings. +/// +/// Used in [CameraPlatform.createCameraWithSettings]. +/// Allows to tune recorded video parameters, such as resolution, frame rate, bitrate. +class MediaSettings { + /// Creates a [MediaSettings]. + const MediaSettings({ + this.resolutionPreset, + this.fps, + this.videoBitrate, + this.audioBitrate, + this.enableAudio = false, + }); + + /// [ResolutionPreset] affect the quality of video recording and image capture. + final ResolutionPreset? resolutionPreset; + + /// Rate at which frames should be captured by the camera in frames per second. + final int? fps; + + /// The video encoding bit rate for recording. + final int? videoBitrate; + + /// The audio encoding bit rate for recording. + final int? audioBitrate; + + /// Controls audio presence in recorded video. + final bool enableAudio; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is MediaSettings && + runtimeType == other.runtimeType && + resolutionPreset == other.resolutionPreset && + fps == other.fps && + videoBitrate == other.videoBitrate && + audioBitrate == other.audioBitrate && + enableAudio == other.enableAudio; + + @override + int get hashCode => + resolutionPreset.hashCode ^ + fps.hashCode ^ + videoBitrate.hashCode ^ + audioBitrate.hashCode ^ + enableAudio.hashCode; + + @override + String toString() => + 'MediaSettings{resolutionPreset: $resolutionPreset, fps: $fps, videoBitrate: $videoBitrate, audioBitrate: $audioBitrate, enableAudio: $enableAudio}'; +} 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 a8a4f8ca5dc4..f9a81559d680 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/types.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/types.dart @@ -9,5 +9,6 @@ export 'exposure_mode.dart'; export 'flash_mode.dart'; export 'focus_mode.dart'; export 'image_format_group.dart'; +export 'media_settings.dart'; export 'resolution_preset.dart'; export 'video_capture_options.dart'; diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 09caeda73eb8..b0c3a1d8bff0 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.5.2 +version: 2.6.0 environment: sdk: ">=2.19.0 <4.0.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 e3b6858e6d25..b3ea1d4e82c6 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 @@ -157,13 +157,19 @@ void main() { // Act & Assert expect( - () => cameraPlatform.createCamera( + () => cameraPlatform.createCameraWithSettings( const CameraDescription( name: 'back', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ), throwsUnimplementedError, ); diff --git a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart index 1fd6445e7464..8159cdfe26f5 100644 --- a/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart +++ b/packages/camera/camera_platform_interface/test/method_channel/method_channel_camera_test.dart @@ -33,12 +33,17 @@ void main() { final MethodChannelCamera camera = MethodChannelCamera(); // Act - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0), - ResolutionPreset.high, + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + ), ); // Assert @@ -47,7 +52,10 @@ void main() { 'create', arguments: { 'cameraName': 'Test', - 'resolutionPreset': 'high', + 'resolutionPreset': 'low', + 'fps': 15, + 'videoBitrate': 200000, + 'audioBitrate': 32000, 'enableAudio': false }, ), @@ -71,13 +79,19 @@ void main() { // Act expect( - () => camera.createCamera( + () => camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ), throwsA( isA() @@ -105,13 +119,19 @@ void main() { // Act expect( - () => camera.createCamera( + () => camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ), throwsA( isA() @@ -167,13 +187,19 @@ void main() { 'initialize': null }); final MethodChannelCamera camera = MethodChannelCamera(); - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); // Act @@ -214,13 +240,19 @@ void main() { }); final MethodChannelCamera camera = MethodChannelCamera(); - final int cameraId = await camera.createCamera( + final int cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -262,13 +294,19 @@ void main() { }, ); camera = MethodChannelCamera(); - cameraId = await camera.createCamera( + cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add(CameraInitializedEvent( @@ -432,13 +470,19 @@ void main() { }, ); camera = MethodChannelCamera(); - cameraId = await camera.createCamera( + cameraId = await camera.createCameraWithSettings( const CameraDescription( name: 'Test', lensDirection: CameraLensDirection.back, sensorOrientation: 0, ), - ResolutionPreset.high, + const MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ), ); final Future initializeFuture = camera.initializeCamera(cameraId); camera.cameraEventStreamController.add( From 54e757ae9d7cb471a0883a52f095fa992b5f780b Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Mon, 4 Sep 2023 11:53:41 +0300 Subject: [PATCH 02/16] touch --- packages/camera/camera_platform_interface/AUTHORS | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/camera/camera_platform_interface/AUTHORS b/packages/camera/camera_platform_interface/AUTHORS index 493a0b4ef9c2..453c351073b2 100644 --- a/packages/camera/camera_platform_interface/AUTHORS +++ b/packages/camera/camera_platform_interface/AUTHORS @@ -64,3 +64,4 @@ Aleksandr Yurkovskiy Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> +PROGrand \ No newline at end of file From 197d67f367ad5ab73015437e29390993251fc31d Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Mon, 4 Sep 2023 11:54:09 +0300 Subject: [PATCH 03/16] touch --- packages/camera/camera_platform_interface/AUTHORS | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/camera/camera_platform_interface/AUTHORS b/packages/camera/camera_platform_interface/AUTHORS index 453c351073b2..c1c25f874403 100644 --- a/packages/camera/camera_platform_interface/AUTHORS +++ b/packages/camera/camera_platform_interface/AUTHORS @@ -63,5 +63,4 @@ Juan Alvarez Aleksandr Yurkovskiy Anton Borries Alex Li -Rahul Raj <64.rahulraj@gmail.com> -PROGrand \ No newline at end of file +Rahul Raj <64.rahulraj@gmail.com> \ No newline at end of file From 2a83a1095236be93683ab741c707fa70c30dd774 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Mon, 4 Sep 2023 11:55:11 +0300 Subject: [PATCH 04/16] touch --- packages/camera/camera_platform_interface/AUTHORS | 2 +- packages/camera/camera_platform_interface/pubspec.yaml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/AUTHORS b/packages/camera/camera_platform_interface/AUTHORS index c1c25f874403..493a0b4ef9c2 100644 --- a/packages/camera/camera_platform_interface/AUTHORS +++ b/packages/camera/camera_platform_interface/AUTHORS @@ -63,4 +63,4 @@ Juan Alvarez Aleksandr Yurkovskiy Anton Borries Alex Li -Rahul Raj <64.rahulraj@gmail.com> \ No newline at end of file +Rahul Raj <64.rahulraj@gmail.com> diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index b0c3a1d8bff0..5e93e0423e8c 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -2,6 +2,7 @@ name: camera_platform_interface description: A common platform interface for the camera plugin. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_platform_interface 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.6.0 From 5dbb4e834cd8bd27721a0473f185faf9a88aa54b Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Tue, 19 Sep 2023 08:27:47 +0300 Subject: [PATCH 05/16] Update packages/camera/camera_platform_interface/pubspec.yaml Co-authored-by: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> --- packages/camera/camera_platform_interface/pubspec.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 5e93e0423e8c..b0c3a1d8bff0 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -2,7 +2,6 @@ name: camera_platform_interface description: A common platform interface for the camera plugin. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_platform_interface 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.6.0 From 3343ceff5a8a112dbaa98828d1fa49c8268245bd Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Tue, 19 Sep 2023 08:28:01 +0300 Subject: [PATCH 06/16] Update packages/camera/camera_platform_interface/CHANGELOG.md Co-authored-by: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> --- packages/camera/camera_platform_interface/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index 2d185ce0f1ec..eaac4bc7ecc8 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,6 +1,6 @@ ## 2.6.0 -* Adds support to control video fps and bitrate. See `CameraController.withSettings`. +* Adds support to control video fps and bitrate. See `CameraPlatform.createCameraWithSettings`. ## 2.5.2 From 3a7db1a156b1f571ffd50c03cb5ff5a4d93273e8 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Thu, 21 Sep 2023 12:55:25 +0300 Subject: [PATCH 07/16] Applied suggestions of https://github.com/flutter/packages/pull/3615#pullrequestreview-1636395072 --- .../coverage/lcov.info | 619 ++++++++++++++++++ .../method_channel/method_channel_camera.dart | 15 +- .../platform_interface/camera_platform.dart | 4 +- .../lib/src/types/media_settings.dart | 59 +- .../test/camera_platform_interface_test.dart | 20 + .../test/types/media_settings_test.dart | 142 ++++ 6 files changed, 833 insertions(+), 26 deletions(-) create mode 100644 packages/camera/camera_platform_interface/coverage/lcov.info create mode 100644 packages/camera/camera_platform_interface/test/types/media_settings_test.dart diff --git a/packages/camera/camera_platform_interface/coverage/lcov.info b/packages/camera/camera_platform_interface/coverage/lcov.info new file mode 100644 index 000000000000..00d4f8ebbc7a --- /dev/null +++ b/packages/camera/camera_platform_interface/coverage/lcov.info @@ -0,0 +1,619 @@ +SF:lib\src\events\camera_event.dart +DA:30,3 +DA:35,2 +DA:38,2 +DA:39,6 +DA:40,6 +DA:42,1 +DA:43,2 +DA:53,2 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,2 +DA:70,1 +DA:71,2 +DA:72,1 +DA:73,2 +DA:95,4 +DA:96,2 +DA:97,2 +DA:98,2 +DA:99,4 +DA:100,2 +DA:101,4 +DA:102,2 +DA:105,2 +DA:108,2 +DA:109,2 +DA:110,6 +DA:111,6 +DA:112,6 +DA:113,6 +DA:114,6 +DA:115,6 +DA:116,6 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:126,1 +DA:137,2 +DA:145,1 +DA:146,1 +DA:147,1 +DA:148,2 +DA:158,4 +DA:159,2 +DA:160,2 +DA:161,2 +DA:164,2 +DA:167,2 +DA:168,2 +DA:169,6 +DA:170,6 +DA:171,6 +DA:173,1 +DA:174,4 +DA:181,2 +DA:185,1 +DA:186,2 +DA:190,4 +DA:191,2 +DA:194,2 +DA:197,2 +DA:198,1 +DA:199,3 +DA:201,1 +DA:205,1 +DA:214,2 +DA:218,1 +DA:219,1 +DA:220,2 +DA:227,4 +DA:228,2 +DA:229,2 +DA:232,2 +DA:235,2 +DA:236,2 +DA:237,6 +DA:238,6 +DA:240,1 +DA:241,3 +DA:251,0 +DA:255,0 +DA:256,0 +DA:257,0 +DA:258,0 +DA:260,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:276,0 +DA:279,0 +DA:280,0 +DA:281,0 +DA:282,0 +DA:284,0 +DA:285,0 +LF:102 +LH:85 +end_of_record +SF:lib\src\events\device_event.dart +DA:26,4 +DA:32,3 +DA:36,1 +DA:38,2 +DA:45,4 +DA:46,4 +DA:49,2 +DA:52,2 +DA:53,6 +DA:54,6 +DA:56,1 +DA:57,2 +LF:12 +LH:12 +end_of_record +SF:lib\src\platform_interface\camera_platform.dart +DA:24,6 +DA:26,6 +DA:28,3 +DA:33,2 +DA:37,1 +DA:38,2 +DA:45,1 +DA:46,1 +DA:50,1 +DA:55,1 +DA:57,1 +DA:66,1 +DA:70,1 +DA:79,1 +DA:83,1 +DA:87,1 +DA:88,1 +DA:93,1 +DA:94,1 +DA:98,1 +DA:99,1 +DA:103,1 +DA:104,1 +DA:108,0 +DA:109,0 +DA:116,1 +DA:117,1 +DA:122,1 +DA:124,1 +DA:128,1 +DA:129,1 +DA:133,1 +DA:134,1 +DA:138,1 +DA:139,1 +DA:151,1 +DA:152,1 +DA:159,0 +DA:160,0 +DA:161,0 +DA:165,1 +DA:166,1 +DA:170,1 +DA:171,1 +DA:175,1 +DA:176,1 +DA:189,0 +DA:191,0 +DA:196,1 +DA:197,1 +DA:201,1 +DA:202,1 +DA:209,1 +DA:210,1 +DA:214,1 +DA:215,1 +DA:219,1 +DA:220,1 +DA:226,1 +DA:227,1 +DA:241,1 +DA:242,1 +DA:246,1 +DA:247,1 +DA:254,1 +DA:255,1 +DA:259,1 +DA:260,1 +DA:264,1 +DA:265,1 +DA:273,1 +DA:274,1 +DA:278,1 +DA:279,1 +DA:283,1 +DA:284,1 +DA:288,0 +DA:289,0 +DA:294,0 +DA:295,0 +DA:299,1 +DA:300,1 +LF:82 +LH:71 +end_of_record +SF:lib\src\types\media_settings.dart +DA:16,4 +DA:22,1 +DA:23,1 +DA:25,1 +DA:49,1 +DA:54,3 +DA:57,1 +DA:58,3 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:65,1 +DA:66,1 +DA:67,1 +DA:68,1 +DA:69,1 +DA:70,1 +DA:71,1 +DA:74,0 +DA:76,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +LF:26 +LH:15 +end_of_record +SF:lib\src\utils\utils.dart +DA:10,2 +DA:12,2 +DA:14,2 +DA:16,1 +DA:19,1 +DA:23,3 +DA:25,3 +DA:27,1 +DA:29,1 +DA:31,1 +DA:37,3 +DA:39,3 +DA:41,1 +DA:43,1 +DA:45,1 +DA:48,0 +LF:16 +LH:15 +end_of_record +SF:lib\src\method_channel\method_channel_camera.dart +DA:22,2 +DA:25,2 +DA:26,0 +DA:59,1 +DA:60,2 +DA:61,4 +DA:63,1 +DA:67,1 +DA:70,0 +DA:73,2 +DA:74,1 +DA:75,1 +DA:77,2 +DA:78,1 +DA:80,1 +DA:81,1 +DA:82,3 +DA:86,0 +DA:92,0 +DA:94,0 +DA:97,1 +DA:104,1 +DA:106,2 +DA:107,1 +DA:109,2 +DA:111,1 +DA:112,1 +DA:113,1 +DA:114,1 +DA:117,1 +DA:118,1 +DA:119,3 +DA:123,1 +DA:128,3 +DA:130,2 +DA:131,1 +DA:132,0 +DA:136,1 +DA:138,4 +DA:139,1 +DA:142,1 +DA:144,1 +DA:146,1 +DA:148,1 +DA:153,1 +DA:154,1 +DA:158,1 +DA:159,3 +DA:165,1 +DA:168,1 +DA:170,2 +DA:171,2 +DA:172,1 +DA:173,2 +DA:176,1 +DA:178,1 +DA:182,1 +DA:184,2 +DA:187,1 +DA:189,2 +DA:192,1 +DA:194,2 +DA:197,1 +DA:199,2 +DA:202,0 +DA:204,0 +DA:207,1 +DA:209,2 +DA:210,1 +DA:213,1 +DA:218,1 +DA:220,1 +DA:222,1 +DA:227,1 +DA:229,1 +DA:231,1 +DA:235,1 +DA:237,1 +DA:239,1 +DA:243,0 +DA:245,0 +DA:249,1 +DA:252,1 +DA:254,1 +DA:256,1 +DA:259,1 +DA:260,1 +DA:263,1 +DA:265,1 +DA:267,1 +DA:268,1 +DA:269,2 +DA:270,1 +DA:274,1 +DA:275,0 +DA:276,0 +DA:280,1 +DA:282,1 +DA:284,1 +DA:288,0 +DA:290,0 +DA:294,1 +DA:297,1 +DA:298,1 +DA:300,1 +DA:303,1 +DA:305,1 +DA:307,1 +DA:310,1 +DA:313,2 +DA:314,2 +DA:317,1 +DA:319,2 +DA:320,0 +DA:321,1 +DA:322,1 +DA:323,1 +DA:325,1 +DA:328,1 +DA:329,1 +DA:332,1 +DA:333,1 +DA:334,1 +DA:337,1 +DA:340,1 +DA:341,2 +DA:342,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:349,0 +DA:350,0 +DA:354,1 +DA:355,1 +DA:356,2 +DA:357,1 +DA:358,1 +DA:361,0 +DA:362,0 +DA:366,1 +DA:368,1 +DA:370,1 +DA:372,1 +DA:376,1 +DA:378,1 +DA:380,1 +DA:382,1 +DA:386,1 +DA:388,5 +DA:389,5 +DA:391,1 +DA:393,1 +DA:396,1 +DA:397,1 +DA:402,1 +DA:404,1 +DA:406,1 +DA:412,1 +DA:414,1 +DA:416,1 +DA:422,1 +DA:424,1 +DA:426,1 +DA:432,1 +DA:434,1 +DA:436,1 +DA:445,1 +DA:447,1 +DA:449,1 +DA:451,1 +DA:455,1 +DA:457,5 +DA:458,5 +DA:460,1 +DA:462,1 +DA:465,1 +DA:466,1 +DA:471,1 +DA:473,1 +DA:475,1 +DA:481,1 +DA:483,1 +DA:485,1 +DA:491,1 +DA:494,1 +DA:496,1 +DA:501,1 +DA:502,3 +DA:506,1 +DA:508,1 +DA:510,1 +DA:514,1 +DA:516,1 +DA:518,1 +DA:522,1 +DA:525,1 +DA:527,1 +DA:528,1 +DA:533,1 +DA:535,1 +DA:539,1 +DA:541,1 +DA:543,1 +DA:545,1 +DA:547,1 +DA:553,1 +DA:555,1 +DA:557,1 +DA:559,1 +DA:561,1 +DA:563,1 +DA:565,1 +DA:574,1 +DA:575,1 +DA:576,1 +DA:577,1 +DA:578,3 +DA:579,2 +DA:582,0 +DA:590,1 +DA:592,1 +DA:593,1 +DA:594,1 +DA:595,3 +DA:597,1 +DA:598,1 +DA:599,2 +DA:600,1 +DA:601,2 +DA:602,1 +DA:605,1 +DA:606,1 +DA:607,3 +DA:609,1 +DA:610,1 +DA:613,1 +DA:614,3 +DA:618,1 +DA:619,0 +DA:620,0 +DA:622,0 +DA:623,0 +DA:624,0 +DA:628,1 +DA:629,1 +DA:630,3 +DA:632,1 +DA:636,1 +DA:644,1 +DA:645,2 +LF:250 +LH:221 +end_of_record +SF:lib\src\method_channel\type_conversion.dart +DA:11,1 +DA:12,1 +DA:13,2 +DA:14,1 +DA:15,1 +DA:16,1 +DA:17,1 +DA:18,1 +DA:19,1 +DA:20,2 +DA:21,2 +DA:25,1 +DA:26,2 +DA:29,1 +DA:30,2 +DA:32,1 +DA:34,0 +DA:39,2 +DA:41,1 +DA:44,0 +DA:52,1 +DA:53,1 +DA:54,1 +DA:55,1 +DA:56,1 +DA:57,1 +DA:58,1 +LF:27 +LH:25 +end_of_record +SF:lib\src\types\camera_description.dart +DA:23,4 +DA:44,2 +DA:47,2 +DA:48,6 +DA:49,6 +DA:50,6 +DA:52,1 +DA:53,3 +DA:55,0 +DA:57,0 +DA:58,0 +LF:11 +LH:8 +end_of_record +SF:lib\src\types\camera_exception.dart +DA:8,3 +DA:18,1 +DA:19,3 +LF:3 +LH:3 +end_of_record +SF:lib\src\types\camera_image_data.dart +DA:23,2 +DA:52,3 +DA:81,3 +LF:3 +LH:3 +end_of_record +SF:lib\src\types\exposure_mode.dart +DA:15,3 +DA:17,3 +DA:19,3 +DA:25,3 +DA:27,3 +DA:29,3 +DA:32,0 +LF:7 +LH:6 +end_of_record +SF:lib\src\types\focus_mode.dart +DA:15,3 +DA:17,3 +DA:19,3 +DA:25,3 +DA:27,3 +DA:29,3 +DA:32,0 +LF:7 +LH:6 +end_of_record +SF:lib\src\types\image_format_group.dart +DA:47,2 +DA:49,2 +DA:51,2 +DA:53,2 +DA:55,2 +DA:57,2 +LF:6 +LH:6 +end_of_record +SF:lib\src\types\video_capture_options.dart +DA:13,2 +DA:19,1 +DA:42,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:52,0 +DA:54,0 +LF:11 +LH:2 +end_of_record diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index d2a7b6304ae2..73324a01196e 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -97,19 +97,20 @@ class MethodChannelCamera extends CameraPlatform { @override Future createCameraWithSettings( CameraDescription cameraDescription, - MediaSettings? mediaSettings, + MediaSettings mediaSettings, ) async { try { + final ResolutionPreset? resolutionPreset = mediaSettings.resolutionPreset; final Map? reply = await _channel .invokeMapMethod('create', { 'cameraName': cameraDescription.name, - 'resolutionPreset': null != mediaSettings?.resolutionPreset - ? _serializeResolutionPreset(mediaSettings!.resolutionPreset!) + 'resolutionPreset': resolutionPreset != null + ? _serializeResolutionPreset(mediaSettings.resolutionPreset!) : null, - 'fps': mediaSettings?.fps, - 'videoBitrate': mediaSettings?.videoBitrate, - 'audioBitrate': mediaSettings?.audioBitrate, - 'enableAudio': mediaSettings?.enableAudio ?? false, + 'fps': mediaSettings.fps, + 'videoBitrate': mediaSettings.videoBitrate, + 'audioBitrate': mediaSettings.audioBitrate, + 'enableAudio': mediaSettings.enableAudio ?? false, }); return reply!['cameraId']! as int; 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 da1e7ada87b3..dfcc03975dd9 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 @@ -61,9 +61,11 @@ abstract class CameraPlatform extends PlatformInterface { ); /// Creates an uninitialized camera instance and returns the cameraId. + /// + /// Pass MediaSettings() for defaults Future createCameraWithSettings( CameraDescription cameraDescription, - MediaSettings? mediaSettings, + MediaSettings mediaSettings, ) { throw UnimplementedError('createCameraWithSettings() is not implemented.'); } diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart index 79026f11c374..c54ff1857119 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -10,6 +10,7 @@ import 'resolution_preset.dart'; /// /// Used in [CameraPlatform.createCameraWithSettings]. /// Allows to tune recorded video parameters, such as resolution, frame rate, bitrate. +/// If [fps], [videoBitrate] and [audioBitrate] passed, they must be greater than zero. class MediaSettings { /// Creates a [MediaSettings]. const MediaSettings({ @@ -18,43 +19,65 @@ class MediaSettings { this.videoBitrate, this.audioBitrate, this.enableAudio = false, - }); + }) : assert(fps == null || fps > 0, 'fps must be null or greater than zero'), + assert(videoBitrate == null || videoBitrate > 0, + 'videoBitrate must be null or greater than zero'), + assert(audioBitrate == null || audioBitrate > 0, + 'audioBitrate must be null or greater than zero'); /// [ResolutionPreset] affect the quality of video recording and image capture. final ResolutionPreset? resolutionPreset; /// Rate at which frames should be captured by the camera in frames per second. + /// + /// Must be null or greater than zero final int? fps; /// The video encoding bit rate for recording. + /// + /// Must be null or greater than zero final int? videoBitrate; /// The audio encoding bit rate for recording. + /// + /// Must be null or greater than zero final int? audioBitrate; /// Controls audio presence in recorded video. final bool enableAudio; @override - bool operator ==(Object other) => - identical(this, other) || - other is MediaSettings && - runtimeType == other.runtimeType && - resolutionPreset == other.resolutionPreset && - fps == other.fps && - videoBitrate == other.videoBitrate && - audioBitrate == other.audioBitrate && - enableAudio == other.enableAudio; + bool operator ==(Object other) { + if (identical(other, this)) { + return true; + } + if (other.runtimeType != runtimeType) { + return false; + } + return other is MediaSettings && + resolutionPreset == other.resolutionPreset && + fps == other.fps && + videoBitrate == other.videoBitrate && + audioBitrate == other.audioBitrate && + enableAudio == other.enableAudio; + } @override - int get hashCode => - resolutionPreset.hashCode ^ - fps.hashCode ^ - videoBitrate.hashCode ^ - audioBitrate.hashCode ^ - enableAudio.hashCode; + int get hashCode => Object.hash( + resolutionPreset, + fps, + videoBitrate, + audioBitrate, + enableAudio, + ); @override - String toString() => - 'MediaSettings{resolutionPreset: $resolutionPreset, fps: $fps, videoBitrate: $videoBitrate, audioBitrate: $audioBitrate, enableAudio: $enableAudio}'; + String toString() { + return 'MediaSettings{' + 'resolutionPreset: $resolutionPreset, ' + 'fps: $fps, ' + 'videoBitrate: $videoBitrate, ' + 'audioBitrate: $audioBitrate, ' + 'enableAudio: $enableAudio}'; + } } 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 b3ea1d4e82c6..8a5e96edcf28 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 @@ -155,6 +155,26 @@ void main() { // Arrange final ExtendsCameraPlatform cameraPlatform = ExtendsCameraPlatform(); + // Act & Assert + expect( + () => cameraPlatform.createCamera( + const CameraDescription( + name: 'back', + lensDirection: CameraLensDirection.back, + sensorOrientation: 0, + ), + ResolutionPreset.low, + ), + throwsUnimplementedError, + ); + }); + + test( + 'Default implementation of createCameraWithSettings() should throw unimplemented error', + () { + // Arrange + final ExtendsCameraPlatform cameraPlatform = ExtendsCameraPlatform(); + // Act & Assert expect( () => cameraPlatform.createCameraWithSettings( diff --git a/packages/camera/camera_platform_interface/test/types/media_settings_test.dart b/packages/camera/camera_platform_interface/test/types/media_settings_test.dart new file mode 100644 index 000000000000..f97cd1c59d19 --- /dev/null +++ b/packages/camera/camera_platform_interface/test/types/media_settings_test.dart @@ -0,0 +1,142 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// 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/camera_platform_interface.dart'; +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test( + 'MediaSettings non-parametrized constructor should have correct initial values', + () { + const MediaSettings settingsWithNoParameters = MediaSettings(); + + expect( + settingsWithNoParameters.resolutionPreset, + isNull, + reason: + 'MediaSettings constructor should have null default resolutionPreset', + ); + + expect( + settingsWithNoParameters.fps, + isNull, + reason: 'MediaSettings constructor should have null default fps', + ); + + expect( + settingsWithNoParameters.videoBitrate, + isNull, + reason: 'MediaSettings constructor should have null default videoBitrate', + ); + + expect( + settingsWithNoParameters.audioBitrate, + isNull, + reason: 'MediaSettings constructor should have null default audioBitrate', + ); + + expect( + settingsWithNoParameters.enableAudio, + isFalse, + reason: 'MediaSettings constructor should have false default enableAudio', + ); + }); + + test('MediaSettings fps should hold parameters', () { + const MediaSettings settings = MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 20, + videoBitrate: 128000, + audioBitrate: 32000, + enableAudio: true, + ); + + expect( + settings.resolutionPreset, + ResolutionPreset.low, + reason: + 'MediaSettings constructor should hold resolutionPreset parameter', + ); + + expect( + settings.fps, + 20, + reason: 'MediaSettings constructor should hold fps parameter', + ); + + expect( + settings.videoBitrate, + 128000, + reason: 'MediaSettings constructor should hold videoBitrate parameter', + ); + + expect( + settings.audioBitrate, + 32000, + reason: 'MediaSettings constructor should hold audioBitrate parameter', + ); + + expect( + settings.enableAudio, + true, + reason: 'MediaSettings constructor should hold enableAudio parameter', + ); + }); + + test('MediaSettings hash should be Object.hash of passed parameters', () { + const MediaSettings settings = MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 20, + videoBitrate: 128000, + audioBitrate: 32000, + enableAudio: true, + ); + + expect( + settings.hashCode, + Object.hash(ResolutionPreset.low, 20, 128000, 32000, true), + reason: + 'MediaSettings hash() should be equal to Object.hash of parameters', + ); + }); + + test('MediaSettings hash should be Object.hash of passed parameters', () { + const MediaSettings settings1 = MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 20, + videoBitrate: 128000, + audioBitrate: 32000, + enableAudio: true, + ); + + const MediaSettings settings1Copy = MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 20, + videoBitrate: 128000, + audioBitrate: 32000, + enableAudio: true, + ); + + const MediaSettings settings2 = MediaSettings( + resolutionPreset: ResolutionPreset.high, + fps: 30, + videoBitrate: 256000, + audioBitrate: 64000, + ); + + expect( + settings1 == settings1Copy, + isTrue, + reason: + 'MediaSettings == operator should return true for equal parameters', + ); + + expect( + settings1 == settings2, + isFalse, + reason: + 'MediaSettings == operator should return false for non-equal parameters', + ); + }); +} From 40c4385cd781b101ad1f7f93b2c91d87ccf6e6b6 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Thu, 21 Sep 2023 13:11:05 +0300 Subject: [PATCH 08/16] tested and analyzed --- .../lib/src/method_channel/method_channel_camera.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index 73324a01196e..35ece04fdf52 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -110,7 +110,7 @@ class MethodChannelCamera extends CameraPlatform { 'fps': mediaSettings.fps, 'videoBitrate': mediaSettings.videoBitrate, 'audioBitrate': mediaSettings.audioBitrate, - 'enableAudio': mediaSettings.enableAudio ?? false, + 'enableAudio': mediaSettings.enableAudio, }); return reply!['cameraId']! as int; From 442d25ff9a8e4cbb5c9dff874604a15b1b3c53a1 Mon Sep 17 00:00:00 2001 From: "Vladimir E. Koltunov" Date: Mon, 25 Sep 2023 00:25:36 +0300 Subject: [PATCH 09/16] Delete packages/camera/camera_platform_interface/coverage/lcov.info --- .../coverage/lcov.info | 619 ------------------ 1 file changed, 619 deletions(-) delete mode 100644 packages/camera/camera_platform_interface/coverage/lcov.info diff --git a/packages/camera/camera_platform_interface/coverage/lcov.info b/packages/camera/camera_platform_interface/coverage/lcov.info deleted file mode 100644 index 00d4f8ebbc7a..000000000000 --- a/packages/camera/camera_platform_interface/coverage/lcov.info +++ /dev/null @@ -1,619 +0,0 @@ -SF:lib\src\events\camera_event.dart -DA:30,3 -DA:35,2 -DA:38,2 -DA:39,6 -DA:40,6 -DA:42,1 -DA:43,2 -DA:53,2 -DA:65,1 -DA:66,1 -DA:67,1 -DA:68,2 -DA:70,1 -DA:71,2 -DA:72,1 -DA:73,2 -DA:95,4 -DA:96,2 -DA:97,2 -DA:98,2 -DA:99,4 -DA:100,2 -DA:101,4 -DA:102,2 -DA:105,2 -DA:108,2 -DA:109,2 -DA:110,6 -DA:111,6 -DA:112,6 -DA:113,6 -DA:114,6 -DA:115,6 -DA:116,6 -DA:118,1 -DA:119,1 -DA:120,1 -DA:121,1 -DA:122,1 -DA:123,1 -DA:124,1 -DA:125,1 -DA:126,1 -DA:137,2 -DA:145,1 -DA:146,1 -DA:147,1 -DA:148,2 -DA:158,4 -DA:159,2 -DA:160,2 -DA:161,2 -DA:164,2 -DA:167,2 -DA:168,2 -DA:169,6 -DA:170,6 -DA:171,6 -DA:173,1 -DA:174,4 -DA:181,2 -DA:185,1 -DA:186,2 -DA:190,4 -DA:191,2 -DA:194,2 -DA:197,2 -DA:198,1 -DA:199,3 -DA:201,1 -DA:205,1 -DA:214,2 -DA:218,1 -DA:219,1 -DA:220,2 -DA:227,4 -DA:228,2 -DA:229,2 -DA:232,2 -DA:235,2 -DA:236,2 -DA:237,6 -DA:238,6 -DA:240,1 -DA:241,3 -DA:251,0 -DA:255,0 -DA:256,0 -DA:257,0 -DA:258,0 -DA:260,0 -DA:270,0 -DA:271,0 -DA:272,0 -DA:273,0 -DA:276,0 -DA:279,0 -DA:280,0 -DA:281,0 -DA:282,0 -DA:284,0 -DA:285,0 -LF:102 -LH:85 -end_of_record -SF:lib\src\events\device_event.dart -DA:26,4 -DA:32,3 -DA:36,1 -DA:38,2 -DA:45,4 -DA:46,4 -DA:49,2 -DA:52,2 -DA:53,6 -DA:54,6 -DA:56,1 -DA:57,2 -LF:12 -LH:12 -end_of_record -SF:lib\src\platform_interface\camera_platform.dart -DA:24,6 -DA:26,6 -DA:28,3 -DA:33,2 -DA:37,1 -DA:38,2 -DA:45,1 -DA:46,1 -DA:50,1 -DA:55,1 -DA:57,1 -DA:66,1 -DA:70,1 -DA:79,1 -DA:83,1 -DA:87,1 -DA:88,1 -DA:93,1 -DA:94,1 -DA:98,1 -DA:99,1 -DA:103,1 -DA:104,1 -DA:108,0 -DA:109,0 -DA:116,1 -DA:117,1 -DA:122,1 -DA:124,1 -DA:128,1 -DA:129,1 -DA:133,1 -DA:134,1 -DA:138,1 -DA:139,1 -DA:151,1 -DA:152,1 -DA:159,0 -DA:160,0 -DA:161,0 -DA:165,1 -DA:166,1 -DA:170,1 -DA:171,1 -DA:175,1 -DA:176,1 -DA:189,0 -DA:191,0 -DA:196,1 -DA:197,1 -DA:201,1 -DA:202,1 -DA:209,1 -DA:210,1 -DA:214,1 -DA:215,1 -DA:219,1 -DA:220,1 -DA:226,1 -DA:227,1 -DA:241,1 -DA:242,1 -DA:246,1 -DA:247,1 -DA:254,1 -DA:255,1 -DA:259,1 -DA:260,1 -DA:264,1 -DA:265,1 -DA:273,1 -DA:274,1 -DA:278,1 -DA:279,1 -DA:283,1 -DA:284,1 -DA:288,0 -DA:289,0 -DA:294,0 -DA:295,0 -DA:299,1 -DA:300,1 -LF:82 -LH:71 -end_of_record -SF:lib\src\types\media_settings.dart -DA:16,4 -DA:22,1 -DA:23,1 -DA:25,1 -DA:49,1 -DA:54,3 -DA:57,1 -DA:58,3 -DA:59,0 -DA:60,0 -DA:61,0 -DA:62,0 -DA:65,1 -DA:66,1 -DA:67,1 -DA:68,1 -DA:69,1 -DA:70,1 -DA:71,1 -DA:74,0 -DA:76,0 -DA:77,0 -DA:78,0 -DA:79,0 -DA:80,0 -DA:81,0 -LF:26 -LH:15 -end_of_record -SF:lib\src\utils\utils.dart -DA:10,2 -DA:12,2 -DA:14,2 -DA:16,1 -DA:19,1 -DA:23,3 -DA:25,3 -DA:27,1 -DA:29,1 -DA:31,1 -DA:37,3 -DA:39,3 -DA:41,1 -DA:43,1 -DA:45,1 -DA:48,0 -LF:16 -LH:15 -end_of_record -SF:lib\src\method_channel\method_channel_camera.dart -DA:22,2 -DA:25,2 -DA:26,0 -DA:59,1 -DA:60,2 -DA:61,4 -DA:63,1 -DA:67,1 -DA:70,0 -DA:73,2 -DA:74,1 -DA:75,1 -DA:77,2 -DA:78,1 -DA:80,1 -DA:81,1 -DA:82,3 -DA:86,0 -DA:92,0 -DA:94,0 -DA:97,1 -DA:104,1 -DA:106,2 -DA:107,1 -DA:109,2 -DA:111,1 -DA:112,1 -DA:113,1 -DA:114,1 -DA:117,1 -DA:118,1 -DA:119,3 -DA:123,1 -DA:128,3 -DA:130,2 -DA:131,1 -DA:132,0 -DA:136,1 -DA:138,4 -DA:139,1 -DA:142,1 -DA:144,1 -DA:146,1 -DA:148,1 -DA:153,1 -DA:154,1 -DA:158,1 -DA:159,3 -DA:165,1 -DA:168,1 -DA:170,2 -DA:171,2 -DA:172,1 -DA:173,2 -DA:176,1 -DA:178,1 -DA:182,1 -DA:184,2 -DA:187,1 -DA:189,2 -DA:192,1 -DA:194,2 -DA:197,1 -DA:199,2 -DA:202,0 -DA:204,0 -DA:207,1 -DA:209,2 -DA:210,1 -DA:213,1 -DA:218,1 -DA:220,1 -DA:222,1 -DA:227,1 -DA:229,1 -DA:231,1 -DA:235,1 -DA:237,1 -DA:239,1 -DA:243,0 -DA:245,0 -DA:249,1 -DA:252,1 -DA:254,1 -DA:256,1 -DA:259,1 -DA:260,1 -DA:263,1 -DA:265,1 -DA:267,1 -DA:268,1 -DA:269,2 -DA:270,1 -DA:274,1 -DA:275,0 -DA:276,0 -DA:280,1 -DA:282,1 -DA:284,1 -DA:288,0 -DA:290,0 -DA:294,1 -DA:297,1 -DA:298,1 -DA:300,1 -DA:303,1 -DA:305,1 -DA:307,1 -DA:310,1 -DA:313,2 -DA:314,2 -DA:317,1 -DA:319,2 -DA:320,0 -DA:321,1 -DA:322,1 -DA:323,1 -DA:325,1 -DA:328,1 -DA:329,1 -DA:332,1 -DA:333,1 -DA:334,1 -DA:337,1 -DA:340,1 -DA:341,2 -DA:342,0 -DA:344,0 -DA:345,0 -DA:346,0 -DA:349,0 -DA:350,0 -DA:354,1 -DA:355,1 -DA:356,2 -DA:357,1 -DA:358,1 -DA:361,0 -DA:362,0 -DA:366,1 -DA:368,1 -DA:370,1 -DA:372,1 -DA:376,1 -DA:378,1 -DA:380,1 -DA:382,1 -DA:386,1 -DA:388,5 -DA:389,5 -DA:391,1 -DA:393,1 -DA:396,1 -DA:397,1 -DA:402,1 -DA:404,1 -DA:406,1 -DA:412,1 -DA:414,1 -DA:416,1 -DA:422,1 -DA:424,1 -DA:426,1 -DA:432,1 -DA:434,1 -DA:436,1 -DA:445,1 -DA:447,1 -DA:449,1 -DA:451,1 -DA:455,1 -DA:457,5 -DA:458,5 -DA:460,1 -DA:462,1 -DA:465,1 -DA:466,1 -DA:471,1 -DA:473,1 -DA:475,1 -DA:481,1 -DA:483,1 -DA:485,1 -DA:491,1 -DA:494,1 -DA:496,1 -DA:501,1 -DA:502,3 -DA:506,1 -DA:508,1 -DA:510,1 -DA:514,1 -DA:516,1 -DA:518,1 -DA:522,1 -DA:525,1 -DA:527,1 -DA:528,1 -DA:533,1 -DA:535,1 -DA:539,1 -DA:541,1 -DA:543,1 -DA:545,1 -DA:547,1 -DA:553,1 -DA:555,1 -DA:557,1 -DA:559,1 -DA:561,1 -DA:563,1 -DA:565,1 -DA:574,1 -DA:575,1 -DA:576,1 -DA:577,1 -DA:578,3 -DA:579,2 -DA:582,0 -DA:590,1 -DA:592,1 -DA:593,1 -DA:594,1 -DA:595,3 -DA:597,1 -DA:598,1 -DA:599,2 -DA:600,1 -DA:601,2 -DA:602,1 -DA:605,1 -DA:606,1 -DA:607,3 -DA:609,1 -DA:610,1 -DA:613,1 -DA:614,3 -DA:618,1 -DA:619,0 -DA:620,0 -DA:622,0 -DA:623,0 -DA:624,0 -DA:628,1 -DA:629,1 -DA:630,3 -DA:632,1 -DA:636,1 -DA:644,1 -DA:645,2 -LF:250 -LH:221 -end_of_record -SF:lib\src\method_channel\type_conversion.dart -DA:11,1 -DA:12,1 -DA:13,2 -DA:14,1 -DA:15,1 -DA:16,1 -DA:17,1 -DA:18,1 -DA:19,1 -DA:20,2 -DA:21,2 -DA:25,1 -DA:26,2 -DA:29,1 -DA:30,2 -DA:32,1 -DA:34,0 -DA:39,2 -DA:41,1 -DA:44,0 -DA:52,1 -DA:53,1 -DA:54,1 -DA:55,1 -DA:56,1 -DA:57,1 -DA:58,1 -LF:27 -LH:25 -end_of_record -SF:lib\src\types\camera_description.dart -DA:23,4 -DA:44,2 -DA:47,2 -DA:48,6 -DA:49,6 -DA:50,6 -DA:52,1 -DA:53,3 -DA:55,0 -DA:57,0 -DA:58,0 -LF:11 -LH:8 -end_of_record -SF:lib\src\types\camera_exception.dart -DA:8,3 -DA:18,1 -DA:19,3 -LF:3 -LH:3 -end_of_record -SF:lib\src\types\camera_image_data.dart -DA:23,2 -DA:52,3 -DA:81,3 -LF:3 -LH:3 -end_of_record -SF:lib\src\types\exposure_mode.dart -DA:15,3 -DA:17,3 -DA:19,3 -DA:25,3 -DA:27,3 -DA:29,3 -DA:32,0 -LF:7 -LH:6 -end_of_record -SF:lib\src\types\focus_mode.dart -DA:15,3 -DA:17,3 -DA:19,3 -DA:25,3 -DA:27,3 -DA:29,3 -DA:32,0 -LF:7 -LH:6 -end_of_record -SF:lib\src\types\image_format_group.dart -DA:47,2 -DA:49,2 -DA:51,2 -DA:53,2 -DA:55,2 -DA:57,2 -LF:6 -LH:6 -end_of_record -SF:lib\src\types\video_capture_options.dart -DA:13,2 -DA:19,1 -DA:42,0 -DA:45,0 -DA:46,0 -DA:47,0 -DA:48,0 -DA:49,0 -DA:50,0 -DA:52,0 -DA:54,0 -LF:11 -LH:2 -end_of_record From 3f3e092cf15a6035a20c3015da57a2b02f6d3d2a Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Thu, 12 Oct 2023 09:04:09 +0300 Subject: [PATCH 10/16] delegated as in the "Note" section under (1) [here]( https://github.com/flutter/flutter/wiki/Contributing-to-Plugins-and-Packages#changing-platform-interface-method-parameters) --- .../lib/src/platform_interface/camera_platform.dart | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) 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 dfcc03975dd9..57cfdc34d51d 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 @@ -51,14 +51,9 @@ abstract class CameraPlatform extends PlatformInterface { CameraDescription cameraDescription, ResolutionPreset? resolutionPreset, { bool enableAudio = false, - }) => - createCameraWithSettings( - cameraDescription, - MediaSettings( - resolutionPreset: resolutionPreset, - enableAudio: enableAudio, - ), - ); + }) { + throw UnimplementedError('createCamera() is not implemented.'); + } /// Creates an uninitialized camera instance and returns the cameraId. /// @@ -67,7 +62,7 @@ abstract class CameraPlatform extends PlatformInterface { CameraDescription cameraDescription, MediaSettings mediaSettings, ) { - throw UnimplementedError('createCameraWithSettings() is not implemented.'); + return createCamera(cameraDescription, mediaSettings.resolutionPreset); } /// Initializes the camera on the device. From 030d134e4679b9287a7a8f1ba4008cfcccccd883 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Thu, 12 Oct 2023 09:06:17 +0300 Subject: [PATCH 11/16] lexical corrections --- .../camera_platform_interface/lib/src/types/media_settings.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart index c54ff1857119..a3e582faf394 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -10,7 +10,7 @@ import 'resolution_preset.dart'; /// /// Used in [CameraPlatform.createCameraWithSettings]. /// Allows to tune recorded video parameters, such as resolution, frame rate, bitrate. -/// If [fps], [videoBitrate] and [audioBitrate] passed, they must be greater than zero. +/// If [fps], [videoBitrate] or [audioBitrate] are passed, they must be greater than zero. class MediaSettings { /// Creates a [MediaSettings]. const MediaSettings({ From e8231d6608dd55eeb0c3ffa21dbc4158ddccc5eb Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Thu, 12 Oct 2023 09:09:23 +0300 Subject: [PATCH 12/16] removed excessive comments --- .../lib/src/types/media_settings.dart | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart index a3e582faf394..95e29fad7d7d 100644 --- a/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart +++ b/packages/camera/camera_platform_interface/lib/src/types/media_settings.dart @@ -29,18 +29,12 @@ class MediaSettings { final ResolutionPreset? resolutionPreset; /// Rate at which frames should be captured by the camera in frames per second. - /// - /// Must be null or greater than zero final int? fps; /// The video encoding bit rate for recording. - /// - /// Must be null or greater than zero final int? videoBitrate; /// The audio encoding bit rate for recording. - /// - /// Must be null or greater than zero final int? audioBitrate; /// Controls audio presence in recorded video. From a29e41b4ab0357c1f6dfb6ef46a8f1b3e81332de Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Thu, 12 Oct 2023 09:35:32 +0300 Subject: [PATCH 13/16] correct description --- .../test/types/media_settings_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/camera/camera_platform_interface/test/types/media_settings_test.dart b/packages/camera/camera_platform_interface/test/types/media_settings_test.dart index f97cd1c59d19..32122457085f 100644 --- a/packages/camera/camera_platform_interface/test/types/media_settings_test.dart +++ b/packages/camera/camera_platform_interface/test/types/media_settings_test.dart @@ -101,7 +101,7 @@ void main() { ); }); - test('MediaSettings hash should be Object.hash of passed parameters', () { + test('MediaSettings == operator should compare all parameters', () { const MediaSettings settings1 = MediaSettings( resolutionPreset: ResolutionPreset.low, fps: 20, From 820f4b4455ab1d307546c25b5067cecc0dd3f000 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Thu, 12 Oct 2023 11:09:56 +0300 Subject: [PATCH 14/16] test all parameters combinations in operator == --- .../test/types/media_settings_test.dart | 126 ++++++++++++++---- 1 file changed, 97 insertions(+), 29 deletions(-) diff --git a/packages/camera/camera_platform_interface/test/types/media_settings_test.dart b/packages/camera/camera_platform_interface/test/types/media_settings_test.dart index 32122457085f..efdff674743e 100644 --- a/packages/camera/camera_platform_interface/test/types/media_settings_test.dart +++ b/packages/camera/camera_platform_interface/test/types/media_settings_test.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// ignore_for_file: always_specify_types + import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -101,16 +103,20 @@ void main() { ); }); - test('MediaSettings == operator should compare all parameters', () { - const MediaSettings settings1 = MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 20, - videoBitrate: 128000, - audioBitrate: 32000, - enableAudio: true, - ); + group('MediaSettings == operator', () { + const ResolutionPreset preset1 = ResolutionPreset.low; + const int fps1 = 20; + const int videoBitrate1 = 128000; + const int audioBitrate1 = 32000; + const bool enableAudio1 = true; - const MediaSettings settings1Copy = MediaSettings( + const ResolutionPreset preset2 = ResolutionPreset.high; + const int fps2 = fps1 + 10; + const int videoBitrate2 = videoBitrate1 * 2; + const int audioBitrate2 = audioBitrate1 * 2; + const bool enableAudio2 = !enableAudio1; + + const MediaSettings settings1 = MediaSettings( resolutionPreset: ResolutionPreset.low, fps: 20, videoBitrate: 128000, @@ -118,25 +124,87 @@ void main() { enableAudio: true, ); - const MediaSettings settings2 = MediaSettings( - resolutionPreset: ResolutionPreset.high, - fps: 30, - videoBitrate: 256000, - audioBitrate: 64000, - ); - - expect( - settings1 == settings1Copy, - isTrue, - reason: - 'MediaSettings == operator should return true for equal parameters', - ); - - expect( - settings1 == settings2, - isFalse, - reason: - 'MediaSettings == operator should return false for non-equal parameters', - ); + // test operator== on parameters combination. + void checkParameters(List args) { + final resolutionPreset = args[0] as ResolutionPreset?; + final fps = args[1] as int?; + final videoBitrate = args[2] as int?; + final audioBitrate = args[3] as int?; + final enableAudio = args[4]! as bool; + + final MediaSettings settings2 = MediaSettings( + resolutionPreset: resolutionPreset, + fps: fps, + videoBitrate: videoBitrate, + audioBitrate: audioBitrate, + enableAudio: enableAudio); + + if (resolutionPreset == preset1 && + fps == fps1 && + videoBitrate == videoBitrate1 && + audioBitrate == audioBitrate1 && + enableAudio == enableAudio1) { + expect( + settings1 == settings2, + isTrue, + reason: + 'MediaSettings == operator should return true for equal parameters: $settings1 == $settings2', + ); + } else { + expect( + settings1 == settings2, + isFalse, + reason: + 'MediaSettings == operator should return false for non-equal parameters: $settings1 != $settings2', + ); + } + } + + test( + 'MediaSettings == operator should be short-circuit AND of all parameters', + () { + // Sets of various parameters, including those equal and not equal to the corresponding `settings1` parameters + final params = [ + {preset1, preset2, null}, + {fps1, fps2, null}, + {videoBitrate1, videoBitrate2, null}, + {audioBitrate1, audioBitrate2, null}, + {enableAudio1, enableAudio2}, + ]; + + // recursively check all possible parameters combinations + void combine(List> params, List args, int level) { + if (params.length == level) { + // now args contains all required parameters, so check `operator ==` now + checkParameters(args); + } else { + for (final variant in params[level]) { + combine(params, [...args, variant], level + 1); + } + } + } + + combine(params, [], 0); + }); + + test('Identical objects should be equal', () { + const MediaSettings settingsIdentical = settings1; + + expect( + settings1 == settingsIdentical, + isTrue, + reason: + 'MediaSettings == operator should return true for identical objects', + ); + }); + + test('Objects of different types should be non-equal', () { + expect( + settings1 == Object(), + isFalse, + reason: + 'MediaSettings == operator should return false for objects of different types', + ); + }); }); } From afed7bc60c61149db2ed56fce94f0eae5baebff1 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Wed, 18 Oct 2023 11:49:55 +0300 Subject: [PATCH 15/16] tests are simplified --- .../test/types/media_settings_test.dart | 135 ++++++++++-------- 1 file changed, 74 insertions(+), 61 deletions(-) diff --git a/packages/camera/camera_platform_interface/test/types/media_settings_test.dart b/packages/camera/camera_platform_interface/test/types/media_settings_test.dart index efdff674743e..242a153107ba 100644 --- a/packages/camera/camera_platform_interface/test/types/media_settings_test.dart +++ b/packages/camera/camera_platform_interface/test/types/media_settings_test.dart @@ -124,67 +124,80 @@ void main() { enableAudio: true, ); - // test operator== on parameters combination. - void checkParameters(List args) { - final resolutionPreset = args[0] as ResolutionPreset?; - final fps = args[1] as int?; - final videoBitrate = args[2] as int?; - final audioBitrate = args[3] as int?; - final enableAudio = args[4]! as bool; - - final MediaSettings settings2 = MediaSettings( - resolutionPreset: resolutionPreset, - fps: fps, - videoBitrate: videoBitrate, - audioBitrate: audioBitrate, - enableAudio: enableAudio); - - if (resolutionPreset == preset1 && - fps == fps1 && - videoBitrate == videoBitrate1 && - audioBitrate == audioBitrate1 && - enableAudio == enableAudio1) { - expect( - settings1 == settings2, - isTrue, - reason: - 'MediaSettings == operator should return true for equal parameters: $settings1 == $settings2', - ); - } else { - expect( - settings1 == settings2, - isFalse, - reason: - 'MediaSettings == operator should return false for non-equal parameters: $settings1 != $settings2', - ); - } - } - - test( - 'MediaSettings == operator should be short-circuit AND of all parameters', - () { - // Sets of various parameters, including those equal and not equal to the corresponding `settings1` parameters - final params = [ - {preset1, preset2, null}, - {fps1, fps2, null}, - {videoBitrate1, videoBitrate2, null}, - {audioBitrate1, audioBitrate2, null}, - {enableAudio1, enableAudio2}, - ]; - - // recursively check all possible parameters combinations - void combine(List> params, List args, int level) { - if (params.length == level) { - // now args contains all required parameters, so check `operator ==` now - checkParameters(args); - } else { - for (final variant in params[level]) { - combine(params, [...args, variant], level + 1); - } - } - } - - combine(params, [], 0); + test('should compare resolutionPreset', () { + const MediaSettings settings2 = MediaSettings( + resolutionPreset: preset2, + fps: fps1, + videoBitrate: videoBitrate1, + audioBitrate: audioBitrate1, + enableAudio: enableAudio1, + ); + + expect(settings1 == settings2, isFalse); + }); + + test('should compare fps', () { + const MediaSettings settings2 = MediaSettings( + resolutionPreset: preset1, + fps: fps2, + videoBitrate: videoBitrate1, + audioBitrate: audioBitrate1, + enableAudio: enableAudio1, + ); + + expect(settings1 == settings2, isFalse); + }); + + test('should compare videoBitrate', () { + const MediaSettings settings2 = MediaSettings( + resolutionPreset: preset1, + fps: fps1, + videoBitrate: videoBitrate2, + audioBitrate: audioBitrate1, + enableAudio: enableAudio1, + ); + + expect(settings1 == settings2, isFalse); + }); + + test('should compare audioBitrate', () { + const MediaSettings settings2 = MediaSettings( + resolutionPreset: preset1, + fps: fps1, + videoBitrate: videoBitrate1, + audioBitrate: audioBitrate2, + enableAudio: enableAudio1, + ); + + expect(settings1 == settings2, isFalse); + }); + + test('should compare enableAudio', () { + const MediaSettings settings2 = MediaSettings( + resolutionPreset: preset1, + fps: fps1, + videoBitrate: videoBitrate1, + audioBitrate: audioBitrate1, + // ignore: avoid_redundant_argument_values + enableAudio: enableAudio2, + ); + + expect(settings1 == settings2, isFalse); + }); + + test('should return true when all parameters are equal', () { + const MediaSettings sameSettings = MediaSettings( + resolutionPreset: preset1, + fps: fps1, + videoBitrate: videoBitrate1, + audioBitrate: audioBitrate1, + enableAudio: enableAudio1, + ); + + expect( + settings1 == sameSettings, + isTrue, + ); }); test('Identical objects should be equal', () { From 7af349cdad5a205e08f8a2fa6f6bf9eac07ab275 Mon Sep 17 00:00:00 2001 From: "vladimir.koltunov" Date: Mon, 23 Oct 2023 11:16:22 +0300 Subject: [PATCH 16/16] test: createCameraWithSettings() should call createCamera() using partial implementation --- .../platform_interface/camera_platform.dart | 6 +- .../test/camera_platform_interface_test.dart | 83 +++++++++++++++---- 2 files changed, 70 insertions(+), 19 deletions(-) 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 57cfdc34d51d..b74cb4203324 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 @@ -62,7 +62,11 @@ abstract class CameraPlatform extends PlatformInterface { CameraDescription cameraDescription, MediaSettings mediaSettings, ) { - return createCamera(cameraDescription, mediaSettings.resolutionPreset); + return createCamera( + cameraDescription, + mediaSettings.resolutionPreset, + enableAudio: mediaSettings.enableAudio, + ); } /// Initializes the camera on the device. 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 8a5e96edcf28..6a8ebf654048 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 @@ -170,29 +170,58 @@ void main() { }); test( - 'Default implementation of createCameraWithSettings() should throw unimplemented error', + 'Default implementation of createCameraWithSettings() should call createCamera() passing parameters', () { // Arrange - final ExtendsCameraPlatform cameraPlatform = ExtendsCameraPlatform(); + const CameraDescription cameraDescription = CameraDescription( + name: 'back', + lensDirection: CameraLensDirection.back, + sensorOrientation: 0, + ); + + const MediaSettings mediaSettings = MediaSettings( + resolutionPreset: ResolutionPreset.low, + fps: 15, + videoBitrate: 200000, + audioBitrate: 32000, + enableAudio: true, + ); + + bool createCameraCalled = false; + + final OverriddenCameraPlatform cameraPlatform = OverriddenCameraPlatform(( + CameraDescription cameraDescriptionArg, + ResolutionPreset? resolutionPresetArg, + bool enableAudioArg, + ) { + expect( + cameraDescriptionArg, + cameraDescription, + reason: 'should pass camera description', + ); + expect( + resolutionPresetArg, + mediaSettings.resolutionPreset, + reason: 'should pass resolution preset', + ); + expect( + enableAudioArg, + mediaSettings.enableAudio, + reason: 'should pass enableAudio', + ); + + createCameraCalled = true; + }); // Act & Assert - expect( - () => cameraPlatform.createCameraWithSettings( - const CameraDescription( - name: 'back', - lensDirection: CameraLensDirection.back, - sensorOrientation: 0, - ), - const MediaSettings( - resolutionPreset: ResolutionPreset.low, - fps: 15, - videoBitrate: 200000, - audioBitrate: 32000, - enableAudio: true, - ), - ), - throwsUnimplementedError, + cameraPlatform.createCameraWithSettings( + cameraDescription, + mediaSettings, ); + + expect(createCameraCalled, isTrue, + reason: + 'default implementation of createCameraWithSettings should call createCamera passing parameters'); }); test( @@ -522,3 +551,21 @@ class ImplementsCameraPlatform implements CameraPlatform { } class ExtendsCameraPlatform extends CameraPlatform {} + +class OverriddenCameraPlatform extends CameraPlatform { + OverriddenCameraPlatform(this._onCreateCameraCalled); + + final void Function( + CameraDescription cameraDescription, + ResolutionPreset? resolutionPreset, + bool enableAudio, + ) _onCreateCameraCalled; + + @override + Future createCamera( + CameraDescription cameraDescription, ResolutionPreset? resolutionPreset, + {bool enableAudio = false}) { + _onCreateCameraCalled(cameraDescription, resolutionPreset, enableAudio); + return Future.value(0); + } +}