From 0e2747ad1787ba78fdc94a68dd62cbefca5a8f1a Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 13 Apr 2018 13:19:35 +0200 Subject: [PATCH 1/2] Fix DirectShow COM class hierarchy 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: I14516fbbd4899572ea9a4d43d543da6b1db3daed --- .../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 | 42 ---------------------- src/plugins/directshow/common/directshowobject.h | 42 ++++++---------------- 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 ++- 12 files changed, 76 insertions(+), 159 deletions(-) diff --git a/src/plugins/directshow/common/directshowbasefilter.cpp b/src/plugins/directshow/common/directshowbasefilter.cpp index 342f0c27..1e45eea5 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 9a2f4456..47a390d2 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 8fbdf7de..a6afcd5f 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 9b058fc5..057ea442 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); // 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 index db1817a8..b4d4d2ca 100644 --- a/src/plugins/directshow/common/directshowobject.cpp +++ b/src/plugins/directshow/common/directshowobject.cpp @@ -41,46 +41,4 @@ 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 cfac16f6..aec62729 100644 --- a/src/plugins/directshow/common/directshowobject.h +++ b/src/plugins/directshow/common/directshowobject.h @@ -44,38 +44,18 @@ 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 \ +#define COM_REF_MIXIN \ + volatile ULONG m_ref = 1; \ 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(); \ - }; + 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 b49c3f8a..65b54b8e 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 97e80838..ee2cbc58 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 910bba77..e0ab58d1 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 77214e37..6d2f7b04 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); + HRESULT QueryInterface(REFIID riid, void **ppv); // 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 656cd5a7..695cf569 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); + 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 ad253d56..b5043a4a 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); // DirectShowBaseFilter QList pins(); -- 2.13.2.windows.1