summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-04-28 03:01:23 +0200
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-04-28 03:01:23 +0200
commit46518fa76c83de9a3a9edc870539a9e8b7eaef9f (patch)
treeaf26a6a84537b63620b50f1f6315b3178e31b946 /src
parent15551b768402e9785cc1441a51851ece48a186be (diff)
parent8aaf91f29933bf652ef6dc0215dea1f278b1f858 (diff)
Merge remote-tracking branch 'origin/5.11' into dev
Diffstat (limited to 'src')
-rw-r--r--src/gsttools/qgstutils.cpp2
-rw-r--r--src/multimedia/audio/qsound.cpp15
-rw-r--r--src/multimedia/audio/qsound.h2
-rw-r--r--src/multimedia/audio/qsoundeffect_qaudio_p.cpp8
-rw-r--r--src/multimedia/audio/qsoundeffect_qaudio_p.h8
-rw-r--r--src/plugins/directshow/common/common.pri1
-rw-r--r--src/plugins/directshow/common/directshowbasefilter.cpp11
-rw-r--r--src/plugins/directshow/common/directshowbasefilter.h10
-rw-r--r--src/plugins/directshow/common/directshowmediatypeenum.cpp17
-rw-r--r--src/plugins/directshow/common/directshowmediatypeenum.h19
-rw-r--r--src/plugins/directshow/common/directshowobject.cpp86
-rw-r--r--src/plugins/directshow/common/directshowobject.h46
-rw-r--r--src/plugins/directshow/common/directshowpin.cpp18
-rw-r--r--src/plugins/directshow/common/directshowpin.h25
-rw-r--r--src/plugins/directshow/common/directshowpinenum.cpp17
-rw-r--r--src/plugins/directshow/common/directshowpinenum.h19
-rw-r--r--src/plugins/directshow/player/videosurfacefilter.cpp56
-rw-r--r--src/plugins/directshow/player/videosurfacefilter.h19
-rw-r--r--src/plugins/winrt/qwinrtcameracontrol.cpp3
-rw-r--r--src/plugins/winrt/qwinrtcameraimagecapturecontrol.cpp8
-rw-r--r--src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp19
-rw-r--r--src/plugins/winrt/qwinrtmediaplayercontrol.cpp8
-rw-r--r--src/plugins/winrt/qwinrtmediaplayercontrol.h2
-rw-r--r--src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp53
24 files changed, 183 insertions, 289 deletions
diff --git a/src/gsttools/qgstutils.cpp b/src/gsttools/qgstutils.cpp
index 8849208d3..ab037d959 100644
--- a/src/gsttools/qgstutils.cpp
+++ b/src/gsttools/qgstutils.cpp
@@ -177,7 +177,7 @@ static void addTagToMap(const GstTagList *list,
/*!
\class QGstUtils
\internal
-/*
+*/
/*!
Convert GstTagList structure to QMap<QByteArray, QVariant>.
diff --git a/src/multimedia/audio/qsound.cpp b/src/multimedia/audio/qsound.cpp
index b6cf49671..cbd336457 100644
--- a/src/multimedia/audio/qsound.cpp
+++ b/src/multimedia/audio/qsound.cpp
@@ -60,6 +60,9 @@
\snippet multimedia-snippets/qsound.cpp 1
+ In both cases, the file may either be a local file or in a
+ \l{The Qt Resource System}{resource}.
+
Once created a QSound object can be queried for its fileName() and
total number of loops() (i.e. the number of times the sound will
play). The number of repetitions can be altered using the
@@ -88,9 +91,11 @@
/*!
Plays the sound stored in the file specified by the given \a filename.
+ The file can either be a local file or in a \l{The Qt Resource System}{resource}.
+
\sa stop(), loopsRemaining(), isFinished()
*/
-void QSound::play(const QString& filename)
+void QSound::play(const QString &filename)
{
// Object destruction is generally handled via deleteOnComplete
// Unexpected cases will be handled via parenting of QSound objects to qApp
@@ -104,13 +109,17 @@ void QSound::play(const QString& filename)
Constructs a QSound object from the file specified by the given \a
filename and with the given \a parent.
+ The file can either be a local file or in a \l{The Qt Resource System}{resource}.
+
\sa play()
*/
-QSound::QSound(const QString& filename, QObject* parent)
+QSound::QSound(const QString &filename, QObject *parent)
: QObject(parent)
{
m_soundEffect = new QSoundEffect(this);
- m_soundEffect->setSource(QUrl::fromLocalFile(filename));
+ const bool isQrc = filename.startsWith(QLatin1String("qrc:"), Qt::CaseInsensitive);
+ const QUrl url = isQrc ? QUrl(filename) : QUrl::fromLocalFile(filename);
+ m_soundEffect->setSource(url);
}
/*!
diff --git a/src/multimedia/audio/qsound.h b/src/multimedia/audio/qsound.h
index 57a254050..972847c37 100644
--- a/src/multimedia/audio/qsound.h
+++ b/src/multimedia/audio/qsound.h
@@ -56,7 +56,7 @@ public:
Infinite = -1
};
- static void play(const QString& filename);
+ static void play(const QString &filename);
explicit QSound(const QString &filename, QObject *parent = nullptr);
~QSound();
diff --git a/src/multimedia/audio/qsoundeffect_qaudio_p.cpp b/src/multimedia/audio/qsoundeffect_qaudio_p.cpp
index 73f1d5cfd..388f84d91 100644
--- a/src/multimedia/audio/qsoundeffect_qaudio_p.cpp
+++ b/src/multimedia/audio/qsoundeffect_qaudio_p.cpp
@@ -60,7 +60,7 @@ QT_BEGIN_NAMESPACE
Q_GLOBAL_STATIC(QSampleCache, sampleCache)
-QSoundEffectPrivate::QSoundEffectPrivate(QObject* parent):
+QSoundEffectPrivate::QSoundEffectPrivate(QObject *parent):
QObject(parent),
d(new PrivateSoundSource(this))
{
@@ -302,7 +302,7 @@ void QSoundEffectPrivate::setCategory(const QString &category)
}
}
-PrivateSoundSource::PrivateSoundSource(QSoundEffectPrivate* s):
+PrivateSoundSource::PrivateSoundSource(QSoundEffectPrivate *s):
QIODevice(s)
{
soundeffect = s;
@@ -354,7 +354,7 @@ void PrivateSoundSource::stateChanged(QAudio::State state)
emit soundeffect->stop();
}
-qint64 PrivateSoundSource::readData( char* data, qint64 len)
+qint64 PrivateSoundSource::readData(char *data, qint64 len)
{
if ((m_runningCount > 0 || m_runningCount == QSoundEffect::Infinite) && m_playing) {
@@ -428,7 +428,7 @@ qint64 PrivateSoundSource::readData( char* data, qint64 len)
return 0;
}
-qint64 PrivateSoundSource::writeData(const char* data, qint64 len)
+qint64 PrivateSoundSource::writeData(const char *data, qint64 len)
{
Q_UNUSED(data)
Q_UNUSED(len)
diff --git a/src/multimedia/audio/qsoundeffect_qaudio_p.h b/src/multimedia/audio/qsoundeffect_qaudio_p.h
index db48e7ca6..c02a85969 100644
--- a/src/multimedia/audio/qsoundeffect_qaudio_p.h
+++ b/src/multimedia/audio/qsoundeffect_qaudio_p.h
@@ -66,11 +66,11 @@ class PrivateSoundSource : public QIODevice
friend class QSoundEffectPrivate;
Q_OBJECT
public:
- PrivateSoundSource(QSoundEffectPrivate* s);
+ PrivateSoundSource(QSoundEffectPrivate *s);
~PrivateSoundSource() {}
- qint64 readData( char* data, qint64 len) override;
- qint64 writeData(const char* data, qint64 len) override;
+ qint64 readData(char *data, qint64 len) override;
+ qint64 writeData(const char *data, qint64 len) override;
private Q_SLOTS:
void sampleReady();
@@ -101,7 +101,7 @@ class QSoundEffectPrivate : public QObject
Q_OBJECT
public:
- explicit QSoundEffectPrivate(QObject* parent);
+ explicit QSoundEffectPrivate(QObject *parent);
~QSoundEffectPrivate();
static QStringList supportedMimeTypes();
diff --git a/src/plugins/directshow/common/common.pri b/src/plugins/directshow/common/common.pri
index 06f8582ac..43acff8a5 100644
--- a/src/plugins/directshow/common/common.pri
+++ b/src/plugins/directshow/common/common.pri
@@ -20,7 +20,6 @@ SOURCES += \
$$PWD/directshoweventloop.cpp \
$$PWD/directshowmediatype.cpp \
$$PWD/directshowmediatypeenum.cpp \
- $$PWD/directshowobject.cpp \
$$PWD/directshowpin.cpp \
$$PWD/directshowpinenum.cpp \
$$PWD/directshowvideobuffer.cpp \
diff --git a/src/plugins/directshow/common/directshowbasefilter.cpp b/src/plugins/directshow/common/directshowbasefilter.cpp
index 342f0c271..1e45eea51 100644
--- a/src/plugins/directshow/common/directshowbasefilter.cpp
+++ b/src/plugins/directshow/common/directshowbasefilter.cpp
@@ -61,17 +61,6 @@ DirectShowBaseFilter::~DirectShowBaseFilter()
}
}
-HRESULT DirectShowBaseFilter::getInterface(REFIID riid, void **ppvObject)
-{
- if (riid == IID_IPersist
- || riid == IID_IMediaFilter
- || riid == IID_IBaseFilter) {
- return GetInterface(static_cast<IBaseFilter *>(this), ppvObject);
- } else {
- return DirectShowObject::getInterface(riid, ppvObject);
- }
-}
-
HRESULT DirectShowBaseFilter::GetClassID(CLSID *pClassID)
{
*pClassID = CLSID_NULL;
diff --git a/src/plugins/directshow/common/directshowbasefilter.h b/src/plugins/directshow/common/directshowbasefilter.h
index 9a2f44567..21ca648eb 100644
--- a/src/plugins/directshow/common/directshowbasefilter.h
+++ b/src/plugins/directshow/common/directshowbasefilter.h
@@ -44,23 +44,17 @@
QT_BEGIN_NAMESPACE
-class DirectShowBaseFilter : public DirectShowObject
- , public IBaseFilter
+class DirectShowBaseFilter : public IBaseFilter
{
- DIRECTSHOW_OBJECT
-
public:
DirectShowBaseFilter();
- virtual ~DirectShowBaseFilter();
+ ~DirectShowBaseFilter();
FILTER_STATE state() const { return m_state; }
HRESULT NotifyEvent(long eventCode, LONG_PTR eventParam1, LONG_PTR eventParam2);
virtual QList<DirectShowPin *> pins() = 0;
- // DirectShowObject
- HRESULT getInterface(const IID &riid, void **ppvObject);
-
// IPersist
STDMETHODIMP GetClassID(CLSID *pClassID);
diff --git a/src/plugins/directshow/common/directshowmediatypeenum.cpp b/src/plugins/directshow/common/directshowmediatypeenum.cpp
index 8fbdf7dea..a6afcd5f1 100644
--- a/src/plugins/directshow/common/directshowmediatypeenum.cpp
+++ b/src/plugins/directshow/common/directshowmediatypeenum.cpp
@@ -62,13 +62,18 @@ DirectShowMediaTypeEnum::~DirectShowMediaTypeEnum()
m_pin->Release();
}
-HRESULT DirectShowMediaTypeEnum::getInterface(REFIID riid, void **ppvObject)
+HRESULT DirectShowMediaTypeEnum::QueryInterface(REFIID riid, void **ppv)
{
- if (riid == IID_IEnumMediaTypes) {
- return GetInterface(static_cast<IEnumMediaTypes *>(this), ppvObject);
- } else {
- return DirectShowObject::getInterface(riid, ppvObject);
- }
+ if (ppv == nullptr)
+ return E_POINTER;
+ if (riid == IID_IUnknown)
+ *ppv = static_cast<IUnknown *>(this);
+ else if (riid == IID_IEnumMediaTypes)
+ *ppv = static_cast<IEnumMediaTypes *>(this);
+ else
+ return E_NOINTERFACE;
+ AddRef();
+ return S_OK;
}
HRESULT DirectShowMediaTypeEnum::Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched)
diff --git a/src/plugins/directshow/common/directshowmediatypeenum.h b/src/plugins/directshow/common/directshowmediatypeenum.h
index 9b058fc5b..e78e0a0f2 100644
--- a/src/plugins/directshow/common/directshowmediatypeenum.h
+++ b/src/plugins/directshow/common/directshowmediatypeenum.h
@@ -48,24 +48,21 @@ QT_BEGIN_NAMESPACE
class DirectShowPin;
class DirectShowMediaType;
-class DirectShowMediaTypeEnum : public DirectShowObject
- , public IEnumMediaTypes
+class DirectShowMediaTypeEnum : public IEnumMediaTypes
{
- DIRECTSHOW_OBJECT
-
+ COM_REF_MIXIN
public:
DirectShowMediaTypeEnum(DirectShowPin *pin);
DirectShowMediaTypeEnum(const QList<DirectShowMediaType> &types);
- ~DirectShowMediaTypeEnum();
+ virtual ~DirectShowMediaTypeEnum();
- // DirectShowObject
- HRESULT getInterface(REFIID riid, void **ppvObject);
+ STDMETHODIMP QueryInterface(REFIID riid, void **ppv) override;
// IEnumMediaTypes
- STDMETHODIMP Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched);
- STDMETHODIMP Skip(ULONG cMediaTypes);
- STDMETHODIMP Reset();
- STDMETHODIMP Clone(IEnumMediaTypes **ppEnum);
+ STDMETHODIMP Next(ULONG cMediaTypes, AM_MEDIA_TYPE **ppMediaTypes, ULONG *pcFetched) override;
+ STDMETHODIMP Skip(ULONG cMediaTypes) override;
+ STDMETHODIMP Reset() override;
+ STDMETHODIMP Clone(IEnumMediaTypes **ppEnum) override;
private:
Q_DISABLE_COPY(DirectShowMediaTypeEnum)
diff --git a/src/plugins/directshow/common/directshowobject.cpp b/src/plugins/directshow/common/directshowobject.cpp
deleted file mode 100644
index db1817a8d..000000000
--- a/src/plugins/directshow/common/directshowobject.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "directshowobject.h"
-
-QT_BEGIN_NAMESPACE
-
-DirectShowObject::DirectShowObject()
- : m_ref(1)
-{
-}
-
-DirectShowObject::~DirectShowObject()
-{
- Q_ASSERT(m_ref == 0);
-}
-
-HRESULT DirectShowObject::getInterface(const IID &riid, void **ppvObject)
-{
- Q_UNUSED(riid)
- *ppvObject = NULL;
- return E_NOINTERFACE;
-}
-
-ULONG DirectShowObject::ref()
-{
- return InterlockedIncrement(&m_ref);
-}
-
-ULONG DirectShowObject::unref()
-{
- ULONG ref = InterlockedDecrement(&m_ref);
- if (ref == 0)
- delete this;
-
- return ref;
-}
-
-HRESULT GetInterface(IUnknown *pUnk, void **ppv)
-{
- if (!ppv)
- return E_POINTER;
-
- *ppv = pUnk;
- pUnk->AddRef();
-
- return S_OK;
-}
-
-QT_END_NAMESPACE
diff --git a/src/plugins/directshow/common/directshowobject.h b/src/plugins/directshow/common/directshowobject.h
index cfac16f61..5a8c05a3e 100644
--- a/src/plugins/directshow/common/directshowobject.h
+++ b/src/plugins/directshow/common/directshowobject.h
@@ -44,38 +44,20 @@
QT_BEGIN_NAMESPACE
-class DirectShowObject
-{
-public:
- DirectShowObject();
- virtual ~DirectShowObject();
-
- virtual HRESULT getInterface(REFIID riid, void **ppvObject);
- ULONG ref();
- ULONG unref();
-
-private:
- Q_DISABLE_COPY(DirectShowObject)
-
- volatile LONG m_ref;
-};
-
-HRESULT GetInterface(IUnknown *pUnk, void **ppv);
-
-#define DIRECTSHOW_OBJECT \
-public: \
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv) { \
- if (riid == IID_IUnknown) \
- return GetInterface(reinterpret_cast<IUnknown*>(this), ppv); \
- else \
- return getInterface(riid, ppv); \
- }; \
- STDMETHODIMP_(ULONG) AddRef() { \
- return ref(); \
- }; \
- STDMETHODIMP_(ULONG) Release() { \
- return unref(); \
- };
+#define COM_REF_MIXIN \
+ volatile ULONG m_ref = 1; \
+public: \
+ STDMETHODIMP_(ULONG) AddRef() override \
+ { \
+ return InterlockedIncrement(&m_ref); \
+ } \
+ STDMETHODIMP_(ULONG) Release() override \
+ { \
+ const ULONG ref = InterlockedDecrement(&m_ref); \
+ if (ref == 0) \
+ delete this; \
+ return ref; \
+ }
QT_END_NAMESPACE
diff --git a/src/plugins/directshow/common/directshowpin.cpp b/src/plugins/directshow/common/directshowpin.cpp
index b49c3f8a4..65b54b8e9 100644
--- a/src/plugins/directshow/common/directshowpin.cpp
+++ b/src/plugins/directshow/common/directshowpin.cpp
@@ -61,16 +61,6 @@ DirectShowPin::~DirectShowPin()
}
-HRESULT DirectShowPin::getInterface(const IID &riid, void **ppvObject)
-{
- if (riid == IID_IPin)
- return GetInterface(static_cast<IPin*>(this), ppvObject);
- else
- return DirectShowObject::getInterface(riid, ppvObject);
-}
-
-
-
HRESULT DirectShowPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
{
if (!pReceivePin)
@@ -526,14 +516,6 @@ DirectShowInputPin::~DirectShowInputPin()
}
-HRESULT DirectShowInputPin::getInterface(const IID &riid, void **ppvObject)
-{
- if (riid == IID_IMemInputPin)
- return GetInterface(static_cast<IMemInputPin*>(this), ppvObject);
- else
- return DirectShowPin::getInterface(riid, ppvObject);
-}
-
HRESULT DirectShowInputPin::connectionEnded()
{
if (m_allocator) {
diff --git a/src/plugins/directshow/common/directshowpin.h b/src/plugins/directshow/common/directshowpin.h
index 97e808384..9598cf525 100644
--- a/src/plugins/directshow/common/directshowpin.h
+++ b/src/plugins/directshow/common/directshowpin.h
@@ -50,11 +50,8 @@ QT_BEGIN_NAMESPACE
class DirectShowBaseFilter;
-class DirectShowPin : public DirectShowObject
- , public IPin
+class DirectShowPin : public IPin
{
- DIRECTSHOW_OBJECT
-
public:
virtual ~DirectShowPin();
@@ -70,9 +67,6 @@ public:
virtual HRESULT setActive(bool active);
- // DirectShowObject
- HRESULT getInterface(REFIID riid, void **ppvObject);
-
// IPin
STDMETHODIMP Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt);
STDMETHODIMP ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt);
@@ -120,18 +114,16 @@ private:
class DirectShowOutputPin : public DirectShowPin
{
- DIRECTSHOW_OBJECT
-
public:
- virtual ~DirectShowOutputPin();
+ ~DirectShowOutputPin() override;
// DirectShowPin
- virtual HRESULT completeConnection(IPin *pin);
- virtual HRESULT connectionEnded();
- virtual HRESULT setActive(bool active);
+ HRESULT completeConnection(IPin *pin) override;
+ HRESULT connectionEnded() override;
+ HRESULT setActive(bool active) override;
// IPin
- STDMETHODIMP EndOfStream();
+ STDMETHODIMP EndOfStream() override;
protected:
DirectShowOutputPin(DirectShowBaseFilter *filter, const QString &name);
@@ -147,16 +139,11 @@ private:
class DirectShowInputPin : public DirectShowPin
, public IMemInputPin
{
- DIRECTSHOW_OBJECT
-
public:
virtual ~DirectShowInputPin();
const AM_SAMPLE2_PROPERTIES *currentSampleProperties() const { return &m_sampleProperties; }
- // DirectShowObject
- HRESULT getInterface(REFIID riid, void **ppvObject);
-
// DirectShowPin
HRESULT connectionEnded();
HRESULT setActive(bool active);
diff --git a/src/plugins/directshow/common/directshowpinenum.cpp b/src/plugins/directshow/common/directshowpinenum.cpp
index 910bba77d..e0ab58d19 100644
--- a/src/plugins/directshow/common/directshowpinenum.cpp
+++ b/src/plugins/directshow/common/directshowpinenum.cpp
@@ -71,13 +71,18 @@ DirectShowPinEnum::~DirectShowPinEnum()
m_filter->Release();
}
-HRESULT DirectShowPinEnum::getInterface(REFIID riid, void **ppvObject)
+HRESULT DirectShowPinEnum::QueryInterface(REFIID riid, void **ppv)
{
- if (riid == IID_IEnumPins) {
- return GetInterface(static_cast<IEnumPins *>(this), ppvObject);
- } else {
- return DirectShowObject::getInterface(riid, ppvObject);
- }
+ if (ppv == nullptr)
+ return E_POINTER;
+ if (riid == IID_IUnknown)
+ *ppv = static_cast<IUnknown *>(this);
+ else if (riid == IID_IEnumPins)
+ *ppv = static_cast<IEnumPins *>(this);
+ else
+ return E_NOINTERFACE;
+ AddRef();
+ return S_OK;
}
HRESULT DirectShowPinEnum::Next(ULONG cPins, IPin **ppPins, ULONG *pcFetched)
diff --git a/src/plugins/directshow/common/directshowpinenum.h b/src/plugins/directshow/common/directshowpinenum.h
index 77214e376..d89f140b1 100644
--- a/src/plugins/directshow/common/directshowpinenum.h
+++ b/src/plugins/directshow/common/directshowpinenum.h
@@ -49,24 +49,21 @@ QT_BEGIN_NAMESPACE
class DirectShowBaseFilter;
-class DirectShowPinEnum : public DirectShowObject
- , public IEnumPins
+class DirectShowPinEnum : public IEnumPins
{
- DIRECTSHOW_OBJECT
-
+ COM_REF_MIXIN
public:
DirectShowPinEnum(DirectShowBaseFilter *filter);
DirectShowPinEnum(const QList<IPin *> &pins);
- ~DirectShowPinEnum();
+ virtual ~DirectShowPinEnum();
- // DirectShowObject
- HRESULT getInterface(REFIID riid, void **ppvObject);
+ STDMETHODIMP QueryInterface(REFIID riid, void **ppv) override;
// IEnumPins
- STDMETHODIMP Next(ULONG cPins, IPin **ppPins, ULONG *pcFetched);
- STDMETHODIMP Skip(ULONG cPins);
- STDMETHODIMP Reset();
- STDMETHODIMP Clone(IEnumPins **ppEnum);
+ STDMETHODIMP Next(ULONG cPins, IPin **ppPins, ULONG *pcFetched) override;
+ STDMETHODIMP Skip(ULONG cPins) override;
+ STDMETHODIMP Reset() override;
+ STDMETHODIMP Clone(IEnumPins **ppEnum) override;
private:
Q_DISABLE_COPY(DirectShowPinEnum)
diff --git a/src/plugins/directshow/player/videosurfacefilter.cpp b/src/plugins/directshow/player/videosurfacefilter.cpp
index 656cd5a7c..c521a251b 100644
--- a/src/plugins/directshow/player/videosurfacefilter.cpp
+++ b/src/plugins/directshow/player/videosurfacefilter.cpp
@@ -59,28 +59,28 @@ DEFINE_GUID(CLSID_VideoSurfaceFilter,
class VideoSurfaceInputPin : public DirectShowInputPin
{
- DIRECTSHOW_OBJECT
-
+ COM_REF_MIXIN
public:
VideoSurfaceInputPin(VideoSurfaceFilter *filter);
- // DirectShowPin
+ STDMETHODIMP QueryInterface(REFIID riid, void **ppv) override;
+
bool isMediaTypeSupported(const AM_MEDIA_TYPE *type) override;
bool setMediaType(const AM_MEDIA_TYPE *type) override;
- HRESULT completeConnection(IPin *pin);
- HRESULT connectionEnded();
+ HRESULT completeConnection(IPin *pin) override;
+ HRESULT connectionEnded() override;
// IPin
- STDMETHODIMP ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt);
- STDMETHODIMP Disconnect();
- STDMETHODIMP EndOfStream();
- STDMETHODIMP BeginFlush();
- STDMETHODIMP EndFlush();
+ STDMETHODIMP ReceiveConnection(IPin *pConnector, const AM_MEDIA_TYPE *pmt) override;
+ STDMETHODIMP Disconnect() override;
+ STDMETHODIMP EndOfStream() override;
+ STDMETHODIMP BeginFlush() override;
+ STDMETHODIMP EndFlush() override;
// IMemInputPin
- STDMETHODIMP GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps);
- STDMETHODIMP Receive(IMediaSample *pMediaSample);
+ STDMETHODIMP GetAllocatorRequirements(ALLOCATOR_PROPERTIES *pProps) override;
+ STDMETHODIMP Receive(IMediaSample *pMediaSample) override;
private:
VideoSurfaceFilter *m_videoSurfaceFilter;
@@ -92,6 +92,22 @@ VideoSurfaceInputPin::VideoSurfaceInputPin(VideoSurfaceFilter *filter)
{
}
+HRESULT VideoSurfaceInputPin::QueryInterface(REFIID riid, void **ppv)
+{
+ if (ppv == nullptr)
+ return E_POINTER;
+ if (riid == IID_IUnknown)
+ *ppv = static_cast<IUnknown *>(static_cast<DirectShowPin *>(this));
+ else if (riid == IID_IPin)
+ *ppv = static_cast<IPin *>(this);
+ else if (riid == IID_IMemInputPin)
+ *ppv =static_cast<IMemInputPin*>(this);
+ else
+ return E_NOINTERFACE;
+ AddRef();
+ return S_OK;
+}
+
bool VideoSurfaceInputPin::isMediaTypeSupported(const AM_MEDIA_TYPE *type)
{
return m_videoSurfaceFilter->isMediaTypeSupported(type);
@@ -237,12 +253,20 @@ VideoSurfaceFilter::~VideoSurfaceFilter()
CloseHandle(m_renderEvent);
}
-HRESULT VideoSurfaceFilter::getInterface(const IID &riid, void **ppvObject)
+HRESULT VideoSurfaceFilter::QueryInterface(REFIID riid, void **ppv)
{
- if (riid == IID_IAMFilterMiscFlags)
- return GetInterface(static_cast<IAMFilterMiscFlags*>(this), ppvObject);
+ if (ppv == nullptr)
+ return E_POINTER;
+ if (riid == IID_IUnknown)
+ *ppv = static_cast<IUnknown *>(static_cast<DirectShowBaseFilter *>(this));
+ else if (riid == IID_IPersist || riid == IID_IMediaFilter || riid == IID_IBaseFilter)
+ *ppv = static_cast<IBaseFilter *>(this);
+ else if (riid == IID_IAMFilterMiscFlags)
+ *ppv = static_cast<IAMFilterMiscFlags *>(this);
else
- return DirectShowBaseFilter::getInterface(riid, ppvObject);
+ return E_NOINTERFACE;
+ AddRef();
+ return S_OK;
}
QList<DirectShowPin *> VideoSurfaceFilter::pins()
diff --git a/src/plugins/directshow/player/videosurfacefilter.h b/src/plugins/directshow/player/videosurfacefilter.h
index ad253d564..56791f270 100644
--- a/src/plugins/directshow/player/videosurfacefilter.h
+++ b/src/plugins/directshow/player/videosurfacefilter.h
@@ -60,27 +60,26 @@ class VideoSurfaceFilter : public QObject
, public IAMFilterMiscFlags
{
Q_OBJECT
- DIRECTSHOW_OBJECT
+ COM_REF_MIXIN
public:
VideoSurfaceFilter(QAbstractVideoSurface *surface, DirectShowEventLoop *loop, QObject *parent = 0);
~VideoSurfaceFilter();
- // DirectShowObject
- HRESULT getInterface(REFIID riid, void **ppvObject);
+ STDMETHODIMP QueryInterface(REFIID riid, void **ppv) override;
// DirectShowBaseFilter
- QList<DirectShowPin *> pins();
+ QList<DirectShowPin *> pins() override;
// IPersist
- STDMETHODIMP GetClassID(CLSID *pClassID);
+ STDMETHODIMP GetClassID(CLSID *pClassID) override;
// IMediaFilter
- STDMETHODIMP Run(REFERENCE_TIME tStart);
- STDMETHODIMP Pause();
- STDMETHODIMP Stop();
+ STDMETHODIMP Run(REFERENCE_TIME tStart) override;
+ STDMETHODIMP Pause() override;
+ STDMETHODIMP Stop() override;
// IAMFilterMiscFlags
- STDMETHODIMP_(ULONG) GetMiscFlags();
+ STDMETHODIMP_(ULONG) GetMiscFlags() override;
// DirectShowPin (delegate)
bool isMediaTypeSupported(const AM_MEDIA_TYPE *type);
@@ -109,7 +108,7 @@ private:
RenderSample = QEvent::User + 4
};
- bool event(QEvent *);
+ bool event(QEvent *) override;
bool startSurface();
void stopSurface();
diff --git a/src/plugins/winrt/qwinrtcameracontrol.cpp b/src/plugins/winrt/qwinrtcameracontrol.cpp
index 0086e92e9..99d754289 100644
--- a/src/plugins/winrt/qwinrtcameracontrol.cpp
+++ b/src/plugins/winrt/qwinrtcameracontrol.cpp
@@ -952,8 +952,7 @@ HRESULT QWinRTCameraControl::initialize()
}
const QCamera::Position position = d->videoDeviceSelector->cameraPosition(deviceName);
- d->videoRenderer->setScanLineDirection(position == QCamera::BackFace ? QVideoSurfaceFormat::TopToBottom
- : QVideoSurfaceFormat::BottomToTop);
+ d->videoRenderer->setScanLineDirection(QVideoSurfaceFormat::TopToBottom);
ComPtr<IMediaCaptureInitializationSettings> settings;
hr = RoActivateInstance(HString::MakeReference(RuntimeClass_Windows_Media_Capture_MediaCaptureInitializationSettings).Get(),
&settings);
diff --git a/src/plugins/winrt/qwinrtcameraimagecapturecontrol.cpp b/src/plugins/winrt/qwinrtcameraimagecapturecontrol.cpp
index 54f4b103b..f4903c5a1 100644
--- a/src/plugins/winrt/qwinrtcameraimagecapturecontrol.cpp
+++ b/src/plugins/winrt/qwinrtcameraimagecapturecontrol.cpp
@@ -106,6 +106,12 @@ struct CaptureRequest
ComPtr<IAsyncAction> op;
};
+// Do not use CoTaskMemFree directly for image cleanup as it leads to crashes in release
+static void freeImageData(void *data)
+{
+ CoTaskMemFree(data);
+}
+
class QWinRTCameraImageCaptureControlPrivate
{
public:
@@ -296,7 +302,7 @@ HRESULT QWinRTCameraImageCaptureControl::onCaptureCompleted(IAsyncAction *asyncI
hr = frame->get_PixelWidth(&pixelWidth);
Q_ASSERT_SUCCEEDED(hr);
const QImage image(pixelData, pixelWidth, pixelHeight, QImage::Format_RGBA8888,
- reinterpret_cast<QImageCleanupFunction>(&CoTaskMemFree), pixelData);
+ reinterpret_cast<QImageCleanupFunction>(&freeImageData), pixelData);
emit imageCaptured(request.id, image);
QWinRTImageEncoderControl *imageEncoderControl = static_cast<QWinRTImageEncoderControl*>(d->cameraControl->imageEncoderControl());
diff --git a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp
index 0a5ae46fa..03d107ae8 100644
--- a/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp
+++ b/src/plugins/winrt/qwinrtcameravideorenderercontrol.cpp
@@ -46,6 +46,7 @@
#include <QVideoFrame>
#include <d3d11.h>
+#include <D3D11_1.h>
#include <mfapi.h>
#include <wrl.h>
@@ -183,15 +184,18 @@ public:
RETURN_VOID_IF_FAILED("Failed to create video output view");
}
- ComPtr<IDXGIResource> sourceResource;
+ ComPtr<IDXGIResource1> sourceResource;
hr = texture->QueryInterface(IID_PPV_ARGS(&sourceResource));
- Q_ASSERT_SUCCEEDED(hr);
- HANDLE sharedHandle;
- hr = sourceResource->GetSharedHandle(&sharedHandle);
- Q_ASSERT_SUCCEEDED(hr);
+ RETURN_VOID_IF_FAILED("Failed to query interface IDXGIResource1");
+ HANDLE sharedHandle = NULL;
+ hr = sourceResource->CreateSharedHandle(NULL, DXGI_SHARED_RESOURCE_READ, NULL, &sharedHandle);
+ RETURN_VOID_IF_FAILED("Failed to create shared handle");
+ ComPtr<ID3D11Device1> dev;
+ hr = m_d3dDevice.As(&dev);
+ RETURN_VOID_IF_FAILED("Failed to cast from ID3D11Device to ID3D11Device1");
ComPtr<ID3D11Texture2D> sharedTexture;
- hr = m_d3dDevice->OpenSharedResource(sharedHandle, IID_PPV_ARGS(&sharedTexture));
- Q_ASSERT_SUCCEEDED(hr);
+ hr = dev->OpenSharedResource1(sharedHandle, IID_PPV_ARGS(&sharedTexture));
+ RETURN_VOID_IF_FAILED("Failed to open shared resource");
D3D11_VIDEO_PROCESSOR_INPUT_VIEW_DESC inputViewDesc = {
0, D3D11_VPIV_DIMENSION_TEXTURE2D, { 0, 0 }
@@ -199,6 +203,7 @@ public:
ComPtr<ID3D11VideoProcessorInputView> inputView;
hr = m_videoDevice->CreateVideoProcessorInputView(
sharedTexture.Get(), m_videoEnumerator.Get(), &inputViewDesc, &inputView);
+ CloseHandle(sharedHandle);
RETURN_VOID_IF_FAILED("Failed to create video input view");
ComPtr<ID3D11DeviceContext> context;
diff --git a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp
index de6b3418e..fae8e6bf0 100644
--- a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp
+++ b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp
@@ -423,7 +423,7 @@ public:
HRESULT hr;
hr = MFCreateAsyncResult(readResult.Get(), callback, state, &asyncResult);
RETURN_HR_IF_FAILED("Failed to create read callback result");
- QMetaObject::invokeMethod(q, "finishRead", Qt::QueuedConnection);
+ finishRead();
return S_OK;
}
@@ -906,10 +906,4 @@ QVideoRendererControl *QWinRTMediaPlayerControl::videoRendererControl()
return d->videoRenderer;
}
-void QWinRTMediaPlayerControl::finishRead()
-{
- Q_D(QWinRTMediaPlayerControl);
- d->streamProvider->finishRead();
-}
-
QT_END_NAMESPACE
diff --git a/src/plugins/winrt/qwinrtmediaplayercontrol.h b/src/plugins/winrt/qwinrtmediaplayercontrol.h
index 1e854f5bb..174ba664b 100644
--- a/src/plugins/winrt/qwinrtmediaplayercontrol.h
+++ b/src/plugins/winrt/qwinrtmediaplayercontrol.h
@@ -93,8 +93,6 @@ public:
QVideoRendererControl *videoRendererControl();
private:
- Q_INVOKABLE void finishRead();
-
QScopedPointer<QWinRTMediaPlayerControlPrivate, QWinRTMediaPlayerControlPrivate> d_ptr;
Q_DECLARE_PRIVATE(QWinRTMediaPlayerControl)
};
diff --git a/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp b/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp
index 41d4693cb..1095cd92f 100644
--- a/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp
+++ b/src/plugins/winrt/qwinrtvideodeviceselectorcontrol.cpp
@@ -251,6 +251,22 @@ private:
};
Q_GLOBAL_STATIC(QWinRTVideoDeviceSelectorControlGlobal, g)
+static ComPtr<IEnclosureLocation> enclosureLocation(const QString &deviceName)
+{
+ ComPtr<IEnclosureLocation> enclosureLocation;
+ int deviceIndex = g->deviceIndex.value(deviceName);
+ IDeviceInformation *deviceInfo = g->devices.value(deviceIndex).Get();
+ if (!deviceInfo)
+ return enclosureLocation;
+
+ HRESULT hr;
+ hr = deviceInfo->get_EnclosureLocation(&enclosureLocation);
+ if (FAILED(hr))
+ qErrnoWarning(hr, "Failed to get camera enclosure location");
+
+ return enclosureLocation;
+}
+
class QWinRTVideoDeviceSelectorControlPrivate
{
public:
@@ -307,20 +323,13 @@ int QWinRTVideoDeviceSelectorControl::selectedDevice() const
QCamera::Position QWinRTVideoDeviceSelectorControl::cameraPosition(const QString &deviceName)
{
- int deviceIndex = g->deviceIndex.value(deviceName);
- IDeviceInformation *deviceInfo = g->devices.value(deviceIndex).Get();
- if (!deviceInfo)
+ ComPtr<IEnclosureLocation> enclosure = enclosureLocation(deviceName);
+ if (!enclosure)
return QCamera::UnspecifiedPosition;
- ComPtr<IEnclosureLocation> enclosureLocation;
HRESULT hr;
- hr = deviceInfo->get_EnclosureLocation(&enclosureLocation);
- RETURN_IF_FAILED("Failed to get camera enclosure location", return QCamera::UnspecifiedPosition);
- if (!enclosureLocation)
- return QCamera::UnspecifiedPosition;
-
Panel panel;
- hr = enclosureLocation->get_Panel(&panel);
+ hr = enclosure->get_Panel(&panel);
RETURN_IF_FAILED("Failed to get camera panel location", return QCamera::UnspecifiedPosition);
switch (panel) {
@@ -336,18 +345,18 @@ QCamera::Position QWinRTVideoDeviceSelectorControl::cameraPosition(const QString
int QWinRTVideoDeviceSelectorControl::cameraOrientation(const QString &deviceName)
{
-#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP)
- switch (cameraPosition(deviceName)) {
- case QCamera::FrontFace:
- case QCamera::BackFace:
- return 270;
- default:
- break;
- }
-#else
- Q_UNUSED(deviceName);
-#endif
- return 0;
+ ComPtr<IEnclosureLocation> enclosure = enclosureLocation(deviceName);
+ if (!enclosure)
+ return 0;
+
+ HRESULT hr;
+ ComPtr<IEnclosureLocation2> enclosure2;
+ hr = enclosure.As(&enclosure2);
+ RETURN_IF_FAILED("Failed to cast camera enclosure location", return 0);
+ quint32 rotation;
+ hr = enclosure2->get_RotationAngleInDegreesClockwise(&rotation);
+ RETURN_IF_FAILED("Failed to get camera rotation angle", return 0);
+ return rotation;
}
QList<QByteArray> QWinRTVideoDeviceSelectorControl::deviceNames()