diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md
index 64b7cfd..dd4042e 100644
--- a/packages/camera/camera/CHANGELOG.md
+++ b/packages/camera/camera/CHANGELOG.md
@@ -1,5 +1,6 @@
 ## NEXT
 
+* Minor iOS internal code cleanup related to resolution preset, video format, focus mode, exposure mode and device orientation.
 * Minor iOS internal code cleanup related to flash mode.
 
 ## 0.9.4+8
diff --git a/packages/camera/camera/example/ios/Runner.xcodeproj/project.pbxproj b/packages/camera/camera/example/ios/Runner.xcodeproj/project.pbxproj
index 87bcf2e..0be5b59 100644
--- a/packages/camera/camera/example/ios/Runner.xcodeproj/project.pbxproj
+++ b/packages/camera/camera/example/ios/Runner.xcodeproj/project.pbxproj
@@ -22,10 +22,10 @@
 		97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
 		E01EE4A82799F3A5008C1950 /* QueueHelperTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E01EE4A72799F3A5008C1950 /* QueueHelperTests.m */; };
 		E032F250279F5E94009E9028 /* CameraCaptureSessionQueueRaceConditionTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E032F24F279F5E94009E9028 /* CameraCaptureSessionQueueRaceConditionTests.m */; };
-		E032F2A727A0BF2D009E9028 /* FLTFlashModeTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E032F2A627A0BF2D009E9028 /* FLTFlashModeTests.m */; };
 		E0C6E2002770F01A00EA6AA3 /* ThreadSafeMethodChannelTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C6E1FD2770F01A00EA6AA3 /* ThreadSafeMethodChannelTests.m */; };
 		E0C6E2012770F01A00EA6AA3 /* ThreadSafeTextureRegistryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C6E1FE2770F01A00EA6AA3 /* ThreadSafeTextureRegistryTests.m */; };
 		E0C6E2022770F01A00EA6AA3 /* ThreadSafeEventChannelTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C6E1FF2770F01A00EA6AA3 /* ThreadSafeEventChannelTests.m */; };
+		E0F95E3D27A32AB900699390 /* CameraPropertiesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0F95E3C27A32AB900699390 /* CameraPropertiesTests.m */; };
 		E487C86026D686A10034AC92 /* CameraPreviewPauseTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E487C85F26D686A10034AC92 /* CameraPreviewPauseTests.m */; };
 		F6EE622F2710A6FC00905E4A /* MockFLTThreadSafeFlutterResult.m in Sources */ = {isa = PBXBuildFile; fileRef = F6EE622E2710A6FC00905E4A /* MockFLTThreadSafeFlutterResult.m */; };
 /* End PBXBuildFile section */
@@ -82,10 +82,10 @@
 		A24F9E418BA48BCC7409B117 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
 		E01EE4A72799F3A5008C1950 /* QueueHelperTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QueueHelperTests.m; sourceTree = "<group>"; };
 		E032F24F279F5E94009E9028 /* CameraCaptureSessionQueueRaceConditionTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CameraCaptureSessionQueueRaceConditionTests.m; sourceTree = "<group>"; };
-		E032F2A627A0BF2D009E9028 /* FLTFlashModeTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLTFlashModeTests.m; sourceTree = "<group>"; };
 		E0C6E1FD2770F01A00EA6AA3 /* ThreadSafeMethodChannelTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThreadSafeMethodChannelTests.m; sourceTree = "<group>"; };
 		E0C6E1FE2770F01A00EA6AA3 /* ThreadSafeTextureRegistryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThreadSafeTextureRegistryTests.m; sourceTree = "<group>"; };
 		E0C6E1FF2770F01A00EA6AA3 /* ThreadSafeEventChannelTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThreadSafeEventChannelTests.m; sourceTree = "<group>"; };
+		E0F95E3C27A32AB900699390 /* CameraPropertiesTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CameraPropertiesTests.m; sourceTree = "<group>"; };
 		E487C85F26D686A10034AC92 /* CameraPreviewPauseTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CameraPreviewPauseTests.m; sourceTree = "<group>"; };
 		F63F9EED27143B19002479BF /* MockFLTThreadSafeFlutterResult.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MockFLTThreadSafeFlutterResult.h; sourceTree = "<group>"; };
 		F6EE622E2710A6FC00905E4A /* MockFLTThreadSafeFlutterResult.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MockFLTThreadSafeFlutterResult.m; sourceTree = "<group>"; };
@@ -127,7 +127,7 @@
 				F6EE622E2710A6FC00905E4A /* MockFLTThreadSafeFlutterResult.m */,
 				F63F9EED27143B19002479BF /* MockFLTThreadSafeFlutterResult.h */,
 				E032F24F279F5E94009E9028 /* CameraCaptureSessionQueueRaceConditionTests.m */,
-				E032F2A627A0BF2D009E9028 /* FLTFlashModeTests.m */,
+				E0F95E3C27A32AB900699390 /* CameraPropertiesTests.m */,
 			);
 			path = RunnerTests;
 			sourceTree = "<group>";
@@ -391,8 +391,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				03F6F8B226CBB4670024B8D3 /* ThreadSafeFlutterResultTests.m in Sources */,
-				E032F2A727A0BF2D009E9028 /* FLTFlashModeTests.m in Sources */,
 				033B94BE269C40A200B4DF97 /* CameraMethodChannelTests.m in Sources */,
