Skip to content

[camera_avfoundation] Implementation swift migration - part 12 #9781

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

RobertOdrowaz
Copy link
Contributor

Migrates camera implementation as part of flutter/flutter#119109

This PR migrates the 9th chunk of FLTCam class to Swift:

  • init
  • Moves fields that no longer need to be accessible from FLTCam to DefaultCamera
  • Removes unused textureId field from FLTCam (it seems cameraId is used as "texture id" and this field wasn't used for a while now)
  • Typo correction in a comment so there is a bunch of files with just change in comment

Some properties of the FLTCam have to be temporarily made public so that they are accessible in DefaultCamera.

Pre-Review Checklist

If you need help, consider asking for advice on the #hackers-new channel on Discord.

Note: The Flutter team is currently trialing the use of Gemini Code Assist for GitHub. Comments from the gemini-code-assist bot should not be taken as authoritative feedback from the Flutter team. If you find its comments useful you can update your code accordingly, but if you are unsure or disagree with the feedback, please feel free to wait for a Flutter team member's review for guidance on which automated comments should be addressed.

Footnotes

  1. Regular contributors who have demonstrated familiarity with the repository guidelines only need to comment if the PR is not auto-exempted by repo tooling. 2 3

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request continues the migration of the camera_avfoundation plugin to Swift by moving the FLTCam initialization logic into the Swift DefaultCamera class. This includes moving many properties from the Objective-C superclass to the Swift subclass, improving encapsulation. The changes are well-structured and the updates to tests and other parts of the codebase are consistent with the migration.

My review includes a few suggestions to improve maintainability and fix a potential issue in the new DefaultCamera initializer related to error handling and testability.

Comment on lines +204 to +205
videoCaptureSession.commitConfiguration()
captureDevice.unlockForConfiguration()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The catch block should use the mediaSettingsAVWrapper to commit the configuration and unlock the device, just like in the success path. Bypassing the wrapper here breaks the abstraction and could cause issues with testing.

Suggested change
videoCaptureSession.commitConfiguration()
captureDevice.unlockForConfiguration()
mediaSettingsAVWrapper.commitConfiguration(for: videoCaptureSession)
mediaSettingsAVWrapper.unlockDevice(captureDevice)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is mediaSettingsAVWrapper a wrapper around the session?

Comment on lines +191 to +229
if mediaSettings.framesPerSecond != nil {
// The frame rate can be changed only on a locked for configuration device.
try mediaSettingsAVWrapper.lockDevice(captureDevice)
mediaSettingsAVWrapper.beginConfiguration(for: videoCaptureSession)

// Possible values for presets are hard-coded in FLT interface having
// corresponding AVCaptureSessionPreset counterparts.
// If _resolutionPreset is not supported by camera there is
// fallback to lower resolution presets.
// If none can be selected there is error condition.
do {
try setCaptureSessionPreset(mediaSettings.resolutionPreset)
} catch {
videoCaptureSession.commitConfiguration()
captureDevice.unlockForConfiguration()
throw error
}

FLTSelectBestFormatForRequestedFrameRate(
captureDevice,
mediaSettings,
videoDimensionsForFormat)

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

mediaSettingsAVWrapper.setMinFrameDuration(duration, on: captureDevice)
mediaSettingsAVWrapper.setMaxFrameDuration(duration, on: captureDevice)
}

mediaSettingsAVWrapper.commitConfiguration(for: videoCaptureSession)
mediaSettingsAVWrapper.unlockDevice(captureDevice)
} else {
// If the frame rate is not important fall to a less restrictive
// behavior (no configuration locking).
try setCaptureSessionPreset(mediaSettings.resolutionPreset)
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This initializer is quite long. To improve readability and maintainability, consider extracting this block of logic for setting up the resolution and frame rate into a separate private helper method.

Additionally, within that logic, using defer for unlockDevice and commitConfiguration would make the code more robust against potential errors.

Comment on lines +585 to +587
self?.inProgressSavePhotoDelegates.removeValue(
forKey:
settings.uniqueID)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

For better readability, this call to removeValue(forKey:) could be on a single line.

          self?.inProgressSavePhotoDelegates.removeValue(forKey: settings.uniqueID)

Comment on lines +204 to +205
videoCaptureSession.commitConfiguration()
captureDevice.unlockForConfiguration()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is mediaSettingsAVWrapper a wrapper around the session?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants