diff options
author | Piotr Srebrny <piotr.srebrny@qt.io> | 2021-11-03 14:13:07 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-11-03 15:32:50 +0000 |
commit | 7b206641cb5a399161b0005dbd120bcc83aaab95 (patch) | |
tree | 0ad11692beb3f51247be43564044e8ae5f39a29f | |
parent | b4b6942a5a7dc4313dafd6a0d1f70d70ce8dfb16 (diff) | |
download | qtmultimedia-7b206641cb5a399161b0005dbd120bcc83aaab95.tar.gz |
Improve error signaling when starting recording
The boolean return value is insufficient to provide the correct
indication to the user of the cause of an error.
This patch replaces the boolean value with QMediaRecorder::Error
to signal errors that occur when starting recording.
Fixes: QTBUG-97952
Change-Id: I9d22ecfa81c53d1a53536d4f46bcd06b466f74f9
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Reviewed-by: André de la Rocha <andre.rocha@qt.io>
(cherry picked from commit 1ac4126efc38d5066b4c3ab35476574a56786541)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
6 files changed, 74 insertions, 78 deletions
diff --git a/src/multimedia/platform/windows/common/qwindowsiupointer_p.h b/src/multimedia/platform/windows/common/qwindowsiupointer_p.h index 9941e110d..b04d51142 100644 --- a/src/multimedia/platform/windows/common/qwindowsiupointer_p.h +++ b/src/multimedia/platform/windows/common/qwindowsiupointer_p.h @@ -84,6 +84,7 @@ public: T** address() { Q_ASSERT(m_ptr == nullptr); return &m_ptr; } void reset(T* ptr = nullptr) { if (m_ptr) m_ptr->Release(); m_ptr = ptr; } + T* release() { T* ptr = m_ptr; m_ptr = nullptr; return ptr; } private: T* m_ptr; diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp index a1ff6602f..3cbe259af 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp +++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp @@ -45,6 +45,7 @@ #include <qaudiodevice.h> #include <private/qmemoryvideobuffer_p.h> #include <private/qwindowsmfdefs_p.h> +#include <private/qwindowsiupointer_p.h> #include <QtCore/qdebug.h> #include <mmdeviceapi.h> @@ -664,96 +665,90 @@ HRESULT QWindowsMediaDeviceReader::updateSinkInputMediaTypes() 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, - UINT32 audioBitRate) +QMediaRecorder::Error QWindowsMediaDeviceReader::startRecording( + const QString &fileName, const GUID &container, const GUID &videoFormat, UINT32 videoBitRate, + UINT32 width, UINT32 height, qreal frameRate, const GUID &audioFormat, UINT32 audioBitRate) { QMutexLocker locker(&m_mutex); if (!m_active || m_recording || (videoFormat == GUID_NULL && audioFormat == GUID_NULL)) - return false; - - IMFAttributes *writerAttributes = nullptr; + return QMediaRecorder::ResourceError; - HRESULT hr = MFCreateAttributes(&writerAttributes, 2); - if (SUCCEEDED(hr)) { + QWindowsIUPointer<IMFAttributes> writerAttributes; - // Set callback so OnFinalize() is called after video is saved. - hr = writerAttributes->SetUnknown(MF_SINK_WRITER_ASYNC_CALLBACK, - static_cast<IMFSinkWriterCallback*>(this)); - if (SUCCEEDED(hr)) { + HRESULT hr = MFCreateAttributes(writerAttributes.address(), 2); + if (FAILED(hr)) + return QMediaRecorder::ResourceError; - hr = writerAttributes->SetGUID(QMM_MF_TRANSCODE_CONTAINERTYPE, container); - if (SUCCEEDED(hr)) { + // Set callback so OnFinalize() is called after video is saved. + hr = writerAttributes->SetUnknown(MF_SINK_WRITER_ASYNC_CALLBACK, + static_cast<IMFSinkWriterCallback*>(this)); + if (FAILED(hr)) + return QMediaRecorder::ResourceError; - hr = MFCreateSinkWriterFromURL(reinterpret_cast<LPCWSTR>(fileName.utf16()), - nullptr, writerAttributes, &m_sinkWriter); - if (SUCCEEDED(hr)) { + hr = writerAttributes->SetGUID(QMM_MF_TRANSCODE_CONTAINERTYPE, container); + if (FAILED(hr)) + return QMediaRecorder::ResourceError; - m_sinkVideoStreamIndex = MF_SINK_WRITER_INVALID_STREAM_INDEX; - m_sinkAudioStreamIndex = MF_SINK_WRITER_INVALID_STREAM_INDEX; + QWindowsIUPointer<IMFSinkWriter> sinkWriter; + hr = MFCreateSinkWriterFromURL(reinterpret_cast<LPCWSTR>(fileName.utf16()), + nullptr, writerAttributes, sinkWriter.address()); + if (FAILED(hr)) + return QMediaRecorder::LocationNotWritable; - if (m_videoSource && videoFormat != GUID_NULL) { - IMFMediaType *targetMediaType = nullptr; + m_sinkVideoStreamIndex = MF_SINK_WRITER_INVALID_STREAM_INDEX; + m_sinkAudioStreamIndex = MF_SINK_WRITER_INVALID_STREAM_INDEX; - hr = createVideoMediaType(videoFormat, videoBitRate, width, height, - frameRate, &targetMediaType); - if (SUCCEEDED(hr)) { - - hr = m_sinkWriter->AddStream(targetMediaType, &m_sinkVideoStreamIndex); - if (SUCCEEDED(hr)) { - - hr = m_sinkWriter->SetInputMediaType(m_sinkVideoStreamIndex, - m_videoMediaType, nullptr); - } - targetMediaType->Release(); - } - } + if (m_videoSource && videoFormat != GUID_NULL) { + IMFMediaType *targetMediaType = nullptr; - if (SUCCEEDED(hr)) { + hr = createVideoMediaType(videoFormat, videoBitRate, width, height, frameRate, &targetMediaType); + if (SUCCEEDED(hr)) { - if (m_audioSource && audioFormat != GUID_NULL) { - IMFMediaType *targetMediaType = nullptr; + hr = sinkWriter->AddStream(targetMediaType, &m_sinkVideoStreamIndex); + if (SUCCEEDED(hr)) { - hr = createAudioMediaType(audioFormat, audioBitRate, &targetMediaType); - if (SUCCEEDED(hr)) { + hr = sinkWriter->SetInputMediaType(m_sinkVideoStreamIndex, m_videoMediaType, nullptr); + } + targetMediaType->Release(); + } + } - hr = m_sinkWriter->AddStream(targetMediaType, &m_sinkAudioStreamIndex); - if (SUCCEEDED(hr)) { + if (SUCCEEDED(hr)) { + if (m_audioSource && audioFormat != GUID_NULL) { + IMFMediaType *targetMediaType = nullptr; - hr = m_sinkWriter->SetInputMediaType(m_sinkAudioStreamIndex, - m_audioMediaType, nullptr); - } - targetMediaType->Release(); - } - } + hr = createAudioMediaType(audioFormat, audioBitRate, &targetMediaType); + if (SUCCEEDED(hr)) { - if (SUCCEEDED(hr)) { + hr = sinkWriter->AddStream(targetMediaType, &m_sinkAudioStreamIndex); + if (SUCCEEDED(hr)) { - 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; - m_pauseChanging = false; - } - } - } + hr = sinkWriter->SetInputMediaType(m_sinkAudioStreamIndex, m_audioMediaType, nullptr); } + targetMediaType->Release(); } } - writerAttributes->Release(); } - if (m_sinkWriter && !SUCCEEDED(hr)) { - m_sinkWriter->Release(); - m_sinkWriter = nullptr; - } - return SUCCEEDED(hr); + + if (FAILED(hr)) + return QMediaRecorder::FormatError; + + hr = sinkWriter->BeginWriting(); + if (FAILED(hr)) + return QMediaRecorder::ResourceError; + + m_sinkWriter = sinkWriter.release(); + m_lastDuration = -1; + m_currentDuration = 0; + updateDuration(); + m_durationTimer.start(); + m_recording = true; + m_firstFrame = true; + m_paused = false; + m_pauseChanging = false; + + return QMediaRecorder::NoError; } void QWindowsMediaDeviceReader::stopRecording() diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h index 6164d6804..0b78be843 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h +++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h @@ -62,6 +62,7 @@ #include <QtCore/qtimer.h> #include <qvideoframe.h> #include <qcameradevice.h> +#include <qmediarecorder.h> QT_BEGIN_NAMESPACE @@ -96,10 +97,10 @@ public: const QString µphoneId); void deactivate(); - bool startRecording(const QString &fileName, const GUID &container, - const GUID &videoFormat, UINT32 videoBitRate, UINT32 width, - UINT32 height, qreal frameRate, const GUID &audioFormat, - UINT32 audioBitRate); + QMediaRecorder::Error startRecording(const QString &fileName, const GUID &container, + const GUID &videoFormat, UINT32 videoBitRate, UINT32 width, + UINT32 height, qreal frameRate, const GUID &audioFormat, + UINT32 audioBitRate); void stopRecording(); bool pauseRecording(); bool resumeRecording(); diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp index c43771d23..5543fb6a2 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp +++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp @@ -231,7 +231,7 @@ void QWindowsMediaDeviceSession::setAudioOutput(QAudioOutput *output) connect(m_audioOutput, &QAudioOutput::deviceChanged, this, &QWindowsMediaDeviceSession::audioOutputDeviceChanged); } -bool QWindowsMediaDeviceSession::startRecording(QMediaEncoderSettings &settings, const QString &fileName, bool audioOnly) +QMediaRecorder::Error QWindowsMediaDeviceSession::startRecording(QMediaEncoderSettings &settings, const QString &fileName, bool audioOnly) { GUID container = QWindowsMultimediaUtils::containerForVideoFileFormat(settings.mediaFormat().fileFormat()); GUID videoFormat = QWindowsMultimediaUtils::videoFormatForCodec(settings.videoCodec()); diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h index 1dce75627..df6328a6d 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h +++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h @@ -95,7 +95,7 @@ public: void setAudioInput(QAudioInput *input); void setAudioOutput(QAudioOutput *output); - bool startRecording(QMediaEncoderSettings &settings, const QString &fileName, bool audioOnly); + QMediaRecorder::Error startRecording(QMediaEncoderSettings &settings, const QString &fileName, bool audioOnly); void stopRecording(); bool pauseRecording(); bool resumeRecording(); diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp index 5dcb67b1f..82cb407b6 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp +++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp @@ -95,16 +95,15 @@ void QWindowsMediaEncoder::record(QMediaEncoderSettings &settings) : QStandardPaths::MoviesLocation, settings.mimeType().preferredSuffix()); - if (m_mediaDeviceSession->startRecording(settings, m_fileName, audioOnly)) { - + QMediaRecorder::Error ec = m_mediaDeviceSession->startRecording(settings, m_fileName, audioOnly); + if (ec == QMediaRecorder::NoError) { m_state = QMediaRecorder::RecordingState; actualLocationChanged(QUrl::fromLocalFile(m_fileName)); stateChanged(m_state); } else { - error(QMediaRecorder::FormatError, - QMediaRecorderPrivate::msgFailedStartRecording()); + error(ec, QMediaRecorderPrivate::msgFailedStartRecording()); } } |