summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
Diffstat (limited to 'src/multimedia')
-rw-r--r--src/multimedia/audio/qaudiobuffer.cpp14
-rw-r--r--src/multimedia/audio/qaudiodecoder.h4
-rw-r--r--src/multimedia/audio/qaudiodevicefactory.cpp94
-rw-r--r--src/multimedia/audio/qaudiosystem.cpp3
-rw-r--r--src/multimedia/audio/qaudiosystemplugin.cpp1
-rw-r--r--src/multimedia/audio/qaudiosystemplugin.h8
-rw-r--r--src/multimedia/audio/qsoundeffect_qaudio_p.h4
-rw-r--r--src/multimedia/audio/qwavedecoder_p.h10
-rw-r--r--src/multimedia/camera/qcamera.h2
-rw-r--r--src/multimedia/camera/qcamerafocus.cpp32
-rw-r--r--src/multimedia/camera/qcameraimagecapture.h4
-rw-r--r--src/multimedia/camera/qcameraimageprocessing.cpp8
-rw-r--r--src/multimedia/configure.json2
-rw-r--r--src/multimedia/doc/src/platform-notes-ios.qdoc43
-rw-r--r--src/multimedia/doc/src/qtmultimedia-index.qdoc1
-rw-r--r--src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h10
-rw-r--r--src/multimedia/gsttools_headers/qgstcodecsinfo_p.h20
-rw-r--r--src/multimedia/gsttools_headers/qgstreameraudioinputselector_p.h10
-rw-r--r--src/multimedia/gsttools_headers/qgstreameraudioprobecontrol_p.h4
-rw-r--r--src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h12
-rw-r--r--src/multimedia/gsttools_headers/qgstreamervideooverlay_p.h6
-rw-r--r--src/multimedia/gsttools_headers/qgstreamervideoprobecontrol_p.h4
-rw-r--r--src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h10
-rw-r--r--src/multimedia/gsttools_headers/qgstreamervideowidget_p.h36
-rw-r--r--src/multimedia/gsttools_headers/qgstreamervideowindow_p.h44
-rw-r--r--src/multimedia/gsttools_headers/qgstutils_p.h1
-rw-r--r--src/multimedia/gsttools_headers/qgstvideobuffer_p.h10
-rw-r--r--src/multimedia/gsttools_headers/qgstvideorendererplugin_p.h2
-rw-r--r--src/multimedia/gsttools_headers/qgstvideorenderersink_p.h14
-rw-r--r--src/multimedia/playback/playback.pri4
-rw-r--r--src/multimedia/playback/qmedianetworkplaylistprovider.cpp10
-rw-r--r--src/multimedia/playback/qmedianetworkplaylistprovider_p.h28
-rw-r--r--src/multimedia/playback/qmediaplayer.h6
-rw-r--r--src/multimedia/playback/qmediaplaylist.h4
-rw-r--r--src/multimedia/playback/qmediaplaylist_p.h22
-rw-r--r--src/multimedia/playback/qmediaplaylistioplugin_p.h14
-rw-r--r--src/multimedia/playback/qmediaplaylistnavigator.cpp6
-rw-r--r--src/multimedia/playback/qplaylistfileparser.cpp (renamed from src/multimedia/playback/playlistfileparser.cpp)438
-rw-r--r--src/multimedia/playback/qplaylistfileparser_p.h (renamed from src/multimedia/playback/playlistfileparser_p.h)36
-rw-r--r--src/multimedia/qmediaresourcepolicy_p.cpp12
-rw-r--r--src/multimedia/qmediaserviceprovider.cpp20
-rw-r--r--src/multimedia/qmediaserviceproviderplugin.h4
-rw-r--r--src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h8
-rw-r--r--src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h4
-rw-r--r--src/multimedia/radio/qradiodata.h4
-rw-r--r--src/multimedia/radio/qradiotuner.h2
-rw-r--r--src/multimedia/recording/qmediarecorder.h4
-rw-r--r--src/multimedia/video/qabstractvideobuffer.h2
-rw-r--r--src/multimedia/video/qabstractvideobuffer_p.h2
-rw-r--r--src/multimedia/video/qimagevideobuffer_p.h6
-rw-r--r--src/multimedia/video/qmemoryvideobuffer_p.h6
-rw-r--r--src/multimedia/video/qvideosurfaceoutput_p.h4
52 files changed, 621 insertions, 438 deletions
diff --git a/src/multimedia/audio/qaudiobuffer.cpp b/src/multimedia/audio/qaudiobuffer.cpp
index 3768fd196..e4918edf2 100644
--- a/src/multimedia/audio/qaudiobuffer.cpp
+++ b/src/multimedia/audio/qaudiobuffer.cpp
@@ -140,15 +140,15 @@ public:
free(mBuffer);
}
- void release() {delete this;}
- QAudioFormat format() const {return mFormat;}
- qint64 startTime() const {return mStartTime;}
- int frameCount() const {return mFrameCount;}
+ void release() override {delete this;}
+ QAudioFormat format() const override {return mFormat;}
+ qint64 startTime() const override {return mStartTime;}
+ int frameCount() const override {return mFrameCount;}
- void *constData() const {return mBuffer;}
+ void *constData() const override {return mBuffer;}
- void *writableData() {return mBuffer;}
- QAbstractAudioBuffer *clone() const
+ void *writableData() override {return mBuffer;}
+ QAbstractAudioBuffer *clone() const override
{
return new QMemoryAudioBufferProvider(mBuffer, mFrameCount, mFormat, mStartTime);
}
diff --git a/src/multimedia/audio/qaudiodecoder.h b/src/multimedia/audio/qaudiodecoder.h
index a63a6836f..85e0b75f7 100644
--- a/src/multimedia/audio/qaudiodecoder.h
+++ b/src/multimedia/audio/qaudiodecoder.h
@@ -120,8 +120,8 @@ Q_SIGNALS:
void durationChanged(qint64 duration);
public:
- virtual bool bind(QObject *);
- virtual void unbind(QObject *);
+ bool bind(QObject *) override;
+ void unbind(QObject *) override;
private:
Q_DISABLE_COPY(QAudioDecoder)
diff --git a/src/multimedia/audio/qaudiodevicefactory.cpp b/src/multimedia/audio/qaudiodevicefactory.cpp
index c3e4929b3..b1788f28a 100644
--- a/src/multimedia/audio/qaudiodevicefactory.cpp
+++ b/src/multimedia/audio/qaudiodevicefactory.cpp
@@ -61,64 +61,64 @@ Q_GLOBAL_STATIC_WITH_ARGS(QMediaPluginLoader, audioLoader,
class QNullDeviceInfo : public QAbstractAudioDeviceInfo
{
public:
- QAudioFormat preferredFormat() const { qWarning()<<"using null deviceinfo, none available"; return QAudioFormat(); }
- bool isFormatSupported(const QAudioFormat& ) const { return false; }
+ QAudioFormat preferredFormat() const override { qWarning()<<"using null deviceinfo, none available"; return QAudioFormat(); }
+ bool isFormatSupported(const QAudioFormat& ) const override { return false; }
QAudioFormat nearestFormat(const QAudioFormat& ) const { return QAudioFormat(); }
- QString deviceName() const { return QString(); }
- QStringList supportedCodecs() { return QStringList(); }
- QList<int> supportedSampleRates() { return QList<int>(); }
- QList<int> supportedChannelCounts() { return QList<int>(); }
- QList<int> supportedSampleSizes() { return QList<int>(); }
- QList<QAudioFormat::Endian> supportedByteOrders() { return QList<QAudioFormat::Endian>(); }
- QList<QAudioFormat::SampleType> supportedSampleTypes() { return QList<QAudioFormat::SampleType>(); }
+ QString deviceName() const override { return QString(); }
+ QStringList supportedCodecs() override { return QStringList(); }
+ QList<int> supportedSampleRates() override { return QList<int>(); }
+ QList<int> supportedChannelCounts() override { return QList<int>(); }
+ QList<int> supportedSampleSizes() override { return QList<int>(); }
+ QList<QAudioFormat::Endian> supportedByteOrders() override { return QList<QAudioFormat::Endian>(); }
+ QList<QAudioFormat::SampleType> supportedSampleTypes() override { return QList<QAudioFormat::SampleType>(); }
};
class QNullInputDevice : public QAbstractAudioInput
{
public:
- void start(QIODevice*) { qWarning()<<"using null input device, none available";}
- QIODevice* start() { qWarning()<<"using null input device, none available"; return 0; }
- void stop() {}
- void reset() {}
- void suspend() {}
- void resume() {}
- int bytesReady() const { return 0; }
- int periodSize() const { return 0; }
- void setBufferSize(int ) {}
- int bufferSize() const { return 0; }
- void setNotifyInterval(int ) {}
- int notifyInterval() const { return 0; }
- qint64 processedUSecs() const { return 0; }
- qint64 elapsedUSecs() const { return 0; }
- QAudio::Error error() const { return QAudio::OpenError; }
- QAudio::State state() const { return QAudio::StoppedState; }
- void setFormat(const QAudioFormat&) {}
- QAudioFormat format() const { return QAudioFormat(); }
- void setVolume(qreal) {}
- qreal volume() const {return 1.0f;}
+ void start(QIODevice*) override { qWarning()<<"using null input device, none available";}
+ QIODevice* start() override { qWarning()<<"using null input device, none available"; return 0; }
+ void stop() override {}
+ void reset() override {}
+ void suspend() override {}
+ void resume() override {}
+ int bytesReady() const override { return 0; }
+ int periodSize() const override { return 0; }
+ void setBufferSize(int ) override {}
+ int bufferSize() const override { return 0; }
+ void setNotifyInterval(int ) override {}
+ int notifyInterval() const override { return 0; }
+ qint64 processedUSecs() const override { return 0; }
+ qint64 elapsedUSecs() const override { return 0; }
+ QAudio::Error error() const override { return QAudio::OpenError; }
+ QAudio::State state() const override { return QAudio::StoppedState; }
+ void setFormat(const QAudioFormat&) override {}
+ QAudioFormat format() const override { return QAudioFormat(); }
+ void setVolume(qreal) override {}
+ qreal volume() const override {return 1.0f;}
};
class QNullOutputDevice : public QAbstractAudioOutput
{
public:
- void start(QIODevice*) {qWarning()<<"using null output device, none available";}
- QIODevice* start() { qWarning()<<"using null output device, none available"; return 0; }
- void stop() {}
- void reset() {}
- void suspend() {}
- void resume() {}
- int bytesFree() const { return 0; }
- int periodSize() const { return 0; }
- void setBufferSize(int ) {}
- int bufferSize() const { return 0; }
- void setNotifyInterval(int ) {}
- int notifyInterval() const { return 0; }
- qint64 processedUSecs() const { return 0; }
- qint64 elapsedUSecs() const { return 0; }
- QAudio::Error error() const { return QAudio::OpenError; }
- QAudio::State state() const { return QAudio::StoppedState; }
- void setFormat(const QAudioFormat&) {}
- QAudioFormat format() const { return QAudioFormat(); }
+ void start(QIODevice*) override {qWarning()<<"using null output device, none available";}
+ QIODevice* start() override { qWarning()<<"using null output device, none available"; return 0; }
+ void stop() override {}
+ void reset() override {}
+ void suspend() override {}
+ void resume() override {}
+ int bytesFree() const override { return 0; }
+ int periodSize() const override { return 0; }
+ void setBufferSize(int ) override {}
+ int bufferSize() const override { return 0; }
+ void setNotifyInterval(int ) override {}
+ int notifyInterval() const override { return 0; }
+ qint64 processedUSecs() const override { return 0; }
+ qint64 elapsedUSecs() const override { return 0; }
+ QAudio::Error error() const override { return QAudio::OpenError; }
+ QAudio::State state() const override { return QAudio::StoppedState; }
+ void setFormat(const QAudioFormat&) override {}
+ QAudioFormat format() const override { return QAudioFormat(); }
};
QList<QAudioDeviceInfo> QAudioDeviceFactory::availableDevices(QAudio::Mode mode)
diff --git a/src/multimedia/audio/qaudiosystem.cpp b/src/multimedia/audio/qaudiosystem.cpp
index 549b06373..b11993e55 100644
--- a/src/multimedia/audio/qaudiosystem.cpp
+++ b/src/multimedia/audio/qaudiosystem.cpp
@@ -48,7 +48,6 @@ QT_BEGIN_NAMESPACE
\ingroup multimedia
\ingroup multimedia_audio
\inmodule QtMultimedia
- \internal
This class implements the audio functionality for
QAudioDeviceInfo, i.e., QAudioDeviceInfo keeps a
@@ -112,7 +111,6 @@ QT_BEGIN_NAMESPACE
\ingroup multimedia
\inmodule QtMultimedia
- \internal
QAbstractAudioOutput implements audio functionality for
QAudioOutput, i.e., QAudioOutput routes function calls to
@@ -252,7 +250,6 @@ QT_BEGIN_NAMESPACE
\ingroup multimedia
\inmodule QtMultimedia
- \internal
QAudioDeviceInput keeps an instance of QAbstractAudioInput and
routes calls to functions of the same name to QAbstractAudioInput.
diff --git a/src/multimedia/audio/qaudiosystemplugin.cpp b/src/multimedia/audio/qaudiosystemplugin.cpp
index 636b614d4..6a255cf11 100644
--- a/src/multimedia/audio/qaudiosystemplugin.cpp
+++ b/src/multimedia/audio/qaudiosystemplugin.cpp
@@ -58,7 +58,6 @@ QAudioSystemPluginExtension::~QAudioSystemPluginExtension()
\ingroup multimedia
\ingroup multimedia_audio
\inmodule QtMultimedia
- \internal
Writing a audio plugin is achieved by subclassing this base class,
reimplementing the pure virtual functions availableDevices(),
diff --git a/src/multimedia/audio/qaudiosystemplugin.h b/src/multimedia/audio/qaudiosystemplugin.h
index 3368c9b98..e304f1c46 100644
--- a/src/multimedia/audio/qaudiosystemplugin.h
+++ b/src/multimedia/audio/qaudiosystemplugin.h
@@ -81,10 +81,10 @@ public:
explicit QAudioSystemPlugin(QObject *parent = Q_NULLPTR);
~QAudioSystemPlugin();
- virtual QList<QByteArray> availableDevices(QAudio::Mode) const = 0;
- virtual QAbstractAudioInput* createInput(const QByteArray& device) = 0;
- virtual QAbstractAudioOutput* createOutput(const QByteArray& device) = 0;
- virtual QAbstractAudioDeviceInfo* createDeviceInfo(const QByteArray& device, QAudio::Mode mode) = 0;
+ QList<QByteArray> availableDevices(QAudio::Mode) const override = 0;
+ QAbstractAudioInput* createInput(const QByteArray& device) override = 0;
+ QAbstractAudioOutput* createOutput(const QByteArray& device) override = 0;
+ QAbstractAudioDeviceInfo* createDeviceInfo(const QByteArray& device, QAudio::Mode mode) override = 0;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/audio/qsoundeffect_qaudio_p.h b/src/multimedia/audio/qsoundeffect_qaudio_p.h
index d8c416fdb..6fc3ae8d5 100644
--- a/src/multimedia/audio/qsoundeffect_qaudio_p.h
+++ b/src/multimedia/audio/qsoundeffect_qaudio_p.h
@@ -69,8 +69,8 @@ public:
PrivateSoundSource(QSoundEffectPrivate* s);
~PrivateSoundSource() {}
- qint64 readData( char* data, qint64 len);
- qint64 writeData(const char* data, qint64 len);
+ qint64 readData( char* data, qint64 len) override;
+ qint64 writeData(const char* data, qint64 len) override;
private Q_SLOTS:
void sampleReady();
diff --git a/src/multimedia/audio/qwavedecoder_p.h b/src/multimedia/audio/qwavedecoder_p.h
index 1cd20e07f..0f1cef599 100644
--- a/src/multimedia/audio/qwavedecoder_p.h
+++ b/src/multimedia/audio/qwavedecoder_p.h
@@ -70,9 +70,9 @@ public:
QAudioFormat audioFormat() const;
int duration() const;
- qint64 size() const;
- bool isSequential() const;
- qint64 bytesAvailable() const;
+ qint64 size() const override;
+ bool isSequential() const override;
+ qint64 bytesAvailable() const override;
Q_SIGNALS:
void formatKnown();
@@ -82,8 +82,8 @@ private Q_SLOTS:
void handleData();
private:
- qint64 readData(char *data, qint64 maxlen);
- qint64 writeData(const char *data, qint64 len);
+ qint64 readData(char *data, qint64 maxlen) override;
+ qint64 writeData(const char *data, qint64 len) override;
bool enoughDataAvailable();
bool findChunk(const char *chunkId);
diff --git a/src/multimedia/camera/qcamera.h b/src/multimedia/camera/qcamera.h
index 180760728..685298905 100644
--- a/src/multimedia/camera/qcamera.h
+++ b/src/multimedia/camera/qcamera.h
@@ -176,7 +176,7 @@ public:
QT_DEPRECATED static QString deviceDescription(const QByteArray &device);
#endif
- QMultimedia::AvailabilityStatus availability() const;
+ QMultimedia::AvailabilityStatus availability() const override;
State state() const;
Status status() const;
diff --git a/src/multimedia/camera/qcamerafocus.cpp b/src/multimedia/camera/qcamerafocus.cpp
index 9da48e257..848b33df8 100644
--- a/src/multimedia/camera/qcamerafocus.cpp
+++ b/src/multimedia/camera/qcamerafocus.cpp
@@ -68,15 +68,15 @@ public:
QCameraFocusFakeZoomControl(QObject *parent) :
QCameraZoomControl(parent) {}
- qreal maximumOpticalZoom() const { return 1.0; }
- qreal maximumDigitalZoom() const { return 1.0; }
+ qreal maximumOpticalZoom() const override { return 1.0; }
+ qreal maximumDigitalZoom() const override { return 1.0; }
- qreal requestedOpticalZoom() const { return 1.0; }
- qreal requestedDigitalZoom() const { return 1.0; }
- qreal currentOpticalZoom() const { return 1.0; }
- qreal currentDigitalZoom() const { return 1.0; }
+ qreal requestedOpticalZoom() const override { return 1.0; }
+ qreal requestedDigitalZoom() const override { return 1.0; }
+ qreal currentOpticalZoom() const override { return 1.0; }
+ qreal currentDigitalZoom() const override { return 1.0; }
- void zoomTo(qreal, qreal) { qWarning("The camera doesn't support zooming."); }
+ void zoomTo(qreal, qreal) override { qWarning("The camera doesn't support zooming."); }
};
class QCameraFocusFakeFocusControl : public QCameraFocusControl
@@ -85,17 +85,17 @@ public:
QCameraFocusFakeFocusControl(QObject *parent) :
QCameraFocusControl(parent) {}
- QCameraFocus::FocusModes focusMode() const { return QCameraFocus::AutoFocus; }
- void setFocusMode(QCameraFocus::FocusModes) { qWarning("Focus mode selection is not supported"); }
- bool isFocusModeSupported(QCameraFocus::FocusModes) const { return false; }
+ QCameraFocus::FocusModes focusMode() const override { return QCameraFocus::AutoFocus; }
+ void setFocusMode(QCameraFocus::FocusModes) override { qWarning("Focus mode selection is not supported"); }
+ bool isFocusModeSupported(QCameraFocus::FocusModes) const override { return false; }
- QCameraFocus::FocusPointMode focusPointMode() const { return QCameraFocus::FocusPointAuto; }
- void setFocusPointMode(QCameraFocus::FocusPointMode) { qWarning("Focus points mode selection is not supported"); }
- bool isFocusPointModeSupported(QCameraFocus::FocusPointMode) const { return false; }
- QPointF customFocusPoint() const { return QPointF(0.5,0.5); }
- void setCustomFocusPoint(const QPointF &) { qWarning("Focus points selection is not supported"); }
+ QCameraFocus::FocusPointMode focusPointMode() const override { return QCameraFocus::FocusPointAuto; }
+ void setFocusPointMode(QCameraFocus::FocusPointMode) override { qWarning("Focus points mode selection is not supported"); }
+ bool isFocusPointModeSupported(QCameraFocus::FocusPointMode) const override { return false; }
+ QPointF customFocusPoint() const override { return QPointF(0.5,0.5); }
+ void setCustomFocusPoint(const QPointF &) override { qWarning("Focus points selection is not supported"); }
- QCameraFocusZoneList focusZones() const { return QCameraFocusZoneList(); }
+ QCameraFocusZoneList focusZones() const override { return QCameraFocusZoneList(); }
};
diff --git a/src/multimedia/camera/qcameraimagecapture.h b/src/multimedia/camera/qcameraimagecapture.h
index 3f3c6bd26..12feb9eec 100644
--- a/src/multimedia/camera/qcameraimagecapture.h
+++ b/src/multimedia/camera/qcameraimagecapture.h
@@ -93,7 +93,7 @@ public:
bool isAvailable() const;
QMultimedia::AvailabilityStatus availability() const;
- QMediaObject *mediaObject() const;
+ QMediaObject *mediaObject() const override;
Error error() const;
QString errorString() const;
@@ -135,7 +135,7 @@ Q_SIGNALS:
void imageSaved(int id, const QString &fileName);
protected:
- bool setMediaObject(QMediaObject *);
+ bool setMediaObject(QMediaObject *) override;
QCameraImageCapturePrivate *d_ptr;
private:
diff --git a/src/multimedia/camera/qcameraimageprocessing.cpp b/src/multimedia/camera/qcameraimageprocessing.cpp
index 431e3202d..91ba1d566 100644
--- a/src/multimedia/camera/qcameraimageprocessing.cpp
+++ b/src/multimedia/camera/qcameraimageprocessing.cpp
@@ -101,10 +101,10 @@ public:
QCameraImageProcessingControl(parent)
{}
- bool isParameterSupported(ProcessingParameter) const { return false; }
- bool isParameterValueSupported(ProcessingParameter, const QVariant &) const { return false; }
- QVariant parameter(ProcessingParameter) const { return QVariant(); }
- void setParameter(ProcessingParameter, const QVariant &) {}
+ bool isParameterSupported(ProcessingParameter) const override { return false; }
+ bool isParameterValueSupported(ProcessingParameter, const QVariant &) const override { return false; }
+ QVariant parameter(ProcessingParameter) const override { return QVariant(); }
+ void setParameter(ProcessingParameter, const QVariant &) override {}
};
diff --git a/src/multimedia/configure.json b/src/multimedia/configure.json
index e7758f0c8..2d51102f5 100644
--- a/src/multimedia/configure.json
+++ b/src/multimedia/configure.json
@@ -179,7 +179,7 @@
"features": {
"alsa": {
"label": "ALSA",
- "condition": "config.unix && libs.alsa",
+ "condition": "config.unix && !config.qnx && libs.alsa",
"output": [ "feature", "privateFeature" ]
},
"avfoundation": {
diff --git a/src/multimedia/doc/src/platform-notes-ios.qdoc b/src/multimedia/doc/src/platform-notes-ios.qdoc
new file mode 100644
index 000000000..81e9ea0c5
--- /dev/null
+++ b/src/multimedia/doc/src/platform-notes-ios.qdoc
@@ -0,0 +1,43 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Free Documentation License Usage
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of
+** this file. Please review the following information to ensure
+** the GNU Free Documentation License version 1.3 requirements
+** will be met: http://www.gnu.org/copyleft/fdl.html.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+\page qtmultimedia-ios.html
+\title Qt Multimedia on iOS
+\brief Platform notes for iOS
+
+This page covers the availability of Qt Multimedia features on iOS.
+
+\section1 Limitations
+
+Since Qt Multimedia for iOS uses the camera, the \c Info.plist assigned to
+QMAKE_INFO_PLIST in the project file must contain the key
+\c NSCameraUsageDescription. Otherwise the application will
+abort on startup. See Info.plist documentation from Apple for more information
+regarding this key.
+
+*/
diff --git a/src/multimedia/doc/src/qtmultimedia-index.qdoc b/src/multimedia/doc/src/qtmultimedia-index.qdoc
index 553732fd1..dfc9c3f15 100644
--- a/src/multimedia/doc/src/qtmultimedia-index.qdoc
+++ b/src/multimedia/doc/src/qtmultimedia-index.qdoc
@@ -158,6 +158,7 @@
\list
\li \l{Qt Multimedia on Windows}{Windows}
+ \li \l{Qt Multimedia on iOS}{iOS}
\endlist
\section2 Reference
diff --git a/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h b/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h
index 768f9c30d..e03da1ab5 100644
--- a/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h
+++ b/src/multimedia/gsttools_headers/qgstbufferpoolinterface_p.h
@@ -96,11 +96,11 @@ public:
explicit QGstBufferPoolPlugin(QObject *parent = 0);
virtual ~QGstBufferPoolPlugin() {}
- virtual bool isFormatSupported(const QVideoSurfaceFormat &format) const = 0;
- virtual GstBuffer *takeBuffer(const QVideoSurfaceFormat &format, GstCaps *caps) = 0;
- virtual void clear() = 0;
+ bool isFormatSupported(const QVideoSurfaceFormat &format) const override = 0;
+ GstBuffer *takeBuffer(const QVideoSurfaceFormat &format, GstCaps *caps) override = 0;
+ void clear() override = 0;
- virtual QAbstractVideoBuffer::HandleType handleType() const = 0;
+ QAbstractVideoBuffer::HandleType handleType() const override = 0;
/*!
Build an QAbstractVideoBuffer instance from compatible GstBuffer.
@@ -108,7 +108,7 @@ public:
This method is called from gstreamer video sink thread.
*/
- virtual QAbstractVideoBuffer *prepareVideoBuffer(GstBuffer *buffer, int bytesPerLine) = 0;
+ QAbstractVideoBuffer *prepareVideoBuffer(GstBuffer *buffer, int bytesPerLine) override = 0;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/gsttools_headers/qgstcodecsinfo_p.h b/src/multimedia/gsttools_headers/qgstcodecsinfo_p.h
index 64e9ac21f..af1a4486f 100644
--- a/src/multimedia/gsttools_headers/qgstcodecsinfo_p.h
+++ b/src/multimedia/gsttools_headers/qgstcodecsinfo_p.h
@@ -63,22 +63,28 @@ class QGstCodecsInfo
public:
enum ElementType { AudioEncoder, VideoEncoder, Muxer };
+ struct CodecInfo {
+ QString description;
+ QByteArray elementName;
+ GstRank rank;
+ };
+
QGstCodecsInfo(ElementType elementType);
QStringList supportedCodecs() const;
QString codecDescription(const QString &codec) const;
-
-#if GST_CHECK_VERSION(0,10,31)
- static GstCaps* supportedElementCaps(GstElementFactoryListType elementType,
- GstRank minimumRank = GST_RANK_MARGINAL,
- GstPadDirection padDirection = GST_PAD_SRC);
-#endif
+ QByteArray codecElement(const QString &codec) const;
+ QStringList codecOptions(const QString &codec) const;
private:
+ void updateCodecs(ElementType elementType);
+ GList *elementFactories(ElementType elementType) const;
+
QStringList m_codecs;
- QMap<QString,QString> m_codecDescriptions;
+ QMap<QString, CodecInfo> m_codecInfo;
};
+Q_DECLARE_TYPEINFO(QGstCodecsInfo::CodecInfo, Q_MOVABLE_TYPE);
QT_END_NAMESPACE
diff --git a/src/multimedia/gsttools_headers/qgstreameraudioinputselector_p.h b/src/multimedia/gsttools_headers/qgstreameraudioinputselector_p.h
index 9c5ce3052..1a961c6d9 100644
--- a/src/multimedia/gsttools_headers/qgstreameraudioinputselector_p.h
+++ b/src/multimedia/gsttools_headers/qgstreameraudioinputselector_p.h
@@ -63,13 +63,13 @@ public:
QGstreamerAudioInputSelector(QObject *parent);
~QGstreamerAudioInputSelector();
- QList<QString> availableInputs() const;
- QString inputDescription(const QString& name) const;
- QString defaultInput() const;
- QString activeInput() const;
+ QList<QString> availableInputs() const override;
+ QString inputDescription(const QString &name) const override;
+ QString defaultInput() const override;
+ QString activeInput() const override;
public Q_SLOTS:
- void setActiveInput(const QString& name);
+ void setActiveInput(const QString &name) override;
private:
void update();
diff --git a/src/multimedia/gsttools_headers/qgstreameraudioprobecontrol_p.h b/src/multimedia/gsttools_headers/qgstreameraudioprobecontrol_p.h
index d3062c5ad..bacf8c71d 100644
--- a/src/multimedia/gsttools_headers/qgstreameraudioprobecontrol_p.h
+++ b/src/multimedia/gsttools_headers/qgstreameraudioprobecontrol_p.h
@@ -72,8 +72,8 @@ public:
virtual ~QGstreamerAudioProbeControl();
protected:
- void probeCaps(GstCaps *caps);
- bool probeBuffer(GstBuffer *buffer);
+ void probeCaps(GstCaps *caps) override;
+ bool probeBuffer(GstBuffer *buffer) override;
private slots:
void bufferProbed();
diff --git a/src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h b/src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h
index bc3d6703e..e1ac453c7 100644
--- a/src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h
+++ b/src/multimedia/gsttools_headers/qgstreamervideoinputdevicecontrol_p.h
@@ -67,19 +67,19 @@ public:
QGstreamerVideoInputDeviceControl(GstElementFactory *factory, QObject *parent);
~QGstreamerVideoInputDeviceControl();
- int deviceCount() const;
+ int deviceCount() const override;
- QString deviceName(int index) const;
- QString deviceDescription(int index) const;
+ QString deviceName(int index) const override;
+ QString deviceDescription(int index) const override;
- int defaultDevice() const;
- int selectedDevice() const;
+ int defaultDevice() const override;
+ int selectedDevice() const override;
static QString primaryCamera() { return tr("Main camera"); }
static QString secondaryCamera() { return tr("Front camera"); }
public Q_SLOTS:
- void setSelectedDevice(int index);
+ void setSelectedDevice(int index) override;
private:
GstElementFactory *m_factory;
diff --git a/src/multimedia/gsttools_headers/qgstreamervideooverlay_p.h b/src/multimedia/gsttools_headers/qgstreamervideooverlay_p.h
index bed411475..f3066fad8 100644
--- a/src/multimedia/gsttools_headers/qgstreamervideooverlay_p.h
+++ b/src/multimedia/gsttools_headers/qgstreamervideooverlay_p.h
@@ -94,8 +94,8 @@ public:
int saturation() const;
void setSaturation(int saturation);
- bool processSyncMessage(const QGstreamerMessage &message);
- bool processBusMessage(const QGstreamerMessage &message);
+ bool processSyncMessage(const QGstreamerMessage &message) override;
+ bool processBusMessage(const QGstreamerMessage &message) override;
Q_SIGNALS:
void nativeVideoSizeChanged();
@@ -109,7 +109,7 @@ private:
GstElement *findBestVideoSink() const;
void setWindowHandle_helper(WId id);
void updateIsActive();
- void probeCaps(GstCaps *caps);
+ void probeCaps(GstCaps *caps) override;
static void showPrerollFrameChanged(GObject *, GParamSpec *, QGstreamerVideoOverlay *);
GstElement *m_videoSink;
diff --git a/src/multimedia/gsttools_headers/qgstreamervideoprobecontrol_p.h b/src/multimedia/gsttools_headers/qgstreamervideoprobecontrol_p.h
index 7520b7424..b599b0e78 100644
--- a/src/multimedia/gsttools_headers/qgstreamervideoprobecontrol_p.h
+++ b/src/multimedia/gsttools_headers/qgstreamervideoprobecontrol_p.h
@@ -72,8 +72,8 @@ public:
explicit QGstreamerVideoProbeControl(QObject *parent);
virtual ~QGstreamerVideoProbeControl();
- void probeCaps(GstCaps *caps);
- bool probeBuffer(GstBuffer *buffer);
+ void probeCaps(GstCaps *caps) override;
+ bool probeBuffer(GstBuffer *buffer) override;
void startFlushing();
void stopFlushing();
diff --git a/src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h b/src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h
index 6dba54fe4..1d22e1125 100644
--- a/src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h
+++ b/src/multimedia/gsttools_headers/qgstreamervideorenderer_p.h
@@ -67,13 +67,13 @@ public:
QGstreamerVideoRenderer(QObject *parent = 0);
virtual ~QGstreamerVideoRenderer();
- QAbstractVideoSurface *surface() const;
- void setSurface(QAbstractVideoSurface *surface);
+ QAbstractVideoSurface *surface() const override;
+ void setSurface(QAbstractVideoSurface *surface) override;
- GstElement *videoSink();
+ GstElement *videoSink() override;
- void stopRenderer();
- bool isReady() const { return m_surface != 0; }
+ void stopRenderer() override;
+ bool isReady() const override { return m_surface != 0; }
signals:
void sinkChanged();
diff --git a/src/multimedia/gsttools_headers/qgstreamervideowidget_p.h b/src/multimedia/gsttools_headers/qgstreamervideowidget_p.h
index f0a76c152..b2dfece60 100644
--- a/src/multimedia/gsttools_headers/qgstreamervideowidget_p.h
+++ b/src/multimedia/gsttools_headers/qgstreamervideowidget_p.h
@@ -73,31 +73,31 @@ public:
explicit QGstreamerVideoWidgetControl(QObject *parent = 0, const QByteArray &elementName = QByteArray());
virtual ~QGstreamerVideoWidgetControl();
- GstElement *videoSink();
+ GstElement *videoSink() override;
- QWidget *videoWidget();
+ QWidget *videoWidget() override;
- void stopRenderer();
+ void stopRenderer() override;
- Qt::AspectRatioMode aspectRatioMode() const;
- void setAspectRatioMode(Qt::AspectRatioMode mode);
+ Qt::AspectRatioMode aspectRatioMode() const override;
+ void setAspectRatioMode(Qt::AspectRatioMode mode) override;
- bool isFullScreen() const;
- void setFullScreen(bool fullScreen);
+ bool isFullScreen() const override;
+ void setFullScreen(bool fullScreen) override;
- int brightness() const;
- void setBrightness(int brightness);
+ int brightness() const override;
+ void setBrightness(int brightness) override;
- int contrast() const;
- void setContrast(int contrast);
+ int contrast() const override;
+ void setContrast(int contrast) override;
- int hue() const;
- void setHue(int hue);
+ int hue() const override;
+ void setHue(int hue) override;
- int saturation() const;
- void setSaturation(int saturation);
+ int saturation() const override;
+ void setSaturation(int saturation) override;
- bool eventFilter(QObject *object, QEvent *event);
+ bool eventFilter(QObject *object, QEvent *event) override;
signals:
void sinkChanged();
@@ -111,8 +111,8 @@ private:
void createVideoWidget();
void updateWidgetAttributes();
- bool processSyncMessage(const QGstreamerMessage &message);
- bool processBusMessage(const QGstreamerMessage &message);
+ bool processSyncMessage(const QGstreamerMessage &message) override;
+ bool processBusMessage(const QGstreamerMessage &message) override;
QGstreamerVideoOverlay m_videoOverlay;
QGstreamerVideoWidget *m_widget;
diff --git a/src/multimedia/gsttools_headers/qgstreamervideowindow_p.h b/src/multimedia/gsttools_headers/qgstreamervideowindow_p.h
index 949a18773..b489650f9 100644
--- a/src/multimedia/gsttools_headers/qgstreamervideowindow_p.h
+++ b/src/multimedia/gsttools_headers/qgstreamervideowindow_p.h
@@ -73,41 +73,41 @@ public:
explicit QGstreamerVideoWindow(QObject *parent = 0, const QByteArray &elementName = QByteArray());
~QGstreamerVideoWindow();
- WId winId() const;
- void setWinId(WId id);
+ WId winId() const override;
+ void setWinId(WId id) override;
- QRect displayRect() const;
- void setDisplayRect(const QRect &rect);
+ QRect displayRect() const override;
+ void setDisplayRect(const QRect &rect) override;
- bool isFullScreen() const;
- void setFullScreen(bool fullScreen);
+ bool isFullScreen() const override;
+ void setFullScreen(bool fullScreen) override;
- QSize nativeSize() const;
+ QSize nativeSize() const override;
- Qt::AspectRatioMode aspectRatioMode() const;
- void setAspectRatioMode(Qt::AspectRatioMode mode);
+ Qt::AspectRatioMode aspectRatioMode() const override;
+ void setAspectRatioMode(Qt::AspectRatioMode mode) override;
- void repaint();
+ void repaint() override;
- int brightness() const;
- void setBrightness(int brightness);
+ int brightness() const override;
+ void setBrightness(int brightness) override;
- int contrast() const;
- void setContrast(int contrast);
+ int contrast() const override;
+ void setContrast(int contrast) override;
- int hue() const;
- void setHue(int hue);
+ int hue() const override;
+ void setHue(int hue) override;
- int saturation() const;
- void setSaturation(int saturation);
+ int saturation() const override;
+ void setSaturation(int saturation) override;
QAbstractVideoSurface *surface() const;
- GstElement *videoSink();
+ GstElement *videoSink() override;
- bool processSyncMessage(const QGstreamerMessage &message);
- bool processBusMessage(const QGstreamerMessage &message);
- bool isReady() const { return m_windowId != 0; }
+ bool processSyncMessage(const QGstreamerMessage &message) override;
+ bool processBusMessage(const QGstreamerMessage &message) override;
+ bool isReady() const override { return m_windowId != 0; }
signals:
void sinkChanged();
diff --git a/src/multimedia/gsttools_headers/qgstutils_p.h b/src/multimedia/gsttools_headers/qgstutils_p.h
index 68c9ecda1..8b7de3661 100644
--- a/src/multimedia/gsttools_headers/qgstutils_p.h
+++ b/src/multimedia/gsttools_headers/qgstutils_p.h
@@ -146,6 +146,7 @@ namespace QGstUtils {
QSize structurePixelAspectRatio(const GstStructure *s);
QPair<qreal, qreal> structureFrameRateRange(const GstStructure *s);
+ QString fileExtensionForMimeType(const QString &mimeType);
}
void qt_gst_object_ref_sink(gpointer object);
diff --git a/src/multimedia/gsttools_headers/qgstvideobuffer_p.h b/src/multimedia/gsttools_headers/qgstvideobuffer_p.h
index 92128b92e..d2802d9a2 100644
--- a/src/multimedia/gsttools_headers/qgstvideobuffer_p.h
+++ b/src/multimedia/gsttools_headers/qgstvideobuffer_p.h
@@ -77,17 +77,17 @@ public:
~QGstVideoBuffer();
- MapMode mapMode() const;
+ MapMode mapMode() const override;
#if GST_CHECK_VERSION(1,0,0)
- int map(MapMode mode, int *numBytes, int bytesPerLine[4], uchar *data[4]);
+ int map(MapMode mode, int *numBytes, int bytesPerLine[4], uchar *data[4]) override;
#else
- uchar *map(MapMode mode, int *numBytes, int *bytesPerLine);
+ uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) override;
#endif
- void unmap();
+ void unmap() override;
- QVariant handle() const { return m_handle; }
+ QVariant handle() const override { return m_handle; }
private:
#if GST_CHECK_VERSION(1,0,0)
GstVideoInfo m_videoInfo;
diff --git a/src/multimedia/gsttools_headers/qgstvideorendererplugin_p.h b/src/multimedia/gsttools_headers/qgstvideorendererplugin_p.h
index 433cdf8e5..6a0c4c6bd 100644
--- a/src/multimedia/gsttools_headers/qgstvideorendererplugin_p.h
+++ b/src/multimedia/gsttools_headers/qgstvideorendererplugin_p.h
@@ -100,7 +100,7 @@ public:
explicit QGstVideoRendererPlugin(QObject *parent = 0);
virtual ~QGstVideoRendererPlugin() {}
- virtual QGstVideoRenderer *createRenderer() = 0;
+ QGstVideoRenderer *createRenderer() override = 0;
};
diff --git a/src/multimedia/gsttools_headers/qgstvideorenderersink_p.h b/src/multimedia/gsttools_headers/qgstvideorenderersink_p.h
index ff59810bc..3971c959d 100644
--- a/src/multimedia/gsttools_headers/qgstvideorenderersink_p.h
+++ b/src/multimedia/gsttools_headers/qgstvideorenderersink_p.h
@@ -76,14 +76,14 @@ public:
QGstDefaultVideoRenderer();
~QGstDefaultVideoRenderer();
- GstCaps *getCaps(QAbstractVideoSurface *surface);
- bool start(QAbstractVideoSurface *surface, GstCaps *caps);
- void stop(QAbstractVideoSurface *surface);
+ GstCaps *getCaps(QAbstractVideoSurface *surface) override;
+ bool start(QAbstractVideoSurface *surface, GstCaps *caps) override;
+ void stop(QAbstractVideoSurface *surface) override;
- bool proposeAllocation(GstQuery *query);
+ bool proposeAllocation(GstQuery *query) override;
- bool present(QAbstractVideoSurface *surface, GstBuffer *buffer);
- void flush(QAbstractVideoSurface *surface);
+ bool present(QAbstractVideoSurface *surface, GstBuffer *buffer) override;
+ void flush(QAbstractVideoSurface *surface) override;
private:
QVideoSurfaceFormat m_format;
@@ -109,7 +109,7 @@ public:
GstFlowReturn render(GstBuffer *buffer);
- bool event(QEvent *event);
+ bool event(QEvent *event) override;
private slots:
bool handleEvent(QMutexLocker *locker);
diff --git a/src/multimedia/playback/playback.pri b/src/multimedia/playback/playback.pri
index 3bbb8ce15..cc55fc1b0 100644
--- a/src/multimedia/playback/playback.pri
+++ b/src/multimedia/playback/playback.pri
@@ -12,7 +12,7 @@ PRIVATE_HEADERS += \
playback/qmediaplaylistioplugin_p.h \
playback/qmediaplaylistnavigator_p.h \
playback/qmedianetworkplaylistprovider_p.h \
- playback/playlistfileparser_p.h
+ playback/qplaylistfileparser_p.h
SOURCES += \
playback/qmedianetworkplaylistprovider.cpp \
@@ -23,4 +23,4 @@ SOURCES += \
playback/qmediaplaylistnavigator.cpp \
playback/qmediaplaylistprovider.cpp \
playback/qmediaresource.cpp \
- playback/playlistfileparser.cpp
+ playback/qplaylistfileparser.cpp
diff --git a/src/multimedia/playback/qmedianetworkplaylistprovider.cpp b/src/multimedia/playback/qmedianetworkplaylistprovider.cpp
index 7de90d9a1..a4ad97251 100644
--- a/src/multimedia/playback/qmedianetworkplaylistprovider.cpp
+++ b/src/multimedia/playback/qmedianetworkplaylistprovider.cpp
@@ -41,7 +41,7 @@
#include "qmediaplaylistprovider_p.h"
#include "qmediacontent.h"
#include "qmediaobject_p.h"
-#include "playlistfileparser_p.h"
+#include "qplaylistfileparser_p.h"
QT_BEGIN_NAMESPACE
@@ -62,8 +62,8 @@ public:
bool QMediaNetworkPlaylistProviderPrivate::load(const QNetworkRequest &request)
{
- parser.stop();
- parser.start(request, false);
+ parser.abort();
+ parser.start(request);
return true;
}
@@ -83,12 +83,14 @@ void QMediaNetworkPlaylistProviderPrivate::_q_handleParserError(QPlaylistFilePar
case QPlaylistFileParser::FormatNotSupportedError:
playlistError = QMediaPlaylist::FormatNotSupportedError;
break;
+ case QPlaylistFileParser::ResourceError:
+ // fall through
case QPlaylistFileParser::NetworkError:
playlistError = QMediaPlaylist::NetworkError;
break;
}
- parser.stop();
+ parser.abort();
emit q->loadFailed(playlistError, errorMessage);
}
diff --git a/src/multimedia/playback/qmedianetworkplaylistprovider_p.h b/src/multimedia/playback/qmedianetworkplaylistprovider_p.h
index 94595751b..3d1ffe66a 100644
--- a/src/multimedia/playback/qmedianetworkplaylistprovider_p.h
+++ b/src/multimedia/playback/qmedianetworkplaylistprovider_p.h
@@ -62,26 +62,26 @@ class Q_MULTIMEDIA_EXPORT QMediaNetworkPlaylistProvider : public QMediaPlaylistP
Q_OBJECT
public:
QMediaNetworkPlaylistProvider(QObject *parent=0);
- virtual ~QMediaNetworkPlaylistProvider();
+ ~QMediaNetworkPlaylistProvider();
- virtual bool load(const QNetworkRequest &request, const char *format = 0);
+ bool load(const QNetworkRequest &request, const char *format = 0) override;
- virtual int mediaCount() const;
- virtual QMediaContent media(int pos) const;
+ int mediaCount() const override;
+ QMediaContent media(int pos) const override;
- virtual bool isReadOnly() const;
+ bool isReadOnly() const override;
- virtual bool addMedia(const QMediaContent &content);
- virtual bool addMedia(const QList<QMediaContent> &items);
- virtual bool insertMedia(int pos, const QMediaContent &content);
- virtual bool insertMedia(int pos, const QList<QMediaContent> &items);
- virtual bool moveMedia(int from, int to);
- virtual bool removeMedia(int pos);
- virtual bool removeMedia(int start, int end);
- virtual bool clear();
+ bool addMedia(const QMediaContent &content) override;
+ bool addMedia(const QList<QMediaContent> &items) override;
+ bool insertMedia(int pos, const QMediaContent &content) override;
+ bool insertMedia(int pos, const QList<QMediaContent> &items) override;
+ bool moveMedia(int from, int to) override;
+ bool removeMedia(int pos) override;
+ bool removeMedia(int start, int end) override;
+ bool clear() override;
public Q_SLOTS:
- virtual void shuffle();
+ void shuffle() override;
private:
Q_DISABLE_COPY(QMediaNetworkPlaylistProvider)
diff --git a/src/multimedia/playback/qmediaplayer.h b/src/multimedia/playback/qmediaplayer.h
index f8d91b999..f23a94104 100644
--- a/src/multimedia/playback/qmediaplayer.h
+++ b/src/multimedia/playback/qmediaplayer.h
@@ -157,7 +157,7 @@ public:
QNetworkConfiguration currentNetworkConfiguration() const;
- QMultimedia::AvailabilityStatus availability() const;
+ QMultimedia::AvailabilityStatus availability() const override;
QAudio::Role audioRole() const;
void setAudioRole(QAudio::Role audioRole);
@@ -205,8 +205,8 @@ Q_SIGNALS:
void networkConfigurationChanged(const QNetworkConfiguration &configuration);
public:
- virtual bool bind(QObject *);
- virtual void unbind(QObject *);
+ bool bind(QObject *) override;
+ void unbind(QObject *) override;
private:
Q_DISABLE_COPY(QMediaPlayer)
diff --git a/src/multimedia/playback/qmediaplaylist.h b/src/multimedia/playback/qmediaplaylist.h
index 05ab8f42e..b16e734f8 100644
--- a/src/multimedia/playback/qmediaplaylist.h
+++ b/src/multimedia/playback/qmediaplaylist.h
@@ -70,7 +70,7 @@ public:
explicit QMediaPlaylist(QObject *parent = Q_NULLPTR);
virtual ~QMediaPlaylist();
- QMediaObject *mediaObject() const;
+ QMediaObject *mediaObject() const override;
PlaybackMode playbackMode() const;
void setPlaybackMode(PlaybackMode mode);
@@ -129,7 +129,7 @@ Q_SIGNALS:
void loadFailed();
protected:
- bool setMediaObject(QMediaObject *object);
+ bool setMediaObject(QMediaObject *object) override;
QMediaPlaylistPrivate *d_ptr;
private:
diff --git a/src/multimedia/playback/qmediaplaylist_p.h b/src/multimedia/playback/qmediaplaylist_p.h
index 0c3375ba7..8e081dd67 100644
--- a/src/multimedia/playback/qmediaplaylist_p.h
+++ b/src/multimedia/playback/qmediaplaylist_p.h
@@ -141,26 +141,26 @@ public:
connect(m_navigator, SIGNAL(playbackModeChanged(QMediaPlaylist::PlaybackMode)), SIGNAL(playbackModeChanged(QMediaPlaylist::PlaybackMode)));
}
- virtual ~QMediaNetworkPlaylistControl() {};
+ ~QMediaNetworkPlaylistControl() {}
- QMediaPlaylistProvider* playlistProvider() const { return m_navigator->playlist(); }
- bool setPlaylistProvider(QMediaPlaylistProvider *mediaPlaylist)
+ QMediaPlaylistProvider* playlistProvider() const override { return m_navigator->playlist(); }
+ bool setPlaylistProvider(QMediaPlaylistProvider *mediaPlaylist) override
{
m_navigator->setPlaylist(mediaPlaylist);
emit playlistProviderChanged();
return true;
}
- int currentIndex() const { return m_navigator->currentIndex(); }
- void setCurrentIndex(int position) { m_navigator->jump(position); }
- int nextIndex(int steps) const { return m_navigator->nextIndex(steps); }
- int previousIndex(int steps) const { return m_navigator->previousIndex(steps); }
+ int currentIndex() const override { return m_navigator->currentIndex(); }
+ void setCurrentIndex(int position) override { m_navigator->jump(position); }
+ int nextIndex(int steps) const override { return m_navigator->nextIndex(steps); }
+ int previousIndex(int steps) const override { return m_navigator->previousIndex(steps); }
- void next() { m_navigator->next(); }
- void previous() { m_navigator->previous(); }
+ void next() override { m_navigator->next(); }
+ void previous() override { m_navigator->previous(); }
- QMediaPlaylist::PlaybackMode playbackMode() const { return m_navigator->playbackMode(); }
- void setPlaybackMode(QMediaPlaylist::PlaybackMode mode) { m_navigator->setPlaybackMode(mode); }
+ QMediaPlaylist::PlaybackMode playbackMode() const override { return m_navigator->playbackMode(); }
+ void setPlaybackMode(QMediaPlaylist::PlaybackMode mode) override { m_navigator->setPlaybackMode(mode); }
private:
QMediaPlaylistNavigator *m_navigator;
diff --git a/src/multimedia/playback/qmediaplaylistioplugin_p.h b/src/multimedia/playback/qmediaplaylistioplugin_p.h
index 73281b2bf..1e157d135 100644
--- a/src/multimedia/playback/qmediaplaylistioplugin_p.h
+++ b/src/multimedia/playback/qmediaplaylistioplugin_p.h
@@ -107,17 +107,17 @@ Q_OBJECT
Q_INTERFACES(QMediaPlaylistIOInterface)
public:
explicit QMediaPlaylistIOPlugin(QObject *parent = 0);
- virtual ~QMediaPlaylistIOPlugin();
+ ~QMediaPlaylistIOPlugin();
- virtual bool canRead(QIODevice *device, const QByteArray &format = QByteArray() ) const = 0;
- virtual bool canRead(const QUrl& location, const QByteArray &format = QByteArray()) const = 0;
+ bool canRead(QIODevice *device, const QByteArray &format = QByteArray() ) const override = 0;
+ bool canRead(const QUrl& location, const QByteArray &format = QByteArray()) const override = 0;
- virtual bool canWrite(QIODevice *device, const QByteArray &format) const = 0;
+ bool canWrite(QIODevice *device, const QByteArray &format) const override = 0;
- virtual QMediaPlaylistReader *createReader(QIODevice *device, const QByteArray &format = QByteArray()) = 0;
- virtual QMediaPlaylistReader *createReader(const QUrl& location, const QByteArray &format = QByteArray()) = 0;
+ QMediaPlaylistReader *createReader(QIODevice *device, const QByteArray &format = QByteArray()) override = 0;
+ QMediaPlaylistReader *createReader(const QUrl& location, const QByteArray &format = QByteArray()) override = 0;
- virtual QMediaPlaylistWriter *createWriter(QIODevice *device, const QByteArray &format) = 0;
+ QMediaPlaylistWriter *createWriter(QIODevice *device, const QByteArray &format) override = 0;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/playback/qmediaplaylistnavigator.cpp b/src/multimedia/playback/qmediaplaylistnavigator.cpp
index 1da7329ec..192fd463c 100644
--- a/src/multimedia/playback/qmediaplaylistnavigator.cpp
+++ b/src/multimedia/playback/qmediaplaylistnavigator.cpp
@@ -50,9 +50,9 @@ class QMediaPlaylistNullProvider : public QMediaPlaylistProvider
{
public:
QMediaPlaylistNullProvider() :QMediaPlaylistProvider() {}
- virtual ~QMediaPlaylistNullProvider() {}
- virtual int mediaCount() const {return 0;}
- virtual QMediaContent media(int) const { return QMediaContent(); }
+ ~QMediaPlaylistNullProvider() {}
+ int mediaCount() const override {return 0;}
+ QMediaContent media(int) const override { return QMediaContent(); }
};
Q_GLOBAL_STATIC(QMediaPlaylistNullProvider, _q_nullMediaPlaylist)
diff --git a/src/multimedia/playback/playlistfileparser.cpp b/src/multimedia/playback/qplaylistfileparser.cpp
index 237e417a6..d0617d2cf 100644
--- a/src/multimedia/playback/playlistfileparser.cpp
+++ b/src/multimedia/playback/qplaylistfileparser.cpp
@@ -37,31 +37,48 @@
**
****************************************************************************/
-#include "playlistfileparser_p.h"
+#include "qplaylistfileparser_p.h"
#include <qfileinfo.h>
#include <QtCore/QDebug>
+#include <QtCore/qiodevice.h>
#include <QtNetwork/QNetworkReply>
#include <QtNetwork/QNetworkRequest>
+#include "qmediaplayer.h"
#include "qmediaobject_p.h"
-#include <private/qobject_p.h>
#include "qmediametadata.h"
+#include "qmediacontent.h"
+#include "qmediaresource.h"
QT_BEGIN_NAMESPACE
namespace {
-class ParserBase : public QObject
+
+class ParserBase
{
- Q_OBJECT
public:
- ParserBase(QObject *parent)
- : QObject(parent)
+ explicit ParserBase(QPlaylistFileParser *parent)
+ : m_parent(parent)
+ , m_aborted(false)
+ {
+ Q_ASSERT(m_parent);
+ }
+
+ bool parseLine(int lineIndex, const QString& line, const QUrl& root)
{
+ if (m_aborted)
+ return false;
+
+ const bool ok = parseLineImpl(lineIndex, line, root);
+ return ok && !m_aborted;
}
- virtual void parseLine(int lineIndex, const QString& line, const QUrl& root) = 0;
+ virtual void abort() { m_aborted = true; }
+ virtual ~ParserBase() { }
protected:
- QUrl expandToFullPath(const QUrl &root, const QString &line)
+ virtual bool parseLineImpl(int lineIndex, const QString& line, const QUrl& root) = 0;
+
+ static QUrl expandToFullPath(const QUrl &root, const QString &line)
{
// On Linux, backslashes are not converted to forward slashes :/
if (line.startsWith(QLatin1String("//")) || line.startsWith(QLatin1String("\\\\"))) {
@@ -84,22 +101,22 @@ protected:
return url;
}
-Q_SIGNALS:
- void newItem(const QVariant& content);
- void finished();
- void error(QPlaylistFileParser::ParserError err, const QString& errorMsg);
+ void newItemFound(const QVariant& content) { Q_EMIT m_parent->newItem(content); }
+
+private:
+ QPlaylistFileParser *m_parent;
+ bool m_aborted;
};
class M3UParser : public ParserBase
{
public:
- M3UParser(QObject *parent)
- : ParserBase(parent)
+ explicit M3UParser(QPlaylistFileParser *q)
+ : ParserBase(q)
, m_extendedFormat(false)
{
}
-
/*
*
Extended M3U directives
@@ -117,7 +134,7 @@ public:
C:\Documents and Settings\I\My Music\Greatest Hits\Example.ogg
*/
- void parseLine(int lineIndex, const QString& line, const QUrl& root)
+ bool parseLineImpl(int lineIndex, const QString& line, const QUrl& root) override
{
if (line[0] == '#' ) {
if (m_extendedFormat) {
@@ -149,9 +166,11 @@ public:
}
} else {
m_extraInfo[QLatin1String("url")] = expandToFullPath(root, line);
- emit newItem(QVariant(m_extraInfo));
+ newItemFound(QVariant(m_extraInfo));
m_extraInfo.clear();
}
+
+ return true;
}
int getSplitIndex(const QString& line, int startPos)
@@ -172,16 +191,15 @@ public:
}
private:
- bool m_extendedFormat;
QVariantMap m_extraInfo;
+ bool m_extendedFormat;
};
class PLSParser : public ParserBase
{
- Q_OBJECT
public:
- PLSParser(QObject *parent)
- : ParserBase(parent)
+ explicit PLSParser(QPlaylistFileParser *q)
+ : ParserBase(q)
{
}
@@ -223,17 +241,19 @@ NumberOfEntries=2
Version=2
*/
- void parseLine(int, const QString &line, const QUrl &root)
+ bool parseLineImpl(int, const QString &line, const QUrl &root) override
{
// We ignore everything but 'File' entries, since that's the only thing we care about.
if (!line.startsWith(QLatin1String("File")))
- return;
+ return true;
QString value = getValue(line);
if (value.isEmpty())
- return;
+ return true;
- emit newItem(expandToFullPath(root, value));
+ newItemFound(expandToFullPath(root, value));
+
+ return true;
}
QString getValue(const QString& line) {
@@ -247,75 +267,84 @@ Version=2
/////////////////////////////////////////////////////////////////////////////////////////////////
-class QPlaylistFileParserPrivate : public QObjectPrivate
+class QPlaylistFileParserPrivate
{
Q_DECLARE_PUBLIC(QPlaylistFileParser)
public:
- QPlaylistFileParserPrivate()
- : m_source(0)
+ QPlaylistFileParserPrivate(QPlaylistFileParser *q)
+ : q_ptr(q)
+ , m_stream(0)
+ , m_type(QPlaylistFileParser::UNKNOWN)
, m_scanIndex(0)
- , m_utf8(false)
, m_lineIndex(-1)
- , m_type(QPlaylistFileParser::UNKNOWN)
- , m_currentParser(0)
+ , m_utf8(false)
+ , m_aborted(false)
{
}
- void _q_handleData();
- void _q_handleError();
- void _q_handleParserError(QPlaylistFileParser::ParserError err, const QString& errorMsg);
- void _q_handleParserFinished();
+ void handleData();
+ void handleParserFinished();
+ void abort();
+ void reset();
- QNetworkReply *m_source;
+ QScopedPointer<QNetworkReply, QScopedPointerDeleteLater> m_source;
+ QScopedPointer<ParserBase> m_currentParser;
QByteArray m_buffer;
- int m_scanIndex;
QUrl m_root;
- bool m_utf8;
- int m_lineIndex;
- QPlaylistFileParser::FileType m_type;
- ParserBase *m_currentParser;
QNetworkAccessManager m_mgr;
+ QString m_mimeType;
+ QPlaylistFileParser *q_ptr;
+ QIODevice *m_stream;
+ QPlaylistFileParser::FileType m_type;
+ struct ParserJob
+ {
+ QIODevice *m_stream;
+ QMediaResource m_resource;
+ bool isValid() const { return m_stream || !m_resource.isNull(); }
+ void reset() { m_stream = 0; m_resource = QMediaResource(); }
+ } m_pendingJob;
+ int m_scanIndex;
+ int m_lineIndex;
+ bool m_utf8;
+ bool m_aborted;
private:
- void processLine(int startIndex, int length);
+ bool processLine(int startIndex, int length);
};
#define LINE_LIMIT 4096
#define READ_LIMIT 64
-void QPlaylistFileParserPrivate::processLine(int startIndex, int length)
+bool QPlaylistFileParserPrivate::processLine(int startIndex, int length)
{
Q_Q(QPlaylistFileParser);
m_lineIndex++;
if (!m_currentParser) {
- Q_ASSERT(!m_currentParser);
-
- QString mimeType = m_source->header(QNetworkRequest::ContentTypeHeader).toString();
- m_type = QPlaylistFileParser::findPlaylistType(m_root.toString(), mimeType, m_buffer.constData(), m_buffer.size());
+ const QString urlString = m_root.toString();
+ const QString &suffix = !urlString.isEmpty() ? QFileInfo(urlString).suffix() : urlString;
+ const QString &mimeType = m_source->header(QNetworkRequest::ContentTypeHeader).toString();
+ m_type = QPlaylistFileParser::findPlaylistType(suffix, !mimeType.isEmpty() ? mimeType : m_mimeType, m_buffer.constData(), quint32(m_buffer.size()));
switch (m_type) {
case QPlaylistFileParser::UNKNOWN:
emit q->error(QPlaylistFileParser::FormatError,
QPlaylistFileParser::tr("%1 playlist type is unknown").arg(m_root.toString()));
- q->stop();
- return;
+ q->abort();
+ return false;
case QPlaylistFileParser::M3U:
- m_currentParser = new M3UParser(q);
+ m_currentParser.reset(new M3UParser(q));
break;
case QPlaylistFileParser::M3U8:
- m_currentParser = new M3UParser(q);
+ m_currentParser.reset(new M3UParser(q));
m_utf8 = true;
break;
case QPlaylistFileParser::PLS:
- m_currentParser = new PLSParser(q);
+ m_currentParser.reset(new PLSParser(q));
break;
}
- Q_ASSERT(m_currentParser);
- QObject::connect(m_currentParser, SIGNAL(newItem(QVariant)), q, SIGNAL(newItem(QVariant)));
- QObject::connect(m_currentParser, SIGNAL(finished()), q, SLOT(_q_handleParserFinished()));
- QObject::connect(m_currentParser, SIGNAL(error(QPlaylistFileParser::ParserError,QString)),
- q, SLOT(_q_handleParserError(QPlaylistFileParser::ParserError,QString)));
+
+ Q_ASSERT(!m_currentParser.isNull());
}
QString line;
@@ -326,26 +355,28 @@ void QPlaylistFileParserPrivate::processLine(int startIndex, int length)
line = QString::fromLatin1(m_buffer.constData() + startIndex, length).trimmed();
}
if (line.isEmpty())
- return;
+ return true;
Q_ASSERT(m_currentParser);
- m_currentParser->parseLine(m_lineIndex, line, m_root);
+ return m_currentParser->parseLine(m_lineIndex, line, m_root);
}
-void QPlaylistFileParserPrivate::_q_handleData()
+void QPlaylistFileParserPrivate::handleData()
{
Q_Q(QPlaylistFileParser);
- while (m_source->bytesAvailable()) {
+ while (m_source->bytesAvailable() && !m_aborted) {
int expectedBytes = qMin(READ_LIMIT, int(qMin(m_source->bytesAvailable(),
qint64(LINE_LIMIT - m_buffer.size()))));
m_buffer.push_back(m_source->read(expectedBytes));
int processedBytes = 0;
- while (m_scanIndex < m_buffer.length()) {
+ while (m_scanIndex < m_buffer.length() && !m_aborted) {
char s = m_buffer[m_scanIndex];
if (s == '\r' || s == '\n') {
int l = m_scanIndex - processedBytes;
- if (l > 0)
- processLine(processedBytes, l);
+ if (l > 0) {
+ if (!processLine(processedBytes, l))
+ break;
+ }
processedBytes = m_scanIndex + 1;
if (!m_source) {
//some error happened, so exit parsing
@@ -355,11 +386,13 @@ void QPlaylistFileParserPrivate::_q_handleData()
m_scanIndex++;
}
+ if (m_aborted)
+ break;
+
if (m_buffer.length() - processedBytes >= LINE_LIMIT) {
- qWarning() << "error parsing playlist["<< m_root << "] with line content >= 4096 bytes.";
emit q->error(QPlaylistFileParser::FormatError, QPlaylistFileParser::tr("invalid line in playlist file"));
- q->stop();
- return;
+ q->abort();
+ break;
}
if (m_source->isFinished() && !m_source->bytesAvailable()) {
@@ -382,143 +415,226 @@ void QPlaylistFileParserPrivate::_q_handleData()
m_scanIndex = 0;
}
- if (m_source->isFinished()) {
- _q_handleParserFinished();
- }
+ handleParserFinished();
}
-void QPlaylistFileParserPrivate::_q_handleError()
+QPlaylistFileParser::QPlaylistFileParser(QObject *parent)
+ : QObject(parent)
+ , d_ptr(new QPlaylistFileParserPrivate(this))
{
- Q_Q(QPlaylistFileParser);
- emit q->error(QPlaylistFileParser::NetworkError, m_source->errorString());
- q->stop();
+
}
-void QPlaylistFileParserPrivate::_q_handleParserError(QPlaylistFileParser::ParserError err, const QString& errorMsg)
+QPlaylistFileParser::~QPlaylistFileParser()
{
- Q_Q(QPlaylistFileParser);
- emit q->error(err, errorMsg);
+
}
-void QPlaylistFileParserPrivate::_q_handleParserFinished()
+QPlaylistFileParser::FileType QPlaylistFileParser::findByMimeType(const QString &mime)
{
- Q_Q(QPlaylistFileParser);
- bool isParserValid = (m_currentParser != 0);
- if (!isParserValid)
- emit q->error(QPlaylistFileParser::FormatNotSupportedError, QPlaylistFileParser::tr("Empty file provided"));
+ if (mime == QLatin1String("text/uri-list") || mime == QLatin1String("audio/x-mpegurl") || mime == QLatin1String("audio/mpegurl"))
+ return QPlaylistFileParser::M3U;
- q->stop();
+ if (mime == QLatin1String("application/x-mpegURL") || mime == QLatin1String("application/vnd.apple.mpegurl"))
+ return QPlaylistFileParser::M3U8;
- if (isParserValid)
- emit q->finished();
-}
+ if (mime == QLatin1String("audio/x-scpls"))
+ return QPlaylistFileParser::PLS;
+ return QPlaylistFileParser::UNKNOWN;
+}
-QPlaylistFileParser::QPlaylistFileParser(QObject *parent)
- : QObject(*new QPlaylistFileParserPrivate, parent)
+QPlaylistFileParser::FileType QPlaylistFileParser::findBySuffixType(const QString &suffix)
{
+ const QString &s = suffix.toLower();
+
+ if (s == QLatin1String("m3u"))
+ return QPlaylistFileParser::M3U;
+
+ if (s == QLatin1String("m3u8"))
+ return QPlaylistFileParser::M3U8;
+ if (s == QLatin1String("pls"))
+ return QPlaylistFileParser::PLS;
+
+ return QPlaylistFileParser::UNKNOWN;
}
-QPlaylistFileParser::FileType QPlaylistFileParser::findPlaylistType(const QString& uri, const QString& mime, const void *data, quint32 size)
+QPlaylistFileParser::FileType QPlaylistFileParser::findByDataHeader(const char *data, quint32 size)
{
- if (!data || !size)
- return UNKNOWN;
-
- FileType uriType = UNKNOWN;
- QString suffix = QFileInfo(uri).suffix().toLower();
- if (suffix == QLatin1String("m3u"))
- uriType = M3U;
- else if (suffix == QLatin1String("m3u8"))
- uriType = M3U8;
- else if (suffix == QLatin1String("pls"))
- uriType = PLS;
-
- FileType mimeType = UNKNOWN;
- if (mime == QLatin1String("text/uri-list") || mime == QLatin1String("audio/x-mpegurl") || mime == QLatin1String("audio/mpegurl"))
- mimeType = QPlaylistFileParser::M3U;
- else if (mime == QLatin1String("application/x-mpegURL") || mime == QLatin1String("application/vnd.apple.mpegurl"))
- mimeType = QPlaylistFileParser::M3U8;
- else if (mime == QLatin1String("audio/x-scpls"))
- mimeType = QPlaylistFileParser::PLS;
-
- FileType bufferType = UNKNOWN;
- if (size >= 7 && strncmp((const char*)data, "#EXTM3U", 7) == 0)
- bufferType = M3U;
- else if (size >= 10 && strncmp((const char*)data, "[playlist]", 10) == 0)
- bufferType = PLS;
- else {
- // Make sure every line is a text string
- quint32 n;
- for (n = 0; n < size; n++)
- if (!QChar(QLatin1Char(((const char*)data)[n])).isPrint())
- break;
- if (n == size)
- bufferType = M3U;
- }
+ if (!data || size == 0)
+ return QPlaylistFileParser::UNKNOWN;
- if (bufferType == M3U && (uriType == M3U8 || mimeType == M3U8))
- bufferType = M3U8;
+ if (size >= 7 && strncmp(data, "#EXTM3U", 7) == 0)
+ return QPlaylistFileParser::M3U;
+
+ if (size >= 10 && strncmp(data, "[playlist]", 10) == 0)
+ return QPlaylistFileParser::PLS;
+
+ return QPlaylistFileParser::UNKNOWN;
+}
- if (bufferType != UNKNOWN)
- return bufferType;
+QPlaylistFileParser::FileType QPlaylistFileParser::findPlaylistType(const QString& suffix,
+ const QString& mime,
+ const char *data,
+ quint32 size)
+{
- if (uriType != UNKNOWN)
- return uriType;
+ FileType dataHeaderType = findByDataHeader(data, size);
+ if (dataHeaderType != UNKNOWN)
+ return dataHeaderType;
+ FileType mimeType = findByMimeType(mime);
if (mimeType != UNKNOWN)
return mimeType;
+ FileType suffixType = findBySuffixType(suffix);
+ if (suffixType != UNKNOWN)
+ return suffixType;
+
return UNKNOWN;
}
-void QPlaylistFileParser::start(const QNetworkRequest& request, bool utf8)
+/*
+ * Delegating
+ */
+void QPlaylistFileParser::start(const QMediaContent &media, QIODevice *stream)
+{
+ const QMediaResource &mediaResource = media.canonicalResource();
+ const QString &mimeType = mediaResource.mimeType();
+
+ if (stream) {
+ start(stream, mediaResource.mimeType());
+ } else {
+ const QNetworkRequest &request = mediaResource.request();
+ const QUrl &url = mediaResource.url();
+
+ if (request.url().isValid())
+ start(request, mimeType);
+ else
+ start(QNetworkRequest(url), mimeType);
+ }
+}
+
+void QPlaylistFileParser::start(QIODevice *stream, const QString &mimeType)
{
Q_D(QPlaylistFileParser);
- stop();
+ const bool validStream = stream ? (stream->isOpen() && stream->isReadable()) : false;
+
+ if (!validStream) {
+ Q_EMIT error(ResourceError, tr("Invalid stream"));
+ return;
+ }
+
+ if (!d->m_currentParser.isNull()) {
+ abort();
+ d->m_pendingJob = { stream, QMediaResource(QUrl(), mimeType) };
+ return;
+ }
+
+ d->reset();
+ d->m_mimeType = mimeType;
+ d->m_stream = stream;
+ connect(d->m_stream, SIGNAL(readyRead()), this, SLOT(_q_handleData()));
+ d->handleData();
+}
- d->m_type = UNKNOWN;
- d->m_utf8 = utf8;
- d->m_root = request.url();
+void QPlaylistFileParser::start(const QNetworkRequest& request, const QString &mimeType)
+{
+ Q_D(QPlaylistFileParser);
+ const QUrl &url = request.url();
- if (d->m_root.isLocalFile() && !QFile::exists(d->m_root.toLocalFile())) {
- emit error(NetworkError, QString(tr("%1 does not exist")).arg(d->m_root.toString()));
+ if (url.isLocalFile() && !QFile::exists(url.toLocalFile())) {
+ emit error(ResourceError, QString(tr("%1 does not exist")).arg(url.toString()));
return;
}
- d->m_source = d->m_mgr.get(request);
+ if (!d->m_currentParser.isNull()) {
+ abort();
+ d->m_pendingJob = { Q_NULLPTR, QMediaResource(request, mimeType) };
+ return;
+ }
- connect(d->m_source, SIGNAL(readyRead()), this, SLOT(_q_handleData()));
- connect(d->m_source, SIGNAL(finished()), this, SLOT(_q_handleData()));
- connect(d->m_source, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(_q_handleError()));
+ d->reset();
+ d->m_root = url;
+ d->m_mimeType = mimeType;
+ d->m_source.reset(d->m_mgr.get(request));
+ connect(d->m_source.data(), SIGNAL(readyRead()), this, SLOT(handleData()));
+ connect(d->m_source.data(), SIGNAL(finished()), this, SLOT(handleData()));
+ connect(d->m_source.data(), SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(handleError()));
- d->_q_handleData();
+ d->handleData();
}
-void QPlaylistFileParser::stop()
+void QPlaylistFileParser::abort()
{
Q_D(QPlaylistFileParser);
- if (d->m_currentParser) {
- disconnect(d->m_currentParser, SIGNAL(newItem(QVariant)), this, SIGNAL(newItem(QVariant)));
- disconnect(d->m_currentParser, SIGNAL(finished()), this, SLOT(_q_handleParserFinished()));
- disconnect(d->m_currentParser, SIGNAL(error(QPlaylistFileParser::ParserError,QString)),
- this, SLOT(_q_handleParserError(QPlaylistFileParser::ParserError,QString)));
- d->m_currentParser->deleteLater();
- d->m_currentParser = 0;
- }
+ d->abort();
+
+ if (d->m_source)
+ d->m_source->disconnect();
- d->m_buffer.clear();
- d->m_scanIndex = 0;
- d->m_lineIndex = -1;
- if (d->m_source) {
- disconnect(d->m_source, SIGNAL(readyRead()), this, SLOT(_q_handleData()));
- disconnect(d->m_source, SIGNAL(finished()), this, SLOT(_q_handleData()));
- disconnect(d->m_source, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(_q_handleError()));
- d->m_source->deleteLater();
- d->m_source = 0;
+ if (d->m_stream)
+ disconnect(d->m_stream, SIGNAL(readyRead()), this, SLOT(handleData()));
+}
+
+void QPlaylistFileParser::handleData()
+{
+ Q_D(QPlaylistFileParser);
+ d->handleData();
+}
+
+void QPlaylistFileParserPrivate::handleParserFinished()
+{
+ Q_Q(QPlaylistFileParser);
+ const bool isParserValid = !m_currentParser.isNull();
+ if (!isParserValid && !m_aborted)
+ emit q->error(QPlaylistFileParser::FormatNotSupportedError, QPlaylistFileParser::tr("Empty file provided"));
+
+ if (isParserValid && !m_aborted) {
+ m_currentParser.reset();
+ emit q->finished();
}
+
+ if (!m_aborted)
+ q->abort();
+
+ if (!m_source.isNull())
+ m_source.reset();
+
+ if (m_pendingJob.isValid())
+ q->start(m_pendingJob.m_resource, m_pendingJob.m_stream);
+}
+
+void QPlaylistFileParserPrivate::abort()
+{
+ m_aborted = true;
+ if (!m_currentParser.isNull())
+ m_currentParser->abort();
+}
+
+void QPlaylistFileParserPrivate::reset()
+{
+ Q_ASSERT(m_currentParser.isNull());
+ Q_ASSERT(m_source.isNull());
+ m_buffer.clear();
+ m_root.clear();
+ m_mimeType.clear();
+ m_stream = 0;
+ m_type = QPlaylistFileParser::UNKNOWN;
+ m_scanIndex = 0;
+ m_lineIndex = -1;
+ m_utf8 = false;
+ m_aborted = false;
+ m_pendingJob.reset();
+}
+
+void QPlaylistFileParser::handleError()
+{
+ Q_D(QPlaylistFileParser);
+ const QString &errorString = d->m_source->errorString();
+ Q_EMIT error(QPlaylistFileParser::NetworkError, errorString);
+ abort();
}
-#include "moc_playlistfileparser_p.cpp"
-#include "playlistfileparser.moc"
QT_END_NAMESPACE
diff --git a/src/multimedia/playback/playlistfileparser_p.h b/src/multimedia/playback/qplaylistfileparser_p.h
index bdf95fe7a..927dbb739 100644
--- a/src/multimedia/playback/playlistfileparser_p.h
+++ b/src/multimedia/playback/qplaylistfileparser_p.h
@@ -52,10 +52,14 @@
//
#include "qtmultimediaglobal.h"
-#include <QtNetwork/QNetworkRequest>
+#include <QtCore/qobject.h>
QT_BEGIN_NAMESPACE
+class QIODevice;
+class QMediaContent;
+class QNetworkRequest;
+
class QPlaylistFileParserPrivate;
class Q_MULTIMEDIA_EXPORT QPlaylistFileParser : public QObject
@@ -63,6 +67,7 @@ class Q_MULTIMEDIA_EXPORT QPlaylistFileParser : public QObject
Q_OBJECT
public:
QPlaylistFileParser(QObject *parent = 0);
+ ~QPlaylistFileParser();
enum FileType
{
@@ -77,26 +82,39 @@ public:
NoError,
FormatError,
FormatNotSupportedError,
+ ResourceError,
NetworkError
};
- static FileType findPlaylistType(const QString& uri, const QString& mime, const void *data, quint32 size);
-
- void start(const QNetworkRequest &request, bool utf8 = false);
- void stop();
+ void start(const QMediaContent &media, QIODevice *stream = 0);
+ void start(const QNetworkRequest &request, const QString &mimeType = QString());
+ void abort();
Q_SIGNALS:
void newItem(const QVariant& content);
void finished();
void error(QPlaylistFileParser::ParserError err, const QString& errorMsg);
+private Q_SLOTS:
+ void handleData();
+ void handleError();
+
private:
+ void start(QIODevice *stream, const QString &mimeType = QString());
+
+ static FileType findByMimeType(const QString &mime);
+ static FileType findBySuffixType(const QString &suffix);
+ static FileType findByDataHeader(const char *data, quint32 size);
+ static FileType findPlaylistType(QIODevice *device,
+ const QString& mime);
+ static FileType findPlaylistType(const QString &suffix,
+ const QString& mime,
+ const char *data = 0,
+ quint32 size = 0);
+
Q_DISABLE_COPY(QPlaylistFileParser)
Q_DECLARE_PRIVATE(QPlaylistFileParser)
- Q_PRIVATE_SLOT(d_func(), void _q_handleData())
- Q_PRIVATE_SLOT(d_func(), void _q_handleError())
- Q_PRIVATE_SLOT(d_func(), void _q_handleParserError(QPlaylistFileParser::ParserError err, const QString& errorMsg))
- Q_PRIVATE_SLOT(d_func(), void _q_handleParserFinished())
+ QScopedPointer<QPlaylistFileParserPrivate> d_ptr;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/qmediaresourcepolicy_p.cpp b/src/multimedia/qmediaresourcepolicy_p.cpp
index 8c9ea8264..1577f11af 100644
--- a/src/multimedia/qmediaresourcepolicy_p.cpp
+++ b/src/multimedia/qmediaresourcepolicy_p.cpp
@@ -51,24 +51,24 @@ namespace {
{
}
- bool isVideoEnabled() const
+ bool isVideoEnabled() const override
{
return true;
}
- bool isGranted() const
+ bool isGranted() const override
{
return true;
}
- bool isAvailable() const
+ bool isAvailable() const override
{
return true;
}
- void acquire() {}
- void release() {}
- void setVideoEnabled(bool) {}
+ void acquire() override {}
+ void release() override {}
+ void setVideoEnabled(bool) override {}
};
}
diff --git a/src/multimedia/qmediaserviceprovider.cpp b/src/multimedia/qmediaserviceprovider.cpp
index 5d470d6bd..b0783fba6 100644
--- a/src/multimedia/qmediaserviceprovider.cpp
+++ b/src/multimedia/qmediaserviceprovider.cpp
@@ -315,7 +315,7 @@ class QPluginServiceProvider : public QMediaServiceProvider
QMap<const QMediaService*, MediaServiceData> mediaServiceData;
public:
- QMediaService* requestService(const QByteArray &type, const QMediaServiceProviderHint &hint)
+ QMediaService* requestService(const QByteArray &type, const QMediaServiceProviderHint &hint) override
{
QString key(QLatin1String(type.constData()));
@@ -440,7 +440,7 @@ public:
return 0;
}
- void releaseService(QMediaService *service)
+ void releaseService(QMediaService *service) override
{
if (service != 0) {
MediaServiceData d = mediaServiceData.take(service);
@@ -450,7 +450,7 @@ public:
}
}
- QMediaServiceProviderHint::Features supportedFeatures(const QMediaService *service) const
+ QMediaServiceProviderHint::Features supportedFeatures(const QMediaService *service) const override
{
if (service) {
MediaServiceData d = mediaServiceData.value(service);
@@ -470,7 +470,7 @@ public:
QMultimedia::SupportEstimate hasSupport(const QByteArray &serviceType,
const QString &mimeType,
const QStringList& codecs,
- int flags) const
+ int flags) const override
{
const QList<QObject*> instances = loader()->instances(QLatin1String(serviceType));
@@ -522,7 +522,7 @@ public:
return supportEstimate;
}
- QStringList supportedMimeTypes(const QByteArray &serviceType, int flags) const
+ QStringList supportedMimeTypes(const QByteArray &serviceType, int flags) const override
{
const QList<QObject*> instances = loader()->instances(QLatin1String(serviceType));
@@ -569,7 +569,7 @@ public:
return supportedTypes;
}
- QByteArray defaultDevice(const QByteArray &serviceType) const
+ QByteArray defaultDevice(const QByteArray &serviceType) const override
{
const auto instances = loader()->instances(QLatin1String(serviceType));
for (QObject *obj : instances) {
@@ -589,7 +589,7 @@ public:
return QByteArray();
}
- QList<QByteArray> devices(const QByteArray &serviceType) const
+ QList<QByteArray> devices(const QByteArray &serviceType) const override
{
QList<QByteArray> res;
@@ -606,7 +606,7 @@ public:
return res;
}
- QString deviceDescription(const QByteArray &serviceType, const QByteArray &device)
+ QString deviceDescription(const QByteArray &serviceType, const QByteArray &device) override
{
const auto instances = loader()->instances(QLatin1String(serviceType));
for (QObject *obj : instances) {
@@ -622,7 +622,7 @@ public:
return QString();
}
- QCamera::Position cameraPosition(const QByteArray &device) const
+ QCamera::Position cameraPosition(const QByteArray &device) const override
{
const QByteArray serviceType(Q_MEDIASERVICE_CAMERA);
const auto instances = loader()->instances(QString::fromLatin1(serviceType));
@@ -642,7 +642,7 @@ public:
return QCamera::UnspecifiedPosition;
}
- int cameraOrientation(const QByteArray &device) const
+ int cameraOrientation(const QByteArray &device) const override
{
const QByteArray serviceType(Q_MEDIASERVICE_CAMERA);
const auto instances = loader()->instances(QString::fromLatin1(serviceType));
diff --git a/src/multimedia/qmediaserviceproviderplugin.h b/src/multimedia/qmediaserviceproviderplugin.h
index 43fe55d43..6447e319a 100644
--- a/src/multimedia/qmediaserviceproviderplugin.h
+++ b/src/multimedia/qmediaserviceproviderplugin.h
@@ -195,8 +195,8 @@ class Q_MULTIMEDIA_EXPORT QMediaServiceProviderPlugin : public QObject, public Q
Q_INTERFACES(QMediaServiceProviderFactoryInterface)
public:
- virtual QMediaService* create(const QString& key) = 0;
- virtual void release(QMediaService *service) = 0;
+ QMediaService* create(const QString& key) override = 0;
+ void release(QMediaService *service) override = 0;
};
/*!
diff --git a/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h b/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h
index 54282cad4..465821cb1 100644
--- a/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h
+++ b/src/multimedia/qtmultimediaquicktools_headers/qdeclarativevideooutput_p.h
@@ -134,10 +134,10 @@ Q_SIGNALS:
void contentRectChanged();
protected:
- QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);
- void itemChange(ItemChange change, const ItemChangeData &changeData);
- void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
- void releaseResources();
+ QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override;
+ void itemChange(ItemChange change, const ItemChangeData &changeData) override;
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override;
+ void releaseResources() override;
private Q_SLOTS:
void _q_updateMediaObject();
diff --git a/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h b/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h
index ab7c5aa23..c094bed1f 100644
--- a/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h
+++ b/src/multimedia/qtmultimediaquicktools_headers/qsgvideonode_p.h
@@ -101,8 +101,8 @@ class Q_MULTIMEDIAQUICK_EXPORT QSGVideoNodeFactoryPlugin : public QObject, publi
Q_OBJECT
Q_INTERFACES(QSGVideoNodeFactoryInterface)
public:
- virtual QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const = 0;
- virtual QSGVideoNode *createNode(const QVideoSurfaceFormat &format) = 0;
+ QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType handleType) const override = 0;
+ QSGVideoNode *createNode(const QVideoSurfaceFormat &format) override = 0;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/radio/qradiodata.h b/src/multimedia/radio/qradiodata.h
index a5cc09900..826c652ff 100644
--- a/src/multimedia/radio/qradiodata.h
+++ b/src/multimedia/radio/qradiodata.h
@@ -87,7 +87,7 @@ public:
QMultimedia::AvailabilityStatus availability() const;
- QMediaObject *mediaObject() const;
+ QMediaObject *mediaObject() const override;
QString stationId() const;
ProgramType programType() const;
@@ -113,7 +113,7 @@ Q_SIGNALS:
void error(QRadioData::Error error);
protected:
- bool setMediaObject(QMediaObject *);
+ bool setMediaObject(QMediaObject *) override;
QRadioDataPrivate *d_ptr;
private:
diff --git a/src/multimedia/radio/qradiotuner.h b/src/multimedia/radio/qradiotuner.h
index a9de6416d..7952a2e6c 100644
--- a/src/multimedia/radio/qradiotuner.h
+++ b/src/multimedia/radio/qradiotuner.h
@@ -81,7 +81,7 @@ public:
explicit QRadioTuner(QObject *parent = Q_NULLPTR);
~QRadioTuner();
- QMultimedia::AvailabilityStatus availability() const;
+ QMultimedia::AvailabilityStatus availability() const override;
State state() const;
diff --git a/src/multimedia/recording/qmediarecorder.h b/src/multimedia/recording/qmediarecorder.h
index 3ac25129b..a12bcd632 100644
--- a/src/multimedia/recording/qmediarecorder.h
+++ b/src/multimedia/recording/qmediarecorder.h
@@ -109,7 +109,7 @@ public:
explicit QMediaRecorder(QMediaObject *mediaObject, QObject *parent = Q_NULLPTR);
~QMediaRecorder();
- QMediaObject *mediaObject() const;
+ QMediaObject *mediaObject() const override;
bool isAvailable() const;
QMultimedia::AvailabilityStatus availability() const;
@@ -194,7 +194,7 @@ Q_SIGNALS:
protected:
QMediaRecorder(QMediaRecorderPrivate &dd, QMediaObject *mediaObject, QObject *parent = Q_NULLPTR);
- bool setMediaObject(QMediaObject *object);
+ bool setMediaObject(QMediaObject *object) override;
QMediaRecorderPrivate *d_ptr;
private:
diff --git a/src/multimedia/video/qabstractvideobuffer.h b/src/multimedia/video/qabstractvideobuffer.h
index dcefdf7bc..2352c0f3d 100644
--- a/src/multimedia/video/qabstractvideobuffer.h
+++ b/src/multimedia/video/qabstractvideobuffer.h
@@ -107,7 +107,7 @@ public:
QAbstractPlanarVideoBuffer(HandleType type);
virtual ~QAbstractPlanarVideoBuffer();
- uchar *map(MapMode mode, int *numBytes, int *bytesPerLine);
+ uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) override;
virtual int map(MapMode mode, int *numBytes, int bytesPerLine[4], uchar *data[4]) = 0;
protected:
diff --git a/src/multimedia/video/qabstractvideobuffer_p.h b/src/multimedia/video/qabstractvideobuffer_p.h
index 6fbd75a30..9e3ced9b5 100644
--- a/src/multimedia/video/qabstractvideobuffer_p.h
+++ b/src/multimedia/video/qabstractvideobuffer_p.h
@@ -85,7 +85,7 @@ public:
QAbstractPlanarVideoBufferPrivate()
{}
- int map(QAbstractVideoBuffer::MapMode mode, int *numBytes, int bytesPerLine[4], uchar *data[4]);
+ int map(QAbstractVideoBuffer::MapMode mode, int *numBytes, int bytesPerLine[4], uchar *data[4]) override;
private:
Q_DECLARE_PUBLIC(QAbstractPlanarVideoBuffer)
diff --git a/src/multimedia/video/qimagevideobuffer_p.h b/src/multimedia/video/qimagevideobuffer_p.h
index 6fa742c88..f2b88dd9b 100644
--- a/src/multimedia/video/qimagevideobuffer_p.h
+++ b/src/multimedia/video/qimagevideobuffer_p.h
@@ -67,10 +67,10 @@ public:
QImageVideoBuffer(const QImage &image);
~QImageVideoBuffer();
- MapMode mapMode() const;
+ MapMode mapMode() const override;
- uchar *map(MapMode mode, int *numBytes, int *bytesPerLine);
- void unmap();
+ uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) override;
+ void unmap() override;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/video/qmemoryvideobuffer_p.h b/src/multimedia/video/qmemoryvideobuffer_p.h
index 132f9367c..e1b1f83a9 100644
--- a/src/multimedia/video/qmemoryvideobuffer_p.h
+++ b/src/multimedia/video/qmemoryvideobuffer_p.h
@@ -65,10 +65,10 @@ public:
QMemoryVideoBuffer(const QByteArray &data, int bytesPerLine);
~QMemoryVideoBuffer();
- MapMode mapMode() const;
+ MapMode mapMode() const override;
- uchar *map(MapMode mode, int *numBytes, int *bytesPerLine);
- void unmap();
+ uchar *map(MapMode mode, int *numBytes, int *bytesPerLine) override;
+ void unmap() override;
};
QT_END_NAMESPACE
diff --git a/src/multimedia/video/qvideosurfaceoutput_p.h b/src/multimedia/video/qvideosurfaceoutput_p.h
index bca288191..a1b24abbf 100644
--- a/src/multimedia/video/qvideosurfaceoutput_p.h
+++ b/src/multimedia/video/qvideosurfaceoutput_p.h
@@ -70,12 +70,12 @@ public:
QVideoSurfaceOutput(QObject*parent = 0);
~QVideoSurfaceOutput();
- QMediaObject *mediaObject() const;
+ QMediaObject *mediaObject() const override;
void setVideoSurface(QAbstractVideoSurface *surface);
protected:
- bool setMediaObject(QMediaObject *object);
+ bool setMediaObject(QMediaObject *object) override;
private:
QPointer<QAbstractVideoSurface> m_surface;