+				E0F95E3D27A32AB900699390 /* CameraPropertiesTests.m in Sources */,
 				03BB766B2665316900CE5A93 /* CameraFocusTests.m in Sources */,
 				E487C86026D686A10034AC92 /* CameraPreviewPauseTests.m in Sources */,
 				F6EE622F2710A6FC00905E4A /* MockFLTThreadSafeFlutterResult.m in Sources */,
diff --git a/packages/camera/camera/example/ios/RunnerTests/CameraPropertiesTests.m b/packages/camera/camera/example/ios/RunnerTests/CameraPropertiesTests.m
new file mode 100644
index 0000000..8657915
--- /dev/null
+++ b/packages/camera/camera/example/ios/RunnerTests/CameraPropertiesTests.m
@@ -0,0 +1,107 @@
+// 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 camera.Test;
+@import AVFoundation;
+@import XCTest;
+
+@interface CameraPropertiesTests : XCTestCase
+
+@end
+
+@implementation CameraPropertiesTests
+
+#pragma mark - flash mode tests
+
+- (void)testFLTGetFLTFlashModeForString {
+  XCTAssertEqual(FLTFlashModeOff, FLTGetFLTFlashModeForString(@"off"));
+  XCTAssertEqual(FLTFlashModeAuto, FLTGetFLTFlashModeForString(@"auto"));
+  XCTAssertEqual(FLTFlashModeAlways, FLTGetFLTFlashModeForString(@"always"));
+  XCTAssertEqual(FLTFlashModeTorch, FLTGetFLTFlashModeForString(@"torch"));
+  XCTAssertThrows(FLTGetFLTFlashModeForString(@"unkwown"));
+}
+
+- (void)testFLTGetAVCaptureFlashModeForFLTFlashMode {
+  XCTAssertEqual(AVCaptureFlashModeOff, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeOff));
+  XCTAssertEqual(AVCaptureFlashModeAuto, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeAuto));
+  XCTAssertEqual(AVCaptureFlashModeOn, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeAlways));
+  XCTAssertEqual(-1, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeTorch));
+}
+
+#pragma mark - exposure mode tests
+
+- (void)testFLTGetStringForFLTExposureMode {
+  XCTAssertEqualObjects(@"auto", FLTGetStringForFLTExposureMode(FLTExposureModeAuto));
+  XCTAssertEqualObjects(@"locked", FLTGetStringForFLTExposureMode(FLTExposureModeLocked));
+  XCTAssertThrows(FLTGetStringForFLTExposureMode(-1));
+}
+
+- (void)testFLTGetFLTExposureModeForString {
+  XCTAssertEqual(FLTExposureModeAuto, FLTGetFLTExposureModeForString(@"auto"));
+  XCTAssertEqual(FLTExposureModeLocked, FLTGetFLTExposureModeForString(@"locked"));
+  XCTAssertThrows(FLTGetFLTExposureModeForString(@"unknown"));
+}
+
+#pragma mark - focus mode tests
+
+- (void)testFLTGetStringForFLTFocusMode {
+  XCTAssertEqualObjects(@"auto", FLTGetStringForFLTFocusMode(FLTFocusModeAuto));
+  XCTAssertEqualObjects(@"locked", FLTGetStringForFLTFocusMode(FLTFocusModeLocked));
+  XCTAssertThrows(FLTGetStringForFLTFocusMode(-1));
+}
+
+- (void)testFLTGetFLTFocusModeForString {
+  XCTAssertEqual(FLTFocusModeAuto, FLTGetFLTFocusModeForString(@"auto"));
+  XCTAssertEqual(FLTFocusModeLocked, FLTGetFLTFocusModeForString(@"locked"));
+  XCTAssertThrows(FLTGetFLTFocusModeForString(@"unknown"));
+}
+
+#pragma mark - resolution preset tests
+
+- (void)testFLTGetFLTResolutionPresetForString {
+  XCTAssertEqual(FLTResolutionPresetVeryLow, FLTGetFLTResolutionPresetForString(@"veryLow"));
+  XCTAssertEqual(FLTResolutionPresetLow, FLTGetFLTResolutionPresetForString(@"low"));
+  XCTAssertEqual(FLTResolutionPresetMedium, FLTGetFLTResolutionPresetForString(@"medium"));
+  XCTAssertEqual(FLTResolutionPresetHigh, FLTGetFLTResolutionPresetForString(@"high"));
+  XCTAssertEqual(FLTResolutionPresetVeryHigh, FLTGetFLTResolutionPresetForString(@"veryHigh"));
+  XCTAssertEqual(FLTResolutionPresetUltraHigh, FLTGetFLTResolutionPresetForString(@"ultraHigh"));
+  XCTAssertEqual(FLTResolutionPresetMax, FLTGetFLTResolutionPresetForString(@"max"));
+  XCTAssertThrows(FLTGetFLTFlashModeForString(@"unknown"));
+}
+
+#pragma mark - video format tests
+
+- (void)testFLTGetVideoFormatFromString {
+  XCTAssertEqual(kCVPixelFormatType_32BGRA, FLTGetVideoFormatFromString(@"bgra8888"));
+  XCTAssertEqual(kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
+                 FLTGetVideoFormatFromString(@"yuv420"));
+  XCTAssertEqual(kCVPixelFormatType_32BGRA, FLTGetVideoFormatFromString(@"unknown"));
+}
+
+#pragma mark - device orientation tests
+
+- (void)testFLTGetUIDeviceOrientationForString {
+  XCTAssertEqual(UIDeviceOrientationPortraitUpsideDown,
+                 FLTGetUIDeviceOrientationForString(@"portraitDown"));
+  XCTAssertEqual(UIDeviceOrientationLandscapeRight,
+                 FLTGetUIDeviceOrientationForString(@"landscapeLeft"));
+  XCTAssertEqual(UIDeviceOrientationLandscapeLeft,
+                 FLTGetUIDeviceOrientationForString(@"landscapeRight"));
+  XCTAssertEqual(UIDeviceOrientationPortrait, FLTGetUIDeviceOrientationForString(@"portraitUp"));
+  XCTAssertThrows(FLTGetUIDeviceOrientationForString(@"unknown"));
+}
+
+- (void)testFLTGetStringForUIDeviceOrientation {
+  XCTAssertEqualObjects(@"portraitDown",
+                        FLTGetStringForUIDeviceOrientation(UIDeviceOrientationPortraitUpsideDown));
+  XCTAssertEqualObjects(@"landscapeLeft",
+                        FLTGetStringForUIDeviceOrientation(UIDeviceOrientationLandscapeRight));
+  XCTAssertEqualObjects(@"landscapeRight",
+                        FLTGetStringForUIDeviceOrientation(UIDeviceOrientationLandscapeLeft));
+  XCTAssertEqualObjects(@"portraitUp",
+                        FLTGetStringForUIDeviceOrientation(UIDeviceOrientationPortrait));
+  XCTAssertEqualObjects(@"portraitUp", FLTGetStringForUIDeviceOrientation(-1));
+}
+
+@end
diff --git a/packages/camera/camera/example/ios/RunnerTests/FLTFlashModeTests.m b/packages/camera/camera/example/ios/RunnerTests/FLTFlashModeTests.m
deleted file mode 100644
index b38b7eb..0000000
--- a/packages/camera/camera/example/ios/RunnerTests/FLTFlashModeTests.m
+++ /dev/null
@@ -1,30 +0,0 @@
-// 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 camera.Test;
-@import AVFoundation;
-#import <XCTest/XCTest.h>
-
-@interface FLTFlashModeTests : XCTestCase
-
-@end
-
-@implementation FLTFlashModeTests
-
-- (void)testFLTGetFLTFlashModeForString {
-  XCTAssertEqual(FLTFlashModeOff, FLTGetFLTFlashModeForString(@"off"));
-  XCTAssertEqual(FLTFlashModeAuto, FLTGetFLTFlashModeForString(@"auto"));
-  XCTAssertEqual(FLTFlashModeAlways, FLTGetFLTFlashModeForString(@"always"));
-  XCTAssertEqual(FLTFlashModeTorch, FLTGetFLTFlashModeForString(@"torch"));
-  XCTAssertThrows(FLTGetFLTFlashModeForString(@"unkwown"));
-}
-
-- (void)testFLTGetAVCaptureFlashModeForFLTFlashMode {
-  XCTAssertEqual(AVCaptureFlashModeOff, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeOff));
-  XCTAssertEqual(AVCaptureFlashModeAuto, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeAuto));
-  XCTAssertEqual(AVCaptureFlashModeOn, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeAlways));
-  XCTAssertEqual(-1, FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashModeTorch));
-}
-
-@end
diff --git a/packages/camera/camera/ios/Classes/CameraPlugin.m b/packages/camera/camera/ios/Classes/CameraPlugin.m
index be5ba80..ae55188 100644
--- a/packages/camera/camera/ios/Classes/CameraPlugin.m
+++ b/packages/camera/camera/ios/Classes/CameraPlugin.m
@@ -10,11 +10,11 @@
 #import <CoreMotion/CoreMotion.h>
 #import <libkern/OSAtomic.h>
 #import <uuid/uuid.h>
