summaryrefslogtreecommitdiffstats
path: root/src/multimedia
diff options
context:
space:
mode:
authorAndre de la Rocha <andre.rocha@qt.io>2021-05-16 18:14:30 +0200
committerLars Knoll <lars.knoll@qt.io>2021-05-17 11:02:32 +0000
commitea084467fb20f68ba55366876031ac9a7486878b (patch)
tree1c4d29589eab63b53490a2d576622a005b320827 /src/multimedia
parentf267128e9e2789def83815c2fae2b056088c3680 (diff)
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 <lars.knoll@qt.io>
Diffstat (limited to 'src/multimedia')
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowscamerareader.cpp20
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowscamerareader_p.h7
2 files changed, 26 insertions, 1 deletions
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 <QtCore/qobject.h>
#include <QtCore/qmutex.h>
#include <QtCore/qsemaphore.h>
+#include <QtCore/qtimer.h>
#include <qvideoframe.h>
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