summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndré de la Rocha <andre.rocha@qt.io>2021-06-19 18:07:56 +0200
committerAndré de la Rocha <andre.rocha@qt.io>2021-06-21 12:44:08 +0200
commitf20d48673b30f90a2110342aa35815c176f53bbe (patch)
treeb6a3604cf1a479eb686fd1786ba389bda614c744
parent83e9c2d8c3b278bae81a6060cc1657a95250f1ee (diff)
Windows: Adjust the recording pipeline when devices change
Change-Id: Iaa12d4f28c7ede788f59f430de7fb6ca1bb5bc6b Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io> Reviewed-by: Doris Verria <doris.verria@qt.io>
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp23
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h2
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp16
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h1
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp2
5 files changed, 40 insertions, 4 deletions
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp
index 935420170..658f1f6a8 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp
@@ -60,6 +60,7 @@ QWindowsMediaDeviceReader::QWindowsMediaDeviceReader(QObject *parent)
QWindowsMediaDeviceReader::~QWindowsMediaDeviceReader()
{
+ stopRecording();
deactivate();
}
@@ -371,6 +372,8 @@ bool QWindowsMediaDeviceReader::activate(const QString &cameraId,
return false;
}
+ updateSinkInputMediaTypes();
+
// Request the first frame or audio sample.
if (!SUCCEEDED(m_sourceReader->ReadSample(MF_SOURCE_READER_ANY_STREAM, 0, nullptr, nullptr, nullptr, nullptr))) {
releaseResources();
@@ -383,7 +386,6 @@ bool QWindowsMediaDeviceReader::activate(const QString &cameraId,
void QWindowsMediaDeviceReader::deactivate()
{
- stopRecording();
stopStreaming();
m_active = false;
m_streaming = false;
@@ -496,6 +498,22 @@ HRESULT QWindowsMediaDeviceReader::createAudioMediaType(const GUID &format, UINT
return E_FAIL;
}
+HRESULT QWindowsMediaDeviceReader::updateSinkInputMediaTypes()
+{
+ HRESULT hr = S_OK;
+ if (m_sinkWriter) {
+ if (m_videoSource && m_videoMediaType && m_sinkVideoStreamIndex != MF_SINK_WRITER_INVALID_STREAM_INDEX) {
+ hr = m_sinkWriter->SetInputMediaType(m_sinkVideoStreamIndex, m_videoMediaType, nullptr);
+ }
+ if (SUCCEEDED(hr)) {
+ if (m_audioSource && m_audioMediaType && m_sinkAudioStreamIndex != MF_SINK_WRITER_INVALID_STREAM_INDEX) {
+ hr = m_sinkWriter->SetInputMediaType(m_sinkAudioStreamIndex, m_audioMediaType, nullptr);
+ }
+ }
+ }
+ return hr;
+}
+
bool QWindowsMediaDeviceReader::startRecording(const QString &fileName, const GUID &container,
const GUID &videoFormat, UINT32 videoBitRate, UINT32 width,
UINT32 height, qreal frameRate, const GUID &audioFormat,
@@ -614,6 +632,7 @@ bool QWindowsMediaDeviceReader::pauseRecording()
{
if (!m_recording || m_paused)
return false;
+ m_pauseTime = m_lastTimestamp;
m_paused = true;
m_pauseChanging = true;
return true;
@@ -716,6 +735,8 @@ STDMETHODIMP QWindowsMediaDeviceReader::OnReadSample(HRESULT hrStatus, DWORD dwS
return hrStatus;
}
+ m_lastTimestamp = llTimestamp;
+
if ((dwStreamFlags & MF_SOURCE_READERF_ENDOFSTREAM) == MF_SOURCE_READERF_ENDOFSTREAM) {
m_streaming = false;
emit streamingStopped();
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h
index 48ddafecb..7f7d367d8 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h
@@ -134,6 +134,7 @@ private:
HRESULT prepareVideoStream(DWORD mediaTypeIndex);
HRESULT prepareAudioStream();
HRESULT initSourceIndexes();
+ HRESULT updateSinkInputMediaTypes();
void releaseResources();
void stopStreaming();
DWORD findMediaTypeIndex(const QCameraFormat &reqFormat);
@@ -167,6 +168,7 @@ private:
QVideoFrameFormat::PixelFormat m_pixelFormat = QVideoFrameFormat::Format_Invalid;
LONGLONG m_timeOffset = 0;
LONGLONG m_pauseTime = 0;
+ LONGLONG m_lastTimestamp = 0;
QTimer m_durationTimer;
qint64 m_currentDuration = -1;
qint64 m_lastDuration = -1;
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp
index f46f15127..eae37d744 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp
@@ -77,7 +77,7 @@ bool QWindowsMediaDeviceSession::isActivating() const
void QWindowsMediaDeviceSession::setActive(bool active)
{
- if ((m_active == active) || (m_activating && active))
+ if ((active && (m_active || m_activating)) || (!active && !m_active && !m_activating))
return;
if (active) {
@@ -98,9 +98,20 @@ void QWindowsMediaDeviceSession::setActive(bool active)
}
}
+void QWindowsMediaDeviceSession::reactivate()
+{
+ if (m_active || m_activating) {
+ pauseRecording();
+ setActive(false);
+ setActive(true);
+ resumeRecording();
+ }
+}
+
void QWindowsMediaDeviceSession::setActiveCamera(const QCameraDevice &camera)
{
m_activeCameraDevice = camera;
+ reactivate();
}
QCameraDevice QWindowsMediaDeviceSession::activeCamera() const
@@ -169,8 +180,7 @@ void QWindowsMediaDeviceSession::setAudioInputVolume(float volume)
void QWindowsMediaDeviceSession::audioInputDeviceChanged()
{
- // ### FIXME: get the new input device from m_audioInput and adjust
- // the pipeline
+ reactivate();
}
void QWindowsMediaDeviceSession::setAudioInput(QAudioInput *input)
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h
index 2db0b0784..46c4ca2f5 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h
@@ -113,6 +113,7 @@ private Q_SLOTS:
void handleNewVideoFrame(const QVideoFrame &frame);
private:
+ void reactivate();
quint32 estimateVideoBitRate(const GUID &videoFormat, quint32 width, quint32 height,
qreal frameRate, QMediaRecorder::Quality quality);
quint32 estimateAudioBitRate(const GUID &audioFormat, QMediaRecorder::Quality quality);
diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp
index 28c387d2e..c0bac50cb 100644
--- a/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp
+++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp
@@ -238,6 +238,8 @@ void QWindowsMediaEncoder::onStreamingError(int errorCode)
{
if (errorCode == MF_E_VIDEO_RECORDING_DEVICE_INVALIDATED)
error(QMediaRecorder::ResourceError, tr("Camera is no longer present"));
+ else if (errorCode == MF_E_AUDIO_RECORDING_DEVICE_INVALIDATED)
+ error(QMediaRecorder::ResourceError, tr("Audio input is no longer present"));
else
error(QMediaRecorder::ResourceError, tr("Streaming error"));