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>
21using namespace Qt::Literals;
31bool qt_check_exposure_duration(AVCaptureDevice *captureDevice, CMTime duration)
33 Q_ASSERT(captureDevice);
35 AVCaptureDeviceFormat *activeFormat = captureDevice.activeFormat;
37 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to obtain capture device format";
41 return CMTimeCompare(duration, activeFormat.minExposureDuration) != -1
42 && CMTimeCompare(activeFormat.maxExposureDuration, duration) != -1;
45bool qt_check_ISO_value(AVCaptureDevice *captureDevice,
int newISO)
47 Q_ASSERT(captureDevice);
49 AVCaptureDeviceFormat *activeFormat = captureDevice.activeFormat;
51 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to obtain capture device format";
55 return !(newISO < activeFormat.minISO || newISO > activeFormat.maxISO);
58bool qt_exposure_duration_equal(AVCaptureDevice *captureDevice, qreal qDuration)
60 Q_ASSERT(captureDevice);
61 const CMTime avDuration = CMTimeMakeWithSeconds(qDuration, captureDevice.exposureDuration.timescale);
62 return !CMTimeCompare(avDuration, captureDevice.exposureDuration);
65bool qt_iso_equal(AVCaptureDevice *captureDevice,
int iso)
67 Q_ASSERT(captureDevice);
68 return QtPrivate::fuzzyCompare(
float(iso), captureDevice.ISO);
71bool qt_exposure_bias_equal(AVCaptureDevice *captureDevice, qreal bias)
73 Q_ASSERT(captureDevice);
74 return QtPrivate::fuzzyCompare(bias, qreal(captureDevice.exposureTargetBias));
79bool qt_convert_exposure_mode(AVCaptureDevice *captureDevice, QCamera::ExposureMode mode,
80 AVCaptureExposureMode &avMode)
83 Q_ASSERT(captureDevice);
85 if (mode == QCamera::ExposureAuto) {
86 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure]) {
87 avMode = AVCaptureExposureModeContinuousAutoExposure;
92 if (mode == QCamera::ExposureManual) {
93 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom]) {
94 avMode = AVCaptureExposureModeCustom;
106QAVFCameraBase::QAVFCameraBase(QCamera *camera)
107 : QPlatformCamera(camera)
112QAVFCameraBase::~QAVFCameraBase()
116bool QAVFCameraBase::isActive()
const
121void QAVFCameraBase::setActive(
bool active)
123 if (m_active == active)
125 if (m_cameraDevice.isNull() && active)
127 if (!checkCameraPermission())
130 q23::expected<
void, QString> result = onActiveChanged(active);
134 updateError(QCamera::Error::CameraError, result.error());
139 Q_EMIT activeChanged(m_active);
142void QAVFCameraBase::setCamera(
const QCameraDevice &camera)
144 if (m_cameraDevice == camera)
158 QCameraFormat newFormat = findBestCameraFormat(camera);
159 Q_ASSERT(!newFormat.isNull());
164 onCameraDeviceChanged(camera, newFormat);
166 m_cameraDevice = camera;
167 m_cameraFormat = newFormat;
169 updateSupportedFeatures(camera);
170 updateCameraConfiguration(camera);
173bool QAVFCameraBase::setCameraFormat(
const QCameraFormat &newFormat)
175 if (!newFormat.isNull() && !m_cameraDevice.videoFormats().contains(newFormat))
178 const QCameraFormat resolvedFormat = newFormat.isNull() ? findBestCameraFormat(m_cameraDevice) : newFormat;
181 if (resolvedFormat.isNull())
184 const bool applySuccess = tryApplyCameraFormat(resolvedFormat);
188 m_cameraFormat = resolvedFormat;
193AVCaptureDevice *QAVFCameraBase::device()
const
195 return tryGetAvCaptureDevice(m_cameraDevice);
198AVCaptureDevice *QAVFCameraBase::tryGetAvCaptureDevice(
const QCameraDevice &device)
200 QByteArray deviceId = device.id();
201 if (deviceId.isEmpty())
204 QMacAutoReleasePool autoReleasePool;
206 NSString *nsString = [NSString stringWithUTF8String:deviceId.constData()];
207 if (nsString ==
nullptr)
209 return [AVCaptureDevice deviceWithUniqueID:nsString];
217bool qt_focus_mode_supported(QCamera::FocusMode mode)
219 return mode == QCamera::FocusModeAuto;
224void QAVFCameraBase::setFocusMode(QCamera::FocusMode mode)
226 if (mode == focusMode())
228 forceSetFocusMode(mode);
232void QAVFCameraBase::forceSetFocusMode(QCamera::FocusMode mode)
234 if (!isFocusModeSupported(mode)) {
237 << u"attempted to set focus-mode '%1' on camera where it is unsupported."_s.arg(
238 QMetaEnum::fromType<QCamera::FocusMode>().valueToKey(mode));
242 AVCaptureDevice *captureDevice = device();
243 if (!captureDevice) {
244 if (qt_focus_mode_supported(mode)) {
245 focusModeChanged(mode);
247 qCDebug(qLcCamera) << Q_FUNC_INFO
248 <<
"focus mode not supported";
253 if (mode == QCamera::FocusModeManual) {
259 applyFocusDistanceToAVCaptureDevice(focusDistance());
262 const AVFConfigurationLock lock(captureDevice);
264 qCDebug(qLcCamera) <<
266 "failed to lock for configuration";
272 captureDevice.focusMode = AVCaptureFocusModeContinuousAutoFocus;
275 focusModeChanged(mode);
278bool QAVFCameraBase::isFocusModeSupported(QCamera::FocusMode mode)
const
280 AVCaptureDevice *captureDevice = device();
283 case QCamera::FocusModeAuto:
284 return [captureDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus];
286 case QCamera::FocusModeManual:
287 return captureDevice.lockingFocusWithCustomLensPositionSupported;
289 case QCamera::FocusModeAutoNear:
291 case QCamera::FocusModeAutoFar:
293 return captureDevice.autoFocusRangeRestrictionSupported
294 && [captureDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus];
302 return mode == QCamera::FocusModeAuto;
305void QAVFCameraBase::setCustomFocusPoint(
const QPointF &point)
307 if (customFocusPoint() == point)
310 if (!QRectF(0.f, 0.f, 1.f, 1.f).contains(point)) {
312 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"invalid focus point (out of range)";
316 AVCaptureDevice *captureDevice = device();
320 if ([captureDevice isFocusPointOfInterestSupported]) {
321 const AVFConfigurationLock lock(captureDevice);
323 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
327 const CGPoint focusPOI = CGPointMake(point.x(), point.y());
328 [captureDevice setFocusPointOfInterest:focusPOI];
329 if (focusMode() != QCamera::FocusModeAuto)
330 [captureDevice setFocusMode:AVCaptureFocusModeAutoFocus];
332 customFocusPointChanged(point);
336void QAVFCameraBase::applyFocusDistanceToAVCaptureDevice(
float distance)
339 AVCaptureDevice *captureDevice = device();
347 if (!captureDevice.lockingFocusWithCustomLensPositionSupported) {
348 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to apply focusDistance to AVCaptureDevice.";
353 AVFConfigurationLock lock(captureDevice);
355 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock camera for configuration";
358 [captureDevice setFocusModeLockedWithLensPosition:distance completionHandler:nil];
365void QAVFCameraBase::setFocusDistance(
float distance)
367 if (QtPrivate::fuzzyCompare(focusDistance(), distance))
370 if (!(supportedFeatures() & QCamera::Feature::FocusDistance)) {
371 qCWarning(qLcCamera) <<
373 "attmpted to set focus-distance on camera without support for FocusDistance feature";
377 if (distance < 0 || distance > 1) {
378 qCWarning(qLcCamera) <<
380 "attempted to set camera focus-distance with out-of-bounds value";
386 if (focusMode() == QCamera::FocusModeManual) {
387 applyFocusDistanceToAVCaptureDevice(distance);
390 focusDistanceChanged(distance);
393void QAVFCameraBase::updateCameraConfiguration(
const QCameraDevice &cameraDevice)
398 AVCaptureDevice *captureDevice = tryGetAvCaptureDevice(cameraDevice);
401 if (!captureDevice) {
402 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"capture device is nil when trying to update QAVFCamera";
407 AVCaptureDeviceFormat *activeFormat = captureDevice.activeFormat;
409 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"capture device has no active format when trying to update QAVFCamera";
416 isFlashSupported = isFlashAutoSupported =
false;
417 isTorchSupported = isTorchAutoSupported =
false;
418 if (captureDevice.hasFlash) {
419 if ([captureDevice isFlashModeSupported:AVCaptureFlashModeOn])
420 isFlashSupported =
true;
421 if ([captureDevice isFlashModeSupported:AVCaptureFlashModeAuto])
422 isFlashAutoSupported =
true;
424 if (captureDevice.hasTorch) {
425 if ([captureDevice isTorchModeSupported:AVCaptureTorchModeOn])
426 isTorchSupported =
true;
427 if ([captureDevice isTorchModeSupported:AVCaptureTorchModeAuto])
428 isTorchAutoSupported =
true;
431 flashReadyChanged(isFlashSupported);
433 minimumZoomFactorChanged(captureDevice.minAvailableVideoZoomFactor);
434 maximumZoomFactorChanged(activeFormat.videoMaxZoomFactor);
440 if (minZoomFactor() < maxZoomFactor()) {
445 forceZoomTo(qBound(zoomFactor(), minZoomFactor(), maxZoomFactor()), -1);
447 applyFlashSettings();
451 if (isFocusModeSupported(focusMode()))
452 forceSetFocusMode(focusMode());
457 if (minZoomFactor() >= maxZoomFactor())
458 zoomFactorChanged(defaultZoomFactor());
460 if (!(supportedFeatures() & QCamera::Feature::FocusDistance))
461 focusDistanceChanged(defaultFocusDistance());
463 if (!isFocusModeSupported(focusMode()))
464 focusModeChanged(defaultFocusMode());
470 const AVFConfigurationLock lock(captureDevice);
472 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
476 if ([captureDevice isFocusPointOfInterestSupported]) {
477 auto point = customFocusPoint();
478 const CGPoint focusPOI = CGPointMake(point.x(), point.y());
479 [captureDevice setFocusPointOfInterest:focusPOI];
483 CMTime newDuration = AVCaptureExposureDurationCurrent;
484 bool setCustomMode =
false;
486 float exposureTime = manualExposureTime();
488 && !qt_exposure_duration_equal(captureDevice, exposureTime)) {
489 newDuration = CMTimeMakeWithSeconds(exposureTime, captureDevice.exposureDuration.timescale);
490 if (!qt_check_exposure_duration(captureDevice, newDuration)) {
491 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"requested exposure duration is out of range";
494 setCustomMode =
true;
497 float newISO = AVCaptureISOCurrent;
498 int iso = manualIsoSensitivity();
499 if (iso > 0 && !qt_iso_equal(captureDevice, iso)) {
501 if (!qt_check_ISO_value(captureDevice, newISO)) {
502 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"requested ISO value is out of range";
505 setCustomMode =
true;
508 float bias = exposureCompensation();
509 if (bias != 0 && !qt_exposure_bias_equal(captureDevice, bias)) {
511 if (bias < captureDevice.minExposureTargetBias || bias > captureDevice.maxExposureTargetBias) {
512 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"exposure compensation value is"
516 [captureDevice setExposureTargetBias:bias completionHandler:nil];
524 [captureDevice setExposureModeCustomWithDuration:newDuration
526 completionHandler:nil];
530 QCamera::ExposureMode qtMode = exposureMode();
531 AVCaptureExposureMode avMode = AVCaptureExposureModeContinuousAutoExposure;
532 if (!qt_convert_exposure_mode(captureDevice, qtMode, avMode)) {
533 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"requested exposure mode is not supported";
537 captureDevice.exposureMode = avMode;
541void QAVFCameraBase::updateSupportedFeatures(
const QCameraDevice &cameraDevice)
543 QCamera::Features features;
544 AVCaptureDevice *captureDevice = tryGetAvCaptureDevice(cameraDevice);
547 if ([captureDevice isFocusPointOfInterestSupported])
548 features |= QCamera::Feature::CustomFocusPoint;
551 AVCaptureDeviceFormat *activeFormat = captureDevice.activeFormat;
554 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom] &&
555 activeFormat.minISO < activeFormat.maxISO)
556 features |= QCamera::Feature::IsoSensitivity;
559 if (captureDevice.lockingWhiteBalanceWithCustomDeviceGainsSupported)
560 features |= QCamera::Feature::ColorTemperature;
563 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom] &&
564 captureDevice.minExposureTargetBias < captureDevice.maxExposureTargetBias)
565 features |= QCamera::Feature::ExposureCompensation;
568 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom] &&
569 CMTimeCompare(activeFormat.minExposureDuration, activeFormat.maxExposureDuration) == -1)
570 features |= QCamera::Feature::ManualExposureTime;
574 if (isFocusModeSupported(QCamera::FocusModeManual) &&
575 [captureDevice isLockingFocusWithCustomLensPositionSupported])
576 features |= QCamera::Feature::FocusDistance;
580 supportedFeaturesChanged(features);
583void QAVFCameraBase::zoomTo(
float factor,
float rate)
585 if (zoomFactor() == factor)
587 forceZoomTo(factor, rate);
593void QAVFCameraBase::forceZoomTo(
float factor,
float rate)
596 AVCaptureDevice *captureDevice = device();
597 if (!captureDevice || !captureDevice.activeFormat)
600 factor = qBound(captureDevice.minAvailableVideoZoomFactor, factor,
601 captureDevice.activeFormat.videoMaxZoomFactor);
604 const AVFConfigurationLock lock(captureDevice);
606 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
611 captureDevice.videoZoomFactor = factor;
613 [captureDevice rampToVideoZoomFactor:factor withRate:rate];
615 zoomFactorChanged(factor);
622void QAVFCameraBase::setFlashMode(QCamera::FlashMode mode)
624 if (flashMode() == mode)
627 if (!isFlashModeSupported(mode)) {
628 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"unsupported mode" << mode;
632 flashModeChanged(mode);
637 applyFlashSettings();
640bool QAVFCameraBase::isFlashModeSupported(QCamera::FlashMode mode)
const
642 if (mode == QCamera::FlashOff)
644 else if (mode == QCamera::FlashOn)
645 return isFlashSupported;
647 return isFlashAutoSupported;
650bool QAVFCameraBase::isFlashReady()
const
655 AVCaptureDevice *captureDevice = device();
659 if (!captureDevice.hasFlash)
662 if (!isFlashModeSupported(flashMode()))
668 return [captureDevice isFlashAvailable];
671void QAVFCameraBase::setTorchMode(QCamera::TorchMode mode)
673 if (torchMode() == mode)
676 if (isActive() && !isTorchModeSupported(mode)) {
677 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"unsupported torch mode" << mode;
681 torchModeChanged(mode);
686 applyFlashSettings();
689bool QAVFCameraBase::isTorchModeSupported(QCamera::TorchMode mode)
const
691 if (mode == QCamera::TorchOff)
693 else if (mode == QCamera::TorchOn)
694 return isTorchSupported;
696 return isTorchAutoSupported;
699void QAVFCameraBase::setExposureMode(QCamera::ExposureMode qtMode)
702 if (qtMode != QCamera::ExposureAuto && qtMode != QCamera::ExposureManual) {
703 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"exposure mode not supported";
707 AVCaptureDevice *captureDevice = device();
708 if (!captureDevice) {
709 exposureModeChanged(qtMode);
713 AVCaptureExposureMode avMode = AVCaptureExposureModeContinuousAutoExposure;
714 if (!qt_convert_exposure_mode(captureDevice, qtMode, avMode)) {
715 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"exposure mode not supported";
719 const AVFConfigurationLock lock(captureDevice);
721 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
722 <<
"for configuration";
726 [captureDevice setExposureMode:avMode];
727 exposureModeChanged(qtMode);
733bool QAVFCameraBase::isExposureModeSupported(QCamera::ExposureMode mode)
const
735 if (mode == QCamera::ExposureAuto)
737 if (mode != QCamera::ExposureManual)
740 AVCaptureDevice *captureDevice = device();
741 return captureDevice && [captureDevice isExposureModeSupported:AVCaptureExposureModeCustom];
744void QAVFCameraBase::applyFlashSettings()
746 AVCaptureDevice *captureDevice = device();
747 if (!captureDevice) {
748 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"no capture device found";
752 const AVFConfigurationLock lock(captureDevice);
754 if (captureDevice.hasFlash) {
755 const auto mode = flashMode();
757 auto setAvFlashModeSafe = [&captureDevice](AVCaptureFlashMode avFlashMode) {
760 if ([captureDevice isFlashModeSupported:avFlashMode])
761 captureDevice.flashMode = avFlashMode;
763 qCDebug(qLcCamera) <<
"Attempt to setup unsupported flash mode " << avFlashMode;
766 if (mode == QCamera::FlashOff) {
767 setAvFlashModeSafe(AVCaptureFlashModeOff);
769 if ([captureDevice isFlashAvailable]) {
770 if (mode == QCamera::FlashOn)
771 setAvFlashModeSafe(AVCaptureFlashModeOn);
772 else if (mode == QCamera::FlashAuto)
773 setAvFlashModeSafe(AVCaptureFlashModeAuto);
775 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"flash is not available at the moment";
780 if (captureDevice.hasTorch) {
781 const auto mode = torchMode();
783 auto setAvTorchModeSafe = [&captureDevice](AVCaptureTorchMode avTorchMode) {
784 if ([captureDevice isTorchModeSupported:avTorchMode])
785 captureDevice.torchMode = avTorchMode;
787 qCDebug(qLcCamera) <<
"Attempt to setup unsupported torch mode " << avTorchMode;
790 if (mode == QCamera::TorchOff) {
791 setAvTorchModeSafe(AVCaptureTorchModeOff);
793 if ([captureDevice isTorchAvailable]) {
794 if (mode == QCamera::TorchOn)
795 setAvTorchModeSafe(AVCaptureTorchModeOn);
796 else if (mode == QCamera::TorchAuto)
797 setAvTorchModeSafe(AVCaptureTorchModeAuto);
799 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"torch is not available at the moment";
806void QAVFCameraBase::setExposureCompensation(
float bias)
809 AVCaptureDevice *captureDevice = device();
810 if (!captureDevice) {
811 exposureCompensationChanged(bias);
815 bias = qBound(captureDevice.minExposureTargetBias, bias, captureDevice.maxExposureTargetBias);
817 const AVFConfigurationLock lock(captureDevice);
819 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
823 [captureDevice setExposureTargetBias:bias completionHandler:nil];
824 exposureCompensationChanged(bias);
830void QAVFCameraBase::setManualExposureTime(
float value)
834 setExposureMode(QCamera::ExposureAuto);
838 AVCaptureDevice *captureDevice = device();
839 if (!captureDevice) {
840 exposureTimeChanged(value);
844 const CMTime newDuration = CMTimeMakeWithSeconds(value, captureDevice.exposureDuration.timescale);
845 if (!qt_check_exposure_duration(captureDevice, newDuration)) {
846 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"shutter speed value is out of range";
850 const AVFConfigurationLock lock(captureDevice);
852 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
859 [captureDevice setExposureModeCustomWithDuration:newDuration
860 ISO:AVCaptureISOCurrent
861 completionHandler:nil];
863 exposureTimeChanged(value);
870float QAVFCameraBase::exposureTime()
const
873 AVCaptureDevice *captureDevice = device();
876 auto duration = captureDevice.exposureDuration;
877 return CMTimeGetSeconds(duration);
886void avf_convert_white_balance_mode(QCamera::WhiteBalanceMode qtMode,
887 AVCaptureWhiteBalanceMode &avMode)
889 if (qtMode == QCamera::WhiteBalanceAuto)
890 avMode = AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance;
892 avMode = AVCaptureWhiteBalanceModeLocked;
895bool avf_set_white_balance_mode(AVCaptureDevice *captureDevice,
896 AVCaptureWhiteBalanceMode avMode)
898 Q_ASSERT(captureDevice);
900 const bool lock = [captureDevice lockForConfiguration:nil];
902 qDebug() <<
"Failed to lock a capture device for configuration\n";
906 captureDevice.whiteBalanceMode = avMode;
907 [captureDevice unlockForConfiguration];
911bool avf_convert_temp_and_tint_to_wb_gains(AVCaptureDevice *captureDevice,
912 float temp,
float tint, AVCaptureWhiteBalanceGains &wbGains)
914 Q_ASSERT(captureDevice);
916 AVCaptureWhiteBalanceTemperatureAndTintValues wbTTValues = {
920 wbGains = [captureDevice deviceWhiteBalanceGainsForTemperatureAndTintValues:wbTTValues];
922 if (wbGains.redGain >= 1.0 && wbGains.redGain <= captureDevice.maxWhiteBalanceGain
923 && wbGains.greenGain >= 1.0 && wbGains.greenGain <= captureDevice.maxWhiteBalanceGain
924 && wbGains.blueGain >= 1.0 && wbGains.blueGain <= captureDevice.maxWhiteBalanceGain)
930bool avf_set_white_balance_gains(AVCaptureDevice *captureDevice,
931 AVCaptureWhiteBalanceGains wbGains)
933 const bool lock = [captureDevice lockForConfiguration:nil];
935 qDebug() <<
"Failed to lock a capture device for configuration\n";
939 [captureDevice setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:wbGains
940 completionHandler:nil];
941 [captureDevice unlockForConfiguration];
947bool QAVFCameraBase::isWhiteBalanceModeSupported(QCamera::WhiteBalanceMode mode)
const
949 if (mode == QCamera::WhiteBalanceAuto)
951 AVCaptureDevice *captureDevice = device();
954 return [captureDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked];
957void QAVFCameraBase::setWhiteBalanceMode(QCamera::WhiteBalanceMode mode)
959 if (!isWhiteBalanceModeSupported(mode))
962 AVCaptureDevice *captureDevice = device();
963 Q_ASSERT(captureDevice);
965 const AVFConfigurationLock lock(captureDevice);
967 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
968 <<
"for configuration";
972 AVCaptureWhiteBalanceMode avMode;
973 avf_convert_white_balance_mode(mode, avMode);
974 avf_set_white_balance_mode(captureDevice, avMode);
976 if (mode == QCamera::WhiteBalanceAuto || mode == QCamera::WhiteBalanceManual) {
977 whiteBalanceModeChanged(mode);
981 const int colorTemp = colorTemperatureForWhiteBalance(mode);
982 AVCaptureWhiteBalanceGains wbGains;
983 if (avf_convert_temp_and_tint_to_wb_gains(captureDevice, colorTemp, 0., wbGains)
984 && avf_set_white_balance_gains(captureDevice, wbGains))
985 whiteBalanceModeChanged(mode);
988void QAVFCameraBase::setColorTemperature(
int colorTemp)
990 if (colorTemp == 0) {
991 colorTemperatureChanged(colorTemp);
995 AVCaptureDevice *captureDevice = device();
996 if (!captureDevice || ![captureDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked])
999 const AVFConfigurationLock lock(captureDevice);
1001 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
1002 <<
"for configuration";
1006 AVCaptureWhiteBalanceGains wbGains;
1007 if (avf_convert_temp_and_tint_to_wb_gains(captureDevice, colorTemp, 0., wbGains)
1008 && avf_set_white_balance_gains(captureDevice, wbGains))
1009 colorTemperatureChanged(colorTemp);
1013void QAVFCameraBase::setManualIsoSensitivity(
int value)
1017 setExposureMode(QCamera::ExposureAuto);
1021 AVCaptureDevice *captureDevice = device();
1022 if (!captureDevice) {
1023 isoSensitivityChanged(value);
1027 if (!qt_check_ISO_value(captureDevice, value)) {
1028 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"ISO value is out of range";
1032 const AVFConfigurationLock lock(captureDevice);
1034 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
1035 <<
"for configuration";
1041 [captureDevice setExposureModeCustomWithDuration:AVCaptureExposureDurationCurrent
1043 completionHandler:nil];
1045 isoSensitivityChanged(value);
1051int QAVFCameraBase::isoSensitivity()
const
1053 return manualIsoSensitivity();
1057bool QAVFCameraBase::checkCameraPermission()
1059 const QCameraPermission permission;
1060 const bool granted = qApp->checkPermission(permission) == Qt::PermissionStatus::Granted;
1062 qWarning() <<
"Access to camera not granted";
1068#include "moc_qavfcamerabase_p.cpp"