Zebediah Figura : qcap/smartteefilter: Use BasePinImpl_EnumMediaTypes().

Alexandre Julliard julliard at winehq.org
Wed Sep 25 16:45:19 CDT 2019


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue Sep 24 19:10:14 2019 -0500

qcap/smartteefilter: Use BasePinImpl_EnumMediaTypes().

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/qcap/smartteefilter.c | 78 ++++++++++++----------------------------------
 dlls/strmbase/pin.c        |  7 +++++
 2 files changed, 27 insertions(+), 58 deletions(-)

diff --git a/dlls/qcap/smartteefilter.c b/dlls/qcap/smartteefilter.c
index 7bb053d550..e7ff5f9b34 100644
--- a/dlls/qcap/smartteefilter.c
+++ b/dlls/qcap/smartteefilter.c
@@ -57,11 +57,6 @@ static inline SmartTeeFilter *impl_from_strmbase_pin(struct strmbase_pin *pin)
     return impl_from_strmbase_filter(pin->filter);
 }
 
-static inline SmartTeeFilter *impl_from_IPin(IPin *iface)
-{
-    return impl_from_strmbase_filter(CONTAINING_RECORD(iface, struct strmbase_pin, IPin_iface)->filter);
-}
-
 static HRESULT WINAPI SmartTeeFilter_Stop(IBaseFilter *iface)
 {
     SmartTeeFilter *This = impl_from_IBaseFilter(iface);
@@ -327,20 +322,6 @@ static const BaseInputPinFuncTable SmartTeeFilterInputFuncs =
     .pfnReceive = SmartTeeFilterInput_Receive,
 };
 
