summaryrefslogtreecommitdiffstats
path: root/src/plugins/directshow/player
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 /src/plugins/directshow/player
parent6a2f332821ea3d8d4f6c11050d592aef0ad4df7f (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.cpp38
-rw-r--r--src/plugins/directshow/player/videosurfacefilter.h5
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();