-
Notifications
You must be signed in to change notification settings - Fork 3.6k
[camera_avfoundation] enable more than 30 fps #7394
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
Changes from 1 commit
6c769f9
4920305
4f1483f
6c210c9
30a4856
5e1f249
5007358
65f8113
27868df
3983273
1d8f05a
cc632ec
f36d2dd
0125d77
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -155,56 +155,56 @@ - (instancetype)initWithCameraName:(NSString *)cameraName | |
|
|
||
| // Returns frame rate supported by format closest to targetFrameRate. | ||
| static double bestFrameRateForFormat(AVCaptureDeviceFormat *format, double targetFrameRate) { | ||
| double bestFrameRate = 0; | ||
| double minDistance = DBL_MAX; | ||
| for (AVFrameRateRange *range in format.videoSupportedFrameRateRanges) { | ||
| double frameRate = MIN(MAX(targetFrameRate, range.minFrameRate), range.maxFrameRate); | ||
| double distance = fabs(frameRate - targetFrameRate); | ||
| if (distance < minDistance) { | ||
| bestFrameRate = frameRate; | ||
| minDistance = distance; | ||
| } | ||
| } | ||
| return bestFrameRate; | ||
| double bestFrameRate = 0; | ||
| double minDistance = DBL_MAX; | ||
| for (AVFrameRateRange *range in format.videoSupportedFrameRateRanges) { | ||
| double frameRate = MIN(MAX(targetFrameRate, range.minFrameRate), range.maxFrameRate); | ||
| double distance = fabs(frameRate - targetFrameRate); | ||
| if (distance < minDistance) { | ||
| bestFrameRate = frameRate; | ||
| minDistance = distance; | ||
| } | ||
| } | ||
| return bestFrameRate; | ||
| } | ||
|
|
||
| // Finds format with same resolution as current activeFormat for which bestFrameRateForFormat | ||
| // returned frame rate closest to mediaSettings.framesPerSecond. Preferred are formats with the | ||
| // same subtype as current activeFormat. Sets this format as activeFormat and also updates | ||
| // mediaSettings.framesPerSecond to value which bestFrameRateForFormat returned for that format. | ||
| static void selectBestFormatForRequestedFrameRate( | ||
| AVCaptureDevice *captureDevice, FCPPlatformMediaSettings *mediaSettings, | ||
| VideoDimensionsForFormat videoDimensionsForFormat) { | ||
| CMVideoDimensions targetResolution = videoDimensionsForFormat(captureDevice.activeFormat); | ||
| double targetFrameRate = mediaSettings.framesPerSecond.doubleValue; | ||
| FourCharCode preferredSubType = | ||
| CMFormatDescriptionGetMediaSubType(captureDevice.activeFormat.formatDescription); | ||
| AVCaptureDeviceFormat *bestFormat = captureDevice.activeFormat; | ||
| double bestFrameRate = bestFrameRateForFormat(bestFormat, targetFrameRate); | ||
| double minDistance = fabs(bestFrameRate - targetFrameRate); | ||
| BOOL isBestSubTypePreferred = YES; | ||
| for (AVCaptureDeviceFormat *format in captureDevice.formats) { | ||
| CMVideoDimensions resolution = videoDimensionsForFormat(format); | ||
| if (resolution.width != targetResolution.width || | ||
| resolution.height != targetResolution.height) { | ||
| continue; | ||
| } | ||
| double frameRate = bestFrameRateForFormat(format, targetFrameRate); | ||
| double distance = fabs(frameRate - targetFrameRate); | ||
| FourCharCode subType = CMFormatDescriptionGetMediaSubType(format.formatDescription); | ||
| BOOL isSubTypePreferred = subType == preferredSubType; | ||
| if (distance < minDistance || (distance == minDistance && isSubTypePreferred && | ||
| !isBestSubTypePreferred)) { | ||
| bestFormat = format; | ||
| bestFrameRate = frameRate; | ||
| minDistance = distance; | ||
| isBestSubTypePreferred = isSubTypePreferred; | ||
| } | ||
| } | ||
| if (![bestFormat isEqual:captureDevice.activeFormat]) { | ||
| captureDevice.activeFormat = bestFormat; | ||
| } | ||
| mediaSettings.framesPerSecond = @(bestFrameRate); | ||
| AVCaptureDevice *captureDevice, FCPPlatformMediaSettings *mediaSettings, | ||
| VideoDimensionsForFormat videoDimensionsForFormat) { | ||
| CMVideoDimensions targetResolution = videoDimensionsForFormat(captureDevice.activeFormat); | ||
| double targetFrameRate = mediaSettings.framesPerSecond.doubleValue; | ||
| FourCharCode preferredSubType = | ||
| CMFormatDescriptionGetMediaSubType(captureDevice.activeFormat.formatDescription); | ||
| AVCaptureDeviceFormat *bestFormat = captureDevice.activeFormat; | ||
| double bestFrameRate = bestFrameRateForFormat(bestFormat, targetFrameRate); | ||
| double minDistance = fabs(bestFrameRate - targetFrameRate); | ||
| BOOL isBestSubTypePreferred = YES; | ||
| for (AVCaptureDeviceFormat *format in captureDevice.formats) { | ||
| CMVideoDimensions resolution = videoDimensionsForFormat(format); | ||
| if (resolution.width != targetResolution.width || | ||
| resolution.height != targetResolution.height) { | ||
| continue; | ||
| } | ||
| double frameRate = bestFrameRateForFormat(format, targetFrameRate); | ||
| double distance = fabs(frameRate - targetFrameRate); | ||
| FourCharCode subType = CMFormatDescriptionGetMediaSubType(format.formatDescription); | ||
| BOOL isSubTypePreferred = subType == preferredSubType; | ||
| if (distance < minDistance || | ||
| (distance == minDistance && isSubTypePreferred && !isBestSubTypePreferred)) { | ||
| bestFormat = format; | ||
| bestFrameRate = frameRate; | ||
| minDistance = distance; | ||
| isBestSubTypePreferred = isSubTypePreferred; | ||
| } | ||
| } | ||
| if (![bestFormat isEqual:captureDevice.activeFormat]) { | ||
|
||
| captureDevice.activeFormat = bestFormat; | ||
| } | ||
| mediaSettings.framesPerSecond = @(bestFrameRate); | ||
| } | ||
|
|
||
| - (instancetype)initWithMediaSettings:(FCPPlatformMediaSettings *)mediaSettings | ||
|
|
@@ -601,8 +601,8 @@ - (AVCaptureDeviceFormat *)highestResolutionFormatForCaptureDevice: | |
| NSUInteger pixelCount = height * width; | ||
| FourCharCode subType = CMFormatDescriptionGetMediaSubType(format.formatDescription); | ||
| BOOL isSubTypePreferred = subType == preferredSubType; | ||
| if (pixelCount > maxPixelCount || (pixelCount == maxPixelCount && isSubTypePreferred && | ||
| !isBestSubTypePreferred)) { | ||
| if (pixelCount > maxPixelCount || | ||
| (pixelCount == maxPixelCount && isSubTypePreferred && !isBestSubTypePreferred)) { | ||
| bestFormat = format; | ||
| maxPixelCount = pixelCount; | ||
| isBestSubTypePreferred = isSubTypePreferred; | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How about "Sets this format as the activeFormat in captureDevice and [...]"; I wasn't sure what
activeFormatwas referring to without reading the implementation.