-static HRESULT WINAPI SmartTeeFilterCapture_EnumMediaTypes(IPin *iface, IEnumMediaTypes **ppEnum)
-{
-    SmartTeeFilter *This = impl_from_IPin(iface);
-    HRESULT hr;
-    TRACE("(%p)->(%p)\n", This, ppEnum);
-    EnterCriticalSection(&This->filter.csFilter);
-    if (This->sink.pin.pConnectedTo)
-        hr = BasePinImpl_EnumMediaTypes(iface, ppEnum);
-    else
-        hr = VFW_E_NOT_CONNECTED;
-    LeaveCriticalSection(&This->filter.csFilter);
-    return hr;
-}
-
 static const IPinVtbl SmartTeeFilterCaptureVtbl = {
     BaseOutputPinImpl_QueryInterface,
     BasePinImpl_AddRef,
@@ -354,7 +335,7 @@ static const IPinVtbl SmartTeeFilterCaptureVtbl = {
     BasePinImpl_QueryDirection,
     BasePinImpl_QueryId,
     BasePinImpl_QueryAccept,
-    SmartTeeFilterCapture_EnumMediaTypes,
+    BasePinImpl_EnumMediaTypes,
     BasePinImpl_QueryInternalConnections,
     BaseOutputPinImpl_EndOfStream,
     BaseOutputPinImpl_BeginFlush,
@@ -368,16 +349,23 @@ static HRESULT capture_query_accept(struct strmbase_pin *base, const AM_MEDIA_TY
     return S_OK;
 }
 
-static HRESULT capture_get_media_type(struct strmbase_pin *base,
-        unsigned int iPosition, AM_MEDIA_TYPE *amt)
+static HRESULT source_get_media_type(struct strmbase_pin *iface,
+        unsigned int index, AM_MEDIA_TYPE *mt)
 {
-    SmartTeeFilter *This = impl_from_strmbase_pin(base);
-    TRACE("(%p, %d, %p)\n", This, iPosition, amt);
-    if (iPosition == 0) {
-        CopyMediaType(amt, &This->sink.pin.mtCurrent);
-        return S_OK;
-    } else
-        return S_FALSE;
+    SmartTeeFilter *filter = impl_from_strmbase_pin(iface);
+    HRESULT hr = S_OK;
+
+    EnterCriticalSection(&filter->filter.csFilter);
+
+    if (!filter->sink.pin.pConnectedTo)
+        hr = VFW_E_NOT_CONNECTED;
+    else if (!index)
+        CopyMediaType(mt, &filter->sink.pin.mtCurrent);
+    else
+        hr = VFW_S_NO_MORE_ITEMS;
+
+    LeaveCriticalSection(&filter->filter.csFilter);
+    return hr;
 }
 
 static HRESULT WINAPI SmartTeeFilterCapture_DecideAllocator(struct strmbase_source *base,
@@ -393,25 +381,11 @@ static HRESULT WINAPI SmartTeeFilterCapture_DecideAllocator(struct strmbase_sour
 static const struct strmbase_source_ops capture_ops =
 {
     .base.pin_query_accept = capture_query_accept,
-    .base.pin_get_media_type = capture_get_media_type,
+    .base.pin_get_media_type = source_get_media_type,
     .pfnAttemptConnection = BaseOutputPinImpl_AttemptConnection,
     .pfnDecideAllocator = SmartTeeFilterCapture_DecideAllocator,
 };
 
-static HRESULT WINAPI SmartTeeFilterPreview_EnumMediaTypes(IPin *iface, IEnumMediaTypes **ppEnum)
-{
-    SmartTeeFilter *This = impl_from_IPin(iface);
-    HRESULT hr;
-    TRACE("(%p)->(%p)\n", This, ppEnum);
-    EnterCriticalSection(&This->filter.csFilter);
-    if (This->sink.pin.pConnectedTo)
-        hr = BasePinImpl_EnumMediaTypes(iface, ppEnum);
-    else
-        hr = VFW_E_NOT_CONNECTED;
-    LeaveCriticalSection(&This->filter.csFilter);
-    return hr;
-}
-
 static const IPinVtbl SmartTeeFilterPreviewVtbl = {
     BaseOutputPinImpl_QueryInterface,
     BasePinImpl_AddRef,
@@ -425,7 +399,7 @@ static const IPinVtbl SmartTeeFilterPreviewVtbl = {
     BasePinImpl_QueryDirection,
     BasePinImpl_QueryId,
     BasePinImpl_QueryAccept,
-    SmartTeeFilterPreview_EnumMediaTypes,
+    BasePinImpl_EnumMediaTypes,
     BasePinImpl_QueryInternalConnections,
     BaseOutputPinImpl_EndOfStream,
     BaseOutputPinImpl_BeginFlush,
@@ -439,18 +413,6 @@ static HRESULT preview_query_accept(struct strmbase_pin *base, const AM_MEDIA_TY
     return S_OK;
 }
 
-static HRESULT preview_get_media_type(struct strmbase_pin *base,
-        unsigned int iPosition, AM_MEDIA_TYPE *amt)
-{
-    SmartTeeFilter *This = impl_from_strmbase_pin(base);
-    TRACE("(%p, %d, %p)\n", This, iPosition, amt);
-    if (iPosition == 0) {
-        CopyMediaType(amt, &This->sink.pin.mtCurrent);
-        return S_OK;
-    } else
-        return S_FALSE;
-}
-
 static HRESULT WINAPI SmartTeeFilterPreview_DecideAllocator(struct strmbase_source *base,
         IMemInputPin *pPin, IMemAllocator **pAlloc)
 {
@@ -464,7 +426,7 @@ static HRESULT WINAPI SmartTeeFilterPreview_DecideAllocator(struct strmbase_sour
 static const struct strmbase_source_ops preview_ops =
 {
     .base.pin_query_accept = preview_query_accept,
-    .base.pin_get_media_type = preview_get_media_type,
+    .base.pin_get_media_type = source_get_media_type,
     .pfnAttemptConnection = BaseOutputPinImpl_AttemptConnection,
     .pfnDecideAllocator = SmartTeeFilterPreview_DecideAllocator,
 };
diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c
index 403e468550..2cc6ef5259 100644
--- a/dlls/strmbase/pin.c
+++ b/dlls/strmbase/pin.c
@@ -295,9 +295,16 @@ HRESULT WINAPI BasePinImpl_QueryAccept(IPin * iface, const AM_MEDIA_TYPE * pmt)
 HRESULT WINAPI BasePinImpl_EnumMediaTypes(IPin *iface, IEnumMediaTypes **enum_media_types)
 {
     struct strmbase_pin *pin = impl_from_IPin(iface);
+    AM_MEDIA_TYPE mt;
+    HRESULT hr;
 
     TRACE("iface %p, enum_media_types %p.\n", iface, enum_media_types);
 
+    if (FAILED(hr = pin->pFuncsTable->pin_get_media_type(pin, 0, &mt)))
+        return hr;
+    if (hr == S_OK)
+        FreeMediaType(&mt);
+
     return enum_media_types_create(pin, enum_media_types);
 }
 




More information about the wine-cvs mailing list