summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-06-03 15:34:21 +0200
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-06-03 15:34:21 +0200
commit58a304824abbff8f1bf3d5031c1799de91869190 (patch)
treea092b1400a82b86acee4e2771bfc2f27630f0261 /src/plugins
parentafca8928ce8e4113a224e57fa30a3b4bc5a2db47 (diff)
parent293566a1841151cf0a374af7016a396c943ab96e (diff)
Merge remote-tracking branch 'origin/5.13' into dev
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/common/evr/evrd3dpresentengine.cpp10
-rw-r--r--src/plugins/directshow/player/directshowplayercontrol.cpp3
-rw-r--r--src/plugins/directshow/player/directshowplayerservice.cpp25
-rw-r--r--src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp5
4 files changed, 26 insertions, 17 deletions
diff --git a/src/plugins/common/evr/evrd3dpresentengine.cpp b/src/plugins/common/evr/evrd3dpresentengine.cpp
index ab694b795..4ce5a99d7 100644
--- a/src/plugins/common/evr/evrd3dpresentengine.cpp
+++ b/src/plugins/common/evr/evrd3dpresentengine.cpp
@@ -593,16 +593,6 @@ QVideoFrame D3DPresentEngine::makeVideoFrame(IMFSample *sample)
m_surfaceFormat.frameSize(),
m_surfaceFormat.pixelFormat());
- // WMF uses 100-nanosecond units, Qt uses microseconds
- LONGLONG startTime = -1;
- if (SUCCEEDED(sample->GetSampleTime(&startTime))) {
- frame.setStartTime(startTime * 0.1);
-
- LONGLONG duration = -1;
- if (SUCCEEDED(sample->GetSampleDuration(&duration)))
- frame.setEndTime((startTime + duration) * 0.1);
- }
-
return frame;
}
diff --git a/src/plugins/directshow/player/directshowplayercontrol.cpp b/src/plugins/directshow/player/directshowplayercontrol.cpp
index 2d0ee2d59..7de0a686f 100644
--- a/src/plugins/directshow/player/directshowplayercontrol.cpp
+++ b/src/plugins/directshow/player/directshowplayercontrol.cpp
@@ -219,6 +219,9 @@ const QIODevice *DirectShowPlayerControl::mediaStream() const
void DirectShowPlayerControl::setMedia(const QMediaContent &media, QIODevice *stream)
{
+ if (m_media == media)
+ return;
+
m_pendingPosition = -1;
m_emitPosition = -1;
diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp
index 059e253f1..d5b8bef26 100644
--- a/src/plugins/directshow/player/directshowplayerservice.cpp
+++ b/src/plugins/directshow/player/directshowplayerservice.cpp
@@ -408,8 +408,6 @@ void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker)
m_pendingTasks |= SetRate;
m_source = source;
- } else if (!m_url.isEmpty()) {
- m_pendingTasks |= SetUrlSource;
} else {
m_graphStatus = InvalidMedia;
@@ -531,9 +529,16 @@ void DirectShowPlayerService::doRender(QMutexLocker *locker)
} else {
locker->unlock();
HRESULT hr = graph->RenderEx(pin, /*AM_RENDEREX_RENDERTOEXISTINGRENDERERS*/ 1, 0);
- // Do not return an error if no video output is set yet.
- if (SUCCEEDED(hr) || !(m_executedTasks & SetVideoOutput)) {
+ if (SUCCEEDED(hr)) {
rendered = true;
+ m_error = QMediaPlayer::NoError;
+ } else if (!(m_executedTasks & SetVideoOutput)) {
+ // Do not return an error if no video output is set yet.
+ rendered = true;
+ // Remember the error in this case.
+ // Handle it when playing is requested and no video output has been provided.
+ m_error = QMediaPlayer::ResourceError;
+ m_errorString = QString("%1: %2").arg(__FUNCTION__).arg(qt_error_string(hr));
} else if (renderHr == S_OK || renderHr == VFW_E_NO_DECOMPRESSOR){
renderHr = hr;
}
@@ -914,6 +919,16 @@ void DirectShowPlayerService::play()
void DirectShowPlayerService::doPlay(QMutexLocker *locker)
{
+ // Invalidate if there is an error while loading.
+ if (m_error != QMediaPlayer::NoError) {
+ m_graphStatus = InvalidMedia;
+ if (!m_errorString.isEmpty())
+ qWarning("%s", qPrintable(m_errorString));
+ m_errorString = QString();
+ QCoreApplication::postEvent(this, new QEvent(QEvent::Type(Error)));
+ return;
+ }
+
if (IMediaControl *control = com_cast<IMediaControl>(m_graph, IID_IMediaControl)) {
locker->unlock();
HRESULT hr = control->Run();
@@ -1615,7 +1630,7 @@ void DirectShowPlayerService::updateStatus()
m_playerControl->updateStatus(QMediaPlayer::LoadingMedia);
break;
case Loaded:
- if ((m_pendingTasks | m_executingTask | m_executedTasks) & (Play | Pause)) {
+ if ((m_executingTask | m_executedTasks) & (Play | Pause)) {
if (m_buffering)
m_playerControl->updateStatus(QMediaPlayer::BufferingMedia);
else
diff --git a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp
index c054c0f76..70e7fbce5 100644
--- a/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp
+++ b/src/plugins/windowsaudio/qwindowsaudiodeviceinfo.cpp
@@ -396,7 +396,7 @@ QList<QByteArray> QWindowsAudioDeviceInfo::availableDevices(QAudio::Mode mode)
QList<QByteArray> devices;
//enumerate device fullnames through directshow api
- CoInitialize(NULL);
+ auto hrCoInit = CoInitialize(nullptr);
ICreateDevEnum *pDevEnum = NULL;
IEnumMoniker *pEnum = NULL;
// Create the System device enumerator
@@ -447,7 +447,8 @@ QList<QByteArray> QWindowsAudioDeviceInfo::availableDevices(QAudio::Mode mode)
}
pDevEnum->Release();
}
- CoUninitialize();
+ if (SUCCEEDED(hrCoInit))
+ CoUninitialize();
return devices;
}