summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJøger Hansegård <joger.hansegard@qt.io>2023-06-08 10:49:05 +0200
committerJøger Hansegård <joger.hansegard@qt.io>2023-06-08 21:27:29 +0200
commit8d8622f40f5f3e1053121cff58b3c1179a158297 (patch)
treec3c81366e8c4275100415a955a3c8e181343b20d
parentcf4097cfb3b0d5b8e13a5f7c11a9517236edb578 (diff)
Split QComPtr reset() function into a reset() and an attach() function
The name 'reset' does not specify well how ownership is handled when reset to a new pointer value. A better name for this is 'attach', which indicates that AddRef is not called. 'reset' now just resets the pointer to a default constructed state. This is a step towards replacing QComPtr out with WRL::ComPtr which is used elsewhere in Qt. Change-Id: Ic72beba8cf212669f5dfa2e01f36754ffb0ad94e Reviewed-by: Lars Knoll <lars@knoll.priv.no> Reviewed-by: Pavel Dubsky <pavel.dubsky@qt.io> (cherry picked from commit b9a3961ff5966af372acad83f9dcee7f082a21c7)
-rw-r--r--src/multimedia/windows/qcomptr_p.h17
-rw-r--r--src/multimedia/windows/qwindowsmediadevices.cpp2
-rw-r--r--src/plugins/multimedia/ffmpeg/qwindowscamera.cpp2
-rw-r--r--src/plugins/multimedia/windows/decoder/mfaudiodecodercontrol.cpp2
-rw-r--r--src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp3
5 files changed, 20 insertions, 6 deletions
diff --git a/src/multimedia/windows/qcomptr_p.h b/src/multimedia/windows/qcomptr_p.h
index 2c7818598..38cae0c17 100644
--- a/src/multimedia/windows/qcomptr_p.h
+++ b/src/multimedia/windows/qcomptr_p.h
@@ -54,7 +54,22 @@ public:
T *operator->() const { return m_ptr; }
T **address() { Q_ASSERT(m_ptr == nullptr); return &m_ptr; }
- void reset(T *ptr = nullptr) { if (m_ptr) m_ptr->Release(); m_ptr = ptr; }
+
+ void reset()
+ {
+ if (m_ptr)
+ m_ptr->Release();
+ m_ptr = nullptr;
+ }
+
+ // Takes ownership of interface without calling AddRef
+ void attach(T *ptr)
+ {
+ if (m_ptr)
+ m_ptr->Release();
+ m_ptr = ptr;
+ }
+
T *release() { T *ptr = m_ptr; m_ptr = nullptr; return ptr; }
T *get() const { return m_ptr; }
diff --git a/src/multimedia/windows/qwindowsmediadevices.cpp b/src/multimedia/windows/qwindowsmediadevices.cpp
index cad49862a..d55b73761 100644
--- a/src/multimedia/windows/qwindowsmediadevices.cpp
+++ b/src/multimedia/windows/qwindowsmediadevices.cpp
@@ -179,7 +179,7 @@ QWindowsMediaDevices::QWindowsMediaDevices()
}
- m_notificationClient.reset(new CMMNotificationClient(this, m_deviceEnumerator, std::move(devState)));
+ m_notificationClient.attach(new CMMNotificationClient(this, m_deviceEnumerator, std::move(devState)));
m_deviceEnumerator->RegisterEndpointNotificationCallback(m_notificationClient.get());
} else {
diff --git a/src/plugins/multimedia/ffmpeg/qwindowscamera.cpp b/src/plugins/multimedia/ffmpeg/qwindowscamera.cpp
index a6c85dba4..d0d905ab0 100644
--- a/src/plugins/multimedia/ffmpeg/qwindowscamera.cpp
+++ b/src/plugins/multimedia/ffmpeg/qwindowscamera.cpp
@@ -185,7 +185,7 @@ public:
if (!ac->m_source)
return {};
- ac->m_readerCallback.reset(new CameraReaderCallback);
+ ac->m_readerCallback.attach(new CameraReaderCallback);
ac->m_readerCallback->setActiveCamera(ac.get());
ac->m_reader = createCameraReader(ac->m_source.get(), ac->m_readerCallback);
if (!ac->m_reader)
diff --git a/src/plugins/multimedia/windows/decoder/mfaudiodecodercontrol.cpp b/src/plugins/multimedia/windows/decoder/mfaudiodecodercontrol.cpp
index 4f25ae5ec..9d9abedb9 100644
--- a/src/plugins/multimedia/windows/decoder/mfaudiodecodercontrol.cpp
+++ b/src/plugins/multimedia/windows/decoder/mfaudiodecodercontrol.cpp
@@ -87,7 +87,7 @@ void MFAudioDecoderControl::startReadingSource(IMFMediaSource *source)
{
Q_ASSERT(source);
- m_decoderSourceReader.reset(new MFDecoderSourceReader());
+ m_decoderSourceReader.attach(new MFDecoderSourceReader());
if (!m_decoderSourceReader) {
error(QAudioDecoder::ResourceError, tr("Could not instantiate MFDecoderSourceReader"));
return;
diff --git a/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp b/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp
index 7fab5b8cd..1c2c2c1aa 100644
--- a/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp
+++ b/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp
@@ -34,10 +34,9 @@ public:
IMFSample *sample, QRhi *rhi, QVideoFrame::HandleType type = QVideoFrame::NoHandle)
: QAbstractVideoBuffer(type, rhi)
, m_device(device)
+ , m_sample(sample)
, m_mapMode(QVideoFrame::NotMapped)
{
- sample->AddRef();
- m_sample.reset(sample);
}
~IMFSampleVideoBuffer() override