qedit: Use the generic BaseFilter implementation in SampleGrabber.

Michael Stefaniuc mstefani at redhat.de
Wed Feb 19 17:13:09 CST 2014


---
 dlls/qedit/Makefile.in     |   2 +-
 dlls/qedit/samplegrabber.c | 157 +++++++++++----------------------------------
 2 files changed, 39 insertions(+), 120 deletions(-)

diff --git a/dlls/qedit/Makefile.in b/dlls/qedit/Makefile.in
index 973bd50..19a9511 100644
--- a/dlls/qedit/Makefile.in
+++ b/dlls/qedit/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = qedit.dll
-IMPORTS   = strmiids uuid oleaut32 ole32 advapi32
+IMPORTS   = strmiids strmbase uuid oleaut32 ole32 advapi32
 
 C_SRCS = \
 	main.c \
diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c
index de3d797..81eb9ec 100644
--- a/dlls/qedit/samplegrabber.c
+++ b/dlls/qedit/samplegrabber.c
@@ -29,6 +29,7 @@
 
 #include "qedit_private.h"
 #include "wine/debug.h"
+#include "wine/strmbase.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(qedit);
 
@@ -368,21 +369,16 @@ static inline SG_Pin *impl_from_IPin(IPin *iface)
 /* Sample Grabber filter implementation */
 typedef struct _SG_Impl {
     IUnknown IUnknown_inner;
-    IBaseFilter IBaseFilter_iface;
+    BaseFilter filter;
     ISampleGrabber ISampleGrabber_iface;
     /* IMediaSeeking and IMediaPosition are implemented by ISeekingPassThru */
     IUnknown* seekthru_unk;
     IUnknown *outer_unk;
-    LONG ref;
-    CRITICAL_SECTION critSect;
-    FILTER_INFO info;
-    FILTER_STATE state;
     AM_MEDIA_TYPE mtype;
     SG_Pin pin_in;
     SG_Pin pin_out;
     IMemInputPin IMemInputPin_iface;
     IMemAllocator *allocator;
-    IReferenceClock *refClock;
     IMemInputPin *memOutput;
     ISampleGrabberCB *grabberIface;
     LONG grabberMethod;
@@ -404,7 +400,7 @@ static inline SG_Impl *impl_from_IUnknown(IUnknown *iface)
 
 static inline SG_Impl *impl_from_IBaseFilter(IBaseFilter *iface)
 {
-    return CONTAINING_RECORD(iface, SG_Impl, IBaseFilter_iface);
+    return CONTAINING_RECORD(iface, SG_Impl, filter.IBaseFilter_iface);
 }
 
 static inline SG_Impl *impl_from_ISampleGrabber(ISampleGrabber *iface)
@@ -422,12 +418,10 @@ static inline SG_Impl *impl_from_IMemInputPin(IMemInputPin *iface)
 static void SampleGrabber_cleanup(SG_Impl *This)
 {
     TRACE("(%p)\n", This);
-    if (This->info.pGraph)
-	WARN("(%p) still joined to filter graph %p\n", This, This->info.pGraph);
+    if (This->filter.filterInfo.pGraph)
+        WARN("(%p) still joined to filter graph %p\n", This, This->filter.filterInfo.pGraph);
     if (This->allocator)
         IMemAllocator_Release(This->allocator);
-    if (This->refClock)
-	IReferenceClock_Release(This->refClock);
     if (This->memOutput)
         IMemInputPin_Release(This->memOutput);
     if (This->grabberIface)
@@ -438,8 +432,6 @@ static void SampleGrabber_cleanup(SG_Impl *This)
         CoTaskMemFree(This->bufferData);
     if(This->seekthru_unk)
         IUnknown_Release(This->seekthru_unk);
-    This->critSect.DebugInfo->Spare[0] = 0;
-    DeleteCriticalSection(&This->critSect);
 }
 
 /* SampleGrabber inner IUnknown */
@@ -454,7 +446,7 @@ static HRESULT WINAPI SampleGrabber_QueryInterface(IUnknown *iface, REFIID riid,
         *ppv = &This->IUnknown_inner;
     else if (IsEqualIID(riid, &IID_IPersist) || IsEqualIID(riid, &IID_IMediaFilter) ||
         IsEqualIID(riid, &IID_IBaseFilter))
-        *ppv = &This->IBaseFilter_iface;
+        *ppv = &This->filter.IBaseFilter_iface;
     else if (IsEqualIID(riid, &IID_ISampleGrabber))
         *ppv = &This->ISampleGrabber_iface;
     else if (IsEqualIID(riid, &IID_IMediaPosition))
@@ -474,9 +466,9 @@ static HRESULT WINAPI SampleGrabber_QueryInterface(IUnknown *iface, REFIID riid,
 static ULONG WINAPI SampleGrabber_AddRef(IUnknown *iface)
 {
     SG_Impl *This = impl_from_IUnknown(iface);
-    ULONG ref = InterlockedIncrement(&This->ref);
+    ULONG ref = BaseFilterImpl_AddRef(&This->filter.IBaseFilter_iface);
 
-    TRACE("(%p) new ref = %u\n", This, ref);
+    TRACE("(%p) ref=%d\n", This, ref);
 
     return ref;
 }
@@ -484,9 +476,9 @@ static ULONG WINAPI SampleGrabber_AddRef(IUnknown *iface)
 static ULONG WINAPI SampleGrabber_Release(IUnknown *iface)
 {
     SG_Impl *This = impl_from_IUnknown(iface);
-    ULONG ref = InterlockedDecrement(&This->ref);
+    ULONG ref = BaseFilterImpl_Release(&This->filter.IBaseFilter_iface);
 
-    TRACE("(%p) new ref = %u\n", This, ref);
+    TRACE("(%p) ref=%d\n", This, ref);
 
     if (ref == 0)
     {
@@ -515,7 +507,7 @@ static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
         if (size >= 0 && SUCCEEDED(IMediaSample_GetPointer(sample, &data))) {
             if (!data)
                 size = 0;
-            EnterCriticalSection(&This->critSect);
+            EnterCriticalSection(&This->filter.csFilter);
             if (This->bufferLen != size) {
                 if (This->bufferData)
                     CoTaskMemFree(This->bufferData);
@@ -524,7 +516,7 @@ static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
             }
             if (size)
                 CopyMemory(This->bufferData, data, size);
-            LeaveCriticalSection(&This->critSect);
+            LeaveCriticalSection(&This->filter.csFilter);
         }
     }
     if (!This->grabberIface)
@@ -590,24 +582,13 @@ SampleGrabber_IBaseFilter_Release(IBaseFilter *iface)
     return IUnknown_Release(This->outer_unk);
 }
 
-/* IPersist */
-static HRESULT WINAPI
-SampleGrabber_IBaseFilter_GetClassID(IBaseFilter *iface, CLSID *pClassID)
-{
-    TRACE("(%p)\n", pClassID);
-    if (!pClassID)
-        return E_POINTER;
-    *pClassID = CLSID_SampleGrabber;
-    return S_OK;
-}
-
 /* IMediaFilter */
 static HRESULT WINAPI
 SampleGrabber_IBaseFilter_Stop(IBaseFilter *iface)
 {
     SG_Impl *This = impl_from_IBaseFilter(iface);
     TRACE("(%p)\n", This);
-    This->state = State_Stopped;
+    This->filter.state = State_Stopped;
     return S_OK;
 }
 
@@ -617,7 +598,7 @@ SampleGrabber_IBaseFilter_Pause(IBaseFilter *iface)
 {
     SG_Impl *This = impl_from_IBaseFilter(iface);
     TRACE("(%p)\n", This);
-    This->state = State_Paused;
+    This->filter.state = State_Paused;
     return S_OK;
 }
 
@@ -627,50 +608,7 @@ SampleGrabber_IBaseFilter_Run(IBaseFilter *iface, REFERENCE_TIME tStart)
 {
     SG_Impl *This = impl_from_IBaseFilter(iface);
     TRACE("(%p)\n", This);
-    This->state = State_Running;
-    return S_OK;
-}
-
-/* IMediaFilter */
-static HRESULT WINAPI
-SampleGrabber_IBaseFilter_GetState(IBaseFilter *iface, DWORD msTout, FILTER_STATE *state)
-{
-    SG_Impl *This = impl_from_IBaseFilter(iface);
-    TRACE("(%p)->(%u, %p)\n", This, msTout, state);
-    if (!state)
-        return E_POINTER;
-    *state = This->state;
-    return S_OK;
-}
-
-/* IMediaFilter */
-static HRESULT WINAPI
-SampleGrabber_IBaseFilter_SetSyncSource(IBaseFilter *iface, IReferenceClock *clock)
-{
-    SG_Impl *This = impl_from_IBaseFilter(iface);
-    TRACE("(%p)->(%p)\n", This, clock);
-    if (clock != This->refClock)
-    {
-	if (clock)
-	    IReferenceClock_AddRef(clock);
-	if (This->refClock)
-	    IReferenceClock_Release(This->refClock);
-	This->refClock = clock;
-    }
-    return S_OK;
-}
-
-/* IMediaFilter */
-static HRESULT WINAPI
-SampleGrabber_IBaseFilter_GetSyncSource(IBaseFilter *iface, IReferenceClock **clock)
-{
-    SG_Impl *This = impl_from_IBaseFilter(iface);
-    TRACE("(%p)->(%p)\n", This, clock);
-    if (!clock)
-        return E_POINTER;
-    if (This->refClock)
-	IReferenceClock_AddRef(This->refClock);
-    *clock = This->refClock;
+    This->filter.state = State_Running;
     return S_OK;
 }
 
@@ -715,28 +653,15 @@ SampleGrabber_IBaseFilter_FindPin(IBaseFilter *iface, LPCWSTR id, IPin **pin)
 
 /* IBaseFilter */
 static HRESULT WINAPI
-SampleGrabber_IBaseFilter_QueryFilterInfo(IBaseFilter *iface, FILTER_INFO *info)
-{
-    SG_Impl *This = impl_from_IBaseFilter(iface);
-    TRACE("(%p)->(%p)\n", This, info);
-    if (!info)
-        return E_POINTER;
-    if (This->info.pGraph)
-	IFilterGraph_AddRef(This->info.pGraph);
-    *info = This->info;
-    return S_OK;
-}
-
-/* IBaseFilter */
-static HRESULT WINAPI
 SampleGrabber_IBaseFilter_JoinFilterGraph(IBaseFilter *iface, IFilterGraph *graph, LPCWSTR name)
 {
     SG_Impl *This = impl_from_IBaseFilter(iface);
+
     TRACE("(%p)->(%p, %s)\n", This, graph, debugstr_w(name));
-    This->info.pGraph = graph;
-    if (name)
-	lstrcpynW(This->info.achName,name,MAX_FILTER_NAME);
+
+    BaseFilterImpl_JoinFilterGraph(iface, graph, name);
     This->oneShot = OneShot_None;
+
     return S_OK;
 }
 
@@ -838,14 +763,14 @@ SampleGrabber_ISampleGrabber_SetBufferSamples(ISampleGrabber *iface, BOOL buffer
 {
     SG_Impl *This = impl_from_ISampleGrabber(iface);
     TRACE("(%p)->(%u)\n", This, bufferEm);
-    EnterCriticalSection(&This->critSect);
+    EnterCriticalSection(&This->filter.csFilter);
     if (bufferEm) {
         if (This->bufferLen < 0)
             This->bufferLen = 0;
     }
     else
         This->bufferLen = -1;
-    LeaveCriticalSection(&This->critSect);
+    LeaveCriticalSection(&This->filter.csFilter);
     return S_OK;
 }
 
@@ -858,7 +783,7 @@ SampleGrabber_ISampleGrabber_GetCurrentBuffer(ISampleGrabber *iface, LONG *bufSi
     TRACE("(%p)->(%p, %p)\n", This, bufSize, buffer);
     if (!bufSize)
         return E_POINTER;
-    EnterCriticalSection(&This->critSect);
+    EnterCriticalSection(&This->filter.csFilter);
     if (!This->pin_in.pair)
         ret = VFW_E_NOT_CONNECTED;
     else if (This->bufferLen < 0)
@@ -874,7 +799,7 @@ SampleGrabber_ISampleGrabber_GetCurrentBuffer(ISampleGrabber *iface, LONG *bufSi
         }
         *bufSize = This->bufferLen;
     }
-    LeaveCriticalSection(&This->critSect);
+    LeaveCriticalSection(&This->filter.csFilter);
     return ret;
 }
 
@@ -980,7 +905,7 @@ SampleGrabber_IMemInputPin_Receive(IMemInputPin *iface, IMediaSample *sample)
     TRACE("(%p)->(%p) output = %p, grabber = %p\n", This, sample, This->memOutput, This->grabberIface);
     if (!sample)
         return E_POINTER;
-    if ((This->state != State_Running) || (This->oneShot == OneShot_Past))
+    if ((This->filter.state != State_Running) || (This->oneShot == OneShot_Past))
         return S_FALSE;
     SampleGrabber_callback(This, sample);
     hr = This->memOutput ? IMemInputPin_Receive(This->memOutput, sample) : S_OK;
@@ -1002,7 +927,7 @@ SampleGrabber_IMemInputPin_ReceiveMultiple(IMemInputPin *iface, IMediaSample **s
     TRACE("(%p)->(%p, %u, %p) output = %p, grabber = %p\n", This, samples, nSamples, nProcessed, This->memOutput, This->grabberIface);
     if (!samples || !nProcessed)
         return E_POINTER;
-    if ((This->state != State_Running) || (This->oneShot == OneShot_Past))
+    if ((This->filter.state != State_Running) || (This->oneShot == OneShot_Past))
         return S_FALSE;
     for (idx = 0; idx < nSamples; idx++)
         SampleGrabber_callback(This, samples[idx]);
@@ -1082,7 +1007,7 @@ SampleGrabber_Out_IPin_Connect(IPin *iface, IPin *receiver, const AM_MEDIA_TYPE
         return E_POINTER;
     if (This->pair)
         return VFW_E_ALREADY_CONNECTED;
-    if (This->sg->state != State_Stopped)
+    if (This->sg->filter.state != State_Stopped)
         return VFW_E_NOT_STOPPED;
     if (type) {
 	TRACE("Media type: %s/%s ssize: %u format: %s (%u bytes)\n",
@@ -1130,7 +1055,7 @@ SampleGrabber_In_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_M
         return E_POINTER;
     if (This->pair)
         return VFW_E_ALREADY_CONNECTED;
-    if (This->sg->state != State_Stopped)
+    if (This->sg->filter.state != State_Stopped)
         return VFW_E_NOT_STOPPED;
     if (type) {
 	TRACE("Media type: %s/%s ssize: %u format: %s (%u bytes)\n",
@@ -1182,7 +1107,7 @@ SampleGrabber_In_IPin_Disconnect(IPin *iface)
     SG_Pin *This = impl_from_IPin(iface);
 
     TRACE("(%p)->() pair = %p\n", This, This->pair);
-    if (This->sg->state != State_Stopped)
+    if (This->sg->filter.state != State_Stopped)
         return VFW_E_NOT_STOPPED;
     if (This->pair) {
         This->pair = NULL;
@@ -1198,7 +1123,7 @@ SampleGrabber_Out_IPin_Disconnect(IPin *iface)
     SG_Pin *This = impl_from_IPin(iface);
 
     TRACE("(%p)->() pair = %p\n", This, This->pair);
-    if (This->sg->state != State_Stopped)
+    if (This->sg->filter.state != State_Stopped)
         return VFW_E_NOT_STOPPED;
     if (This->pair) {
         This->pair = NULL;
@@ -1256,8 +1181,8 @@ SampleGrabber_IPin_QueryPinInfo(IPin *iface, PIN_INFO *info)
     TRACE("(%p)->(%p)\n", This, info);
     if (!info)
         return E_POINTER;
-    IBaseFilter_AddRef(&This->sg->IBaseFilter_iface);
-    info->pFilter = &This->sg->IBaseFilter_iface;
+    info->pFilter = &This->sg->filter.IBaseFilter_iface;
+    IBaseFilter_AddRef(info->pFilter);
     info->dir = This->dir;
     lstrcpynW(info->achName,This->name,MAX_PIN_NAME);
     return S_OK;
@@ -1384,16 +1309,16 @@ static const IBaseFilterVtbl IBaseFilter_VTable =
     SampleGrabber_IBaseFilter_QueryInterface,
     SampleGrabber_IBaseFilter_AddRef,
     SampleGrabber_IBaseFilter_Release,
-    SampleGrabber_IBaseFilter_GetClassID,
+    BaseFilterImpl_GetClassID,
     SampleGrabber_IBaseFilter_Stop,
     SampleGrabber_IBaseFilter_Pause,
     SampleGrabber_IBaseFilter_Run,
-    SampleGrabber_IBaseFilter_GetState,
-    SampleGrabber_IBaseFilter_SetSyncSource,
-    SampleGrabber_IBaseFilter_GetSyncSource,
+    BaseFilterImpl_GetState,
+    BaseFilterImpl_SetSyncSource,
+    BaseFilterImpl_GetSyncSource,
     SampleGrabber_IBaseFilter_EnumPins,
     SampleGrabber_IBaseFilter_FindPin,
-    SampleGrabber_IBaseFilter_QueryFilterInfo,
+    BaseFilterImpl_QueryFilterInfo,
     SampleGrabber_IBaseFilter_JoinFilterGraph,
     SampleGrabber_IBaseFilter_QueryVendorInfo,
 };
@@ -1484,9 +1409,9 @@ HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
     }
     ZeroMemory(obj, sizeof(SG_Impl));
 
-    obj->ref = 1;
+    BaseFilter_Init(&obj->filter, &IBaseFilter_VTable, &CLSID_SampleGrabber,
+            (DWORD_PTR)(__FILE__ ": SG_Impl.csFilter"), NULL);
     obj->IUnknown_inner.lpVtbl = &samplegrabber_vtbl;
-    obj->IBaseFilter_iface.lpVtbl = &IBaseFilter_VTable;
     obj->ISampleGrabber_iface.lpVtbl = &ISampleGrabber_VTable;
     obj->IMemInputPin_iface.lpVtbl = &IMemInputPin_VTable;
     obj->pin_in.IPin_iface.lpVtbl = &IPin_In_VTable;
@@ -1499,16 +1424,10 @@ HRESULT SampleGrabber_create(IUnknown *pUnkOuter, LPVOID *ppv)
     obj->pin_out.name = pin_out_name;
     obj->pin_out.sg = obj;
     obj->pin_out.pair = NULL;
-    InitializeCriticalSection(&obj->critSect);
-    obj->critSect.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": SG_Impl.critSect");
-    obj->info.achName[0] = 0;
-    obj->info.pGraph = NULL;
-    obj->state = State_Stopped;
     obj->mtype.majortype = GUID_NULL;
     obj->mtype.subtype = MEDIASUBTYPE_None;
     obj->mtype.formattype = FORMAT_None;
     obj->allocator = NULL;
-    obj->refClock = NULL;
     obj->memOutput = NULL;
     obj->grabberIface = NULL;
     obj->grabberMethod = -1;
-- 
1.8.3.1



More information about the wine-patches mailing list