6#include <QtCore/qcoreapplication.h>
7#include <QtCore/qmetaobject.h>
8#include <QtCore/qpermissions.h>
9#include <QtCore/qset.h>
10#include <QtCore/qsystemdetection.h>
11#include <QtCore/private/qcore_mac_p.h>
13#include <QtMultimedia/private/qavfcameradebug_p.h>
14#include <QtMultimedia/private/qavfcamerautility_p.h>
15#include <QtMultimedia/private/qavfhelpers_p.h>
16#include <QtMultimedia/private/qcameradevice_p.h>
17#include <QtMultimedia/private/qplatformmediaintegration_p.h>
29bool qt_check_exposure_duration(AVCaptureDevice *captureDevice, CMTime duration)
31 Q_ASSERT(captureDevice);
33 AVCaptureDeviceFormat *activeFormat = captureDevice.activeFormat;
35 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to obtain capture device format";
39 return CMTimeCompare(duration, activeFormat.minExposureDuration) != -1
40 && CMTimeCompare(activeFormat.maxExposureDuration, duration) != -1;
43bool qt_check_ISO_value(AVCaptureDevice *captureDevice,
int newISO)
45 Q_ASSERT(captureDevice);
47 AVCaptureDeviceFormat *activeFormat = captureDevice.activeFormat;
49 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to obtain capture device format";
53 return !(newISO < activeFormat.minISO || newISO > activeFormat.maxISO);
56bool qt_exposure_duration_equal(AVCaptureDevice *captureDevice, qreal qDuration)
58 Q_ASSERT(captureDevice);
59 const CMTime avDuration = CMTimeMakeWithSeconds(qDuration, captureDevice.exposureDuration.timescale);
60 return !CMTimeCompare(avDuration, captureDevice.exposureDuration);
63bool qt_iso_equal(AVCaptureDevice *captureDevice,
int iso)
65 Q_ASSERT(captureDevice);
66 return qFuzzyCompare(
float(iso), captureDevice.ISO);
69bool qt_exposure_bias_equal(AVCaptureDevice *captureDevice, qreal bias)
71 Q_ASSERT(captureDevice);
72 return qFuzzyCompare(bias, qreal(captureDevice.exposureTargetBias));
77bool qt_convert_exposure_mode(AVCaptureDevice *captureDevice, QCamera::ExposureMode mode,
78 AVCaptureExposureMode &avMode)
81 Q_ASSERT(captureDevice);
83 if (mode == QCamera::ExposureAuto) {
84 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]) {
85 avMode = AVCaptureExposureModeContinuousAutoExposure;
90 if (mode == QCamera::ExposureManual) {
91 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom]) {
92 avMode = AVCaptureExposureModeCustom;
104QAVFCameraBase::QAVFCameraBase(QCamera *camera)
105 : QPlatformCamera(camera)
110QAVFCameraBase::~QAVFCameraBase()
114bool QAVFCameraBase::isActive()
const
119void QAVFCameraBase::setActive(
bool active)
121 if (m_active == active)
123 if (m_cameraDevice.isNull() && active)
125 if (!checkCameraPermission())
130 onActiveChanged(active);
132 emit activeChanged(m_active);
135void QAVFCameraBase::setCamera(
const QCameraDevice &camera)
137 if (m_cameraDevice == camera)
139 m_cameraDevice = camera;
141 onCameraDeviceChanged(camera);
146 updateSupportedFeatures();
147 updateCameraConfiguration();
150bool QAVFCameraBase::setCameraFormat(
const QCameraFormat &newFormat)
152 if (!newFormat.isNull() && !m_cameraDevice.videoFormats().contains(newFormat))
155 const QCameraFormat resolvedFormat = newFormat.isNull() ? findBestCameraFormat(m_cameraDevice) : newFormat;
158 if (resolvedFormat.isNull())
161 const bool applySuccess = tryApplyCameraFormat(resolvedFormat);
165 m_cameraFormat = resolvedFormat;
170AVCaptureDevice *QAVFCameraBase::device()
const
172 return tryGetAvCaptureDevice(m_cameraDevice);
175AVCaptureDevice *QAVFCameraBase::tryGetAvCaptureDevice(
const QCameraDevice &device)
177 QByteArray deviceId = device.id();
178 if (deviceId.isEmpty())
181 QMacAutoReleasePool autoReleasePool;
183 NSString *nsString = [NSString stringWithUTF8String:deviceId.constData()];
184 if (nsString ==
nullptr)
186 return [AVCaptureDevice deviceWithUniqueID:nsString];
194bool qt_focus_mode_supported(QCamera::FocusMode mode)
196 return mode == QCamera::FocusModeAuto;
201void QAVFCameraBase::setFocusMode(QCamera::FocusMode mode)
203 if (mode == focusMode())
205 forceSetFocusMode(mode);
209void QAVFCameraBase::forceSetFocusMode(QCamera::FocusMode mode)
211 if (!isFocusModeSupported(mode)) {
214 << QString(u"attempted to set focus-mode '%1' on camera where it is unsupported.")
215 .arg(QMetaEnum::fromType<QCamera::FocusMode>().valueToKey(mode));
219 AVCaptureDevice *captureDevice = device();
220 if (!captureDevice) {
221 if (qt_focus_mode_supported(mode)) {
222 focusModeChanged(mode);
224 qCDebug(qLcCamera) << Q_FUNC_INFO
225 <<
"focus mode not supported";
230 if (mode == QCamera::FocusModeManual) {
236 applyFocusDistanceToAVCaptureDevice(focusDistance());
239 const AVFConfigurationLock lock(captureDevice);
241 qCDebug(qLcCamera) <<
243 "failed to lock for configuration";
249 captureDevice.focusMode = AVCaptureFocusModeContinuousAutoFocus;
252 focusModeChanged(mode);
255bool QAVFCameraBase::isFocusModeSupported(QCamera::FocusMode mode)
const
257 AVCaptureDevice *captureDevice = device();
260 case QCamera::FocusModeAuto:
261 return [captureDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus];
263 case QCamera::FocusModeManual:
264 return captureDevice.lockingFocusWithCustomLensPositionSupported;
266 case QCamera::FocusModeAutoNear:
268 case QCamera::FocusModeAutoFar:
270 return captureDevice.autoFocusRangeRestrictionSupported
271 && [captureDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus];
279 return mode == QCamera::FocusModeAuto;
282void QAVFCameraBase::setCustomFocusPoint(
const QPointF &point)
284 if (customFocusPoint() == point)
287 if (!QRectF(0.f, 0.f, 1.f, 1.f).contains(point)) {
289 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"invalid focus point (out of range)";
293 AVCaptureDevice *captureDevice = device();
297 if ([captureDevice isFocusPointOfInterestSupported]) {
298 const AVFConfigurationLock lock(captureDevice);
300 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
304 const CGPoint focusPOI = CGPointMake(point.x(), point.y());
305 [captureDevice setFocusPointOfInterest:focusPOI];
306 if (focusMode() != QCamera::FocusModeAuto)
307 [captureDevice setFocusMode:AVCaptureFocusModeAutoFocus];
309 customFocusPointChanged(point);
313void QAVFCameraBase::applyFocusDistanceToAVCaptureDevice(
float distance)
316 AVCaptureDevice *captureDevice = device();
324 if (!captureDevice.lockingFocusWithCustomLensPositionSupported) {
325 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to apply focusDistance to AVCaptureDevice.";
330 AVFConfigurationLock lock(captureDevice);
332 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock camera for configuration";
335 [captureDevice setFocusModeLockedWithLensPosition:distance completionHandler:nil];
342void QAVFCameraBase::setFocusDistance(
float distance)
344 if (qFuzzyCompare(focusDistance(), distance))
347 if (!(supportedFeatures() & QCamera::Feature::FocusDistance)) {
348 qCWarning(qLcCamera) <<
350 "attmpted to set focus-distance on camera without support for FocusDistance feature";
354 if (distance < 0 || distance > 1) {
355 qCWarning(qLcCamera) <<
357 "attempted to set camera focus-distance with out-of-bounds value";
363 if (focusMode() == QCamera::FocusModeManual) {
364 applyFocusDistanceToAVCaptureDevice(distance);
367 focusDistanceChanged(distance);
370void QAVFCameraBase::updateCameraConfiguration()
372 AVCaptureDevice *captureDevice = device();
373 if (!captureDevice) {
374 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"capture device is nil when trying to update QAVFCamera";
379 AVCaptureDeviceFormat *activeFormat = captureDevice.activeFormat;
381 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"capture device has no active format when trying to update QAVFCamera";
388 isFlashSupported = isFlashAutoSupported =
false;
389 isTorchSupported = isTorchAutoSupported =
false;
390 if (captureDevice.hasFlash) {
391 if ([captureDevice isFlashModeSupported:AVCaptureFlashModeOn])
392 isFlashSupported =
true;
393 if ([captureDevice isFlashModeSupported:AVCaptureFlashModeAuto])
394 isFlashAutoSupported =
true;
396 if (captureDevice.hasTorch) {
397 if ([captureDevice isTorchModeSupported:AVCaptureTorchModeOn])
398 isTorchSupported =
true;
399 if ([captureDevice isTorchModeSupported:AVCaptureTorchModeAuto])
400 isTorchAutoSupported =
true;
403 flashReadyChanged(isFlashSupported);
405 minimumZoomFactorChanged(captureDevice.minAvailableVideoZoomFactor);
406 maximumZoomFactorChanged(activeFormat.videoMaxZoomFactor);
412 if (minZoomFactor() < maxZoomFactor()) {
417 forceZoomTo(qBound(zoomFactor(), minZoomFactor(), maxZoomFactor()), -1);
419 applyFlashSettings();
423 if (isFocusModeSupported(focusMode()))
424 forceSetFocusMode(focusMode());
429 if (minZoomFactor() >= maxZoomFactor())
430 zoomFactorChanged(defaultZoomFactor());
432 if (!(supportedFeatures() & QCamera::Feature::FocusDistance))
433 focusDistanceChanged(defaultFocusDistance());
435 if (!isFocusModeSupported(focusMode()))
436 focusModeChanged(defaultFocusMode());
442 const AVFConfigurationLock lock(captureDevice);
444 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
448 if ([captureDevice isFocusPointOfInterestSupported]) {
449 auto point = customFocusPoint();
450 const CGPoint focusPOI = CGPointMake(point.x(), point.y());
451 [captureDevice setFocusPointOfInterest:focusPOI];
455 CMTime newDuration = AVCaptureExposureDurationCurrent;
456 bool setCustomMode =
false;
458 float exposureTime = manualExposureTime();
460 && !qt_exposure_duration_equal(captureDevice, exposureTime)) {
461 newDuration = CMTimeMakeWithSeconds(exposureTime, captureDevice.exposureDuration.timescale);
462 if (!qt_check_exposure_duration(captureDevice, newDuration)) {
463 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"requested exposure duration is out of range";
466 setCustomMode =
true;
469 float newISO = AVCaptureISOCurrent;
470 int iso = manualIsoSensitivity();
471 if (iso > 0 && !qt_iso_equal(captureDevice, iso)) {
473 if (!qt_check_ISO_value(captureDevice, newISO)) {
474 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"requested ISO value is out of range";
477 setCustomMode =
true;
480 float bias = exposureCompensation();
481 if (bias != 0 && !qt_exposure_bias_equal(captureDevice, bias)) {
483 if (bias < captureDevice.minExposureTargetBias || bias > captureDevice.maxExposureTargetBias) {
484 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"exposure compensation value is"
488 [captureDevice setExposureTargetBias:bias completionHandler:nil];
496 [captureDevice setExposureModeCustomWithDuration:newDuration
498 completionHandler:nil];
502 QCamera::ExposureMode qtMode = exposureMode();
503 AVCaptureExposureMode avMode = AVCaptureExposureModeContinuousAutoExposure;
504 if (!qt_convert_exposure_mode(captureDevice, qtMode, avMode)) {
505 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"requested exposure mode is not supported";
509 captureDevice.exposureMode = avMode;
515void QAVFCameraBase::updateSupportedFeatures()
517 QCamera::Features features;
518 AVCaptureDevice *captureDevice = device();
521 if ([captureDevice isFocusPointOfInterestSupported])
522 features |= QCamera::Feature::CustomFocusPoint;
525 AVCaptureDeviceFormat *activeFormat = captureDevice.activeFormat;
528 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom] &&
529 activeFormat.minISO < activeFormat.maxISO)
530 features |= QCamera::Feature::IsoSensitivity;
533 if (captureDevice.lockingWhiteBalanceWithCustomDeviceGainsSupported)
534 features |= QCamera::Feature::ColorTemperature;
537 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom] &&
538 captureDevice.minExposureTargetBias < captureDevice.maxExposureTargetBias)
539 features |= QCamera::Feature::ExposureCompensation;
542 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom] &&
543 CMTimeCompare(activeFormat.minExposureDuration, activeFormat.maxExposureDuration) == -1)
544 features |= QCamera::Feature::ManualExposureTime;
548 if (isFocusModeSupported(QCamera::FocusModeManual) &&
549 [captureDevice isLockingFocusWithCustomLensPositionSupported])
550 features |= QCamera::Feature::FocusDistance;
554 supportedFeaturesChanged(features);
557void QAVFCameraBase::zoomTo(
float factor,
float rate)
559 if (zoomFactor() == factor)
561 forceZoomTo(factor, rate);
567void QAVFCameraBase::forceZoomTo(
float factor,
float rate)
570 AVCaptureDevice *captureDevice = device();
571 if (!captureDevice || !captureDevice.activeFormat)
574 factor = qBound(captureDevice.minAvailableVideoZoomFactor, factor,
575 captureDevice.activeFormat.videoMaxZoomFactor);
578 const AVFConfigurationLock lock(captureDevice);
580 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
585 captureDevice.videoZoomFactor = factor;
587 [captureDevice rampToVideoZoomFactor:factor withRate:rate];
589 zoomFactorChanged(factor);
596void QAVFCameraBase::setFlashMode(QCamera::FlashMode mode)
598 if (flashMode() == mode)
601 if (!isFlashModeSupported(mode)) {
602 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"unsupported mode" << mode;
606 flashModeChanged(mode);
611 applyFlashSettings();
614bool QAVFCameraBase::isFlashModeSupported(QCamera::FlashMode mode)
const
616 if (mode == QCamera::FlashOff)
618 else if (mode == QCamera::FlashOn)
619 return isFlashSupported;
621 return isFlashAutoSupported;
624bool QAVFCameraBase::isFlashReady()
const
629 AVCaptureDevice *captureDevice = device();
633 if (!captureDevice.hasFlash)
636 if (!isFlashModeSupported(flashMode()))
642 return [captureDevice isFlashAvailable];
645void QAVFCameraBase::setTorchMode(QCamera::TorchMode mode)
647 if (torchMode() == mode)
650 if (isActive() && !isTorchModeSupported(mode)) {
651 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"unsupported torch mode" << mode;
655 torchModeChanged(mode);
660 applyFlashSettings();
663bool QAVFCameraBase::isTorchModeSupported(QCamera::TorchMode mode)
const
665 if (mode == QCamera::TorchOff)
667 else if (mode == QCamera::TorchOn)
668 return isTorchSupported;
670 return isTorchAutoSupported;
673void QAVFCameraBase::setExposureMode(QCamera::ExposureMode qtMode)
676 if (qtMode != QCamera::ExposureAuto && qtMode != QCamera::ExposureManual) {
677 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"exposure mode not supported";
681 AVCaptureDevice *captureDevice = device();
682 if (!captureDevice) {
683 exposureModeChanged(qtMode);
687 AVCaptureExposureMode avMode = AVCaptureExposureModeContinuousAutoExposure;
688 if (!qt_convert_exposure_mode(captureDevice, qtMode, avMode)) {
689 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"exposure mode not supported";
693 const AVFConfigurationLock lock(captureDevice);
695 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
696 <<
"for configuration";
700 [captureDevice setExposureMode:avMode];
701 exposureModeChanged(qtMode);
707bool QAVFCameraBase::isExposureModeSupported(QCamera::ExposureMode mode)
const
709 if (mode == QCamera::ExposureAuto)
711 if (mode != QCamera::ExposureManual)
714 AVCaptureDevice *captureDevice = device();
715 return captureDevice && [captureDevice isExposureModeSupported:AVCaptureExposureModeCustom];
718void QAVFCameraBase::applyFlashSettings()
720 AVCaptureDevice *captureDevice = device();
721 if (!captureDevice) {
722 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"no capture device found";
726 const AVFConfigurationLock lock(captureDevice);
728 if (captureDevice.hasFlash) {
729 const auto mode = flashMode();
731 auto setAvFlashModeSafe = [&captureDevice](AVCaptureFlashMode avFlashMode) {
734 if ([captureDevice isFlashModeSupported:avFlashMode])
735 captureDevice.flashMode = avFlashMode;
737 qCDebug(qLcCamera) <<
"Attempt to setup unsupported flash mode " << avFlashMode;
740 if (mode == QCamera::FlashOff) {
741 setAvFlashModeSafe(AVCaptureFlashModeOff);
743 if ([captureDevice isFlashAvailable]) {
744 if (mode == QCamera::FlashOn)
745 setAvFlashModeSafe(AVCaptureFlashModeOn);
746 else if (mode == QCamera::FlashAuto)
747 setAvFlashModeSafe(AVCaptureFlashModeAuto);
749 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"flash is not available at the moment";
754 if (captureDevice.hasTorch) {
755 const auto mode = torchMode();
757 auto setAvTorchModeSafe = [&captureDevice](AVCaptureTorchMode avTorchMode) {
758 if ([captureDevice isTorchModeSupported:avTorchMode])
759 captureDevice.torchMode = avTorchMode;
761 qCDebug(qLcCamera) <<
"Attempt to setup unsupported torch mode " << avTorchMode;
764 if (mode == QCamera::TorchOff) {
765 setAvTorchModeSafe(AVCaptureTorchModeOff);
767 if ([captureDevice isTorchAvailable]) {
768 if (mode == QCamera::TorchOn)
769 setAvTorchModeSafe(AVCaptureTorchModeOn);
770 else if (mode == QCamera::TorchAuto)
771 setAvTorchModeSafe(AVCaptureTorchModeAuto);
773 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"torch is not available at the moment";
780void QAVFCameraBase::setExposureCompensation(
float bias)
783 AVCaptureDevice *captureDevice = device();
784 if (!captureDevice) {
785 exposureCompensationChanged(bias);
789 bias = qBound(captureDevice.minExposureTargetBias, bias, captureDevice.maxExposureTargetBias);
791 const AVFConfigurationLock lock(captureDevice);
793 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
797 [captureDevice setExposureTargetBias:bias completionHandler:nil];
798 exposureCompensationChanged(bias);
804void QAVFCameraBase::setManualExposureTime(
float value)
808 setExposureMode(QCamera::ExposureAuto);
812 AVCaptureDevice *captureDevice = device();
813 if (!captureDevice) {
814 exposureTimeChanged(value);
818 const CMTime newDuration = CMTimeMakeWithSeconds(value, captureDevice.exposureDuration.timescale);
819 if (!qt_check_exposure_duration(captureDevice, newDuration)) {
820 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"shutter speed value is out of range";
824 const AVFConfigurationLock lock(captureDevice);
826 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
833 [captureDevice setExposureModeCustomWithDuration:newDuration
834 ISO:AVCaptureISOCurrent
835 completionHandler:nil];
837 exposureTimeChanged(value);
844float QAVFCameraBase::exposureTime()
const
847 AVCaptureDevice *captureDevice = device();
850 auto duration = captureDevice.exposureDuration;
851 return CMTimeGetSeconds(duration);
860void avf_convert_white_balance_mode(QCamera::WhiteBalanceMode qtMode,
861 AVCaptureWhiteBalanceMode &avMode)
863 if (qtMode == QCamera::WhiteBalanceAuto)
864 avMode = AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance;
866 avMode = AVCaptureWhiteBalanceModeLocked;
869bool avf_set_white_balance_mode(AVCaptureDevice *captureDevice,
870 AVCaptureWhiteBalanceMode avMode)
872 Q_ASSERT(captureDevice);
874 const bool lock = [captureDevice lockForConfiguration:nil];
876 qDebug() <<
"Failed to lock a capture device for configuration\n";
880 captureDevice.whiteBalanceMode = avMode;
881 [captureDevice unlockForConfiguration];
885bool avf_convert_temp_and_tint_to_wb_gains(AVCaptureDevice *captureDevice,
886 float temp,
float tint, AVCaptureWhiteBalanceGains &wbGains)
888 Q_ASSERT(captureDevice);
890 AVCaptureWhiteBalanceTemperatureAndTintValues wbTTValues = {
894 wbGains = [captureDevice deviceWhiteBalanceGainsForTemperatureAndTintValues:wbTTValues];
896 if (wbGains.redGain >= 1.0 && wbGains.redGain <= captureDevice.maxWhiteBalanceGain
897 && wbGains.greenGain >= 1.0 && wbGains.greenGain <= captureDevice.maxWhiteBalanceGain
898 && wbGains.blueGain >= 1.0 && wbGains.blueGain <= captureDevice.maxWhiteBalanceGain)
904bool avf_set_white_balance_gains(AVCaptureDevice *captureDevice,
905 AVCaptureWhiteBalanceGains wbGains)
907 const bool lock = [captureDevice lockForConfiguration:nil];
909 qDebug() <<
"Failed to lock a capture device for configuration\n";
913 [captureDevice setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:wbGains
914 completionHandler:nil];
915 [captureDevice unlockForConfiguration];
921bool QAVFCameraBase::isWhiteBalanceModeSupported(QCamera::WhiteBalanceMode mode)
const
923 if (mode == QCamera::WhiteBalanceAuto)
925 AVCaptureDevice *captureDevice = device();
928 return [captureDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked];
931void QAVFCameraBase::setWhiteBalanceMode(QCamera::WhiteBalanceMode mode)
933 if (!isWhiteBalanceModeSupported(mode))
936 AVCaptureDevice *captureDevice = device();
937 Q_ASSERT(captureDevice);
939 const AVFConfigurationLock lock(captureDevice);
941 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
942 <<
"for configuration";
946 AVCaptureWhiteBalanceMode avMode;
947 avf_convert_white_balance_mode(mode, avMode);
948 avf_set_white_balance_mode(captureDevice, avMode);
950 if (mode == QCamera::WhiteBalanceAuto || mode == QCamera::WhiteBalanceManual) {
951 whiteBalanceModeChanged(mode);
955 const int colorTemp = colorTemperatureForWhiteBalance(mode);
956 AVCaptureWhiteBalanceGains wbGains;
957 if (avf_convert_temp_and_tint_to_wb_gains(captureDevice, colorTemp, 0., wbGains)
958 && avf_set_white_balance_gains(captureDevice, wbGains))
959 whiteBalanceModeChanged(mode);
962void QAVFCameraBase::setColorTemperature(
int colorTemp)
964 if (colorTemp == 0) {
965 colorTemperatureChanged(colorTemp);
969 AVCaptureDevice *captureDevice = device();
970 if (!captureDevice || ![captureDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked])
973 const AVFConfigurationLock lock(captureDevice);
975 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
976 <<
"for configuration";
980 AVCaptureWhiteBalanceGains wbGains;
981 if (avf_convert_temp_and_tint_to_wb_gains(captureDevice, colorTemp, 0., wbGains)
982 && avf_set_white_balance_gains(captureDevice, wbGains))
983 colorTemperatureChanged(colorTemp);
987void QAVFCameraBase::setManualIsoSensitivity(
int value)
991 setExposureMode(QCamera::ExposureAuto);
995 AVCaptureDevice *captureDevice = device();
996 if (!captureDevice) {
997 isoSensitivityChanged(value);
1001 if (!qt_check_ISO_value(captureDevice, value)) {
1002 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"ISO value is out of range";
1006 const AVFConfigurationLock lock(captureDevice);
1008 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
1009 <<
"for configuration";
1015 [captureDevice setExposureModeCustomWithDuration:AVCaptureExposureDurationCurrent
1017 completionHandler:nil];
1019 isoSensitivityChanged(value);
1025int QAVFCameraBase::isoSensitivity()
const
1027 return manualIsoSensitivity();
1031bool QAVFCameraBase::checkCameraPermission()
1033 const QCameraPermission permission;
1034 const bool granted = qApp->checkPermission(permission) == Qt::PermissionStatus::Granted;
1036 qWarning() <<
"Access to camera not granted";
1042#include "moc_qavfcamerabase_p.cpp"