Damjan Jovanovic : qcap: Load the default renderer when it' s not specified.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jun 2 07:50:05 CDT 2015


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

Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date:   Sun May 31 20:13:12 2015 +0200

qcap: Load the default renderer when it's not specified.

---

 dlls/qcap/capturegraph.c | 44 +++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 39 insertions(+), 5 deletions(-)

diff --git a/dlls/qcap/capturegraph.c b/dlls/qcap/capturegraph.c
index b414d54..372e16f 100644
--- a/dlls/qcap/capturegraph.c
+++ b/dlls/qcap/capturegraph.c
@@ -371,6 +371,7 @@ fnCaptureGraphBuilder2_RenderStream(ICaptureGraphBuilder2 * iface,
 {
     CaptureGraphImpl *This = impl_from_ICaptureGraphBuilder2(iface);
     IPin *source_out = NULL, *renderer_in;
+    BOOL rendererNeedsRelease = FALSE;
     BOOL usedSmartTeePreviewPin = FALSE;
     HRESULT hr;
 
@@ -383,11 +384,6 @@ fnCaptureGraphBuilder2_RenderStream(ICaptureGraphBuilder2 * iface,
         FIXME("Need a capture graph\n");
         return E_UNEXPECTED;
     }
-    if (!pfRenderer)
-    {
-        FIXME("pfRenderer == NULL not yet supported\n");
-        return E_NOTIMPL;
-    }
 
     if (pCategory && IsEqualIID(pCategory, &PIN_CATEGORY_VBI)) {
         FIXME("Tee/Sink-to-Sink filter not supported\n");
@@ -411,9 +407,45 @@ fnCaptureGraphBuilder2_RenderStream(ICaptureGraphBuilder2 * iface,
             return E_INVALIDARG;
     }
 
+    if (!pfRenderer)
+    {
+        IEnumMediaTypes *enumMedia = NULL;
+        hr = IPin_EnumMediaTypes(source_out, &enumMedia);
+        if (SUCCEEDED(hr)) {
+            AM_MEDIA_TYPE *mediaType;
+            hr = IEnumMediaTypes_Next(enumMedia, 1, &mediaType, NULL);
+            if (SUCCEEDED(hr)) {
+                if (IsEqualIID(&mediaType->majortype, &MEDIATYPE_Video)) {
+                    hr = CoCreateInstance(&CLSID_VideoRenderer, NULL, CLSCTX_INPROC_SERVER,
+                            &IID_IBaseFilter, (void**)&pfRenderer);
+                } else if (IsEqualIID(&mediaType->majortype, &MEDIATYPE_Audio)) {
+                    hr = CoCreateInstance(&CLSID_DSoundRender, NULL, CLSCTX_INPROC_SERVER,
+                            &IID_IBaseFilter, (void**)&pfRenderer);
+                } else {
+                    FIXME("cannot automatically load renderer for majortype %s\n", debugstr_guid(&mediaType->majortype));
+                    hr = E_FAIL;
+                }
+                if (SUCCEEDED(hr)) {
+                    rendererNeedsRelease = TRUE;
+                    hr = IGraphBuilder_AddFilter(This->mygraph, pfRenderer, NULL);
+                }
+                DeleteMediaType(mediaType);
+            }
+            IEnumMediaTypes_Release(enumMedia);
+        }
+        if (FAILED(hr)) {
+            if (rendererNeedsRelease)
+                IBaseFilter_Release(pfRenderer);
+            IPin_Release(source_out);
+            return hr;
+        }
+    }
+
     hr = ICaptureGraphBuilder2_FindPin(iface, (IUnknown*)pfRenderer, PINDIR_INPUT, NULL, NULL, TRUE, 0, &renderer_in);
     if (FAILED(hr))
     {
+        if (rendererNeedsRelease)
+            IBaseFilter_Release(pfRenderer);
         IPin_Release(source_out);
         return hr;
     }
@@ -446,6 +478,8 @@ fnCaptureGraphBuilder2_RenderStream(ICaptureGraphBuilder2 * iface,
 
     IPin_Release(source_out);
     IPin_Release(renderer_in);
+    if (rendererNeedsRelease)
+        IBaseFilter_Release(pfRenderer);
     if (SUCCEEDED(hr) && usedSmartTeePreviewPin)
         hr = VFW_S_NOPREVIEWPIN;
     return hr;




More information about the wine-cvs mailing list