58 if (!(
object =
calloc(1,
sizeof(*
object))))
62 object->ICaptureGraphBuilder_iface.lpVtbl = &
builder_Vtbl;
64 object->mygraph =
NULL;
66 object->csFilter.DebugInfo->Spare[0] = (
DWORD_PTR)(__FILE__
": CaptureGraphImpl.csFilter");
68 TRACE(
"Created capture graph builder %p.\n",
object);
84 *
ppv = &
This->ICaptureGraphBuilder2_iface;
86 *
ppv = &
This->ICaptureGraphBuilder_iface;
88 *
ppv = &
This->ICaptureGraphBuilder2_iface;
97 TRACE (
"-- Interface: E_NOINTERFACE\n");
121 This->csFilter.DebugInfo->Spare[0] = 0;
124 IGraphBuilder_Release(
This->mygraph);
140 TRACE(
"(%p/%p)->(%p)\n",
This, iface, pfg);
149 IGraphBuilder_AddRef(
This->mygraph);
151 &IID_IMediaEvent, (
LPVOID *)&pmev)))
153 IMediaEvent_CancelDefaultHandling(pmev,
EC_REPAINT);
154 IMediaEvent_Release(pmev);
165 TRACE(
"(%p/%p)->(%p)\n",
This, iface, pfg);
170 *pfg =
This->mygraph;
173 TRACE(
"(%p) Getting NULL filtergraph\n", iface);
177 IGraphBuilder_AddRef(
This->mygraph);
179 TRACE(
"(%p) return filtergraph %p\n", iface, *pfg);
192 FIXME(
"(%p/%p)->(%s, %s, %p, %p) Stub!\n",
This, iface,
203 if (
FAILED(IPin_EnumMediaTypes(pin, &enummt)))
206 while (IEnumMediaTypes_Next(enummt, 1, &mt,
NULL) ==
S_OK)
211 IEnumMediaTypes_Release(enummt);
216 IEnumMediaTypes_Release(enummt);
221 const GUID *majortype,
BOOL unconnected)
227 if (
FAILED(
hr = IPin_QueryDirection(pin, &candidate_dir)))
228 ERR(
"Failed to query direction, hr %#lx.\n",
hr);
230 if (
dir != candidate_dir)
233 if (unconnected && IPin_ConnectedTo(pin, &peer) ==
S_OK && peer)
270 TRACE(
"Looking for %s pins, category %s, majortype %s from filter %p.\n",
276 ERR(
"Failed to enumerate pins, hr %#lx.\n",
hr);
280 while (IEnumPins_Next(enumpins, 1, &pin,
NULL) ==
S_OK)
289 found_category =
TRUE;
291 if (IPin_QueryInterface(pin, iid,
out) ==
S_OK)
294 IEnumPins_Release(enumpins);
298 hr = IPin_ConnectedTo(pin, &peer);
302 if (IPin_QueryInterface(peer, iid,
out) ==
S_OK)
305 IEnumPins_Release(enumpins);
309 IPin_QueryPinInfo(peer, &
info);
312 if (IBaseFilter_QueryInterface(
info.pFilter, iid,
out) ==
S_OK)
314 IBaseFilter_Release(
info.pFilter);
315 IEnumPins_Release(enumpins);
320 IBaseFilter_Release(
info.pFilter);
323 IEnumPins_Release(enumpins);
328 IEnumPins_Release(enumpins);
342 TRACE(
"graph %p, category %s, majortype %s, filter %p, iid %s, out %p.\n",
368 const GUID *pCategory,
381 hr = ICaptureGraphBuilder2_FindPin(&
This->ICaptureGraphBuilder2_iface, pSource,
384 hr = ICaptureGraphBuilder2_FindPin(&
This->ICaptureGraphBuilder2_iface, pSource,
393 if (
IsEqualIID(pCategory, &PIN_CATEGORY_CAPTURE)) {
394 hr = IPin_ConnectedTo(capture, &peer);
396 *source_out = capture;
397 IPin_AddRef(*source_out);
405 IPin_AddRef(*source_out);
412 hr = IPin_ConnectedTo(capture, &peer);
416 hr = IPin_QueryPinInfo(peer, &pinInfo);
418 hr = IBaseFilter_GetClassID(pinInfo.pFilter, &classID);
421 smartTee = pinInfo.pFilter;
422 IBaseFilter_AddRef(smartTee);
425 IBaseFilter_Release(pinInfo.pFilter);
435 hr = IGraphBuilder_AddFilter(
This->mygraph, smartTee,
NULL);
438 hr = IBaseFilter_FindPin(smartTee,
L"Input", &smartTeeInput);
440 hr = IGraphBuilder_ConnectDirect(
This->mygraph, capture, smartTeeInput,
NULL);
441 IPin_Release(smartTeeInput);
446 TRACE(
"adding SmartTee failed with hr=0x%08lx\n",
hr);
454 if (
IsEqualIID(pCategory, &PIN_CATEGORY_CAPTURE))
455 hr = IBaseFilter_FindPin(smartTee,
L"Capture", source_out);
457 hr = IBaseFilter_FindPin(smartTee,
L"Preview", source_out);
464 IPin_Release(capture);
470 IBaseFilter_Release(smartTee);
471 TRACE(
"for %s returning hr=0x%08lx, *source_out=%p\n",
IsEqualIID(pCategory, &PIN_CATEGORY_CAPTURE) ?
"capture" :
"preview",
hr, source_out ? *source_out : 0);
486 IPin_QueryDirection(pin, &
dir);
496 if (
FAILED(IPin_ConnectedTo(pin, &peer)))
504 if (
FAILED(IPin_ConnectedTo(pin, &peer)))
509 IPin_AddRef(*
ret = pin);
515 IPin_QueryPinInfo(peer, &
info);
517 IBaseFilter_Release(
info.pFilter);
536 if (
FAILED(IPin_ConnectedTo(pin, &peer)))
550 while (IEnumPins_Next(enumpins, 1, &pin,
NULL) ==
S_OK)
554 IEnumPins_Release(enumpins);
560 IEnumPins_Release(enumpins);
570 IPin *source_out =
NULL, *renderer_in;
576 TRACE(
"graph %p, category %s, majortype %s, source %p, intermediate %p, sink %p.\n",
581 FIXME(
"Need a capture graph\n");
587 FIXME(
"Tee/Sink-to-Sink filter not supported\n");
599 IBaseFilter_Release(
filter);
603 WARN(
"Source object does not expose IBaseFilter or IPin.\n");
613 hr = IPin_EnumMediaTypes(source_out, &enumMedia);
616 hr = IEnumMediaTypes_Next(enumMedia, 1, &mediaType,
NULL);
618 if (
IsEqualIID(&mediaType->majortype, &MEDIATYPE_Video)) {
621 }
else if (
IsEqualIID(&mediaType->majortype, &MEDIATYPE_Audio)) {
625 FIXME(
"cannot automatically load renderer for majortype %s\n",
debugstr_guid(&mediaType->majortype));
629 rendererNeedsRelease =
TRUE;
630 hr = IGraphBuilder_AddFilter(
This->mygraph, pfRenderer,
NULL);
634 IEnumMediaTypes_Release(enumMedia);
637 if (rendererNeedsRelease)
638 IBaseFilter_Release(pfRenderer);
639 IPin_Release(source_out);
647 if (rendererNeedsRelease)
648 IBaseFilter_Release(pfRenderer);
649 IPin_Release(source_out);
654 hr = IGraphBuilder_Connect(
This->mygraph, source_out, renderer_in);
657 IPin *compressor_in, *compressor_out;
659 hr = ICaptureGraphBuilder2_FindPin(iface, (
IUnknown*)pfCompressor,
663 hr = IGraphBuilder_Connect(
This->mygraph, source_out, compressor_in);
664 IPin_Release(compressor_in);
669 hr = ICaptureGraphBuilder2_FindPin(iface, (
IUnknown*)pfCompressor,
673 hr = IGraphBuilder_Connect(
This->mygraph, compressor_out, renderer_in);
674 IPin_Release(compressor_out);
679 IPin_Release(source_out);
680 IPin_Release(renderer_in);
681 if (rendererNeedsRelease)
682 IBaseFilter_Release(pfRenderer);
690 const GUID *pCategory,
700 FIXME(
"(%p/%p)->(%s, %s, %p, %p, %p, %i, %i) Stub!\n",
This, iface,
702 pFilter, pstart, pstop, wStartCookie, wStopCookie);
714 FIXME(
"(%p/%p)->(%s, 0x%s) Stub!\n",
This, iface,
729 FIXME(
"(%p/%p)->(%s, %s, %i, %p) Stub!\n",
This, iface,
740 const GUID *pCategory,
751 TRACE(
"(%p/%p)->(%p, %x, %s, %s, %d, %i, %p)\n",
This, iface,
753 fUnconnected,
num, ppPin);
757 hr = IUnknown_QueryInterface(pSource, &
IID_IPin, (
void**)&pin);
766 WARN(
"Input not filter or pin?!\n");
770 hr = IBaseFilter_EnumPins(
filter, &enumpins);
773 WARN(
"Could not enumerate\n");
774 IBaseFilter_Release(
filter);
782 hr = IEnumPins_Next(enumpins, 1, &pin, &fetched);
786 IEnumPins_Reset(enumpins);
798 TRACE(
"Testing match\n");
799 if (
pin_matches(pin, pindir, pCategory, pType, fUnconnected) && numcurrent++ ==
num)
804 IEnumPins_Release(enumpins);
805 IBaseFilter_Release(
filter);
809 WARN(
"Could not find %s pin # %d\n", (pindir ==
PINDIR_OUTPUT ?
"output" :
"input"), numcurrent);
813 else if (!
pin_matches(pin, pindir, pCategory, pType, fUnconnected))
845 TRACE(
"%p --> Forwarding to v2 (%p)\n", iface,
This);
846 return ICaptureGraphBuilder2_QueryInterface(&
This->ICaptureGraphBuilder2_iface,
riid,
ppv);
853 TRACE(
"%p --> Forwarding to v2 (%p)\n", iface,
This);
854 return ICaptureGraphBuilder2_AddRef(&
This->ICaptureGraphBuilder2_iface);
861 TRACE(
"%p --> Forwarding to v2 (%p)\n", iface,
This);
862 return ICaptureGraphBuilder2_Release(&
This->ICaptureGraphBuilder2_iface);
870 TRACE(
"%p --> Forwarding to v2 (%p)\n", iface,
This);
871 return ICaptureGraphBuilder2_SetFiltergraph(&
This->ICaptureGraphBuilder2_iface, pfg);
879 TRACE(
"%p --> Forwarding to v2 (%p)\n", iface,
This);
880 return ICaptureGraphBuilder2_GetFiltergraph(&
This->ICaptureGraphBuilder2_iface, pfg);
885 const GUID *pType, LPCOLESTR lpstrFile,
889 TRACE(
"%p --> Forwarding to v2 (%p)\n", iface,
This);
890 return ICaptureGraphBuilder2_SetOutputFileName(&
This->ICaptureGraphBuilder2_iface, pType,
891 lpstrFile, ppf, ppSink);
900 TRACE(
"%p --> Forwarding to v2 (%p)\n", iface,
This);
901 return ICaptureGraphBuilder2_FindInterface(&
This->ICaptureGraphBuilder2_iface, pCategory,
NULL,
911 TRACE(
"%p --> Forwarding to v2 (%p)\n", iface,
This);
912 return ICaptureGraphBuilder2_RenderStream(&
This->ICaptureGraphBuilder2_iface, pCategory,
NULL,
913 pSource, pfCompressor, pfRenderer);
920 WORD wStartCookie,
WORD wStopCookie)
923 TRACE(
"%p --> Forwarding to v2 (%p)\n", iface,
This);
924 return ICaptureGraphBuilder2_ControlStream(&
This->ICaptureGraphBuilder2_iface, pCategory,
NULL,
925 pFilter, pstart, pstop, wStartCookie, wStopCookie);
933 TRACE(
"%p --> Forwarding to v2 (%p)\n", iface,
This);
934 return ICaptureGraphBuilder2_AllocCapFile(&
This->ICaptureGraphBuilder2_iface, lpstr, dwlSize);
939 LPOLESTR lpwstrOld, LPOLESTR lpwstrNew,
944 TRACE(
"%p --> Forwarding to v2 (%p)\n", iface,
This);
945 return ICaptureGraphBuilder2_CopyCaptureFile(&
This->ICaptureGraphBuilder2_iface, lpwstrOld,
#define InterlockedIncrement
#define InterlockedDecrement
enum _PinDirection PIN_DIRECTION
@ AMPROPERTY_PIN_CATEGORY
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static previewinfo preview
static HRESULT find_interface_recurse(PIN_DIRECTION dir, const GUID *category, const GUID *majortype, IBaseFilter *filter, REFIID iid, void **out)
static HRESULT WINAPI fnCaptureGraphBuilder_CopyCaptureFile(ICaptureGraphBuilder *iface, LPOLESTR lpwstrOld, LPOLESTR lpwstrNew, int fAllowEscAbort, IAMCopyCaptureFileProgress *pCallback)
static BOOL pin_has_majortype(IPin *pin, const GUID *majortype)
static HRESULT WINAPI fnCaptureGraphBuilder2_FindInterface(ICaptureGraphBuilder2 *iface, const GUID *category, const GUID *majortype, IBaseFilter *filter, REFIID iid, void **out)
static HRESULT WINAPI fnCaptureGraphBuilder_RenderStream(ICaptureGraphBuilder *iface, const GUID *pCategory, IUnknown *pSource, IBaseFilter *pfCompressor, IBaseFilter *pfRenderer)
static ULONG WINAPI fnCaptureGraphBuilder_Release(ICaptureGraphBuilder *iface)
static HRESULT WINAPI fnCaptureGraphBuilder_QueryInterface(ICaptureGraphBuilder *iface, REFIID riid, LPVOID *ppv)
static HRESULT find_unconnected_source_from_filter(CaptureGraphImpl *capture_graph, const GUID *category, const GUID *majortype, IBaseFilter *filter, IPin **ret)
static HRESULT WINAPI fnCaptureGraphBuilder_FindInterface(ICaptureGraphBuilder *iface, const GUID *pCategory, IBaseFilter *pf, REFIID riid, void **ppint)
static CaptureGraphImpl * impl_from_ICaptureGraphBuilder(ICaptureGraphBuilder *iface)
static HRESULT match_smart_tee_pin(CaptureGraphImpl *This, const GUID *pCategory, const GUID *pType, IUnknown *pSource, IPin **source_out)
static CaptureGraphImpl * impl_from_ICaptureGraphBuilder2(ICaptureGraphBuilder2 *iface)
static HRESULT WINAPI fnCaptureGraphBuilder2_ControlStream(ICaptureGraphBuilder2 *iface, const GUID *pCategory, const GUID *pType, IBaseFilter *pFilter, REFERENCE_TIME *pstart, REFERENCE_TIME *pstop, WORD wStartCookie, WORD wStopCookie)
static const ICaptureGraphBuilder2Vtbl builder2_Vtbl
static ULONG WINAPI fnCaptureGraphBuilder2_Release(ICaptureGraphBuilder2 *iface)
static HRESULT WINAPI fnCaptureGraphBuilder_SetOutputFileName(ICaptureGraphBuilder *iface, const GUID *pType, LPCOLESTR lpstrFile, IBaseFilter **ppf, IFileSinkFilter **ppSink)
static HRESULT WINAPI fnCaptureGraphBuilder2_SetFilterGraph(ICaptureGraphBuilder2 *iface, IGraphBuilder *pfg)
static ULONG WINAPI fnCaptureGraphBuilder_AddRef(ICaptureGraphBuilder *iface)
static HRESULT WINAPI fnCaptureGraphBuilder2_SetOutputFileName(ICaptureGraphBuilder2 *iface, const GUID *pType, LPCOLESTR lpstrFile, IBaseFilter **ppf, IFileSinkFilter **ppSink)
static HRESULT WINAPI fnCaptureGraphBuilder2_FindPin(ICaptureGraphBuilder2 *iface, IUnknown *pSource, PIN_DIRECTION pindir, const GUID *pCategory, const GUID *pType, BOOL fUnconnected, INT num, IPin **ppPin)
static HRESULT WINAPI fnCaptureGraphBuilder_ControlStream(ICaptureGraphBuilder *iface, const GUID *pCategory, IBaseFilter *pFilter, REFERENCE_TIME *pstart, REFERENCE_TIME *pstop, WORD wStartCookie, WORD wStopCookie)
static HRESULT WINAPI fnCaptureGraphBuilder2_QueryInterface(ICaptureGraphBuilder2 *iface, REFIID riid, LPVOID *ppv)
static HRESULT WINAPI fnCaptureGraphBuilder_AllocCapFile(ICaptureGraphBuilder *iface, LPCOLESTR lpstr, DWORDLONG dwlSize)
static HRESULT WINAPI fnCaptureGraphBuilder2_GetFilterGraph(ICaptureGraphBuilder2 *iface, IGraphBuilder **pfg)
static HRESULT find_unconnected_source_from_pin(CaptureGraphImpl *capture_graph, const GUID *category, const GUID *majortype, IPin *pin, IPin **ret)
static ULONG WINAPI fnCaptureGraphBuilder2_AddRef(ICaptureGraphBuilder2 *iface)
static HRESULT WINAPI fnCaptureGraphBuilder_SetFiltergraph(ICaptureGraphBuilder *iface, IGraphBuilder *pfg)
static HRESULT WINAPI fnCaptureGraphBuilder2_AllocCapFile(ICaptureGraphBuilder2 *iface, LPCOLESTR lpwstr, DWORDLONG dwlSize)
static const ICaptureGraphBuilderVtbl builder_Vtbl
static HRESULT WINAPI fnCaptureGraphBuilder2_RenderStream(ICaptureGraphBuilder2 *iface, const GUID *category, const GUID *majortype, IUnknown *source, IBaseFilter *pfCompressor, IBaseFilter *pfRenderer)
static HRESULT WINAPI fnCaptureGraphBuilder_GetFiltergraph(ICaptureGraphBuilder *iface, IGraphBuilder **pfg)
HRESULT capture_graph_create(IUnknown *outer, IUnknown **out)
static BOOL pin_matches(IPin *pin, PIN_DIRECTION dir, const GUID *category, const GUID *majortype, BOOL unconnected)
static HRESULT WINAPI fnCaptureGraphBuilder2_CopyCaptureFile(ICaptureGraphBuilder2 *iface, LPOLESTR lpwstrOld, LPOLESTR lpwstrNew, int fAllowEscAbort, IAMCopyCaptureFileProgress *pCallback)
const GUID IID_IKsPropertySet
const GUID IID_IBaseFilter
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
static __inline const char * wine_dbgstr_longlong(ULONGLONG ll)
BOOL WINAPI InitializeCriticalSectionEx(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount, IN DWORD flags)
#define IKsPropertySet_Release(p)
#define IKsPropertySet_Get(p, a, b, c, d, e, f, g)
FxPnpStateCallbackInfo * pCallback
unsigned long long DWORDLONG
#define IsEqualGUID(rguid1, rguid2)
#define IsEqualIID(riid1, riid2)
void WINAPI DeleteMediaType(AM_MEDIA_TYPE *pMediaType)
CRITICAL_SECTION csFilter
ICaptureGraphBuilder ICaptureGraphBuilder_iface
ICaptureGraphBuilder2 ICaptureGraphBuilder2_iface
#define CONTAINING_RECORD(address, type, field)
#define VFW_E_INVALID_DIRECTION
#define VFW_E_ENUM_OUT_OF_SYNC
#define VFW_E_NOT_CONNECTED
#define VFW_S_NOPREVIEWPIN
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define CLASS_E_NOAGGREGATION
#define RTL_CRITICAL_SECTION_FLAG_FORCE_DEBUG_INFO