summaryrefslogtreecommitdiffstats
path: root/src/plugins/directshow
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2018-01-06 20:21:19 +0100
committerLiang Qi <liang.qi@qt.io>2018-01-06 20:21:19 +0100
commit82621148de82d63a562163a72598e15ed98797a8 (patch)
tree030d345ad4a4ae612995949bbbeec66b36e69854 /src/plugins/directshow
parent2fc515ea1eaa0f7ffb56c4dadee560095c3374bd (diff)
parent7a3b8907060123fe5d487d4c9ba3a1e222f468bb (diff)
Merge remote-tracking branch 'origin/5.10' into dev
Conflicts: .qmake.conf Change-Id: I5acdc7e0bd3729b80522dfff0f388cf2507fb111
Diffstat (limited to 'src/plugins/directshow')
-rw-r--r--src/plugins/directshow/camera/dscamerasession.cpp4
-rw-r--r--src/plugins/directshow/dsserviceplugin.cpp6
-rw-r--r--src/plugins/directshow/player/directshowplayerservice.cpp31
-rw-r--r--src/plugins/directshow/player/directshowplayerservice.h4
4 files changed, 35 insertions, 10 deletions
diff --git a/src/plugins/directshow/camera/dscamerasession.cpp b/src/plugins/directshow/camera/dscamerasession.cpp
index 195712057..6590afeb9 100644
--- a/src/plugins/directshow/camera/dscamerasession.cpp
+++ b/src/plugins/directshow/camera/dscamerasession.cpp
@@ -815,8 +815,8 @@ bool DSCameraSession::configurePreviewFormat()
return false;
}
- // Set sample grabber format (always RGB32)
- static const AM_MEDIA_TYPE grabberFormat { MEDIATYPE_Video, MEDIASUBTYPE_RGB32, 0, 0, 0, FORMAT_VideoInfo, nullptr, 0, nullptr};
+ // Set sample grabber format
+ static const AM_MEDIA_TYPE grabberFormat { MEDIATYPE_Video, MEDIASUBTYPE_ARGB32, 0, 0, 0, FORMAT_VideoInfo, nullptr, 0, nullptr};
if (!m_previewSampleGrabber->setMediaType(&grabberFormat))
return false;
diff --git a/src/plugins/directshow/dsserviceplugin.cpp b/src/plugins/directshow/dsserviceplugin.cpp
index 51be7e500..cb4f0cdf9 100644
--- a/src/plugins/directshow/dsserviceplugin.cpp
+++ b/src/plugins/directshow/dsserviceplugin.cpp
@@ -123,7 +123,9 @@ QMediaServiceProviderHint::Features DSServicePlugin::supportedFeatures(
QByteArray DSServicePlugin::defaultDevice(const QByteArray &service) const
{
if (service == Q_MEDIASERVICE_CAMERA) {
+ addRefCount();
const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices();
+ releaseRefCount();
if (!devs.isEmpty())
return devs.first().first;
}
@@ -135,7 +137,9 @@ QList<QByteArray> DSServicePlugin::devices(const QByteArray &service) const
QList<QByteArray> result;
if (service == Q_MEDIASERVICE_CAMERA) {
+ addRefCount();
const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices();
+ releaseRefCount();
for (const DSVideoDeviceInfo &info : devs)
result.append(info.first);
}
@@ -146,7 +150,9 @@ QList<QByteArray> DSServicePlugin::devices(const QByteArray &service) const
QString DSServicePlugin::deviceDescription(const QByteArray &service, const QByteArray &device)
{
if (service == Q_MEDIASERVICE_CAMERA) {
+ addRefCount();
const QList<DSVideoDeviceInfo> &devs = DSVideoDeviceControl::availableDevices();
+ releaseRefCount();
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 8ee5d67a1..2218ca5ed 100644
--- a/src/plugins/directshow/player/directshowplayerservice.cpp
+++ b/src/plugins/directshow/player/directshowplayerservice.cpp
@@ -318,18 +318,15 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream
m_graphStatus = InvalidMedia;
m_error = QMediaPlayer::ResourceError;
} else {
- // {36b73882-c2c8-11cf-8b46-00805f6cef60}
- static const GUID iid_IFilterGraph2 = {
- 0x36b73882, 0xc2c8, 0x11cf, {0x8b, 0x46, 0x00, 0x80, 0x5f, 0x6c, 0xef, 0x60} };
m_graphStatus = Loading;
- m_graph = com_new<IFilterGraph2>(CLSID_FilterGraph, iid_IFilterGraph2);
-
if (stream)
m_pendingTasks = SetStreamSource;
else
m_pendingTasks = SetUrlSource;
+ m_pendingTasks |= CreateGraph;
+
::SetEvent(m_taskHandle);
}
@@ -340,6 +337,17 @@ void DirectShowPlayerService::load(const QMediaContent &media, QIODevice *stream
updateStatus();
}
+void DirectShowPlayerService::doCreateGraph(QMutexLocker *locker)
+{
+ Q_UNUSED(locker);
+
+ // {36b73882-c2c8-11cf-8b46-00805f6cef60}
+ static const GUID iid_IFilterGraph2 = {
+ 0x36b73882, 0xc2c8, 0x11cf, {0x8b, 0x46, 0x00, 0x80, 0x5f, 0x6c, 0xef, 0x60} };
+
+ m_graph = com_new<IFilterGraph2>(CLSID_FilterGraphNoThread, iid_IFilterGraph2);
+}
+
void DirectShowPlayerService::doSetUrlSource(QMutexLocker *locker)
{
IBaseFilter *source = 0;
@@ -1686,6 +1694,8 @@ void DirectShowPlayerService::run()
{
QMutexLocker locker(&m_mutex);
+ CoInitialize(NULL);
+
for (;;) {
while (m_pendingTasks == 0) {
DWORD result = 0;
@@ -1700,12 +1710,17 @@ void DirectShowPlayerService::run()
}
locker.relock();
- if (result == WAIT_OBJECT_0 + 1) {
+ if (m_graph && result == WAIT_OBJECT_0 + 1) {
graphEvent(&locker);
}
}
- if (m_pendingTasks & ReleaseGraph) {
+ if (m_pendingTasks & CreateGraph) {
+ m_pendingTasks ^= CreateGraph;
+ m_executingTask = CreateGraph;
+
+ doCreateGraph(&locker);
+ } else if (m_pendingTasks & ReleaseGraph) {
m_pendingTasks ^= ReleaseGraph;
m_executingTask = ReleaseGraph;
@@ -1798,6 +1813,8 @@ void DirectShowPlayerService::run()
}
m_executingTask = 0;
}
+
+ CoUninitialize();
}
QT_END_NAMESPACE
diff --git a/src/plugins/directshow/player/directshowplayerservice.h b/src/plugins/directshow/player/directshowplayerservice.h
index 01d05449e..cc7b4dd3e 100644
--- a/src/plugins/directshow/player/directshowplayerservice.h
+++ b/src/plugins/directshow/player/directshowplayerservice.h
@@ -124,6 +124,7 @@ private:
void run();
+ void doCreateGraph(QMutexLocker *locker);
void doSetUrlSource(QMutexLocker *locker);
void doSetStreamSource(QMutexLocker *locker);
void doRender(QMutexLocker *locker);
@@ -169,7 +170,8 @@ private:
ReleaseVideoProbe = 0x40000,
ReleaseFilters = ReleaseGraph | ReleaseAudioOutput
| ReleaseVideoOutput | ReleaseAudioProbe
- | ReleaseVideoProbe
+ | ReleaseVideoProbe,
+ CreateGraph = 0x80000
};
enum Event