summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--examples/multimedia/declarative-radio/Button.qml14
-rw-r--r--src/imports/audioengine/qdeclarative_playvariation_p.cpp4
-rw-r--r--src/imports/audioengine/qdeclarative_sound_p.cpp2
-rw-r--r--src/multimedia/playback/qmedianetworkplaylistprovider.cpp2
-rw-r--r--src/multimedia/playback/qmediaplaylistnavigator.cpp4
-rw-r--r--src/multimediawidgets/qpaintervideosurface.cpp4
-rw-r--r--src/plugins/android/src/mediacapture/qandroidcamerasession.cpp10
-rw-r--r--src/plugins/common/evr/evrcustompresenter.cpp1
-rw-r--r--src/plugins/common/evr/evrcustompresenter.h2
-rw-r--r--src/plugins/common/evr/evrd3dpresentengine.cpp2
-rw-r--r--src/plugins/directshow/player/directshowplayerservice.cpp3
-rw-r--r--src/plugins/gstreamer/audiodecoder/qgstreameraudiodecodersession.cpp1
-rw-r--r--src/plugins/gstreamer/camerabin/camerabinsession.cpp15
-rw-r--r--src/plugins/wasapi/qwasapiutils.cpp23
-rw-r--r--src/plugins/windowsaudio/qwindowsaudiooutput.h3
-rw-r--r--src/plugins/wmf/mfstream.cpp2
-rw-r--r--src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp9
-rw-r--r--tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp11
18 files changed, 86 insertions, 26 deletions
diff --git a/examples/multimedia/declarative-radio/Button.qml b/examples/multimedia/declarative-radio/Button.qml
index c01c9d388..c579795e7 100644
--- a/examples/multimedia/declarative-radio/Button.qml
+++ b/examples/multimedia/declarative-radio/Button.qml
@@ -1,12 +1,22 @@
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
+** Contact: https://www.qt.io/licensing/
**
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
diff --git a/src/imports/audioengine/qdeclarative_playvariation_p.cpp b/src/imports/audioengine/qdeclarative_playvariation_p.cpp
index 5dd88506b..e6d3697d0 100644
--- a/src/imports/audioengine/qdeclarative_playvariation_p.cpp
+++ b/src/imports/audioengine/qdeclarative_playvariation_p.cpp
@@ -273,7 +273,7 @@ void QDeclarativePlayVariation::setSampleObject(QDeclarativeAudioSample *sampleO
void QDeclarativePlayVariation::applyParameters(QSoundInstance *soundInstance)
{
- qreal pitch = QRandomGenerator::bounded(1001 * 0.001f) * (m_maxPitch - m_minPitch) + m_minPitch;
- qreal gain = QRandomGenerator::bounded(1001 * 0.001f) * (m_maxGain - m_minGain) + m_minGain;
+ qreal pitch = QRandomGenerator::global()->bounded(1001 * 0.001f) * (m_maxPitch - m_minPitch) + m_minPitch;
+ qreal gain = QRandomGenerator::global()->bounded(1001 * 0.001f) * (m_maxGain - m_minGain) + m_minGain;
soundInstance->updateVariationParameters(pitch, gain, m_looping);
}
diff --git a/src/imports/audioengine/qdeclarative_sound_p.cpp b/src/imports/audioengine/qdeclarative_sound_p.cpp
index adbe9e53a..a11490cea 100644
--- a/src/imports/audioengine/qdeclarative_sound_p.cpp
+++ b/src/imports/audioengine/qdeclarative_sound_p.cpp
@@ -317,7 +317,7 @@ int QDeclarativeSound::genVariationIndex(int oldVariationIndex)
case QDeclarativeSound::Random: {
if (oldVariationIndex < 0)
oldVariationIndex = 0;
- return (oldVariationIndex + (QRandomGenerator::bounded(m_playlist.count() + 1))) % m_playlist.count();
+ return (oldVariationIndex + (QRandomGenerator::global()->bounded(m_playlist.count() + 1))) % m_playlist.count();
}
default:
return (oldVariationIndex + 1) % m_playlist.count();
diff --git a/src/multimedia/playback/qmedianetworkplaylistprovider.cpp b/src/multimedia/playback/qmedianetworkplaylistprovider.cpp
index 50db4fad2..3f24d0f55 100644
--- a/src/multimedia/playback/qmedianetworkplaylistprovider.cpp
+++ b/src/multimedia/playback/qmedianetworkplaylistprovider.cpp
@@ -267,7 +267,7 @@ void QMediaNetworkPlaylistProvider::shuffle()
QList<QMediaContent> resources;
while (!d->resources.isEmpty()) {
- resources.append(d->resources.takeAt(QRandomGenerator::bounded(d->resources.size())));
+ resources.append(d->resources.takeAt(QRandomGenerator::global()->bounded(d->resources.size())));
}
d->resources = resources;
diff --git a/src/multimedia/playback/qmediaplaylistnavigator.cpp b/src/multimedia/playback/qmediaplaylistnavigator.cpp
index 0bacbf2ba..0966c9396 100644
--- a/src/multimedia/playback/qmediaplaylistnavigator.cpp
+++ b/src/multimedia/playback/qmediaplaylistnavigator.cpp
@@ -125,7 +125,7 @@ int QMediaPlaylistNavigatorPrivate::nextItemPos(int steps) const
randomModePositions.append(-1);
int res = randomModePositions[randomPositionsOffset+steps];
if (res<0 || res >= playlist->mediaCount()) {
- res = QRandomGenerator::bounded(playlist->mediaCount());
+ res = QRandomGenerator::global()->bounded(playlist->mediaCount());
randomModePositions[randomPositionsOffset+steps] = res;
}
@@ -178,7 +178,7 @@ int QMediaPlaylistNavigatorPrivate::previousItemPos(int steps) const
int res = randomModePositions[randomPositionsOffset-steps];
if (res<0 || res >= playlist->mediaCount()) {
- res = QRandomGenerator::bounded(playlist->mediaCount());
+ res = QRandomGenerator::global()->bounded(playlist->mediaCount());
randomModePositions[randomPositionsOffset-steps] = res;
}
diff --git a/src/multimediawidgets/qpaintervideosurface.cpp b/src/multimediawidgets/qpaintervideosurface.cpp
index 214e5ec7e..6e93e150d 100644
--- a/src/multimediawidgets/qpaintervideosurface.cpp
+++ b/src/multimediawidgets/qpaintervideosurface.cpp
@@ -191,6 +191,10 @@ QAbstractVideoSurface::Error QVideoSurfaceGenericPainter::paint(
m_imageSize.height(),
m_frame.bytesPerLine(),
m_imageFormat);
+ // Do not render into ARGB32 images using QPainter.
+ // Using QImage::Format_ARGB32_Premultiplied is significantly faster.
+ if (m_imageFormat == QImage::Format_ARGB32)
+ image = image.convertToFormat(QImage::Format_ARGB32_Premultiplied);
const QTransform oldTransform = painter->transform();
QTransform transform = oldTransform;
diff --git a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
index a7f0254ee..15aa027e4 100644
--- a/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
+++ b/src/plugins/android/src/mediacapture/qandroidcamerasession.cpp
@@ -697,7 +697,7 @@ void QAndroidCameraSession::onCameraTakePictureFailed()
void QAndroidCameraSession::onCameraPictureExposed()
{
- if (m_captureCanceled)
+ if (m_captureCanceled || !m_camera)
return;
emit imageExposed(m_currentImageCaptureId);
@@ -706,7 +706,7 @@ void QAndroidCameraSession::onCameraPictureExposed()
void QAndroidCameraSession::onLastPreviewFrameFetched(const QVideoFrame &frame)
{
- if (m_captureCanceled)
+ if (m_captureCanceled || !m_camera)
return;
QtConcurrent::run(this, &QAndroidCameraSession::processPreviewImage,
@@ -730,6 +730,9 @@ void QAndroidCameraSession::processPreviewImage(int id, const QVideoFrame &frame
void QAndroidCameraSession::onNewPreviewFrame(const QVideoFrame &frame)
{
+ if (!m_camera)
+ return;
+
m_videoProbesMutex.lock();
for (QAndroidMediaVideoProbeControl *probe : qAsConst(m_videoProbes))
@@ -756,7 +759,8 @@ void QAndroidCameraSession::onCameraPictureCaptured(const QByteArray &data)
m_captureCanceled = false;
// Preview needs to be restarted after taking a picture
- m_camera->startPreview();
+ if (m_camera)
+ m_camera->startPreview();
}
void QAndroidCameraSession::onCameraPreviewStarted()
diff --git a/src/plugins/common/evr/evrcustompresenter.cpp b/src/plugins/common/evr/evrcustompresenter.cpp
index 38e8c3a8f..958204079 100644
--- a/src/plugins/common/evr/evrcustompresenter.cpp
+++ b/src/plugins/common/evr/evrcustompresenter.cpp
@@ -560,7 +560,6 @@ EVRCustomPresenter::EVRCustomPresenter(QAbstractVideoSurface *surface)
, m_mediaType(0)
, m_surface(0)
, m_canRenderToSurface(false)
- , m_sampleToPresent(0)
{
// Initial source rectangle = (0,0,1,1)
m_sourceRect.top = 0;
diff --git a/src/plugins/common/evr/evrcustompresenter.h b/src/plugins/common/evr/evrcustompresenter.h
index 5c240ea95..199dee774 100644
--- a/src/plugins/common/evr/evrcustompresenter.h
+++ b/src/plugins/common/evr/evrcustompresenter.h
@@ -367,8 +367,6 @@ private:
QAbstractVideoSurface *m_surface;
bool m_canRenderToSurface;
-
- IMFSample *m_sampleToPresent;
};
bool qt_evr_setCustomPresenter(IUnknown *evr, EVRCustomPresenter *presenter);
diff --git a/src/plugins/common/evr/evrd3dpresentengine.cpp b/src/plugins/common/evr/evrd3dpresentengine.cpp
index 043d0ad73..fd9ccdef1 100644
--- a/src/plugins/common/evr/evrd3dpresentengine.cpp
+++ b/src/plugins/common/evr/evrd3dpresentengine.cpp
@@ -49,7 +49,7 @@
#include <private/qmediaopenglhelper_p.h>
#ifdef MAYBE_ANGLE
-# include <qtgui/qguiapplication.h>
+# include <qguiapplication.h>
# include <qpa/qplatformnativeinterface.h>
# include <qopenglfunctions.h>
# include <EGL/eglext.h>
diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp
index 9cbb62969..8ee5d67a1 100644
--- a/src/plugins/directshow/player/directshowplayerservice.cpp
+++ b/src/plugins/directshow/player/directshowplayerservice.cpp
@@ -402,7 +402,6 @@ void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker)
} else if (!m_resources.isEmpty()) {
m_pendingTasks |= SetUrlSource;
} else {
- m_pendingTasks = 0;
m_graphStatus = InvalidMedia;
switch (hr) {
@@ -1688,8 +1687,6 @@ void DirectShowPlayerService::run()
QMutexLocker locker(&m_mutex);
for (;;) {
- ::ResetEvent(m_taskHandle);
-
while (m_pendingTasks == 0) {
DWORD result = 0;
diff --git a/src/plugins/gstreamer/audiodecoder/qgstreameraudiodecodersession.cpp b/src/plugins/gstreamer/audiodecoder/qgstreameraudiodecodersession.cpp
index 779978e70..d6b8ad759 100644
--- a/src/plugins/gstreamer/audiodecoder/qgstreameraudiodecodersession.cpp
+++ b/src/plugins/gstreamer/audiodecoder/qgstreameraudiodecodersession.cpp
@@ -478,6 +478,7 @@ QAudioBuffer QGstreamerAudioDecoderSession::read()
}
}
#if GST_CHECK_VERSION(1,0,0)
+ gst_buffer_unmap(buffer, &mapInfo);
gst_sample_unref(sample);
#else
gst_buffer_unref(buffer);
diff --git a/src/plugins/gstreamer/camerabin/camerabinsession.cpp b/src/plugins/gstreamer/camerabin/camerabinsession.cpp
index ab0bea24a..4941c6ef6 100644
--- a/src/plugins/gstreamer/camerabin/camerabinsession.cpp
+++ b/src/plugins/gstreamer/camerabin/camerabinsession.cpp
@@ -212,6 +212,12 @@ CameraBinSession::~CameraBinSession()
if (m_sourceFactory)
gst_object_unref(GST_OBJECT(m_sourceFactory));
+
+ if (m_cameraSrc)
+ gst_object_unref(GST_OBJECT(m_cameraSrc));
+
+ if (m_videoSrc)
+ gst_object_unref(GST_OBJECT(m_videoSrc));
}
#if QT_CONFIG(gstreamer_photography)
@@ -538,11 +544,12 @@ GstElement *CameraBinSession::buildCameraSource()
}
}
- if (m_cameraSrc != camSrc)
+ if (m_cameraSrc != camSrc) {
g_object_set(G_OBJECT(m_camerabin), CAMERA_SOURCE_PROPERTY, m_cameraSrc, NULL);
-
- if (camSrc)
- gst_object_unref(GST_OBJECT(camSrc));
+ // Unref only if camSrc is not m_cameraSrc to prevent double unrefing.
+ if (camSrc)
+ gst_object_unref(GST_OBJECT(camSrc));
+ }
return m_cameraSrc;
}
diff --git a/src/plugins/wasapi/qwasapiutils.cpp b/src/plugins/wasapi/qwasapiutils.cpp
index 727c94c23..0d03982de 100644
--- a/src/plugins/wasapi/qwasapiutils.cpp
+++ b/src/plugins/wasapi/qwasapiutils.cpp
@@ -90,6 +90,26 @@ struct DeviceMapping {
Q_GLOBAL_STATIC(DeviceMapping, gMapping)
}
+struct CoInitializer
+{
+ CoInitializer()
+ {
+ const bool isGuiThread = QCoreApplication::instance() &&
+ QThread::currentThread() == QCoreApplication::instance()->thread();
+ CoInitializeEx(NULL, isGuiThread ? COINIT_APARTMENTTHREADED : COINIT_MULTITHREADED);
+ }
+
+ ~CoInitializer()
+ {
+ CoUninitialize();
+ }
+};
+
+static void CoInitIfNeeded()
+{
+ static CoInitializer initializer;
+}
+
AudioInterface::AudioInterface()
{
qCDebug(lcMmAudioInterface) << __FUNCTION__;
@@ -182,6 +202,7 @@ QByteArray QWasapiUtils::defaultDevice(QAudio::Mode mode)
{
qCDebug(lcMmUtils) << __FUNCTION__ << mode;
+ CoInitIfNeeded();
QList<QByteArray> &deviceNames = mode == QAudio::AudioInput ? gMapping->inputDeviceNames : gMapping->outputDeviceNames;
QList<QString> &deviceIds = mode == QAudio::AudioInput ? gMapping->inputDeviceIds : gMapping->outputDeviceIds;
if (deviceNames.isEmpty() || deviceIds.isEmpty()) // Initialize
@@ -214,6 +235,7 @@ QList<QByteArray> QWasapiUtils::availableDevices(QAudio::Mode mode)
{
qCDebug(lcMmUtils) << __FUNCTION__ << mode;
+ CoInitIfNeeded();
ComPtr<IDeviceInformationStatics> statics;
HRESULT hr;
@@ -290,6 +312,7 @@ Microsoft::WRL::ComPtr<AudioInterface> QWasapiUtils::createOrGetInterface(const
{
qCDebug(lcMmUtils) << __FUNCTION__ << dev << mode;
Q_ASSERT((mode == QAudio::AudioInput ? gMapping->inputDeviceNames.indexOf(dev) : gMapping->outputDeviceNames.indexOf(dev)) != -1);
+ CoInitIfNeeded();
Microsoft::WRL::ComPtr<AudioInterface> result;
HRESULT hr = QEventDispatcherWinRT::runOnXamlThread([dev, mode, &result]() {
diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.h b/src/plugins/windowsaudio/qwindowsaudiooutput.h
index 19b4b92af..f25475b02 100644
--- a/src/plugins/windowsaudio/qwindowsaudiooutput.h
+++ b/src/plugins/windowsaudio/qwindowsaudiooutput.h
@@ -116,7 +116,6 @@ private slots:
private:
QByteArray m_device;
- bool resuming;
int bytesAvailable;
QTime timeStamp;
qint64 elapsedTimeOffset;
@@ -139,8 +138,6 @@ private:
WAVEFORMATEXTENSIBLE wfx;
HWAVEOUT hWaveOut;
- MMRESULT result;
- WAVEHDR header;
WAVEHDR* waveBlocks;
volatile bool finished;
volatile int waveFreeBlockCount;
diff --git a/src/plugins/wmf/mfstream.cpp b/src/plugins/wmf/mfstream.cpp
index fd95bf20b..a98b5a704 100644
--- a/src/plugins/wmf/mfstream.cpp
+++ b/src/plugins/wmf/mfstream.cpp
@@ -231,6 +231,8 @@ STDMETHODIMP MFStream::Seek(
qint64 pos = qint64(llSeekOffset);
switch (SeekOrigin) {
+ case msoBegin:
+ break;
case msoCurrent:
pos += m_stream->pos();
break;
diff --git a/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp b/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp
index 8cd331495..7030b3357 100644
--- a/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp
+++ b/src/qtmultimediaquicktools/qdeclarativevideooutput_render.cpp
@@ -335,7 +335,14 @@ QSGNode *QDeclarativeVideoRendererBackend::updatePaintNode(QSGNode *oldNode,
for (QSGVideoNodeFactoryInterface* factory : qAsConst(m_videoNodeFactories)) {
// Get a node that supports our frame. The surface is irrelevant, our
// QSGVideoItemSurface supports (logically) anything.
- videoNode = factory->createNode(QVideoSurfaceFormat(m_frame.size(), m_frame.pixelFormat(), m_frame.handleType()));
+ QVideoSurfaceFormat nodeFormat(m_frame.size(), m_frame.pixelFormat(), m_frame.handleType());
+ const QVideoSurfaceFormat surfaceFormat = m_surface->surfaceFormat();
+ nodeFormat.setYCbCrColorSpace(surfaceFormat.yCbCrColorSpace());
+ nodeFormat.setPixelAspectRatio(surfaceFormat.pixelAspectRatio());
+ nodeFormat.setScanLineDirection(surfaceFormat.scanLineDirection());
+ nodeFormat.setViewport(surfaceFormat.viewport());
+ nodeFormat.setFrameRate(surfaceFormat.frameRate());
+ videoNode = factory->createNode(nodeFormat);
if (videoNode) {
qCDebug(qLcVideo) << "updatePaintNode: Video node created. Handle type:" << m_frame.handleType()
<< " Supported formats for the handle by this node:"
diff --git a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
index 6921d46e5..9a0a2d9c1 100644
--- a/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
+++ b/tests/auto/integration/qmediaplayerbackend/tst_qmediaplayerbackend.cpp
@@ -60,6 +60,7 @@ private slots:
void construction();
void loadMedia();
void unloadMedia();
+ void loadMediaInLoadingState();
void playPauseStop();
void processEOS();
void deleteLaterAtEOS();
@@ -304,6 +305,16 @@ void tst_QMediaPlayerBackend::unloadMedia()
QVERIFY(!positionSpy.isEmpty());
}
+void tst_QMediaPlayerBackend::loadMediaInLoadingState()
+{
+ const QUrl url("http://unavailable.media/");
+ QMediaPlayer player;
+ player.setMedia(QMediaContent(url));
+ player.play();
+ // Sets new media while old has not been finished.
+ player.setMedia(QMediaContent(url));
+ QTRY_COMPARE(player.mediaStatus(), QMediaPlayer::InvalidMedia);
+}
void tst_QMediaPlayerBackend::playPauseStop()
{