From 20e93ad5969d3dff85f0ef9e16830aee337ca075 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 13 Apr 2018 13:19:35 +0200 Subject: 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(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 Reviewed-by: Oliver Wolff --- src/plugins/directshow/common/common.pri | 1 - .../directshow/common/directshowbasefilter.cpp | 11 --- .../directshow/common/directshowbasefilter.h | 8 +- .../directshow/common/directshowmediatypeenum.cpp | 17 +++-- .../directshow/common/directshowmediatypeenum.h | 11 +-- src/plugins/directshow/common/directshowobject.cpp | 86 ---------------------- src/plugins/directshow/common/directshowobject.h | 46 ++++-------- src/plugins/directshow/common/directshowpin.cpp | 18 ----- src/plugins/directshow/common/directshowpin.h | 15 +--- .../directshow/common/directshowpinenum.cpp | 17 +++-- src/plugins/directshow/common/directshowpinenum.h | 11 +-- .../directshow/player/videosurfacefilter.cpp | 38 ++++++++-- src/plugins/directshow/player/videosurfacefilter.h | 5 +- 13 files changed, 79 insertions(+), 205 deletions(-) delete mode 100644 src/plugins/directshow/common/directshowobject.cpp (limited to 'src/plugins/directshow') 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(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 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(this), ppvObject); - } else { - return DirectShowObject::getInterface(riid, ppvObject); - } + if (ppv == nullptr) + return E_POINTER; + if (riid == IID_IUnknown) + *ppv = static_cast(this); + else if (riid == IID_IEnumMediaTypes) + *ppv = static_cast(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 &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(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(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(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(this), ppvObject); - } else { - return DirectShowObject::getInterface(riid, ppvObject); - } + if (ppv == nullptr) + return E_POINTER; + if (riid == IID_IUnknown) + *ppv = static_cast(this); + else if (riid == IID_IEnumPins) + *ppv = static_cast(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 &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(static_cast(this)); + else if (riid == IID_IPin) + *ppv = static_cast(this); + else if (riid == IID_IMemInputPin) + *ppv =static_cast(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(this), ppvObject); + if (ppv == nullptr) + return E_POINTER; + if (riid == IID_IUnknown) + *ppv = static_cast(static_cast(this)); + else if (riid == IID_IPersist || riid == IID_IMediaFilter || riid == IID_IBaseFilter) + *ppv = static_cast(this); + else if (riid == IID_IAMFilterMiscFlags) + *ppv = static_cast(this); else - return DirectShowBaseFilter::getInterface(riid, ppvObject); + return E_NOINTERFACE; + AddRef(); + return S_OK; } QList 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 pins(); -- cgit v1.2.3