summaryrefslogtreecommitdiffstats
path: root/src/plugins/directshow/dsserviceplugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/directshow/dsserviceplugin.cpp')
-rw-r--r--src/plugins/directshow/dsserviceplugin.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/plugins/directshow/dsserviceplugin.cpp b/src/plugins/directshow/dsserviceplugin.cpp
index d262febdd..954fab22c 100644
--- a/src/plugins/directshow/dsserviceplugin.cpp
+++ b/src/plugins/directshow/dsserviceplugin.cpp
@@ -79,15 +79,32 @@ extern const CLSID CLSID_VideoInputDeviceCategory;
QT_USE_NAMESPACE
+static int g_refCount = 0;
+void addRefCount()
+{
+ if (++g_refCount == 1)
+ CoInitialize(NULL);
+}
+
+void releaseRefCount()
+{
+ if (--g_refCount == 0)
+ CoUninitialize();
+}
+
QMediaService* DSServicePlugin::create(QString const& key)
{
#ifdef QMEDIA_DIRECTSHOW_CAMERA
- if (key == QLatin1String(Q_MEDIASERVICE_CAMERA))
+ if (key == QLatin1String(Q_MEDIASERVICE_CAMERA)) {
+ addRefCount();
return new DSCameraService;
+ }
#endif
#ifdef QMEDIA_DIRECTSHOW_PLAYER
- if (key == QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER))
+ if (key == QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER)) {
+ addRefCount();
return new DirectShowPlayerService;
+ }
#endif
return 0;
@@ -96,6 +113,7 @@ QMediaService* DSServicePlugin::create(QString const& key)
void DSServicePlugin::release(QMediaService *service)
{
delete service;
+ releaseRefCount();
}
QMediaServiceProviderHint::Features DSServicePlugin::supportedFeatures(
@@ -154,6 +172,8 @@ QString DSServicePlugin::deviceDescription(const QByteArray &service, const QByt
void DSServicePlugin::updateDevices() const
{
+ addRefCount();
+
m_defaultCameraDevice.clear();
DSVideoDeviceControl::enumerateDevices(&m_cameraDevices, &m_cameraDescriptions);
@@ -162,6 +182,8 @@ void DSServicePlugin::updateDevices() const
} else {
m_defaultCameraDevice = m_cameraDevices.first();
}
+
+ releaseRefCount();
}
#endif