summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPiotr Srebrny <piotr.srebrny@qt.io>2021-11-03 14:13:07 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2021-11-03 15:32:50 +0000
commit7b206641cb5a399161b0005dbd120bcc83aaab95 (patch)
tree0ad11692beb3f51247be43564044e8ae5f39a29f
parentb4b6942a5a7dc4313dafd6a0d1f70d70ce8dfb16 (diff)
downloadqtmultimedia-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>
-rw-r--r--src/multimedia/platform/windows/common/qwindowsiupointer_p.h1
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp131
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader_p.h9
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession.cpp2
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediadevicesession_p.h2
-rw-r--r--src/multimedia/platform/windows/mediacapture/qwindowsmediaencoder.cpp7
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 &microphoneId);
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());
}
}