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/directshowutils.cpp | |
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/directshowutils.cpp')
-rw-r--r-- | src/plugins/directshow/common/directshowutils.cpp | 13 |
1 files changed, 13 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 |