diff options
Diffstat (limited to 'src/plugins/directshow/dsserviceplugin.cpp')
-rw-r--r-- | src/plugins/directshow/dsserviceplugin.cpp | 26 |
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 |