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 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 #ifndef QCAMERA_H
41 #define QCAMERA_H
42 
43 #include <QtCore/qstringlist.h>
44 #include <QtCore/qpair.h>
45 #include <QtCore/qsize.h>
46 #include <QtCore/qpoint.h>
47 #include <QtCore/qrect.h>
48 
49 #include <QtMultimedia/qmediacontrol.h>
50 #include <QtMultimedia/qmediaobject.h>
51 #include <QtMultimedia/qmediaservice.h>
52 
53 #include <QtMultimedia/qcameraexposure.h>
54 #include <QtMultimedia/qcamerafocus.h>
55 #include <QtMultimedia/qcameraimageprocessing.h>
56 #include <QtMultimedia/qcameraviewfindersettings.h>
57 
58 #include <QtMultimedia/qmediaenumdebug.h>
59 
60 QT_BEGIN_NAMESPACE
61 
62 
63 class QAbstractVideoSurface;
64 class QVideoWidget;
65 class QGraphicsVideoItem;
66 class QCameraInfo;
67 
68 class QCameraPrivate;
69 class Q_MULTIMEDIA_EXPORT QCamera : public QMediaObject
70 {
71     Q_OBJECT
72     Q_PROPERTY(QCamera::State state READ state NOTIFY stateChanged)
73     Q_PROPERTY(QCamera::Status status READ status NOTIFY statusChanged)
74     Q_PROPERTY(QCamera::CaptureModes captureMode READ captureMode WRITE setCaptureMode NOTIFY captureModeChanged)
75     Q_PROPERTY(QCamera::LockStatus lockStatus READ lockStatus NOTIFY lockStatusChanged)
76 
77     Q_ENUMS(Status)
78     Q_ENUMS(State)
79     Q_ENUMS(CaptureMode)
80     Q_ENUMS(Error)
81     Q_ENUMS(LockStatus)
82     Q_ENUMS(LockChangeReason)
83     Q_ENUMS(LockType)
84     Q_ENUMS(Position)
85 public:
86     struct FrameRateRange
87     {
FrameRateRangeFrameRateRange88         Q_DECL_CONSTEXPR FrameRateRange() Q_DECL_NOTHROW
89             : minimumFrameRate(0)
90             , maximumFrameRate(0)
91         { }
92 
FrameRateRangeFrameRateRange93         Q_DECL_CONSTEXPR FrameRateRange(qreal minimum, qreal maximum) Q_DECL_NOTHROW
94             : minimumFrameRate(minimum)
95             , maximumFrameRate(maximum)
96         { }
97 
98         qreal minimumFrameRate;
99         qreal maximumFrameRate;
100     };
101 
102     enum Status {
103         UnavailableStatus,
104         UnloadedStatus,
105         LoadingStatus,
106         UnloadingStatus,
107         LoadedStatus,
108         StandbyStatus,
109         StartingStatus,
110         StoppingStatus,
111         ActiveStatus
112     };
113 
114     enum State {
115         UnloadedState,
116         LoadedState,
117         ActiveState
118     };
119 
120     enum CaptureMode
121     {
122         CaptureViewfinder = 0,
123         CaptureStillImage = 0x01,
124         CaptureVideo = 0x02
125     };
126     Q_DECLARE_FLAGS(CaptureModes, CaptureMode)
127 
128     enum Error
129     {
130         NoError,
131         CameraError,
132         InvalidRequestError,
133         ServiceMissingError,
134         NotSupportedFeatureError
135     };
136 
137     enum LockStatus
138     {
139         Unlocked,
140         Searching,
141         Locked
142     };
143 
144     enum LockChangeReason {
145         UserRequest,
146         LockAcquired,
147         LockFailed,
148         LockLost,
149         LockTemporaryLost
150     };
151 
152     enum LockType
153     {
154         NoLock = 0,
155         LockExposure = 0x01,
156         LockWhiteBalance = 0x02,
157         LockFocus = 0x04
158     };
159     Q_DECLARE_FLAGS(LockTypes, LockType)
160 
161     enum Position
162     {
163         UnspecifiedPosition,
164         BackFace,
165         FrontFace
166     };
167 
168     explicit QCamera(QObject *parent = nullptr);
169     explicit QCamera(const QByteArray& deviceName, QObject *parent = nullptr);
170     explicit QCamera(const QCameraInfo& cameraInfo, QObject *parent = nullptr);
171     explicit QCamera(QCamera::Position position, QObject *parent = nullptr);
172     ~QCamera();
173 
174 #if QT_DEPRECATED_SINCE(5, 3)
175     QT_DEPRECATED static QList<QByteArray> availableDevices();
176     QT_DEPRECATED static QString deviceDescription(const QByteArray &device);
177 #endif
178 
179     QMultimedia::AvailabilityStatus availability() const override;
180 
181     State state() const;
182     Status status() const;
183 
184     CaptureModes captureMode() const;
185     bool isCaptureModeSupported(CaptureModes mode) const;
186 
187     QCameraExposure *exposure() const;
188     QCameraFocus *focus() const;
189     QCameraImageProcessing *imageProcessing() const;
190 
191     void setViewfinder(QVideoWidget *viewfinder);
192     void setViewfinder(QGraphicsVideoItem *viewfinder);
193     void setViewfinder(QAbstractVideoSurface *surface);
194 
195     QCameraViewfinderSettings viewfinderSettings() const;
196     void setViewfinderSettings(const QCameraViewfinderSettings &settings);
197 
198     QList<QCameraViewfinderSettings> supportedViewfinderSettings(
199             const QCameraViewfinderSettings &settings = QCameraViewfinderSettings()) const;
200 
201     QList<QSize> supportedViewfinderResolutions(
202             const QCameraViewfinderSettings &settings = QCameraViewfinderSettings()) const;
203 
204     QList<FrameRateRange> supportedViewfinderFrameRateRanges(
205             const QCameraViewfinderSettings &settings = QCameraViewfinderSettings()) const;
206 
207     QList<QVideoFrame::PixelFormat> supportedViewfinderPixelFormats(
208             const QCameraViewfinderSettings &settings = QCameraViewfinderSettings()) const;
209 
210     Error error() const;
211     QString errorString() const;
212 
213     QCamera::LockTypes supportedLocks() const;
214     QCamera::LockTypes requestedLocks() const;
215 
216     QCamera::LockStatus lockStatus() const;
217     QCamera::LockStatus lockStatus(QCamera::LockType lock) const;
218 
219 public Q_SLOTS:
220     void setCaptureMode(QCamera::CaptureModes mode);
221 
222     void load();
223     void unload();
224 
225     void start();
226     void stop();
227 
228     void searchAndLock();
229     void unlock();
230 
231     void searchAndLock(QCamera::LockTypes locks);
232     void unlock(QCamera::LockTypes locks);
233 
234 Q_SIGNALS:
235     void stateChanged(QCamera::State state);
236     void captureModeChanged(QCamera::CaptureModes);
237     void statusChanged(QCamera::Status status);
238 
239     void locked();
240     void lockFailed();
241 
242     void lockStatusChanged(QCamera::LockStatus status, QCamera::LockChangeReason reason);
243     void lockStatusChanged(QCamera::LockType lock, QCamera::LockStatus status, QCamera::LockChangeReason reason);
244 
245 #if QT_DEPRECATED_SINCE(5,15)
246     void error(QCamera::Error);
247 #endif
248     void errorOccurred(QCamera::Error);
249 
250 private:
251     Q_DISABLE_COPY(QCamera)
252     Q_DECLARE_PRIVATE(QCamera)
253     Q_PRIVATE_SLOT(d_func(), void _q_preparePropertyChange(int))
254     Q_PRIVATE_SLOT(d_func(), void _q_restartCamera())
255     Q_PRIVATE_SLOT(d_func(), void _q_error(int, const QString &))
256     Q_PRIVATE_SLOT(d_func(), void _q_updateLockStatus(QCamera::LockType, QCamera::LockStatus, QCamera::LockChangeReason))
257     Q_PRIVATE_SLOT(d_func(), void _q_updateState(QCamera::State))
258     friend class QCameraInfo;
259 };
260 
261 Q_DECLARE_OPERATORS_FOR_FLAGS(QCamera::LockTypes)
262 
263 QT_WARNING_PUSH
264 QT_WARNING_DISABLE_CLANG("-Wfloat-equal")
265 QT_WARNING_DISABLE_GCC("-Wfloat-equal")
266 
267 Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator==(const QCamera::FrameRateRange &r1, const QCamera::FrameRateRange &r2) Q_DECL_NOTHROW
268 {
269     return qFuzzyCompare(r1.minimumFrameRate, r2.minimumFrameRate)
270         && qFuzzyCompare(r1.maximumFrameRate, r2.maximumFrameRate);
271 }
272 
273 QT_WARNING_POP
274 
275 Q_DECL_CONSTEXPR Q_INLINE_TEMPLATE bool operator!=(const QCamera::FrameRateRange &r1, const QCamera::FrameRateRange &r2) Q_DECL_NOTHROW
276 { return !(r1 == r2); }
277 
278 Q_DECLARE_TYPEINFO(QCamera::FrameRateRange, Q_PRIMITIVE_TYPE);
279 
280 QT_END_NAMESPACE
281 
282 Q_DECLARE_METATYPE(QCamera::State)
283 Q_DECLARE_METATYPE(QCamera::Status)
284 Q_DECLARE_METATYPE(QCamera::Error)
285 Q_DECLARE_METATYPE(QCamera::CaptureMode)
286 Q_DECLARE_METATYPE(QCamera::CaptureModes)
287 Q_DECLARE_METATYPE(QCamera::LockType)
288 Q_DECLARE_METATYPE(QCamera::LockStatus)
289 Q_DECLARE_METATYPE(QCamera::LockChangeReason)
290 Q_DECLARE_METATYPE(QCamera::Position)
291 
292 Q_MEDIA_ENUM_DEBUG(QCamera, State)
293 Q_MEDIA_ENUM_DEBUG(QCamera, Status)
294 Q_MEDIA_ENUM_DEBUG(QCamera, Error)
295 Q_MEDIA_ENUM_DEBUG(QCamera, CaptureMode)
296 Q_MEDIA_ENUM_DEBUG(QCamera, LockType)
297 Q_MEDIA_ENUM_DEBUG(QCamera, LockStatus)
298 Q_MEDIA_ENUM_DEBUG(QCamera, LockChangeReason)
299 Q_MEDIA_ENUM_DEBUG(QCamera, Position)
300 
301 #endif  // QCAMERA_H
302