diff --git a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp index b3fd11111a0bbcb042fb9e459ca695ee5d798ec9..79545f6eecf48bce6de48347f52cc61628f3b8d2 100644 --- a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp +++ b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp @@ -43,6 +43,7 @@ #include <QtCore/QGlobalStatic> #include <QtCore/QLoggingCategory> #include <QtCore/QMetaMethod> +#include <QtCore/QMutexLocker> #include <QtCore/QPointer> #include <QtGui/QOpenGLContext> #include <QtGui/QOpenGLTexture> @@ -198,7 +199,7 @@ public: QThread renderThread; bool active; QWinRTAbstractVideoRendererControl::BlitMode blitMode; - CRITICAL_SECTION mutex; + QMutex mutex; }; ID3D11Device *QWinRTAbstractVideoRendererControl::d3dDevice() @@ -232,7 +233,6 @@ QWinRTAbstractVideoRendererControl::QWinRTAbstractVideoRendererControl(const QSi d->eglSurface = EGL_NO_SURFACE; d->active = false; d->blitMode = DirectVideo; - InitializeCriticalSectionEx(&d->mutex, 0, 0); connect(&d->renderThread, &QThread::started, this, &QWinRTAbstractVideoRendererControl::syncAndRender, @@ -243,9 +243,9 @@ QWinRTAbstractVideoRendererControl::~QWinRTAbstractVideoRendererControl() { qCDebug(lcMMVideoRender) << __FUNCTION__; Q_D(QWinRTAbstractVideoRendererControl); - CriticalSectionLocker locker(&d->mutex); + QMutexLocker locker(&d->mutex); shutdown(); - DeleteCriticalSection(&d->mutex); + locker.unlock(); eglDestroySurface(d->eglDisplay, d->eglSurface); } @@ -272,7 +272,7 @@ void QWinRTAbstractVideoRendererControl::syncAndRender() if (currentThread->isInterruptionRequested()) break; { - CriticalSectionLocker lock(&d->mutex); + QMutexLocker lock(&d->mutex); HRESULT hr; if (d->dirtyState == TextureDirty) { CD3D11_TEXTURE2D_DESC desc(DXGI_FORMAT_B8G8R8A8_UNORM, d->format.frameWidth(), d->format.frameHeight(), 1, 1); @@ -359,7 +359,7 @@ void QWinRTAbstractVideoRendererControl::setActive(bool active) // This only happens for quick restart scenarios, for instance // when switching cameras. if (d->renderThread.isRunning() && d->renderThread.isInterruptionRequested()) { - CriticalSectionLocker lock(&d->mutex); + QMutexLocker lock(&d->mutex); d->renderThread.wait(); } @@ -385,7 +385,7 @@ QWinRTAbstractVideoRendererControl::BlitMode QWinRTAbstractVideoRendererControl: void QWinRTAbstractVideoRendererControl::setBlitMode(QWinRTAbstractVideoRendererControl::BlitMode mode) { Q_D(QWinRTAbstractVideoRendererControl); - CriticalSectionLocker lock(&d->mutex); + QMutexLocker lock(&d->mutex); if (d->blitMode == mode) return; diff --git a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h index a7ba2998adb3e6e6486c25946c5f76b96da4749e..53dcb6b941aab45a4fceb79faf2f247d6dafb755 100644 --- a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h +++ b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.h @@ -96,22 +96,6 @@ private: Q_DECLARE_PRIVATE(QWinRTAbstractVideoRendererControl) }; -class CriticalSectionLocker -{ -public: - CriticalSectionLocker(CRITICAL_SECTION *section) - : m_section(section) - { - EnterCriticalSection(m_section); - } - ~CriticalSectionLocker() - { - LeaveCriticalSection(m_section); - } -private: - CRITICAL_SECTION *m_section; -}; - QT_END_NAMESPACE #endif // QWINRTABSTRACTVIDEORENDERERCONTROL_H diff --git a/src/plugins/winrt/qwinrtcameracontrol.cpp b/src/plugins/winrt/qwinrtcameracontrol.cpp index a28d57219fa736f45a6ea3335d27dc22e0b46e1a..e44f81666177802ef98d9a4c117978fa568eea7d 100644 --- a/src/plugins/winrt/qwinrtcameracontrol.cpp +++ b/src/plugins/winrt/qwinrtcameracontrol.cpp @@ -47,6 +47,7 @@ #include "qwinrtcameralockscontrol.h" #include <QtCore/qfunctions_winrt.h> +#include <QtCore/QMutex> #include <QtCore/QPointer> #include <QtGui/QGuiApplication> #include <private/qeventdispatcher_winrt_p.h> @@ -227,8 +228,6 @@ public: { Q_ASSERT(m_videoRenderer); - InitializeCriticalSectionEx(&m_mutex, 0, 0); - HRESULT hr; hr = MFCreateEventQueue(&m_eventQueue); Q_ASSERT_SUCCEEDED(hr); @@ -238,9 +237,8 @@ public: ~MediaStream() { - CriticalSectionLocker locker(&m_mutex); + QMutexLocker locker(&m_mutex); m_eventQueue->Shutdown(); - DeleteCriticalSection(&m_mutex); } HRESULT RequestSample() @@ -254,30 +252,30 @@ public: HRESULT __stdcall GetEvent(DWORD flags, IMFMediaEvent **event) Q_DECL_OVERRIDE { - EnterCriticalSection(&m_mutex); + QMutexLocker locker(&m_mutex); // Create an extra reference to avoid deadlock ComPtr<IMFMediaEventQueue> eventQueue = m_eventQueue; - LeaveCriticalSection(&m_mutex); + locker.unlock(); return eventQueue->GetEvent(flags, event); } HRESULT __stdcall BeginGetEvent(IMFAsyncCallback *callback, IUnknown *state) Q_DECL_OVERRIDE { - CriticalSectionLocker locker(&m_mutex); + QMutexLocker locker(&m_mutex); HRESULT hr = m_eventQueue->BeginGetEvent(callback, state); return hr; } HRESULT __stdcall EndGetEvent(IMFAsyncResult *result, IMFMediaEvent **event) Q_DECL_OVERRIDE { - CriticalSectionLocker locker(&m_mutex); + QMutexLocker locker(&m_mutex); return m_eventQueue->EndGetEvent(result, event); } HRESULT __stdcall QueueEvent(MediaEventType eventType, const GUID &extendedType, HRESULT status, const PROPVARIANT *value) Q_DECL_OVERRIDE { - CriticalSectionLocker locker(&m_mutex); + QMutexLocker locker(&m_mutex); return m_eventQueue->QueueEventParamVar(eventType, extendedType, status, value); } @@ -372,7 +370,7 @@ public: } private: - CRITICAL_SECTION m_mutex; + QMutex m_mutex; ComPtr<IMFMediaType> m_type; IMFMediaSink *m_sink; ComPtr<IMFMediaEventQueue> m_eventQueue;