diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-04-13 13:19:35 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2018-04-24 13:30:36 +0000 |
commit | 20e93ad5969d3dff85f0ef9e16830aee337ca075 (patch) | |
tree | f28235f63ba8a0857f9cf1e890784a104ac3e2d4 /src/plugins/directshow/player | |
parent | 6a2f332821ea3d8d4f6c11050d592aef0ad4df7f (diff) |
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>
Diffstat (limited to 'src/plugins/directshow/player')
-rw-r--r-- | src/plugins/directshow/player/videosurfacefilter.cpp | 38 | ||||
-rw-r--r-- | src/plugins/directshow/player/videosurfacefilter.h | 5 |
2 files changed, 33 insertions, 10 deletions
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(); |