diff options
Diffstat (limited to 'src/multimedia/platform/qplatformcamera.cpp')
-rw-r--r-- | src/multimedia/platform/qplatformcamera.cpp | 116 |
1 files changed, 40 insertions, 76 deletions
diff --git a/src/multimedia/platform/qplatformcamera.cpp b/src/multimedia/platform/qplatformcamera.cpp index 21a13ea97..0d3975550 100644 --- a/src/multimedia/platform/qplatformcamera.cpp +++ b/src/multimedia/platform/qplatformcamera.cpp @@ -1,93 +1,59 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qplatformcamera_p.h" +#include "private/qcameradevice_p.h" QT_BEGIN_NAMESPACE -/*! - \class QPlatformCamera - \obsolete - +QPlatformCamera::QPlatformCamera(QCamera *parent) : QPlatformVideoSource(parent), m_camera(parent) +{ + qRegisterMetaType<QVideoFrame>(); +} +QCameraFormat QPlatformCamera::findBestCameraFormat(const QCameraDevice &camera) const +{ + // check if fmt is better. We try to find the highest resolution that offers + // at least 30 FPS + // we use 29 FPS to compare against as some cameras report 29.97 FPS... - \brief The QPlatformCamera class is an abstract base class for - classes that control still cameras or video cameras. + auto makeCriteria = [this](const QCameraFormat &fmt) { + constexpr float MinSufficientFrameRate = 29.f; - \inmodule QtMultimedia + const auto isValid = fmt.pixelFormat() != QVideoFrameFormat::Format_Invalid; + const auto resolution = fmt.resolution(); + const auto sufficientFrameRate = std::min(fmt.maxFrameRate(), MinSufficientFrameRate); + const auto pixelFormatScore = + cameraPixelFormatScore(fmt.pixelFormat(), QCameraFormatPrivate::getColorRange(fmt)); - \ingroup multimedia_control -*/ + return std::make_tuple( + isValid, // 1st: ensure valid formats + sufficientFrameRate, // 2nd: ensure the highest frame rate in the range [0; 29]*/ + resolution.width() * resolution.height(), // 3rd: ensure the highest resolution + pixelFormatScore, // 4th: eshure the best pixel format + fmt.maxFrameRate()); // 5th: ensure the highest framerate in the whole range + }; -/*! - Constructs a camera control object with \a parent. -*/ + const auto formats = camera.videoFormats(); + const auto found = + std::max_element(formats.begin(), formats.end(), + [makeCriteria](const QCameraFormat &fmtA, const QCameraFormat &fmtB) { + return makeCriteria(fmtA) < makeCriteria(fmtB); + }); -QPlatformCamera::QPlatformCamera(QCamera *parent) - : QObject(parent), - m_camera(parent) -{ + return found == formats.end() ? QCameraFormat{} : *found; } -QCameraFormat QPlatformCamera::findBestCameraFormat(const QCameraDevice &camera) +QVideoFrameFormat QPlatformCamera::frameFormat() const { - QCameraFormat f; - const auto formats = camera.videoFormats(); - for (const auto &fmt : formats) { - // check if fmt is better. We try to find the highest resolution that offers - // at least 30 FPS - if (f.maxFrameRate() < 30 && fmt.maxFrameRate() > f.maxFrameRate()) - f = fmt; - else if (f.maxFrameRate() == fmt.maxFrameRate() && - f.resolution().width()*f.resolution().height() < fmt.resolution().width()*fmt.resolution().height()) - f = fmt; - } - return f; + QVideoFrameFormat result(m_cameraFormat.resolution(), + m_framePixelFormat == QVideoFrameFormat::Format_Invalid + ? m_cameraFormat.pixelFormat() + : m_framePixelFormat); + result.setFrameRate(m_cameraFormat.maxFrameRate()); + return result; } -/*! - \fn void QPlatformCamera::error(int error, const QString &errorString) - - Signal emitted when an error occurs with error code \a error and - a description of the error \a errorString. -*/ - void QPlatformCamera::supportedFeaturesChanged(QCamera::Features f) { if (m_supportedFeatures == f) @@ -255,8 +221,6 @@ int QPlatformCamera::colorTemperatureForWhiteBalance(QCamera::WhiteBalanceMode m return 0; } - - QT_END_NAMESPACE #include "moc_qplatformcamera_p.cpp" |