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())
132 onActiveChanged(active);
134 emit activeChanged(m_active);
137void QAVFCameraBase::setCamera(
const QCameraDevice &camera)
139 if (m_cameraDevice == camera)
153 QCameraFormat newFormat = findBestCameraFormat(camera);
154 Q_ASSERT(!newFormat.isNull());
159 onCameraDeviceChanged(camera, newFormat);
161 m_cameraDevice = camera;
162 m_cameraFormat = newFormat;
164 updateSupportedFeatures(camera);
165 updateCameraConfiguration(camera);
168bool QAVFCameraBase::setCameraFormat(
const QCameraFormat &newFormat)
170 if (!newFormat.isNull() && !m_cameraDevice.videoFormats().contains(newFormat))
173 const QCameraFormat resolvedFormat = newFormat.isNull() ? findBestCameraFormat(m_cameraDevice) : newFormat;
176 if (resolvedFormat.isNull())
179 const bool applySuccess = tryApplyCameraFormat(resolvedFormat);
183 m_cameraFormat = resolvedFormat;
188AVCaptureDevice *QAVFCameraBase::device()
const
190 return tryGetAvCaptureDevice(m_cameraDevice);
193AVCaptureDevice *QAVFCameraBase::tryGetAvCaptureDevice(
const QCameraDevice &device)
195 QByteArray deviceId = device.id();
196 if (deviceId.isEmpty())
199 QMacAutoReleasePool autoReleasePool;
201 NSString *nsString = [NSString stringWithUTF8String:deviceId.constData()];
202 if (nsString ==
nullptr)
204 return [AVCaptureDevice deviceWithUniqueID:nsString];
212bool qt_focus_mode_supported(QCamera::FocusMode mode)
214 return mode == QCamera::FocusModeAuto;
219void QAVFCameraBase::setFocusMode(QCamera::FocusMode mode)
221 if (mode == focusMode())
223 forceSetFocusMode(mode);
227void QAVFCameraBase::forceSetFocusMode(QCamera::FocusMode mode)
229 if (!isFocusModeSupported(mode)) {
232 << u"attempted to set focus-mode '%1' on camera where it is unsupported."_s.arg(
233 QMetaEnum::fromType<QCamera::FocusMode>().valueToKey(mode));
237 AVCaptureDevice *captureDevice = device();
238 if (!captureDevice) {
239 if (qt_focus_mode_supported(mode)) {
240 focusModeChanged(mode);
242 qCDebug(qLcCamera) << Q_FUNC_INFO
243 <<
"focus mode not supported";
248 if (mode == QCamera::FocusModeManual) {
254 applyFocusDistanceToAVCaptureDevice(focusDistance());
257 const AVFConfigurationLock lock(captureDevice);
259 qCDebug(qLcCamera) <<
261 "failed to lock for configuration";
267 captureDevice.focusMode = AVCaptureFocusModeContinuousAutoFocus;
270 focusModeChanged(mode);
273bool QAVFCameraBase::isFocusModeSupported(QCamera::FocusMode mode)
const
275 AVCaptureDevice *captureDevice = device();
278 case QCamera::FocusModeAuto:
279 return [captureDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus];
281 case QCamera::FocusModeManual:
282 return captureDevice.lockingFocusWithCustomLensPositionSupported;
284 case QCamera::FocusModeAutoNear:
286 case QCamera::FocusModeAutoFar:
288 return captureDevice.autoFocusRangeRestrictionSupported
289 && [captureDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus];
297 return mode == QCamera::FocusModeAuto;
300void QAVFCameraBase::setCustomFocusPoint(
const QPointF &point)
302 if (customFocusPoint() == point)
305 if (!QRectF(0.f, 0.f, 1.f, 1.f).contains(point)) {
307 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"invalid focus point (out of range)";
311 AVCaptureDevice *captureDevice = device();
315 if ([captureDevice isFocusPointOfInterestSupported]) {
316 const AVFConfigurationLock lock(captureDevice);
318 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
322 const CGPoint focusPOI = CGPointMake(point.x(), point.y());
323 [captureDevice setFocusPointOfInterest:focusPOI];
324 if (focusMode() != QCamera::FocusModeAuto)
325 [captureDevice setFocusMode:AVCaptureFocusModeAutoFocus];
327 customFocusPointChanged(point);
331void QAVFCameraBase::applyFocusDistanceToAVCaptureDevice(
float distance)
334 AVCaptureDevice *captureDevice = device();
342 if (!captureDevice.lockingFocusWithCustomLensPositionSupported) {
343 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to apply focusDistance to AVCaptureDevice.";
348 AVFConfigurationLock lock(captureDevice);
350 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock camera for configuration";
353 [captureDevice setFocusModeLockedWithLensPosition:distance completionHandler:nil];
360void QAVFCameraBase::setFocusDistance(
float distance)
362 if (QtPrivate::fuzzyCompare(focusDistance(), distance))
365 if (!(supportedFeatures() & QCamera::Feature::FocusDistance)) {
366 qCWarning(qLcCamera) <<
368 "attmpted to set focus-distance on camera without support for FocusDistance feature";
372 if (distance < 0 || distance > 1) {
373 qCWarning(qLcCamera) <<
375 "attempted to set camera focus-distance with out-of-bounds value";
381 if (focusMode() == QCamera::FocusModeManual) {
382 applyFocusDistanceToAVCaptureDevice(distance);
385 focusDistanceChanged(distance);
388void QAVFCameraBase::updateCameraConfiguration(
const QCameraDevice &cameraDevice)
393 AVCaptureDevice *captureDevice = tryGetAvCaptureDevice(cameraDevice);
396 if (!captureDevice) {
397 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"capture device is nil when trying to update QAVFCamera";
402 AVCaptureDeviceFormat *activeFormat = captureDevice.activeFormat;
404 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"capture device has no active format when trying to update QAVFCamera";
411 isFlashSupported = isFlashAutoSupported =
false;
412 isTorchSupported = isTorchAutoSupported =
false;
413 if (captureDevice.hasFlash) {
414 if ([captureDevice isFlashModeSupported:AVCaptureFlashModeOn])
415 isFlashSupported =
true;
416 if ([captureDevice isFlashModeSupported:AVCaptureFlashModeAuto])
417 isFlashAutoSupported =
true;
419 if (captureDevice.hasTorch) {
420 if ([captureDevice isTorchModeSupported:AVCaptureTorchModeOn])
421 isTorchSupported =
true;
422 if ([captureDevice isTorchModeSupported:AVCaptureTorchModeAuto])
423 isTorchAutoSupported =
true;
426 flashReadyChanged(isFlashSupported);
428 minimumZoomFactorChanged(captureDevice.minAvailableVideoZoomFactor);
429 maximumZoomFactorChanged(activeFormat.videoMaxZoomFactor);
435 if (minZoomFactor() < maxZoomFactor()) {
440 forceZoomTo(qBound(zoomFactor(), minZoomFactor(), maxZoomFactor()), -1);
442 applyFlashSettings();
446 if (isFocusModeSupported(focusMode()))
447 forceSetFocusMode(focusMode());
452 if (minZoomFactor() >= maxZoomFactor())
453 zoomFactorChanged(defaultZoomFactor());
455 if (!(supportedFeatures() & QCamera::Feature::FocusDistance))
456 focusDistanceChanged(defaultFocusDistance());
458 if (!isFocusModeSupported(focusMode()))
459 focusModeChanged(defaultFocusMode());
465 const AVFConfigurationLock lock(captureDevice);
467 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
471 if ([captureDevice isFocusPointOfInterestSupported]) {
472 auto point = customFocusPoint();
473 const CGPoint focusPOI = CGPointMake(point.x(), point.y());
474 [captureDevice setFocusPointOfInterest:focusPOI];
478 CMTime newDuration = AVCaptureExposureDurationCurrent;
479 bool setCustomMode =
false;
481 float exposureTime = manualExposureTime();
483 && !qt_exposure_duration_equal(captureDevice, exposureTime)) {
484 newDuration = CMTimeMakeWithSeconds(exposureTime, captureDevice.exposureDuration.timescale);
485 if (!qt_check_exposure_duration(captureDevice, newDuration)) {
486 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"requested exposure duration is out of range";
489 setCustomMode =
true;
492 float newISO = AVCaptureISOCurrent;
493 int iso = manualIsoSensitivity();
494 if (iso > 0 && !qt_iso_equal(captureDevice, iso)) {
496 if (!qt_check_ISO_value(captureDevice, newISO)) {
497 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"requested ISO value is out of range";
500 setCustomMode =
true;
503 float bias = exposureCompensation();
504 if (bias != 0 && !qt_exposure_bias_equal(captureDevice, bias)) {
506 if (bias < captureDevice.minExposureTargetBias || bias > captureDevice.maxExposureTargetBias) {
507 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"exposure compensation value is"
511 [captureDevice setExposureTargetBias:bias completionHandler:nil];
519 [captureDevice setExposureModeCustomWithDuration:newDuration
521 completionHandler:nil];
525 QCamera::ExposureMode qtMode = exposureMode();
526 AVCaptureExposureMode avMode = AVCaptureExposureModeContinuousAutoExposure;
527 if (!qt_convert_exposure_mode(captureDevice, qtMode, avMode)) {
528 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"requested exposure mode is not supported";
532 captureDevice.exposureMode = avMode;
536void QAVFCameraBase::updateSupportedFeatures(
const QCameraDevice &cameraDevice)
538 QCamera::Features features;
539 AVCaptureDevice *captureDevice = tryGetAvCaptureDevice(cameraDevice);
542 if ([captureDevice isFocusPointOfInterestSupported])
543 features |= QCamera::Feature::CustomFocusPoint;
546 AVCaptureDeviceFormat *activeFormat = captureDevice.activeFormat;
549 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom] &&
550 activeFormat.minISO < activeFormat.maxISO)
551 features |= QCamera::Feature::IsoSensitivity;
554 if (captureDevice.lockingWhiteBalanceWithCustomDeviceGainsSupported)
555 features |= QCamera::Feature::ColorTemperature;
558 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom] &&
559 captureDevice.minExposureTargetBias < captureDevice.maxExposureTargetBias)
560 features |= QCamera::Feature::ExposureCompensation;
563 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom] &&
564 CMTimeCompare(activeFormat.minExposureDuration, activeFormat.maxExposureDuration) == -1)
565 features |= QCamera::Feature::ManualExposureTime;
569 if (isFocusModeSupported(QCamera::FocusModeManual) &&
570 [captureDevice isLockingFocusWithCustomLensPositionSupported])
571 features |= QCamera::Feature::FocusDistance;
575 supportedFeaturesChanged(features);
578void QAVFCameraBase::zoomTo(
float factor,
float rate)
580 if (zoomFactor() == factor)
582 forceZoomTo(factor, rate);
588void QAVFCameraBase::forceZoomTo(
float factor,
float rate)
591 AVCaptureDevice *captureDevice = device();
592 if (!captureDevice || !captureDevice.activeFormat)
595 factor = qBound(captureDevice.minAvailableVideoZoomFactor, factor,
596 captureDevice.activeFormat.videoMaxZoomFactor);
599 const AVFConfigurationLock lock(captureDevice);
601 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
606 captureDevice.videoZoomFactor = factor;
608 [captureDevice rampToVideoZoomFactor:factor withRate:rate];
610 zoomFactorChanged(factor);
617void QAVFCameraBase::setFlashMode(QCamera::FlashMode mode)
619 if (flashMode() == mode)
622 if (!isFlashModeSupported(mode)) {
623 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"unsupported mode" << mode;
627 flashModeChanged(mode);
632 applyFlashSettings();
635bool QAVFCameraBase::isFlashModeSupported(QCamera::FlashMode mode)
const
637 if (mode == QCamera::FlashOff)
639 else if (mode == QCamera::FlashOn)
640 return isFlashSupported;
642 return isFlashAutoSupported;
645bool QAVFCameraBase::isFlashReady()
const
650 AVCaptureDevice *captureDevice = device();
654 if (!captureDevice.hasFlash)
657 if (!isFlashModeSupported(flashMode()))
663 return [captureDevice isFlashAvailable];
666void QAVFCameraBase::setTorchMode(QCamera::TorchMode mode)
668 if (torchMode() == mode)
671 if (isActive() && !isTorchModeSupported(mode)) {
672 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"unsupported torch mode" << mode;
676 torchModeChanged(mode);
681 applyFlashSettings();
684bool QAVFCameraBase::isTorchModeSupported(QCamera::TorchMode mode)
const
686 if (mode == QCamera::TorchOff)
688 else if (mode == QCamera::TorchOn)
689 return isTorchSupported;
691 return isTorchAutoSupported;
694void QAVFCameraBase::setExposureMode(QCamera::ExposureMode qtMode)
697 if (qtMode != QCamera::ExposureAuto && qtMode != QCamera::ExposureManual) {
698 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"exposure mode not supported";
702 AVCaptureDevice *captureDevice = device();
703 if (!captureDevice) {
704 exposureModeChanged(qtMode);
708 AVCaptureExposureMode avMode = AVCaptureExposureModeContinuousAutoExposure;
709 if (!qt_convert_exposure_mode(captureDevice, qtMode, avMode)) {
710 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"exposure mode not supported";
714 const AVFConfigurationLock lock(captureDevice);
716 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
717 <<
"for configuration";
721 [captureDevice setExposureMode:avMode];
722 exposureModeChanged(qtMode);
728bool QAVFCameraBase::isExposureModeSupported(QCamera::ExposureMode mode)
const
730 if (mode == QCamera::ExposureAuto)
732 if (mode != QCamera::ExposureManual)
735 AVCaptureDevice *captureDevice = device();
736 return captureDevice && [captureDevice isExposureModeSupported:AVCaptureExposureModeCustom];
739void QAVFCameraBase::applyFlashSettings()
741 AVCaptureDevice *captureDevice = device();
742 if (!captureDevice) {
743 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"no capture device found";
747 const AVFConfigurationLock lock(captureDevice);
749 if (captureDevice.hasFlash) {
750 const auto mode = flashMode();
752 auto setAvFlashModeSafe = [&captureDevice](AVCaptureFlashMode avFlashMode) {
755 if ([captureDevice isFlashModeSupported:avFlashMode])
756 captureDevice.flashMode = avFlashMode;
758 qCDebug(qLcCamera) <<
"Attempt to setup unsupported flash mode " << avFlashMode;
761 if (mode == QCamera::FlashOff) {
762 setAvFlashModeSafe(AVCaptureFlashModeOff);
764 if ([captureDevice isFlashAvailable]) {
765 if (mode == QCamera::FlashOn)
766 setAvFlashModeSafe(AVCaptureFlashModeOn);
767 else if (mode == QCamera::FlashAuto)
768 setAvFlashModeSafe(AVCaptureFlashModeAuto);
770 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"flash is not available at the moment";
775 if (captureDevice.hasTorch) {
776 const auto mode = torchMode();
778 auto setAvTorchModeSafe = [&captureDevice](AVCaptureTorchMode avTorchMode) {
779 if ([captureDevice isTorchModeSupported:avTorchMode])
780 captureDevice.torchMode = avTorchMode;
782 qCDebug(qLcCamera) <<
"Attempt to setup unsupported torch mode " << avTorchMode;
785 if (mode == QCamera::TorchOff) {
786 setAvTorchModeSafe(AVCaptureTorchModeOff);
788 if ([captureDevice isTorchAvailable]) {
789 if (mode == QCamera::TorchOn)
790 setAvTorchModeSafe(AVCaptureTorchModeOn);
791 else if (mode == QCamera::TorchAuto)
792 setAvTorchModeSafe(AVCaptureTorchModeAuto);
794 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"torch is not available at the moment";
801void QAVFCameraBase::setExposureCompensation(
float bias)
804 AVCaptureDevice *captureDevice = device();
805 if (!captureDevice) {
806 exposureCompensationChanged(bias);
810 bias = qBound(captureDevice.minExposureTargetBias, bias, captureDevice.maxExposureTargetBias);
812 const AVFConfigurationLock lock(captureDevice);
814 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
818 [captureDevice setExposureTargetBias:bias completionHandler:nil];
819 exposureCompensationChanged(bias);
825void QAVFCameraBase::setManualExposureTime(
float value)
829 setExposureMode(QCamera::ExposureAuto);
833 AVCaptureDevice *captureDevice = device();
834 if (!captureDevice) {
835 exposureTimeChanged(value);
839 const CMTime newDuration = CMTimeMakeWithSeconds(value, captureDevice.exposureDuration.timescale);
840 if (!qt_check_exposure_duration(captureDevice, newDuration)) {
841 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"shutter speed value is out of range";
845 const AVFConfigurationLock lock(captureDevice);
847 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
854 [captureDevice setExposureModeCustomWithDuration:newDuration
855 ISO:AVCaptureISOCurrent
856 completionHandler:nil];
858 exposureTimeChanged(value);
865float QAVFCameraBase::exposureTime()
const
868 AVCaptureDevice *captureDevice = device();
871 auto duration = captureDevice.exposureDuration;
872 return CMTimeGetSeconds(duration);
881void avf_convert_white_balance_mode(QCamera::WhiteBalanceMode qtMode,
882 AVCaptureWhiteBalanceMode &avMode)
884 if (qtMode == QCamera::WhiteBalanceAuto)
885 avMode = AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance;
887 avMode = AVCaptureWhiteBalanceModeLocked;
890bool avf_set_white_balance_mode(AVCaptureDevice *captureDevice,
891 AVCaptureWhiteBalanceMode avMode)
893 Q_ASSERT(captureDevice);
895 const bool lock = [captureDevice lockForConfiguration:nil];
897 qDebug() <<
"Failed to lock a capture device for configuration\n";
901 captureDevice.whiteBalanceMode = avMode;
902 [captureDevice unlockForConfiguration];
906bool avf_convert_temp_and_tint_to_wb_gains(AVCaptureDevice *captureDevice,
907 float temp,
float tint, AVCaptureWhiteBalanceGains &wbGains)
909 Q_ASSERT(captureDevice);
911 AVCaptureWhiteBalanceTemperatureAndTintValues wbTTValues = {
915 wbGains = [captureDevice deviceWhiteBalanceGainsForTemperatureAndTintValues:wbTTValues];
917 if (wbGains.redGain >= 1.0 && wbGains.redGain <= captureDevice.maxWhiteBalanceGain
918 && wbGains.greenGain >= 1.0 && wbGains.greenGain <= captureDevice.maxWhiteBalanceGain
919 && wbGains.blueGain >= 1.0 && wbGains.blueGain <= captureDevice.maxWhiteBalanceGain)
925bool avf_set_white_balance_gains(AVCaptureDevice *captureDevice,
926 AVCaptureWhiteBalanceGains wbGains)
928 const bool lock = [captureDevice lockForConfiguration:nil];
930 qDebug() <<
"Failed to lock a capture device for configuration\n";
934 [captureDevice setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:wbGains
935 completionHandler:nil];
936 [captureDevice unlockForConfiguration];
942bool QAVFCameraBase::isWhiteBalanceModeSupported(QCamera::WhiteBalanceMode mode)
const
944 if (mode == QCamera::WhiteBalanceAuto)
946 AVCaptureDevice *captureDevice = device();
949 return [captureDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked];
952void QAVFCameraBase::setWhiteBalanceMode(QCamera::WhiteBalanceMode mode)
954 if (!isWhiteBalanceModeSupported(mode))
957 AVCaptureDevice *captureDevice = device();
958 Q_ASSERT(captureDevice);
960 const AVFConfigurationLock lock(captureDevice);
962 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
963 <<
"for configuration";
967 AVCaptureWhiteBalanceMode avMode;
968 avf_convert_white_balance_mode(mode, avMode);
969 avf_set_white_balance_mode(captureDevice, avMode);
971 if (mode == QCamera::WhiteBalanceAuto || mode == QCamera::WhiteBalanceManual) {
972 whiteBalanceModeChanged(mode);
976 const int colorTemp = colorTemperatureForWhiteBalance(mode);
977 AVCaptureWhiteBalanceGains wbGains;
978 if (avf_convert_temp_and_tint_to_wb_gains(captureDevice, colorTemp, 0., wbGains)
979 && avf_set_white_balance_gains(captureDevice, wbGains))
980 whiteBalanceModeChanged(mode);
983void QAVFCameraBase::setColorTemperature(
int colorTemp)
985 if (colorTemp == 0) {
986 colorTemperatureChanged(colorTemp);
990 AVCaptureDevice *captureDevice = device();
991 if (!captureDevice || ![captureDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked])
994 const AVFConfigurationLock lock(captureDevice);
996 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
997 <<
"for configuration";
1001 AVCaptureWhiteBalanceGains wbGains;
1002 if (avf_convert_temp_and_tint_to_wb_gains(captureDevice, colorTemp, 0., wbGains)
1003 && avf_set_white_balance_gains(captureDevice, wbGains))
1004 colorTemperatureChanged(colorTemp);
1008void QAVFCameraBase::setManualIsoSensitivity(
int value)
1012 setExposureMode(QCamera::ExposureAuto);
1016 AVCaptureDevice *captureDevice = device();
1017 if (!captureDevice) {
1018 isoSensitivityChanged(value);
1022 if (!qt_check_ISO_value(captureDevice, value)) {
1023 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"ISO value is out of range";
1027 const AVFConfigurationLock lock(captureDevice);
1029 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
1030 <<
"for configuration";
1036 [captureDevice setExposureModeCustomWithDuration:AVCaptureExposureDurationCurrent
1038 completionHandler:nil];
1040 isoSensitivityChanged(value);
1046int QAVFCameraBase::isoSensitivity()
const
1048 return manualIsoSensitivity();
1052bool QAVFCameraBase::checkCameraPermission()
1054 const QCameraPermission permission;
1055 const bool granted = qApp->checkPermission(permission) == Qt::PermissionStatus::Granted;
1057 qWarning() <<
"Access to camera not granted";
1063#include "moc_qavfcamerabase_p.cpp"