+#import "CameraProperties.h"
 #import "FLTThreadSafeEventChannel.h"
 #import "FLTThreadSafeFlutterResult.h"
 #import "FLTThreadSafeMethodChannel.h"
 #import "FLTThreadSafeTextureRegistry.h"
-#import "FlashMode.h"
 
 @interface FLTSavePhotoDelegate : NSObject <AVCapturePhotoCaptureDelegate>
 @property(readonly, nonatomic) NSString *path;
@@ -114,167 +114,6 @@
 }
 @end
 
-static OSType getVideoFormatFromString(NSString *videoFormatString) {
-  if ([videoFormatString isEqualToString:@"bgra8888"]) {
-    return kCVPixelFormatType_32BGRA;
-  } else if ([videoFormatString isEqualToString:@"yuv420"]) {
-    return kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
-  } else {
-    NSLog(@"The selected imageFormatGroup is not supported by iOS. Defaulting to brga8888");
-    return kCVPixelFormatType_32BGRA;
-  }
-}
-
-// Mirrors ExposureMode in camera.dart
-typedef enum {
-  ExposureModeAuto,
-  ExposureModeLocked,
-
-} ExposureMode;
-
-static NSString *getStringForExposureMode(ExposureMode mode) {
-  switch (mode) {
-    case ExposureModeAuto:
-      return @"auto";
-    case ExposureModeLocked:
-      return @"locked";
-  }
-  NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
-                                       code:NSURLErrorUnknown
-                                   userInfo:@{
-                                     NSLocalizedDescriptionKey : [NSString
-                                         stringWithFormat:@"Unknown string for exposure mode"]
-                                   }];
-  @throw error;
-}
-
-static ExposureMode getExposureModeForString(NSString *mode) {
-  if ([mode isEqualToString:@"auto"]) {
-    return ExposureModeAuto;
-  } else if ([mode isEqualToString:@"locked"]) {
-    return ExposureModeLocked;
-  } else {
-    NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
-                                         code:NSURLErrorUnknown
-                                     userInfo:@{
-                                       NSLocalizedDescriptionKey : [NSString
-                                           stringWithFormat:@"Unknown exposure mode %@", mode]
-                                     }];
-    @throw error;
-  }
-}
-
-static UIDeviceOrientation getUIDeviceOrientationForString(NSString *orientation) {
-  if ([orientation isEqualToString:@"portraitDown"]) {
-    return UIDeviceOrientationPortraitUpsideDown;
-  } else if ([orientation isEqualToString:@"landscapeLeft"]) {
-    return UIDeviceOrientationLandscapeRight;
-  } else if ([orientation isEqualToString:@"landscapeRight"]) {
-    return UIDeviceOrientationLandscapeLeft;
-  } else if ([orientation isEqualToString:@"portraitUp"]) {
-    return UIDeviceOrientationPortrait;
-  } else {
-    NSError *error = [NSError
-        errorWithDomain:NSCocoaErrorDomain
-                   code:NSURLErrorUnknown
-               userInfo:@{
-                 NSLocalizedDescriptionKey :
-                     [NSString stringWithFormat:@"Unknown device orientation %@", orientation]
-               }];
-    @throw error;
-  }
-}
-
-static NSString *getStringForUIDeviceOrientation(UIDeviceOrientation orientation) {
-  switch (orientation) {
-    case UIDeviceOrientationPortraitUpsideDown:
-      return @"portraitDown";
-    case UIDeviceOrientationLandscapeRight:
-      return @"landscapeLeft";
-    case UIDeviceOrientationLandscapeLeft:
-      return @"landscapeRight";
-    case UIDeviceOrientationPortrait:
-    default:
-      return @"portraitUp";
-      break;
-  };
-}
-
-// Mirrors FocusMode in camera.dart
-typedef enum {
-  FocusModeAuto,
-  FocusModeLocked,
-} FocusMode;
-
-static NSString *getStringForFocusMode(FocusMode mode) {
-  switch (mode) {
-    case FocusModeAuto:
-      return @"auto";
-    case FocusModeLocked:
-      return @"locked";
-  }
-  NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
-                                       code:NSURLErrorUnknown
-                                   userInfo:@{
-                                     NSLocalizedDescriptionKey : [NSString
-                                         stringWithFormat:@"Unknown string for focus mode"]
-                                   }];
-  @throw error;
-}
-
-static FocusMode getFocusModeForString(NSString *mode) {
-  if ([mode isEqualToString:@"auto"]) {
-    return FocusModeAuto;
-  } else if ([mode isEqualToString:@"locked"]) {
-    return FocusModeLocked;
-  } else {
-    NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
-                                         code:NSURLErrorUnknown
-                                     userInfo:@{
-                                       NSLocalizedDescriptionKey : [NSString
-                                           stringWithFormat:@"Unknown focus mode %@", mode]
-                                     }];
-    @throw error;
-  }
-}
-
-// Mirrors ResolutionPreset in camera.dart
-typedef enum {
-  veryLow,
-  low,
-  medium,
-  high,
-  veryHigh,
-  ultraHigh,
-  max,
-} ResolutionPreset;
-
-static ResolutionPreset getResolutionPresetForString(NSString *preset) {
-  if ([preset isEqualToString:@"veryLow"]) {
-    return veryLow;
-  } else if ([preset isEqualToString:@"low"]) {
-    return low;
-  } else if ([preset isEqualToString:@"medium"]) {
-    return medium;
-  } else if ([preset isEqualToString:@"high"]) {
-    return high;
-  } else if ([preset isEqualToString:@"veryHigh"]) {
-    return veryHigh;
-  } else if ([preset isEqualToString:@"ultraHigh"]) {
-    return ultraHigh;
-  } else if ([preset isEqualToString:@"max"]) {
-    return max;
-  } else {
-    NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
-                                         code:NSURLErrorUnknown
-                                     userInfo:@{
-                                       NSLocalizedDescriptionKey : [NSString
-                                           stringWithFormat:@"Unknown resolution preset %@", preset]
-                                     }];
-    @throw error;
-  }
-}
-
 @interface FLTCam : NSObject <FlutterTexture,
                               AVCaptureVideoDataOutputSampleBufferDelegate,
                               AVCaptureAudioDataOutputSampleBufferDelegate>
