Alessandro Pignotti : strmbase: Remove code duplicated by every user of ISeekingPassThruImpl.

Alexandre Julliard julliard at winehq.org
Tue Mar 5 12:59:17 CST 2013


Module: wine
Branch: master
Commit: f53fa4f05b7c62ec3cb98f8ff855da93b34f389b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f53fa4f05b7c62ec3cb98f8ff855da93b34f389b

Author: Alessandro Pignotti <a.pignotti at sssup.it>
Date:   Mon Mar  4 12:21:19 2013 +0100

strmbase: Remove code duplicated by every user of ISeekingPassThruImpl.

---

 dlls/quartz/acmwrapper.c         |   26 +-------------------------
 dlls/quartz/avidec.c             |   25 +------------------------
 dlls/strmbase/transform.c        |   20 ++++++++++++++++++++
 dlls/winegstreamer/gsttffilter.c |   25 +------------------------
 dlls/wineqtdecoder/qtvdecoder.c  |   25 +------------------------
 include/wine/strmbase.h          |    2 ++
 6 files changed, 26 insertions(+), 97 deletions(-)

diff --git a/dlls/quartz/acmwrapper.c b/dlls/quartz/acmwrapper.c
index f98362c..cd0b0d8 100644
--- a/dlls/quartz/acmwrapper.c
+++ b/dlls/quartz/acmwrapper.c
@@ -42,7 +42,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(quartz);
 typedef struct ACMWrapperImpl
 {
     TransformFilter tf;
-    IUnknown *seekthru_unk;
 
     HACMSTREAM has;
     LPWAVEFORMATEX pWfIn;
@@ -399,14 +398,6 @@ HRESULT ACMWrapper_create(IUnknown * pUnkOuter, LPVOID * ppv)
 
     if (FAILED(hr))
         return hr;
-    else
-    {
-        ISeekingPassThru *passthru;
-        hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown*)This, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&This->seekthru_unk);
-        IUnknown_QueryInterface(This->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru);
-        ISeekingPassThru_Init(passthru, FALSE, This->tf.ppPins[0]);
-        ISeekingPassThru_Release(passthru);
-    }
 
     *ppv = This;
     This->lasttime_real = This->lasttime_sent = -1;
@@ -414,24 +405,9 @@ HRESULT ACMWrapper_create(IUnknown * pUnkOuter, LPVOID * ppv)
     return hr;
 }
 
-static HRESULT WINAPI ACMWrapper_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv)
-{
-    HRESULT hr;
-    ACMWrapperImpl *This = impl_from_IBaseFilter(iface);
-    TRACE("(%p/%p)->(%s, %p)\n", This, iface, qzdebugstr_guid(riid), ppv);
-
-    if (IsEqualIID(riid, &IID_IMediaSeeking))
-        return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv);
-
-    hr = TransformFilterImpl_QueryInterface(iface, riid, ppv);
-
-    return hr;
-}
-
-
 static const IBaseFilterVtbl ACMWrapper_Vtbl =
 {
-    ACMWrapper_QueryInterface,
+    TransformFilterImpl_QueryInterface,
     BaseFilterImpl_AddRef,
     TransformFilterImpl_Release,
     BaseFilterImpl_GetClassID,
diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c
index 5537db9..30da6fa 100644
--- a/dlls/quartz/avidec.c
+++ b/dlls/quartz/avidec.c
@@ -43,7 +43,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(quartz);
 typedef struct AVIDecImpl
 {
     TransformFilter tf;
-    IUnknown *seekthru_unk;
 
     HIC hvid;
     BITMAPINFOHEADER* pBihIn;
@@ -417,14 +416,6 @@ HRESULT AVIDec_create(IUnknown * pUnkOuter, LPVOID * ppv)
 
     if (FAILED(hr))
         return hr;
-    else
-    {
-        ISeekingPassThru *passthru;
-        hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown*)This, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&This->seekthru_unk);
-        IUnknown_QueryInterface(This->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru);
-        ISeekingPassThru_Init(passthru, FALSE, This->tf.ppPins[0]);
-        ISeekingPassThru_Release(passthru);
-    }
 
     This->hvid = NULL;
     This->pBihIn = NULL;
