Damjan Jovanovic : qcap: Implement the SmartTee media type functions.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 29 05:29:49 CDT 2015


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

Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date:   Thu May 28 19:04:34 2015 +0200

qcap: Implement the SmartTee media type functions.

---

 dlls/qcap/smartteefilter.c       | 70 ++++++++++++++++++++++++++++++++++------
 dlls/qcap/tests/smartteefilter.c | 12 +++----
 2 files changed, 66 insertions(+), 16 deletions(-)

diff --git a/dlls/qcap/smartteefilter.c b/dlls/qcap/smartteefilter.c
index bf68398..9af2e9a 100644
--- a/dlls/qcap/smartteefilter.c
+++ b/dlls/qcap/smartteefilter.c
@@ -261,9 +261,13 @@ static const IPinVtbl SmartTeeFilterInputVtbl = {
 static HRESULT WINAPI SmartTeeFilterInput_CheckMediaType(BasePin *base, const AM_MEDIA_TYPE *pmt)
 {
     SmartTeeFilter *This = impl_from_BasePin(base);
-    FIXME("(%p, AM_MEDIA_TYPE(%p)): stub\n", This, pmt);
+    TRACE("(%p, AM_MEDIA_TYPE(%p))\n", This, pmt);
     dump_AM_MEDIA_TYPE(pmt);
-    return E_NOTIMPL;
+    if (!pmt)
+        return VFW_E_TYPE_NOT_ACCEPTED;
+    /* We'll take any media type, but the output pins will later
+     * struggle to connect downstream. */
+    return S_OK;
 }
 
 static LONG WINAPI SmartTeeFilterInput_GetMediaTypeVersion(BasePin *base)
@@ -274,8 +278,18 @@ static LONG WINAPI SmartTeeFilterInput_GetMediaTypeVersion(BasePin *base)
 static HRESULT WINAPI SmartTeeFilterInput_GetMediaType(BasePin *base, int iPosition, AM_MEDIA_TYPE *amt)
 {
     SmartTeeFilter *This = impl_from_BasePin(base);
-    FIXME("(%p)->(%d, %p): stub\n", This, iPosition, amt);
-    return S_FALSE;
+    HRESULT hr;
+    TRACE("(%p)->(%d, %p)\n", This, iPosition, amt);
+    if (iPosition)
+        return S_FALSE;
+    EnterCriticalSection(&This->filter.csFilter);
+    if (This->input->pin.pConnectedTo) {
+        CopyMediaType(amt, &This->input->pin.mtCurrent);
+        hr = S_OK;
+    } else
+        hr = S_FALSE;
+    LeaveCriticalSection(&This->filter.csFilter);
+    return hr;
 }
 
 static HRESULT WINAPI SmartTeeFilterInput_Receive(BaseInputPin *base, IMediaSample *pSample)
@@ -307,6 +321,20 @@ static ULONG WINAPI SmartTeeFilterCapture_Release(IPin *iface)
     return IBaseFilter_Release(&This->filter.IBaseFilter_iface);
 }
 
+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->input->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,
     SmartTeeFilterCapture_AddRef,