@@ -305,9 +144,9 @@
 @property(assign, nonatomic) BOOL isAudioSetup;
 @property(assign, nonatomic) BOOL isStreamingImages;
 @property(assign, nonatomic) BOOL isPreviewPaused;
-@property(assign, nonatomic) ResolutionPreset resolutionPreset;
-@property(assign, nonatomic) ExposureMode exposureMode;
-@property(assign, nonatomic) FocusMode focusMode;
+@property(assign, nonatomic) FLTResolutionPreset resolutionPreset;
+@property(assign, nonatomic) FLTExposureMode exposureMode;
+@property(assign, nonatomic) FLTFocusMode focusMode;
 @property(assign, nonatomic) FLTFlashMode flashMode;
 @property(assign, nonatomic) UIDeviceOrientation lockedCaptureOrientation;
 @property(assign, nonatomic) CMTime lastVideoSampleTime;
@@ -337,7 +176,7 @@
   self = [super init];
   NSAssert(self, @"super init cannot be nil");
   @try {
-    _resolutionPreset = getResolutionPresetForString(resolutionPreset);
+    _resolutionPreset = FLTGetFLTResolutionPresetForString(resolutionPreset);
   } @catch (NSError *e) {
     *error = e;
   }
@@ -346,8 +185,8 @@
   _captureSession = [[AVCaptureSession alloc] init];
   _captureDevice = [AVCaptureDevice deviceWithUniqueID:cameraName];
   _flashMode = _captureDevice.hasFlash ? FLTFlashModeAuto : FLTFlashModeOff;