@@ -435,23 +426,9 @@ HRESULT AVIDec_create(IUnknown * pUnkOuter, LPVOID * ppv)
     return hr;
 }
 
-static HRESULT WINAPI AVIDec_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv)
-{
-    HRESULT hr;
-    AVIDecImpl *This = impl_from_IBaseFilter(iface);
-    TRACE("(%p/%p)->(%s, %p)\n", This, iface, qzdebugstr_guid(riid), ppv);
-
-    if (IsEqualIID(riid, &IID_IMediaSeeking))
-        return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv);
-
-    hr = TransformFilterImpl_QueryInterface(iface, riid, ppv);
-
-    return hr;
-}
-
 static const IBaseFilterVtbl AVIDec_Vtbl =
 {
-    AVIDec_QueryInterface,
+    TransformFilterImpl_QueryInterface,
     BaseFilterImpl_AddRef,
     TransformFilterImpl_Release,
     BaseFilterImpl_GetClassID,
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index f970527..0e014b0 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -238,6 +238,20 @@ static HRESULT TransformFilter_Init(const IBaseFilterVtbl *pVtbl, const CLSID* p
             pTransformFilter->qcimpl->IQualityControl_iface.lpVtbl = &TransformFilter_QualityControl_Vtbl;
         }
     }
+
+    if (SUCCEEDED(hr))
+    {
+        ISeekingPassThru *passthru;
+        pTransformFilter->seekthru_unk = NULL;
+        hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown*)pTransformFilter, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&pTransformFilter->seekthru_unk);
+        if (SUCCEEDED(hr))
+        {
+            IUnknown_QueryInterface(pTransformFilter->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru);
+            ISeekingPassThru_Init(passthru, FALSE, pTransformFilter->ppPins[0]);
+            ISeekingPassThru_Release(passthru);
+        }
+    }
+
     if (FAILED(hr))
     {
         CoTaskMemFree(pTransformFilter->ppPins);
@@ -283,6 +297,11 @@ HRESULT WINAPI TransformFilterImpl_QueryInterface(IBaseFilter * iface, REFIID ri
         IUnknown_AddRef((IUnknown*)*ppv);
         return S_OK;
     }
+    else if (IsEqualIID(riid, &IID_IMediaSeeking) ||
+             IsEqualIID(riid, &IID_IMediaPosition))
+    {
+        return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv);
+    }
     hr = BaseFilterImpl_QueryInterface(iface, riid, ppv);
 
     if (FAILED(hr) && !IsEqualIID(riid, &IID_IPin) && !IsEqualIID(riid, &IID_IVideoWindow) &&
@@ -325,6 +344,7 @@ ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface)
         FreeMediaType(&This->pmt);
         QualityControlImpl_Destroy(This->qcimpl);
         CoTaskMemFree(This);
+        IUnknown_Release(This->seekthru_unk);
 
         return 0;
     }
diff --git a/dlls/winegstreamer/gsttffilter.c b/dlls/winegstreamer/gsttffilter.c
index 4222008..575d6e3 100644
--- a/dlls/winegstreamer/gsttffilter.c
+++ b/dlls/winegstreamer/gsttffilter.c
@@ -115,7 +115,6 @@ static const char *Gstreamer_FindMatch(const char *strcaps)
 
 typedef struct GstTfImpl {
     TransformFilter tf;
-    IUnknown *seekthru_unk;
     const char *gstreamer_name;
     GstElement *filter;
     GstPad *my_src, *my_sink, *their_src, *their_sink;
@@ -450,14 +449,6 @@ static HRESULT Gstreamer_transform_create(IUnknown *punkout, const CLSID *clsid,
 
     if (FAILED(TransformFilter_Construct(&GSTTf_Vtbl, sizeof(GstTfImpl), clsid, vtbl, (IBaseFilter**)&This)))
         return E_OUTOFMEMORY;
-    else
-    {
-        ISeekingPassThru *passthru;
-        CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown*)This, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&This->seekthru_unk);
-        IUnknown_QueryInterface(This->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru);
-        ISeekingPassThru_Init(passthru, FALSE, (IPin*)This->tf.ppPins[0]);
-        ISeekingPassThru_Release(passthru);
-    }
 
     This->gstreamer_name = name;
     *obj = This;
