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#include "qmediaresource.h"
41
42#include <QtCore/qsize.h>
43#include <QtCore/qurl.h>
44#include <QtCore/qvariant.h>
45
46QT_BEGIN_NAMESPACE
47
48static void qRegisterMediaResourceMetaTypes()
49{
50 qRegisterMetaType<QMediaResource>();
51 qRegisterMetaType<QMediaResourceList>();
52}
53
54Q_CONSTRUCTOR_FUNCTION(qRegisterMediaResourceMetaTypes)
55
56
57/*!
58 \class QMediaResource
59
60 \brief The QMediaResource class provides a description of a media resource.
61 \inmodule QtMultimedia
62 \ingroup multimedia
63 \ingroup multimedia_playback
64 \obsolete
65
66 A media resource is composed of a \l {url()}{URL} containing the
67 location of the resource and a set of properties that describe the
68 format of the resource. The properties provide a means to assess a
69 resource without first attempting to load it, and in situations where
70 media be represented by multiple alternative representations provide a
71 means to select the appropriate resource.
72
73 Media made available by a remote services can often be available in
74 multiple encodings or quality levels, this allows a client to select
75 an appropriate resource based on considerations such as codecs supported,
76 network bandwidth, and display constraints. QMediaResource includes
77 information such as the \l {mimeType()}{MIME type}, \l {audioCodec()}{audio}
78 and \l {videoCodec()}{video} codecs, \l {audioBitRate()}{audio} and
79 \l {videoBitRate()}{video} bit rates, and \l {resolution()}{resolution}
80 so these constraints and others can be evaluated.
81
82 The only mandatory property of a QMediaResource is the url().
83
84 \sa QMediaContent
85*/
86
87/*!
88 \typedef QMediaResourceList
89
90 Synonym for \c QList<QMediaResource>
91
92 \relates QMediaResource
93*/
94
95/*!
96 Constructs a null media resource.
97*/
98QMediaResource::QMediaResource()
99{
100}
101
102/*!
103 Constructs a media resource with the given \a mimeType from a \a url.
104*/
105QMediaResource::QMediaResource(const QUrl &url, const QString &mimeType)
106{
107 values.insert(akey: Url, avalue: url);
108 values.insert(akey: MimeType, avalue: mimeType);
109}
110
111/*!
112 Constructs a media resource with the given \a mimeType from a network \a request.
113*/
114QMediaResource::QMediaResource(const QNetworkRequest &request, const QString &mimeType)
115{
116 values.insert(akey: Request, avalue: QVariant::fromValue(value: request));
117 values.insert(akey: Url, avalue: request.url());
118 values.insert(akey: MimeType, avalue: mimeType);
119}
120
121/*!
122 Constructs a copy of a media resource \a other.
123*/
124QMediaResource::QMediaResource(const QMediaResource &other)
125 : values(other.values)
126{
127}
128
129/*!
130 Assigns the value of \a other to a media resource.
131*/
132QMediaResource &QMediaResource::operator =(const QMediaResource &other)
133{
134 values = other.values;
135
136 return *this;
137}
138
139/*!
140 Destroys a media resource.
141*/
142QMediaResource::~QMediaResource()
143{
144}
145
146
147/*!
148 Compares a media resource to \a other.
149
150 Returns true if the resources are identical, and false otherwise.
151*/
152bool QMediaResource::operator ==(const QMediaResource &other) const
153{
154 // Compare requests directly as QNetworkRequests are "custom types".
155 for (auto it = values.cbegin(), end = values.cend(); it != end; ++it) {
156 switch (it.key()) {
157 case Request:
158 if (request() != other.request())
159 return false;
160 break;
161 default:
162 if (it.value() != other.values.value(akey: it.key()))
163 return false;
164 }
165 }
166 return true;
167}
168
169/*!
170 Compares a media resource to \a other.
171
172 Returns true if they are different, and false otherwise.
173*/
174bool QMediaResource::operator !=(const QMediaResource &other) const
175{
176 return !(*this == other);
177}
178
179/*!
180 Identifies if a media resource is null.
181
182 Returns true if the resource is null, and false otherwise.
183*/
184bool QMediaResource::isNull() const
185{
186 return values.isEmpty();
187}
188
189/*!
190 Returns the URL of a media resource.
191*/
192QUrl QMediaResource::url() const
193{
194 return qvariant_cast<QUrl>(v: values.value(akey: Url));
195}
196
197/*!
198 Returns the network request associated with this media resource.
199*/
200QNetworkRequest QMediaResource::request() const
201{
202 if(values.contains(akey: Request))
203 return qvariant_cast<QNetworkRequest>(v: values.value(akey: Request));
204
205 return QNetworkRequest(url());
206}
207
208/*!
209 Returns the MIME type of a media resource.
210
211 This may be null if the MIME type is unknown.
212*/
213QString QMediaResource::mimeType() const
214{
215 return qvariant_cast<QString>(v: values.value(akey: MimeType));
216}
217
218/*!
219 Returns the language of a media resource as an ISO 639-2 code.
220
221 This may be null if the language is unknown.
222*/
223QString QMediaResource::language() const
224{
225 return qvariant_cast<QString>(v: values.value(akey: Language));
226}
227
228/*!
229 Sets the \a language of a media resource.
230*/
231void QMediaResource::setLanguage(const QString &language)
232{
233 if (!language.isNull())
234 values.insert(akey: Language, avalue: language);
235 else
236 values.remove(akey: Language);
237}
238
239/*!
240 Returns the audio codec of a media resource.
241
242 This may be null if the media resource does not contain an audio stream, or the codec is
243 unknown.
244*/
245QString QMediaResource::audioCodec() const
246{
247 return qvariant_cast<QString>(v: values.value(akey: AudioCodec));
248}
249
250/*!
251 Sets the audio \a codec of a media resource.
252*/
253void QMediaResource::setAudioCodec(const QString &codec)
254{
255 if (!codec.isNull())
256 values.insert(akey: AudioCodec, avalue: codec);
257 else
258 values.remove(akey: AudioCodec);
259}
260
261/*!
262 Returns the video codec of a media resource.
263
264 This may be null if the media resource does not contain a video stream, or the codec is
265 unknonwn.
266*/
267QString QMediaResource::videoCodec() const
268{
269 return qvariant_cast<QString>(v: values.value(akey: VideoCodec));
270}
271
272/*!
273 Sets the video \a codec of media resource.
274*/
275void QMediaResource::setVideoCodec(const QString &codec)
276{
277 if (!codec.isNull())
278 values.insert(akey: VideoCodec, avalue: codec);
279 else
280 values.remove(akey: VideoCodec);
281}
282
283/*!
284 Returns the size in bytes of a media resource.
285
286 This may be zero if the size is unknown.
287*/
288qint64 QMediaResource::dataSize() const
289{
290 return qvariant_cast<qint64>(v: values.value(akey: DataSize));
291}
292
293/*!
294 Sets the \a size in bytes of a media resource.
295*/
296void QMediaResource::setDataSize(const qint64 size)
297{
298 if (size != 0)
299 values.insert(akey: DataSize, avalue: size);
300 else
301 values.remove(akey: DataSize);
302}
303
304/*!
305 Returns the bit rate in bits per second of a media resource's audio stream.
306
307 This may be zero if the bit rate is unknown, or the resource contains no audio stream.
308*/
309int QMediaResource::audioBitRate() const
310{
311 return values.value(akey: AudioBitRate).toInt();
312}
313
314/*!
315 Sets the bit \a rate in bits per second of a media resource's video stream.
316*/
317void QMediaResource::setAudioBitRate(int rate)
318{
319 if (rate != 0)
320 values.insert(akey: AudioBitRate, avalue: rate);
321 else
322 values.remove(akey: AudioBitRate);
323}
324
325/*!
326 Returns the audio sample rate of a media resource.
327
328 This may be zero if the sample size is unknown, or the resource contains no audio stream.
329*/
330int QMediaResource::sampleRate() const
331{
332 return qvariant_cast<int>(v: values.value(akey: SampleRate));
333}
334
335/*!
336 Sets the audio \a sampleRate of a media resource.
337*/
338void QMediaResource::setSampleRate(int sampleRate)
339{
340 if (sampleRate != 0)
341 values.insert(akey: SampleRate, avalue: sampleRate);
342 else
343 values.remove(akey: SampleRate);
344}
345
346/*!
347 Returns the number of audio channels in a media resource.
348
349 This may be zero if the sample size is unknown, or the resource contains no audio stream.
350*/
351int QMediaResource::channelCount() const
352{
353 return qvariant_cast<int>(v: values.value(akey: ChannelCount));
354}
355
356/*!
357 Sets the number of audio \a channels in a media resource.
358*/
359void QMediaResource::setChannelCount(int channels)
360{
361 if (channels != 0)
362 values.insert(akey: ChannelCount, avalue: channels);
363 else
364 values.remove(akey: ChannelCount);
365}
366
367/*!
368 Returns the bit rate in bits per second of a media resource's video stream.
369
370 This may be zero if the bit rate is unknown, or the resource contains no video stream.
371*/
372int QMediaResource::videoBitRate() const
373{
374 return values.value(akey: VideoBitRate).toInt();
375}
376
377/*!
378 Sets the bit \a rate in bits per second of a media resource's video stream.
379*/
380void QMediaResource::setVideoBitRate(int rate)
381{
382 if (rate != 0)
383 values.insert(akey: VideoBitRate, avalue: rate);
384 else
385 values.remove(akey: VideoBitRate);
386}
387
388/*!
389 Returns the resolution in pixels of a media resource.
390
391 This may be null is the resolution is unknown, or the resource contains no pixel data (i.e. the
392 resource is an audio stream.
393*/
394QSize QMediaResource::resolution() const
395{
396 return qvariant_cast<QSize>(v: values.value(akey: Resolution));
397}
398
399/*!
400 Sets the \a resolution in pixels of a media resource.
401*/
402void QMediaResource::setResolution(const QSize &resolution)
403{
404 if (resolution.width() != -1 || resolution.height() != -1)
405 values.insert(akey: Resolution, avalue: resolution);
406 else
407 values.remove(akey: Resolution);
408}
409
410/*!
411 Sets the \a width and \a height in pixels of a media resource.
412*/
413void QMediaResource::setResolution(int width, int height)
414{
415 if (width != -1 || height != -1)
416 values.insert(akey: Resolution, avalue: QSize(width, height));
417 else
418 values.remove(akey: Resolution);
419}
420QT_END_NAMESPACE
421

source code of qtmultimedia/src/multimedia/playback/qmediaresource.cpp