summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dist/changes-5.14.125
-rw-r--r--examples/multimedia/video/qmlvideo/main.cpp21
-rw-r--r--examples/multimedia/video/qmlvideo/qmlvideo.pro4
-rw-r--r--examples/multimedia/video/qmlvideofx/main.cpp21
-rw-r--r--examples/multimedia/video/qmlvideofx/qmlvideofx.pro4
-rw-r--r--examples/multimediawidgets/customvideosurface/customvideoitem/videoplayer.cpp4
-rw-r--r--src/gsttools/qgstreamerplayersession.cpp2
-rw-r--r--src/gsttools/qgstutils.cpp2
-rw-r--r--src/imports/multimedia/Video.qml19
-rw-r--r--src/imports/multimedia/plugins.qmltypes36
-rw-r--r--src/imports/multimedia/qdeclarativecamera.cpp17
-rw-r--r--src/imports/multimedia/qdeclarativecamera_p.h5
-rw-r--r--src/multimedia/camera/qcamera.cpp11
-rw-r--r--src/multimedia/camera/qcamera.h3
-rw-r--r--src/multimedia/controls/qaudiodecodercontrol.cpp1
-rw-r--r--src/multimedia/controls/qaudioencodersettingscontrol.cpp1
-rw-r--r--src/multimedia/controls/qaudioinputselectorcontrol.cpp1
-rw-r--r--src/multimedia/controls/qaudiooutputselectorcontrol.cpp1
-rw-r--r--src/multimedia/controls/qaudiorolecontrol.cpp1
-rw-r--r--src/multimedia/controls/qcameracapturebufferformatcontrol.cpp1
-rw-r--r--src/multimedia/controls/qcameracapturedestinationcontrol.cpp1
-rw-r--r--src/multimedia/controls/qcameracontrol.cpp1
-rw-r--r--src/multimedia/controls/qcameraexposurecontrol.cpp1
-rw-r--r--src/multimedia/controls/qcamerafeedbackcontrol.cpp1
-rw-r--r--src/multimedia/controls/qcameraflashcontrol.cpp1
-rw-r--r--src/multimedia/controls/qcamerafocuscontrol.cpp1
-rw-r--r--src/multimedia/controls/qcameraimagecapturecontrol.cpp1
-rw-r--r--src/multimedia/controls/qcameraimageprocessingcontrol.cpp1
-rw-r--r--src/multimedia/controls/qcamerainfocontrol.cpp1
-rw-r--r--src/multimedia/controls/qcameralockscontrol.cpp1
-rw-r--r--src/multimedia/controls/qcameraviewfindersettingscontrol.cpp1
-rw-r--r--src/multimedia/controls/qcamerazoomcontrol.cpp1
-rw-r--r--src/multimedia/controls/qcustomaudiorolecontrol.cpp1
-rw-r--r--src/multimedia/controls/qimageencodercontrol.cpp1
-rw-r--r--src/multimedia/controls/qmediaaudioprobecontrol.cpp1
-rw-r--r--src/multimedia/controls/qmediaavailabilitycontrol.cpp1
-rw-r--r--src/multimedia/controls/qmediacontainercontrol.cpp1
-rw-r--r--src/multimedia/controls/qmediagaplessplaybackcontrol.cpp1
-rw-r--r--src/multimedia/controls/qmedianetworkaccesscontrol.cpp3
-rw-r--r--src/multimedia/controls/qmedianetworkaccesscontrol.h12
-rw-r--r--src/multimedia/controls/qmediaplayercontrol.cpp1
-rw-r--r--src/multimedia/controls/qmediarecordercontrol.cpp1
-rw-r--r--src/multimedia/controls/qmediastreamscontrol.cpp1
-rw-r--r--src/multimedia/controls/qmediavideoprobecontrol.cpp1
-rw-r--r--src/multimedia/controls/qmetadatareadercontrol.cpp1
-rw-r--r--src/multimedia/controls/qmetadatawritercontrol.cpp1
-rw-r--r--src/multimedia/controls/qradiodatacontrol.cpp1
-rw-r--r--src/multimedia/controls/qradiotunercontrol.cpp2
-rw-r--r--src/multimedia/controls/qvideodeviceselectorcontrol.cpp1
-rw-r--r--src/multimedia/controls/qvideoencodersettingscontrol.cpp1
-rw-r--r--src/multimedia/controls/qvideorenderercontrol.cpp1
-rw-r--r--src/multimedia/controls/qvideowindowcontrol.cpp1
-rw-r--r--src/multimedia/doc/snippets/multimedia-snippets/media.cpp31
-rw-r--r--src/multimedia/doc/src/platform-notes-windows.qdoc5
-rw-r--r--src/multimedia/playback/qmediaplayer.cpp33
-rw-r--r--src/multimedia/playback/qmediaplayer.h24
-rw-r--r--src/multimedia/qmediacontrol.cpp1
-rw-r--r--src/multimedia/qmediapluginloader.cpp2
-rw-r--r--src/multimedia/qmediaservice.cpp1
-rw-r--r--src/multimediawidgets/multimediawidgets.pro3
-rw-r--r--src/multimediawidgets/qgraphicsvideoitem.cpp4
-rw-r--r--src/multimediawidgets/qgraphicsvideoitem.h2
-rw-r--r--src/multimediawidgets/qpaintervideosurface.cpp90
-rw-r--r--src/multimediawidgets/qpaintervideosurface_p.h13
-rw-r--r--src/multimediawidgets/qvideowidget.cpp3
-rw-r--r--src/multimediawidgets/qvideowidget.h2
-rw-r--r--src/multimediawidgets/qvideowidget_p.h2
-rw-r--r--src/plugins/alsa/qalsaaudiooutput.cpp2
-rw-r--r--src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp8
-rw-r--r--src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp2
-rw-r--r--src/plugins/avfoundation/camera/avfcamerarenderercontrol.mm4
-rw-r--r--src/plugins/avfoundation/camera/avfcamerasession.mm3
-rw-r--r--src/plugins/avfoundation/camera/avfcamerautility.h2
-rw-r--r--src/plugins/avfoundation/camera/avfcamerautility.mm7
-rw-r--r--src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm55
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h6
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm125
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfvideowidget.mm17
-rw-r--r--src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm9
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinsession.cpp10
-rw-r--r--src/plugins/wmf/player/mfplayersession.cpp3
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput.cpp23
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput_p.h2
-rw-r--r--tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp10
-rw-r--r--tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp20
-rw-r--r--tests/auto/unit/qabstractvideosurface/tst_qabstractvideosurface.cpp18
-rw-r--r--tests/auto/unit/qcamera/tst_qcamera.cpp2
-rw-r--r--tests/auto/unit/qmediaobject/tst_qmediaobject.cpp2
-rw-r--r--tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp105
89 files changed, 620 insertions, 257 deletions
diff --git a/dist/changes-5.14.1 b/dist/changes-5.14.1
new file mode 100644
index 000000000..877e778c3
--- /dev/null
+++ b/dist/changes-5.14.1
@@ -0,0 +1,25 @@
+Qt 5.14.1 is a bug-fix release. It maintains both forward and backward
+compatibility (source and binary) with Qt 5.14.0.
+
+For more details, refer to the online documentation included in this
+distribution. The documentation is also available online:
+
+https://doc.qt.io/qt-5/index.html
+
+The Qt version 5.14 series is binary compatible with the 5.13.x series.
+Applications compiled for 5.13 will continue to run with 5.14.
+
+Some of the changes listed in this file include issue tracking numbers
+corresponding to tasks in the Qt Bug Tracker:
+
+https://bugreports.qt.io/
+
+Each of these identifiers can be entered in the bug tracker to obtain more
+information about a particular change.
+
+****************************************************************************
+* Platform Specific Changes *
+****************************************************************************
+
+- WebGL:
+ * [QTBUG-79181] Fixed video rendering for WebGL on iMX platforms.
diff --git a/examples/multimedia/video/qmlvideo/main.cpp b/examples/multimedia/video/qmlvideo/main.cpp
index e288c0ae4..01178acaa 100644
--- a/examples/multimedia/video/qmlvideo/main.cpp
+++ b/examples/multimedia/video/qmlvideo/main.cpp
@@ -62,6 +62,23 @@
#include "performancemonitordeclarative.h"
#endif
+#ifdef REQUEST_PERMISSIONS_ON_ANDROID
+#include <QtAndroid>
+
+bool requestStoragePermission() {
+ using namespace QtAndroid;
+
+ QString permission = QStringLiteral("android.permission.WRITE_EXTERNAL_STORAGE");
+ const QHash<QString, PermissionResult> results = requestPermissionsSync(QStringList({permission}));
+ if (!results.contains(permission) || results[permission] == PermissionResult::Denied) {
+ qWarning() << "Couldn't get permission: " << permission;
+ return false;
+ }
+
+ return true;
+}
+#endif
+
static const QString DefaultFileName1 = "";
static const QString DefaultFileName2 = "";
@@ -72,6 +89,10 @@ int main(int argc, char *argv[])
#ifdef PERFORMANCEMONITOR_SUPPORT
PerformanceMonitor::qmlRegisterTypes();
#endif
+#ifdef REQUEST_PERMISSIONS_ON_ANDROID
+ if (!requestStoragePermission())
+ return -1;
+#endif
QString source1, source2;
qreal volume = 0.5;
diff --git a/examples/multimedia/video/qmlvideo/qmlvideo.pro b/examples/multimedia/video/qmlvideo/qmlvideo.pro
index 022835f12..dbd3a42a1 100644
--- a/examples/multimedia/video/qmlvideo/qmlvideo.pro
+++ b/examples/multimedia/video/qmlvideo/qmlvideo.pro
@@ -2,6 +2,10 @@ TEMPLATE = app
TARGET = qmlvideo
QT += quick multimedia
+android: qtHaveModule(androidextras) {
+ QT += androidextras
+ DEFINES += REQUEST_PERMISSIONS_ON_ANDROID
+}
LOCAL_SOURCES = main.cpp
LOCAL_HEADERS = trace.h
diff --git a/examples/multimedia/video/qmlvideofx/main.cpp b/examples/multimedia/video/qmlvideofx/main.cpp
index 814c85368..ec547795f 100644
--- a/examples/multimedia/video/qmlvideofx/main.cpp
+++ b/examples/multimedia/video/qmlvideofx/main.cpp
@@ -61,6 +61,23 @@
#include "performancemonitordeclarative.h"
#endif
+#ifdef REQUEST_PERMISSIONS_ON_ANDROID
+#include <QtAndroid>
+
+bool requestStoragePermission() {
+ using namespace QtAndroid;
+
+ QString permission = QStringLiteral("android.permission.WRITE_EXTERNAL_STORAGE");
+ const QHash<QString, PermissionResult> results = requestPermissionsSync(QStringList({permission}));
+ if (!results.contains(permission) || results[permission] == PermissionResult::Denied) {
+ qWarning() << "Couldn't get permission: " << permission;
+ return false;
+ }
+
+ return true;
+}
+#endif
+
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
@@ -68,6 +85,10 @@ int main(int argc, char *argv[])
#ifdef PERFORMANCEMONITOR_SUPPORT
PerformanceMonitor::qmlRegisterTypes();
#endif
+#ifdef REQUEST_PERMISSIONS_ON_ANDROID
+ if (!requestStoragePermission())
+ return -1;
+#endif
QUrl fileName;
qreal volume = 0.5;
diff --git a/examples/multimedia/video/qmlvideofx/qmlvideofx.pro b/examples/multimedia/video/qmlvideofx/qmlvideofx.pro
index 097ad7516..07047aec8 100644
--- a/examples/multimedia/video/qmlvideofx/qmlvideofx.pro
+++ b/examples/multimedia/video/qmlvideofx/qmlvideofx.pro
@@ -2,6 +2,10 @@ TEMPLATE = app
TARGET = qmlvideofx
QT += quick multimedia
+android: qtHaveModule(androidextras) {
+ QT += androidextras
+ DEFINES += REQUEST_PERMISSIONS_ON_ANDROID
+}
SOURCES += filereader.cpp main.cpp
HEADERS += filereader.h trace.h
diff --git a/examples/multimediawidgets/customvideosurface/customvideoitem/videoplayer.cpp b/examples/multimediawidgets/customvideosurface/customvideoitem/videoplayer.cpp
index 1fdd1c7f7..2a9900c2b 100644
--- a/examples/multimediawidgets/customvideosurface/customvideoitem/videoplayer.cpp
+++ b/examples/multimediawidgets/customvideosurface/customvideoitem/videoplayer.cpp
@@ -55,7 +55,7 @@
#include <QVideoSurfaceFormat>
#if !defined(QT_NO_OPENGL)
-# include <QGLWidget>
+# include <QOpenGLWidget>
#endif
VideoPlayer::VideoPlayer(QWidget *parent)
@@ -71,7 +71,7 @@ VideoPlayer::VideoPlayer(QWidget *parent)
QGraphicsView *graphicsView = new QGraphicsView(scene);
#if !defined(QT_NO_OPENGL)
- graphicsView->setViewport(new QGLWidget);
+ graphicsView->setViewport(new QOpenGLWidget);
#endif
scene->addItem(videoItem);
diff --git a/src/gsttools/qgstreamerplayersession.cpp b/src/gsttools/qgstreamerplayersession.cpp
index 1d16df5b7..c6d2df810 100644
--- a/src/gsttools/qgstreamerplayersession.cpp
+++ b/src/gsttools/qgstreamerplayersession.cpp
@@ -497,7 +497,7 @@ void QGstreamerPlayerSession::setPlaybackRate(qreal rate)
gst_element_seek(m_pipeline, rate, GST_FORMAT_TIME,
GstSeekFlags(GST_SEEK_FLAG_FLUSH),
GST_SEEK_TYPE_NONE,0,
- GST_SEEK_TYPE_NONE,0 );
+ GST_SEEK_TYPE_END, 0);
}
emit playbackRateChanged(m_playbackRate);
}
diff --git a/src/gsttools/qgstutils.cpp b/src/gsttools/qgstutils.cpp
index f998c4309..3f68244ba 100644
--- a/src/gsttools/qgstutils.cpp
+++ b/src/gsttools/qgstutils.cpp
@@ -866,7 +866,7 @@ QSet<QString> QGstUtils::supportedMimeTypes(bool (*isValidFactory)(GstElementFac
if (value) {
gchar *str = gst_value_serialize(value);
QString versions = QLatin1String(str);
- const QStringList elements = versions.split(QRegularExpression(QLatin1String("\\D+")), QString::SkipEmptyParts);
+ const QStringList elements = versions.split(QRegularExpression(QLatin1String("\\D+")), Qt::SkipEmptyParts);
for (const QString &e : elements)
supportedMimeTypes.insert(nameLowcase + e);
g_free(str);
diff --git a/src/imports/multimedia/Video.qml b/src/imports/multimedia/Video.qml
index 19c437869..24fde22e1 100644
--- a/src/imports/multimedia/Video.qml
+++ b/src/imports/multimedia/Video.qml
@@ -38,7 +38,7 @@
****************************************************************************/
import QtQuick 2.0
-import QtMultimedia 5.11
+import QtMultimedia 5.13
/*!
\qmltype Video
@@ -125,6 +125,23 @@ Item {
property alias fillMode: videoOut.fillMode
/*!
+ \qmlproperty enumeration Video::flushMode
+
+ Set this property to define what \c Video should show
+ when playback is finished or stopped.
+
+ \list
+ \li VideoOutput.EmptyFrame - clears video output.
+ \li VideoOutput.FirstFrame - shows the first valid frame.
+ \li VideoOutput.LastFrame - shows the last valid frame.
+ \endlist
+
+ The default flush mode is EmptyFrame.
+ \since 5.15
+ */
+ property alias flushMode: videoOut.flushMode
+
+ /*!
\qmlproperty int Video::orientation
The orientation of the \c Video in degrees. Only multiples of 90
diff --git a/src/imports/multimedia/plugins.qmltypes b/src/imports/multimedia/plugins.qmltypes
index 870544160..06fb8918b 100644
--- a/src/imports/multimedia/plugins.qmltypes
+++ b/src/imports/multimedia/plugins.qmltypes
@@ -4,7 +4,7 @@ import QtQuick.tooling 1.2
// It is used for QML tooling purposes only.
//
// This file was auto-generated by:
-// 'qmlplugindump -nonrelocatable QtMultimedia 5.14'
+// 'qmlplugindump -nonrelocatable QtMultimedia 5.15'
Module {
dependencies: ["QtQuick 2.0"]
@@ -288,6 +288,24 @@ Module {
Property { name: "active"; type: "bool" }
}
Component {
+ name: "QAbstractVideoSurface"
+ prototype: "QObject"
+ Property { name: "nativeResolution"; type: "QSize"; isReadonly: true }
+ Signal {
+ name: "activeChanged"
+ Parameter { name: "active"; type: "bool" }
+ }
+ Signal {
+ name: "surfaceFormatChanged"
+ Parameter { name: "format"; type: "QVideoSurfaceFormat" }
+ }
+ Signal { name: "supportedFormatsChanged" }
+ Signal {
+ name: "nativeResolutionChanged"
+ Parameter { name: "resolution"; type: "QSize" }
+ }
+ }
+ Component {
name: "QCamera"
prototype: "QMediaObject"
Enum {
@@ -427,10 +445,11 @@ Module {
"QtMultimedia/Audio 5.9",
"QtMultimedia/MediaPlayer 5.0",
"QtMultimedia/MediaPlayer 5.11",
+ "QtMultimedia/MediaPlayer 5.15",
"QtMultimedia/MediaPlayer 5.6",
"QtMultimedia/MediaPlayer 5.9"
]
- exportMetaObjectRevisions: [0, 3, 1, 2, 0, 3, 1, 2]
+ exportMetaObjectRevisions: [0, 3, 1, 2, 0, 3, 15, 1, 2]
Enum {
name: "Status"
values: {
@@ -524,6 +543,7 @@ Module {
Property { name: "audioRole"; revision: 1; type: "AudioRole" }
Property { name: "customAudioRole"; revision: 3; type: "string" }
Property { name: "notifyInterval"; revision: 2; type: "int" }
+ Property { name: "videoOutput"; revision: 15; type: "QVariant" }
Signal { name: "playlistChanged"; revision: 1 }
Signal { name: "loopCountChanged" }
Signal { name: "paused" }
@@ -541,6 +561,7 @@ Module {
Parameter { name: "errorString"; type: "string" }
}
Signal { name: "notifyIntervalChanged"; revision: 2 }
+ Signal { name: "videoOutputChanged"; revision: 15 }
Method { name: "play" }
Method { name: "pause" }
Method { name: "stop" }
@@ -2025,9 +2046,10 @@ Module {
exports: [
"QtMultimedia/VideoOutput 5.0",
"QtMultimedia/VideoOutput 5.13",
+ "QtMultimedia/VideoOutput 5.15",
"QtMultimedia/VideoOutput 5.2"
]
- exportMetaObjectRevisions: [0, 13, 2]
+ exportMetaObjectRevisions: [0, 13, 15, 2]
Enum {
name: "FlushMode"
values: {
@@ -2052,6 +2074,13 @@ Module {
Property { name: "contentRect"; type: "QRectF"; isReadonly: true }
Property { name: "filters"; type: "QAbstractVideoFilter"; isList: true; isReadonly: true }
Property { name: "flushMode"; revision: 13; type: "FlushMode" }
+ Property {
+ name: "videoSurface"
+ revision: 15
+ type: "QAbstractVideoSurface"
+ isReadonly: true
+ isPointer: true
+ }
Signal {
name: "fillModeChanged"
Parameter { type: "QDeclarativeVideoOutput::FillMode" }
@@ -2124,6 +2153,7 @@ Module {
Parameter { name: "availability"; type: "QMultimedia::AvailabilityStatus" }
}
}
+ Component { name: "QSGVideoItemSurface"; prototype: "QAbstractVideoSurface" }
Component {
name: "QSoundEffect"
prototype: "QObject"
diff --git a/src/imports/multimedia/qdeclarativecamera.cpp b/src/imports/multimedia/qdeclarativecamera.cpp
index 7730c9900..3a9bc8fa2 100644
--- a/src/imports/multimedia/qdeclarativecamera.cpp
+++ b/src/imports/multimedia/qdeclarativecamera.cpp
@@ -59,9 +59,10 @@
QT_BEGIN_NAMESPACE
-void QDeclarativeCamera::_q_error(QCamera::Error errorCode)
+void QDeclarativeCamera::_q_errorOccurred(QCamera::Error errorCode)
{
emit error(Error(errorCode), errorString());
+ emit errorOccurred(Error(errorCode), errorString());
emit errorChanged();
}
@@ -197,7 +198,7 @@ QDeclarativeCamera::QDeclarativeCamera(QObject *parent) :
this, SIGNAL(lockStatusChanged()));
connect(m_camera, &QCamera::stateChanged, this, &QDeclarativeCamera::_q_updateState);
connect(m_camera, SIGNAL(statusChanged(QCamera::Status)), this, SIGNAL(cameraStatusChanged()));
- connect(m_camera, SIGNAL(error(QCamera::Error)), this, SLOT(_q_error(QCamera::Error)));
+ connect(m_camera, SIGNAL(errorOccurred(QCamera::Error)), this, SLOT(_q_errorOccurred(QCamera::Error)));
connect(m_camera, SIGNAL(availabilityChanged(QMultimedia::AvailabilityStatus)),
this, SLOT(_q_availabilityChanged(QMultimedia::AvailabilityStatus)));
@@ -420,7 +421,7 @@ QDeclarativeCamera::Error QDeclarativeCamera::errorCode() const
This property holds the last error string, if any.
- \sa error, errorCode
+ \sa errorOccurred, errorCode
*/
QString QDeclarativeCamera::errorString() const
{
@@ -752,11 +753,19 @@ void QDeclarativeCamera::setDigitalZoom(qreal value)
\value Camera.NotSupportedFeatureError
The feature is not supported.
- \sa error, errorString
+ \sa errorOccurred, errorString
*/
/*!
\qmlsignal QtMultimedia::Camera::error(errorCode, errorString)
+ \obsolete
+
+ Use errorOccurred() instead.
+*/
+
+/*!
+ \qmlsignal QtMultimedia::Camera::errorOccurred(errorCode, errorString)
+ \since 5.15
This signal is emitted when an error specified by \a errorCode occurs.
A descriptive string value is available in \a errorString.
diff --git a/src/imports/multimedia/qdeclarativecamera_p.h b/src/imports/multimedia/qdeclarativecamera_p.h
index 97afa5b53..41203ac80 100644
--- a/src/imports/multimedia/qdeclarativecamera_p.h
+++ b/src/imports/multimedia/qdeclarativecamera_p.h
@@ -308,7 +308,10 @@ public Q_SLOTS:
Q_SIGNALS:
void errorChanged();
+#if QT_DEPRECATED_SINCE(5,15)
void error(QDeclarativeCamera::Error errorCode, const QString &errorString);
+#endif
+ Q_REVISION(15) void errorOccurred(QDeclarativeCamera::Error errorCode, const QString &errorString);
Q_REVISION(1) void deviceIdChanged();
Q_REVISION(1) void positionChanged();
@@ -332,7 +335,7 @@ Q_SIGNALS:
private Q_SLOTS:
void _q_updateState(QCamera::State);
- void _q_error(QCamera::Error);
+ void _q_errorOccurred(QCamera::Error);
void _q_availabilityChanged(QMultimedia::AvailabilityStatus);
protected:
diff --git a/src/multimedia/camera/qcamera.cpp b/src/multimedia/camera/qcamera.cpp
index 40441f332..79412b961 100644
--- a/src/multimedia/camera/qcamera.cpp
+++ b/src/multimedia/camera/qcamera.cpp
@@ -109,6 +109,7 @@ void QCameraPrivate::_q_error(int error, const QString &errorString)
this->error = QCamera::Error(error);
this->errorString = errorString;
+ emit q->errorOccurred(this->error);
emit q->error(this->error);
}
@@ -823,7 +824,7 @@ void QCamera::setCaptureMode(QCamera::CaptureModes mode)
Starts the camera.
State is changed to QCamera::ActiveState if camera is started
- successfully, otherwise error() signal is emitted.
+ successfully, otherwise errorOccurred() signal is emitted.
While the camera state is changed to QCamera::ActiveState,
starting the camera service can be asynchronous with the actual
@@ -1271,6 +1272,14 @@ void QCamera::unlock()
/*!
\fn void QCamera::error(QCamera::Error value)
+ \obsolete
+
+ Use errorOccurred() instead.
+*/
+
+/*!
+ \fn void QCamera::errorOccurred(QCamera::Error value)
+ \since 5.15
Signal emitted when error state changes to \a value.
*/
diff --git a/src/multimedia/camera/qcamera.h b/src/multimedia/camera/qcamera.h
index b2582cd19..97cf4509b 100644
--- a/src/multimedia/camera/qcamera.h
+++ b/src/multimedia/camera/qcamera.h
@@ -242,7 +242,10 @@ Q_SIGNALS:
void lockStatusChanged(QCamera::LockStatus status, QCamera::LockChangeReason reason);
void lockStatusChanged(QCamera::LockType lock, QCamera::LockStatus status, QCamera::LockChangeReason reason);
+#if QT_DEPRECATED_SINCE(5,15)
void error(QCamera::Error);
+#endif
+ void errorOccurred(QCamera::Error);
private:
Q_DISABLE_COPY(QCamera)
diff --git a/src/multimedia/controls/qaudiodecodercontrol.cpp b/src/multimedia/controls/qaudiodecodercontrol.cpp
index 4d6d36a2f..711303174 100644
--- a/src/multimedia/controls/qaudiodecodercontrol.cpp
+++ b/src/multimedia/controls/qaudiodecodercontrol.cpp
@@ -45,6 +45,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QAudioDecoderControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qaudioencodersettingscontrol.cpp b/src/multimedia/controls/qaudioencodersettingscontrol.cpp
index 42f20201c..5ae473178 100644
--- a/src/multimedia/controls/qaudioencodersettingscontrol.cpp
+++ b/src/multimedia/controls/qaudioencodersettingscontrol.cpp
@@ -45,6 +45,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QAudioEncoderSettingsControl
+ \obsolete
\inmodule QtMultimedia
\ingroup multimedia_control
diff --git a/src/multimedia/controls/qaudioinputselectorcontrol.cpp b/src/multimedia/controls/qaudioinputselectorcontrol.cpp
index 0f8843808..649891225 100644
--- a/src/multimedia/controls/qaudioinputselectorcontrol.cpp
+++ b/src/multimedia/controls/qaudioinputselectorcontrol.cpp
@@ -43,6 +43,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QAudioInputSelectorControl
+ \obsolete
\brief The QAudioInputSelectorControl class provides an audio input selector media control.
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qaudiooutputselectorcontrol.cpp b/src/multimedia/controls/qaudiooutputselectorcontrol.cpp
index 20c792f8d..64886e4c9 100644
--- a/src/multimedia/controls/qaudiooutputselectorcontrol.cpp
+++ b/src/multimedia/controls/qaudiooutputselectorcontrol.cpp
@@ -43,6 +43,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QAudioOutputSelectorControl
+ \obsolete
\brief The QAudioOutputSelectorControl class provides an audio output selector media control.
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qaudiorolecontrol.cpp b/src/multimedia/controls/qaudiorolecontrol.cpp
index 7b2341846..01e60a914 100644
--- a/src/multimedia/controls/qaudiorolecontrol.cpp
+++ b/src/multimedia/controls/qaudiorolecontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QAudioRoleControl
+ \obsolete
\inmodule QtMultimedia
\ingroup multimedia_control
\since 5.6
diff --git a/src/multimedia/controls/qcameracapturebufferformatcontrol.cpp b/src/multimedia/controls/qcameracapturebufferformatcontrol.cpp
index 553414681..8f0c3e6e9 100644
--- a/src/multimedia/controls/qcameracapturebufferformatcontrol.cpp
+++ b/src/multimedia/controls/qcameracapturebufferformatcontrol.cpp
@@ -43,6 +43,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QCameraCaptureBufferFormatControl
+ \obsolete
\brief The QCameraCaptureBufferFormatControl class provides a control for setting the capture buffer format.
diff --git a/src/multimedia/controls/qcameracapturedestinationcontrol.cpp b/src/multimedia/controls/qcameracapturedestinationcontrol.cpp
index e037ab5a9..a9a54a3b8 100644
--- a/src/multimedia/controls/qcameracapturedestinationcontrol.cpp
+++ b/src/multimedia/controls/qcameracapturedestinationcontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QCameraCaptureDestinationControl
+ \obsolete
\brief The QCameraCaptureDestinationControl class provides a control for setting capture destination.
diff --git a/src/multimedia/controls/qcameracontrol.cpp b/src/multimedia/controls/qcameracontrol.cpp
index 03a7a073c..d33fa94c9 100644
--- a/src/multimedia/controls/qcameracontrol.cpp
+++ b/src/multimedia/controls/qcameracontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QCameraControl
+ \obsolete
diff --git a/src/multimedia/controls/qcameraexposurecontrol.cpp b/src/multimedia/controls/qcameraexposurecontrol.cpp
index 1434f0976..2095c9cfa 100644
--- a/src/multimedia/controls/qcameraexposurecontrol.cpp
+++ b/src/multimedia/controls/qcameraexposurecontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QCameraExposureControl
+ \obsolete
\brief The QCameraExposureControl class allows controlling camera exposure parameters.
diff --git a/src/multimedia/controls/qcamerafeedbackcontrol.cpp b/src/multimedia/controls/qcamerafeedbackcontrol.cpp
index 07074d83d..42cd7d661 100644
--- a/src/multimedia/controls/qcamerafeedbackcontrol.cpp
+++ b/src/multimedia/controls/qcamerafeedbackcontrol.cpp
@@ -44,6 +44,7 @@
/*!
\class QCameraFeedbackControl
+ \obsolete
\brief The QCameraFeedbackControl class allows controlling feedback (sounds etc) during camera operation.
diff --git a/src/multimedia/controls/qcameraflashcontrol.cpp b/src/multimedia/controls/qcameraflashcontrol.cpp
index d5d9b564f..658e2d56c 100644
--- a/src/multimedia/controls/qcameraflashcontrol.cpp
+++ b/src/multimedia/controls/qcameraflashcontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QCameraFlashControl
+ \obsolete
\brief The QCameraFlashControl class allows controlling a camera's flash.
diff --git a/src/multimedia/controls/qcamerafocuscontrol.cpp b/src/multimedia/controls/qcamerafocuscontrol.cpp
index d963c95d4..b216882b4 100644
--- a/src/multimedia/controls/qcamerafocuscontrol.cpp
+++ b/src/multimedia/controls/qcamerafocuscontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QCameraFocusControl
+ \obsolete
\brief The QCameraFocusControl class supplies control for
diff --git a/src/multimedia/controls/qcameraimagecapturecontrol.cpp b/src/multimedia/controls/qcameraimagecapturecontrol.cpp
index 3c110eb68..0e089d01b 100644
--- a/src/multimedia/controls/qcameraimagecapturecontrol.cpp
+++ b/src/multimedia/controls/qcameraimagecapturecontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QCameraImageCaptureControl
+ \obsolete
\brief The QCameraImageCaptureControl class provides a control interface
for image capture services.
diff --git a/src/multimedia/controls/qcameraimageprocessingcontrol.cpp b/src/multimedia/controls/qcameraimageprocessingcontrol.cpp
index a39846642..fba4bf400 100644
--- a/src/multimedia/controls/qcameraimageprocessingcontrol.cpp
+++ b/src/multimedia/controls/qcameraimageprocessingcontrol.cpp
@@ -51,6 +51,7 @@ Q_CONSTRUCTOR_FUNCTION(qRegisterCameraImageProcessingControlMetaTypes)
/*!
\class QCameraImageProcessingControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qcamerainfocontrol.cpp b/src/multimedia/controls/qcamerainfocontrol.cpp
index de6dc4277..8a4ef3b44 100644
--- a/src/multimedia/controls/qcamerainfocontrol.cpp
+++ b/src/multimedia/controls/qcamerainfocontrol.cpp
@@ -43,6 +43,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QCameraInfoControl
+ \obsolete
\since 5.3
\brief The QCameraInfoControl class provides a camera info media control.
diff --git a/src/multimedia/controls/qcameralockscontrol.cpp b/src/multimedia/controls/qcameralockscontrol.cpp
index 436b3b9c9..27b68cf2c 100644
--- a/src/multimedia/controls/qcameralockscontrol.cpp
+++ b/src/multimedia/controls/qcameralockscontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QCameraLocksControl
+ \obsolete
diff --git a/src/multimedia/controls/qcameraviewfindersettingscontrol.cpp b/src/multimedia/controls/qcameraviewfindersettingscontrol.cpp
index 6fa0ded82..bd5c7a73b 100644
--- a/src/multimedia/controls/qcameraviewfindersettingscontrol.cpp
+++ b/src/multimedia/controls/qcameraviewfindersettingscontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QCameraViewfinderSettingsControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qcamerazoomcontrol.cpp b/src/multimedia/controls/qcamerazoomcontrol.cpp
index 9c8d8d289..1f0835224 100644
--- a/src/multimedia/controls/qcamerazoomcontrol.cpp
+++ b/src/multimedia/controls/qcamerazoomcontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QCameraZoomControl
+ \obsolete
\brief The QCameraZoomControl class supplies control for
diff --git a/src/multimedia/controls/qcustomaudiorolecontrol.cpp b/src/multimedia/controls/qcustomaudiorolecontrol.cpp
index 046219687..f1b89eda5 100644
--- a/src/multimedia/controls/qcustomaudiorolecontrol.cpp
+++ b/src/multimedia/controls/qcustomaudiorolecontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QCustomAudioRoleControl
+ \obsolete
\inmodule QtMultimedia
\ingroup multimedia_control
\since 5.11
diff --git a/src/multimedia/controls/qimageencodercontrol.cpp b/src/multimedia/controls/qimageencodercontrol.cpp
index c29a61662..6223c33c7 100644
--- a/src/multimedia/controls/qimageencodercontrol.cpp
+++ b/src/multimedia/controls/qimageencodercontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QImageEncoderControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qmediaaudioprobecontrol.cpp b/src/multimedia/controls/qmediaaudioprobecontrol.cpp
index 296f01888..e22135903 100644
--- a/src/multimedia/controls/qmediaaudioprobecontrol.cpp
+++ b/src/multimedia/controls/qmediaaudioprobecontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QMediaAudioProbeControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qmediaavailabilitycontrol.cpp b/src/multimedia/controls/qmediaavailabilitycontrol.cpp
index 1a6d73a8a..68b404369 100644
--- a/src/multimedia/controls/qmediaavailabilitycontrol.cpp
+++ b/src/multimedia/controls/qmediaavailabilitycontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QMediaAvailabilityControl
+ \obsolete
\brief The QMediaAvailabilityControl class supplies a control for reporting availability of a service.
diff --git a/src/multimedia/controls/qmediacontainercontrol.cpp b/src/multimedia/controls/qmediacontainercontrol.cpp
index b15c8acdc..2b2c8b78b 100644
--- a/src/multimedia/controls/qmediacontainercontrol.cpp
+++ b/src/multimedia/controls/qmediacontainercontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QMediaContainerControl
+ \obsolete
\brief The QMediaContainerControl class provides access to the output container format of a QMediaService.
diff --git a/src/multimedia/controls/qmediagaplessplaybackcontrol.cpp b/src/multimedia/controls/qmediagaplessplaybackcontrol.cpp
index b76274972..c9f531454 100644
--- a/src/multimedia/controls/qmediagaplessplaybackcontrol.cpp
+++ b/src/multimedia/controls/qmediagaplessplaybackcontrol.cpp
@@ -42,6 +42,7 @@
/*!
\class QMediaGaplessPlaybackControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qmedianetworkaccesscontrol.cpp b/src/multimedia/controls/qmedianetworkaccesscontrol.cpp
index 9e9ad239d..9d3f14501 100644
--- a/src/multimedia/controls/qmedianetworkaccesscontrol.cpp
+++ b/src/multimedia/controls/qmedianetworkaccesscontrol.cpp
@@ -43,7 +43,9 @@ QT_BEGIN_NAMESPACE
/*!
\class QMediaNetworkAccessControl
+ \obsolete
\brief The QMediaNetworkAccessControl class allows the setting of the Network Access Point for media related activities.
+ \obsolete
\inmodule QtMultimedia
@@ -92,6 +94,7 @@ QMediaNetworkAccessControl::~QMediaNetworkAccessControl()
/*!
\fn QMediaNetworkAccessControl::configurationChanged(const QNetworkConfiguration &configuration)
+
This signal is emitted when the current active network configuration changes
to \a configuration.
*/
diff --git a/src/multimedia/controls/qmedianetworkaccesscontrol.h b/src/multimedia/controls/qmedianetworkaccesscontrol.h
index daae4f389..0c14961cf 100644
--- a/src/multimedia/controls/qmedianetworkaccesscontrol.h
+++ b/src/multimedia/controls/qmedianetworkaccesscontrol.h
@@ -41,6 +41,10 @@
#ifndef QMEDIANETWORKACCESSCONTROL_H
#define QMEDIANETWORKACCESSCONTROL_H
+#if 0
+#pragma qt_class(QMediaNetworkAccessControl)
+#endif
+
#include <QtMultimedia/qmediacontrol.h>
#include <QtCore/qlist.h>
@@ -48,10 +52,12 @@
QT_BEGIN_NAMESPACE
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+
// Required for QDoc workaround
class QString;
-
-class Q_MULTIMEDIA_EXPORT QMediaNetworkAccessControl : public QMediaControl
+class QT_DEPRECATED_VERSION_5_15 Q_MULTIMEDIA_EXPORT QMediaNetworkAccessControl : public QMediaControl
{
Q_OBJECT
public:
@@ -71,6 +77,8 @@ protected:
#define QMediaNetworkAccessControl_iid "org.qt-project.qt.medianetworkaccesscontrol/5.0"
Q_MEDIA_DECLARE_CONTROL(QMediaNetworkAccessControl, QMediaNetworkAccessControl_iid)
+QT_WARNING_POP
+
QT_END_NAMESPACE
diff --git a/src/multimedia/controls/qmediaplayercontrol.cpp b/src/multimedia/controls/qmediaplayercontrol.cpp
index 28b217af8..a180413b9 100644
--- a/src/multimedia/controls/qmediaplayercontrol.cpp
+++ b/src/multimedia/controls/qmediaplayercontrol.cpp
@@ -46,6 +46,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QMediaPlayerControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qmediarecordercontrol.cpp b/src/multimedia/controls/qmediarecordercontrol.cpp
index f078073ef..87ace7017 100644
--- a/src/multimedia/controls/qmediarecordercontrol.cpp
+++ b/src/multimedia/controls/qmediarecordercontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QMediaRecorderControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qmediastreamscontrol.cpp b/src/multimedia/controls/qmediastreamscontrol.cpp
index aa5fe007d..2db9eb6fc 100644
--- a/src/multimedia/controls/qmediastreamscontrol.cpp
+++ b/src/multimedia/controls/qmediastreamscontrol.cpp
@@ -52,6 +52,7 @@ Q_CONSTRUCTOR_FUNCTION(qRegisterMediaStreamControlMetaTypes)
/*!
\class QMediaStreamsControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qmediavideoprobecontrol.cpp b/src/multimedia/controls/qmediavideoprobecontrol.cpp
index ea27ab057..4a85d56d0 100644
--- a/src/multimedia/controls/qmediavideoprobecontrol.cpp
+++ b/src/multimedia/controls/qmediavideoprobecontrol.cpp
@@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QMediaVideoProbeControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qmetadatareadercontrol.cpp b/src/multimedia/controls/qmetadatareadercontrol.cpp
index e728353f6..f01ffec38 100644
--- a/src/multimedia/controls/qmetadatareadercontrol.cpp
+++ b/src/multimedia/controls/qmetadatareadercontrol.cpp
@@ -45,6 +45,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QMetaDataReaderControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qmetadatawritercontrol.cpp b/src/multimedia/controls/qmetadatawritercontrol.cpp
index 053597b88..6221edaa1 100644
--- a/src/multimedia/controls/qmetadatawritercontrol.cpp
+++ b/src/multimedia/controls/qmetadatawritercontrol.cpp
@@ -45,6 +45,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QMetaDataWriterControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qradiodatacontrol.cpp b/src/multimedia/controls/qradiodatacontrol.cpp
index df0046b5e..27e192674 100644
--- a/src/multimedia/controls/qradiodatacontrol.cpp
+++ b/src/multimedia/controls/qradiodatacontrol.cpp
@@ -46,6 +46,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QRadioDataControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qradiotunercontrol.cpp b/src/multimedia/controls/qradiotunercontrol.cpp
index ea2126319..20897150b 100644
--- a/src/multimedia/controls/qradiotunercontrol.cpp
+++ b/src/multimedia/controls/qradiotunercontrol.cpp
@@ -46,9 +46,9 @@ QT_BEGIN_NAMESPACE
/*!
\class QRadioTunerControl
+ \obsolete
\inmodule QtMultimedia
-
\ingroup multimedia_control
diff --git a/src/multimedia/controls/qvideodeviceselectorcontrol.cpp b/src/multimedia/controls/qvideodeviceselectorcontrol.cpp
index 8c4ee7ba4..420ba9150 100644
--- a/src/multimedia/controls/qvideodeviceselectorcontrol.cpp
+++ b/src/multimedia/controls/qvideodeviceselectorcontrol.cpp
@@ -43,6 +43,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QVideoDeviceSelectorControl
+ \obsolete
\brief The QVideoDeviceSelectorControl class provides an video device selector media control.
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qvideoencodersettingscontrol.cpp b/src/multimedia/controls/qvideoencodersettingscontrol.cpp
index 52ae51382..64643f6db 100644
--- a/src/multimedia/controls/qvideoencodersettingscontrol.cpp
+++ b/src/multimedia/controls/qvideoencodersettingscontrol.cpp
@@ -45,6 +45,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QVideoEncoderSettingsControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/controls/qvideorenderercontrol.cpp b/src/multimedia/controls/qvideorenderercontrol.cpp
index e722dfa38..eee20d59e 100644
--- a/src/multimedia/controls/qvideorenderercontrol.cpp
+++ b/src/multimedia/controls/qvideorenderercontrol.cpp
@@ -45,6 +45,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QVideoRendererControl
+ \obsolete
\inmodule QtMultimedia
\brief The QVideoRendererControl class provides a media control for rendering video to a QAbstractVideoSurface.
diff --git a/src/multimedia/controls/qvideowindowcontrol.cpp b/src/multimedia/controls/qvideowindowcontrol.cpp
index e971a6925..a6b2bf407 100644
--- a/src/multimedia/controls/qvideowindowcontrol.cpp
+++ b/src/multimedia/controls/qvideowindowcontrol.cpp
@@ -43,6 +43,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QVideoWindowControl
+ \obsolete
\inmodule QtMultimedia
diff --git a/src/multimedia/doc/snippets/multimedia-snippets/media.cpp b/src/multimedia/doc/snippets/multimedia-snippets/media.cpp
index 8ec7cb072..7fd6259ea 100644
--- a/src/multimedia/doc/snippets/multimedia-snippets/media.cpp
+++ b/src/multimedia/doc/snippets/multimedia-snippets/media.cpp
@@ -56,6 +56,7 @@
#include "qaudioprobe.h"
#include "qaudiorecorder.h"
#include "qvideoprobe.h"
+#include <QAbstractVideoSurface>
class MediaExample : public QObject {
Q_OBJECT
@@ -197,6 +198,36 @@ void MediaExample::MediaPlayer()
player->play();
//! [Pipeline]
+ //! [Pipeline Surface]
+ class Surface : public QAbstractVideoSurface
+ {
+ public:
+ Surface(QObject *p) : QAbstractVideoSurface(p) { }
+ QList<QVideoFrame::PixelFormat> supportedPixelFormats(QAbstractVideoBuffer::HandleType) const override
+ {
+ // Make sure that the driver supports this pixel format.
+ return QList<QVideoFrame::PixelFormat>() << QVideoFrame::Format_YUYV;
+ }
+
+ // Video frames are handled here.
+ bool present(const QVideoFrame &) override { return true; }
+ };
+
+ player = new QMediaPlayer;
+ player->setVideoOutput(new Surface(player));
+ player->setMedia(QUrl("gst-pipeline: videotestsrc ! qtvideosink"));
+ player->play();
+ //! [Pipeline Surface]
+
+ //! [Pipeline Widget]
+ player = new QMediaPlayer;
+ videoWidget = new QVideoWidget;
+ videoWidget->show();
+ player->setVideoOutput(videoWidget);
+ player->setMedia(QUrl("gst-pipeline: videotestsrc ! xvimagesink name=\"qtvideosink\""));
+ player->play();
+ //! [Pipeline Widget]
+
//! [Pipeline appsrc]
QImage img("images/qt-logo.png");
img = img.convertToFormat(QImage::Format_ARGB32);
diff --git a/src/multimedia/doc/src/platform-notes-windows.qdoc b/src/multimedia/doc/src/platform-notes-windows.qdoc
index e86d6a276..a69e96d99 100644
--- a/src/multimedia/doc/src/platform-notes-windows.qdoc
+++ b/src/multimedia/doc/src/platform-notes-windows.qdoc
@@ -42,6 +42,11 @@ was introduced in Windows Vista as a replacement for DirectShow and other
multimedia APIs. Consequently, WMF plugin in Qt is supported only for
Windows Vista and later versions of the operating system.
+The environment variable \c QT_MULTIMEDIA_PREFERRED_PLUGINS can be used to
+control the priority of the plugins. For example, setting it to
+"windowsmediafoundation" or "directshow" will cause the corresponding plugin
+to be the preferred one.
+
\section1 Limitations
The WMF plugin in Qt does not currently provide a camera backend. Instead,
diff --git a/src/multimedia/playback/qmediaplayer.cpp b/src/multimedia/playback/qmediaplayer.cpp
index d96cb3a95..3773cfe64 100644
--- a/src/multimedia/playback/qmediaplayer.cpp
+++ b/src/multimedia/playback/qmediaplayer.cpp
@@ -59,6 +59,7 @@
#include <QtCore/qpointer.h>
#include <QtCore/qfileinfo.h>
#include <QtCore/qtemporaryfile.h>
+#include <QDir>
QT_BEGIN_NAMESPACE
@@ -367,6 +368,13 @@ void QMediaPlayerPrivate::setMedia(const QMediaContent &media, QIODevice *stream
control->setMedia(media, file.data());
} else {
#if QT_CONFIG(temporaryfile)
+#if defined(Q_OS_ANDROID)
+ QString tempFileName = QDir::tempPath() + media.request().url().path();
+ QDir().mkpath(QFileInfo(tempFileName).path());
+ QTemporaryFile *tempFile = QTemporaryFile::createNativeFile(*file);
+ if (!tempFile->rename(tempFileName))
+ qWarning() << "Could not rename temporary file to:" << tempFileName;
+#else
QTemporaryFile *tempFile = new QTemporaryFile;
// Preserve original file extension, some backends might not load the file if it doesn't
@@ -385,7 +393,7 @@ void QMediaPlayerPrivate::setMedia(const QMediaContent &media, QIODevice *stream
tempFile->write(buffer, len);
}
tempFile->close();
-
+#endif
file.reset(tempFile);
control->setMedia(QMediaContent(QUrl::fromLocalFile(file->fileName())), nullptr);
#else
@@ -724,6 +732,8 @@ void QMediaPlayer::setPlaylist(QMediaPlaylist *playlist)
}
/*!
+ \obsolete
+
Sets the network access points for remote media playback.
\a configurations contains, in ascending preferential order, a list of
configuration that can be used for network access.
@@ -863,6 +873,8 @@ QString QMediaPlayer::errorString() const
}
/*!
+ \obsolete
+
Returns the current network access point in use.
If a default contructed QNetworkConfiguration is returned
this feature is not available or that none of the
@@ -998,8 +1010,9 @@ void QMediaPlayer::setPlaybackRate(qreal rate)
Sets the current \a media source.
If a \a stream is supplied; media data will be read from it instead of resolving the media
- source. In this case the media source may still be used to resolve additional information
+ source. In this case the url should be provided to resolve additional information
about the media such as mime type. The \a stream must be open and readable.
+ For macOS the \a stream should be also seekable.
Setting the media to a null QMediaContent will cause the player to discard all
information relating to the current media source and to cease all I/O operations related
@@ -1015,8 +1028,17 @@ void QMediaPlayer::setPlaybackRate(qreal rate)
\snippet multimedia-snippets/media.cpp Pipeline
- If the pipeline contains a video sink element named \c qtvideosink,
- current QVideoWidget can be used to render the video.
+ If QAbstractVideoSurface is used as the video output,
+ \c qtvideosink can be used as a video sink element directly in the pipeline.
+ After that the surface will receive the video frames in QAbstractVideoSurface::present().
+
+ \snippet multimedia-snippets/media.cpp Pipeline Surface
+
+ If QVideoWidget is used as the video output
+ and the pipeline contains a video sink element named \c qtvideosink,
+ current QVideoWidget will be used to render the video.
+
+ \snippet multimedia-snippets/media.cpp Pipeline Widget
If the pipeline contains appsrc element, it will be used to push data from \a stream.
@@ -1561,7 +1583,7 @@ QStringList QMediaPlayer::supportedCustomAudioRoles() const
This value is a multiplier applied to the media's standard play rate. By
default this value is 1.0, indicating that the media is playing at the
standard pace. Values higher than 1.0 will increase the rate of play.
- Values less than zero can be set and indicate the media will rewind at the
+ Values less than zero can be set and indicate the media should rewind at the
multiplier of the standard pace.
Not all playback services support change of the playback rate. It is
@@ -1646,6 +1668,7 @@ QStringList QMediaPlayer::supportedCustomAudioRoles() const
/*!
\fn void QMediaPlayer::networkConfigurationChanged(const QNetworkConfiguration &configuration)
+ \obsolete
Signal that the active in use network access point has been changed to \a configuration and all subsequent network access will use this \a configuration.
*/
diff --git a/src/multimedia/playback/qmediaplayer.h b/src/multimedia/playback/qmediaplayer.h
index 7ebed84da..bd070328b 100644
--- a/src/multimedia/playback/qmediaplayer.h
+++ b/src/multimedia/playback/qmediaplayer.h
@@ -40,6 +40,7 @@
#ifndef QMEDIAPLAYER_H
#define QMEDIAPLAYER_H
+#include <QtMultimedia/qtmultimediaglobal.h>
#include <QtMultimedia/qmediaobject.h>
#include <QtMultimedia/qmediacontent.h>
#include <QtMultimedia/qmediaenumdebug.h>
@@ -157,7 +158,10 @@ public:
Error error() const;
QString errorString() const;
- QNetworkConfiguration currentNetworkConfiguration() const;
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+ QT_DEPRECATED_VERSION_5_15 QNetworkConfiguration currentNetworkConfiguration() const;
+QT_WARNING_POP
QMultimedia::AvailabilityStatus availability() const override;
@@ -182,7 +186,14 @@ public Q_SLOTS:
void setMedia(const QMediaContent &media, QIODevice *stream = nullptr);
void setPlaylist(QMediaPlaylist *playlist);
- void setNetworkConfigurations(const QList<QNetworkConfiguration> &configurations);
+#ifndef Q_MOC_RUN // moc fails to parse the expanded macro
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+#endif
+ QT_DEPRECATED_VERSION_5_15 void setNetworkConfigurations(const QList<QNetworkConfiguration> &configurations);
+#ifndef Q_MOC_RUN // moc fails to parse the expanded macro
+QT_WARNING_POP
+#endif
Q_SIGNALS:
void mediaChanged(const QMediaContent &media);
@@ -209,7 +220,14 @@ Q_SIGNALS:
void error(QMediaPlayer::Error error);
- void networkConfigurationChanged(const QNetworkConfiguration &configuration);
+#ifndef Q_MOC_RUN // moc fails to parse the expanded macro
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_DEPRECATED
+#endif
+ QT_DEPRECATED_VERSION_5_15 void networkConfigurationChanged(const QNetworkConfiguration &configuration);
+#ifndef Q_MOC_RUN // moc fails to parse the expanded macro
+QT_WARNING_POP
+#endif
public:
bool bind(QObject *) override;
void unbind(QObject *) override;
diff --git a/src/multimedia/qmediacontrol.cpp b/src/multimedia/qmediacontrol.cpp
index b8f980aa0..6f0a980a2 100644
--- a/src/multimedia/qmediacontrol.cpp
+++ b/src/multimedia/qmediacontrol.cpp
@@ -49,6 +49,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QMediaControl
+ \obsolete
\inmodule QtMultimedia
\ingroup multimedia
diff --git a/src/multimedia/qmediapluginloader.cpp b/src/multimedia/qmediapluginloader.cpp
index 88bd591c2..3e9e6cc21 100644
--- a/src/multimedia/qmediapluginloader.cpp
+++ b/src/multimedia/qmediapluginloader.cpp
@@ -104,7 +104,7 @@ QList<QObject*> QMediaPluginLoader::instances(QString const &key)
static const bool showDebug = qEnvironmentVariableIntValue("QT_DEBUG_PLUGINS");
static const QStringList preferredPlugins =
- qEnvironmentVariable("QT_MULTIMEDIA_PREFERRED_PLUGINS").split(QLatin1Char(','), QString::SkipEmptyParts);
+ qEnvironmentVariable("QT_MULTIMEDIA_PREFERRED_PLUGINS").split(QLatin1Char(','), Qt::SkipEmptyParts);
for (int i = preferredPlugins.size() - 1; i >= 0; --i) {
auto name = preferredPlugins[i];
bool found = false;
diff --git a/src/multimedia/qmediaservice.cpp b/src/multimedia/qmediaservice.cpp
index 7ea24c6dc..ad543acae 100644
--- a/src/multimedia/qmediaservice.cpp
+++ b/src/multimedia/qmediaservice.cpp
@@ -49,6 +49,7 @@ QT_BEGIN_NAMESPACE
/*!
\class QMediaService
+ \obsolete
\brief The QMediaService class provides a common base class for media
service implementations.
\ingroup multimedia
diff --git a/src/multimediawidgets/multimediawidgets.pro b/src/multimediawidgets/multimediawidgets.pro
index 57d4194ec..1919e8107 100644
--- a/src/multimediawidgets/multimediawidgets.pro
+++ b/src/multimediawidgets/multimediawidgets.pro
@@ -1,6 +1,7 @@
# distinct from Qt Multimedia
TARGET = QtMultimediaWidgets
-QT = core gui multimedia-private widgets-private
+QT = core gui multimedia widgets-private
+QT_PRIVATE += multimedia-private
qtHaveModule(opengl): \
QT_PRIVATE += opengl
diff --git a/src/multimediawidgets/qgraphicsvideoitem.cpp b/src/multimediawidgets/qgraphicsvideoitem.cpp
index fae1f9048..7c0521471 100644
--- a/src/multimediawidgets/qgraphicsvideoitem.cpp
+++ b/src/multimediawidgets/qgraphicsvideoitem.cpp
@@ -49,7 +49,7 @@
#include <QtCore/qpointer.h>
#if QT_CONFIG(opengl)
-#include <QtOpenGL/qgl.h>
+#include <QOpenGLContext>
#endif
QT_BEGIN_NAMESPACE
@@ -395,7 +395,7 @@ void QGraphicsVideoItem::paint(
if (painter->paintEngine()->type() == QPaintEngine::OpenGL
|| painter->paintEngine()->type() == QPaintEngine::OpenGL2)
{
- d->surface->setGLContext(const_cast<QGLContext *>(QGLContext::currentContext()));
+ d->surface->updateGLContext();
if (d->surface->supportedShaderTypes() & QPainterVideoSurface::GlslShader) {
d->surface->setShaderType(QPainterVideoSurface::GlslShader);
} else {
diff --git a/src/multimediawidgets/qgraphicsvideoitem.h b/src/multimediawidgets/qgraphicsvideoitem.h
index de73458fd..5c71ee651 100644
--- a/src/multimediawidgets/qgraphicsvideoitem.h
+++ b/src/multimediawidgets/qgraphicsvideoitem.h
@@ -60,7 +60,7 @@ class Q_MULTIMEDIAWIDGETS_EXPORT QGraphicsVideoItem : public QGraphicsObject, pu
Q_PROPERTY(QPointF offset READ offset WRITE setOffset)
Q_PROPERTY(QSizeF size READ size WRITE setSize)
Q_PROPERTY(QSizeF nativeSize READ nativeSize NOTIFY nativeSizeChanged)
- Q_PROPERTY(QAbstractVideoSurface* videoSurface READ videoSurface)
+ Q_PROPERTY(QAbstractVideoSurface* videoSurface READ videoSurface CONSTANT)
public:
explicit QGraphicsVideoItem(QGraphicsItem *parent = nullptr);
~QGraphicsVideoItem();
diff --git a/src/multimediawidgets/qpaintervideosurface.cpp b/src/multimediawidgets/qpaintervideosurface.cpp
index 1c8e2dd63..5fe76d869 100644
--- a/src/multimediawidgets/qpaintervideosurface.cpp
+++ b/src/multimediawidgets/qpaintervideosurface.cpp
@@ -47,9 +47,9 @@
#include <private/qmediaopenglhelper_p.h>
#if QT_CONFIG(opengl)
-#include <qglshaderprogram.h>
-#include <QtGui/QOpenGLContext>
-#include <QtGui/QOpenGLFunctions>
+#include <QOpenGLContext>
+#include <QOpenGLFunctions>
+#include <QOpenGLShaderProgram>
#include <QtGui/QWindow>
#ifndef GL_CLAMP_TO_EDGE
#define GL_CLAMP_TO_EDGE 0x812F
@@ -57,15 +57,6 @@
#ifndef GL_RGB8
#define GL_RGB8 0x8051
#endif
-
-static void makeCurrent(QGLContext *context)
-{
- context->makeCurrent();
-
- auto handle = context->contextHandle();
- if (handle && QOpenGLContext::currentContext() != handle)
- handle->makeCurrent(handle->surface());
-}
#endif
#include <QtDebug>
@@ -264,7 +255,7 @@ void QVideoSurfaceGenericPainter::updateColors(int, int, int, int)
class QVideoSurfaceGLPainter : public QVideoSurfacePainter, protected QOpenGLFunctions
{
public:
- QVideoSurfaceGLPainter(QGLContext *context);
+ QVideoSurfaceGLPainter(QOpenGLContext *context);
~QVideoSurfaceGLPainter();
QList<QVideoFrame::PixelFormat> supportedPixelFormats(
QAbstractVideoBuffer::HandleType handleType) const override;
@@ -292,17 +283,12 @@ protected:
|| format.pixelFormat() == QVideoFrame::Format_ARGB32);
}
-#if !defined(QT_OPENGL_ES) && !defined(QT_OPENGL_DYNAMIC)
- typedef void (APIENTRY *_glActiveTexture) (GLenum);
- _glActiveTexture glActiveTexture;
-#endif
-
QList<QVideoFrame::PixelFormat> m_imagePixelFormats;
QList<QVideoFrame::PixelFormat> m_glPixelFormats;
QMatrix4x4 m_colorMatrix;
QVideoFrame m_frame;
- QGLContext *m_context;
+ QOpenGLContext *m_context;
QAbstractVideoBuffer::HandleType m_handleType;
QVideoSurfaceFormat::Direction m_scanLineDirection;
bool m_mirrored;
@@ -320,7 +306,7 @@ protected:
bool m_yuv;
};
-QVideoSurfaceGLPainter::QVideoSurfaceGLPainter(QGLContext *context)
+QVideoSurfaceGLPainter::QVideoSurfaceGLPainter(QOpenGLContext *context)
: m_context(context)
, m_handleType(QAbstractVideoBuffer::NoHandle)
, m_scanLineDirection(QVideoSurfaceFormat::TopToBottom)
@@ -332,10 +318,6 @@ QVideoSurfaceGLPainter::QVideoSurfaceGLPainter(QGLContext *context)
, m_textureCount(0)
, m_yuv(false)
{
-#if !defined(QT_OPENGL_ES) && !defined(QT_OPENGL_DYNAMIC)
- glActiveTexture = (_glActiveTexture)m_context->getProcAddress(QLatin1String("glActiveTexture"));
-#endif
-
memset(m_textureIds, 0, sizeof(m_textureIds));
memset(m_textureWidths, 0, sizeof(m_textureWidths));
memset(m_textureHeights, 0, sizeof(m_textureHeights));
@@ -404,8 +386,6 @@ QAbstractVideoSurface::Error QVideoSurfaceGLPainter::setCurrentFrame(const QVide
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
} else if (m_frame.map(QAbstractVideoBuffer::ReadOnly)) {
- makeCurrent(m_context);
-
for (int i = 0; i < m_textureCount; ++i) {
glBindTexture(GL_TEXTURE_2D, m_textureIds[i]);
glTexImage2D(
@@ -680,7 +660,7 @@ static const char *qt_arbfp_ayuvShaderProgram =
class QVideoSurfaceArbFpPainter : public QVideoSurfaceGLPainter
{
public:
- QVideoSurfaceArbFpPainter(QGLContext *context);
+ QVideoSurfaceArbFpPainter(QOpenGLContext *context);
QAbstractVideoSurface::Error start(const QVideoSurfaceFormat &format) override;
void stop() override;
@@ -707,20 +687,20 @@ private:
QSize m_frameSize;
};
-QVideoSurfaceArbFpPainter::QVideoSurfaceArbFpPainter(QGLContext *context)
+QVideoSurfaceArbFpPainter::QVideoSurfaceArbFpPainter(QOpenGLContext *context)
: QVideoSurfaceGLPainter(context)
, m_programId(0)
{
glProgramStringARB = (_glProgramStringARB) m_context->getProcAddress(
- QLatin1String("glProgramStringARB"));
+ QByteArray("glProgramStringARB"));
glBindProgramARB = (_glBindProgramARB) m_context->getProcAddress(
- QLatin1String("glBindProgramARB"));
+ QByteArray("glBindProgramARB"));
glDeleteProgramsARB = (_glDeleteProgramsARB) m_context->getProcAddress(
- QLatin1String("glDeleteProgramsARB"));
+ QByteArray("glDeleteProgramsARB"));
glGenProgramsARB = (_glGenProgramsARB) m_context->getProcAddress(
- QLatin1String("glGenProgramsARB"));
+ QByteArray("glGenProgramsARB"));
glProgramLocalParameter4fARB = (_glProgramLocalParameter4fARB) m_context->getProcAddress(
- QLatin1String("glProgramLocalParameter4fARB"));
+ QByteArray("glProgramLocalParameter4fARB"));
m_imagePixelFormats
<< QVideoFrame::Format_RGB32
@@ -746,8 +726,6 @@ QAbstractVideoSurface::Error QVideoSurfaceArbFpPainter::start(const QVideoSurfac
QAbstractVideoSurface::Error error = QAbstractVideoSurface::NoError;
- makeCurrent(m_context);
-
const char *program = 0;
if (format.handleType() == QAbstractVideoBuffer::NoHandle) {
@@ -871,8 +849,6 @@ QAbstractVideoSurface::Error QVideoSurfaceArbFpPainter::start(const QVideoSurfac
void QVideoSurfaceArbFpPainter::stop()
{
if (m_context) {
- makeCurrent(m_context);
-
if (m_handleType != QAbstractVideoBuffer::GLTextureHandle)
glDeleteTextures(m_textureCount, m_textureIds);
glDeleteProgramsARB(1, &m_programId);
@@ -1079,7 +1055,7 @@ static const char *qt_glsl_ayuvShaderProgram =
class QVideoSurfaceGlslPainter : public QVideoSurfaceGLPainter
{
public:
- QVideoSurfaceGlslPainter(QGLContext *context);
+ QVideoSurfaceGlslPainter(QOpenGLContext *context);
QAbstractVideoSurface::Error start(const QVideoSurfaceFormat &format) override;
void stop() override;
@@ -1088,11 +1064,11 @@ public:
const QRectF &target, QPainter *painter, const QRectF &source) override;
private:
- QGLShaderProgram m_program;
+ QOpenGLShaderProgram m_program;
QSize m_frameSize;
};
-QVideoSurfaceGlslPainter::QVideoSurfaceGlslPainter(QGLContext *context)
+QVideoSurfaceGlslPainter::QVideoSurfaceGlslPainter(QOpenGLContext *context)
: QVideoSurfaceGLPainter(context)
, m_program(context)
{
@@ -1100,7 +1076,7 @@ QVideoSurfaceGlslPainter::QVideoSurfaceGlslPainter(QGLContext *context)
<< QVideoFrame::Format_RGB32
<< QVideoFrame::Format_BGR32
<< QVideoFrame::Format_ARGB32;
- if (!context->contextHandle()->isOpenGLES()) {
+ if (!context->isOpenGLES()) {
m_imagePixelFormats
<< QVideoFrame::Format_RGB24
<< QVideoFrame::Format_BGR24;
@@ -1124,8 +1100,6 @@ QAbstractVideoSurface::Error QVideoSurfaceGlslPainter::start(const QVideoSurface
QAbstractVideoSurface::Error error = QAbstractVideoSurface::NoError;
- makeCurrent(m_context);
-
const char *fragmentProgram = 0;
if (format.handleType() == QAbstractVideoBuffer::NoHandle) {
@@ -1143,13 +1117,13 @@ QAbstractVideoSurface::Error QVideoSurfaceGlslPainter::start(const QVideoSurface
fragmentProgram = qt_glsl_argbShaderProgram;
break;
case QVideoFrame::Format_RGB24:
- if (!m_context->contextHandle()->isOpenGLES()) {
+ if (!m_context->isOpenGLES()) {
initRgbTextureInfo(GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE, format.frameSize());
fragmentProgram = qt_glsl_rgbShaderProgram;
}
break;
case QVideoFrame::Format_BGR24:
- if (!m_context->contextHandle()->isOpenGLES()) {
+ if (!m_context->isOpenGLES()) {
initRgbTextureInfo(GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE, format.frameSize());
fragmentProgram = qt_glsl_argbShaderProgram;
}
@@ -1202,11 +1176,11 @@ QAbstractVideoSurface::Error QVideoSurfaceGlslPainter::start(const QVideoSurface
if (!fragmentProgram) {
error = QAbstractVideoSurface::UnsupportedFormatError;
- } else if (!m_program.addShaderFromSourceCode(QGLShader::Vertex, qt_glsl_vertexShaderProgram)) {
+ } else if (!m_program.addShaderFromSourceCode(QOpenGLShader::Vertex, qt_glsl_vertexShaderProgram)) {
qWarning("QPainterVideoSurface: Vertex shader compile error %s",
qPrintable(m_program.log()));
error = QAbstractVideoSurface::ResourceError;
- } else if (!m_program.addShaderFromSourceCode(QGLShader::Fragment, fragmentProgram)) {
+ } else if (!m_program.addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentProgram)) {
qWarning("QPainterVideoSurface: Shader compile error %s", qPrintable(m_program.log()));
error = QAbstractVideoSurface::ResourceError;
m_program.removeAllShaders();
@@ -1231,8 +1205,6 @@ QAbstractVideoSurface::Error QVideoSurfaceGlslPainter::start(const QVideoSurface
void QVideoSurfaceGlslPainter::stop()
{
if (m_context) {
- makeCurrent(m_context);
-
if (m_handleType != QAbstractVideoBuffer::GLTextureHandle)
glDeleteTextures(m_textureCount, m_textureIds);
}
@@ -1611,35 +1583,33 @@ void QPainterVideoSurface::paint(QPainter *painter, const QRectF &target, const
/*!
*/
-const QGLContext *QPainterVideoSurface::glContext() const
+const QOpenGLContext *QPainterVideoSurface::glContext() const
{
return m_glContext;
}
/*!
*/
-void QPainterVideoSurface::setGLContext(QGLContext *context)
+void QPainterVideoSurface::updateGLContext()
{
- if (m_glContext == context)
+ auto oldContext = m_glContext;
+ m_glContext = QOpenGLContext::currentContext();
+ if (oldContext == m_glContext)
return;
- m_glContext = context;
-
m_shaderTypes = NoShaders;
if (m_glContext) {
//Set a dynamic property to access the OpenGL context
- this->setProperty("GLContext", QVariant::fromValue<QObject*>(m_glContext->contextHandle()));
-
- makeCurrent(m_glContext);
+ this->setProperty("GLContext", QVariant::fromValue<QObject *>(m_glContext));
const QByteArray extensions(reinterpret_cast<const char *>(
- context->contextHandle()->functions()->glGetString(GL_EXTENSIONS)));
+ m_glContext->functions()->glGetString(GL_EXTENSIONS)));
#if !defined(QT_OPENGL_ES) && !defined(QT_OPENGL_DYNAMIC)
if (extensions.contains("ARB_fragment_program"))
m_shaderTypes |= FragmentProgramShader;
#endif
- if (QGLShaderProgram::hasOpenGLShaderPrograms(m_glContext)
+ if (QOpenGLShaderProgram::hasOpenGLShaderPrograms(m_glContext)
#if !defined(QT_OPENGL_ES_2) && !defined(QT_OPENGL_DYNAMIC)
&& extensions.contains("ARB_shader_objects")
#endif
@@ -1742,13 +1712,11 @@ void QPainterVideoSurface::createPainter()
#if !defined(QT_OPENGL_ES) && !defined(QT_OPENGL_DYNAMIC)
case FragmentProgramShader:
Q_ASSERT(m_glContext);
- makeCurrent(m_glContext);
m_painter = new QVideoSurfaceArbFpPainter(m_glContext);
break;
#endif // !QT_OPENGL_ES && !QT_OPENGL_DYNAMIC
case GlslShader:
Q_ASSERT(m_glContext);
- makeCurrent(m_glContext);
m_painter = new QVideoSurfaceGlslPainter(m_glContext);
break;
default:
diff --git a/src/multimediawidgets/qpaintervideosurface_p.h b/src/multimediawidgets/qpaintervideosurface_p.h
index 990d20cbe..582d6944c 100644
--- a/src/multimediawidgets/qpaintervideosurface_p.h
+++ b/src/multimediawidgets/qpaintervideosurface_p.h
@@ -59,11 +59,6 @@
#include <qabstractvideosurface.h>
#include <qvideoframe.h>
-QT_BEGIN_NAMESPACE
-
-class QGLContext;
-QT_END_NAMESPACE
-
QT_USE_NAMESPACE
QT_BEGIN_NAMESPACE
@@ -90,7 +85,7 @@ public:
virtual void viewportDestroyed() {}
};
-
+class QOpenGLContext;
class Q_AUTOTEST_EXPORT QPainterVideoSurface : public QAbstractVideoSurface
{
Q_OBJECT
@@ -126,8 +121,8 @@ public:
void paint(QPainter *painter, const QRectF &target, const QRectF &source = QRectF(0, 0, 1, 1));
#if QT_CONFIG(opengl)
- const QGLContext *glContext() const;
- void setGLContext(QGLContext *context);
+ const QOpenGLContext *glContext() const;
+ void updateGLContext();
enum ShaderType
{
@@ -155,7 +150,7 @@ private:
QVideoSurfacePainter *m_painter;
#if QT_CONFIG(opengl)
- QGLContext *m_glContext;
+ QOpenGLContext *m_glContext;
ShaderTypes m_shaderTypes;
ShaderType m_shaderType;
#endif
diff --git a/src/multimediawidgets/qvideowidget.cpp b/src/multimediawidgets/qvideowidget.cpp
index 723a9bbb3..5158b2f35 100644
--- a/src/multimediawidgets/qvideowidget.cpp
+++ b/src/multimediawidgets/qvideowidget.cpp
@@ -228,7 +228,6 @@ void QRendererVideoWidgetBackend::hideEvent(QHideEvent *)
{
#if QT_CONFIG(opengl)
m_updatePaintDevice = true;
- m_surface->setGLContext(0);
#endif
}
@@ -265,7 +264,7 @@ void QRendererVideoWidgetBackend::paintEvent(QPaintEvent *event)
|| painter.paintEngine()->type() == QPaintEngine::OpenGL2)) {
m_updatePaintDevice = false;
- m_surface->setGLContext(const_cast<QGLContext *>(QGLContext::currentContext()));
+ m_surface->updateGLContext();
if (m_surface->supportedShaderTypes() & QPainterVideoSurface::GlslShader) {
m_surface->setShaderType(QPainterVideoSurface::GlslShader);
} else {
diff --git a/src/multimediawidgets/qvideowidget.h b/src/multimediawidgets/qvideowidget.h
index c5abe2ce3..fdf93330b 100644
--- a/src/multimediawidgets/qvideowidget.h
+++ b/src/multimediawidgets/qvideowidget.h
@@ -63,7 +63,7 @@ class Q_MULTIMEDIAWIDGETS_EXPORT QVideoWidget : public QWidget, public QMediaBin
Q_PROPERTY(int contrast READ contrast WRITE setContrast NOTIFY contrastChanged)
Q_PROPERTY(int hue READ hue WRITE setHue NOTIFY hueChanged)
Q_PROPERTY(int saturation READ saturation WRITE setSaturation NOTIFY saturationChanged)
- Q_PROPERTY(QAbstractVideoSurface* videoSurface READ videoSurface)
+ Q_PROPERTY(QAbstractVideoSurface* videoSurface READ videoSurface CONSTANT)
public:
explicit QVideoWidget(QWidget *parent = nullptr);
diff --git a/src/multimediawidgets/qvideowidget_p.h b/src/multimediawidgets/qvideowidget_p.h
index 1db91f3f9..a3e687488 100644
--- a/src/multimediawidgets/qvideowidget_p.h
+++ b/src/multimediawidgets/qvideowidget_p.h
@@ -55,7 +55,7 @@
#include "qvideowidget.h"
#ifndef QT_NO_OPENGL
-#include <QGLWidget>
+#include <QOpenGLWidget>
#endif
#include "qpaintervideosurface_p.h"
diff --git a/src/plugins/alsa/qalsaaudiooutput.cpp b/src/plugins/alsa/qalsaaudiooutput.cpp
index 5c8ae171c..ee5aee989 100644
--- a/src/plugins/alsa/qalsaaudiooutput.cpp
+++ b/src/plugins/alsa/qalsaaudiooutput.cpp
@@ -707,7 +707,7 @@ bool QAlsaAudioOutput::deviceReady()
if(l > 0) {
// Got some data to output
- if(deviceState != QAudio::ActiveState)
+ if (deviceState != QAudio::ActiveState && deviceState != QAudio::IdleState)
return true;
qint64 bytesWritten = write(audioBuffer,l);
if (bytesWritten != l)
diff --git a/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp b/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp
index ef86af896..66eafc765 100644
--- a/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp
+++ b/src/plugins/android/src/mediaplayer/qandroidmetadatareadercontrol.cpp
@@ -176,12 +176,12 @@ void QAndroidMetaDataReaderControl::extractMetadata(QAndroidMetaDataReaderContro
if (!string.isNull()) {
metadata.insert(isVideo ? QMediaMetaData::LeadPerformer
: QMediaMetaData::ContributingArtist,
- string.split('/', QString::SkipEmptyParts));
+ string.split('/', Qt::SkipEmptyParts));
}
string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Author);
if (!string.isNull())
- metadata.insert(QMediaMetaData::Author, string.split('/', QString::SkipEmptyParts));
+ metadata.insert(QMediaMetaData::Author, string.split('/', Qt::SkipEmptyParts));
string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Bitrate);
if (!string.isNull()) {
@@ -196,7 +196,7 @@ void QAndroidMetaDataReaderControl::extractMetadata(QAndroidMetaDataReaderContro
string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Composer);
if (!string.isNull())
- metadata.insert(QMediaMetaData::Composer, string.split('/', QString::SkipEmptyParts));
+ metadata.insert(QMediaMetaData::Composer, string.split('/', Qt::SkipEmptyParts));
string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Date);
if (!string.isNull())
@@ -231,7 +231,7 @@ void QAndroidMetaDataReaderControl::extractMetadata(QAndroidMetaDataReaderContro
string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Writer);
if (!string.isNull())
- metadata.insert(QMediaMetaData::Writer, string.split('/', QString::SkipEmptyParts));
+ metadata.insert(QMediaMetaData::Writer, string.split('/', Qt::SkipEmptyParts));
string = retriever.extractMetadata(AndroidMediaMetadataRetriever::Year);
if (!string.isNull())
diff --git a/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp b/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp
index f899481f0..de8422b86 100644
--- a/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp
+++ b/src/plugins/android/src/wrappers/jni/androidmediaplayer.cpp
@@ -271,7 +271,7 @@ void AndroidMediaPlayer::setAudioRole(QAudio::Role role)
void AndroidMediaPlayer::setCustomAudioRole(const QString &role)
{
- QStringList roles = role.split(",", QString::SkipEmptyParts);
+ QStringList roles = role.split(",", Qt::SkipEmptyParts);
int type = 0; // CONTENT_TYPE_UNKNOWN
int usage = 0; // USAGE_UNKNOWN
diff --git a/src/plugins/avfoundation/camera/avfcamerarenderercontrol.mm b/src/plugins/avfoundation/camera/avfcamerarenderercontrol.mm
index 0359f5d0a..9e1bf3f84 100644
--- a/src/plugins/avfoundation/camera/avfcamerarenderercontrol.mm
+++ b/src/plugins/avfoundation/camera/avfcamerarenderercontrol.mm
@@ -297,11 +297,9 @@ void AVFCameraRendererControl::setSurface(QAbstractVideoSurface *surface)
{
if (m_surface != surface) {
m_surface = surface;
-#ifdef Q_OS_IOS
m_supportsTextures = m_surface
- ? m_surface->supportedPixelFormats(QAbstractVideoBuffer::GLTextureHandle).contains(QVideoFrame::Format_BGRA32)
+ ? !m_surface->supportedPixelFormats(QAbstractVideoBuffer::GLTextureHandle).isEmpty()
: false;
-#endif
Q_EMIT surfaceChanged(surface);
}
}
diff --git a/src/plugins/avfoundation/camera/avfcamerasession.mm b/src/plugins/avfoundation/camera/avfcamerasession.mm
index a3263badc..3c5f8f09a 100644
--- a/src/plugins/avfoundation/camera/avfcamerasession.mm
+++ b/src/plugins/avfoundation/camera/avfcamerasession.mm
@@ -408,7 +408,8 @@ bool AVFCameraSession::applyViewfinderSettings()
vfSettings.setResolution(imageResolution);
}
- return vfControl->applySettings(vfSettings);
+ vfControl->applySettings(vfSettings);
+ return !vfSettings.isNull();
}
return false;
diff --git a/src/plugins/avfoundation/camera/avfcamerautility.h b/src/plugins/avfoundation/camera/avfcamerautility.h
index 370302b1c..33956fc8a 100644
--- a/src/plugins/avfoundation/camera/avfcamerautility.h
+++ b/src/plugins/avfoundation/camera/avfcamerautility.h
@@ -161,7 +161,7 @@ QSize qt_device_format_high_resolution(AVCaptureDeviceFormat *format);
QSize qt_device_format_pixel_aspect_ratio(AVCaptureDeviceFormat *format);
QVector<AVFPSRange> qt_device_format_framerates(AVCaptureDeviceFormat *format);
AVCaptureDeviceFormat *qt_find_best_resolution_match(AVCaptureDevice *captureDevice, const QSize &res,
- FourCharCode preferredFormat);
+ FourCharCode preferredFormat, bool stillImage = true);
AVCaptureDeviceFormat *qt_find_best_framerate_match(AVCaptureDevice *captureDevice,
FourCharCode preferredFormat,
Float64 fps);
diff --git a/src/plugins/avfoundation/camera/avfcamerautility.mm b/src/plugins/avfoundation/camera/avfcamerautility.mm
index 8c743dcbc..25ccc4b01 100644
--- a/src/plugins/avfoundation/camera/avfcamerautility.mm
+++ b/src/plugins/avfoundation/camera/avfcamerautility.mm
@@ -239,7 +239,8 @@ QSize qt_device_format_pixel_aspect_ratio(AVCaptureDeviceFormat *format)
AVCaptureDeviceFormat *qt_find_best_resolution_match(AVCaptureDevice *captureDevice,
const QSize &request,
- FourCharCode filter)
+ FourCharCode filter,
+ bool stillImage)
{
Q_ASSERT(captureDevice);
Q_ASSERT(!request.isNull() && request.isValid());
@@ -254,7 +255,7 @@ AVCaptureDeviceFormat *qt_find_best_resolution_match(AVCaptureDevice *captureDev
if (qt_device_format_resolution(format) == request)
return format;
// iOS only (still images).
- if (qt_device_format_high_resolution(format) == request)
+ if (stillImage && qt_device_format_high_resolution(format) == request)
return format;
}
@@ -272,7 +273,7 @@ AVCaptureDeviceFormat *qt_find_best_resolution_match(AVCaptureDevice *captureDev
if (!res.isNull() && res.isValid() && qt_area_sane(res))
pairs << FormatPair(res, format);
const QSize highRes(qt_device_format_high_resolution(format));
- if (!highRes.isNull() && highRes.isValid() && qt_area_sane(highRes))
+ if (stillImage && !highRes.isNull() && highRes.isValid() && qt_area_sane(highRes))
pairs << FormatPair(highRes, format);
}
diff --git a/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm b/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm
index 91f3cb7dc..dd0393f96 100644
--- a/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm
+++ b/src/plugins/avfoundation/camera/avfcameraviewfindersettingscontrol.mm
@@ -185,6 +185,16 @@ void AVFCameraViewfinderSettingsControl2::setViewfinderSettings(const QCameraVie
return;
m_settings = settings;
+#if defined(Q_OS_IOS)
+ bool active = m_service->session()->state() == QCamera::ActiveState;
+ if (active)
+ [m_service->session()->captureSession() beginConfiguration];
+ applySettings(m_settings);
+ if (active)
+ [m_service->session()->captureSession() commitConfiguration];
+#else
+ applySettings(m_settings);
+#endif
}
QVideoFrame::PixelFormat AVFCameraViewfinderSettingsControl2::QtPixelFormatFromCVFormat(unsigned avPixelFormat)
@@ -263,7 +273,7 @@ AVCaptureDeviceFormat *AVFCameraViewfinderSettingsControl2::findBestFormatMatch(
// Either the exact match (including high resolution for images on iOS)
// or a format with a resolution close to the requested one.
return qt_find_best_resolution_match(captureDevice, resolution,
- m_service->session()->defaultCodec());
+ m_service->session()->defaultCodec(), false);
}
// No resolution requested, what about framerates?
@@ -331,7 +341,10 @@ bool AVFCameraViewfinderSettingsControl2::convertPixelFormatIfSupported(QVideoFr
if (m_service->videoOutput()->surface()) {
const QAbstractVideoSurface *surface = m_service->videoOutput()->surface();
- if (!surface->supportedPixelFormats().contains(qtFormat))
+ QAbstractVideoBuffer::HandleType h = m_service->videoOutput()->supportsTextures()
+ ? QAbstractVideoBuffer::GLTextureHandle
+ : QAbstractVideoBuffer::NoHandle;
+ if (!surface->supportedPixelFormats(h).contains(qtFormat))
return false;
}
@@ -379,21 +392,19 @@ bool AVFCameraViewfinderSettingsControl2::applySettings(const QCameraViewfinderS
// format, or if no surface is set, the preferred capture device format
const QVector<QVideoFrame::PixelFormat> deviceFormats = viewfinderPixelFormats();
- QVideoFrame::PixelFormat pickedFormat = deviceFormats.first();
-
QAbstractVideoSurface *surface = m_service->videoOutput()->surface();
+ QVideoFrame::PixelFormat pickedFormat = deviceFormats.first();
if (surface) {
- if (m_service->videoOutput()->supportsTextures()) {
- pickedFormat = QVideoFrame::Format_ARGB32;
- } else {
- QList<QVideoFrame::PixelFormat> surfaceFormats = surface->supportedPixelFormats();
-
- for (int i = 0; i < surfaceFormats.count(); ++i) {
- const QVideoFrame::PixelFormat surfaceFormat = surfaceFormats.at(i);
- if (deviceFormats.contains(surfaceFormat)) {
- pickedFormat = surfaceFormat;
- break;
- }
+ pickedFormat = QVideoFrame::Format_Invalid;
+ QAbstractVideoBuffer::HandleType h = m_service->videoOutput()->supportsTextures()
+ ? QAbstractVideoBuffer::GLTextureHandle
+ : QAbstractVideoBuffer::NoHandle;
+ QList<QVideoFrame::PixelFormat> surfaceFormats = surface->supportedPixelFormats(h);
+ for (int i = 0; i < surfaceFormats.count(); ++i) {
+ const QVideoFrame::PixelFormat surfaceFormat = surfaceFormats.at(i);
+ if (deviceFormats.contains(surfaceFormat)) {
+ pickedFormat = surfaceFormat;
+ break;
}
}
}
@@ -401,13 +412,15 @@ bool AVFCameraViewfinderSettingsControl2::applySettings(const QCameraViewfinderS
CVPixelFormatFromQtFormat(pickedFormat, avfPixelFormat);
}
- if (avfPixelFormat != 0) {
- NSMutableDictionary *videoSettings = [NSMutableDictionary dictionaryWithCapacity:1];
- [videoSettings setObject:[NSNumber numberWithUnsignedInt:avfPixelFormat]
- forKey:(id)kCVPixelBufferPixelFormatTypeKey];
+ NSMutableDictionary *videoSettings = [NSMutableDictionary dictionaryWithCapacity:1];
+ [videoSettings setObject:[NSNumber numberWithUnsignedInt:avfPixelFormat]
+ forKey:(id)kCVPixelBufferPixelFormatTypeKey];
- videoOutput.videoSettings = videoSettings;
- }
+ const AVFConfigurationLock lock(captureDevice);
+ if (!lock)
+ qWarning("Failed to set active format (lock failed)");
+
+ videoOutput.videoSettings = videoSettings;
}
qt_set_framerate_limits(captureDevice, videoConnection(), settings.minimumFrameRate(), settings.maximumFrameRate());
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
index 7a268a3d9..db29e88aa 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.h
@@ -67,7 +67,7 @@ public:
QMediaPlayer::MediaStatus mediaStatus() const;
QMediaContent media() const;
- const QIODevice *mediaStream() const;
+ QIODevice *mediaStream() const;
void setMedia(const QMediaContent &content, QIODevice *stream);
qint64 position() const;
@@ -110,6 +110,9 @@ public Q_SLOTS:
void processDurationChange(qint64 duration);
+ void streamReady();
+ void streamDestroyed();
+
Q_SIGNALS:
void positionChanged(qint64 position);
void durationChanged(qint64 duration);
@@ -128,6 +131,7 @@ private:
void setAudioAvailable(bool available);
void setVideoAvailable(bool available);
void setSeekable(bool seekable);
+ void resetStream(QIODevice *stream = nullptr);
AVFMediaPlayerService *m_service;
AVFVideoOutput *m_videoOutput;
diff --git a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
index 3e3736183..424f30008 100644
--- a/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfmediaplayersession.mm
@@ -42,6 +42,7 @@
#include "avfvideooutput.h"
#include <qpointer.h>
+#include <QFileInfo>
#import <AVFoundation/AVFoundation.h>
@@ -66,7 +67,7 @@ static void *AVFMediaPlayerSessionObserverBufferLikelyToKeepUpContext = &AVFMedi
static void *AVFMediaPlayerSessionObserverCurrentItemObservationContext = &AVFMediaPlayerSessionObserverCurrentItemObservationContext;
static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext = &AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext;
-@interface AVFMediaPlayerSessionObserver : NSObject
+@interface AVFMediaPlayerSessionObserver : NSObject<AVAssetResourceLoaderDelegate>
@property (readonly, getter=player) AVPlayer* m_player;
@property (readonly, getter=playerItem) AVPlayerItem* m_playerItem;
@@ -74,7 +75,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext
@property (readonly, getter=session) AVFMediaPlayerSession* m_session;
- (AVFMediaPlayerSessionObserver *) initWithMediaPlayerSession:(AVFMediaPlayerSession *)session;
-- (void) setURL:(NSURL *)url;
+- (void) setURL:(NSURL *)url mimeType:(NSString *)mimeType;
- (void) unloadMedia;
- (void) prepareToPlayAsset:(AVURLAsset *)asset withKeys:(NSArray *)requestedKeys;
- (void) assetFailedToPrepareForPlayback:(NSError *)error;
@@ -84,6 +85,7 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext
change:(NSDictionary *)change context:(void *)context;
- (void) detatchSession;
- (void) dealloc;
+- (BOOL) resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest;
@end
@implementation AVFMediaPlayerSessionObserver
@@ -95,6 +97,8 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext
AVPlayerLayer *m_playerLayer;
NSURL *m_URL;
BOOL m_bufferIsLikelyToKeepUp;
+ NSData *m_data;
+ NSString *m_mimeType;
}
@synthesize m_player, m_playerItem, m_playerLayer, m_session;
@@ -109,8 +113,11 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext
return self;
}
-- (void) setURL:(NSURL *)url
+- (void) setURL:(NSURL *)url mimeType:(NSString *)mimeType
{
+ [m_mimeType release];
+ m_mimeType = [mimeType retain];
+
if (m_URL != url)
{
[m_URL release];
@@ -122,6 +129,8 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext
// use __block to avoid maintaining strong references on variables captured by the
// following block callback
__block AVURLAsset *asset = [[AVURLAsset URLAssetWithURL:m_URL options:nil] retain];
+ [asset.resourceLoader setDelegate:self queue:dispatch_get_main_queue()];
+
__block NSArray *requestedKeys = [[NSArray arrayWithObjects:AVF_TRACKS_KEY, AVF_PLAYABLE_KEY, nil] retain];
__block AVFMediaPlayerSessionObserver *blockSelf = self;
@@ -403,9 +412,48 @@ static void *AVFMediaPlayerSessionObserverCurrentItemDurationObservationContext
[m_URL release];
}
+ [m_mimeType release];
[super dealloc];
}
+- (BOOL) resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest
+{
+ Q_UNUSED(resourceLoader);
+
+ if (![loadingRequest.request.URL.scheme isEqualToString:@"iodevice"])
+ return NO;
+
+ QIODevice *device = m_session->mediaStream();
+ if (!device)
+ return NO;
+
+ device->seek(loadingRequest.dataRequest.requestedOffset);
+ if (loadingRequest.contentInformationRequest) {
+ loadingRequest.contentInformationRequest.contentType = m_mimeType;
+ loadingRequest.contentInformationRequest.contentLength = device->size();
+ loadingRequest.contentInformationRequest.byteRangeAccessSupported = YES;
+ }
+
+ if (loadingRequest.dataRequest) {
+ NSInteger requestedLength = loadingRequest.dataRequest.requestedLength;
+ int maxBytes = qMin(32 * 1064, int(requestedLength));
+ char buffer[maxBytes];
+ NSInteger submitted = 0;
+ while (submitted < requestedLength) {
+ qint64 len = device->read(buffer, maxBytes);
+ if (len < 1)
+ break;
+
+ [loadingRequest.dataRequest respondWithData:[NSData dataWithBytes:buffer length:len]];
+ submitted += len;
+ }
+
+ // Finish loading even if not all bytes submitted.
+ [loadingRequest finishLoading];
+ }
+
+ return YES;
+}
@end
AVFMediaPlayerSession::AVFMediaPlayerSession(AVFMediaPlayerService *service, QObject *parent)
@@ -483,11 +531,23 @@ QMediaContent AVFMediaPlayerSession::media() const
return m_resources;
}
-const QIODevice *AVFMediaPlayerSession::mediaStream() const
+QIODevice *AVFMediaPlayerSession::mediaStream() const
{
return m_mediaStream;
}
+static void setURL(void *observer, const QString &url, const QString &mimeType = QString())
+{
+ NSString *urlString = [NSString stringWithUTF8String:url.toUtf8().constData()];
+ NSURL *nsurl = [NSURL URLWithString:urlString];
+ [static_cast<AVFMediaPlayerSessionObserver*>(observer) setURL:nsurl mimeType:[NSString stringWithUTF8String:mimeType.toLatin1().constData()]];
+}
+
+static void setStreamURL(void *observer, const QString &url)
+{
+ setURL(observer, QLatin1String("iodevice://") + url, QFileInfo(url).suffix());
+}
+
void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *stream)
{
#ifdef QT_DEBUG_AVF
@@ -497,7 +557,7 @@ void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *st
[static_cast<AVFMediaPlayerSessionObserver*>(m_observer) unloadMedia];
m_resources = content;
- m_mediaStream = stream;
+ resetStream(stream);
setAudioAvailable(false);
setVideoAvailable(false);
@@ -508,7 +568,7 @@ void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *st
const QMediaPlayer::MediaStatus oldMediaStatus = m_mediaStatus;
const QMediaPlayer::State oldState = m_state;
- if (content.isNull() || content.request().url().isEmpty()) {
+ if (!m_mediaStream && (content.isNull() || content.request().url().isEmpty())) {
m_mediaStatus = QMediaPlayer::NoMedia;
if (m_mediaStatus != oldMediaStatus)
Q_EMIT mediaStatusChanged(m_mediaStatus);
@@ -524,11 +584,16 @@ void AVFMediaPlayerSession::setMedia(const QMediaContent &content, QIODevice *st
if (m_mediaStatus != oldMediaStatus)
Q_EMIT mediaStatusChanged(m_mediaStatus);
- //Load AVURLAsset
- //initialize asset using content's URL
- NSString *urlString = [NSString stringWithUTF8String:content.request().url().toEncoded().constData()];
- NSURL *url = [NSURL URLWithString:urlString];
- [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) setURL:url];
+ if (m_mediaStream) {
+ // If there is a data, try to load it,
+ // otherwise wait for readyRead.
+ if (m_mediaStream->size())
+ setStreamURL(m_observer, m_resources.request().url().toString());
+ } else {
+ //Load AVURLAsset
+ //initialize asset using content's URL
+ setURL(m_observer, m_resources.request().url().toString());
+ }
m_state = QMediaPlayer::StoppedState;
if (m_state != oldState)
@@ -686,7 +751,7 @@ void AVFMediaPlayerSession::setPosition(qint64 pos)
CMTime newTime = [playerItem currentTime];
newTime.value = (pos / 1000.0f) * newTime.timescale;
- [playerItem seekToTime:newTime];
+ [playerItem seekToTime:newTime toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero completionHandler:nil];
Q_EMIT positionChanged(pos);
@@ -875,9 +940,11 @@ void AVFMediaPlayerSession::processLoadStateChange(QMediaPlayer::State newState)
// Get the native size of the video, and reset the bounds of the player layer
AVPlayerLayer *playerLayer = [static_cast<AVFMediaPlayerSessionObserver*>(m_observer) playerLayer];
if (videoTrack && playerLayer) {
- playerLayer.bounds = CGRectMake(0.0f, 0.0f,
- videoTrack.naturalSize.width,
- videoTrack.naturalSize.height);
+ if (!playerLayer.bounds.size.width || !playerLayer.bounds.size.height) {
+ playerLayer.bounds = CGRectMake(0.0f, 0.0f,
+ videoTrack.naturalSize.width,
+ videoTrack.naturalSize.height);
+ }
if (m_videoOutput && newState != QMediaPlayer::StoppedState) {
m_videoOutput->setLayer(playerLayer);
@@ -928,7 +995,8 @@ void AVFMediaPlayerSession::processBufferStateChange(int bufferStatus)
} else if (status == QMediaPlayer::StalledMedia) {
status = QMediaPlayer::BufferedMedia;
// Resume playback.
- [[static_cast<AVFMediaPlayerSessionObserver*>(m_observer) player] setRate:m_rate];
+ if (m_state == QMediaPlayer::PlayingState)
+ [[static_cast<AVFMediaPlayerSessionObserver*>(m_observer) player] setRate:m_rate];
}
if (m_mediaStatus != status)
@@ -966,3 +1034,28 @@ void AVFMediaPlayerSession::processMediaLoadError()
Q_EMIT error(QMediaPlayer::FormatError, tr("Failed to load media"));
}
+
+void AVFMediaPlayerSession::streamReady()
+{
+ setStreamURL(m_observer, m_resources.request().url().toString());
+}
+
+void AVFMediaPlayerSession::streamDestroyed()
+{
+ resetStream(nullptr);
+}
+
+void AVFMediaPlayerSession::resetStream(QIODevice *stream)
+{
+ if (m_mediaStream) {
+ disconnect(m_mediaStream, &QIODevice::readyRead, this, &AVFMediaPlayerSession::streamReady);
+ disconnect(m_mediaStream, &QIODevice::destroyed, this, &AVFMediaPlayerSession::streamDestroyed);
+ }
+
+ m_mediaStream = stream;
+
+ if (m_mediaStream) {
+ connect(m_mediaStream, &QIODevice::readyRead, this, &AVFMediaPlayerSession::streamReady);
+ connect(m_mediaStream, &QIODevice::destroyed, this, &AVFMediaPlayerSession::streamDestroyed);
+ }
+}
diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowidget.mm b/src/plugins/avfoundation/mediaplayer/avfvideowidget.mm
index be349710c..0987342b4 100644
--- a/src/plugins/avfoundation/mediaplayer/avfvideowidget.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfvideowidget.mm
@@ -38,12 +38,9 @@
****************************************************************************/
#include "avfvideowidget.h"
-#include <QtCore/QDebug>
-#include <AVFoundation/AVFoundation.h>
-#include <QtGui/QResizeEvent>
-#include <QtGui/QPaintEvent>
-#include <QtGui/QPainter>
+#import <AVFoundation/AVFoundation.h>
+#import <QuartzCore/CATransaction.h>
#if defined(Q_OS_MACOS)
#import <AppKit/AppKit.h>
@@ -51,6 +48,11 @@
#import <UIKit/UIKit.h>
#endif
+#include <QtCore/QDebug>
+#include <QtGui/QResizeEvent>
+#include <QtGui/QPaintEvent>
+#include <QtGui/QPainter>
+
QT_USE_NAMESPACE
AVFVideoWidget::AVFVideoWidget(QWidget *parent)
@@ -178,5 +180,8 @@ void AVFVideoWidget::updateAspectRatio()
void AVFVideoWidget::updatePlayerLayerBounds(const QSize &size)
{
- m_playerLayer.bounds = CGRectMake(0.0f, 0.0f, (float)size.width(), (float)size.height());
+ [CATransaction begin];
+ [CATransaction setDisableActions: YES]; // disable animation/flicks
+ m_playerLayer.bounds = QRect(QPoint(0, 0), size).toCGRect();
+ [CATransaction commit];
}
diff --git a/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm b/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm
index 7fa41fdc2..d61129ec9 100644
--- a/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm
+++ b/src/plugins/avfoundation/mediaplayer/avfvideowindowcontrol.mm
@@ -40,6 +40,7 @@
#include "avfvideowindowcontrol.h"
#include <AVFoundation/AVFoundation.h>
+#import <QuartzCore/CATransaction.h>
#if QT_HAS_INCLUDE(<AppKit/AppKit.h>)
#include <AppKit/AppKit.h>
@@ -244,10 +245,10 @@ void AVFVideoWindowControl::updateAspectRatio()
void AVFVideoWindowControl::updatePlayerLayerBounds()
{
if (m_playerLayer) {
- CGRect newBounds = CGRectMake(0, 0,
- m_displayRect.width(), m_displayRect.height());
- m_playerLayer.bounds = newBounds;
- m_playerLayer.position = CGPointMake(m_displayRect.x(), m_displayRect.y());
+ [CATransaction begin];
+ [CATransaction setDisableActions: YES]; // disable animation/flicks
+ m_playerLayer.frame = m_displayRect.toCGRect();
+ [CATransaction commit];
}
}
diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp
index 3e505a413..9445bd9d0 100644
--- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp
+++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp
@@ -347,10 +347,12 @@ void CameraBinSession::setupCaptureResolution()
// If capture resolution is specified, use it also for the viewfinder to avoid caps negotiation
// to fail.
if (m_usingWrapperCameraBinSrc) {
- if (m_captureMode == QCamera::CaptureStillImage && !imageResolution.isEmpty())
- viewfinderResolution = imageResolution;
- else if (m_captureMode == QCamera::CaptureVideo && !videoResolution.isEmpty())
- viewfinderResolution = videoResolution;
+ if (viewfinderResolution.isEmpty()) {
+ if (m_captureMode == QCamera::CaptureStillImage && !imageResolution.isEmpty())
+ viewfinderResolution = imageResolution;
+ else if (m_captureMode == QCamera::CaptureVideo && !videoResolution.isEmpty())
+ viewfinderResolution = videoResolution;
+ }
// Make sure we don't use incompatible frame rate and pixel format with the new resolution
if (viewfinderResolution != m_viewfinderSettings.resolution() &&
diff --git a/src/plugins/wmf/player/mfplayersession.cpp b/src/plugins/wmf/player/mfplayersession.cpp
index 10ba25998..24bfda833 100644
--- a/src/plugins/wmf/player/mfplayersession.cpp
+++ b/src/plugins/wmf/player/mfplayersession.cpp
@@ -288,6 +288,9 @@ MFPlayerSession::MediaType MFPlayerSession::getStreamType(IMFStreamDescriptor *s
}
}
+ if (typeHandler)
+ typeHandler->Release();
+
return Unknown;
}
diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
index 128d0a616..ca3a4b2ea 100644
--- a/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput.cpp
@@ -138,7 +138,7 @@ QDeclarativeVideoOutput::QDeclarativeVideoOutput(QQuickItem *parent) :
{
initResource();
setFlag(ItemHasContents, true);
- m_backend.reset(new QDeclarativeVideoRendererBackend(this));
+ createBackend(nullptr);
}
QDeclarativeVideoOutput::~QDeclarativeVideoOutput()
@@ -156,12 +156,13 @@ QDeclarativeVideoOutput::~QDeclarativeVideoOutput()
to render the video frames to this VideoOutput element.
It is similar to setting a QObject with \c videoSurface property as a source,
where this video surface will be set.
- \sa setSource
+
+ \sa source
*/
QAbstractVideoSurface *QDeclarativeVideoOutput::videoSurface() const
{
- return m_backend->videoSurface();
+ return m_backend ? m_backend->videoSurface() : nullptr;
}
/*!
@@ -223,21 +224,10 @@ void QDeclarativeVideoOutput::setSource(QObject *source)
}
m_sourceType = MediaObjectSource;
-#if QT_CONFIG(opengl)
} else if (metaObject->indexOfProperty("videoSurface") != -1) {
- // Make sure our backend is a QDeclarativeVideoRendererBackend
- m_backend.reset();
- createBackend(0);
- Q_ASSERT(m_backend);
-#ifndef QT_NO_DYNAMIC_CAST
- Q_ASSERT(dynamic_cast<QDeclarativeVideoRendererBackend *>(m_backend.data()));
-#endif
- QAbstractVideoSurface * const surface = m_backend->videoSurface();
- Q_ASSERT(surface);
m_source.data()->setProperty("videoSurface",
- QVariant::fromValue<QAbstractVideoSurface*>(surface));
+ QVariant::fromValue<QAbstractVideoSurface *>(videoSurface()));
m_sourceType = VideoSurfaceSource;
-#endif
} else {
m_sourceType = NoSource;
}
@@ -259,7 +249,8 @@ bool QDeclarativeVideoOutput::createBackend(QMediaService *service)
const auto instances = videoBackendFactoryLoader()->instances(QLatin1String("declarativevideobackend"));
for (QObject *instance : instances) {
if (QDeclarativeVideoBackendFactoryInterface *plugin = qobject_cast<QDeclarativeVideoBackendFactoryInterface*>(instance)) {
- m_backend.reset(plugin->create(this));
+ if (!m_backend)
+ m_backend.reset(plugin->create(this));
if (m_backend && m_backend->init(service)) {
backendAvailable = true;
break;
diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h b/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h
index 9e826d0ff..d14731c91 100644
--- a/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_p.h
@@ -81,7 +81,7 @@ class Q_MULTIMEDIAQUICK_EXPORT QDeclarativeVideoOutput : public QQuickItem
Q_PROPERTY(QRectF contentRect READ contentRect NOTIFY contentRectChanged)
Q_PROPERTY(QQmlListProperty<QAbstractVideoFilter> filters READ filters);
Q_PROPERTY(FlushMode flushMode READ flushMode WRITE setFlushMode NOTIFY flushModeChanged REVISION 13)
- Q_PROPERTY(QAbstractVideoSurface* videoSurface READ videoSurface REVISION 15)
+ Q_PROPERTY(QAbstractVideoSurface* videoSurface READ videoSurface CONSTANT REVISION 15)
Q_ENUMS(FlushMode)
Q_ENUMS(FillMode)
diff --git a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp
index 27fc014aa..068b30653 100644
--- a/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp
+++ b/tests/auto/integration/qcamerabackend/tst_qcamerabackend.cpp
@@ -214,7 +214,7 @@ void tst_QCameraBackend::testCameraStates()
QCamera camera;
QCameraImageCapture imageCapture(&camera);
- QSignalSpy errorSignal(&camera, SIGNAL(error(QCamera::Error)));
+ QSignalSpy errorSignal(&camera, SIGNAL(errorOccurred(QCamera::Error)));
QSignalSpy stateChangedSignal(&camera, SIGNAL(stateChanged(QCamera::State)));
QSignalSpy statusChangedSignal(&camera, SIGNAL(statusChanged(QCamera::Status)));
@@ -262,8 +262,8 @@ void tst_QCameraBackend::testCameraStartError()
{
QCamera camera1(QCameraInfo::defaultCamera());
QCamera camera2(QCameraInfo::defaultCamera());
- QSignalSpy errorSpy1(&camera1, QOverload<QCamera::Error>::of(&QCamera::error));
- QSignalSpy errorSpy2(&camera2, QOverload<QCamera::Error>::of(&QCamera::error));
+ QSignalSpy errorSpy1(&camera1, &QCamera::errorOccurred);
+ QSignalSpy errorSpy2(&camera2, &QCamera::errorOccurred);
camera1.start();
camera2.start();
@@ -283,7 +283,7 @@ void tst_QCameraBackend::testCaptureMode()
{
QCamera camera;
- QSignalSpy errorSignal(&camera, SIGNAL(error(QCamera::Error)));
+ QSignalSpy errorSignal(&camera, SIGNAL(errorOccurred(QCamera::Error)));
QSignalSpy stateChangedSignal(&camera, SIGNAL(stateChanged(QCamera::State)));
QSignalSpy captureModeSignal(&camera, SIGNAL(captureModeChanged(QCamera::CaptureModes)));
@@ -631,7 +631,7 @@ void tst_QCameraBackend::testVideoRecording()
QMediaRecorder recorder(camera.data());
- QSignalSpy errorSignal(camera.data(), SIGNAL(error(QCamera::Error)));
+ QSignalSpy errorSignal(camera.data(), SIGNAL(errorOccurred(QCamera::Error)));
QSignalSpy recorderErrorSignal(&recorder, SIGNAL(error(QMediaRecorder::Error)));
QSignalSpy recorderStatusSignal(&recorder, SIGNAL(statusChanged(QMediaRecorder::Status)));
diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
index f1be070e8..a2217afc8 100644
--- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
+++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
@@ -81,6 +81,7 @@ private slots:
void multipleSurfaces();
void metadata();
void playerStateAtEOS();
+ void playFromBuffer();
private:
QMediaContent selectVideoFile(const QStringList& mediaCandidates);
@@ -1476,6 +1477,25 @@ void tst_QMediaPlayerBackend::playerStateAtEOS()
QVERIFY(endOfMediaReceived);
}
+void tst_QMediaPlayerBackend::playFromBuffer()
+{
+ if (localVideoFile.isNull())
+ QSKIP("No supported video file");
+
+ TestVideoSurface surface(false);
+ QMediaPlayer player;
+ player.setVideoOutput(&surface);
+ QFile file(localVideoFile.request().url().toLocalFile());
+ if (!file.open(QIODevice::ReadOnly))
+ QSKIP("Could not open file");
+ player.setMedia(localVideoFile, &file);
+ player.play();
+ QTRY_VERIFY(player.position() >= 1000);
+ if (surface.error() == QAbstractVideoSurface::UnsupportedFormatError)
+ QSKIP("None of the pixel formats is supported by the backend");
+ QVERIFY2(surface.m_totalFrames >= 25, qPrintable(QString("Expected >= 25, got %1").arg(surface.m_totalFrames)));
+}
+
TestVideoSurface::TestVideoSurface(bool storeFrames):
m_totalFrames(0),
m_storeFrames(storeFrames)
diff --git a/tests/auto/unit/qabstractvideosurface/tst_qabstractvideosurface.cpp b/tests/auto/unit/qabstractvideosurface/tst_qabstractvideosurface.cpp
index 61299a964..b18dba5f7 100644
--- a/tests/auto/unit/qabstractvideosurface/tst_qabstractvideosurface.cpp
+++ b/tests/auto/unit/qabstractvideosurface/tst_qabstractvideosurface.cpp
@@ -58,7 +58,7 @@ private slots:
void supportedFormatsChanged();
};
-typedef QMap<QAbstractVideoBuffer::HandleType, QVideoFrame::PixelFormat> SupportedFormatMap;
+using SupportedFormatMap = QMultiMap<QAbstractVideoBuffer::HandleType, QVideoFrame::PixelFormat>;
Q_DECLARE_METATYPE(SupportedFormatMap)
@@ -86,7 +86,7 @@ public:
/* fun to generate supportedFormatsChanged signal */
QList<QVideoFrame::PixelFormat> supportedPixelFormatsChange(QList<QVideoFrame::PixelFormat> formats)
{
- supportedFormats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB32);
+ supportedFormats.insert(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB32);
QList<QVideoFrame::PixelFormat> supportedFormats = supportedPixelFormats();
if (supportedFormats.count() != formats.count()) {
emit supportedFormatsChanged();
@@ -189,10 +189,10 @@ void tst_QAbstractVideoSurface::isFormatSupported_data()
QAbstractVideoBuffer::GLTextureHandle)
<< false;
- formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB32);
- formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB24);
- formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_YUV444);
- formats.insertMulti(QAbstractVideoBuffer::GLTextureHandle, QVideoFrame::Format_RGB32);
+ formats.insert(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB32);
+ formats.insert(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB24);
+ formats.insert(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_YUV444);
+ formats.insert(QAbstractVideoBuffer::GLTextureHandle, QVideoFrame::Format_RGB32);
QTest::newRow("supported: rgb32")
<< formats
@@ -228,8 +228,8 @@ void tst_QAbstractVideoSurface::isFormatSupported_data()
QAbstractVideoBuffer::GLTextureHandle)
<< false;
- formats.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_YV12);
- formats.insertMulti(QAbstractVideoBuffer::GLTextureHandle, QVideoFrame::Format_RGB24);
+ formats.insert(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_YV12);
+ formats.insert(QAbstractVideoBuffer::GLTextureHandle, QVideoFrame::Format_RGB24);
QTest::newRow("supported: yv12")
<< formats
@@ -377,7 +377,7 @@ void tst_QAbstractVideoSurface::nativeResolution()
void tst_QAbstractVideoSurface::supportedFormatsChanged()
{
SupportedFormatMap formatMap;
- formatMap.insertMulti(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB24);
+ formatMap.insert(QAbstractVideoBuffer::NoHandle, QVideoFrame::Format_RGB24);
QtTestVideoSurface surface(formatMap);
QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged()));
QList<QVideoFrame::PixelFormat> formats = surface.supportedPixelFormats();
diff --git a/tests/auto/unit/qcamera/tst_qcamera.cpp b/tests/auto/unit/qcamera/tst_qcamera.cpp
index 4b6202173..643b552f9 100644
--- a/tests/auto/unit/qcamera/tst_qcamera.cpp
+++ b/tests/auto/unit/qcamera/tst_qcamera.cpp
@@ -2039,7 +2039,7 @@ void tst_QCamera::testErrorSignal()
QCamera camera;
- QSignalSpy spyError(&camera, SIGNAL(error(QCamera::Error)));
+ QSignalSpy spyError(&camera, SIGNAL(errorOccurred(QCamera::Error)));
/* Set the QCameraControl error and verify if the signal is emitted correctly in QCamera */
service.mockControl->setError(QCamera::CameraError,QString("Camera Error"));
diff --git a/tests/auto/unit/qmediaobject/tst_qmediaobject.cpp b/tests/auto/unit/qmediaobject/tst_qmediaobject.cpp
index d2b43c56d..bf8704162 100644
--- a/tests/auto/unit/qmediaobject/tst_qmediaobject.cpp
+++ b/tests/auto/unit/qmediaobject/tst_qmediaobject.cpp
@@ -299,7 +299,7 @@ void tst_QMediaObject::notifySignals()
QTRY_COMPARE(spy.count(), count);
qint64 elapsed = timer.elapsed();
- int expectedElapsed = count * interval * 1.5; // give it some margin of error
+ int expectedElapsed = count * interval * 3; // give it some margin of error
QVERIFY2(elapsed < expectedElapsed, QString("elapsed: %1, expected: %2").arg(elapsed).arg(expectedElapsed).toLocal8Bit().constData());
}
diff --git a/tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp b/tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp
index 6aaeab855..be5c85ab9 100644
--- a/tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp
+++ b/tests/auto/unit/qpaintervideosurface/tst_qpaintervideosurface.cpp
@@ -35,9 +35,9 @@
#include <qvideosurfaceformat.h>
#if QT_CONFIG(opengl)
-#include <QtOpenGL/qgl.h>
-#include <QtOpenGL/qglframebufferobject.h>
-#include <QtGui/qopenglfunctions.h>
+#include <QOpenGLContext>
+#include <QOpenGLFunctions>
+#include <QOpenGLWidget>
#endif
QT_USE_NAMESPACE
@@ -559,20 +559,19 @@ void tst_QPainterVideoSurface::presentOpaqueFrame()
void tst_QPainterVideoSurface::shaderType()
{
QPainterVideoSurface surface;
- QGLWidget widget;
- if (!widget.context()
- || !widget.context()->isValid()) {
- QSKIP("Platform does not support GLContext");
- }
-
+ QOpenGLWidget widget;
widget.show();
+
QVERIFY(QTest::qWaitForWindowExposed(&widget));
- widget.makeCurrent();
+
+ if (!widget.context() || !widget.context()->isValid())
+ QSKIP("Platform does not support OpenGLContext");
QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders);
QCOMPARE(surface.supportedShaderTypes(), QPainterVideoSurface::NoShaders);
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
+ widget.makeCurrent();
+ surface.updateGLContext();
QCOMPARE(surface.glContext(), widget.context());
{
@@ -612,12 +611,14 @@ void tst_QPainterVideoSurface::shaderType()
{
QSignalSpy spy(&surface, SIGNAL(supportedFormatsChanged()));
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
+ widget.makeCurrent();
+ surface.updateGLContext();
QCOMPARE(surface.glContext(), widget.context());
QCOMPARE(spy.count(), 0);
}
- surface.setGLContext(0);
+ widget.doneCurrent();
+ surface.updateGLContext();
QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders);
QCOMPARE(surface.supportedShaderTypes(), QPainterVideoSurface::NoShaders);
@@ -656,19 +657,18 @@ void tst_QPainterVideoSurface::shaderTypeStarted()
{
QFETCH(QPainterVideoSurface::ShaderType, shaderType);
- QGLWidget widget;
- if (!widget.context()
- || !widget.context()->isValid()) {
- QSKIP("Platform does not support GLContext");
- }
-
+ QOpenGLWidget widget;
widget.show();
+
QVERIFY(QTest::qWaitForWindowExposed(&widget));
- widget.makeCurrent();
+
+ if (!widget.context() || !widget.context()->isValid())
+ QSKIP("Platform does not support OpenGLContext");
QPainterVideoSurface surface;
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
+ widget.makeCurrent();
+ surface.updateGLContext();
if (!(surface.supportedShaderTypes() & shaderType))
QSKIP("Shader type unsupported on this platform");
@@ -712,7 +712,8 @@ void tst_QPainterVideoSurface::shaderTypeStarted()
QCOMPARE(surface.isActive(), true);
QCOMPARE(spy.count(), 0);
- surface.setGLContext(0);
+ widget.doneCurrent();
+ surface.updateGLContext();
QCOMPARE(surface.shaderType(), QPainterVideoSurface::NoShaders);
QCOMPARE(surface.isActive(), false);
QCOMPARE(spy.count(), 1);
@@ -904,18 +905,17 @@ void tst_QPainterVideoSurface::shaderSupportedFormat()
QFETCH(bool, supportedPixelFormat);
QFETCH(bool, supportedFormat);
- QGLWidget widget;
- if (!widget.context()
- || !widget.context()->isValid()) {
- QSKIP("Platform does not support GLContext");
- }
-
+ QOpenGLWidget widget;
widget.show();
+
QVERIFY(QTest::qWaitForWindowExposed(&widget));
- widget.makeCurrent();
+
+ if (!widget.context() || !widget.context()->isValid())
+ QSKIP("Platform does not support GLContext");
QPainterVideoSurface surface;
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
+ widget.makeCurrent();
+ surface.updateGLContext();
if (!(surface.supportedShaderTypes() & shaderType))
@@ -1026,18 +1026,17 @@ void tst_QPainterVideoSurface::shaderPresent()
QFETCH(int, bytesB);
QFETCH(int, bytesPerLineB);
- QGLWidget widget;
- if (!widget.context()
- || !widget.context()->isValid()) {
- QSKIP("Platform does not support GLContext");
- }
-
+ QOpenGLWidget widget;
widget.show();
+
QVERIFY(QTest::qWaitForWindowExposed(&widget));
- widget.makeCurrent();
+
+ if (!widget.context() || !widget.context()->isValid())
+ QSKIP("Platform does not support GLContext");
QPainterVideoSurface surface;
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
+ widget.makeCurrent();
+ surface.updateGLContext();
if (!(surface.supportedShaderTypes() & shaderType))
QSKIP("Shader type unsupported on this platform");
@@ -1163,18 +1162,17 @@ void tst_QPainterVideoSurface::shaderPresentOpaqueFrame()
{
QFETCH(QPainterVideoSurface::ShaderType, shaderType);
- QGLWidget widget;
- if (!widget.context()
- || !widget.context()->isValid()) {
- QSKIP("Platform does not support GLContext");
- }
-
+ QOpenGLWidget widget;
widget.show();
+
QVERIFY(QTest::qWaitForWindowExposed(&widget));
- widget.makeCurrent();
+
+ if (!widget.context() || !widget.context()->isValid())
+ QSKIP("Platform does not support GLContext");
QPainterVideoSurface surface;
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
+ widget.makeCurrent();
+ surface.updateGLContext();
if (!(surface.supportedShaderTypes() & shaderType))
QSKIP("Shader type unsupported on this platform");
@@ -1217,18 +1215,17 @@ void tst_QPainterVideoSurface::shaderPresentGLFrame()
{
QFETCH(QPainterVideoSurface::ShaderType, shaderType);
- QGLWidget widget;
- if (!widget.context()
- || !widget.context()->isValid()) {
- QSKIP("Platform does not support GLContext");
- }
-
+ QOpenGLWidget widget;
widget.show();
+
QVERIFY(QTest::qWaitForWindowExposed(&widget));
- widget.makeCurrent();
+
+ if (!widget.context() || !widget.context()->isValid())
+ QSKIP("Platform does not support GLContext");
QPainterVideoSurface surface;
- surface.setGLContext(const_cast<QGLContext *>(widget.context()));
+ widget.makeCurrent();
+ surface.updateGLContext();
if (!(surface.supportedShaderTypes() & shaderType))
QSKIP("Shader type unsupported on this platform");