summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJøger Hansegård <joger.hansegard@qt.io>2023-10-30 17:47:51 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-11-01 09:43:47 +0000
commitb828ed8ab8683799accfa13f16972c0d16876da1 (patch)
tree2625a50176be2348b517c83222506d9af8f9c7c9
parentee2517c0a5477e16bdca9fe371a4fa8ac1771e48 (diff)
Simplify lifetime handling of IMFSample instances in EVR MediaPlayer
By using the ComPtr smart pointer class, we can simplify some of the lifetime handling of Windows Media Foundation sample objects by reducing amount of code for reference counting. Pick-to: 6.5 Change-Id: If89820270b0714d56419ba9b306f8493c4488280 Reviewed-by: Pavel Dubsky <pavel.dubsky@qt.io> Reviewed-by: Artem Dyomin <artem.dyomin@qt.io> (cherry picked from commit 968745eaf3b54810e6f816fa8972ee60d5e253dc) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/plugins/multimedia/windows/evr/evrcustompresenter.cpp33
-rw-r--r--src/plugins/multimedia/windows/evr/evrcustompresenter_p.h3
2 files changed, 9 insertions, 27 deletions
diff --git a/src/plugins/multimedia/windows/evr/evrcustompresenter.cpp b/src/plugins/multimedia/windows/evr/evrcustompresenter.cpp
index 6de245413..fa8c27283 100644
--- a/src/plugins/multimedia/windows/evr/evrcustompresenter.cpp
+++ b/src/plugins/multimedia/windows/evr/evrcustompresenter.cpp
@@ -61,24 +61,15 @@ bool qt_evr_setCustomPresenter(IUnknown *evr, EVRCustomPresenter *presenter)
class PresentSampleEvent : public QEvent
{
public:
- PresentSampleEvent(IMFSample *sample)
- : QEvent(QEvent::Type(EVRCustomPresenter::PresentSample))
- , m_sample(sample)
+ explicit PresentSampleEvent(IMFSample *sample)
+ : QEvent(static_cast<Type>(EVRCustomPresenter::PresentSample)), m_sample(sample)
{
- if (m_sample)
- m_sample->AddRef();
}
- ~PresentSampleEvent() override
- {
- if (m_sample)
- m_sample->Release();
- }
-
- IMFSample *sample() const { return m_sample; }
+ IMFSample *sample() const { return m_sample.Get(); }
private:
- IMFSample *m_sample;
+ const ComPtr<IMFSample> m_sample;
};
Scheduler::Scheduler(EVRCustomPresenter *presenter)
@@ -98,8 +89,6 @@ Scheduler::Scheduler(EVRCustomPresenter *presenter)
Scheduler::~Scheduler()
{
qt_evr_safe_release(&m_clock);
- for (int i = 0; i < m_scheduledSamples.size(); ++i)
- m_scheduledSamples[i]->Release();
m_scheduledSamples.clear();
}
@@ -200,8 +189,6 @@ HRESULT Scheduler::stopScheduler()
// Discard samples.
m_mutex.lock();
- for (int i = 0; i < m_scheduledSamples.size(); ++i)
- m_scheduledSamples[i]->Release();
m_scheduledSamples.clear();
m_mutex.unlock();
@@ -250,7 +237,6 @@ HRESULT Scheduler::scheduleSample(IMFSample *sample, bool presentNow)
} else {
// Queue the sample and ask the scheduler thread to wake up.
m_mutex.lock();
- sample->AddRef();
m_scheduledSamples.enqueue(sample);
m_mutex.unlock();
@@ -265,20 +251,18 @@ HRESULT Scheduler::processSamplesInQueue(LONG *nextSleep)
{
HRESULT hr = S_OK;
LONG wait = 0;
- IMFSample *sample = NULL;
// Process samples until the queue is empty or until the wait time > 0.
while (!m_scheduledSamples.isEmpty()) {
m_mutex.lock();
- sample = m_scheduledSamples.dequeue();
+ ComPtr<IMFSample> sample = m_scheduledSamples.dequeue();
m_mutex.unlock();
// Process the next sample in the queue. If the sample is not ready
// for presentation. the value returned in wait is > 0, which
// means the scheduler should sleep for that amount of time.
- hr = processSample(sample, &wait);
- qt_evr_safe_release(&sample);
+ hr = processSample(sample.Get(), &wait);
if (FAILED(hr) || wait > 0)
break;
@@ -346,7 +330,6 @@ HRESULT Scheduler::processSample(IMFSample *sample, LONG *pNextSleep)
} else {
// The sample is not ready yet. Return it to the queue.
m_mutex.lock();
- sample->AddRef();
m_scheduledSamples.prepend(sample);
m_mutex.unlock();
}
@@ -399,8 +382,6 @@ DWORD Scheduler::schedulerThreadProcPrivate()
case Flush:
// Flushing: Clear the sample queue and set the event.
m_mutex.lock();
- for (int i = 0; i < m_scheduledSamples.size(); ++i)
- m_scheduledSamples[i]->Release();
m_scheduledSamples.clear();
m_mutex.unlock();
wait = INFINITE;
@@ -1095,7 +1076,7 @@ HRESULT EVRCustomPresenter::flush()
if (m_renderState == RenderStopped && m_videoSink) {
// Repaint with black.
- presentSample(NULL);
+ presentSample(nullptr);
}
return S_OK;
diff --git a/src/plugins/multimedia/windows/evr/evrcustompresenter_p.h b/src/plugins/multimedia/windows/evr/evrcustompresenter_p.h
index 9f5a827ff..6a21f54c2 100644
--- a/src/plugins/multimedia/windows/evr/evrcustompresenter_p.h
+++ b/src/plugins/multimedia/windows/evr/evrcustompresenter_p.h
@@ -23,6 +23,7 @@
#include <qvideoframeformat.h>
#include <qvideosink.h>
#include <qpointer.h>
+#include <private/qcomptr_p.h>
#include <d3d9.h>
#include <dxva2api.h>
@@ -129,7 +130,7 @@ private:
EVRCustomPresenter *m_presenter;
- QQueue<IMFSample*> m_scheduledSamples; // Samples waiting to be presented.
+ QQueue<ComPtr<IMFSample>> m_scheduledSamples; // Samples waiting to be presented.
IMFClock *m_clock; // Presentation clock. Can be NULL.