[PATCH 5/5] strmbase: Don't increment the pin reference count in filter_get_pin().

Zebediah Figura zfigura at codeweavers.com
Tue Jun 11 09:42:16 CDT 2019


From: Zebediah Figura <z.figura12 at gmail.com>

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/qcap/avico.c               | 13 ++++---------
 dlls/qcap/avimux.c              | 15 ++++-----------
 dlls/qcap/smartteefilter.c      | 15 +++++----------
 dlls/qcap/vfwcapture.c          |  1 -
 dlls/qedit/samplegrabber.c      | 13 ++++---------
 dlls/quartz/filesource.c        | 10 ++++------
 dlls/quartz/parser.c            |  8 +++-----
 dlls/strmbase/enumpins.c        | 22 +++++++---------------
 dlls/strmbase/filter.c          |  8 ++------
 dlls/strmbase/renderer.c        |  1 -
 dlls/strmbase/transform.c       |  1 -
 dlls/winegstreamer/gstdemux.c   | 16 +++++-----------
 dlls/wineqtdecoder/qtsplitter.c | 12 ------------
 13 files changed, 38 insertions(+), 97 deletions(-)

diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c
index 684a3324920..d257051b1ca 100644
--- a/dlls/qcap/avico.c
+++ b/dlls/qcap/avico.c
@@ -180,18 +180,13 @@ static const IBaseFilterVtbl AVICompressorVtbl = {
 
 static IPin *avi_compressor_get_pin(BaseFilter *iface, unsigned int index)
 {
-    AVICompressor *This = impl_from_BaseFilter(iface);
-    IPin *ret;
+    AVICompressor *filter = impl_from_BaseFilter(iface);
 
     if (index == 0)
-        ret = &This->in->pin.IPin_iface;
+        return &filter->in->pin.IPin_iface;
     else if (index == 1)
-        ret = &This->out->pin.IPin_iface;
-    else
-        return NULL;
-
-    IPin_AddRef(ret);
-    return ret;
+        return &filter->out->pin.IPin_iface;
+    return NULL;
 }
 
 static void avi_compressor_destroy(BaseFilter *iface)
diff --git a/dlls/qcap/avimux.c b/dlls/qcap/avimux.c
index de56a20b6f3..d289d2b9fed 100644
--- a/dlls/qcap/avimux.c
+++ b/dlls/qcap/avimux.c
@@ -118,19 +118,12 @@ static inline AviMux* impl_from_BaseFilter(BaseFilter *filter)
 
 static IPin *avi_mux_get_pin(BaseFilter *iface, unsigned int index)
 {
-    AviMux *This = impl_from_BaseFilter(iface);
+    AviMux *filter = impl_from_BaseFilter(iface);
 
     if (!index)
-    {
-        IPin_AddRef(&This->out->pin.pin.IPin_iface);
-        return &This->out->pin.pin.IPin_iface;
-    }
-    else if (index <= This->input_pin_no)
-    {
-        IPin_AddRef(&This->in[index - 1]->pin.pin.IPin_iface);
-        return &This->in[index - 1]->pin.pin.IPin_iface;
-    }
-
+        return &filter->out->pin.pin.IPin_iface;
+    else if (index <= filter->input_pin_no)
+        return &filter->in[index - 1]->pin.pin.IPin_iface;
     return NULL;
 }
 
diff --git a/dlls/qcap/smartteefilter.c b/dlls/qcap/smartteefilter.c
index 4095d95f947..02503ecb789 100644
--- a/dlls/qcap/smartteefilter.c
+++ b/dlls/qcap/smartteefilter.c
@@ -120,20 +120,15 @@ static const IBaseFilterVtbl SmartTeeFilterVtbl = {
 
 static IPin *smart_tee_get_pin(BaseFilter *iface, unsigned int index)
 {
-    SmartTeeFilter *This = impl_from_BaseFilter(iface);
-    IPin *ret;
+    SmartTeeFilter *filter = impl_from_BaseFilter(iface);
 
     if (index == 0)
-        ret = &This->input->pin.IPin_iface;
+        return &filter->input->pin.IPin_iface;
     else if (index == 1)
-        ret = &This->capture->pin.IPin_iface;
+        return &filter->capture->pin.IPin_iface;
     else if (index == 2)
-        ret = &This->preview->pin.IPin_iface;
-    else
-        return NULL;
-
-    IPin_AddRef(ret);
-    return ret;
+        return &filter->preview->pin.IPin_iface;
+    return NULL;
 }
 
 static void smart_tee_destroy(BaseFilter *iface)
diff --git a/dlls/qcap/vfwcapture.c b/dlls/qcap/vfwcapture.c
index d9d937a4a50..0bf8c45d9c0 100644
--- a/dlls/qcap/vfwcapture.c
+++ b/dlls/qcap/vfwcapture.c
@@ -104,7 +104,6 @@ static IPin *vfw_capture_get_pin(BaseFilter *iface, unsigned int index)
     if (index >= 1)
         return NULL;
 
-    IPin_AddRef(This->pOutputPin);
     return This->pOutputPin;
 }
 
diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c
index b53d4d8c7e9..9836d9e3740 100644
--- a/dlls/qedit/samplegrabber.c
+++ b/dlls/qedit/samplegrabber.c
@@ -275,18 +275,13 @@ static void SampleGrabber_cleanup(SG_Impl *This)
 
 static IPin *sample_grabber_get_pin(BaseFilter *iface, unsigned int index)
 {
-    SG_Impl *This = impl_from_BaseFilter(iface);
-    IPin *pin;
+    SG_Impl *filter = impl_from_BaseFilter(iface);
 
     if (index == 0)
-        pin = &This->pin_in.IPin_iface;
+        return &filter->pin_in.IPin_iface;
     else if (index == 1)
-        pin = &This->pin_out.IPin_iface;
-    else
-        return NULL;
-
-    IPin_AddRef(pin);
-    return pin;
+        return &filter->pin_out.IPin_iface;
+    return NULL;
 }
 
 static void sample_grabber_destroy(BaseFilter *iface)
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c
index b2fc4015816..34601da6b47 100644
--- a/dlls/quartz/filesource.c
+++ b/dlls/quartz/filesource.c
@@ -394,13 +394,11 @@ HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID *
 
 static IPin *async_reader_get_pin(BaseFilter *iface, unsigned int index)
 {
-    AsyncReader *This = impl_from_BaseFilter(iface);
+    AsyncReader *filter = impl_from_BaseFilter(iface);
 
-    if (index >= 1 || !This->pOutputPin)
-        return NULL;
-
-    IPin_AddRef(This->pOutputPin);
-    return This->pOutputPin;
+    if (!index && filter->pOutputPin)
+        return filter->pOutputPin;
+    return NULL;
 }
 
 static void async_reader_destroy(BaseFilter *iface)
diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c
index 3320dece4b5..2666eb75aad 100644
--- a/dlls/quartz/parser.c
+++ b/dlls/quartz/parser.c
@@ -66,11 +66,9 @@ IPin *parser_get_pin(BaseFilter *iface, unsigned int index)
 {
     ParserImpl *filter = impl_from_BaseFilter(iface);
 
-    if (index > filter->cStreams)
-        return NULL;
-
-    IPin_AddRef(filter->ppPins[index]);
-    return filter->ppPins[index];
+    if (index <= filter->cStreams)
+        return filter->ppPins[index];
+    return NULL;
 }
 
 HRESULT Parser_Create(ParserImpl *pParser, const IBaseFilterVtbl *vtbl, IUnknown *outer,
diff --git a/dlls/strmbase/enumpins.c b/dlls/strmbase/enumpins.c
index 198c8397a31..6e3357f5605 100644
--- a/dlls/strmbase/enumpins.c
+++ b/dlls/strmbase/enumpins.c
@@ -60,10 +60,7 @@ HRESULT enum_pins_create(BaseFilter *base, IEnumPins **out)
     object->Version = base->pin_version;
 
     while ((pin = base->pFuncsTable->filter_get_pin(base, object->count)))
-    {
-        IPin_Release(pin);
         ++object->count;
-    }
 
     TRACE("Created enumerator %p.\n", object);
     *out = &object->IEnumPins_iface;
@@ -122,7 +119,7 @@ static ULONG WINAPI IEnumPinsImpl_Release(IEnumPins * iface)
 static HRESULT WINAPI IEnumPinsImpl_Next(IEnumPins * iface, ULONG cPins, IPin ** ppPins, ULONG * pcFetched)
 {
     IEnumPinsImpl *This = impl_from_IEnumPins(iface);
-    ULONG i = 0;
+    ULONG i;
 
     TRACE("(%p)->(%u, %p, %p)\n", iface, cPins, ppPins, pcFetched);
 
@@ -138,16 +135,14 @@ static HRESULT WINAPI IEnumPinsImpl_Next(IEnumPins * iface, ULONG cPins, IPin **
     if (This->Version != This->base->pin_version)
         return VFW_E_ENUM_OUT_OF_SYNC;
 
-    while (i < cPins)
+    for (i = 0; i < cPins; ++i)
     {
-       IPin *pin;
-       pin = This->base->pFuncsTable->filter_get_pin(This->base, This->uIndex + i);
+        IPin *pin = This->base->pFuncsTable->filter_get_pin(This->base, This->uIndex + i);
 
-       if (!pin)
-         break;
-       else
-         ppPins[i] = pin;
-       ++i;
+        if (!pin)
+            break;
+
+        IPin_AddRef(ppPins[i] = pin);
     }
 
     if (pcFetched)
@@ -186,10 +181,7 @@ static HRESULT WINAPI IEnumPinsImpl_Reset(IEnumPins *iface)
     {
         enum_pins->count = 0;
         while ((pin = enum_pins->base->pFuncsTable->filter_get_pin(enum_pins->base, enum_pins->count)))
-        {
-            IPin_Release(pin);
             ++enum_pins->count;
-        }
     }
 
     enum_pins->Version = enum_pins->base->pin_version;
diff --git a/dlls/strmbase/filter.c b/dlls/strmbase/filter.c
index b61d3ffa99f..5f57731b7a1 100644
--- a/dlls/strmbase/filter.c
+++ b/dlls/strmbase/filter.c
@@ -194,19 +194,15 @@ HRESULT WINAPI BaseFilterImpl_FindPin(IBaseFilter *iface, const WCHAR *id, IPin
     {
         hr = IPin_QueryPinInfo(pin, &info);
         if (FAILED(hr))
-        {
-            IPin_Release(pin);
             return hr;
-        }
+
         if (info.pFilter) IBaseFilter_Release(info.pFilter);
 
         if (!lstrcmpW(id, info.achName))
         {
-            *ret = pin;
+            IPin_AddRef(*ret = pin);
             return S_OK;
         }
-
-        IPin_Release(pin);
     }
 
     return VFW_E_NOT_FOUND;
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index 1017c8c5747..b1b318f54f2 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -190,7 +190,6 @@ static IPin *renderer_get_pin(BaseFilter *iface, unsigned int index)
     if (index >= 1)
         return NULL;
 
-    IPin_AddRef(&This->pInputPin->pin.IPin_iface);
     return &This->pInputPin->pin.IPin_iface;
 }
 
diff --git a/dlls/strmbase/transform.c b/dlls/strmbase/transform.c
index a7c47b509f8..fe54ebe861f 100644
--- a/dlls/strmbase/transform.c
+++ b/dlls/strmbase/transform.c
@@ -135,7 +135,6 @@ static IPin *transform_get_pin(BaseFilter *iface, unsigned int index)
     if (index >= 2)
         return NULL;
 
-    IPin_AddRef(filter->ppPins[index]);
     return filter->ppPins[index];
 }
 
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 8649c8af736..2ec540a3e42 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -1198,19 +1198,13 @@ static inline GSTOutPin *impl_from_IMediaSeeking( IMediaSeeking *iface )
 
 static IPin *gstdemux_get_pin(BaseFilter *base, unsigned int index)
 {
-    GSTImpl *This = impl_from_IBaseFilter(&base->IBaseFilter_iface);
-    IPin *pin;
-
-    if (index > This->cStreams)
-        return NULL;
+    GSTImpl *filter = impl_from_IBaseFilter(&base->IBaseFilter_iface);
 
     if (!index)
-        pin = &This->pInputPin.pin.IPin_iface;
-    else
-        pin = &This->ppPins[index - 1]->pin.pin.IPin_iface;
-
-    IPin_AddRef(pin);
-    return pin;
+        return &filter->pInputPin.pin.IPin_iface;
+    else if (index <= filter->cStreams)
+        return &filter->ppPins[index - 1]->pin.pin.IPin_iface;
+    return NULL;
 }
 
 static void gstdemux_destroy(BaseFilter *iface)
diff --git a/dlls/wineqtdecoder/qtsplitter.c b/dlls/wineqtdecoder/qtsplitter.c
index 6c1105ce4b5..3dd530fac3e 100644
--- a/dlls/wineqtdecoder/qtsplitter.c
+++ b/dlls/wineqtdecoder/qtsplitter.c
@@ -207,28 +207,16 @@ static IPin *qt_splitter_get_pin(BaseFilter *base, unsigned int index)
     QTSplitter *filter = impl_from_BaseFilter(base);
 
     if (index == 0)
-    {
-        IPin_AddRef(&filter->pInputPin.pin.IPin_iface);
         return &filter->pInputPin.pin.IPin_iface;
-    }
     else if (index == 1)
     {
         if (filter->pVideo_Pin)
-        {
-            IPin_AddRef(&filter->pVideo_Pin->pin.pin.IPin_iface);
             return &filter->pVideo_Pin->pin.pin.IPin_iface;
-        }
         else if (filter->pAudio_Pin)
-        {
-            IPin_AddRef(&filter->pAudio_Pin->pin.pin.IPin_iface);
             return &filter->pAudio_Pin->pin.pin.IPin_iface;
-        }
     }
     else if (index == 2 && filter->pVideo_Pin && filter->pAudio_Pin)
-    {
-        IPin_AddRef(&filter->pAudio_Pin->pin.pin.IPin_iface);
         return &filter->pAudio_Pin->pin.pin.IPin_iface;
-    }
 
     return NULL;
 }
-- 
2.20.1




More information about the wine-devel mailing list