Skip to content

Commit

Permalink
MediaSettings introduced
Browse files Browse the repository at this point in the history
  • Loading branch information
PROGrand committed Apr 1, 2023
1 parent c68fa09 commit 0838a16
Show file tree
Hide file tree
Showing 9 changed files with 156 additions and 27 deletions.
4 changes: 4 additions & 0 deletions packages/camera/camera_platform_interface/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 2.5.1

* Allows recorded video fps and bitrate control.

## 2.5.0

* Adds NV21 as an image stream format (suitable for Android).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Original file line number Diff line number Diff line change
Expand Up @@ -84,19 +84,21 @@ class MethodChannelCamera extends CameraPlatform {
}

@override
Future<int> createCamera(
Future<int> createCameraWithSettings(
CameraDescription cameraDescription,
ResolutionPreset? resolutionPreset, {
bool enableAudio = false,
}) async {
MediaSettings? mediaSettings,
) async {
try {
final Map<String, dynamic>? reply = await _channel
.invokeMapMethod<String, dynamic>('create', <String, dynamic>{
'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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,26 @@ abstract class CameraPlatform extends PlatformInterface {
}

/// Creates an uninitialized camera instance and returns the cameraId.
/// Method will be deprecated. Use [createCameraWithSettings].
Future<int> createCamera(
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<int> createCameraWithSettings(
CameraDescription cameraDescription,
MediaSettings? mediaSettings,
) {
throw UnimplementedError('createCameraWithSettings() is not implemented.');
}

/// Initializes the camera on the device.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// 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.
class MediaSettings {
/// constructor
const MediaSettings({
this.resolutionPreset,
this.fps,
this.videoBitrate,
this.audioBitrate,
this.enableAudio = false,
});

/// resolution preset
final ResolutionPreset? resolutionPreset;

/// camera fps
final int? fps;

/// recording video bitrate
final int? videoBitrate;

/// recording audio bitrate
final int? audioBitrate;

/// enable audio
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}';
}
Original file line number Diff line number Diff line change
Expand Up @@ -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';
2 changes: 1 addition & 1 deletion packages/camera/camera_platform_interface/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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.0
version: 2.5.1

environment:
sdk: ">=2.17.0 <4.0.0"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -47,7 +52,10 @@ void main() {
'create',
arguments: <String, Object?>{
'cameraName': 'Test',
'resolutionPreset': 'high',
'resolutionPreset': 'low',
'fps': 15,
'videoBitrate': 200000,
'audioBitrate': 32000,
'enableAudio': false
},
),
Expand All @@ -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<CameraException>()
Expand Down Expand Up @@ -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<CameraException>()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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<void> initializeFuture = camera.initializeCamera(cameraId);
camera.cameraEventStreamController.add(CameraInitializedEvent(
Expand Down Expand Up @@ -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<void> initializeFuture = camera.initializeCamera(cameraId);
camera.cameraEventStreamController.add(CameraInitializedEvent(
Expand Down Expand Up @@ -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<void> initializeFuture = camera.initializeCamera(cameraId);
camera.cameraEventStreamController.add(
Expand Down

0 comments on commit 0838a16

Please sign in to comment.