summaryrefslogtreecommitdiffstats
path: root/src/plugins/directshow/player
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2019-06-03 11:18:47 +0200
committerLiang Qi <liang.qi@qt.io>2019-06-03 11:18:47 +0200
commitdfc0ee4975958f7144f04957b6d5856a28e99361 (patch)
tree249cc992e09e208c29369830af8cce6b0456a9bf /src/plugins/directshow/player
parent7ef21f7ed206749252fbd03f673a8588890828b1 (diff)
parent3bbeae539854c1474844c65025d40b813cec286c (diff)
Merge remote-tracking branch 'origin/5.12' into 5.13
Conflicts: src/plugins/directshow/player/directshowplayerservice.cpp Change-Id: I6b7edc312ecfadf84653ce24321ec55da41e131a
Diffstat (limited to 'src/plugins/directshow/player')
-rw-r--r--src/plugins/directshow/player/directshowplayercontrol.cpp3
-rw-r--r--src/plugins/directshow/player/directshowplayerservice.cpp25
2 files changed, 23 insertions, 5 deletions
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 3f7346227..5f7c65ad0 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