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