Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
8c63615
add heic support image iOS
Mairramer Jul 29, 2023
78a86ec
format files
Mairramer Jul 29, 2023
a43d149
Merge branch 'main' into add-heic-support-ios
Mairramer Jul 29, 2023
88c7228
update version camera_platform_interface
Mairramer Jul 29, 2023
a90a81b
fix version
Mairramer Jul 29, 2023
a98c047
new test
Mairramer Jul 29, 2023
19b6ee2
update example
Mairramer Jul 29, 2023
44b7f43
refactor and adjusts code
Mairramer Jul 30, 2023
c67bf61
Update FLTCam_Test.h
Mairramer Jul 30, 2023
5f9a5fc
Update FLTCam.m
Mairramer Jul 30, 2023
88bb20d
Update CameraPlugin.m
Mairramer Jul 30, 2023
1e77287
new adjusts
Mairramer Jul 30, 2023
2abeabe
Update FLTCam.h
Mairramer Jul 30, 2023
d889f8b
Update CHANGELOG.md
Mairramer Jul 30, 2023
53a5838
fix versions
Mairramer Jul 30, 2023
89905f7
fix versions
Mairramer Jul 30, 2023
c748a86
fix versions to NEXT
Mairramer Jul 30, 2023
4d7b623
versions next section
Mairramer Jul 30, 2023
f0a42b2
Merge branch 'main' into add-heic-support-ios
Mairramer Jul 30, 2023
42cdd9d
fix tests
Mairramer Jul 31, 2023
897414f
Merge branch 'main' into add-heic-support-ios
Mairramer Aug 2, 2023
e7c21a1
Merge branch 'main' into add-heic-support-ios
Mairramer Aug 3, 2023
4ee2527
refactor code
Mairramer Aug 3, 2023
a446d01
added default value
Mairramer Aug 4, 2023
d5e261d
Merge remote-tracking branch 'origin/main' into add-heic-support-ios
Mairramer Oct 13, 2023
c5a812a
rebase main
Mairramer Oct 14, 2023
d15112e
fix header
Mairramer Oct 14, 2023
f906e99
format code
Mairramer Oct 14, 2023
2bad48f
Merge branch 'main' into add-heic-support-ios
Mairramer Oct 14, 2023
b6be5b5
add interface
Mairramer Oct 14, 2023
f57a9c2
fixes
Mairramer Oct 14, 2023
729b7a2
add interface
Mairramer Oct 14, 2023
d14f6cb
added test
Mairramer Oct 14, 2023
305c3b4
improves
Mairramer Oct 14, 2023
e62f6d2
rename extension
Mairramer Oct 15, 2023
4fc1da0
format
Mairramer Oct 15, 2023
3df56b3
refactor code
Mairramer Oct 18, 2023
3cb6af3
fix tests
Mairramer Oct 18, 2023
8564f1c
fix test
Mairramer Oct 18, 2023
cf53b1c
remove comment
Mairramer Oct 18, 2023
dc2fb21
code format
Mairramer Oct 18, 2023
c22989e
fix format
Mairramer Oct 18, 2023
a95ccef
format code
Mairramer Oct 18, 2023
97408df
fix format
Mairramer Oct 18, 2023
a5b8f1b
code improve
Mairramer Oct 19, 2023
1a39b9a
fix
Mairramer Oct 19, 2023
2b94bdb
improve code
Mairramer Oct 19, 2023
fb88b94
fix test
Mairramer Oct 19, 2023
59f1a10
format code
Mairramer Oct 20, 2023
383afa2
Merge branch 'main' into add-heic-support-ios
Mairramer Oct 20, 2023
7d9f5f5
fix mistake
Mairramer Oct 20, 2023
4bc9eb8
fix update android
Mairramer Oct 20, 2023
998d2b6
rename file
Mairramer Oct 20, 2023
441eb68
fix export
Mairramer Oct 20, 2023
c5ac5b6
update version
Mairramer Oct 20, 2023
0e55574
Merge branch 'main' into add-heic-support-ios
Mairramer Oct 20, 2023
6ad2422
refactor logic
Mairramer Oct 20, 2023
d728a4f
Merge branch 'main' into add-heic-support-ios
Mairramer Oct 20, 2023
4846d4a
improve code
Mairramer Oct 22, 2023
b010609
format code
Mairramer Oct 22, 2023
369aa1b
clang format
Mairramer Oct 23, 2023
f07bc24
next to camera
Mairramer Oct 23, 2023
c9f4df4
Merge branch 'main' into add-heic-support-ios
Mairramer Oct 23, 2023
b2ea23d
Merge branch 'main' into add-heic-support-ios
Mairramer Oct 23, 2023
eb49544
some changes
Mairramer Oct 31, 2023
73680ff
Merge branch 'main' into add-heic-support-ios
Mairramer Nov 1, 2023
23375ab
fix false positive tests
Mairramer Nov 1, 2023
0bdd96a
fix
Mairramer Nov 1, 2023
a7ede43
fix changelog
Mairramer Nov 2, 2023
7ae8540
fix tests
Mairramer Nov 3, 2023
5ed3a45
Merge branch 'main' into add-heic-support-ios
Mairramer Nov 17, 2023
c95d0f0
rename
Mairramer Nov 17, 2023
572eef1
Merge branch 'main' into add-heic-support-ios
Mairramer Nov 28, 2023
09e8f0a
new changes
Mairramer Nov 28, 2023
e271274
remove changes camera
Mairramer Nov 28, 2023
2338ac7
fix
Mairramer Nov 28, 2023
33b2dde
fix import
Mairramer Nov 28, 2023
df51b0b
new changes
Mairramer Nov 28, 2023
be233cb
fix
Mairramer Nov 28, 2023
f4b77ec
fix
Mairramer Nov 28, 2023
5cbb66b
new fixes
Mairramer Nov 29, 2023
4079924
format code
Mairramer Nov 29, 2023
9410af7
update some wording
bparrishMines Dec 5, 2023
d32d324
Merge branch 'main' of github.com:flutter/packages into add-heic-supp…
bparrishMines Dec 5, 2023
396a1bc
Merge branch 'main' into add-heic-support-ios
Mairramer Dec 22, 2023
344d22e
remove federated
Mairramer Dec 22, 2023
8bf202d
Merge branch 'main' into add-heic-support-ios
Mairramer Dec 28, 2023
0587ba5
Merge branch 'main' into add-heic-support-ios
Mairramer Jan 4, 2024
25b0676
Merge branch 'main' into add-heic-support-ios
Mairramer Jan 6, 2024
ebc79ba
Merge branch 'main' into add-heic-support-ios
Mairramer Jan 13, 2024
570db5f
Merge branch 'main' into add-heic-support-ios
Mairramer Jan 17, 2024
3d26f58
Merge branch 'main' into add-heic-support-ios
Mairramer Jan 19, 2024
feeff1f
Merge branch 'main' into add-heic-support-ios
Mairramer Jan 24, 2024
9588e3e
Update project.pbxproj
bparrishMines Jan 24, 2024
dbf5161
Merge branch 'main' into add-heic-support-ios
bparrishMines Jan 24, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
rename extension
  • Loading branch information
