| 1 | /**************************************************************************** | 
| 2 | ** | 
| 3 | ** Copyright (C) 2016 The Qt Company Ltd. | 
| 4 | ** Contact: https://www.qt.io/licensing/ | 
| 5 | ** | 
| 6 | ** This file is part of the plugins of the Qt Toolkit. | 
| 7 | ** | 
| 8 | ** $QT_BEGIN_LICENSE:LGPL$ | 
| 9 | ** Commercial License Usage | 
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in | 
| 11 | ** accordance with the commercial license agreement provided with the | 
| 12 | ** Software or, alternatively, in accordance with the terms contained in | 
| 13 | ** a written agreement between you and The Qt Company. For licensing terms | 
| 14 | ** and conditions see https://www.qt.io/terms-conditions. For further | 
| 15 | ** information use the contact form at https://www.qt.io/contact-us. | 
| 16 | ** | 
| 17 | ** GNU Lesser General Public License Usage | 
| 18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | 
| 19 | ** General Public License version 3 as published by the Free Software | 
| 20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the | 
| 21 | ** packaging of this file. Please review the following information to | 
| 22 | ** ensure the GNU Lesser General Public License version 3 requirements | 
| 23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. | 
| 24 | ** | 
| 25 | ** GNU General Public License Usage | 
| 26 | ** Alternatively, this file may be used under the terms of the GNU | 
| 27 | ** General Public License version 2.0 or (at your option) the GNU General | 
| 28 | ** Public license version 3 or any later version approved by the KDE Free | 
| 29 | ** Qt Foundation. The licenses are as published by the Free Software | 
| 30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 | 
| 31 | ** included in the packaging of this file. Please review the following | 
| 32 | ** information to ensure the GNU General Public License requirements will | 
| 33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and | 
| 34 | ** https://www.gnu.org/licenses/gpl-3.0.html. | 
| 35 | ** | 
| 36 | ** $QT_END_LICENSE$ | 
| 37 | ** | 
| 38 | ****************************************************************************/ | 
| 39 |  | 
| 40 | #include "qdeclarativecamera_p.h" | 
| 41 | #include "qdeclarativecamerapreviewprovider_p.h" | 
| 42 |  | 
| 43 | #include "qdeclarativecameraexposure_p.h" | 
| 44 | #include "qdeclarativecameraflash_p.h" | 
| 45 | #include "qdeclarativecamerafocus_p.h" | 
| 46 | #include "qdeclarativecameraimageprocessing_p.h" | 
| 47 | #include "qdeclarativecameraviewfinder_p.h" | 
| 48 |  | 
| 49 | #include "qdeclarativemediametadata_p.h" | 
| 50 |  | 
| 51 | #include <qmediaplayercontrol.h> | 
| 52 | #include <qmediaservice.h> | 
| 53 | #include <qvideorenderercontrol.h> | 
| 54 | #include <qvideodeviceselectorcontrol.h> | 
| 55 | #include <QtQml/qqmlinfo.h> | 
| 56 |  | 
| 57 | #include <QtCore/QTimer> | 
| 58 | #include <QtGui/qevent.h> | 
| 59 |  | 
| 60 | QT_BEGIN_NAMESPACE | 
| 61 |  | 
| 62 | void QDeclarativeCamera::_q_errorOccurred(QCamera::Error errorCode) | 
| 63 | { | 
| 64 |     emit error(errorCode: Error(errorCode), errorString: errorString()); | 
| 65 |     emit errorOccurred(errorCode: Error(errorCode), errorString: errorString()); | 
| 66 |     emit errorChanged(); | 
| 67 | } | 
| 68 |  | 
| 69 | void QDeclarativeCamera::_q_updateState(QCamera::State state) | 
| 70 | { | 
| 71 |     emit cameraStateChanged(QDeclarativeCamera::State(state)); | 
| 72 | } | 
| 73 |  | 
| 74 | void QDeclarativeCamera::_q_availabilityChanged(QMultimedia::AvailabilityStatus availability) | 
| 75 | { | 
| 76 |     emit availabilityChanged(availability: Availability(availability)); | 
| 77 | } | 
| 78 |  | 
| 79 | /*! | 
| 80 |     \qmltype Camera | 
| 81 |     \instantiates QDeclarativeCamera | 
| 82 |     \brief Access viewfinder frames, and take photos and movies. | 
| 83 |     \ingroup multimedia_qml | 
| 84 |     \ingroup camera_qml | 
| 85 |     \inqmlmodule QtMultimedia | 
| 86 |  | 
| 87 |     \inherits QtObject | 
| 88 |  | 
| 89 |     You can use \c Camera to capture images and movies from a camera, and manipulate | 
| 90 |     the capture and processing settings that get applied to the images.  To display the | 
| 91 |     viewfinder you can use \l VideoOutput with the Camera set as the source. | 
| 92 |  | 
| 93 |     \qml | 
| 94 |     Item { | 
| 95 |         width: 640 | 
| 96 |         height: 360 | 
| 97 |  | 
| 98 |         Camera { | 
| 99 |             id: camera | 
| 100 |  | 
| 101 |             imageProcessing.whiteBalanceMode: CameraImageProcessing.WhiteBalanceFlash | 
| 102 |  | 
| 103 |             exposure { | 
| 104 |                 exposureCompensation: -1.0 | 
| 105 |                 exposureMode: Camera.ExposurePortrait | 
| 106 |             } | 
| 107 |  | 
| 108 |             flash.mode: Camera.FlashRedEyeReduction | 
| 109 |  | 
| 110 |             imageCapture { | 
| 111 |                 onImageCaptured: { | 
| 112 |                     photoPreview.source = preview  // Show the preview in an Image | 
| 113 |                 } | 
| 114 |             } | 
| 115 |         } | 
| 116 |  | 
| 117 |         VideoOutput { | 
| 118 |             source: camera | 
| 119 |             anchors.fill: parent | 
| 120 |             focus : visible // to receive focus and capture key events when visible | 
| 121 |         } | 
| 122 |  | 
| 123 |         Image { | 
| 124 |             id: photoPreview | 
| 125 |         } | 
| 126 |     } | 
| 127 |     \endqml | 
| 128 |  | 
| 129 |     If multiple cameras are available, you can select which one to use by setting the \l deviceId | 
| 130 |     property to a value from | 
| 131 |     \l{QtMultimedia::QtMultimedia::availableCameras}{QtMultimedia.availableCameras}. | 
| 132 |     On a mobile device, you can conveniently switch between front-facing and back-facing cameras | 
| 133 |     by setting the \l position property. | 
| 134 |  | 
| 135 |     The various settings and functionality of the Camera stack is spread | 
| 136 |     across a few different child properties of Camera. | 
| 137 |  | 
| 138 |     \table | 
| 139 |     \header \li Property \li Description | 
| 140 |     \row \li \l {CameraCapture} {imageCapture} | 
| 141 |          \li Methods and properties for capturing still images. | 
| 142 |     \row \li \l {CameraRecorder} {videoRecorder} | 
| 143 |          \li Methods and properties for capturing movies. | 
| 144 |     \row \li \l {CameraExposure} {exposure} | 
| 145 |          \li Methods and properties for adjusting exposure (aperture, shutter speed etc). | 
| 146 |     \row \li \l {CameraFocus} {focus} | 
| 147 |          \li Methods and properties for adjusting focus and providing feedback on autofocus progress. | 
| 148 |     \row \li \l {CameraFlash} {flash} | 
| 149 |          \li Methods and properties for controlling the camera flash. | 
| 150 |     \row \li \l {CameraImageProcessing} {imageProcessing} | 
| 151 |          \li Methods and properties for adjusting camera image processing parameters. | 
| 152 |     \endtable | 
| 153 |  | 
| 154 |     Basic camera state management, error reporting, and simple zoom properties are | 
| 155 |     available in the Camera itself.  For integration with C++ code, the | 
| 156 |     \l mediaObject property allows you to | 
| 157 |     access the standard Qt Multimedia camera controls. | 
| 158 |  | 
| 159 |     Many of the camera settings may take some time to apply, and might be limited | 
| 160 |     to certain supported values depending on the hardware.  Some camera settings may be | 
| 161 |     set manually or automatically. These settings properties contain the current set value. | 
| 162 |     For example, when autofocus is enabled the focus zones are exposed in the | 
| 163 |     \l {CameraFocus}{focus} property. | 
| 164 |  | 
| 165 |     For additional information, read also the \l{Camera Overview}{camera overview}. | 
| 166 | */ | 
| 167 |  | 
| 168 | /*! | 
| 169 |     \class QDeclarativeCamera | 
| 170 |     \internal | 
| 171 |     \brief The QDeclarativeCamera class provides a camera item that you can add to a QQuickView. | 
| 172 | */ | 
| 173 |  | 
| 174 | /*! | 
| 175 |     Construct a declarative camera object using \a parent object. | 
| 176 |  */ | 
| 177 | QDeclarativeCamera::QDeclarativeCamera(QObject *parent) : | 
| 178 |     QObject(parent), | 
| 179 |     m_camera(0), | 
| 180 |     m_metaData(0), | 
| 181 |     m_pendingState(ActiveState), | 
| 182 |     m_componentComplete(false) | 
| 183 | { | 
| 184 |     m_currentCameraInfo = QCameraInfo::defaultCamera(); | 
| 185 |     m_camera = new QCamera(m_currentCameraInfo); | 
| 186 |  | 
| 187 |     m_imageCapture = new QDeclarativeCameraCapture(m_camera); | 
| 188 |     m_videoRecorder = new QDeclarativeCameraRecorder(m_camera); | 
| 189 |     m_exposure = new QDeclarativeCameraExposure(m_camera); | 
| 190 |     m_flash = new QDeclarativeCameraFlash(m_camera); | 
| 191 |     m_focus = new QDeclarativeCameraFocus(m_camera); | 
| 192 |     m_imageProcessing = new QDeclarativeCameraImageProcessing(m_camera); | 
| 193 |     m_viewfinder = new QDeclarativeCameraViewfinder(m_camera); | 
| 194 |  | 
| 195 |     connect(sender: m_camera, SIGNAL(captureModeChanged(QCamera::CaptureModes)), | 
| 196 |             receiver: this, SIGNAL(captureModeChanged())); | 
| 197 |     connect(sender: m_camera, SIGNAL(lockStatusChanged(QCamera::LockStatus,QCamera::LockChangeReason)), | 
| 198 |             receiver: this, SIGNAL(lockStatusChanged())); | 
| 199 |     connect(sender: m_camera, signal: &QCamera::stateChanged, receiver: this, slot: &QDeclarativeCamera::_q_updateState); | 
| 200 |     connect(sender: m_camera, SIGNAL(statusChanged(QCamera::Status)), receiver: this, SIGNAL(cameraStatusChanged())); | 
| 201 |     connect(sender: m_camera, SIGNAL(errorOccurred(QCamera::Error)), receiver: this, SLOT(_q_errorOccurred(QCamera::Error))); | 
| 202 |     connect(sender: m_camera, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus)), | 
| 203 |             receiver: this, SLOT(_q_availabilityChanged(QMultimedia::AvailabilityStatus))); | 
| 204 |  | 
| 205 |     connect(sender: m_camera->focus(), signal: &QCameraFocus::opticalZoomChanged, | 
| 206 |             receiver: this, slot: &QDeclarativeCamera::opticalZoomChanged); | 
| 207 |     connect(sender: m_camera->focus(), signal: &QCameraFocus::digitalZoomChanged, | 
| 208 |             receiver: this, slot: &QDeclarativeCamera::digitalZoomChanged); | 
| 209 |     connect(sender: m_camera->focus(), signal: &QCameraFocus::maximumOpticalZoomChanged, | 
| 210 |             receiver: this, slot: &QDeclarativeCamera::maximumOpticalZoomChanged); | 
| 211 |     connect(sender: m_camera->focus(), signal: &QCameraFocus::maximumDigitalZoomChanged, | 
| 212 |             receiver: this, slot: &QDeclarativeCamera::maximumDigitalZoomChanged); | 
| 213 | } | 
| 214 |  | 
| 215 | /*! Destructor, clean up memory */ | 
| 216 | QDeclarativeCamera::~QDeclarativeCamera() | 
| 217 | { | 
| 218 |     m_camera->unload(); | 
| 219 |  | 
| 220 |     // These must be deleted before QCamera | 
| 221 |     delete m_imageCapture; | 
| 222 |     delete m_videoRecorder; | 
| 223 |     delete m_exposure; | 
| 224 |     delete m_flash; | 
| 225 |     delete m_focus; | 
| 226 |     delete m_imageProcessing; | 
| 227 |     delete m_metaData; | 
| 228 |     delete m_viewfinder; | 
| 229 |  | 
| 230 |     delete m_camera; | 
| 231 | } | 
| 232 |  | 
| 233 | void QDeclarativeCamera::classBegin() | 
| 234 | { | 
| 235 | } | 
| 236 |  | 
| 237 | void QDeclarativeCamera::componentComplete() | 
| 238 | { | 
| 239 |     m_componentComplete = true; | 
| 240 |     setCameraState(m_pendingState); | 
| 241 | } | 
| 242 |  | 
| 243 | /*! | 
| 244 |     \qmlproperty string QtMultimedia::Camera::deviceId | 
| 245 |  | 
| 246 |     This property holds the unique identifier for the camera device being used. It may not be human-readable. | 
| 247 |  | 
| 248 |     You can get all available device IDs from \l{QtMultimedia::QtMultimedia::availableCameras}{QtMultimedia.availableCameras}. | 
| 249 |     If no value is provided or if set to an empty string, the system's default camera will be used. | 
| 250 |  | 
| 251 |     If possible, \l cameraState, \l captureMode, \l digitalZoom and other camera parameters are | 
| 252 |     preserved when changing the camera device. | 
| 253 |  | 
| 254 |     \sa displayName, position | 
| 255 |     \since 5.4 | 
| 256 | */ | 
| 257 |  | 
| 258 | QString QDeclarativeCamera::deviceId() const | 
| 259 | { | 
| 260 |     return m_currentCameraInfo.deviceName(); | 
| 261 | } | 
| 262 |  | 
| 263 | void QDeclarativeCamera::setDeviceId(const QString &name) | 
| 264 | { | 
| 265 |     if (name == m_currentCameraInfo.deviceName()) | 
| 266 |         return; | 
| 267 |  | 
| 268 |     setupDevice(name); | 
| 269 | } | 
| 270 |  | 
| 271 | /*! | 
| 272 |     \qmlproperty enumeration QtMultimedia::Camera::position | 
| 273 |  | 
| 274 |     This property holds the physical position of the camera on the hardware system. | 
| 275 |  | 
| 276 |     On a mobile device, this property can be used to easily choose between | 
| 277 |     front-facing and back-facing cameras. If this property is set to | 
| 278 |     \c Camera.UnspecifiedPosition, the system's default camera is used. | 
| 279 |  | 
| 280 |     If possible, \l cameraState, \l captureMode, \l digitalZoom and other camera | 
| 281 |     parameters are preserved when changing the camera device. | 
| 282 |  | 
| 283 |     \value  Camera.UnspecifiedPosition | 
| 284 |             The camera position is unspecified or unknown. | 
| 285 |     \value  Camera.BackFace | 
| 286 |             The camera is on the back face of the system hardware. For example, | 
| 287 |             on a mobile device, it is on side opposite from the screen. | 
| 288 |     \value  Camera.FrontFace | 
| 289 |             The camera is on the front face of the system hardware. For example, | 
| 290 |             on a mobile device, it means it is on the same side as the screen. | 
| 291 |             Viewfinder frames of front-facing cameras are mirrored horizontally, | 
| 292 |             so the users can see themselves as looking into a mirror. Captured | 
| 293 |             images or videos are not mirrored. | 
| 294 |  | 
| 295 |     \sa deviceId | 
| 296 |     \since 5.4 | 
| 297 | */ | 
| 298 |  | 
| 299 | QDeclarativeCamera::Position QDeclarativeCamera::position() const | 
| 300 | { | 
| 301 |     return QDeclarativeCamera::Position(m_currentCameraInfo.position()); | 
| 302 | } | 
| 303 |  | 
| 304 | void QDeclarativeCamera::setPosition(Position position) | 
| 305 | { | 
| 306 |     QCamera::Position pos = QCamera::Position(position); | 
| 307 |     if (pos == m_currentCameraInfo.position()) | 
| 308 |         return; | 
| 309 |  | 
| 310 |     QString id; | 
| 311 |  | 
| 312 |     if (pos == QCamera::UnspecifiedPosition) { | 
| 313 |         id = QCameraInfo::defaultCamera().deviceName(); | 
| 314 |     } else { | 
| 315 |         QList<QCameraInfo> cameras = QCameraInfo::availableCameras(position: pos); | 
| 316 |         if (!cameras.isEmpty()) | 
| 317 |             id = cameras.first().deviceName(); | 
| 318 |     } | 
| 319 |  | 
| 320 |     if (!id.isEmpty()) | 
| 321 |         setupDevice(id); | 
| 322 | } | 
| 323 |  | 
| 324 | /*! | 
| 325 |     \qmlproperty string QtMultimedia::Camera::displayName | 
| 326 |  | 
| 327 |     This property holds the human-readable name of the camera. | 
| 328 |  | 
| 329 |     You can use this property to display the name of the camera in a user interface. | 
| 330 |  | 
| 331 |     \readonly | 
| 332 |     \sa deviceId | 
| 333 |     \since 5.4 | 
| 334 | */ | 
| 335 |  | 
| 336 | QString QDeclarativeCamera::displayName() const | 
| 337 | { | 
| 338 |     return m_currentCameraInfo.description(); | 
| 339 | } | 
| 340 |  | 
| 341 | /*! | 
| 342 |     \qmlproperty int QtMultimedia::Camera::orientation | 
| 343 |  | 
| 344 |     This property holds the physical orientation of the camera sensor. | 
| 345 |  | 
| 346 |     The value is the orientation angle (clockwise, in steps of 90 degrees) of the camera sensor in | 
| 347 |     relation to the display in its natural orientation. | 
| 348 |  | 
| 349 |     For example, suppose a mobile device which is naturally in portrait orientation. The back-facing | 
| 350 |     camera is mounted in landscape. If the top side of the camera sensor is aligned with the right | 
| 351 |     edge of the screen in natural orientation, \c orientation returns \c 270. If the top side of a | 
| 352 |     front-facing camera sensor is aligned with the right edge of the screen, \c orientation | 
| 353 |     returns \c 90. | 
| 354 |  | 
| 355 |     \readonly | 
| 356 |     \sa VideoOutput::orientation | 
| 357 |     \since 5.4 | 
| 358 | */ | 
| 359 |  | 
| 360 | int QDeclarativeCamera::orientation() const | 
| 361 | { | 
| 362 |     return m_currentCameraInfo.orientation(); | 
| 363 | } | 
| 364 |  | 
| 365 | void QDeclarativeCamera::setupDevice(const QString &deviceName) | 
| 366 | { | 
| 367 |     QMediaService *service = m_camera->service(); | 
| 368 |     if (!service) | 
| 369 |         return; | 
| 370 |  | 
| 371 |     QVideoDeviceSelectorControl *deviceControl = qobject_cast<QVideoDeviceSelectorControl*>(object: service->requestControl(QVideoDeviceSelectorControl_iid)); | 
| 372 |     if (!deviceControl) | 
| 373 |         return; | 
| 374 |  | 
| 375 |     int deviceIndex = -1; | 
| 376 |  | 
| 377 |     if (deviceName.isEmpty()) { | 
| 378 |         deviceIndex = deviceControl->defaultDevice(); | 
| 379 |     } else { | 
| 380 |         for (int i = 0; i < deviceControl->deviceCount(); ++i) { | 
| 381 |             if (deviceControl->deviceName(index: i) == deviceName) { | 
| 382 |                 deviceIndex = i; | 
| 383 |                 break; | 
| 384 |             } | 
| 385 |         } | 
| 386 |     } | 
| 387 |  | 
| 388 |     if (deviceIndex == -1) | 
| 389 |         return; | 
| 390 |  | 
| 391 |     State previousState = cameraState(); | 
| 392 |     setCameraState(UnloadedState); | 
| 393 |  | 
| 394 |     deviceControl->setSelectedDevice(deviceIndex); | 
| 395 |  | 
| 396 |     QCameraInfo oldCameraInfo = m_currentCameraInfo; | 
| 397 |     m_currentCameraInfo = QCameraInfo(*m_camera); | 
| 398 |  | 
| 399 |     emit deviceIdChanged(); | 
| 400 |     if (oldCameraInfo.description() != m_currentCameraInfo.description()) | 
| 401 |         emit displayNameChanged(); | 
| 402 |     if (oldCameraInfo.position() != m_currentCameraInfo.position()) | 
| 403 |         emit positionChanged(); | 
| 404 |     if (oldCameraInfo.orientation() != m_currentCameraInfo.orientation()) | 
| 405 |         emit orientationChanged(); | 
| 406 |  | 
| 407 |     setCameraState(previousState); | 
| 408 | } | 
| 409 |  | 
| 410 | /*! | 
| 411 |     Returns any camera error. | 
| 412 |     \sa QDeclarativeCameraError::Error | 
| 413 | */ | 
| 414 | QDeclarativeCamera::Error QDeclarativeCamera::errorCode() const | 
| 415 | { | 
| 416 |     return QDeclarativeCamera::Error(m_camera->error()); | 
| 417 | } | 
| 418 |  | 
| 419 | /*! | 
| 420 |     \qmlproperty string QtMultimedia::Camera::errorString | 
| 421 |  | 
| 422 |     This property holds the last error string, if any. | 
| 423 |  | 
| 424 |     \sa errorOccurred, errorCode | 
| 425 | */ | 
| 426 | QString QDeclarativeCamera::errorString() const | 
| 427 | { | 
| 428 |     return m_camera->errorString(); | 
| 429 | } | 
| 430 |  | 
| 431 | /*! | 
| 432 |     \qmlproperty enumeration QtMultimedia::Camera::availability | 
| 433 |  | 
| 434 |     This property holds the availability state of the camera. | 
| 435 |  | 
| 436 |     \value  Camera.Available | 
| 437 |             The camera is available for use. | 
| 438 |     \value  Camera.Busy | 
| 439 |             The camera is busy at the moment as it is being used by another | 
| 440 |             process. | 
| 441 |     \value  Camera.Unavailable | 
| 442 |             The camera is not available for use (there may be no camera | 
| 443 |             hardware). | 
| 444 |     \value  Camera.ResourceMissing | 
| 445 |             The camera cannot be used because of missing resources. | 
| 446 |             It may be possible to try again at a later time. | 
| 447 |  */ | 
| 448 | QDeclarativeCamera::Availability QDeclarativeCamera::availability() const | 
| 449 | { | 
| 450 |     return Availability(m_camera->availability()); | 
| 451 | } | 
| 452 |  | 
| 453 |  | 
| 454 | /*! | 
| 455 |     \qmlproperty enumeration QtMultimedia::Camera::captureMode | 
| 456 |  | 
| 457 |     This property holds the camera capture mode. The default capture mode is | 
| 458 |     \c CaptureStillImage. | 
| 459 |  | 
| 460 |     \value  Camera.CaptureViewfinder | 
| 461 |             Camera is only configured to display viewfinder. | 
| 462 |     \value  Camera.CaptureStillImage | 
| 463 |             Prepares the Camera for capturing still images. | 
| 464 |     \value  Camera.CaptureVideo | 
| 465 |             Prepares the Camera for capturing video. | 
| 466 | */ | 
| 467 | QDeclarativeCamera::CaptureMode QDeclarativeCamera::captureMode() const | 
| 468 | { | 
| 469 |     return QDeclarativeCamera::CaptureMode(int(m_camera->captureMode())); | 
| 470 | } | 
| 471 |  | 
| 472 | void QDeclarativeCamera::setCaptureMode(QDeclarativeCamera::CaptureMode mode) | 
| 473 | { | 
| 474 |     m_camera->setCaptureMode(QCamera::CaptureModes(int(mode))); | 
| 475 | } | 
| 476 |  | 
| 477 |  | 
| 478 | /*! | 
| 479 |     \qmlproperty enumeration QtMultimedia::Camera::cameraState | 
| 480 |  | 
| 481 |     This property holds the camera object's current state. The default camera | 
| 482 |     state is \c ActiveState. | 
| 483 |  | 
| 484 |     \value  Camera.UnloadedState | 
| 485 |             The initial camera state, with the camera not loaded. | 
| 486 |             The camera capabilities (with the exception of supported capture modes) | 
| 487 |             are unknown. This state saves the most power, but takes the longest | 
| 488 |             time to be ready for capture. | 
| 489 |             While the supported settings are unknown in this state, | 
| 490 |             you can still set the camera capture settings like codec, | 
| 491 |             resolution, or frame rate. | 
| 492 |     \value  Camera.LoadedState | 
| 493 |             The camera is loaded and ready to be configured. | 
| 494 |             In this state you can query camera capabilities, | 
| 495 |             set capture resolution, codecs, and so on. | 
| 496 |             The viewfinder is not active in the loaded state. | 
| 497 |             The camera consumes power in this state. | 
| 498 |     \value  Camera.ActiveState | 
| 499 |             In the active state, the viewfinder frames are available | 
| 500 |             and the camera is ready for capture. | 
| 501 | */ | 
| 502 | QDeclarativeCamera::State QDeclarativeCamera::cameraState() const | 
| 503 | { | 
| 504 |     return m_componentComplete ? QDeclarativeCamera::State(m_camera->state()) : m_pendingState; | 
| 505 | } | 
| 506 |  | 
| 507 | /*! | 
| 508 |     \qmlproperty enumeration QtMultimedia::Camera::cameraStatus | 
| 509 |  | 
| 510 |     This property holds the camera object's current status. | 
| 511 |  | 
| 512 |     \value  Camera.ActiveStatus | 
| 513 |             The camera has been started and can produce data, | 
| 514 |             viewfinder displays video frames. | 
| 515 |             Depending on backend, changing camera settings such as | 
| 516 |             capture mode, codecs, or resolution in \c {Camera.ActiveState} may | 
| 517 |             lead to changing the status to \c LoadedStatus and \c StartingStatus | 
| 518 |             while the settings are applied, and back to \c ActiveStatus when | 
| 519 |             the camera is ready. | 
| 520 |     \value  Camera.StartingStatus | 
| 521 |             The camera is transitioning to \c {Camera.ActiveState}. The camera | 
| 522 |             service is not ready to capture yet. | 
| 523 |     \value  Camera.StoppingStatus | 
| 524 |             The camera is transitioning from \c {Camera.ActiveState} to | 
| 525 |             \c {Camera.LoadedState} or \c {Camera.UnloadedState}. | 
| 526 |     \value  Camera.StandbyStatus | 
| 527 |             The camera is in the power saving standby mode. | 
| 528 |             The camera may enter standby mode after some time of inactivity | 
| 529 |             in the \c {Camera.LoadedState} state. | 
| 530 |     \value  Camera.LoadedStatus | 
| 531 |             The camera is loaded and ready to be configured. | 
| 532 |             This status indicates that the camera is opened and it's | 
| 533 |             possible to query for supported image and video capture | 
| 534 |             settings, such as resolution, frame rate, and codecs. | 
| 535 |     \value  Camera.LoadingStatus | 
| 536 |             The camera is transitioning from \c {Camera.UnloadedState} to | 
| 537 |             \c {Camera.LoadedState} or \c {Camera.ActiveState}. | 
| 538 |     \value  Camera.UnloadingStatus | 
| 539 |             The camera is transitioning from \c {Camera.LoadedState} or | 
| 540 |             \c {Camera.ActiveState} to \c {Camera.UnloadedState}. | 
| 541 |     \value  Camera.UnloadedStatus | 
| 542 |             The initial camera status, with camera not loaded. | 
| 543 |             The camera capabilities including supported capture | 
| 544 |             settings may be unknown. | 
| 545 |     \value  Camera.UnavailableStatus | 
| 546 |             The camera or camera backend is not available. | 
| 547 | */ | 
| 548 | QDeclarativeCamera::Status QDeclarativeCamera::cameraStatus() const | 
| 549 | { | 
| 550 |     return QDeclarativeCamera::Status(m_camera->status()); | 
| 551 | } | 
| 552 |  | 
| 553 | void QDeclarativeCamera::setCameraState(QDeclarativeCamera::State state) | 
| 554 | { | 
| 555 |     if (!m_componentComplete) { | 
| 556 |         m_pendingState = state; | 
| 557 |         return; | 
| 558 |     } | 
| 559 |  | 
| 560 |     switch (state) { | 
| 561 |     case QDeclarativeCamera::ActiveState: | 
| 562 |         m_camera->start(); | 
| 563 |         break; | 
| 564 |     case QDeclarativeCamera::UnloadedState: | 
| 565 |         m_camera->unload(); | 
| 566 |         break; | 
| 567 |     case QDeclarativeCamera::LoadedState: | 
| 568 |         m_camera->load(); | 
| 569 |         break; | 
| 570 |     } | 
| 571 | } | 
| 572 |  | 
| 573 | /*! | 
| 574 |     \qmlmethod QtMultimedia::Camera::start() | 
| 575 |  | 
| 576 |     Starts the camera.  Viewfinder frames will | 
| 577 |     be available and image or movie capture will | 
| 578 |     be possible. | 
| 579 | */ | 
| 580 | void QDeclarativeCamera::start() | 
| 581 | { | 
| 582 |     setCameraState(QDeclarativeCamera::ActiveState); | 
| 583 | } | 
| 584 |  | 
| 585 | /*! | 
| 586 |     \qmlmethod QtMultimedia::Camera::stop() | 
| 587 |  | 
| 588 |     Stops the camera, but leaves the camera | 
| 589 |     stack loaded. | 
| 590 |  | 
| 591 |     In this state, the camera still consumes power. | 
| 592 | */ | 
| 593 | void QDeclarativeCamera::stop() | 
| 594 | { | 
| 595 |     setCameraState(QDeclarativeCamera::LoadedState); | 
| 596 | } | 
| 597 |  | 
| 598 |  | 
| 599 | /*! | 
| 600 |     \qmlproperty enumeration QtMultimedia::Camera::lockStatus | 
| 601 |  | 
| 602 |     This property holds the status of all the requested camera locks. | 
| 603 |  | 
| 604 |     \value  Camera.Unlocked | 
| 605 |             The application is not interested in camera settings value. | 
| 606 |             The camera may keep this parameter without changes, which is common | 
| 607 |             with camera focus, or adjust exposure and white balance constantly | 
| 608 |             to keep the viewfinder image nice. | 
| 609 |     \value  Camera.Searching | 
| 610 |             The application has requested the camera focus, exposure, or white | 
| 611 |             balance lock with searchAndLock(). This state indicates the camera | 
| 612 |             is focusing or calculating exposure and white balance. | 
| 613 |     \value  Camera.Locked | 
| 614 |             The camera focus, exposure, or white balance is locked. | 
| 615 |             The camera is ready to capture, and the application may check the | 
| 616 |             exposure parameters. | 
| 617 |             The locked state usually means the requested parameter stays the | 
| 618 |             same, except in cases where the parameter is requested to be updated | 
| 619 |             constantly. For example, in continuous focusing mode, the focus is | 
| 620 |             considered locked as long as the object is in focus, even while the | 
| 621 |             actual focusing distance may be constantly changing. | 
| 622 | */ | 
| 623 | /*! | 
| 624 |     \property QDeclarativeCamera::lockStatus | 
| 625 |  | 
| 626 |     This property holds the status of all the requested camera locks. | 
| 627 | */ | 
| 628 | QDeclarativeCamera::LockStatus QDeclarativeCamera::lockStatus() const | 
| 629 | { | 
| 630 |     return QDeclarativeCamera::LockStatus(m_camera->lockStatus()); | 
| 631 | } | 
| 632 |  | 
| 633 | /*! | 
| 634 |     \qmlmethod QtMultimedia::Camera::searchAndLock() | 
| 635 |  | 
| 636 |     Start focusing, exposure and white balance calculation. | 
| 637 |  | 
| 638 |     This is appropriate to call when the camera focus button is pressed | 
| 639 |     (or on a camera capture button half-press).  If the camera supports | 
| 640 |     autofocusing, information on the focus zones is available through | 
| 641 |     the \l {CameraFocus}{focus} property. | 
| 642 | */ | 
| 643 | void QDeclarativeCamera::searchAndLock() | 
| 644 | { | 
| 645 |     m_camera->searchAndLock(); | 
| 646 | } | 
| 647 |  | 
| 648 | /*! | 
| 649 |     \qmlmethod QtMultimedia::Camera::unlock() | 
| 650 |  | 
| 651 |     Unlock focus, exposure and white balance locks. | 
| 652 |  */ | 
| 653 | void QDeclarativeCamera::unlock() | 
| 654 | { | 
| 655 |     m_camera->unlock(); | 
| 656 | } | 
| 657 | /*! | 
| 658 |     \property QDeclarativeCamera::maximumOpticalZoom | 
| 659 |  | 
| 660 |     This property holds the maximum optical zoom factor supported, or 1.0 if optical zoom is not supported. | 
| 661 | */ | 
| 662 | /*! | 
| 663 |     \qmlproperty real QtMultimedia::Camera::maximumOpticalZoom | 
| 664 |  | 
| 665 |     This property holds the maximum optical zoom factor supported, or 1.0 if optical zoom is not supported. | 
| 666 | */ | 
| 667 | qreal QDeclarativeCamera::maximumOpticalZoom() const | 
| 668 | { | 
| 669 |     return m_camera->focus()->maximumOpticalZoom(); | 
| 670 | } | 
| 671 | /*! | 
| 672 |     \property  QDeclarativeCamera::maximumDigitalZoom | 
| 673 |  | 
| 674 |     This property holds the maximum digital zoom factor supported, or 1.0 if digital zoom is not supported. | 
| 675 | */ | 
| 676 | /*! | 
| 677 |     \qmlproperty real QtMultimedia::Camera::maximumDigitalZoom | 
| 678 |  | 
| 679 |     This property holds the maximum digital zoom factor supported, or 1.0 if digital zoom is not supported. | 
| 680 | */ | 
| 681 | qreal QDeclarativeCamera::maximumDigitalZoom() const | 
| 682 | { | 
| 683 |     return m_camera->focus()->maximumDigitalZoom(); | 
| 684 | } | 
| 685 | /*! | 
| 686 |     \property QDeclarativeCamera::opticalZoom | 
| 687 |  | 
| 688 |     This property holds the current optical zoom factor. | 
| 689 | */ | 
| 690 |  | 
| 691 | /*! | 
| 692 |     \qmlproperty real QtMultimedia::Camera::opticalZoom | 
| 693 |  | 
| 694 |     This property holds the current optical zoom factor. | 
| 695 | */ | 
| 696 | qreal QDeclarativeCamera::opticalZoom() const | 
| 697 | { | 
| 698 |     return m_camera->focus()->opticalZoom(); | 
| 699 | } | 
| 700 |  | 
| 701 | void QDeclarativeCamera::setOpticalZoom(qreal value) | 
| 702 | { | 
| 703 |     m_camera->focus()->zoomTo(opticalZoom: value, digitalZoom: digitalZoom()); | 
| 704 | } | 
| 705 | /*! | 
| 706 |     \property   QDeclarativeCamera::digitalZoom | 
| 707 |  | 
| 708 |     This property holds the current digital zoom factor. | 
| 709 | */ | 
| 710 | /*! | 
| 711 |     \qmlproperty real QtMultimedia::Camera::digitalZoom | 
| 712 |  | 
| 713 |     This property holds the current digital zoom factor. | 
| 714 | */ | 
| 715 | qreal QDeclarativeCamera::digitalZoom() const | 
| 716 | { | 
| 717 |     return m_camera->focus()->digitalZoom(); | 
| 718 | } | 
| 719 |  | 
| 720 | void QDeclarativeCamera::setDigitalZoom(qreal value) | 
| 721 | { | 
| 722 |     m_camera->focus()->zoomTo(opticalZoom: opticalZoom(), digitalZoom: value); | 
| 723 | } | 
| 724 |  | 
| 725 | /*! | 
| 726 |     \qmlproperty variant QtMultimedia::Camera::mediaObject | 
| 727 |  | 
| 728 |     This property holds the native media object for the camera. | 
| 729 |  | 
| 730 |     It can be used to get a pointer to a QCamera object in order to integrate with C++ code. | 
| 731 |  | 
| 732 |     \code | 
| 733 |         QObject *qmlCamera; // The QML Camera object | 
| 734 |         QCamera *camera = qvariant_cast<QCamera *>(qmlCamera->property("mediaObject")); | 
| 735 |     \endcode | 
| 736 |  | 
| 737 |     \note This property is not accessible from QML. | 
| 738 | */ | 
| 739 |  | 
| 740 | /*! | 
| 741 |     \qmlproperty enumeration QtMultimedia::Camera::errorCode | 
| 742 |  | 
| 743 |     This property holds the last error code. | 
| 744 |  | 
| 745 |     \value  Camera.NoError | 
| 746 |             No errors have occurred. | 
| 747 |     \value  Camera.CameraError | 
| 748 |             An error has occurred. | 
| 749 |     \value  Camera.InvalidRequestError | 
| 750 |             System resources do not support the requested functionality. | 
| 751 |     \value  Camera.ServiceMissingError | 
| 752 |             No camera service available. | 
| 753 |     \value  Camera.NotSupportedFeatureError | 
| 754 |             The feature is not supported. | 
| 755 |  | 
| 756 |     \sa errorOccurred, errorString | 
| 757 | */ | 
| 758 |  | 
| 759 | /*! | 
| 760 |     \qmlsignal QtMultimedia::Camera::error(errorCode, errorString) | 
| 761 |     \obsolete | 
| 762 |  | 
| 763 |     Use errorOccurred() instead. | 
| 764 | */ | 
| 765 |  | 
| 766 | /*! | 
| 767 |     \qmlsignal QtMultimedia::Camera::errorOccurred(errorCode, errorString) | 
| 768 |     \since 5.15 | 
| 769 |  | 
| 770 |     This signal is emitted when an error specified by \a errorCode occurs. | 
| 771 |     A descriptive string value is available in \a errorString. | 
| 772 |  | 
| 773 |     The corresponding handler is \c onError. | 
| 774 |  | 
| 775 |     \sa errorCode, errorString | 
| 776 | */ | 
| 777 |  | 
| 778 | /*! | 
| 779 |     \qmlsignal Camera::lockStatusChanged() | 
| 780 |  | 
| 781 |     This signal is emitted when the lock status (focus, exposure etc) changes. | 
| 782 |     This can happen when locking (e.g. autofocusing) is complete or has failed. | 
| 783 |  | 
| 784 |     The corresponding handler is \c onLockStatusChanged. | 
| 785 | */ | 
| 786 |  | 
| 787 | /*! | 
| 788 |     \qmlsignal Camera::cameraStateChanged(state) | 
| 789 |  | 
| 790 |     This signal is emitted when the camera state has changed to \a state.  Since the | 
| 791 |     state changes may take some time to occur this signal may arrive sometime | 
| 792 |     after the state change has been requested. | 
| 793 |  | 
| 794 |     The corresponding handler is \c onCameraStateChanged. | 
| 795 | */ | 
| 796 |  | 
| 797 | /*! | 
| 798 |     \qmlsignal Camera::opticalZoomChanged(zoom) | 
| 799 |  | 
| 800 |     This signal is emitted when the optical zoom setting has changed to \a zoom. | 
| 801 |  | 
| 802 |     The corresponding handler is \c onOpticalZoomChanged. | 
| 803 | */ | 
| 804 |  | 
| 805 | /*! | 
| 806 |     \qmlsignal Camera::digitalZoomChanged(zoom) | 
| 807 |  | 
| 808 |     This signal is emitted when the digital zoom setting has changed to \a zoom. | 
| 809 |  | 
| 810 |     The corresponding handler is \c onDigitalZoomChanged. | 
| 811 | */ | 
| 812 |  | 
| 813 | /*! | 
| 814 |     \qmlsignal Camera::maximumOpticalZoomChanged(zoom) | 
| 815 |  | 
| 816 |     This signal is emitted when the maximum optical zoom setting has | 
| 817 |     changed to \a zoom.  This can occur when you change between video | 
| 818 |     and still image capture modes, or the capture settings are changed. | 
| 819 |  | 
| 820 |     The corresponding handler is \c onMaximumOpticalZoomChanged. | 
| 821 | */ | 
| 822 |  | 
| 823 | /*! | 
| 824 |     \qmlsignal Camera::maximumDigitalZoomChanged(zoom) | 
| 825 |  | 
| 826 |     This signal is emitted when the maximum digital zoom setting has | 
| 827 |     changed to \a zoom.  This can occur when you change between video | 
| 828 |     and still image capture modes, or the capture settings are changed. | 
| 829 |  | 
| 830 |     The corresponding handler is \c onMaximumDigitalZoomChanged. | 
| 831 | */ | 
| 832 |  | 
| 833 | /*! | 
| 834 |     \qmlpropertygroup QtMultimedia::Camera::metaData | 
| 835 |     \qmlproperty variant QtMultimedia::Camera::metaData.cameraManufacturer | 
| 836 |     \qmlproperty variant QtMultimedia::Camera::metaData.cameraModel | 
| 837 |     \qmlproperty variant QtMultimedia::Camera::metaData.event | 
| 838 |     \qmlproperty variant QtMultimedia::Camera::metaData.subject | 
| 839 |     \qmlproperty variant QtMultimedia::Camera::metaData.orientation | 
| 840 |     \qmlproperty variant QtMultimedia::Camera::metaData.dateTimeOriginal | 
| 841 |     \qmlproperty variant QtMultimedia::Camera::metaData.gpsLatitude | 
| 842 |     \qmlproperty variant QtMultimedia::Camera::metaData.gpsLongitude | 
| 843 |     \qmlproperty variant QtMultimedia::Camera::metaData.gpsAltitude | 
| 844 |     \qmlproperty variant QtMultimedia::Camera::metaData.gpsTimestamp | 
| 845 |     \qmlproperty variant QtMultimedia::Camera::metaData.gpsTrack | 
| 846 |     \qmlproperty variant QtMultimedia::Camera::metaData.gpsSpeed | 
| 847 |     \qmlproperty variant QtMultimedia::Camera::metaData.gpsImgDirection | 
| 848 |     \qmlproperty variant QtMultimedia::Camera::metaData.gpsProcessingMethod | 
| 849 |  | 
| 850 |     These properties hold the meta data for the camera captures. | 
| 851 |  | 
| 852 |     \list | 
| 853 |     \li \c metaData.cameraManufacturer holds the name of the manufacturer of the camera. | 
| 854 |     \li \c metaData.cameraModel holds the name of the model of the camera. | 
| 855 |     \li \c metaData.event holds the event during which the photo or video is to be captured. | 
| 856 |     \li \c metaData.subject holds the name of the subject of the capture or recording. | 
| 857 |     \li \c metaData.orientation holds the clockwise rotation of the camera at time of capture. | 
| 858 |     \li \c metaData.dateTimeOriginal holds the initial time at which the photo or video is captured. | 
| 859 |     \li \c metaData.gpsLatitude holds the latitude of the camera in decimal degrees at time of capture. | 
| 860 |     \li \c metaData.gpsLongitude holds the longitude of the camera in decimal degrees at time of capture. | 
| 861 |     \li \c metaData.gpsAltitude holds the altitude of the camera in meters at time of capture. | 
| 862 |     \li \c metaData.gpsTimestamp holds the timestamp of the GPS position data. | 
| 863 |     \li \c metaData.gpsTrack holds direction of movement of the camera at the time of | 
| 864 |            capture. It is measured in degrees clockwise from north. | 
| 865 |     \li \c metaData.gpsSpeed holds the velocity in kilometers per hour of the camera at time of capture. | 
| 866 |     \li \c metaData.gpsImgDirection holds direction the camera is facing at the time of capture. | 
| 867 |            It is measured in degrees clockwise from north. | 
| 868 |     \li \c metaData.gpsProcessingMethod holds the name of the method for determining the GPS position. | 
| 869 |     \endlist | 
| 870 |  | 
| 871 |     \sa {QMediaMetaData} | 
| 872 |     \since 5.4 | 
| 873 | */ | 
| 874 |  | 
| 875 | QDeclarativeMediaMetaData *QDeclarativeCamera::metaData() | 
| 876 | { | 
| 877 |     if (!m_metaData) | 
| 878 |         m_metaData = new QDeclarativeMediaMetaData(m_camera); | 
| 879 |     return m_metaData; | 
| 880 | } | 
| 881 |  | 
| 882 | /*! | 
| 883 |     \qmlpropertygroup QtMultimedia::Camera::viewfinder | 
| 884 |     \qmlproperty size QtMultimedia::Camera::viewfinder.resolution | 
| 885 |     \qmlproperty real QtMultimedia::Camera::viewfinder.minimumFrameRate | 
| 886 |     \qmlproperty real QtMultimedia::Camera::viewfinder.maximumFrameRate | 
| 887 |  | 
| 888 |     These properties hold the viewfinder settings. | 
| 889 |  | 
| 890 |     \c viewfinder.resolution holds the resolution of the camera viewfinder. If no | 
| 891 |     resolution is given or if it is empty, the backend uses a default value. | 
| 892 |  | 
| 893 |     \c viewfinder.minimumFrameRate holds the minimum frame rate for the viewfinder in | 
| 894 |     frames per second. If no value is given or if set to \c 0, the backend uses a default value. | 
| 895 |  | 
| 896 |     \c viewfinder.maximumFrameRate holds the maximum frame rate for the viewfinder in | 
| 897 |     frames per second. If no value is given or if set to \c 0, the backend uses a default value. | 
| 898 |  | 
| 899 |     If \c viewfinder.minimumFrameRate is equal to \c viewfinder.maximumFrameRate, the frame rate is | 
| 900 |     fixed. If not, the actual frame rate fluctuates between the two values. | 
| 901 |  | 
| 902 |     Changing the viewfinder settings while the camera is in the \c Camera.ActiveState state may | 
| 903 |     cause the camera to be restarted. | 
| 904 |  | 
| 905 |     If the camera is used to capture videos or images, the viewfinder settings might be | 
| 906 |     ignored if they conflict with the capture settings. You can check the actual viewfinder settings | 
| 907 |     once the camera is in the \c Camera.ActiveStatus status. | 
| 908 |  | 
| 909 |     Supported values can be retrieved with supportedViewfinderResolutions() and | 
| 910 |     supportedViewfinderFrameRateRanges(). | 
| 911 |  | 
| 912 |     \since 5.4 | 
| 913 |  */ | 
| 914 |  | 
| 915 | QDeclarativeCameraViewfinder *QDeclarativeCamera::viewfinder() | 
| 916 | { | 
| 917 |     return m_viewfinder; | 
| 918 | } | 
| 919 |  | 
| 920 | /*! | 
| 921 |     \qmlmethod list<size> QtMultimedia::Camera::supportedViewfinderResolutions(real minimumFrameRate, real maximumFrameRate) | 
| 922 |  | 
| 923 |     Returns a list of supported viewfinder resolutions. | 
| 924 |  | 
| 925 |     If both optional parameters \a minimumFrameRate and \a maximumFrameRate are specified, the | 
| 926 |     returned list is reduced to resolutions supported for the given frame rate range. | 
| 927 |  | 
| 928 |     The camera must be loaded before calling this function, otherwise the returned list | 
| 929 |     is empty. | 
| 930 |  | 
| 931 |     \sa {QtMultimedia::Camera::viewfinder}{viewfinder} | 
| 932 |  | 
| 933 |     \since 5.5 | 
| 934 | */ | 
| 935 | QJSValue QDeclarativeCamera::supportedViewfinderResolutions(qreal minimumFrameRate, qreal maximumFrameRate) | 
| 936 | { | 
| 937 |     QQmlEngine *engine = qmlEngine(this); | 
| 938 |  | 
| 939 |     QCameraViewfinderSettings settings; | 
| 940 |     settings.setMinimumFrameRate(minimumFrameRate); | 
| 941 |     settings.setMaximumFrameRate(maximumFrameRate); | 
| 942 |     const QList<QSize> resolutions = m_camera->supportedViewfinderResolutions(settings); | 
| 943 |  | 
| 944 |     QJSValue supportedResolutions = engine->newArray(length: resolutions.count()); | 
| 945 |     int i = 0; | 
| 946 |     for (const QSize &resolution : resolutions) { | 
| 947 |         QJSValue size = engine->newObject(); | 
| 948 |         size.setProperty(QStringLiteral("width" ), value: resolution.width()); | 
| 949 |         size.setProperty(QStringLiteral("height" ), value: resolution.height()); | 
| 950 |         supportedResolutions.setProperty(arrayIndex: i++, value: size); | 
| 951 |     } | 
| 952 |  | 
| 953 |     return supportedResolutions; | 
| 954 | } | 
| 955 |  | 
| 956 | /*! | 
| 957 |     \qmlmethod list<object> QtMultimedia::Camera::supportedViewfinderFrameRateRanges(size resolution) | 
| 958 |  | 
| 959 |     Returns a list of supported viewfinder frame rate ranges. | 
| 960 |  | 
| 961 |     Each range object in the list has the \c minimumFrameRate and \c maximumFrameRate properties. | 
| 962 |  | 
| 963 |     If the optional parameter \a resolution is specified, the returned list is reduced to frame rate | 
| 964 |     ranges supported for the given \a resolution. | 
| 965 |  | 
| 966 |     The camera must be loaded before calling this function, otherwise the returned list | 
| 967 |     is empty. | 
| 968 |  | 
| 969 |     \sa {QtMultimedia::Camera::viewfinder}{viewfinder} | 
| 970 |  | 
| 971 |     \since 5.5 | 
| 972 | */ | 
| 973 | QJSValue QDeclarativeCamera::supportedViewfinderFrameRateRanges(const QJSValue &resolution) | 
| 974 | { | 
| 975 |     QQmlEngine *engine = qmlEngine(this); | 
| 976 |  | 
| 977 |     QCameraViewfinderSettings settings; | 
| 978 |     if (!resolution.isUndefined()) { | 
| 979 |         QJSValue width = resolution.property(QStringLiteral("width" )); | 
| 980 |         QJSValue height = resolution.property(QStringLiteral("height" )); | 
| 981 |         if (width.isNumber() && height.isNumber()) | 
| 982 |             settings.setResolution(width: width.toInt(), height: height.toInt()); | 
| 983 |     } | 
| 984 |     const QList<QCamera::FrameRateRange> frameRateRanges = m_camera->supportedViewfinderFrameRateRanges(settings); | 
| 985 |  | 
| 986 |     QJSValue supportedFrameRateRanges = engine->newArray(length: frameRateRanges.count()); | 
| 987 |     int i = 0; | 
| 988 |     for (const QCamera::FrameRateRange &frameRateRange : frameRateRanges) { | 
| 989 |         QJSValue range = engine->newObject(); | 
| 990 |         range.setProperty(QStringLiteral("minimumFrameRate" ), value: frameRateRange.minimumFrameRate); | 
| 991 |         range.setProperty(QStringLiteral("maximumFrameRate" ), value: frameRateRange.maximumFrameRate); | 
| 992 |         supportedFrameRateRanges.setProperty(arrayIndex: i++, value: range); | 
| 993 |     } | 
| 994 |  | 
| 995 |     return supportedFrameRateRanges; | 
| 996 | } | 
| 997 |  | 
| 998 | QT_END_NAMESPACE | 
| 999 |  | 
| 1000 | #include "moc_qdeclarativecamera_p.cpp" | 
| 1001 |  |