diff options
author | Piotr Srebrny <piotr.srebrny@qt.io> | 2021-11-03 14:45:58 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-11-09 16:14:20 +0000 |
commit | a991850c5aef363ff960b4ff7a7753a69741a732 (patch) | |
tree | d510e0eaa3efe988748f58241aa0b4dc6f23b47b | |
parent | ab0257485b50a9afe30055b1f7b9dbebaaba99a9 (diff) | |
download | qtmultimedia-a991850c5aef363ff960b4ff7a7753a69741a732.tar.gz |
Avoid implicit conversion to pointer from QWindowsIUPointer
When converting from QWindowsIUPointer<T> to T* we can accidentally
leak pointer when doing assignment operation such as: var_a = var_b.
If var_a is T* and var_b is QWindowsIUPointer<T>, the pointer
is set on var_a without any warning but the reference counting is
incorrect.
Change-Id: I8e770185856f5c1d84dac610fe7f95631dcf4308
Reviewed-by: André de la Rocha <andre.rocha@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit 0a86e3e2778dfe7860aa4712ff94069e78648586)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
5 files changed, 21 insertions, 21 deletions
diff --git a/src/multimedia/platform/windows/common/qwindowsiupointer_p.h b/src/multimedia/platform/windows/common/qwindowsiupointer_p.h index b04d51142..9e9cf6894 100644 --- a/src/multimedia/platform/windows/common/qwindowsiupointer_p.h +++ b/src/multimedia/platform/windows/common/qwindowsiupointer_p.h @@ -79,15 +79,15 @@ public: } explicit operator bool() const { return m_ptr != nullptr; } - operator T*() const { return m_ptr; } - T* operator->() const { return m_ptr; } + 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; } - T* release() { T* ptr = m_ptr; m_ptr = nullptr; return 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; } + T *release() { T *ptr = m_ptr; m_ptr = nullptr; return ptr; } + T *get() const { return m_ptr; } private: - T* m_ptr; + T *m_ptr; }; #endif diff --git a/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp b/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp index e850a43d2..263a7e6d9 100644 --- a/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp +++ b/src/multimedia/platform/windows/decoder/mfaudiodecodercontrol.cpp @@ -181,7 +181,7 @@ HRESULT MFAudioDecoderControl::setResamplerOutputType(IMFMediaType *outputType) m_convertSample.reset(); return hr; } - m_convertSample->AddBuffer(buffer); + m_convertSample->AddBuffer(buffer.get()); } return S_OK; } @@ -220,7 +220,7 @@ void MFAudioDecoderControl::startReadingSource(IMFMediaSource *source) } auto mediaType = m_decoderSourceReader->setSource(source, m_outputFormat.sampleFormat()); - m_mediaFormat = mediaTypeToFormat(mediaType); + m_mediaFormat = mediaTypeToFormat(mediaType.get()); if (!m_mediaFormat.isValid()) { error(QAudioDecoder::FormatError, tr("Invalid media format")); m_decoderSourceReader.reset(); @@ -237,10 +237,10 @@ void MFAudioDecoderControl::startReadingSource(IMFMediaSource *source) } if (useResampler()) { - HRESULT hr = m_resampler->SetInputType(m_mfInputStreamID, mediaType, 0); + HRESULT hr = m_resampler->SetInputType(m_mfInputStreamID, mediaType.get(), 0); if (SUCCEEDED(hr)) { if (auto output = formatToMediaType(m_outputFormat); output) { - hr = setResamplerOutputType(output); + hr = setResamplerOutputType(output.get()); if (FAILED(hr)) { qWarning() << "MFAudioDecoderControl: failed to SetOutputType of resampler: " << std::system_category().message(hr).c_str(); @@ -254,8 +254,8 @@ void MFAudioDecoderControl::startReadingSource(IMFMediaSource *source) } } - connect(m_decoderSourceReader, SIGNAL(finished()), this, SLOT(handleSourceFinished())); - connect(m_decoderSourceReader, SIGNAL(newSample(QWindowsIUPointer<IMFSample>)), this, SLOT(handleNewSample(QWindowsIUPointer<IMFSample>))); + connect(m_decoderSourceReader.get(), SIGNAL(finished()), this, SLOT(handleSourceFinished())); + connect(m_decoderSourceReader.get(), SIGNAL(newSample(QWindowsIUPointer<IMFSample>)), this, SLOT(handleNewSample(QWindowsIUPointer<IMFSample>))); setIsDecoding(true); @@ -291,7 +291,7 @@ void MFAudioDecoderControl::stop() if (!isDecoding()) return; - disconnect(m_decoderSourceReader); + disconnect(m_decoderSourceReader.get()); m_decoderSourceReader->clearSource(); m_decoderSourceReader.reset(); @@ -340,7 +340,7 @@ void MFAudioDecoderControl::handleNewSample(QWindowsIUPointer<IMFSample> sample) HRESULT hr = S_OK; if (useResampler()) { - hr = m_resampler->ProcessInput(m_mfInputStreamID, sample, 0); + hr = m_resampler->ProcessInput(m_mfInputStreamID, sample.get(), 0); if (SUCCEEDED(hr)) { bool getSampleStartTime = true; MFT_OUTPUT_DATA_BUFFER outputDataBuffer; @@ -348,7 +348,7 @@ void MFAudioDecoderControl::handleNewSample(QWindowsIUPointer<IMFSample> sample) do { outputDataBuffer.pEvents = nullptr; outputDataBuffer.dwStatus = 0; - outputDataBuffer.pSample = m_convertSample; + outputDataBuffer.pSample = m_convertSample.get(); DWORD status = 0; hr = m_resampler->ProcessOutput(0, 1, &outputDataBuffer, &status); if (SUCCEEDED(hr)) { @@ -365,7 +365,7 @@ void MFAudioDecoderControl::handleNewSample(QWindowsIUPointer<IMFSample> sample) } } else { sample->GetSampleTime(&sampleStartTime); - hr = addDataFromIMFSample(abuf, sample); + hr = addDataFromIMFSample(abuf, sample.get()); } if (FAILED(hr)) { diff --git a/src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp b/src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp index 3cf0b6df5..e0b54dcde 100644 --- a/src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp +++ b/src/multimedia/platform/windows/decoder/mfdecodersourcereader.cpp @@ -58,7 +58,7 @@ QWindowsIUPointer<IMFMediaType> MFDecoderSourceReader::setSource(IMFMediaSource if (FAILED(attr->SetUINT32(MF_SOURCE_READER_DISCONNECT_MEDIASOURCE_ON_SHUTDOWN, TRUE))) return mediaType; - HRESULT hr = MFCreateSourceReaderFromMediaSource(source, attr, m_sourceReader.address()); + HRESULT hr = MFCreateSourceReaderFromMediaSource(source, attr.get(), m_sourceReader.address()); if (FAILED(hr)) { qWarning() << "MFDecoderSourceReader: failed to setup source reader: " << std::system_category().message(hr).c_str(); @@ -72,7 +72,7 @@ QWindowsIUPointer<IMFMediaType> MFDecoderSourceReader::setSource(IMFMediaSource MFCreateMediaType(pPartialType.address()); pPartialType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Audio); pPartialType->SetGUID(MF_MT_SUBTYPE, sampleFormat == QAudioFormat::Float ? MFAudioFormat_Float : MFAudioFormat_PCM); - m_sourceReader->SetCurrentMediaType(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), nullptr, pPartialType); + m_sourceReader->SetCurrentMediaType(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), nullptr, pPartialType.get()); m_sourceReader->GetCurrentMediaType(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), mediaType.address()); // Ensure the stream is selected. m_sourceReader->SetStreamSelection(DWORD(MF_SOURCE_READER_FIRST_AUDIO_STREAM), TRUE); diff --git a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp index 3cbe259af..16414cca5 100644 --- a/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp +++ b/src/multimedia/platform/windows/mediacapture/qwindowsmediadevicereader.cpp @@ -692,7 +692,7 @@ QMediaRecorder::Error QWindowsMediaDeviceReader::startRecording( QWindowsIUPointer<IMFSinkWriter> sinkWriter; hr = MFCreateSinkWriterFromURL(reinterpret_cast<LPCWSTR>(fileName.utf16()), - nullptr, writerAttributes, sinkWriter.address()); + nullptr, writerAttributes.get(), sinkWriter.address()); if (FAILED(hr)) return QMediaRecorder::LocationNotWritable; diff --git a/src/multimedia/platform/windows/qwindowsmediadevices.cpp b/src/multimedia/platform/windows/qwindowsmediadevices.cpp index a5255692a..80058ab5c 100644 --- a/src/multimedia/platform/windows/qwindowsmediadevices.cpp +++ b/src/multimedia/platform/windows/qwindowsmediadevices.cpp @@ -270,7 +270,7 @@ QWindowsMediaDevices::QWindowsMediaDevices() m_notificationClient.reset(new CMMNotificationClient(this, m_deviceEnumerator, std::move(devState))); - m_deviceEnumerator->RegisterEndpointNotificationCallback(m_notificationClient); + m_deviceEnumerator->RegisterEndpointNotificationCallback(m_notificationClient.get()); } else { qWarning() << "Audio device change notification disabled"; @@ -303,7 +303,7 @@ QWindowsMediaDevices::QWindowsMediaDevices() QWindowsMediaDevices::~QWindowsMediaDevices() { if (m_deviceEnumerator) { - m_deviceEnumerator->UnregisterEndpointNotificationCallback(m_notificationClient); + m_deviceEnumerator->UnregisterEndpointNotificationCallback(m_notificationClient.get()); } m_deviceEnumerator.reset(); |