summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2018-04-13 13:19:35 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2018-04-24 13:30:36 +0000
commit20e93ad5969d3dff85f0ef9e16830aee337ca075 (patch)
treef28235f63ba8a0857f9cf1e890784a104ac3e2d4
parent6a2f332821ea3d8d4f6c11050d592aef0ad4df7f (diff)
downloadqtmultimedia-20e93ad5969d3dff85f0ef9e16830aee337ca075.tar.gz
Fix DirectShow COM class hierarchy
Remove the class DirectShowObject. Move the ref counting code to a macro COM_REF_MIXIN that is used for the classes that are actually instantiated. Fix warnings: common/directshowpin.h(56,5): warning: 'reinterpret_cast' from class 'DirectShowPin *' to its base at non-zero offset 'IUnknown *' behaves differently from 'static_cast' [-Wreinterpret-base-class] DIRECTSHOW_OBJECT ^~~~~~~~~~~~~~~~~ common/directshowobject.h(69,33): note: expanded from macro 'DIRECTSHOW_OBJECT' return GetInterface(reinterpret_cast<IUnknown*>(this), ppv); \ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ common/directshowpin.h(56,5): note: use 'static_cast' to adjust the pointer correctly while upcasting Task-number: QTBUG-63512 Task-number: QTBUG-64157 Change-Id: Ibef143d675cd169b78fe46ff5a0c83f6e3434487 Reviewed-by: VaL Doroshchuk <valentyn.doroshchuk@qt.io> Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
-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.h8
-rw-r--r--src/plugins/directshow/common/directshowmediatypeenum.cpp17
-rw-r--r--src/plugins/directshow/common/directshowmediatypeenum.h11
-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.h15
-rw-r--r--src/plugins/directshow/common/directshowpinenum.cpp17
-rw-r--r--src/plugins/directshow/common/directshowpinenum.h11
-rw-r--r--src/plugins/directshow/player/videosurfacefilter.cpp38
-rw-r--r--src/plugins/directshow/player/videosurfacefilter.h5
13 files changed, 79 insertions, 205 deletions
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..47a390d26 100644
--- a/src/plugins/directshow/common/directshowbasefilter.h
+++ b/src/plugins/directshow/common/directshowbasefilter.h
@@ -44,11 +44,8 @@
QT_BEGIN_NAMESPACE
-class DirectShowBaseFilter : public DirectShowObject
- , public IBaseFilter
+class DirectShowBaseFilter : public IBaseFilter
{
- DIRECTSHOW_OBJECT
-
public:
DirectShowBaseFilter();
virtual ~DirectShowBaseFilter();
@@ -58,9 +55,6 @@ public:
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..ee2568338 100644
--- a/src/plugins/directshow/common/directshowmediatypeenum.h
+++ b/src/plugins/directshow/common/directshowmediatypeenum.h
@@ -48,18 +48,15 @@ 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);
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..ee2cbc58d 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,8 +114,6 @@ private:
class DirectShowOutputPin : public DirectShowPin
{
- DIRECTSHOW_OBJECT
-
public:
virtual ~DirectShowOutputPin();
@@ -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..e1baa00c2 100644
--- a/src/plugins/directshow/common/directshowpinenum.h
+++ b/src/plugins/directshow/common/directshowpinenum.h
@@ -49,18 +49,15 @@ 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);
diff --git a/src/plugins/directshow/player/videosurfacefilter.cpp b/src/plugins/directshow/player/videosurfacefilter.cpp
index 656cd5a7c..0b1c97a74 100644
--- a/src/plugins/directshow/player/videosurfacefilter.cpp
+++ b/src/plugins/directshow/player/videosurfacefilter.cpp
@@ -59,12 +59,12 @@ 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;
@@ -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..43f8cc534 100644
--- a/src/plugins/directshow/player/videosurfacefilter.h
+++ b/src/plugins/directshow/player/videosurfacefilter.h
@@ -60,13 +60,12 @@ 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();