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 CAMERABINCAPTURESESSION_H |
41 | #define CAMERABINCAPTURESESSION_H |
42 | |
43 | #include <QtMultimedia/private/qtmultimediaglobal_p.h> |
44 | #include <qmediarecordercontrol.h> |
45 | |
46 | #include <QtCore/qurl.h> |
47 | #include <QtCore/qdir.h> |
48 | |
49 | #include <gst/gst.h> |
50 | #if QT_CONFIG(gstreamer_photography) |
51 | #include <gst/interfaces/photography.h> |
52 | #endif |
53 | |
54 | #include <private/qgstreamerbushelper_p.h> |
55 | #include <private/qgstreamervideoprobecontrol_p.h> |
56 | #include <private/qmediastoragelocation_p.h> |
57 | #include "qcamera.h" |
58 | |
59 | QT_BEGIN_NAMESPACE |
60 | |
61 | class QGstreamerMessage; |
62 | class QGstreamerBusHelper; |
63 | class CameraBinControl; |
64 | class CameraBinAudioEncoder; |
65 | class CameraBinVideoEncoder; |
66 | class CameraBinImageEncoder; |
67 | class CameraBinRecorder; |
68 | class CameraBinContainer; |
69 | class CameraBinExposure; |
70 | class CameraBinFlash; |
71 | class CameraBinFocus; |
72 | class CameraBinImageProcessing; |
73 | class CameraBinLocks; |
74 | class CameraBinZoom; |
75 | class CameraBinCaptureDestination; |
76 | class CameraBinCaptureBufferFormat; |
77 | class QGstreamerVideoRendererInterface; |
78 | class CameraBinViewfinderSettings; |
79 | |
80 | class QGstreamerElementFactory |
81 | { |
82 | public: |
83 | virtual GstElement *buildElement() = 0; |
84 | }; |
85 | |
86 | class CameraBinSession : public QObject, |
87 | public QGstreamerBusMessageFilter, |
88 | public QGstreamerSyncMessageFilter |
89 | { |
90 | Q_OBJECT |
91 | Q_PROPERTY(qint64 duration READ duration NOTIFY durationChanged) |
92 | Q_INTERFACES(QGstreamerBusMessageFilter QGstreamerSyncMessageFilter) |
93 | public: |
94 | CameraBinSession(GstElementFactory *sourceFactory, QObject *parent); |
95 | ~CameraBinSession(); |
96 | |
97 | #if QT_CONFIG(gstreamer_photography) |
98 | GstPhotography *photography(); |
99 | #endif |
100 | GstElement *cameraBin() { return m_camerabin; } |
101 | GstElement *cameraSource() { return m_cameraSrc; } |
102 | QGstreamerBusHelper *bus() { return m_busHelper; } |
103 | |
104 | QList< QPair<int,int> > supportedFrameRates(const QSize &frameSize, bool *continuous) const; |
105 | QList<QSize> supportedResolutions(QPair<int,int> rate, bool *continuous, QCamera::CaptureModes mode) const; |
106 | |
107 | QCamera::CaptureModes captureMode() { return m_captureMode; } |
108 | void setCaptureMode(QCamera::CaptureModes mode); |
109 | |
110 | QUrl outputLocation() const; |
111 | bool setOutputLocation(const QUrl& sink); |
112 | |
113 | GstElement *buildCameraSource(); |
114 | GstElementFactory *sourceFactory() const { return m_sourceFactory; } |
115 | |
116 | CameraBinControl *cameraControl() const { return m_cameraControl; } |
117 | CameraBinAudioEncoder *audioEncodeControl() const { return m_audioEncodeControl; } |
118 | CameraBinVideoEncoder *videoEncodeControl() const { return m_videoEncodeControl; } |
119 | CameraBinImageEncoder *imageEncodeControl() const { return m_imageEncodeControl; } |
120 | |
121 | #if QT_CONFIG(gstreamer_photography) |
122 | CameraBinExposure *cameraExposureControl(); |
123 | CameraBinFlash *cameraFlashControl(); |
124 | CameraBinFocus *cameraFocusControl(); |
125 | CameraBinLocks *cameraLocksControl(); |
126 | #endif |
127 | |
128 | CameraBinZoom *cameraZoomControl() const { return m_cameraZoomControl; } |
129 | CameraBinImageProcessing *imageProcessingControl() const { return m_imageProcessingControl; } |
130 | CameraBinCaptureDestination *captureDestinationControl() const { return m_captureDestinationControl; } |
131 | CameraBinCaptureBufferFormat *captureBufferFormatControl() const { return m_captureBufferFormatControl; } |
132 | |
133 | CameraBinRecorder *recorderControl() const { return m_recorderControl; } |
134 | CameraBinContainer *mediaContainerControl() const { return m_mediaContainerControl; } |
135 | |
136 | QGstreamerElementFactory *audioInput() const { return m_audioInputFactory; } |
137 | void setAudioInput(QGstreamerElementFactory *audioInput); |
138 | |
139 | QGstreamerElementFactory *videoInput() const { return m_videoInputFactory; } |
140 | void setVideoInput(QGstreamerElementFactory *videoInput); |
141 | bool isReady() const; |
142 | |
143 | QObject *viewfinder() const { return m_viewfinder; } |
144 | void setViewfinder(QObject *viewfinder); |
145 | |
146 | QList<QCameraViewfinderSettings> supportedViewfinderSettings() const; |
147 | QCameraViewfinderSettings viewfinderSettings() const; |
148 | void setViewfinderSettings(const QCameraViewfinderSettings &settings) { m_viewfinderSettings = settings; } |
149 | |
150 | void captureImage(int requestId, const QString &fileName); |
151 | |
152 | QCamera::Status status() const; |
153 | QCamera::State pendingState() const; |
154 | bool isBusy() const; |
155 | |
156 | qint64 duration() const; |
157 | |
158 | void recordVideo(); |
159 | void stopVideoRecording(); |
160 | |
161 | bool isMuted() const; |
162 | |
163 | QString device() const { return m_inputDevice; } |
164 | |
165 | bool processSyncMessage(const QGstreamerMessage &message) override; |
166 | bool processBusMessage(const QGstreamerMessage &message) override; |
167 | |
168 | QGstreamerVideoProbeControl *videoProbe(); |
169 | |
170 | signals: |
171 | void statusChanged(QCamera::Status status); |
172 | void pendingStateChanged(QCamera::State state); |
173 | void durationChanged(qint64 duration); |
174 | void error(int error, const QString &errorString); |
175 | void imageExposed(int requestId); |
176 | void imageCaptured(int requestId, const QImage &img); |
177 | void mutedChanged(bool); |
178 | void viewfinderChanged(); |
179 | void readyChanged(bool); |
180 | void busyChanged(bool); |
181 | |
182 | public slots: |
183 | void setDevice(const QString &device); |
184 | void setState(QCamera::State); |
185 | void setCaptureDevice(const QString &deviceName); |
186 | void setMetaData(const QMap<QByteArray, QVariant>&); |
187 | void setMuted(bool); |
188 | |
189 | private slots: |
190 | void handleViewfinderChange(); |
191 | void setupCaptureResolution(); |
192 | |
193 | private: |
194 | void load(); |
195 | void unload(); |
196 | void start(); |
197 | void stop(); |
198 | |
199 | void setStatus(QCamera::Status status); |
200 | void setStateHelper(QCamera::State state); |
201 | void setError(int error, const QString &errorString); |
202 | |
203 | bool setupCameraBin(); |
204 | void setAudioCaptureCaps(); |
205 | GstCaps *supportedCaps(QCamera::CaptureModes mode) const; |
206 | static void updateBusyStatus(GObject *o, GParamSpec *p, gpointer d); |
207 | |
208 | QString currentContainerFormat() const; |
209 | |
210 | static void elementAdded(GstBin *bin, GstElement *element, CameraBinSession *session); |
211 | static void elementRemoved(GstBin *bin, GstElement *element, CameraBinSession *session); |
212 | |
213 | QUrl m_sink; |
214 | QUrl m_actualSink; |
215 | bool m_recordingActive; |
216 | QString m_captureDevice; |
217 | QCamera::Status m_status; |
218 | QCamera::State m_pendingState; |
219 | QString m_inputDevice; |
220 | bool m_muted; |
221 | bool m_busy; |
222 | QMediaStorageLocation m_mediaStorageLocation; |
223 | |
224 | QCamera::CaptureModes m_captureMode; |
225 | QMap<QByteArray, QVariant> m_metaData; |
226 | |
227 | QGstreamerElementFactory *m_audioInputFactory; |
228 | QGstreamerElementFactory *m_videoInputFactory; |
229 | QObject *m_viewfinder; |
230 | QGstreamerVideoRendererInterface *m_viewfinderInterface; |
231 | mutable QList<QCameraViewfinderSettings> m_supportedViewfinderSettings; |
232 | QCameraViewfinderSettings m_viewfinderSettings; |
233 | QCameraViewfinderSettings m_actualViewfinderSettings; |
234 | |
235 | CameraBinControl *m_cameraControl; |
236 | CameraBinAudioEncoder *m_audioEncodeControl; |
237 | CameraBinVideoEncoder *m_videoEncodeControl; |
238 | CameraBinImageEncoder *m_imageEncodeControl; |
239 | CameraBinRecorder *m_recorderControl; |
240 | CameraBinContainer *m_mediaContainerControl; |
241 | #if QT_CONFIG(gstreamer_photography) |
242 | CameraBinExposure *m_cameraExposureControl; |
243 | CameraBinFlash *m_cameraFlashControl; |
244 | CameraBinFocus *m_cameraFocusControl; |
245 | CameraBinLocks *m_cameraLocksControl; |
246 | #endif |
247 | CameraBinZoom *m_cameraZoomControl; |
248 | CameraBinImageProcessing *m_imageProcessingControl; |
249 | CameraBinCaptureDestination *m_captureDestinationControl; |
250 | CameraBinCaptureBufferFormat *m_captureBufferFormatControl; |
251 | |
252 | QGstreamerBusHelper *m_busHelper; |
253 | GstBus* m_bus; |
254 | GstElement *m_camerabin; |
255 | GstElement *m_cameraSrc; |
256 | GstElement *m_videoSrc; |
257 | GstElement *m_viewfinderElement; |
258 | GstElementFactory *m_sourceFactory; |
259 | bool m_viewfinderHasChanged; |
260 | bool m_inputDeviceHasChanged; |
261 | bool m_usingWrapperCameraBinSrc; |
262 | |
263 | class ViewfinderProbe : public QGstreamerVideoProbeControl { |
264 | public: |
265 | ViewfinderProbe(CameraBinSession *s) |
266 | : QGstreamerVideoProbeControl(s) |
267 | , session(s) |
268 | {} |
269 | |
270 | void probeCaps(GstCaps *caps) override; |
271 | |
272 | private: |
273 | CameraBinSession * const session; |
274 | } m_viewfinderProbe; |
275 | |
276 | GstElement *m_audioSrc; |
277 | GstElement *m_audioConvert; |
278 | GstElement *m_capsFilter; |
279 | GstElement *m_fileSink; |
280 | GstElement *m_audioEncoder; |
281 | GstElement *m_videoEncoder; |
282 | GstElement *m_muxer; |
283 | |
284 | public: |
285 | QString m_imageFileName; |
286 | int m_requestId; |
287 | }; |
288 | |
289 | QT_END_NAMESPACE |
290 | |
291 | #endif // CAMERABINCAPTURESESSION_H |
292 | |