diff options
author | Val Doroshchuk <valentyn.doroshchuk@qt.io> | 2019-08-30 12:59:29 +0200 |
---|---|---|
committer | VaL Doroshchuk <valentyn.doroshchuk@qt.io> | 2019-09-09 12:33:18 +0200 |
commit | cb06ede8ba9a33adbbfdc690faa1a83be4e70b55 (patch) | |
tree | 2c3da763347405210683bbb860726214d69a8714 /src/plugins/directshow/common | |
parent | 97177277a2fcca974d7599ab8ea12ad80ab30efc (diff) |
DirectShow: Allow QMediaPlayer in secondary thread
Since using of any COM objects must be only after CoInitialize(),
otherwise CoCreateInstance() returns nothing which causes a crash.
If QMediaPlayer is moved to another thread, loading of any content will
also cause a crash because of COM is not initialized.
Proposing to use thread_local ref counter to keep each thread
initialized and avoid double initialization.
Fixes: QTBUG-77163
Change-Id: I81c67d6407b853c824edd3b42454fddf792fd90c
Reviewed-by: Christian Strømme <christian.stromme@qt.io>
Diffstat (limited to 'src/plugins/directshow/common')
-rw-r--r-- | src/plugins/directshow/common/directshowutils.cpp | 13 | ||||
-rw-r--r-- | src/plugins/directshow/common/directshowutils.h | 4 |
2 files changed, 17 insertions, 0 deletions
diff --git a/src/plugins/directshow/common/directshowutils.cpp b/src/plugins/directshow/common/directshowutils.cpp index 48d5dbd8d..13b51deb5 100644 --- a/src/plugins/directshow/common/directshowutils.cpp +++ b/src/plugins/directshow/common/directshowutils.cpp @@ -309,4 +309,17 @@ bool DirectShowUtils::connectFilters(IGraphBuilder *graph, return false; } +thread_local static int g_refCount = 0; +void DirectShowUtils::CoInitializeIfNeeded() +{ + if (++g_refCount == 1) + ::CoInitialize(nullptr); +} + +void DirectShowUtils::CoUninitializeIfNeeded() +{ + if (--g_refCount == 0) + ::CoUninitialize(); +} + QT_END_NAMESPACE diff --git a/src/plugins/directshow/common/directshowutils.h b/src/plugins/directshow/common/directshowutils.h index 09c81c257..5f2cfaa23 100644 --- a/src/plugins/directshow/common/directshowutils.h +++ b/src/plugins/directshow/common/directshowutils.h @@ -80,6 +80,10 @@ bool connectFilters(IGraphBuilder *graph, IBaseFilter *downstreamFilter, bool autoConnect = false, HRESULT *hrOut = nullptr); + +void CoInitializeIfNeeded(); +void CoUninitializeIfNeeded(); + } QT_END_NAMESPACE |