summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJøger Hansegård <joger.hansegard@qt.io>2023-10-30 22:27:32 +0100
committerJøger Hansegård <joger.hansegard@qt.io>2023-11-03 18:53:00 +0100
commitcb1d4457038f4d44d31df60eac0e17ff3bf3f200 (patch)
treec4991bd1e249f207eb0480de22cda2122f96258a
parentb71a7cbcde41c6115d6d70a9b47e38e75818579d (diff)
Simplify lifetime handling when creating EVR video samples
In this change, we reduce the need for manual handling of COM interface reference counting when creating video samples in EVR MediaPlayer. This is done by maintaining the interface pointers in a list of smart- pointers, which takes care of the reference counting for us. Pick-to: 6.5 Change-Id: I119203ba1aae657b5ddd389f306762454933ff46 Reviewed-by: Pavel Dubsky <pavel.dubsky@qt.io> Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> (cherry picked from commit 8cd1fbf6a790d1c8ad986920949405e449d16098)
-rw-r--r--src/plugins/multimedia/windows/evr/evrcustompresenter.cpp13
-rw-r--r--src/plugins/multimedia/windows/evr/evrcustompresenter_p.h2
-rw-r--r--src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp6
-rw-r--r--src/plugins/multimedia/windows/evr/evrd3dpresentengine_p.h3
4 files changed, 11 insertions, 13 deletions
diff --git a/src/plugins/multimedia/windows/evr/evrcustompresenter.cpp b/src/plugins/multimedia/windows/evr/evrcustompresenter.cpp
index 5c2c9f10c..71052237d 100644
--- a/src/plugins/multimedia/windows/evr/evrcustompresenter.cpp
+++ b/src/plugins/multimedia/windows/evr/evrcustompresenter.cpp
@@ -445,7 +445,7 @@ HRESULT SamplePool::returnSample(IMFSample *sample)
return S_OK;
}
-HRESULT SamplePool::initialize(QList<IMFSample*> &samples)
+HRESULT SamplePool::initialize(QList<ComPtr<IMFSample>> &&samples)
{
QMutexLocker locker(&m_mutex);
@@ -453,15 +453,10 @@ HRESULT SamplePool::initialize(QList<IMFSample*> &samples)
return MF_E_INVALIDREQUEST;
// Move these samples into our allocated queue.
- for (const auto &sample : std::as_const(samples)) {
- m_videoSampleQueue.append(sample);
- }
+ m_videoSampleQueue.append(std::move(samples));
m_initialized = true;
- for (auto sample : std::as_const(samples))
- sample->Release();
- samples.clear();
return S_OK;
}
@@ -1330,7 +1325,7 @@ HRESULT EVRCustomPresenter::setMediaType(IMFMediaType *mediaType)
}
MFRatio fps = { 0, 0 };
- QList<IMFSample*> sampleQueue;
+ QList<ComPtr<IMFSample>> sampleQueue;
// Cannot set the media type after shutdown.
HRESULT hr = checkShutdown();
@@ -1362,7 +1357,7 @@ HRESULT EVRCustomPresenter::setMediaType(IMFMediaType *mediaType)
}
// Add the samples to the sample pool.
- hr = m_samplePool.initialize(sampleQueue);
+ hr = m_samplePool.initialize(std::move(sampleQueue));
if (FAILED(hr))
goto done;
diff --git a/src/plugins/multimedia/windows/evr/evrcustompresenter_p.h b/src/plugins/multimedia/windows/evr/evrcustompresenter_p.h
index f6f1c6756..65a72a6bf 100644
--- a/src/plugins/multimedia/windows/evr/evrcustompresenter_p.h
+++ b/src/plugins/multimedia/windows/evr/evrcustompresenter_p.h
@@ -154,7 +154,7 @@ public:
SamplePool();
~SamplePool();
- HRESULT initialize(QList<IMFSample*> &samples);
+ HRESULT initialize(QList<ComPtr<IMFSample>> &&samples);
HRESULT clear();
HRESULT getSample(IMFSample **sample);
diff --git a/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp b/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp
index 23c8050cd..bc5e49eb0 100644
--- a/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp
+++ b/src/plugins/multimedia/windows/evr/evrd3dpresentengine.cpp
@@ -592,7 +592,9 @@ HRESULT D3DPresentEngine::checkFormat(D3DFORMAT format)
return ok ? S_OK : D3DERR_NOTAVAILABLE;
}
-HRESULT D3DPresentEngine::createVideoSamples(IMFMediaType *format, QList<IMFSample*> &videoSampleQueue, QSize frameSize)
+HRESULT D3DPresentEngine::createVideoSamples(IMFMediaType *format,
+ QList<ComPtr<IMFSample>> &videoSampleQueue,
+ QSize frameSize)
{
if (!format || !m_device)
return MF_E_UNEXPECTED;
@@ -641,7 +643,7 @@ HRESULT D3DPresentEngine::createVideoSamples(IMFMediaType *format, QList<IMFSamp
break;
m_sampleTextureHandle[i] = {videoSample.Get(), sharedHandle};
- videoSampleQueue.append(videoSample.Detach());
+ videoSampleQueue.append(videoSample);
}
if (SUCCEEDED(hr)) {
diff --git a/src/plugins/multimedia/windows/evr/evrd3dpresentengine_p.h b/src/plugins/multimedia/windows/evr/evrd3dpresentengine_p.h
index 3abf07835..559465907 100644
--- a/src/plugins/multimedia/windows/evr/evrd3dpresentengine_p.h
+++ b/src/plugins/multimedia/windows/evr/evrd3dpresentengine_p.h
@@ -107,7 +107,8 @@ public:
HRESULT checkFormat(D3DFORMAT format);
UINT refreshRate() const { return m_displayMode.RefreshRate; }
- HRESULT createVideoSamples(IMFMediaType *format, QList<IMFSample*>& videoSampleQueue, QSize frameSize);
+ HRESULT createVideoSamples(IMFMediaType *format, QList<ComPtr<IMFSample>> &videoSampleQueue,
+ QSize frameSize);
QVideoFrameFormat videoSurfaceFormat() const { return m_surfaceFormat; }
QVideoFrame makeVideoFrame(IMFSample* sample);