summaryrefslogtreecommitdiffstats
path: root/src/plugins/directshow
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-09-11 18:48:35 +0200
committerLiang Qi <liang.qi@qt.io>2019-09-12 08:50:11 +0000
commit324471ef9054911422f8f2d40a243c67b501c8f0 (patch)
treeb6fccceb55f338a8c53e31afb88a4fce965d305b /src/plugins/directshow
parentc9058d90d0b08781f14a494780c3094594c81f22 (diff)
parenta1bf811b1dd287fbb75b6d27dbc163f15001e28f (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')
-rw-r--r--src/plugins/directshow/common/directshowutils.cpp13
-rw-r--r--src/plugins/directshow/common/directshowutils.h4
-rw-r--r--src/plugins/directshow/dsserviceplugin.cpp32
-rw-r--r--src/plugins/directshow/player/directshowplayerservice.cpp5
-rw-r--r--src/plugins/directshow/player/directshowvideorenderercontrol.cpp1
-rw-r--r--src/plugins/directshow/player/directshowvideorenderercontrol.h1
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;