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)
151 QCameraFormat newFormat = findBestCameraFormat(camera);
152 Q_ASSERT(!newFormat.isNull());
157 onCameraDeviceChanged(camera, newFormat);
159 m_cameraDevice = camera;
160 m_cameraFormat = newFormat;
162 updateSupportedFeatures(camera);
163 updateCameraConfiguration(camera);
166bool QAVFCameraBase::setCameraFormat(
const QCameraFormat &newFormat)
168 if (!newFormat.isNull() && !m_cameraDevice.videoFormats().contains(newFormat))
171 const QCameraFormat resolvedFormat = newFormat.isNull() ? findBestCameraFormat(m_cameraDevice) : newFormat;
174 if (resolvedFormat.isNull())
177 const bool applySuccess = tryApplyCameraFormat(resolvedFormat);
181 m_cameraFormat = resolvedFormat;
186AVCaptureDevice *QAVFCameraBase::device()
const
188 return tryGetAvCaptureDevice(m_cameraDevice);
191AVCaptureDevice *QAVFCameraBase::tryGetAvCaptureDevice(
const QCameraDevice &device)
193 QByteArray deviceId = device.id();
194 if (deviceId.isEmpty())
197 QMacAutoReleasePool autoReleasePool;
199 NSString *nsString = [NSString stringWithUTF8String:deviceId.constData()];
200 if (nsString ==
nullptr)
202 return [AVCaptureDevice deviceWithUniqueID:nsString];
210bool qt_focus_mode_supported(QCamera::FocusMode mode)
212 return mode == QCamera::FocusModeAuto;
217void QAVFCameraBase::setFocusMode(QCamera::FocusMode mode)
219 if (mode == focusMode())
221 forceSetFocusMode(mode);
225void QAVFCameraBase::forceSetFocusMode(QCamera::FocusMode mode)
227 if (!isFocusModeSupported(mode)) {
230 << QString(u"attempted to set focus-mode '%1' on camera where it is unsupported.")
231 .arg(QMetaEnum::fromType<QCamera::FocusMode>().valueToKey(mode));
235 AVCaptureDevice *captureDevice = device();
236 if (!captureDevice) {
237 if (qt_focus_mode_supported(mode)) {
238 focusModeChanged(mode);
240 qCDebug(qLcCamera) << Q_FUNC_INFO
241 <<
"focus mode not supported";
246 if (mode == QCamera::FocusModeManual) {
252 applyFocusDistanceToAVCaptureDevice(focusDistance());
255 const AVFConfigurationLock lock(captureDevice);
257 qCDebug(qLcCamera) <<
259 "failed to lock for configuration";
265 captureDevice.focusMode = AVCaptureFocusModeContinuousAutoFocus;
268 focusModeChanged(mode);
271bool QAVFCameraBase::isFocusModeSupported(QCamera::FocusMode mode)
const
273 AVCaptureDevice *captureDevice = device();
276 case QCamera::FocusModeAuto:
277 return [captureDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus];
279 case QCamera::FocusModeManual:
280 return captureDevice.lockingFocusWithCustomLensPositionSupported;
282 case QCamera::FocusModeAutoNear:
284 case QCamera::FocusModeAutoFar:
286 return captureDevice.autoFocusRangeRestrictionSupported
287 && [captureDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus];
295 return mode == QCamera::FocusModeAuto;
298void QAVFCameraBase::setCustomFocusPoint(
const QPointF &point)
300 if (customFocusPoint() == point)
303 if (!QRectF(0.f, 0.f, 1.f, 1.f).contains(point)) {
305 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"invalid focus point (out of range)";
309 AVCaptureDevice *captureDevice = device();
313 if ([captureDevice isFocusPointOfInterestSupported]) {
314 const AVFConfigurationLock lock(captureDevice);
316 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
320 const CGPoint focusPOI = CGPointMake(point.x(), point.y());
321 [captureDevice setFocusPointOfInterest:focusPOI];
322 if (focusMode() != QCamera::FocusModeAuto)
323 [captureDevice setFocusMode:AVCaptureFocusModeAutoFocus];
325 customFocusPointChanged(point);
329void QAVFCameraBase::applyFocusDistanceToAVCaptureDevice(
float distance)
332 AVCaptureDevice *captureDevice = device();
340 if (!captureDevice.lockingFocusWithCustomLensPositionSupported) {
341 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to apply focusDistance to AVCaptureDevice.";
346 AVFConfigurationLock lock(captureDevice);
348 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock camera for configuration";
351 [captureDevice setFocusModeLockedWithLensPosition:distance completionHandler:nil];
358void QAVFCameraBase::setFocusDistance(
float distance)
360 if (qFuzzyCompare(focusDistance(), distance))
363 if (!(supportedFeatures() & QCamera::Feature::FocusDistance)) {
364 qCWarning(qLcCamera) <<
366 "attmpted to set focus-distance on camera without support for FocusDistance feature";
370 if (distance < 0 || distance > 1) {
371 qCWarning(qLcCamera) <<
373 "attempted to set camera focus-distance with out-of-bounds value";
379 if (focusMode() == QCamera::FocusModeManual) {
380 applyFocusDistanceToAVCaptureDevice(distance);
383 focusDistanceChanged(distance);
386void QAVFCameraBase::updateCameraConfiguration(
const QCameraDevice &cameraDevice)
391 AVCaptureDevice *captureDevice = tryGetAvCaptureDevice(cameraDevice);
394 if (!captureDevice) {
395 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"capture device is nil when trying to update QAVFCamera";
400 AVCaptureDeviceFormat *activeFormat = captureDevice.activeFormat;
402 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"capture device has no active format when trying to update QAVFCamera";
409 isFlashSupported = isFlashAutoSupported =
false;
410 isTorchSupported = isTorchAutoSupported =
false;
411 if (captureDevice.hasFlash) {
412 if ([captureDevice isFlashModeSupported:AVCaptureFlashModeOn])
413 isFlashSupported =
true;
414 if ([captureDevice isFlashModeSupported:AVCaptureFlashModeAuto])
415 isFlashAutoSupported =
true;
417 if (captureDevice.hasTorch) {
418 if ([captureDevice isTorchModeSupported:AVCaptureTorchModeOn])
419 isTorchSupported =
true;
420 if ([captureDevice isTorchModeSupported:AVCaptureTorchModeAuto])
421 isTorchAutoSupported =
true;
424 flashReadyChanged(isFlashSupported);
426 minimumZoomFactorChanged(captureDevice.minAvailableVideoZoomFactor);
427 maximumZoomFactorChanged(activeFormat.videoMaxZoomFactor);
433 if (minZoomFactor() < maxZoomFactor()) {
438 forceZoomTo(qBound(zoomFactor(), minZoomFactor(), maxZoomFactor()), -1);
440 applyFlashSettings();
444 if (isFocusModeSupported(focusMode()))
445 forceSetFocusMode(focusMode());
450 if (minZoomFactor() >= maxZoomFactor())
451 zoomFactorChanged(defaultZoomFactor());
453 if (!(supportedFeatures() & QCamera::Feature::FocusDistance))
454 focusDistanceChanged(defaultFocusDistance());
456 if (!isFocusModeSupported(focusMode()))
457 focusModeChanged(defaultFocusMode());
463 const AVFConfigurationLock lock(captureDevice);
465 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
469 if ([captureDevice isFocusPointOfInterestSupported]) {
470 auto point = customFocusPoint();
471 const CGPoint focusPOI = CGPointMake(point.x(), point.y());
472 [captureDevice setFocusPointOfInterest:focusPOI];
476 CMTime newDuration = AVCaptureExposureDurationCurrent;
477 bool setCustomMode =
false;
479 float exposureTime = manualExposureTime();
481 && !qt_exposure_duration_equal(captureDevice, exposureTime)) {
482 newDuration = CMTimeMakeWithSeconds(exposureTime, captureDevice.exposureDuration.timescale);
483 if (!qt_check_exposure_duration(captureDevice, newDuration)) {
484 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"requested exposure duration is out of range";
487 setCustomMode =
true;
490 float newISO = AVCaptureISOCurrent;
491 int iso = manualIsoSensitivity();
492 if (iso > 0 && !qt_iso_equal(captureDevice, iso)) {
494 if (!qt_check_ISO_value(captureDevice, newISO)) {
495 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"requested ISO value is out of range";
498 setCustomMode =
true;
501 float bias = exposureCompensation();
502 if (bias != 0 && !qt_exposure_bias_equal(captureDevice, bias)) {
504 if (bias < captureDevice.minExposureTargetBias || bias > captureDevice.maxExposureTargetBias) {
505 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"exposure compensation value is"
509 [captureDevice setExposureTargetBias:bias completionHandler:nil];
517 [captureDevice setExposureModeCustomWithDuration:newDuration
519 completionHandler:nil];
523 QCamera::ExposureMode qtMode = exposureMode();
524 AVCaptureExposureMode avMode = AVCaptureExposureModeContinuousAutoExposure;
525 if (!qt_convert_exposure_mode(captureDevice, qtMode, avMode)) {
526 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"requested exposure mode is not supported";
530 captureDevice.exposureMode = avMode;
534void QAVFCameraBase::updateSupportedFeatures(
const QCameraDevice &cameraDevice)
536 QCamera::Features features;
537 AVCaptureDevice *captureDevice = tryGetAvCaptureDevice(cameraDevice);
540 if ([captureDevice isFocusPointOfInterestSupported])
541 features |= QCamera::Feature::CustomFocusPoint;
544 AVCaptureDeviceFormat *activeFormat = captureDevice.activeFormat;
547 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom] &&
548 activeFormat.minISO < activeFormat.maxISO)
549 features |= QCamera::Feature::IsoSensitivity;
552 if (captureDevice.lockingWhiteBalanceWithCustomDeviceGainsSupported)
553 features |= QCamera::Feature::ColorTemperature;
556 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom] &&
557 captureDevice.minExposureTargetBias < captureDevice.maxExposureTargetBias)
558 features |= QCamera::Feature::ExposureCompensation;
561 if ([captureDevice isExposureModeSupported:AVCaptureExposureModeCustom] &&
562 CMTimeCompare(activeFormat.minExposureDuration, activeFormat.maxExposureDuration) == -1)
563 features |= QCamera::Feature::ManualExposureTime;
567 if (isFocusModeSupported(QCamera::FocusModeManual) &&
568 [captureDevice isLockingFocusWithCustomLensPositionSupported])
569 features |= QCamera::Feature::FocusDistance;
573 supportedFeaturesChanged(features);
576void QAVFCameraBase::zoomTo(
float factor,
float rate)
578 if (zoomFactor() == factor)
580 forceZoomTo(factor, rate);
586void QAVFCameraBase::forceZoomTo(
float factor,
float rate)
589 AVCaptureDevice *captureDevice = device();
590 if (!captureDevice || !captureDevice.activeFormat)
593 factor = qBound(captureDevice.minAvailableVideoZoomFactor, factor,
594 captureDevice.activeFormat.videoMaxZoomFactor);
597 const AVFConfigurationLock lock(captureDevice);
599 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
604 captureDevice.videoZoomFactor = factor;
606 [captureDevice rampToVideoZoomFactor:factor withRate:rate];
608 zoomFactorChanged(factor);
615void QAVFCameraBase::setFlashMode(QCamera::FlashMode mode)
617 if (flashMode() == mode)
620 if (!isFlashModeSupported(mode)) {
621 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"unsupported mode" << mode;
625 flashModeChanged(mode);
630 applyFlashSettings();
633bool QAVFCameraBase::isFlashModeSupported(QCamera::FlashMode mode)
const
635 if (mode == QCamera::FlashOff)
637 else if (mode == QCamera::FlashOn)
638 return isFlashSupported;
640 return isFlashAutoSupported;
643bool QAVFCameraBase::isFlashReady()
const
648 AVCaptureDevice *captureDevice = device();
652 if (!captureDevice.hasFlash)
655 if (!isFlashModeSupported(flashMode()))
661 return [captureDevice isFlashAvailable];
664void QAVFCameraBase::setTorchMode(QCamera::TorchMode mode)
666 if (torchMode() == mode)
669 if (isActive() && !isTorchModeSupported(mode)) {
670 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"unsupported torch mode" << mode;
674 torchModeChanged(mode);
679 applyFlashSettings();
682bool QAVFCameraBase::isTorchModeSupported(QCamera::TorchMode mode)
const
684 if (mode == QCamera::TorchOff)
686 else if (mode == QCamera::TorchOn)
687 return isTorchSupported;
689 return isTorchAutoSupported;
692void QAVFCameraBase::setExposureMode(QCamera::ExposureMode qtMode)
695 if (qtMode != QCamera::ExposureAuto && qtMode != QCamera::ExposureManual) {
696 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"exposure mode not supported";
700 AVCaptureDevice *captureDevice = device();
701 if (!captureDevice) {
702 exposureModeChanged(qtMode);
706 AVCaptureExposureMode avMode = AVCaptureExposureModeContinuousAutoExposure;
707 if (!qt_convert_exposure_mode(captureDevice, qtMode, avMode)) {
708 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"exposure mode not supported";
712 const AVFConfigurationLock lock(captureDevice);
714 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
715 <<
"for configuration";
719 [captureDevice setExposureMode:avMode];
720 exposureModeChanged(qtMode);
726bool QAVFCameraBase::isExposureModeSupported(QCamera::ExposureMode mode)
const
728 if (mode == QCamera::ExposureAuto)
730 if (mode != QCamera::ExposureManual)
733 AVCaptureDevice *captureDevice = device();
734 return captureDevice && [captureDevice isExposureModeSupported:AVCaptureExposureModeCustom];
737void QAVFCameraBase::applyFlashSettings()
739 AVCaptureDevice *captureDevice = device();
740 if (!captureDevice) {
741 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"no capture device found";
745 const AVFConfigurationLock lock(captureDevice);
747 if (captureDevice.hasFlash) {
748 const auto mode = flashMode();
750 auto setAvFlashModeSafe = [&captureDevice](AVCaptureFlashMode avFlashMode) {
753 if ([captureDevice isFlashModeSupported:avFlashMode])
754 captureDevice.flashMode = avFlashMode;
756 qCDebug(qLcCamera) <<
"Attempt to setup unsupported flash mode " << avFlashMode;
759 if (mode == QCamera::FlashOff) {
760 setAvFlashModeSafe(AVCaptureFlashModeOff);
762 if ([captureDevice isFlashAvailable]) {
763 if (mode == QCamera::FlashOn)
764 setAvFlashModeSafe(AVCaptureFlashModeOn);
765 else if (mode == QCamera::FlashAuto)
766 setAvFlashModeSafe(AVCaptureFlashModeAuto);
768 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"flash is not available at the moment";
773 if (captureDevice.hasTorch) {
774 const auto mode = torchMode();
776 auto setAvTorchModeSafe = [&captureDevice](AVCaptureTorchMode avTorchMode) {
777 if ([captureDevice isTorchModeSupported:avTorchMode])
778 captureDevice.torchMode = avTorchMode;
780 qCDebug(qLcCamera) <<
"Attempt to setup unsupported torch mode " << avTorchMode;
783 if (mode == QCamera::TorchOff) {
784 setAvTorchModeSafe(AVCaptureTorchModeOff);
786 if ([captureDevice isTorchAvailable]) {
787 if (mode == QCamera::TorchOn)
788 setAvTorchModeSafe(AVCaptureTorchModeOn);
789 else if (mode == QCamera::TorchAuto)
790 setAvTorchModeSafe(AVCaptureTorchModeAuto);
792 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"torch is not available at the moment";
799void QAVFCameraBase::setExposureCompensation(
float bias)
802 AVCaptureDevice *captureDevice = device();
803 if (!captureDevice) {
804 exposureCompensationChanged(bias);
808 bias = qBound(captureDevice.minExposureTargetBias, bias, captureDevice.maxExposureTargetBias);
810 const AVFConfigurationLock lock(captureDevice);
812 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
816 [captureDevice setExposureTargetBias:bias completionHandler:nil];
817 exposureCompensationChanged(bias);
823void QAVFCameraBase::setManualExposureTime(
float value)
827 setExposureMode(QCamera::ExposureAuto);
831 AVCaptureDevice *captureDevice = device();
832 if (!captureDevice) {
833 exposureTimeChanged(value);
837 const CMTime newDuration = CMTimeMakeWithSeconds(value, captureDevice.exposureDuration.timescale);
838 if (!qt_check_exposure_duration(captureDevice, newDuration)) {
839 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"shutter speed value is out of range";
843 const AVFConfigurationLock lock(captureDevice);
845 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock for configuration";
852 [captureDevice setExposureModeCustomWithDuration:newDuration
853 ISO:AVCaptureISOCurrent
854 completionHandler:nil];
856 exposureTimeChanged(value);
863float QAVFCameraBase::exposureTime()
const
866 AVCaptureDevice *captureDevice = device();
869 auto duration = captureDevice.exposureDuration;
870 return CMTimeGetSeconds(duration);
879void avf_convert_white_balance_mode(QCamera::WhiteBalanceMode qtMode,
880 AVCaptureWhiteBalanceMode &avMode)
882 if (qtMode == QCamera::WhiteBalanceAuto)
883 avMode = AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance;
885 avMode = AVCaptureWhiteBalanceModeLocked;
888bool avf_set_white_balance_mode(AVCaptureDevice *captureDevice,
889 AVCaptureWhiteBalanceMode avMode)
891 Q_ASSERT(captureDevice);
893 const bool lock = [captureDevice lockForConfiguration:nil];
895 qDebug() <<
"Failed to lock a capture device for configuration\n";
899 captureDevice.whiteBalanceMode = avMode;
900 [captureDevice unlockForConfiguration];
904bool avf_convert_temp_and_tint_to_wb_gains(AVCaptureDevice *captureDevice,
905 float temp,
float tint, AVCaptureWhiteBalanceGains &wbGains)
907 Q_ASSERT(captureDevice);
909 AVCaptureWhiteBalanceTemperatureAndTintValues wbTTValues = {
913 wbGains = [captureDevice deviceWhiteBalanceGainsForTemperatureAndTintValues:wbTTValues];
915 if (wbGains.redGain >= 1.0 && wbGains.redGain <= captureDevice.maxWhiteBalanceGain
916 && wbGains.greenGain >= 1.0 && wbGains.greenGain <= captureDevice.maxWhiteBalanceGain
917 && wbGains.blueGain >= 1.0 && wbGains.blueGain <= captureDevice.maxWhiteBalanceGain)
923bool avf_set_white_balance_gains(AVCaptureDevice *captureDevice,
924 AVCaptureWhiteBalanceGains wbGains)
926 const bool lock = [captureDevice lockForConfiguration:nil];
928 qDebug() <<
"Failed to lock a capture device for configuration\n";
932 [captureDevice setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:wbGains
933 completionHandler:nil];
934 [captureDevice unlockForConfiguration];
940bool QAVFCameraBase::isWhiteBalanceModeSupported(QCamera::WhiteBalanceMode mode)
const
942 if (mode == QCamera::WhiteBalanceAuto)
944 AVCaptureDevice *captureDevice = device();
947 return [captureDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked];
950void QAVFCameraBase::setWhiteBalanceMode(QCamera::WhiteBalanceMode mode)
952 if (!isWhiteBalanceModeSupported(mode))
955 AVCaptureDevice *captureDevice = device();
956 Q_ASSERT(captureDevice);
958 const AVFConfigurationLock lock(captureDevice);
960 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
961 <<
"for configuration";
965 AVCaptureWhiteBalanceMode avMode;
966 avf_convert_white_balance_mode(mode, avMode);
967 avf_set_white_balance_mode(captureDevice, avMode);
969 if (mode == QCamera::WhiteBalanceAuto || mode == QCamera::WhiteBalanceManual) {
970 whiteBalanceModeChanged(mode);
974 const int colorTemp = colorTemperatureForWhiteBalance(mode);
975 AVCaptureWhiteBalanceGains wbGains;
976 if (avf_convert_temp_and_tint_to_wb_gains(captureDevice, colorTemp, 0., wbGains)
977 && avf_set_white_balance_gains(captureDevice, wbGains))
978 whiteBalanceModeChanged(mode);
981void QAVFCameraBase::setColorTemperature(
int colorTemp)
983 if (colorTemp == 0) {
984 colorTemperatureChanged(colorTemp);
988 AVCaptureDevice *captureDevice = device();
989 if (!captureDevice || ![captureDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked])
992 const AVFConfigurationLock lock(captureDevice);
994 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
995 <<
"for configuration";
999 AVCaptureWhiteBalanceGains wbGains;
1000 if (avf_convert_temp_and_tint_to_wb_gains(captureDevice, colorTemp, 0., wbGains)
1001 && avf_set_white_balance_gains(captureDevice, wbGains))
1002 colorTemperatureChanged(colorTemp);
1006void QAVFCameraBase::setManualIsoSensitivity(
int value)
1010 setExposureMode(QCamera::ExposureAuto);
1014 AVCaptureDevice *captureDevice = device();
1015 if (!captureDevice) {
1016 isoSensitivityChanged(value);
1020 if (!qt_check_ISO_value(captureDevice, value)) {
1021 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"ISO value is out of range";
1025 const AVFConfigurationLock lock(captureDevice);
1027 qCDebug(qLcCamera) << Q_FUNC_INFO <<
"failed to lock a capture device"
1028 <<
"for configuration";
1034 [captureDevice setExposureModeCustomWithDuration:AVCaptureExposureDurationCurrent
1036 completionHandler:nil];
1038 isoSensitivityChanged(value);
1044int QAVFCameraBase::isoSensitivity()
const
1046 return manualIsoSensitivity();
1050bool QAVFCameraBase::checkCameraPermission()
1052 const QCameraPermission permission;
1053 const bool granted = qApp->checkPermission(permission) == Qt::PermissionStatus::Granted;
1055 qWarning() <<
"Access to camera not granted";
1061#include "moc_qavfcamerabase_p.cpp"