@@ -830,23 +821,9 @@ IUnknown * CALLBACK Gstreamer_AudioConvert_create(IUnknown *punkout, HRESULT *ph
     return obj;
 }
 
-static HRESULT WINAPI GSTTf_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv)
-{
-    HRESULT hr;
-    GstTfImpl *This = (GstTfImpl*)iface;
-    TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppv);
-
-    if (IsEqualIID(riid, &IID_IMediaSeeking) || IsEqualIID(riid, &IID_IMediaPosition))
-        return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv);
-
-    hr = TransformFilterImpl_QueryInterface(iface, riid, ppv);
-
-    return hr;
-}
-
 static const IBaseFilterVtbl GSTTf_Vtbl =
 {
-    GSTTf_QueryInterface,
+    TransformFilterImpl_QueryInterface,
     BaseFilterImpl_AddRef,
     TransformFilterImpl_Release,
     BaseFilterImpl_GetClassID,
diff --git a/dlls/wineqtdecoder/qtvdecoder.c b/dlls/wineqtdecoder/qtvdecoder.c
index 3dfece8..6e2ceb1 100644
--- a/dlls/wineqtdecoder/qtvdecoder.c
+++ b/dlls/wineqtdecoder/qtvdecoder.c
@@ -136,7 +136,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(qtdecoder);
 typedef struct QTVDecoderImpl
 {
     TransformFilter tf;
-    IUnknown *seekthru_unk;
 
     ImageDescriptionHandle hImageDescription;
     CFMutableDictionaryRef outputBufferAttributes;
@@ -545,36 +544,14 @@ IUnknown * CALLBACK QTVDecoder_create(IUnknown * pUnkOuter, HRESULT* phr)
         *phr = hr;
         return NULL;
     }
-    else
-    {
-        ISeekingPassThru *passthru;
-        hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown*)This, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&This->seekthru_unk);
-        IUnknown_QueryInterface(This->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru);
-        ISeekingPassThru_Init(passthru, FALSE, This->tf.ppPins[0]);
-        ISeekingPassThru_Release(passthru);
-    }
 
     *phr = hr;
     return (IUnknown*)This;
 }
 
-HRESULT WINAPI QTVDecoder_QueryInterface(IBaseFilter * iface, REFIID riid, LPVOID * ppv)
-{
-    HRESULT hr;
-    QTVDecoderImpl *This = impl_from_IBaseFilter(iface);
-    TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppv);
-
-    if (IsEqualIID(riid, &IID_IMediaSeeking) || IsEqualIID(riid, &IID_IMediaPosition))
-        return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv);
-
-    hr = TransformFilterImpl_QueryInterface(iface, riid, ppv);
-
-    return hr;
-}
-
 static const IBaseFilterVtbl QTVDecoder_Vtbl =
 {
-    QTVDecoder_QueryInterface,
+    TransformFilterImpl_QueryInterface,
     BaseFilterImpl_AddRef,
     TransformFilterImpl_Release,
     BaseFilterImpl_GetClassID,
diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h
index cbb7d23..ecb53c4 100644
--- a/include/wine/strmbase.h
+++ b/include/wine/strmbase.h
@@ -207,6 +207,8 @@ typedef struct TransformFilter
 
 	const struct TransformFilterFuncTable * pFuncsTable;
 	struct QualityControlImpl *qcimpl;
+        /* IMediaSeeking and IMediaPosition are implemented by ISeekingPassThru */
+        IUnknown *seekthru_unk;
 } TransformFilter;
 
 typedef HRESULT (WINAPI *TransformFilter_DecideBufferSize) (TransformFilter *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest);




More information about the wine-cvs mailing list