diff options
Diffstat (limited to 'src/multimedia/platform/darwin/camera')
6 files changed, 137 insertions, 423 deletions
diff --git a/src/multimedia/platform/darwin/camera/avfcamera.mm b/src/multimedia/platform/darwin/camera/avfcamera.mm index 65688ba11..a2be7a3e5 100644 --- a/src/multimedia/platform/darwin/camera/avfcamera.mm +++ b/src/multimedia/platform/darwin/camera/avfcamera.mm @@ -43,7 +43,6 @@ #include "avfcameraservice_p.h" #include "avfcamerautility_p.h" #include "avfcamerarenderer_p.h" -#include "avfcameraimageprocessing_p.h" #include <qmediacapturesession.h> QT_USE_NAMESPACE @@ -162,13 +161,10 @@ AVFCamera::AVFCamera(QCamera *camera) , m_lastStatus(QCamera::InactiveStatus) { Q_ASSERT(camera); - - m_cameraImageProcessingControl = new AVFCameraImageProcessing(this); } AVFCamera::~AVFCamera() { - delete m_cameraImageProcessingControl; } bool AVFCamera::isActive() const @@ -267,11 +263,6 @@ AVCaptureDevice *AVFCamera::device() const return device; } -QPlatformCameraImageProcessing *AVFCamera::imageProcessingControl() -{ - return m_cameraImageProcessingControl; -} - #ifdef Q_OS_IOS namespace { @@ -827,6 +818,136 @@ float AVFCamera::shutterSpeed() const #endif } +#ifdef Q_OS_IOS +namespace { + +void avf_convert_white_balance_mode(QCamera::WhiteBalanceMode qtMode, + AVCaptureWhiteBalanceMode &avMode) +{ + if (qtMode == QCamera::WhiteBalanceAuto) + avMode = AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance; + else + avMode = AVCaptureWhiteBalanceModeLocked; +} + +bool avf_set_white_balance_mode(AVCaptureDevice *captureDevice, + AVCaptureWhiteBalanceMode avMode) +{ + Q_ASSERT(captureDevice); + + const bool lock = [captureDevice lockForConfiguration:nil]; + if (!lock) { + qDebug() << "Failed to lock a capture device for configuration\n"; + return false; + } + + captureDevice.whiteBalanceMode = avMode; + [captureDevice unlockForConfiguration]; + return true; +} + +bool avf_convert_temp_and_tint_to_wb_gains(AVCaptureDevice *captureDevice, + float temp, float tint, AVCaptureWhiteBalanceGains &wbGains) +{ + Q_ASSERT(captureDevice); + + AVCaptureWhiteBalanceTemperatureAndTintValues wbTTValues = { + .temperature = temp, + .tint = tint + }; + wbGains = [captureDevice deviceWhiteBalanceGainsForTemperatureAndTintValues:wbTTValues]; + + if (wbGains.redGain >= 1.0 && wbGains.redGain <= captureDevice.maxWhiteBalanceGain + && wbGains.greenGain >= 1.0 && wbGains.greenGain <= captureDevice.maxWhiteBalanceGain + && wbGains.blueGain >= 1.0 && wbGains.blueGain <= captureDevice.maxWhiteBalanceGain) + return true; + + return false; +} + +bool avf_set_white_balance_gains(AVCaptureDevice *captureDevice, + AVCaptureWhiteBalanceGains wbGains) +{ + const bool lock = [captureDevice lockForConfiguration:nil]; + if (!lock) { + qDebug() << "Failed to lock a capture device for configuration\n"; + return false; + } + + [captureDevice setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:wbGains + completionHandler:nil]; + [captureDevice unlockForConfiguration]; + return true; +} + +} + +bool AVFCamera::isWhiteBalanceModeSupported(QCamera::WhiteBalanceMode mode) const +{ + if (mode == QCamera::WhiteBalanceAuto) + return true; + AVCaptureDevice *captureDevice = m_camera->device(); + if (!device) + return false; + return [captureDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked]; +} + +void AVFCamera::setWhiteBalanceMode(QCamera::WhiteBalanceMode) +{ + if (!isWhiteBalanceModeSupported(mode)) + return false; + + AVCaptureDevice *captureDevice = m_camera->device(); + Q_ASSERT(captureDevice); + + const AVFConfigurationLock lock(captureDevice); + if (!lock) { + qDebugCamera() << Q_FUNC_INFO << "failed to lock a capture device" + << "for configuration"; + return; + } + + AVCaptureWhiteBalanceMode avMode; + avf_convert_white_balance_mode(mode, avMode); + avf_set_white_balance_mode(captureDevice, avMode); + + if (mode == QCamera::WhiteBalanceAuto || mode == QCamera::WhiteBalanceManual) { + whiteBalanceModeChanged(mode); + return; + } + + const int colorTemp = colorTemperatureForWhiteBalance(mode); + AVCaptureWhiteBalanceGains wbGains; + if (avf_convert_temp_and_tint_to_wb_gains(captureDevice, colorTemp, 0., wbGains) + && avf_set_white_balance_gains(captureDevice, wbGains)) + whiteBalanceModeChanged(mode); +} + +void AVFCamera::setColorTemperature(int colorTemp) +{ + if (colorTemp == 0) { + colorTemperatureChanged(colorTemp); + return; + } + + AVCaptureDevice *captureDevice = m_camera->device(); + if (!device || ![captureDevice isWhiteBalanceModeSupported:AVCaptureWhiteBalanceModeLocked]) + return false; + + const AVFConfigurationLock lock(captureDevice); + if (!lock) { + qDebugCamera() << Q_FUNC_INFO << "failed to lock a capture device" + << "for configuration"; + return; + } + + AVCaptureWhiteBalanceGains wbGains; + if (avf_convert_temp_and_tint_to_wb_gains(captureDevice, colorTemp, 0., wbGains) + && avf_set_white_balance_gains(captureDevice, wbGains)) + colorTemperatureChanged(colorTemp); +} +#endif + void AVFCamera::setManualIsoSensitivity(int value) { #ifdef Q_OS_IOS diff --git a/src/multimedia/platform/darwin/camera/avfcamera_p.h b/src/multimedia/platform/darwin/camera/avfcamera_p.h index 8d2feb658..75b52abb5 100644 --- a/src/multimedia/platform/darwin/camera/avfcamera_p.h +++ b/src/multimedia/platform/darwin/camera/avfcamera_p.h @@ -60,7 +60,6 @@ QT_BEGIN_NAMESPACE class AVFCameraSession; class AVFCameraService; class AVFCameraSession; -class AVFCameraImageProcessing; Q_FORWARD_DECLARE_OBJC_CLASS(AVCaptureDeviceFormat); Q_FORWARD_DECLARE_OBJC_CLASS(AVCaptureConnection); @@ -83,8 +82,6 @@ public: void setCaptureSession(QPlatformMediaCaptureSession *) override; - QPlatformCameraImageProcessing *imageProcessingControl() override; - void setFocusMode(QCamera::FocusMode mode) override; bool isFocusModeSupported(QCamera::FocusMode mode) const override; @@ -110,6 +107,13 @@ public: void setManualShutterSpeed(float value) override; virtual float shutterSpeed() const override; +#ifdef Q_OS_IOS + // not supported on macOS + bool isWhiteBalanceModeSupported(QCamera::WhiteBalanceMode mode) const override; + void setWhiteBalanceMode(QCamera::WhiteBalanceMode /*mode*/) override; + void setColorTemperature(int /*temperature*/) override; +#endif + AVCaptureConnection *videoConnection() const; AVCaptureDevice *device() const; @@ -124,8 +128,6 @@ private: AVFCameraService *m_service = nullptr; AVFCameraSession *m_session = nullptr; - AVFCameraImageProcessing *m_cameraImageProcessingControl; - QCameraInfo m_cameraInfo; bool m_active; diff --git a/src/multimedia/platform/darwin/camera/avfcameraimageprocessing.mm b/src/multimedia/platform/darwin/camera/avfcameraimageprocessing.mm deleted file mode 100644 index 4dc613c88..000000000 --- a/src/multimedia/platform/darwin/camera/avfcameraimageprocessing.mm +++ /dev/null @@ -1,309 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtMultimedia/private/qtmultimediaglobal_p.h> -#include <QtCore/qdebug.h> - -#include "avfcameraimageprocessing_p.h" -#include "avfcamera_p.h" - -#include <AVFoundation/AVFoundation.h> - -QT_BEGIN_NAMESPACE - -namespace { - -void avf_convert_white_balance_mode(QCamera::WhiteBalanceMode qtMode, - AVCaptureWhiteBalanceMode &avMode) -{ - if (qtMode == QCamera::WhiteBalanceAuto) - avMode = AVCaptureWhiteBalanceModeContinuousAutoWhiteBalance; - else - avMode = AVCaptureWhiteBalanceModeLocked; -} - -bool avf_set_white_balance_mode(AVCaptureDevice *captureDevice, - AVCaptureWhiteBalanceMode avMode) -{ - Q_ASSERT(captureDevice); - - const bool lock = [captureDevice lockForConfiguration:nil]; - if (!lock) { - qDebug() << "Failed to lock a capture device for configuration\n"; - return false; - } - - captureDevice.whiteBalanceMode = avMode; - [captureDevice unlockForConfiguration]; - return true; -} - -#ifdef Q_OS_IOS -bool avf_convert_temp_and_tint_to_wb_gains(AVCaptureDevice *captureDevice, - float temp, float tint, AVCaptureWhiteBalanceGains &wbGains) -{ - Q_ASSERT(captureDevice); - - AVCaptureWhiteBalanceTemperatureAndTintValues wbTTValues = { - .temperature = temp, - .tint = tint - }; - wbGains = [captureDevice deviceWhiteBalanceGainsForTemperatureAndTintValues:wbTTValues]; - - if (wbGains.redGain >= 1.0 && wbGains.redGain <= captureDevice.maxWhiteBalanceGain - && wbGains.greenGain >= 1.0 && wbGains.greenGain <= captureDevice.maxWhiteBalanceGain - && wbGains.blueGain >= 1.0 && wbGains.blueGain <= captureDevice.maxWhiteBalanceGain) - return true; - - return false; -} - -bool avf_set_white_balance_gains(AVCaptureDevice *captureDevice, - AVCaptureWhiteBalanceGains wbGains) -{ - const bool lock = [captureDevice lockForConfiguration:nil]; - if (!lock) { - qDebug() << "Failed to lock a capture device for configuration\n"; - return false; - } - - [captureDevice setWhiteBalanceModeLockedWithDeviceWhiteBalanceGains:wbGains - completionHandler:nil]; - [captureDevice unlockForConfiguration]; - return true; -} -#endif - -} - -AVFCameraImageProcessing::AVFCameraImageProcessing(AVFCamera *camera) - : QPlatformCameraImageProcessing(camera), - m_camera(camera), - m_whiteBalanceMode(QCamera::WhiteBalanceAuto) -{ - Q_ASSERT(m_camera); - - // AVFoundation's API allows adjusting white balance gains values(or temperature and tint) - // only for iOS -#ifdef Q_OS_IOS - m_mappedWhiteBalancePresets[QCamera::WhiteBalanceSunlight] - = qMakePair(5600.0, .0); - m_mappedWhiteBalancePresets[QCamera::WhiteBalanceCloudy] - = qMakePair(6000.0, .0); - m_mappedWhiteBalancePresets[QCamera::WhiteBalanceShade] - = qMakePair(7000.0, .0); - m_mappedWhiteBalancePresets[QCamera::WhiteBalanceTungsten] - = qMakePair(3200.0, .0); - m_mappedWhiteBalancePresets[QCamera::WhiteBalanceFluorescent] - = qMakePair(4000.0, .0); - m_mappedWhiteBalancePresets[QCamera::WhiteBalanceFlash] - = qMakePair(5500.0, .0); - m_mappedWhiteBalancePresets[QCamera::WhiteBalanceSunset] - = qMakePair(3000.0, .0); -#endif - - // The default white balance mode of AVFoundation is WhiteBalanceModeLocked - // so set it to correspond to Qt's WhiteBalanceModeAuto as soon as the device - // is available - connect(m_camera, SIGNAL(activeChanged(bool)), SLOT(cameraActiveChanged(bool))); -} - -AVFCameraImageProcessing::~AVFCameraImageProcessing() -{ -} - -bool AVFCameraImageProcessing::isParameterSupported( - QPlatformCameraImageProcessing::ProcessingParameter parameter) const -{ -#ifdef Q_OS_IOS - return (parameter == QPlatformCameraImageProcessing::WhiteBalancePreset - || parameter == QPlatformCameraImageProcessing::ColorTemperature) - && m_camera->device(); -#else - return parameter == QPlatformCameraImageProcessing::WhiteBalancePreset - && m_camera->device(); -#endif -} - -bool AVFCameraImageProcessing::isParameterValueSupported( - QPlatformCameraImageProcessing::ProcessingParameter parameter, - const QVariant &value) const -{ - AVCaptureDevice *captureDevice = m_camera->device(); - Q_ASSERT(captureDevice); - - if (parameter == QPlatformCameraImageProcessing::WhiteBalancePreset) - return isWhiteBalanceModeSupported( - value.value<QCamera::WhiteBalanceMode>()); - -#ifdef Q_OS_IOS - if (parameter == QPlatformCameraImageProcessing::ColorTemperature) { - AVCaptureWhiteBalanceGains gains; - return avf_convert_temp_and_tint_to_wb_gains( - captureDevice, value.value<float>(), .0, gains); - } -#endif - - return false; -} - -void AVFCameraImageProcessing::setParameter( - QPlatformCameraImageProcessing::ProcessingParameter parameter, - const QVariant &value) -{ - bool result = false; - if (parameter == QPlatformCameraImageProcessing::WhiteBalancePreset) - result = setWhiteBalanceMode(value.value<QCamera::WhiteBalanceMode>()); - -#ifdef Q_OS_IOS - else if (parameter == QPlatformCameraImageProcessing::ColorTemperature) - result = setColorTemperature(value.value<float>()); -#endif - - else - qDebug() << "Setting parameter is not supported\n"; - - if (!result) - qDebug() << "Could not set parameter\n"; -} - -bool AVFCameraImageProcessing::setWhiteBalanceMode( - QCamera::WhiteBalanceMode mode) -{ - AVCaptureDevice *captureDevice = m_camera->device(); - Q_ASSERT(captureDevice); - - AVCaptureWhiteBalanceMode avMode; - avf_convert_white_balance_mode(mode, avMode); - - if (!isWhiteBalanceModeSupported(mode)) - return false; - - if (mode == QCamera::WhiteBalanceAuto - && avf_set_white_balance_mode(captureDevice, avMode)) { - m_whiteBalanceMode = mode; - return true; - } - -#ifdef Q_OS_IOS - if (mode == QCamera::WhiteBalanceManual - && avf_set_white_balance_mode(captureDevice, avMode)) { - m_whiteBalanceMode = mode; - return true; - } - - const auto mappedValues = m_mappedWhiteBalancePresets[mode]; - AVCaptureWhiteBalanceGains wbGains; - if (avf_convert_temp_and_tint_to_wb_gains(captureDevice, mappedValues.first, mappedValues.second, wbGains) - && avf_set_white_balance_gains(captureDevice, wbGains)) { - m_whiteBalanceMode = mode; - return true; - } -#endif - - return false; -} - -bool AVFCameraImageProcessing::isWhiteBalanceModeSupported( - QCamera::WhiteBalanceMode qtMode) const -{ - AVCaptureDevice *captureDevice = m_camera->device(); - Q_ASSERT(captureDevice); - - AVCaptureWhiteBalanceMode avMode; - avf_convert_white_balance_mode(qtMode, avMode); - - // Since AVFoundation's API does not support setting custom white balance gains - // on macOS, only WhiteBalanceAuto mode is supported. - if (qtMode == QCamera::WhiteBalanceAuto) - return [captureDevice isWhiteBalanceModeSupported:avMode]; - -#ifdef Q_OS_IOS - // Qt's WhiteBalanceManual corresponds to AVFoundations's WhiteBalanceModeLocked - // + setting custom white balance gains (or color temperature in Qt) - if (qtMode == QCamera::WhiteBalanceManual) - return [captureDevice isWhiteBalanceModeSupported:avMode] - && captureDevice.lockingWhiteBalanceWithCustomDeviceGainsSupported; - - // Qt's white balance presets correspond to AVFoundation's WhiteBalanceModeLocked - // + setting the white balance gains to the mapped value for each preset - if (m_mappedWhiteBalancePresets.find(qtMode) != m_mappedWhiteBalancePresets.end()) { - const auto mappedValues = m_mappedWhiteBalancePresets[qtMode]; - AVCaptureWhiteBalanceGains wbGains; - return [captureDevice isWhiteBalanceModeSupported:avMode] - && captureDevice.lockingWhiteBalanceWithCustomDeviceGainsSupported - && avf_convert_temp_and_tint_to_wb_gains(captureDevice, mappedValues.first, - mappedValues.second, wbGains); - } -#endif - - qDebug() << "White balance mode not supported"; - return false; -} - -#ifdef Q_OS_IOS -float AVFCameraImageProcessing::colorTemperature() const -{ - return m_colorTemperature; -} - -bool AVFCameraImageProcessing::setColorTemperature(float temperature) -{ - AVCaptureDevice *captureDevice = m_camera->device(); - Q_ASSERT(captureDevice); - - AVCaptureWhiteBalanceGains wbGains; - if (avf_convert_temp_and_tint_to_wb_gains(captureDevice, temperature, .0, wbGains) - && avf_set_white_balance_gains(captureDevice, wbGains)) { - m_whiteBalanceMode = QCamera::WhiteBalanceManual; - return true; - } - - return false; -} -#endif - -void AVFCameraImageProcessing::cameraActiveChanged(bool active) -{ - if (!active) - return; - setWhiteBalanceMode(QCamera::WhiteBalanceAuto); -} - -QT_END_NAMESPACE diff --git a/src/multimedia/platform/darwin/camera/avfcameraimageprocessing_p.h b/src/multimedia/platform/darwin/camera/avfcameraimageprocessing_p.h deleted file mode 100644 index 7f0ae6788..000000000 --- a/src/multimedia/platform/darwin/camera/avfcameraimageprocessing_p.h +++ /dev/null @@ -1,98 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef AVFCAMERAIMAGEPROCESSING_H -#define AVFCAMERAIMAGEPROCESSING_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include <QtMultimedia/private/qtmultimediaglobal_p.h> -#include <qcamera.h> -#include <private/qplatformcameraimageprocessing_p.h> - -QT_BEGIN_NAMESPACE - -class AVFCamera; - -class AVFCameraImageProcessing : public QPlatformCameraImageProcessing -{ - Q_OBJECT - -public: - AVFCameraImageProcessing(AVFCamera *camera); - virtual ~AVFCameraImageProcessing(); - - bool isParameterSupported(ProcessingParameter) const override; - bool isParameterValueSupported(ProcessingParameter parameter, const QVariant &value) const override; - void setParameter(ProcessingParameter parameter, const QVariant &value) override; - - bool setWhiteBalanceMode(QCamera::WhiteBalanceMode mode); - -#ifdef Q_OS_IOS - float colorTemperature() const; - bool setColorTemperature(float temperature); -#endif - -private Q_SLOTS: - void cameraActiveChanged(bool active); - -private: - bool isWhiteBalanceModeSupported(QCamera::WhiteBalanceMode mode) const; - - AVFCamera *m_camera; - QCamera::WhiteBalanceMode m_whiteBalanceMode; - -#ifdef Q_OS_IOS - float m_colorTemperature = .0; - QMap<QCamera::WhiteBalanceMode, QPair<float, float>> m_mappedWhiteBalancePresets; -#endif -}; - -QT_END_NAMESPACE - -#endif // AVFCAMERAIMAGEPROCESSING_H diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice.mm b/src/multimedia/platform/darwin/camera/avfcameraservice.mm index 6a577e4fe..c75d7665e 100644 --- a/src/multimedia/platform/darwin/camera/avfcameraservice.mm +++ b/src/multimedia/platform/darwin/camera/avfcameraservice.mm @@ -46,7 +46,6 @@ #include "avfcameraimagecapture_p.h" #include "avfcamerarenderer_p.h" #include "avfcameraimagecapture_p.h" -#include "avfcameraimageprocessing_p.h" #include "avfmediaencoder_p.h" #include <qmediadevices.h> diff --git a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h index 869ba113f..4bb8db5d6 100644 --- a/src/multimedia/platform/darwin/camera/avfcameraservice_p.h +++ b/src/multimedia/platform/darwin/camera/avfcameraservice_p.h @@ -58,7 +58,6 @@ QT_BEGIN_NAMESPACE class QPlatformCamera; class QPlatformMediaEncoder; -class QPlatformCameraImageProcessing; class AVFCamera; class AVFCameraImageCapture; class AVFCameraSession; |