1 /*
2  *  Kaidan - A user-friendly XMPP client for every device!
3  *
4  *  Copyright (C) 2016-2021 Kaidan developers and contributors
5  *  (see the LICENSE file for a full list of copyright authors)
6  *
7  *  Kaidan is free software: you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation, either version 3 of the License, or
10  *  (at your option) any later version.
11  *
12  *  In addition, as a special exception, the author of Kaidan gives
13  *  permission to link the code of its release with the OpenSSL
14  *  project's "OpenSSL" library (or with modified versions of it that
15  *  use the same license as the "OpenSSL" library), and distribute the
16  *  linked executables. You must obey the GNU General Public License in
17  *  all respects for all of the code used other than "OpenSSL". If you
18  *  modify this file, you may extend this exception to your version of
19  *  the file, but you are not obligated to do so.  If you do not wish to
20  *  do so, delete this exception statement from your version.
21  *
22  *  Kaidan is distributed in the hope that it will be useful,
23  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
24  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25  *  GNU General Public License for more details.
26  *
27  *  You should have received a copy of the GNU General Public License
28  *  along with Kaidan.  If not, see <http://www.gnu.org/licenses/>.
29  */
30 
31 #pragma once
32 
33 #include <QAudioEncoderSettings>
34 #include <QCoreApplication>
35 #include <QImageEncoderSettings>
36 #include <QVideoEncoderSettings>
37 
38 #include "AudioDeviceModel.h"
39 #include "CameraModel.h"
40 
41 class QSettings;
42 
43 class MediaSettings
44 {
45 	Q_GADGET
46 
47 	Q_PROPERTY(CameraInfo camera MEMBER camera)
48 	Q_PROPERTY(AudioDeviceInfo audioInputDevice MEMBER audioInputDevice)
49 	Q_PROPERTY(QString container MEMBER container)
50 
51 public:
52 	MediaSettings() = default;
53 	explicit MediaSettings(const CameraInfo &camera, const AudioDeviceInfo &audioInputDevice);
54 
55 	void loadSettings(QSettings *settings);
56 	void saveSettings(QSettings *settings);
57 	void dumpProperties(const QString &context) const;
58 
59 	bool operator==(const MediaSettings &other) const;
60 	bool operator!=(const MediaSettings &other) const;
61 
62 	CameraInfo camera;
63 	AudioDeviceInfo audioInputDevice;
64 	QString container;
65 };
66 
67 class CommonEncoderSettings
68 {
69 	Q_GADGET
70 	Q_DECLARE_TR_FUNCTIONS(CommonEncoderSettings)
71 
72 	Q_PROPERTY(QString codec MEMBER codec)
73 	Q_PROPERTY(CommonEncoderSettings::EncodingQuality quality MEMBER quality)
74 	Q_PROPERTY(QVariantMap options MEMBER options)
75 
76 public:
77 	enum class EncodingQuality {
78 		VeryLowQuality = QMultimedia::EncodingQuality::VeryLowQuality,
79 		LowQuality = QMultimedia::EncodingQuality::LowQuality,
80 		NormalQuality = QMultimedia::EncodingQuality::NormalQuality,
81 		HighQuality = QMultimedia::EncodingQuality::HighQuality,
82 		VeryHighQuality = QMultimedia::EncodingQuality::VeryHighQuality
83 	};
84 	Q_ENUM(EncodingQuality)
85 
86 	enum class EncodingMode {
87 		ConstantQualityEncoding = QMultimedia::EncodingMode::ConstantQualityEncoding,
88 		ConstantBitRateEncoding = QMultimedia::EncodingMode::ConstantBitRateEncoding,
89 		AverageBitRateEncoding = QMultimedia::EncodingMode::AverageBitRateEncoding,
90 		TwoPassEncoding = QMultimedia::EncodingMode::TwoPassEncoding
91 	};
92 	Q_ENUM(EncodingMode)
93 
94 	explicit CommonEncoderSettings(const QString &codec,
95 		CommonEncoderSettings::EncodingQuality quality,
96 		const QVariantMap &options);
97 	virtual ~CommonEncoderSettings() = default;
98 
99 	virtual void loadSettings(QSettings *settings);
100 	virtual void saveSettings(QSettings *settings);
101 	virtual void dumpProperties(const QString &context) const = 0;
102 
103 	bool operator==(const CommonEncoderSettings &other) const;
104 	bool operator!=(const CommonEncoderSettings &other) const;
105 
106 	static QString toString(CommonEncoderSettings::EncodingQuality quality);
107 	static QString toString(CommonEncoderSettings::EncodingMode mode);
108 
109 	QString codec;
110 	CommonEncoderSettings::EncodingQuality quality;
111 	QVariantMap options;
112 };
113 
114 class ImageEncoderSettings : public CommonEncoderSettings
115 {
116 	Q_GADGET
117 
118 	Q_PROPERTY(QSize resolution MEMBER resolution)
119 
120 public:
121 	explicit ImageEncoderSettings(const QImageEncoderSettings &settings = { });
122 
123 	void loadSettings(QSettings *settings) override;
124 	void saveSettings(QSettings *settings) override;
125 	void dumpProperties(const QString &context) const override;
126 
127 	bool operator==(const ImageEncoderSettings &other) const;
128 	bool operator!=(const ImageEncoderSettings &other) const;
129 
130 	QImageEncoderSettings toQImageEncoderSettings() const;
131 
132 	QSize resolution;
133 };
134 
135 class AudioEncoderSettings : public CommonEncoderSettings
136 {
137 	Q_GADGET
138 
139 	Q_PROPERTY(CommonEncoderSettings::EncodingMode mode MEMBER mode)
140 	Q_PROPERTY(int bitRate MEMBER bitRate)
141 	Q_PROPERTY(int sampleRate MEMBER sampleRate)
142 	Q_PROPERTY(int channelCount MEMBER channelCount)
143 
144 public:
145 	explicit AudioEncoderSettings(const QAudioEncoderSettings &settings = { });
146 
147 	void loadSettings(QSettings *settings) override;
148 	void saveSettings(QSettings *settings) override;
149 	void dumpProperties(const QString &context) const override;
150 
151 	bool operator==(const AudioEncoderSettings &other) const;
152 	bool operator!=(const AudioEncoderSettings &other) const;
153 
154 	QAudioEncoderSettings toQAudioEncoderSettings() const;
155 
156 	CommonEncoderSettings::EncodingMode mode;
157 	int bitRate;
158 	int sampleRate;
159 	int channelCount;
160 };
161 
162 class VideoEncoderSettings : public CommonEncoderSettings
163 {
164 	Q_GADGET
165 
166 	Q_PROPERTY(CommonEncoderSettings::EncodingMode mode MEMBER mode)
167 	Q_PROPERTY(int bitRate MEMBER bitRate)
168 	Q_PROPERTY(qreal frameRate MEMBER frameRate)
169 	Q_PROPERTY(QSize resolution MEMBER resolution)
170 
171 public:
172 	explicit VideoEncoderSettings(const QVideoEncoderSettings &settings = { });
173 
174 	void loadSettings(QSettings *settings) override;
175 	void saveSettings(QSettings *settings) override;
176 	void dumpProperties(const QString &context) const override;
177 
178 	bool operator==(const VideoEncoderSettings &other) const;
179 	bool operator!=(const VideoEncoderSettings &other) const;
180 
181 	QVideoEncoderSettings toQVideoEncoderSettings() const;
182 
183 	CommonEncoderSettings::EncodingMode mode;
184 	int bitRate;
185 	qreal frameRate;
186 	QSize resolution;
187 };
188 
189 Q_DECLARE_METATYPE(MediaSettings)
190 Q_DECLARE_METATYPE(ImageEncoderSettings)
191 Q_DECLARE_METATYPE(AudioEncoderSettings)
192 Q_DECLARE_METATYPE(VideoEncoderSettings)
193