summaryrefslogtreecommitdiffstats
path: root/src/plugins/common
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-09-08 11:31:04 +0200
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-09-08 11:31:05 +0200
commitdfc018e15886cf5d55f246670ba67203948fa764 (patch)
tree82a1bd1217709843b922724a520462b55029ac4a /src/plugins/common
parentd31e5042ed6d8c1bd4dafe980eb90db4fc3e63de (diff)
parentbbf21e0a222f4f9bb5acae7b02faddca3b354e4e (diff)
Merge remote-tracking branch 'origin/5.12' into 5.13
Diffstat (limited to 'src/plugins/common')
-rw-r--r--src/plugins/common/evr/evrcustompresenter.cpp17
-rw-r--r--src/plugins/common/evr/evrcustompresenter.h4
-rw-r--r--src/plugins/common/evr/evrd3dpresentengine.cpp11
3 files changed, 31 insertions, 1 deletions
diff --git a/src/plugins/common/evr/evrcustompresenter.cpp b/src/plugins/common/evr/evrcustompresenter.cpp
index 84786e9a9..2bc761c45 100644
--- a/src/plugins/common/evr/evrcustompresenter.cpp
+++ b/src/plugins/common/evr/evrcustompresenter.cpp
@@ -557,6 +557,7 @@ EVRCustomPresenter::EVRCustomPresenter(QAbstractVideoSurface *surface)
, m_mediaType(0)
, m_surface(0)
, m_canRenderToSurface(false)
+ , m_positionOffset(0)
{
// Initial source rectangle = (0,0,1,1)
m_sourceRect.top = 0;
@@ -1143,7 +1144,7 @@ HRESULT EVRCustomPresenter::flush()
sample->Release();
m_frameStep.samples.clear();
- if (m_renderState == RenderStopped && m_surface->isActive()) {
+ if (m_renderState == RenderStopped && m_surface && m_surface->isActive()) {
// Repaint with black.
presentSample(NULL);
}
@@ -1932,6 +1933,15 @@ void EVRCustomPresenter::presentSample(IMFSample *sample)
QVideoFrame frame = m_presentEngine->makeVideoFrame(sample);
+ // Since start/end times are related to a position when the clock is started,
+ // to have times from the beginning, need to adjust it by adding seeked position.
+ if (m_positionOffset) {
+ if (frame.startTime())
+ frame.setStartTime(frame.startTime() + m_positionOffset);
+ if (frame.endTime())
+ frame.setEndTime(frame.endTime() + m_positionOffset);
+ }
+
if (!m_surface->isActive() || m_surface->surfaceFormat() != m_presentEngine->videoSurfaceFormat()) {
m_surface->stop();
if (!m_surface->start(m_presentEngine->videoSurfaceFormat()))
@@ -1941,6 +1951,11 @@ void EVRCustomPresenter::presentSample(IMFSample *sample)
m_surface->present(frame);
}
+void EVRCustomPresenter::positionChanged(qint64 position)
+{
+ m_positionOffset = position * 1000;
+}
+
HRESULT setDesiredSampleTime(IMFSample *sample, const LONGLONG &sampleTime, const LONGLONG &duration)
{
if (!sample)
diff --git a/src/plugins/common/evr/evrcustompresenter.h b/src/plugins/common/evr/evrcustompresenter.h
index bd04bd952..9e1ee88d6 100644
--- a/src/plugins/common/evr/evrcustompresenter.h
+++ b/src/plugins/common/evr/evrcustompresenter.h
@@ -264,6 +264,9 @@ public:
bool event(QEvent *) override;
+public Q_SLOTS:
+ void positionChanged(qint64 position);
+
private:
HRESULT checkShutdown() const
{
@@ -364,6 +367,7 @@ private:
QAbstractVideoSurface *m_surface;
bool m_canRenderToSurface;
+ qint64 m_positionOffset; // Seek position in microseconds.
};
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 4ce5a99d7..d8e2da6d3 100644
--- a/src/plugins/common/evr/evrd3dpresentengine.cpp
+++ b/src/plugins/common/evr/evrd3dpresentengine.cpp
@@ -593,6 +593,17 @@ QVideoFrame D3DPresentEngine::makeVideoFrame(IMFSample *sample)
m_surfaceFormat.frameSize(),
m_surfaceFormat.pixelFormat());
+ // WMF uses 100-nanosecond units, Qt uses microseconds
+ LONGLONG startTime = 0;
+ auto hr = sample->GetSampleTime(&startTime);
+ if (SUCCEEDED(hr)) {
+ frame.setStartTime(startTime * 0.1);
+
+ LONGLONG duration = -1;
+ if (SUCCEEDED(sample->GetSampleDuration(&duration)))
+ frame.setEndTime((startTime + duration) * 0.1);
+ }
+
return frame;
}