-  _exposureMode = ExposureModeAuto;
-  _focusMode = FocusModeAuto;
+  _exposureMode = FLTExposureModeAuto;
+  _focusMode = FLTFocusModeAuto;
   _lockedCaptureOrientation = UIDeviceOrientationUnknown;
   _deviceOrientation = orientation;
   _videoFormat = kCVPixelFormatType_32BGRA;
@@ -443,7 +282,7 @@
 
 - (void)captureToFile:(FLTThreadSafeFlutterResult *)result API_AVAILABLE(ios(10)) {
   AVCapturePhotoSettings *settings = [AVCapturePhotoSettings photoSettings];
-  if (_resolutionPreset == max) {
+  if (_resolutionPreset == FLTResolutionPresetMax) {
     [settings setHighResolutionPhotoEnabled:YES];
   }
 
@@ -511,10 +350,10 @@
   return file;
 }
 
-- (void)setCaptureSessionPreset:(ResolutionPreset)resolutionPreset {
+- (void)setCaptureSessionPreset:(FLTResolutionPreset)resolutionPreset {
   switch (resolutionPreset) {
-    case max:
-    case ultraHigh:
+    case FLTResolutionPresetMax:
+    case FLTResolutionPresetUltraHigh:
       if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset3840x2160]) {
         _captureSession.sessionPreset = AVCaptureSessionPreset3840x2160;
         _previewSize = CGSizeMake(3840, 2160);
@@ -527,25 +366,25 @@
                        _captureDevice.activeFormat.highResolutionStillImageDimensions.height);
         break;
       }
-    case veryHigh:
+    case FLTResolutionPresetVeryHigh:
       if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset1920x1080]) {
         _captureSession.sessionPreset = AVCaptureSessionPreset1920x1080;
         _previewSize = CGSizeMake(1920, 1080);
         break;
       }
-    case high:
+    case FLTResolutionPresetHigh:
       if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset1280x720]) {
         _captureSession.sessionPreset = AVCaptureSessionPreset1280x720;
         _previewSize = CGSizeMake(1280, 720);
         break;
       }
-    case medium:
+    case FLTResolutionPresetMedium:
       if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset640x480]) {
         _captureSession.sessionPreset = AVCaptureSessionPreset640x480;
         _previewSize = CGSizeMake(640, 480);
         break;
       }
