Skip to content

Commit 5fc630a

Browse files
committed
Remove dependence on MediaSettings mutability
1 parent 837dbbd commit 5fc630a

File tree

5 files changed

+18
-15
lines changed

5 files changed

+18
-15
lines changed

packages/camera/camera_avfoundation/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.9.22+10
2+
3+
* Removes dependence on MediaSettings mutability.
4+
15
## 0.9.22+9
26

37
* Migrates `FLTSavePhotoDelegate`, `FLTWritableData`, and `FLTImageStreamHandler` classes to Swift.

packages/camera/camera_avfoundation/example/ios/RunnerTests/CameraSettingsTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ private final class TestMediaSettingsAVWrapper: FLTCamMediaSettingsAVWrapper {
8686
if let compressionProperties = outputSettings?[AVVideoCompressionPropertiesKey]
8787
as? [String: Any],
8888
let bitrate = compressionProperties[AVVideoAverageBitRateKey] as? Int,
89-
let frameRate = compressionProperties[AVVideoExpectedSourceFrameRateKey] as? Int,
90-
bitrate == testVideoBitrate, frameRate == testFramesPerSecond
89+
let frameRate = compressionProperties[AVVideoExpectedSourceFrameRateKey] as? Double,
90+
bitrate == testVideoBitrate, frameRate == Double(testFramesPerSecond)
9191
{
9292
videoSettingsExpectation.fulfill()
9393
}

packages/camera/camera_avfoundation/ios/camera_avfoundation/Sources/camera_avfoundation/DefaultCamera.swift

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ final class DefaultCamera: NSObject, Camera {
4343
private let captureSessionQueue: DispatchQueue
4444

4545
private let mediaSettings: FCPPlatformMediaSettings
46+
private var framesPerSecond: Double?
4647
private let mediaSettingsAVWrapper: FLTCamMediaSettingsAVWrapper
4748

4849
private let videoCaptureSession: CaptureSession
@@ -213,14 +214,14 @@ final class DefaultCamera: NSObject, Camera {
213214

214215
try setCaptureSessionPreset(mediaSettings.resolutionPreset)
215216

216-
FormatUtils.selectBestFormat(
217+
(captureDevice.flutterActiveFormat, framesPerSecond) = FormatUtils.findBestFormat(
217218
for: captureDevice,
218219
mediaSettings: mediaSettings,
219220
videoDimensionsConverter: videoDimensionsConverter)
220221

221-
if let framesPerSecond = mediaSettings.framesPerSecond {
222+
if let framesPerSecond = framesPerSecond {
222223
// Set frame rate with 1/10 precision allowing non-integral values.
223-
let fpsNominator = floor(framesPerSecond.doubleValue * 10.0)
224+
let fpsNominator = floor(framesPerSecond * 10.0)
224225
let duration = CMTimeMake(value: 10, timescale: Int32(fpsNominator))
225226

226227
mediaSettingsAVWrapper.setMinFrameDuration(duration, on: captureDevice)
@@ -542,14 +543,14 @@ final class DefaultCamera: NSObject, Camera {
542543
for: captureVideoOutput
543544
)
544545

545-
if mediaSettings.videoBitrate != nil || mediaSettings.framesPerSecond != nil {
546+
if mediaSettings.videoBitrate != nil || framesPerSecond != nil {
546547
var compressionProperties: [String: Any] = [:]
547548

548549
if let videoBitrate = mediaSettings.videoBitrate {
549550
compressionProperties[AVVideoAverageBitRateKey] = videoBitrate
550551
}
551552

552-
if let framesPerSecond = mediaSettings.framesPerSecond {
553+
if let framesPerSecond = framesPerSecond {
553554
compressionProperties[AVVideoExpectedSourceFrameRateKey] = framesPerSecond
554555
}
555556

packages/camera/camera_avfoundation/ios/camera_avfoundation/Sources/camera_avfoundation/FormatUtils.swift

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,13 @@ enum FormatUtils {
3636

3737
/// Finds format with same resolution as current activeFormat in captureDevice for which
3838
/// bestFrameRate returned frame rate closest to mediaSettings.framesPerSecond.
39-
/// Preferred are formats with the same subtype as current activeFormat. Sets this format
40-
/// as activeFormat and also updates mediaSettings.framesPerSecond to value which
41-
/// bestFrameRate returned for that format.
42-
static func selectBestFormat(
39+
/// Preferred are formats with the same subtype as current activeFormat. Returns this format
40+
/// and frame rate which bestFrameRate returned for that format.
41+
static func findBestFormat(
4342
for captureDevice: CaptureDevice,
4443
mediaSettings: FCPPlatformMediaSettings,
4544
videoDimensionsConverter: VideoDimensionsConverter
46-
) {
45+
) -> (CaptureDeviceFormat, Double) {
4746
let targetResolution = videoDimensionsConverter(captureDevice.flutterActiveFormat)
4847
let targetFrameRate = mediaSettings.framesPerSecond?.doubleValue ?? 0
4948
let preferredSubType = CMFormatDescriptionGetMediaSubType(
@@ -76,7 +75,6 @@ enum FormatUtils {
7675
}
7776
}
7877

79-
captureDevice.flutterActiveFormat = bestFormat
80-
mediaSettings.framesPerSecond = NSNumber(value: resolvedBastFrameRate)
78+
return (bestFormat, resolvedBastFrameRate)
8179
}
8280
}

packages/camera/camera_avfoundation/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: camera_avfoundation
22
description: iOS implementation of the camera plugin.
33
repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_avfoundation
44
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22
5-
version: 0.9.22+9
5+
version: 0.9.22+10
66

77
environment:
88
sdk: ^3.9.0

0 commit comments

Comments
 (0)