diff options
author | André de la Rocha <andre.rocha@qt.io> | 2021-06-19 18:07:56 +0200 |
---|---|---|
committer | André de la Rocha <andre.rocha@qt.io> | 2021-06-21 12:44:08 +0200 |
commit | f20d48673b30f90a2110342aa35815c176f53bbe (patch) | |
tree | b6a3604cf1a479eb686fd1786ba389bda614c744 | |
parent | 83e9c2d8c3b278bae81a6060cc1657a95250f1ee (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>
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")); |