summaryrefslogtreecommitdiffstats
path: root/src/plugins/directshow
diff options
context:
space:
mode:
authorVal Doroshchuk <valentyn.doroshchuk@qt.io>2019-08-29 12:46:33 +0200
committerVal Doroshchuk <valentyn.doroshchuk@qt.io>2019-08-29 13:59:40 +0200
commit94852a47c130c3dc265d900390bf0d7b53cbab3e (patch)
tree8fcaa692de23e3f14dbb6bd21664c9cb750f7e7f /src/plugins/directshow
parent012affe3194a48d8bb10d0a100f1d1bbb24ecf7e (diff)
DirectShow: Add startTime and endTime to QVideoFrame
If the application seeks to a new position, the Media Session restarts the presentation clock at the specified seek time. The media source might deliver samples with a slightly earlier time stamp if the seek time does not fall on a key-frame boundary. And IMFSample->GetSampleTime will return time that is related to a position when the clock has been restarted, and can be also negative. So if it needs to have times from the beginning, it would require to add seeked position to times from IMFSample. It also reverts c4de056a6aa44567cdbf2ce91a464e597ad4af8f Fixes: QTBUG-77849 Change-Id: I1a7cb7bd18aee73087a61d2ed2c3d644ad0fbd50 Reviewed-by: Christian Strømme <christian.stromme@qt.io>
Diffstat (limited to 'src/plugins/directshow')
-rw-r--r--src/plugins/directshow/player/directshowplayerservice.cpp3
-rw-r--r--src/plugins/directshow/player/directshowvideorenderercontrol.cpp1
-rw-r--r--src/plugins/directshow/player/directshowvideorenderercontrol.h1
3 files changed, 5 insertions, 0 deletions
diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp
index 0d44da722..aed03f9de 100644
--- a/src/plugins/directshow/player/directshowplayerservice.cpp
+++ b/src/plugins/directshow/player/directshowplayerservice.cpp
@@ -1457,6 +1457,9 @@ void DirectShowPlayerService::customEvent(QEvent *event)
if (m_playerControl->mediaStatus() == QMediaPlayer::EndOfMedia)
m_playerControl->updateStatus(QMediaPlayer::LoadedMedia);
m_playerControl->updatePosition(m_position);
+ // Emits only when seek has been performed.
+ if (m_videoRendererControl)
+ emit m_videoRendererControl->positionChanged(m_position);
} else {
QMediaService::customEvent(event);
}
diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp
index 88b5a51eb..bbf7cf8b9 100644
--- a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp
+++ b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp
@@ -101,6 +101,7 @@ void DirectShowVideoRendererControl::setSurface(QAbstractVideoSurface *surface)
if (!qgetenv("QT_DIRECTSHOW_NO_EVR").toInt()) {
m_filter = com_new<IBaseFilter>(clsid_EnhancedVideoRenderer);
m_evrPresenter = new EVRCustomPresenter(m_surface);
+ connect(this, &DirectShowVideoRendererControl::positionChanged, m_evrPresenter, &EVRCustomPresenter::positionChanged);
if (!m_evrPresenter->isValid() || !qt_evr_setCustomPresenter(m_filter, m_evrPresenter)) {
m_filter->Release();
m_filter = 0;
diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.h b/src/plugins/directshow/player/directshowvideorenderercontrol.h
index b2abeeaed..930f8a6b1 100644
--- a/src/plugins/directshow/player/directshowvideorenderercontrol.h
+++ b/src/plugins/directshow/player/directshowvideorenderercontrol.h
@@ -68,6 +68,7 @@ public:
Q_SIGNALS:
void filterChanged();
+ void positionChanged(qint64 position);
private:
DirectShowEventLoop *m_loop;