1 /* Capture Graph Builder, Minimal edition
3 * Copyright 2005 Maarten Lankhorst
4 * Copyright 2005 Rolf Kalbermatter
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #define NONAMELESSSTRUCT
27 #define NONAMELESSUNION
45 #include "qcap_main.h"
47 #include "wine/unicode.h"
48 #include "wine/debug.h"
50 WINE_DEFAULT_DEBUG_CHANNEL(quartz);
52 static const WCHAR wcsInputPinName[] = {'i','n','p','u','t',' ','p','i','n',0};
54 /***********************************************************************
55 * ICaptureGraphBuilder & ICaptureGraphBuilder2 implementation
57 typedef struct CaptureGraphImpl
59 const ICaptureGraphBuilder2Vtbl * lpVtbl2;
60 const ICaptureGraphBuilderVtbl * lpVtbl;
62 IGraphBuilder *mygraph;
64 CRITICAL_SECTION csFilter;
67 static const ICaptureGraphBuilderVtbl builder_Vtbl;
68 static const ICaptureGraphBuilder2Vtbl builder2_Vtbl;
70 #define _ICaptureGraphBuilder_Offset ((int)(&(((CaptureGraphImpl*)0)->lpVtbl)))
71 #define _ICOM_THIS_From_ICaptureGraphBuilder(class, name) class* This = (class*)(((char*)name)-_ICaptureGraphBuilder_Offset)
73 #define _ICaptureGraphBuilder2_Offset ((int)(&(((CaptureGraphImpl*)0)->lpVtbl2)))
74 #define _ICOM_THIS_From_ICaptureGraphBuilder2(class, name) class* This = (class*)(((char*)name)-_ICaptureGraphBuilder2_Offset)
77 converts This to an interface pointer
79 #define _IUnknown_(This) (IUnknown*)&(This->lpVtbl2)
80 #define _ICaptureGraphBuilder_(This) (ICaptureGraphBuilder*)&(This->lpVtbl)
81 #define _ICaptureGraphBuilder2_(This) (ICaptureGraphBuilder2*)&(This->lpVtbl2)
84 IUnknown * CALLBACK QCAP_createCaptureGraphBuilder2(IUnknown *pUnkOuter,
87 CaptureGraphImpl * pCapture = NULL;
89 TRACE("(%p, %p)\n", pUnkOuter, phr);
91 *phr = CLASS_E_NOAGGREGATION;
98 pCapture = CoTaskMemAlloc(sizeof(CaptureGraphImpl));
101 pCapture->lpVtbl2 = &builder2_Vtbl;
102 pCapture->lpVtbl = &builder_Vtbl;
104 pCapture->mygraph = NULL;
105 InitializeCriticalSection(&pCapture->csFilter);
108 return (IUnknown *)pCapture;
111 static HRESULT WINAPI
112 fnCaptureGraphBuilder2_QueryInterface(ICaptureGraphBuilder2 * iface,
116 _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
118 TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppv);
121 if (IsEqualIID(riid, &IID_IUnknown))
122 *ppv = _IUnknown_(This);
123 else if (IsEqualIID(riid, &IID_ICaptureGraphBuilder))
124 *ppv = _ICaptureGraphBuilder_(This);
125 else if (IsEqualIID(riid, &IID_ICaptureGraphBuilder2))
126 *ppv = _ICaptureGraphBuilder2_(This);
130 IUnknown_AddRef((IUnknown *)(*ppv));
131 TRACE ("-- Interface = %p\n", *ppv);
135 TRACE ("-- Interface: E_NOINTERFACE\n");
136 return E_NOINTERFACE;
140 fnCaptureGraphBuilder2_AddRef(ICaptureGraphBuilder2 * iface)
142 _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
143 DWORD ref = InterlockedIncrement(&This->ref);
145 TRACE("(%p/%p)->() AddRef from %ld\n", This, iface, ref - 1);
150 fnCaptureGraphBuilder2_Release(ICaptureGraphBuilder2 * iface)
152 _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
153 DWORD ref = InterlockedDecrement(&This->ref);
155 TRACE("(%p/%p)->() Release from %ld\n", This, iface, ref + 1);
159 FIXME("Release IGraphFilter or w/e\n");
160 DeleteCriticalSection(&This->csFilter);
162 This->lpVtbl2 = NULL;
163 if (This->mygraph != NULL)
164 IGraphBuilder_Release((IGraphBuilder *)This->mygraph);
172 static HRESULT WINAPI
173 fnCaptureGraphBuilder2_SetFilterGraph(ICaptureGraphBuilder2 * iface,
176 /* The graph builder will automatically create a filter graph if you don't call
177 this method. If you call this method after the graph builder has created its
178 own filter graph, the call will fail. */
180 _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
182 TRACE("(%p/%p)->(%p)\n", This, iface, pfg);
191 IGraphBuilder_AddRef((IGraphBuilder *)This->mygraph);
192 if (SUCCEEDED(IUnknown_QueryInterface(This->mygraph,
193 &IID_IMediaEvent, (LPVOID *)&pmev)))
195 IMediaEvent_CancelDefaultHandling(pmev, EC_REPAINT);
196 IMediaEvent_Release(pmev);
201 static HRESULT WINAPI
202 fnCaptureGraphBuilder2_GetFilterGraph(ICaptureGraphBuilder2 * iface,
205 _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
207 TRACE("(%p/%p)->(%p)\n", This, iface, pfg);
212 *pfg = This->mygraph;
215 TRACE("(%p) Getting NULL filtergraph\n", iface);
219 IGraphBuilder_AddRef((IGraphBuilder *)This->mygraph);
221 TRACE("(%p) return filtergraph %p\n", iface, *pfg);
225 static HRESULT WINAPI
226 fnCaptureGraphBuilder2_SetOutputFileName(ICaptureGraphBuilder2 * iface,
230 IFileSinkFilter **ppSink)
232 _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
234 FIXME("(%p/%p)->(%s, %s, %p, %p) Stub!\n", This, iface,
235 debugstr_guid(pType), debugstr_w(lpstrFile), ppf, ppSink);
240 static HRESULT WINAPI
241 fnCaptureGraphBuilder2_FindInterface(ICaptureGraphBuilder2 * iface,
242 const GUID *pCategory,
248 _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
250 FIXME("(%p/%p)->(%s, %s, %p, %s, %p) - workaround stub!\n", This, iface,
251 debugstr_guid(pCategory), debugstr_guid(pType),
252 pf, debugstr_guid(riid), ppint);
254 return IBaseFilter_QueryInterface(pf, riid, ppint);
255 /* Looks for the specified interface on the filter, upstream and
256 * downstream from the filter, and, optionally, only on the output
257 * pin of the given category.
261 static HRESULT WINAPI
262 fnCaptureGraphBuilder2_RenderStream(ICaptureGraphBuilder2 * iface,
263 const GUID *pCategory,
266 IBaseFilter *pfCompressor,
267 IBaseFilter *pfRenderer)
269 _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
271 FIXME("(%p/%p)->(%s, %s, %p, %p, %p) Stub!\n", This, iface,
272 debugstr_guid(pCategory), debugstr_guid(pType),
273 pSource, pfCompressor, pfRenderer);
278 static HRESULT WINAPI
279 fnCaptureGraphBuilder2_ControlStream(ICaptureGraphBuilder2 * iface,
280 const GUID *pCategory,
282 IBaseFilter *pFilter,
283 REFERENCE_TIME *pstart,
284 REFERENCE_TIME *pstop,
288 _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
290 FIXME("(%p/%p)->(%s, %s, %p, %p, %p, %i, %i) Stub!\n", This, iface,
291 debugstr_guid(pCategory), debugstr_guid(pType),
292 pFilter, pstart, pstop, wStartCookie, wStopCookie);
297 static HRESULT WINAPI
298 fnCaptureGraphBuilder2_AllocCapFile(ICaptureGraphBuilder2 * iface,
302 _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
304 FIXME("(%p/%p)->(%s, %lld) Stub!\n", This, iface,
305 debugstr_w(lpwstr), dwlSize);
310 static HRESULT WINAPI
311 fnCaptureGraphBuilder2_CopyCaptureFile(ICaptureGraphBuilder2 * iface,
315 IAMCopyCaptureFileProgress *pCallback)
317 _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
319 FIXME("(%p/%p)->(%s, %s, %i, %p) Stub!\n", This, iface,
320 debugstr_w(lpwstrOld), debugstr_w(lpwstrNew),
321 fAllowEscAbort, pCallback);
326 static HRESULT WINAPI
327 fnCaptureGraphBuilder2_FindPin(ICaptureGraphBuilder2 * iface,
329 PIN_DIRECTION pindir,
330 const GUID *pCategory,
336 _ICOM_THIS_From_ICaptureGraphBuilder2(CaptureGraphImpl, iface);
338 FIXME("(%p/%p)->(%p, %x, %s, %s, %d, %i, %p) Stub!\n", This, iface,
339 pSource, pindir, debugstr_guid(pCategory), debugstr_guid(pType),
340 fUnconnected, num, ppPin);
345 static const ICaptureGraphBuilder2Vtbl builder2_Vtbl =
347 fnCaptureGraphBuilder2_QueryInterface,
348 fnCaptureGraphBuilder2_AddRef,
349 fnCaptureGraphBuilder2_Release,
350 fnCaptureGraphBuilder2_SetFilterGraph,
351 fnCaptureGraphBuilder2_GetFilterGraph,
352 fnCaptureGraphBuilder2_SetOutputFileName,
353 fnCaptureGraphBuilder2_FindInterface,
354 fnCaptureGraphBuilder2_RenderStream,
355 fnCaptureGraphBuilder2_ControlStream,
356 fnCaptureGraphBuilder2_AllocCapFile,
357 fnCaptureGraphBuilder2_CopyCaptureFile,
358 fnCaptureGraphBuilder2_FindPin
362 static HRESULT WINAPI
363 fnCaptureGraphBuilder_QueryInterface(ICaptureGraphBuilder * iface,
364 REFIID riid, LPVOID * ppv)
366 _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
368 return IUnknown_QueryInterface(_ICaptureGraphBuilder2_(This), riid, ppv);
372 fnCaptureGraphBuilder_AddRef(ICaptureGraphBuilder * iface)
374 _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
376 return IUnknown_AddRef(_ICaptureGraphBuilder2_(This));
380 fnCaptureGraphBuilder_Release(ICaptureGraphBuilder * iface)
382 _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
384 return IUnknown_Release(_ICaptureGraphBuilder2_(This));
387 static HRESULT WINAPI
388 fnCaptureGraphBuilder_SetFiltergraph(ICaptureGraphBuilder * iface,
391 _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
393 return ICaptureGraphBuilder2_SetFiltergraph(_ICaptureGraphBuilder2_(This), pfg);
396 static HRESULT WINAPI
397 fnCaptureGraphBuilder_GetFiltergraph(ICaptureGraphBuilder * iface,
400 _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
402 return ICaptureGraphBuilder2_GetFiltergraph(_ICaptureGraphBuilder2_(This), pfg);
405 static HRESULT WINAPI
406 fnCaptureGraphBuilder_SetOutputFileName(ICaptureGraphBuilder * iface,
407 const GUID *pType, LPCOLESTR lpstrFile,
408 IBaseFilter **ppf, IFileSinkFilter **ppSink)
410 _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
412 return ICaptureGraphBuilder2_SetOutputFileName(_ICaptureGraphBuilder2_(This),
413 pType, lpstrFile, ppf, ppSink);
416 static HRESULT WINAPI
417 fnCaptureGraphBuilder_FindInterface(ICaptureGraphBuilder * iface,
418 const GUID *pCategory, IBaseFilter *pf,
419 REFIID riid, void **ppint)
421 _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
423 return ICaptureGraphBuilder2_FindInterface(_ICaptureGraphBuilder2_(This),
424 pCategory, NULL, pf, riid, ppint);
427 static HRESULT WINAPI
428 fnCaptureGraphBuilder_RenderStream(ICaptureGraphBuilder * iface,
429 const GUID *pCategory, IUnknown *pSource,
430 IBaseFilter *pfCompressor, IBaseFilter *pfRenderer)
432 _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
434 return ICaptureGraphBuilder2_RenderStream(_ICaptureGraphBuilder2_(This),
435 pCategory, NULL, pSource,
436 pfCompressor, pfRenderer);
439 static HRESULT WINAPI
440 fnCaptureGraphBuilder_ControlStream(ICaptureGraphBuilder * iface,
441 const GUID *pCategory, IBaseFilter *pFilter,
442 REFERENCE_TIME *pstart, REFERENCE_TIME *pstop,
443 WORD wStartCookie, WORD wStopCookie)
445 _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
447 return ICaptureGraphBuilder2_ControlStream(_ICaptureGraphBuilder2_(This),
448 pCategory, NULL, pFilter, pstart,
449 pstop, wStartCookie, wStopCookie);
452 static HRESULT WINAPI
453 fnCaptureGraphBuilder_AllocCapFile(ICaptureGraphBuilder * iface,
454 LPCOLESTR lpstr, DWORDLONG dwlSize)
456 _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
458 return ICaptureGraphBuilder2_AllocCapFile(_ICaptureGraphBuilder2_(This),
462 static HRESULT WINAPI
463 fnCaptureGraphBuilder_CopyCaptureFile(ICaptureGraphBuilder * iface,
464 LPOLESTR lpwstrOld, LPOLESTR lpwstrNew,
466 IAMCopyCaptureFileProgress *pCallback)
468 _ICOM_THIS_From_ICaptureGraphBuilder(CaptureGraphImpl, iface);
470 return ICaptureGraphBuilder2_CopyCaptureFile(_ICaptureGraphBuilder2_(This),
471 lpwstrOld, lpwstrNew,
472 fAllowEscAbort, pCallback);
475 static const ICaptureGraphBuilderVtbl builder_Vtbl =
477 fnCaptureGraphBuilder_QueryInterface,
478 fnCaptureGraphBuilder_AddRef,
479 fnCaptureGraphBuilder_Release,
480 fnCaptureGraphBuilder_SetFiltergraph,
481 fnCaptureGraphBuilder_GetFiltergraph,
482 fnCaptureGraphBuilder_SetOutputFileName,
483 fnCaptureGraphBuilder_FindInterface,
484 fnCaptureGraphBuilder_RenderStream,
485 fnCaptureGraphBuilder_ControlStream,
486 fnCaptureGraphBuilder_AllocCapFile,
487 fnCaptureGraphBuilder_CopyCaptureFile