Mairramer committed Oct 15, 2023
commit e62f6d2055aa49fb39b4546c609403b4990b3baa
2 changes: 1 addition & 1 deletion packages/camera/camera/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## 0.10.6

* Add support to HEIC format to iOS
* Add support to HEIF format to iOS

## 0.10.5+5

Expand Down
2 changes: 1 addition & 1 deletion packages/camera/camera_avfoundation/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## NEXT

* Add support to HEIC format
* Add support to HEIF format

## 0.9.13+6

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,13 @@ - (void)testCaptureToFile_mustSetExtensionToHeicIfAvailablePhotoCodecTypesContai
if (@available(iOS 11.0, *)) {
XCTestExpectation *expectation =
[self expectationWithDescription:
@"Test must set extension to heic if availablePhotoCodecTypes contains HEVC."];
@"Test must set extension to heif if availablePhotoCodecTypes contains HEVC."];

dispatch_queue_t captureSessionQueue = dispatch_queue_create("capture_session_queue", NULL);
dispatch_queue_set_specific(captureSessionQueue, FLTCaptureSessionQueueSpecific,
(void *)FLTCaptureSessionQueueSpecific, NULL);
FLTCam *cam = FLTCreateCamWithCaptureSessionQueue(captureSessionQueue);
[cam setImageExtension:ImageExtensionHEIC];
[cam setImageExtension:ImageExtensionHEIF];

