diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2019-09-11 18:48:35 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2019-09-12 08:50:11 +0000 |
commit | 324471ef9054911422f8f2d40a243c67b501c8f0 (patch) | |
tree | b6fccceb55f338a8c53e31afb88a4fce965d305b /src/plugins/directshow | |
parent | c9058d90d0b08781f14a494780c3094594c81f22 (diff) | |
parent | a1bf811b1dd287fbb75b6d27dbc163f15001e28f (diff) |
Merge remote-tracking branch 'origin/5.13' into 5.14
Conflicts:
src/gsttools/qgstvideorenderersink.cpp
src/gsttools/qgstvideorenderersink_p.h
Change-Id: I7fe29161d568fa3f7688abfd2f993d1b16ac3fb9
Diffstat (limited to 'src/plugins/directshow')
6 files changed, 34 insertions, 22 deletions
diff --git a/src/plugins/directshow/common/directshowutils.cpp b/src/plugins/directshow/common/directshowutils.cpp index 21b86926f..1457837ce 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 diff --git a/src/plugins/directshow/dsserviceplugin.cpp b/src/plugins/directshow/dsserviceplugin.cpp index e22bfe93b..18a807fd1 100644 --- a/src/plugins/directshow/dsserviceplugin.cpp +++ b/src/plugins/directshow/dsserviceplugin.cpp @@ -54,6 +54,7 @@ #include "directshowplayerservice.h" #include <qmediaserviceproviderplugin.h> +#include "directshowutils.h" extern const CLSID CLSID_VideoInputDeviceCategory; @@ -74,28 +75,15 @@ extern const CLSID CLSID_VideoInputDeviceCategory; QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(qtDirectShowPlugin, "qt.multimedia.plugins.directshow") -static int g_refCount = 0; -void addRefCount() -{ - if (++g_refCount == 1) - CoInitialize(nullptr); -} - -void releaseRefCount() -{ - if (--g_refCount == 0) - CoUninitialize(); -} - QMediaService* DSServicePlugin::create(QString const& key) { if (key == QLatin1String(Q_MEDIASERVICE_CAMERA)) { - addRefCount(); + DirectShowUtils::CoInitializeIfNeeded(); return new DSCameraService; } if (key == QLatin1String(Q_MEDIASERVICE_MEDIAPLAYER)) { - addRefCount(); + DirectShowUtils::CoInitializeIfNeeded(); return new DirectShowPlayerService; } @@ -105,7 +93,7 @@ QMediaService* DSServicePlugin::create(QString const& key) void DSServicePlugin::release(QMediaService *service) { delete service; - releaseRefCount(); + DirectShowUtils::CoUninitializeIfNeeded(); } QMediaServiceProviderHint::Features DSServicePlugin::supportedFeatures( @@ -119,9 +107,9 @@ QMediaServiceProviderHint::Features DSServicePlugin::supportedFeatures( QByteArray DSServicePlugin::defaultDevice(const QByteArray &service) const { if (service == Q_MEDIASERVICE_CAMERA) { - addRefCount(); + DirectShowUtils::CoInitializeIfNeeded(); const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices(); - releaseRefCount(); + DirectShowUtils::CoUninitializeIfNeeded(); if (!devs.isEmpty()) return devs.first().first; } @@ -133,9 +121,9 @@ QList<QByteArray> DSServicePlugin::devices(const QByteArray &service) const QList<QByteArray> result; if (service == Q_MEDIASERVICE_CAMERA) { - addRefCount(); + DirectShowUtils::CoInitializeIfNeeded(); const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices(); - releaseRefCount(); + DirectShowUtils::CoUninitializeIfNeeded(); for (const DSVideoDeviceInfo &info : devs) result.append(info.first); } @@ -146,9 +134,9 @@ QList<QByteArray> DSServicePlugin::devices(const QByteArray &service) const QString DSServicePlugin::deviceDescription(const QByteArray &service, const QByteArray &device) { if (service == Q_MEDIASERVICE_CAMERA) { - addRefCount(); + DirectShowUtils::CoInitializeIfNeeded(); const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices(); - releaseRefCount(); + DirectShowUtils::CoUninitializeIfNeeded(); for (const DSVideoDeviceInfo &info : devs) { if (info.first == device) return info.second; diff --git a/src/plugins/directshow/player/directshowplayerservice.cpp b/src/plugins/directshow/player/directshowplayerservice.cpp index cf0b5f84d..42105c471 100644 --- a/src/plugins/directshow/player/directshowplayerservice.cpp +++ b/src/plugins/directshow/player/directshowplayerservice.cpp @@ -303,6 +303,7 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream 0x36b73882, 0xc2c8, 0x11cf, {0x8b, 0x46, 0x00, 0x80, 0x5f, 0x6c, 0xef, 0x60} }; m_graphStatus = Loading; + DirectShowUtils::CoInitializeIfNeeded(); m_graph = com_new<IFilterGraph2>(CLSID_FilterGraph, iid_IFilterGraph2); m_graphBuilder = com_new<ICaptureGraphBuilder2>(CLSID_CaptureGraphBuilder2, IID_ICaptureGraphBuilder2); @@ -640,6 +641,7 @@ void DirectShowPlayerService::releaseGraph() ::SetEvent(m_taskHandle); m_loop->wait(&m_mutex); + DirectShowUtils::CoUninitializeIfNeeded(); } } @@ -1436,6 +1438,9 @@ void DirectShowPlayerService::customEvent(QEvent *event) if (m_playerControl->mediaStatus() == QMediaPlayer::EndOfMedia) m_playerControl->updateStatus(QMediaPlayer::LoadedMedia); m_playerControl->updatePosition(m_position); + // Emits only when seek has been performed. + if (m_videoRendererControl) + emit m_videoRendererControl->positionChanged(m_position); } else { QMediaService::customEvent(event); } diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp index 19be82141..0b1f0de2f 100644 --- a/src/plugins/directshow/player/directshowvideorenderercontrol.cpp +++ b/src/plugins/directshow/player/directshowvideorenderercontrol.cpp @@ -96,6 +96,7 @@ void DirectShowVideoRendererControl::setSurface(QAbstractVideoSurface *surface) if (!qgetenv("QT_DIRECTSHOW_NO_EVR").toInt()) { m_filter = com_new<IBaseFilter>(clsid_EnhancedVideoRenderer); m_evrPresenter = new EVRCustomPresenter(m_surface); + connect(this, &DirectShowVideoRendererControl::positionChanged, m_evrPresenter, &EVRCustomPresenter::positionChanged); if (!m_evrPresenter->isValid() || !qt_evr_setCustomPresenter(m_filter, m_evrPresenter)) { m_filter->Release(); m_filter = nullptr; diff --git a/src/plugins/directshow/player/directshowvideorenderercontrol.h b/src/plugins/directshow/player/directshowvideorenderercontrol.h index dcbcadb4b..9326a2748 100644 --- a/src/plugins/directshow/player/directshowvideorenderercontrol.h +++ b/src/plugins/directshow/player/directshowvideorenderercontrol.h @@ -68,6 +68,7 @@ public: Q_SIGNALS: void filterChanged(); + void positionChanged(qint64 position); private: DirectShowEventLoop *m_loop; |