diff options
author | Jøger Hansegård <joger.hansegard@qt.io> | 2023-10-30 17:47:51 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-11-01 09:43:47 +0000 |
commit | b828ed8ab8683799accfa13f16972c0d16876da1 (patch) | |
tree | 2625a50176be2348b517c83222506d9af8f9c7c9 | |
parent | ee2517c0a5477e16bdca9fe371a4fa8ac1771e48 (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.cpp | 33 | ||||
-rw-r--r-- | src/plugins/multimedia/windows/evr/evrcustompresenter_p.h | 3 |
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. |