diff options
Diffstat (limited to 'src/plugins/directshow/player/directshowplayerservice.cpp')
-rw-r--r-- | src/plugins/directshow/player/directshowplayerservice.cpp | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp index 07427583d..8e9e50cbf 100644 --- a/src/plugins/directshow/player/directshowplayerservice.cpp +++ b/src/plugins/directshow/player/directshowplayerservice.cpp @@ -103,6 +103,7 @@ DirectShowPlayerService::DirectShowPlayerService(QObject *parent) , m_buffering(false) , m_seekable(false) , m_atEnd(false) + , m_dontCacheNextSeekResult(false) { m_playerControl = new DirectShowPlayerControl(this); m_metaDataControl = new DirectShowMetaDataControl(this); @@ -229,7 +230,8 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream m_buffering = false; m_seekable = false; m_atEnd = false; - m_metaDataControl->updateGraph(0, 0); + m_dontCacheNextSeekResult = false; + m_metaDataControl->reset(); if (m_resources.isEmpty() && !stream) { m_pendingTasks = 0; @@ -568,9 +570,6 @@ void DirectShowPlayerService::doReleaseGraph(QMutexLocker *locker) control->Release(); } - //release m_headerInfo -> decrease ref counter of m_source - m_metaDataControl->updateGraph(0, 0); - if (m_source) { m_source->Release(); m_source = 0; @@ -672,7 +671,9 @@ void DirectShowPlayerService::play() if (m_executedTasks & Stop) { m_atEnd = false; if (m_seekPosition == -1) { + m_dontCacheNextSeekResult = true; m_seekPosition = 0; + m_position = 0; m_pendingTasks |= Seek; } m_executedTasks ^= Stop; @@ -718,7 +719,9 @@ void DirectShowPlayerService::pause() if (m_executedTasks & Stop) { m_atEnd = false; if (m_seekPosition == -1) { + m_dontCacheNextSeekResult = true; m_seekPosition = 0; + m_position = 0; m_pendingTasks |= Seek; } m_executedTasks ^= Stop; @@ -791,6 +794,8 @@ void DirectShowPlayerService::doStop(QMutexLocker *locker) } m_seekPosition = 0; + m_position = 0; + m_dontCacheNextSeekResult = true; m_pendingTasks |= Seek; m_executedTasks &= ~(Play | Pause); @@ -913,8 +918,10 @@ void DirectShowPlayerService::doSeek(QMutexLocker *locker) // Cache current values as we can't query IMediaSeeking during a seek due to the // possibility of a deadlock when flushing the VideoSurfaceFilter. LONGLONG currentPosition = 0; - seeking->GetCurrentPosition(¤tPosition); - m_position = currentPosition / qt_directShowTimeScale; + if (!m_dontCacheNextSeekResult) { + seeking->GetCurrentPosition(¤tPosition); + m_position = currentPosition / qt_directShowTimeScale; + } LONGLONG minimum = 0; LONGLONG maximum = 0; @@ -928,8 +935,10 @@ void DirectShowPlayerService::doSeek(QMutexLocker *locker) &seekPosition, AM_SEEKING_AbsolutePositioning, 0, AM_SEEKING_NoPositioning); locker->relock(); - seeking->GetCurrentPosition(¤tPosition); - m_position = currentPosition / qt_directShowTimeScale; + if (!m_dontCacheNextSeekResult) { + seeking->GetCurrentPosition(¤tPosition); + m_position = currentPosition / qt_directShowTimeScale; + } seeking->Release(); @@ -937,6 +946,7 @@ void DirectShowPlayerService::doSeek(QMutexLocker *locker) } m_seekPosition = -1; + m_dontCacheNextSeekResult = false; } int DirectShowPlayerService::bufferStatus() const @@ -1125,7 +1135,7 @@ void DirectShowPlayerService::customEvent(QEvent *event) QMutexLocker locker(&m_mutex); m_playerControl->updateMediaInfo(m_duration, m_streamTypes, m_seekable); - m_metaDataControl->updateGraph(m_graph, m_source, m_url.toString()); + m_metaDataControl->updateMetadata(m_graph, m_source, m_url.toString()); updateStatus(); } else if (event->type() == QEvent::Type(Error)) { |