From ea084467fb20f68ba55366876031ac9a7486878b Mon Sep 17 00:00:00 2001 From: Andre de la Rocha Date: Sun, 16 May 2021 18:14:30 +0200 Subject: Windows: Fix slowdown while recording video Emitting the durationChanged() signal from the OnReadSample callback was causing a major slowdown while recording video. Change-Id: Ie1e26507b4381ed8b7da9f43914fc627a0c0b063 Reviewed-by: Lars Knoll --- .../windows/mediacapture/qwindowscamerareader.cpp | 20 +++++++++++++++++++- .../windows/mediacapture/qwindowscamerareader_p.h | 7 +++++++ 2 files changed, 26 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscamerareader.cpp b/src/multimedia/platform/windows/mediacapture/qwindowscamerareader.cpp index 1fb78f912..589585b9c 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowscamerareader.cpp +++ b/src/multimedia/platform/windows/mediacapture/qwindowscamerareader.cpp @@ -50,6 +50,8 @@ QWindowsCameraReader::QWindowsCameraReader(QObject *parent) : QObject(parent), m_finalizeSemaphore(1) { + m_durationTimer.setInterval(100); + connect(&m_durationTimer, SIGNAL(timeout()), this, SLOT(updateDuration())); } QWindowsCameraReader::~QWindowsCameraReader() @@ -250,6 +252,10 @@ bool QWindowsCameraReader::startRecording(const QString &fileName, const GUID &c hr = m_sinkWriter->BeginWriting(); if (SUCCEEDED(hr)) { + m_lastDuration = -1; + m_currentDuration = 0; + updateDuration(); + m_durationTimer.start(); m_recording = true; m_firstFrame = true; m_paused = false; @@ -288,6 +294,10 @@ void QWindowsCameraReader::stopRecording() m_recording = false; m_paused = false; m_pauseChanging = false; + + m_durationTimer.stop(); + m_lastDuration = -1; + m_currentDuration = -1; } bool QWindowsCameraReader::pauseRecording() @@ -361,6 +371,14 @@ qreal QWindowsCameraReader::frameRate() const return m_frameRate; } +void QWindowsCameraReader::updateDuration() +{ + if (m_currentDuration >= 0 && m_lastDuration != m_currentDuration) { + m_lastDuration = m_currentDuration; + emit durationChanged(m_currentDuration); + } +} + //from IMFSourceReaderCallback STDMETHODIMP QWindowsCameraReader::OnReadSample(HRESULT hrStatus, DWORD dwStreamIndex, DWORD dwStreamFlags, LONGLONG llTimestamp, @@ -402,7 +420,7 @@ STDMETHODIMP QWindowsCameraReader::OnReadSample(HRESULT hrStatus, DWORD dwStream if (m_sinkWriter && !m_paused) { pSample->SetSampleTime(llTimestamp - m_timeOffset); m_sinkWriter->WriteSample(m_videoStreamIndex, pSample); - emit durationChanged((llTimestamp - m_timeOffset)/10000); + m_currentDuration = (llTimestamp - m_timeOffset) / 10000; } } diff --git a/src/multimedia/platform/windows/mediacapture/qwindowscamerareader_p.h b/src/multimedia/platform/windows/mediacapture/qwindowscamerareader_p.h index 5bc43c788..f6cf5a44f 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowscamerareader_p.h +++ b/src/multimedia/platform/windows/mediacapture/qwindowscamerareader_p.h @@ -58,6 +58,7 @@ #include #include #include +#include #include QT_BEGIN_NAMESPACE @@ -112,6 +113,9 @@ Q_SIGNALS: void recordingStopped(); void durationChanged(qint64 duration); +private slots: + void updateDuration(); + private: void stopStreaming(); @@ -137,6 +141,9 @@ private: QVideoFrameFormat::PixelFormat m_pixelFormat = QVideoFrameFormat::Format_Invalid; LONGLONG m_timeOffset = 0; LONGLONG m_pauseTime = 0; + QTimer m_durationTimer; + qint64 m_currentDuration = -1; + qint64 m_lastDuration = -1; }; QT_END_NAMESPACE -- cgit v1.2.3