-    case low:
+    case FLTResolutionPresetLow:
       if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset352x288]) {
         _captureSession.sessionPreset = AVCaptureSessionPreset352x288;
         _previewSize = CGSizeMake(352, 288);
@@ -871,7 +710,7 @@
                              orientation:(NSString *)orientationStr {
   UIDeviceOrientation orientation;
   @try {
-    orientation = getUIDeviceOrientationForString(orientationStr);
+    orientation = FLTGetUIDeviceOrientationForString(orientationStr);
   } @catch (NSError *e) {
     [result sendError:e];
     return;
@@ -943,9 +782,9 @@
 }
 
 - (void)setExposureModeWithResult:(FLTThreadSafeFlutterResult *)result mode:(NSString *)modeStr {
-  ExposureMode mode;
+  FLTExposureMode mode;
   @try {
-    mode = getExposureModeForString(modeStr);
+    mode = FLTGetFLTExposureModeForString(modeStr);
   } @catch (NSError *e) {
     [result sendError:e];
     return;
@@ -958,10 +797,10 @@
 - (void)applyExposureMode {
   [_captureDevice lockForConfiguration:nil];
   switch (_exposureMode) {
-    case ExposureModeLocked:
+    case FLTExposureModeLocked:
       [_captureDevice setExposureMode:AVCaptureExposureModeAutoExpose];
       break;
-    case ExposureModeAuto:
+    case FLTExposureModeAuto:
       if ([_captureDevice isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]) {
         [_captureDevice setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
       } else {
@@ -973,9 +812,9 @@
 }
 
 - (void)setFocusModeWithResult:(FLTThreadSafeFlutterResult *)result mode:(NSString *)modeStr {
-  FocusMode mode;
+  FLTFocusMode mode;
   @try {
-    mode = getFocusModeForString(modeStr);
+    mode = FLTGetFLTFocusModeForString(modeStr);
   } @catch (NSError *e) {
     [result sendError:e];
     return;
@@ -1003,15 +842,15 @@
  * @param focusMode The focus mode that should be applied to the @captureDevice instance.
  * @param captureDevice The AVCaptureDevice to which the @focusMode will be applied.
  */
-- (void)applyFocusMode:(FocusMode)focusMode onDevice:(AVCaptureDevice *)captureDevice {
+- (void)applyFocusMode:(FLTFocusMode)focusMode onDevice:(AVCaptureDevice *)captureDevice {
   [captureDevice lockForConfiguration:nil];
   switch (focusMode) {
-    case FocusModeLocked:
+    case FLTFocusModeLocked:
       if ([captureDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {
         [captureDevice setFocusMode:AVCaptureFocusModeAutoFocus];
       }
       break;
-    case FocusModeAuto:
+    case FLTFocusModeAuto:
       if ([captureDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus]) {
         [captureDevice setFocusMode:AVCaptureFocusModeContinuousAutoFocus];
       } else if ([captureDevice isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {
@@ -1346,7 +1185,7 @@
 - (void)sendDeviceOrientation:(UIDeviceOrientation)orientation {
   [_deviceEventMethodChannel
       invokeMethod:@"orientation_changed"
-         arguments:@{@"orientation" : getStringForUIDeviceOrientation(orientation)}];
+         arguments:@{@"orientation" : FLTGetStringForUIDeviceOrientation(orientation)}];
 }
 
 - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result {
@@ -1430,7 +1269,7 @@
     NSUInteger cameraId = ((NSNumber *)argsMap[@"cameraId"]).unsignedIntegerValue;
     if ([@"initialize" isEqualToString:call.method]) {
       NSString *videoFormatValue = ((NSString *)argsMap[@"imageFormatGroup"]);
-      [_camera setVideoFormat:getVideoFormatFromString(videoFormatValue)];
+      [_camera setVideoFormat:FLTGetVideoFormatFromString(videoFormatValue)];
 
       __weak CameraPlugin *weakSelf = self;
       _camera.onFrameAvailable = ^{
@@ -1450,8 +1289,8 @@
              arguments:@{
                @"previewWidth" : @(_camera.previewSize.width),
                @"previewHeight" : @(_camera.previewSize.height),
-               @"exposureMode" : getStringForExposureMode([_camera exposureMode]),
-               @"focusMode" : getStringForFocusMode([_camera focusMode]),
+               @"exposureMode" : FLTGetStringForFLTExposureMode([_camera exposureMode]),
+               @"focusMode" : FLTGetStringForFLTFocusMode([_camera focusMode]),
                @"exposurePointSupported" :
                    @([_camera.captureDevice isExposurePointOfInterestSupported]),
                @"focusPointSupported" : @([_camera.captureDevice isFocusPointOfInterestSupported]),
diff --git a/packages/camera/camera/ios/Classes/CameraPlugin.modulemap b/packages/camera/camera/ios/Classes/CameraPlugin.modulemap
index 8baa71b..0593741 100644
--- a/packages/camera/camera/ios/Classes/CameraPlugin.modulemap
+++ b/packages/camera/camera/ios/Classes/CameraPlugin.modulemap
@@ -6,6 +6,6 @@
 
   explicit module Test {
     header "CameraPlugin_Test.h"
-    header "FlashMode.h"
+    header "CameraProperties.h"
   }
 }
diff --git a/packages/camera/camera/ios/Classes/CameraProperties.h b/packages/camera/camera/ios/Classes/CameraProperties.h
new file mode 100644
index 0000000..aee4d64
--- /dev/null
+++ b/packages/camera/camera/ios/Classes/CameraProperties.h
@@ -0,0 +1,118 @@
+// 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 AVFoundation;
+@import Foundation;
+
+NS_ASSUME_NONNULL_BEGIN
+
+#pragma mark - flash mode
+
+/**
+ * Represents camera's flash mode. Mirrors `FlashMode` enum in flash_mode.dart.
+ */
+typedef NS_ENUM(NSInteger, FLTFlashMode) {
+  FLTFlashModeOff,
+  FLTFlashModeAuto,
+  FLTFlashModeAlways,
+  FLTFlashModeTorch,
+};
+
+/**
+ * Gets FLTFlashMode from its string representation.
+ * @param mode a string representation of the FLTFlashMode.
+ */
+extern FLTFlashMode FLTGetFLTFlashModeForString(NSString *mode);
+
+/**
+ * Gets AVCaptureFlashMode from FLTFlashMode.
+ * @param mode flash mode.
+ */
+extern AVCaptureFlashMode FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashMode mode);
+
+#pragma mark - exposure mode
+
+/**
+ * Represents camera's exposure mode. Mirrors ExposureMode in camera.dart.
+ */
+typedef NS_ENUM(NSInteger, FLTExposureMode) {
+  FLTExposureModeAuto,
+  FLTExposureModeLocked,
+};
+
+/**
+ * Gets a string representation of exposure mode.
+ * @param mode exposure mode
+ */
+extern NSString *FLTGetStringForFLTExposureMode(FLTExposureMode mode);
+
+/**
+ * Gets FLTExposureMode from its string representation.
+ * @param mode a string representation of the FLTExposureMode.
+ */
+extern FLTExposureMode FLTGetFLTExposureModeForString(NSString *mode);
+
+#pragma mark - focus mode
+
+/**
+ * Represents camera's focus mode. Mirrors FocusMode in camera.dart.
+ */
+typedef NS_ENUM(NSInteger, FLTFocusMode) {
+  FLTFocusModeAuto,
+  FLTFocusModeLocked,
+};
+
+/**
+ * Gets a string representation from FLTFocusMode.
+ * @param mode focus mode
+ */
+extern NSString *FLTGetStringForFLTFocusMode(FLTFocusMode mode);
+
+/**
+ * Gets FLTFocusMode from its string representation.
+ * @param mode a string representation of focus mode.
+ */
+extern FLTFocusMode FLTGetFLTFocusModeForString(NSString *mode);
+
+#pragma mark - device orientation
+
+/**
+ * Gets UIDeviceOrientation from its string representation.
+ */
+extern UIDeviceOrientation FLTGetUIDeviceOrientationForString(NSString *orientation);
+
+/**
+ * Gets a string representation of UIDeviceOrientation.
+ */
+extern NSString *FLTGetStringForUIDeviceOrientation(UIDeviceOrientation orientation);
+
+#pragma mark - resolution preset
+
+/**
+ * Represents camera's resolution present. Mirrors ResolutionPreset in camera.dart.
+ */
+typedef NS_ENUM(NSInteger, FLTResolutionPreset) {
+  FLTResolutionPresetVeryLow,
+  FLTResolutionPresetLow,
+  FLTResolutionPresetMedium,
+  FLTResolutionPresetHigh,
+  FLTResolutionPresetVeryHigh,
+  FLTResolutionPresetUltraHigh,
+  FLTResolutionPresetMax,
+};
+
+/**
+ * Gets FLTResolutionPreset from its string representation.
+ * @param preset a string representation of FLTResolutionPreset.
+ */
+extern FLTResolutionPreset FLTGetFLTResolutionPresetForString(NSString *preset);
+
+#pragma mark - video format
+
+/**
+ * Gets VideoFormat from its string representation.
+ */
+extern OSType FLTGetVideoFormatFromString(NSString *videoFormatString);
+
+NS_ASSUME_NONNULL_END
diff --git a/packages/camera/camera/ios/Classes/CameraProperties.m b/packages/camera/camera/ios/Classes/CameraProperties.m
new file mode 100644
index 0000000..e36f98a
--- /dev/null
+++ b/packages/camera/camera/ios/Classes/CameraProperties.m
@@ -0,0 +1,187 @@
+// 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 "CameraProperties.h"
+
+#pragma mark - flash mode
+
+FLTFlashMode FLTGetFLTFlashModeForString(NSString *mode) {
+  if ([mode isEqualToString:@"off"]) {
+    return FLTFlashModeOff;
+  } else if ([mode isEqualToString:@"auto"]) {
+    return FLTFlashModeAuto;
+  } else if ([mode isEqualToString:@"always"]) {
+    return FLTFlashModeAlways;
+  } else if ([mode isEqualToString:@"torch"]) {
+    return FLTFlashModeTorch;
+  } else {
+    NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+                                         code:NSURLErrorUnknown
+                                     userInfo:@{
+                                       NSLocalizedDescriptionKey : [NSString
+                                           stringWithFormat:@"Unknown flash mode %@", mode]
+                                     }];
+    @throw error;
+  }
+}
+
+AVCaptureFlashMode FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashMode mode) {
+  switch (mode) {
+    case FLTFlashModeOff:
+      return AVCaptureFlashModeOff;
+    case FLTFlashModeAuto:
+      return AVCaptureFlashModeAuto;
+    case FLTFlashModeAlways:
+      return AVCaptureFlashModeOn;
+    case FLTFlashModeTorch:
+    default:
+      return -1;
+  }
+}
+
+#pragma mark - exposure mode
+
+NSString *FLTGetStringForFLTExposureMode(FLTExposureMode mode) {
+  switch (mode) {
+    case FLTExposureModeAuto:
+      return @"auto";
+    case FLTExposureModeLocked:
+      return @"locked";
+  }
+  NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+                                       code:NSURLErrorUnknown
+                                   userInfo:@{
+                                     NSLocalizedDescriptionKey : [NSString
+                                         stringWithFormat:@"Unknown string for exposure mode"]
+                                   }];
+  @throw error;
+}
+
+FLTExposureMode FLTGetFLTExposureModeForString(NSString *mode) {
+  if ([mode isEqualToString:@"auto"]) {
+    return FLTExposureModeAuto;
+  } else if ([mode isEqualToString:@"locked"]) {
+    return FLTExposureModeLocked;
+  } else {
+    NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+                                         code:NSURLErrorUnknown
+                                     userInfo:@{
+                                       NSLocalizedDescriptionKey : [NSString
+                                           stringWithFormat:@"Unknown exposure mode %@", mode]
+                                     }];
+    @throw error;
+  }
+}
+
+#pragma mark - focus mode
+
+NSString *FLTGetStringForFLTFocusMode(FLTFocusMode mode) {
+  switch (mode) {
+    case FLTFocusModeAuto:
+      return @"auto";
+    case FLTFocusModeLocked:
+      return @"locked";
+  }
+  NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+                                       code:NSURLErrorUnknown
+                                   userInfo:@{
+                                     NSLocalizedDescriptionKey : [NSString
+                                         stringWithFormat:@"Unknown string for focus mode"]
+                                   }];
+  @throw error;
+}
+
+FLTFocusMode FLTGetFLTFocusModeForString(NSString *mode) {
+  if ([mode isEqualToString:@"auto"]) {
+    return FLTFocusModeAuto;
+  } else if ([mode isEqualToString:@"locked"]) {
+    return FLTFocusModeLocked;
+  } else {
+    NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+                                         code:NSURLErrorUnknown
+                                     userInfo:@{
+                                       NSLocalizedDescriptionKey : [NSString
+                                           stringWithFormat:@"Unknown focus mode %@", mode]
+                                     }];
+    @throw error;
+  }
+}
+
+#pragma mark - device orientation
+
+UIDeviceOrientation FLTGetUIDeviceOrientationForString(NSString *orientation) {
+  if ([orientation isEqualToString:@"portraitDown"]) {
+    return UIDeviceOrientationPortraitUpsideDown;
+  } else if ([orientation isEqualToString:@"landscapeLeft"]) {
+    return UIDeviceOrientationLandscapeRight;
+  } else if ([orientation isEqualToString:@"landscapeRight"]) {
+    return UIDeviceOrientationLandscapeLeft;
+  } else if ([orientation isEqualToString:@"portraitUp"]) {
+    return UIDeviceOrientationPortrait;
+  } else {
+    NSError *error = [NSError
+        errorWithDomain:NSCocoaErrorDomain
+                   code:NSURLErrorUnknown
+               userInfo:@{
+                 NSLocalizedDescriptionKey :
+                     [NSString stringWithFormat:@"Unknown device orientation %@", orientation]
+               }];
+    @throw error;
+  }
+}
+
+NSString *FLTGetStringForUIDeviceOrientation(UIDeviceOrientation orientation) {
+  switch (orientation) {
+    case UIDeviceOrientationPortraitUpsideDown:
+      return @"portraitDown";
+    case UIDeviceOrientationLandscapeRight:
+      return @"landscapeLeft";
+    case UIDeviceOrientationLandscapeLeft:
+      return @"landscapeRight";
+    case UIDeviceOrientationPortrait:
+    default:
+      return @"portraitUp";
+  };
+}
+
+#pragma mark - resolution preset
+
+FLTResolutionPreset FLTGetFLTResolutionPresetForString(NSString *preset) {
+  if ([preset isEqualToString:@"veryLow"]) {
+    return FLTResolutionPresetVeryLow;
+  } else if ([preset isEqualToString:@"low"]) {
+    return FLTResolutionPresetLow;
+  } else if ([preset isEqualToString:@"medium"]) {
+    return FLTResolutionPresetMedium;
+  } else if ([preset isEqualToString:@"high"]) {
+    return FLTResolutionPresetHigh;
+  } else if ([preset isEqualToString:@"veryHigh"]) {
+    return FLTResolutionPresetVeryHigh;
+  } else if ([preset isEqualToString:@"ultraHigh"]) {
+    return FLTResolutionPresetUltraHigh;
+  } else if ([preset isEqualToString:@"max"]) {
+    return FLTResolutionPresetMax;
+  } else {
+    NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
+                                         code:NSURLErrorUnknown
+                                     userInfo:@{
+                                       NSLocalizedDescriptionKey : [NSString
+                                           stringWithFormat:@"Unknown resolution preset %@", preset]
+                                     }];
+    @throw error;
+  }
+}
+
+#pragma mark - video format
+
+OSType FLTGetVideoFormatFromString(NSString *videoFormatString) {
+  if ([videoFormatString isEqualToString:@"bgra8888"]) {
+    return kCVPixelFormatType_32BGRA;
+  } else if ([videoFormatString isEqualToString:@"yuv420"]) {
+    return kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
+  } else {
+    NSLog(@"The selected imageFormatGroup is not supported by iOS. Defaulting to brga8888");
+    return kCVPixelFormatType_32BGRA;
+  }
+}
diff --git a/packages/camera/camera/ios/Classes/FlashMode.h b/packages/camera/camera/ios/Classes/FlashMode.h
deleted file mode 100644
index b04496d..0000000
--- a/packages/camera/camera/ios/Classes/FlashMode.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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 <AVFoundation/AVFoundation.h>
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * Represents camera's flash mode. Mirrors `FlashMode` enum in flash_mode.dart.
- */
-typedef NS_ENUM(NSInteger, FLTFlashMode) {
-  FLTFlashModeOff,
-  FLTFlashModeAuto,
-  FLTFlashModeAlways,
-  FLTFlashModeTorch,
-};
-
-/**
- * Gets FLTFlashMode from its string representation.
- * @param mode a string representation of the FLTFlashMode.
- */
-extern FLTFlashMode FLTGetFLTFlashModeForString(NSString *mode);
-
-/**
- * Gets AVCaptureFlashMode from FLTFlashMode.
- * @param mode flash mode.
- */
-extern AVCaptureFlashMode FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashMode mode);
-
-NS_ASSUME_NONNULL_END
diff --git a/packages/camera/camera/ios/Classes/FlashMode.m b/packages/camera/camera/ios/Classes/FlashMode.m
deleted file mode 100644
index b9d4a4a..0000000
--- a/packages/camera/camera/ios/Classes/FlashMode.m
+++ /dev/null
@@ -1,39 +0,0 @@
-// 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 "FlashMode.h"
-
-FLTFlashMode FLTGetFLTFlashModeForString(NSString *mode) {
-  if ([mode isEqualToString:@"off"]) {
-    return FLTFlashModeOff;
-  } else if ([mode isEqualToString:@"auto"]) {
-    return FLTFlashModeAuto;
-  } else if ([mode isEqualToString:@"always"]) {
-    return FLTFlashModeAlways;
-  } else if ([mode isEqualToString:@"torch"]) {
-    return FLTFlashModeTorch;
-  } else {
-    NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
-                                         code:NSURLErrorUnknown
-                                     userInfo:@{
-                                       NSLocalizedDescriptionKey : [NSString
-                                           stringWithFormat:@"Unknown flash mode %@", mode]
-                                     }];
-    @throw error;
-  }
-}
-
-AVCaptureFlashMode FLTGetAVCaptureFlashModeForFLTFlashMode(FLTFlashMode mode) {
-  switch (mode) {
-    case FLTFlashModeOff:
-      return AVCaptureFlashModeOff;
-    case FLTFlashModeAuto:
-      return AVCaptureFlashModeAuto;
-    case FLTFlashModeAlways:
-      return AVCaptureFlashModeOn;
-    case FLTFlashModeTorch:
-    default:
-      return -1;
-  }
-}