@@ -320,7 +348,7 @@ static const IPinVtbl SmartTeeFilterCaptureVtbl = {
     BasePinImpl_QueryDirection,
     BasePinImpl_QueryId,
     BasePinImpl_QueryAccept,
-    BasePinImpl_EnumMediaTypes,
+    SmartTeeFilterCapture_EnumMediaTypes,
     BasePinImpl_QueryInternalConnections,
     BaseOutputPinImpl_EndOfStream,
     BaseOutputPinImpl_BeginFlush,
@@ -338,8 +366,12 @@ static LONG WINAPI SmartTeeFilterCapture_GetMediaTypeVersion(BasePin *base)
 static HRESULT WINAPI SmartTeeFilterCapture_GetMediaType(BasePin *base, int iPosition, AM_MEDIA_TYPE *amt)
 {
     SmartTeeFilter *This = impl_from_BasePin(base);
-    FIXME("(%p, %d, %p): stub\n", This, iPosition, amt);
-    return E_NOTIMPL;
+    TRACE("(%p, %d, %p)\n", This, iPosition, amt);
+    if (iPosition == 0) {
+        CopyMediaType(amt, &This->input->pin.mtCurrent);
+        return S_OK;
+    } else
+        return S_FALSE;
 }
 
 static HRESULT WINAPI SmartTeeFilterCapture_DecideBufferSize(BaseOutputPin *base, IMemAllocator *alloc,
@@ -381,6 +413,20 @@ static ULONG WINAPI SmartTeeFilterPreview_Release(IPin *iface)
     return IBaseFilter_Release(&This->filter.IBaseFilter_iface);
 }
 
+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->input->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,
     SmartTeeFilterPreview_AddRef,
@@ -394,7 +440,7 @@ static const IPinVtbl SmartTeeFilterPreviewVtbl = {
     BasePinImpl_QueryDirection,
     BasePinImpl_QueryId,
     BasePinImpl_QueryAccept,
-    BasePinImpl_EnumMediaTypes,
+    SmartTeeFilterPreview_EnumMediaTypes,
     BasePinImpl_QueryInternalConnections,
     BaseOutputPinImpl_EndOfStream,
     BaseOutputPinImpl_BeginFlush,
@@ -412,8 +458,12 @@ static LONG WINAPI SmartTeeFilterPreview_GetMediaTypeVersion(BasePin *base)
 static HRESULT WINAPI SmartTeeFilterPreview_GetMediaType(BasePin *base, int iPosition, AM_MEDIA_TYPE *amt)
 {
     SmartTeeFilter *This = impl_from_BasePin(base);
-    FIXME("(%p, %d, %p): stub\n", This, iPosition, amt);
-    return E_NOTIMPL;
+    TRACE("(%p, %d, %p)\n", This, iPosition, amt);
+    if (iPosition == 0) {
+        CopyMediaType(amt, &This->input->pin.mtCurrent);
+        return S_OK;
+    } else
+        return S_FALSE;
 }
 
 static HRESULT WINAPI SmartTeeFilterPreview_DecideBufferSize(BaseOutputPin *base, IMemAllocator *alloc, ALLOCATOR_PROPERTIES *ppropInputRequest)
diff --git a/dlls/qcap/tests/smartteefilter.c b/dlls/qcap/tests/smartteefilter.c
index 78378e2..1255887 100644
--- a/dlls/qcap/tests/smartteefilter.c
+++ b/dlls/qcap/tests/smartteefilter.c
@@ -1010,13 +1010,13 @@ static HRESULT WINAPI SourcePin_Connect(IPin *iface, IPin *pReceivePin, const AM
     if (pmt && !IsEqualGUID(&pmt->formattype, &GUID_NULL))
         return VFW_E_TYPE_NOT_ACCEPTED;
     hr = IPin_ReceiveConnection(pReceivePin, &This->IPin_iface, &This->mediaType);
-    todo_wine ok(SUCCEEDED(hr), "SmartTeeFilter's Input pin's IPin_ReceiveConnection() failed with 0x%08x\n", hr);
+    ok(SUCCEEDED(hr), "SmartTeeFilter's Input pin's IPin_ReceiveConnection() failed with 0x%08x\n", hr);
     if (SUCCEEDED(hr)) {
         EnterCriticalSection(&This->cs);
         hr = IPin_QueryInterface(pReceivePin, &IID_IMemInputPin, (void**)&This->memInputPin);
         if (SUCCEEDED(hr)) {
             hr = IMemInputPin_GetAllocator(This->memInputPin, &This->allocator);
-            ok(SUCCEEDED(hr), "couldn't get allocator from SmartTeeFilter, hr=0x%08x\n", hr);
+            todo_wine ok(SUCCEEDED(hr), "couldn't get allocator from SmartTeeFilter, hr=0x%08x\n", hr);
             if (SUCCEEDED(hr)) {
                 ALLOCATOR_PROPERTIES requested, actual;
                 ZeroMemory(&requested, sizeof(ALLOCATOR_PROPERTIES));
@@ -1307,9 +1307,9 @@ static void test_smart_tee_filter_in_graph(IBaseFilter *smartTeeFilter, IPin *in
     }
 
     hr = IGraphBuilder_Connect(graphBuilder, capturePin, &captureSinkFilter->IPin_iface);
-    todo_wine ok(hr == VFW_E_NOT_CONNECTED, "connecting Capture pin without first connecting Input pin returned 0x%08x\n", hr);
+    ok(hr == VFW_E_NOT_CONNECTED, "connecting Capture pin without first connecting Input pin returned 0x%08x\n", hr);
     hr = IGraphBuilder_Connect(graphBuilder, previewPin, &previewSinkFilter->IPin_iface);
-    todo_wine ok(hr == VFW_E_NOT_CONNECTED, "connecting Preview pin without first connecting Input pin returned 0x%08x\n", hr);
+    ok(hr == VFW_E_NOT_CONNECTED, "connecting Preview pin without first connecting Input pin returned 0x%08x\n", hr);
 
     sourceFilter = create_SourceFilter();
     if (sourceFilter == NULL) {
@@ -1502,9 +1502,9 @@ static void test_smart_tee_filter(void)
     IEnumMediaTypes_Release(enumMediaTypes);
     enumMediaTypes = NULL;
     hr = IPin_EnumMediaTypes(capturePin, &enumMediaTypes);
-    todo_wine ok(hr == VFW_E_NOT_CONNECTED, "IPin_EnumMediaTypes() failed, hr=0x%08x\n", hr);
+    ok(hr == VFW_E_NOT_CONNECTED, "IPin_EnumMediaTypes() failed, hr=0x%08x\n", hr);
     hr = IPin_EnumMediaTypes(previewPin, &enumMediaTypes);
-    todo_wine ok(hr == VFW_E_NOT_CONNECTED, "IPin_EnumMediaTypes() failed, hr=0x%08x\n", hr);
+    ok(hr == VFW_E_NOT_CONNECTED, "IPin_EnumMediaTypes() failed, hr=0x%08x\n", hr);
 
     hr = IPin_QueryInternalConnections(inputPin, NULL, &nPin);
     ok(hr == E_NOTIMPL, "IPin_QueryInternalConnections() returned hr=0x%08x\n", hr);




More information about the wine-cvs mailing list