// Set photo settings to HEVC
AVCapturePhotoSettings *settings =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ extern OSType FLTGetVideoFormatFromString(NSString *videoFormatString);
*/
typedef NS_ENUM(NSInteger, ImageExtension) {
ImageExtensionJPEG,
ImageExtensionHEIC,
ImageExtensionHEIF,
};

#pragma mark - image extension
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,8 @@ OSType FLTGetVideoFormatFromString(NSString *videoFormatString) {
ImageExtension FLTGetImageExtensionFromString(NSString *extensionString) {
if ([extensionString isEqualToString:@"jpg"]) {
return ImageExtensionJPEG;
} else if ([extensionString isEqualToString:@"heic"]) {
return ImageExtensionHEIC;
} else if ([extensionString isEqualToString:@"heif"]) {
return ImageExtensionHEIF;
} else {
NSError *error = [NSError
errorWithDomain:NSCocoaErrorDomain
Expand Down
4 changes: 2 additions & 2 deletions packages/camera/camera_avfoundation/ios/Classes/FLTCam.m
Original file line number Diff line number Diff line change
Expand Up @@ -264,12 +264,12 @@ - (void)captureToFile:(FLTThreadSafeFlutterResult *)result {
[settings setHighResolutionPhotoEnabled:YES];
}

if (_imageExtension == ImageExtensionHEIC) {
if (_imageExtension == ImageExtensionHEIF) {
if (@available(iOS 11.0, *)) {
if ([self.capturePhotoOutput.availablePhotoCodecTypes containsObject:AVVideoCodecTypeHEVC]) {
settings = [AVCapturePhotoSettings
photoSettingsWithFormat:@{AVVideoCodecKey : AVVideoCodecTypeHEVC}];
extension = @"heic";
extension = @"heif";
}
}
}
Expand Down
100 changes: 34 additions & 66 deletions packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ import 'package:stream_transform/stream_transform.dart';
import 'type_conversion.dart';
import 'utils.dart';

const MethodChannel _channel =
MethodChannel('plugins.flutter.io/camera_avfoundation');
const MethodChannel _channel = MethodChannel('plugins.flutter.io/camera_avfoundation');

/// An iOS implementation of [CameraPlatform] based on AVFoundation.
class AVFoundationCamera extends CameraPlatform {
Expand All @@ -29,8 +28,7 @@ class AVFoundationCamera extends CameraPlatform {
/// The name of the channel that device events from the platform side are
/// sent on.
@visibleForTesting
static const String deviceEventChannelName =
'plugins.flutter.io/camera_avfoundation/fromPlatform';
static const String deviceEventChannelName = 'plugins.flutter.io/camera_avfoundation/fromPlatform';

/// The controller we need to broadcast the different events coming
/// from handleMethodCall, specific to camera events.
Expand All @@ -40,16 +38,14 @@ class AVFoundationCamera extends CameraPlatform {
/// This is only exposed for test purposes. It shouldn't be used by clients of
/// the plugin as it may break or change at any time.
@visibleForTesting
final StreamController<CameraEvent> cameraEventStreamController =
StreamController<CameraEvent>.broadcast();
final StreamController<CameraEvent> cameraEventStreamController = StreamController<CameraEvent>.broadcast();

/// The controller we need to broadcast the different events coming
/// from handleMethodCall, specific to general device events.
///
/// It is a `broadcast` because multiple controllers will connect to
/// different stream views of this Controller.
late final StreamController<DeviceEvent> _deviceEventStreamController =
_createDeviceEventStreamController();
late final StreamController<DeviceEvent> _deviceEventStreamController = _createDeviceEventStreamController();

StreamController<DeviceEvent> _createDeviceEventStreamController() {
// Set up the method handler lazily.
Expand All @@ -65,14 +61,13 @@ class AVFoundationCamera extends CameraPlatform {
StreamController<CameraImageData>? _frameStreamController;

Stream<CameraEvent> _cameraEvents(int cameraId) =>
cameraEventStreamController.stream
.where((CameraEvent event) => event.cameraId == cameraId);
cameraEventStreamController.stream.where((CameraEvent event) => event.cameraId == cameraId);

@override
Future<List<CameraDescription>> availableCameras() async {
try {
final List<Map<dynamic, dynamic>>? cameras = await _channel
.invokeListMethod<Map<dynamic, dynamic>>('availableCameras');
final List<Map<dynamic, dynamic>>? cameras =
await _channel.invokeListMethod<Map<dynamic, dynamic>>('availableCameras');

if (cameras == null) {
return <CameraDescription>[];
Expand All @@ -81,8 +76,7 @@ class AVFoundationCamera extends CameraPlatform {
return cameras.map((Map<dynamic, dynamic> camera) {
return CameraDescription(
name: camera['name']! as String,
lensDirection:
parseCameraLensDirection(camera['lensFacing']! as String),
lensDirection: parseCameraLensDirection(camera['lensFacing']! as String),
sensorOrientation: camera['sensorOrientation']! as int,
);
}).toList();
Expand All @@ -98,12 +92,9 @@ class AVFoundationCamera extends CameraPlatform {
bool enableAudio = false,
}) async {
try {
final Map<String, dynamic>? reply = await _channel
.invokeMapMethod<String, dynamic>('create', <String, dynamic>{
final Map<String, dynamic>? reply = await _channel.invokeMapMethod<String, dynamic>('create', <String, dynamic>{
'cameraName': cameraDescription.name,
'resolutionPreset': resolutionPreset != null
? _serializeResolutionPreset(resolutionPreset)
: null,
'resolutionPreset': resolutionPreset != null ? _serializeResolutionPreset(resolutionPreset) : null,
'enableAudio': enableAudio,
});

Expand All @@ -120,10 +111,8 @@ class AVFoundationCamera extends CameraPlatform {
ImageExtension imageExtension = ImageExtension.jpeg,
}) {
_channels.putIfAbsent(cameraId, () {
final MethodChannel channel = MethodChannel(
'plugins.flutter.io/camera_avfoundation/camera$cameraId');
channel.setMethodCallHandler(
(MethodCall call) => handleCameraMethodCall(call, cameraId));
final MethodChannel channel = MethodChannel('plugins.flutter.io/camera_avfoundation/camera$cameraId');
channel.setMethodCallHandler((MethodCall call) => handleCameraMethodCall(call, cameraId));
return channel;
});

Expand Down Expand Up @@ -201,8 +190,7 @@ class AVFoundationCamera extends CameraPlatform {

@override
Stream<DeviceOrientationChangedEvent> onDeviceOrientationChanged() {
return _deviceEventStreamController.stream
.whereType<DeviceOrientationChangedEvent>();
return _deviceEventStreamController.stream.whereType<DeviceOrientationChangedEvent>();
}

@override
Expand All @@ -212,10 +200,7 @@ class AVFoundationCamera extends CameraPlatform {
) async {
await _channel.invokeMethod<String>(
'lockCaptureOrientation',
<String, dynamic>{
'cameraId': cameraId,
'orientation': serializeDeviceOrientation(orientation)
},
<String, dynamic>{'cameraId': cameraId, 'orientation': serializeDeviceOrientation(orientation)},
);
}

Expand Down Expand Up @@ -245,14 +230,11 @@ class AVFoundationCamera extends CameraPlatform {
}

@override
Future<void> prepareForVideoRecording() =>
_channel.invokeMethod<void>('prepareForVideoRecording');
Future<void> prepareForVideoRecording() => _channel.invokeMethod<void>('prepareForVideoRecording');

@override
Future<void> startVideoRecording(int cameraId,
{Duration? maxVideoDuration}) async {
return startVideoCapturing(
VideoCaptureOptions(cameraId, maxDuration: maxVideoDuration));
Future<void> startVideoRecording(int cameraId, {Duration? maxVideoDuration}) async {
return startVideoCapturing(VideoCaptureOptions(cameraId, maxDuration: maxVideoDuration));
}

@override
Expand Down Expand Up @@ -297,22 +279,18 @@ class AVFoundationCamera extends CameraPlatform {
);

@override
Future<void> resumeVideoRecording(int cameraId) =>
_channel.invokeMethod<void>(
Future<void> resumeVideoRecording(int cameraId) => _channel.invokeMethod<void>(
'resumeVideoRecording',
<String, dynamic>{'cameraId': cameraId},
);

@override
Stream<CameraImageData> onStreamedFrameAvailable(int cameraId,
{CameraImageStreamOptions? options}) {
_frameStreamController =
_createStreamController(onListen: _onFrameStreamListen);
Stream<CameraImageData> onStreamedFrameAvailable(int cameraId, {CameraImageStreamOptions? options}) {
_frameStreamController = _createStreamController(onListen: _onFrameStreamListen);
return _frameStreamController!.stream;
}

StreamController<CameraImageData> _createStreamController(
{Function()? onListen}) {
StreamController<CameraImageData> _createStreamController({Function()? onListen}) {
return StreamController<CameraImageData>(
onListen: onListen ?? () {},
onPause: _onFrameStreamPauseResume,
Expand All @@ -331,17 +309,14 @@ class AVFoundationCamera extends CameraPlatform {
}

void _startStreamListener() {
const EventChannel cameraEventChannel =
EventChannel('plugins.flutter.io/camera_avfoundation/imageStream');
_platformImageStreamSubscription =
cameraEventChannel.receiveBroadcastStream().listen((dynamic imageData) {
const EventChannel cameraEventChannel = EventChannel('plugins.flutter.io/camera_avfoundation/imageStream');
_platformImageStreamSubscription = cameraEventChannel.receiveBroadcastStream().listen((dynamic imageData) {
try {
_channel.invokeMethod<void>('receivedImageStreamData');
} on PlatformException catch (e) {
throw CameraException(e.code, e.message);
}
_frameStreamController!
.add(cameraImageFromPlatformData(imageData as Map<dynamic, dynamic>));
_frameStreamController!.add(cameraImageFromPlatformData(imageData as Map<dynamic, dynamic>));
});
}

Expand All @@ -353,13 +328,11 @@ class AVFoundationCamera extends CameraPlatform {
}

void _onFrameStreamPauseResume() {
throw CameraException('InvalidCall',
'Pause and resume are not supported for onStreamedFrameAvailable');
throw CameraException('InvalidCall', 'Pause and resume are not supported for onStreamedFrameAvailable');
}

@override
Future<void> setFlashMode(int cameraId, FlashMode mode) =>
_channel.invokeMethod<void>(
Future<void> setFlashMode(int cameraId, FlashMode mode) => _channel.invokeMethod<void>(
'setFlashMode',
<String, dynamic>{
'cameraId': cameraId,
Expand All @@ -368,8 +341,7 @@ class AVFoundationCamera extends CameraPlatform {
);

@override
Future<void> setExposureMode(int cameraId, ExposureMode mode) =>
_channel.invokeMethod<void>(
Future<void> setExposureMode(int cameraId, ExposureMode mode) => _channel.invokeMethod<void>(
'setExposureMode',
<String, dynamic>{
'cameraId': cameraId,
Expand Down Expand Up @@ -437,8 +409,7 @@ class AVFoundationCamera extends CameraPlatform {
}

@override
Future<void> setFocusMode(int cameraId, FocusMode mode) =>
_channel.invokeMethod<void>(
Future<void> setFocusMode(int cameraId, FocusMode mode) => _channel.invokeMethod<void>(
'setFocusMode',
<String, dynamic>{
'cameraId': cameraId,
Expand Down Expand Up @@ -514,8 +485,7 @@ class AVFoundationCamera extends CameraPlatform {
}

@override
Future<void> setDescriptionWhileRecording(
CameraDescription description) async {
Future<void> setDescriptionWhileRecording(CameraDescription description) async {
await _channel.invokeMethod<double>(
'setDescriptionWhileRecording',
<String, dynamic>{
Expand Down Expand Up @@ -580,8 +550,8 @@ class AVFoundationCamera extends CameraPlatform {
switch (imageExtension) {
case ImageExtension.jpeg:
return 'jpeg';
case ImageExtension.heic:
return 'heic';
case ImageExtension.heif:
return 'heif';
}
}

Expand All @@ -590,8 +560,8 @@ class AVFoundationCamera extends CameraPlatform {
switch (call.method) {
case 'orientation_changed':
final Map<String, Object?> arguments = _getArgumentDictionary(call);
_deviceEventStreamController.add(DeviceOrientationChangedEvent(
deserializeDeviceOrientation(arguments['orientation']! as String)));
_deviceEventStreamController
.add(DeviceOrientationChangedEvent(deserializeDeviceOrientation(arguments['orientation']! as String)));
break;
default:
throw MissingPluginException();
Expand Down Expand Up @@ -635,9 +605,7 @@ class AVFoundationCamera extends CameraPlatform {
cameraEventStreamController.add(VideoRecordedEvent(
cameraId,
XFile(arguments['path']! as String),
arguments['maxVideoDuration'] != null
? Duration(milliseconds: arguments['maxVideoDuration']! as int)
: null,
arguments['maxVideoDuration'] != null ? Duration(milliseconds: arguments['maxVideoDuration']! as int) : null,
));
break;
case 'error':
Expand Down
2 changes: 1 addition & 1 deletion packages/camera/camera_platform_interface/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## 2.5.3

* Add support to HEIC format to iOS
* Add support to HEIF format to iOS

## 2.5.2

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ abstract class CameraPlatform extends PlatformInterface {
/// On Web this parameter is currently not supported.
///
/// [imageExtension] is used to specify the image extension used.
/// [ImageExtension.jpeg] and [ImageExtension.heic] are availables
/// [ImageExtension.jpeg] and [ImageExtension.heif] are availables
/// only in iOS 11.0+.
Future<void> initializeCamera(
int cameraId, {
Expand Down Expand Up @@ -104,13 +104,11 @@ abstract class CameraPlatform extends PlatformInterface {
/// Implementations for this:
/// - Should support all 4 orientations.
Stream<DeviceOrientationChangedEvent> onDeviceOrientationChanged() {
throw UnimplementedError(
'onDeviceOrientationChanged() is not implemented.');
throw UnimplementedError('onDeviceOrientationChanged() is not implemented.');
}

/// Locks the capture orientation.
Future<void> lockCaptureOrientation(
int cameraId, DeviceOrientation orientation) {
Future<void> lockCaptureOrientation(int cameraId, DeviceOrientation orientation) {
throw UnimplementedError('lockCaptureOrientation() is not implemented.');
}

Expand Down Expand Up @@ -147,8 +145,7 @@ abstract class CameraPlatform extends PlatformInterface {
/// Please see [VideoCaptureOptions] for documentation on the
/// configuration options.
Future<void> startVideoCapturing(VideoCaptureOptions options) {
return startVideoRecording(options.cameraId,
maxVideoDuration: options.maxDuration);
return startVideoRecording(options.cameraId, maxVideoDuration: options.maxDuration);
}

/// Stops the video recording and returns the file where it was saved.
Expand Down Expand Up @@ -176,8 +173,7 @@ abstract class CameraPlatform extends PlatformInterface {
///
// TODO(bmparr): Add options to control streaming settings (e.g.,
// resolution and FPS).
Stream<CameraImageData> onStreamedFrameAvailable(int cameraId,
{CameraImageStreamOptions? options}) {
Stream<CameraImageData> onStreamedFrameAvailable(int cameraId, {CameraImageStreamOptions? options}) {
throw UnimplementedError('onStreamedFrameAvailable() is not implemented.');
}

Expand Down Expand Up @@ -276,8 +272,7 @@ abstract class CameraPlatform extends PlatformInterface {

/// Sets the active camera while recording.
Future<void> setDescriptionWhileRecording(CameraDescription description) {
throw UnimplementedError(
'setDescriptionWhileRecording() is not implemented.');
throw UnimplementedError('setDescriptionWhileRecording() is not implemented.');
}

/// Returns a widget showing a live camera preview.
Expand Down
Loading