IUnknown * CALLBACK QCAP_createCaptureGraphBuilder2(IUnknown *pUnkOuter, HRESULT *phr) { CaptureGraphImpl * pCapture = NULL; TRACE("(%p, %p)\n", pUnkOuter, phr); *phr = CLASS_E_NOAGGREGATION; if (pUnkOuter) { return NULL; } *phr = E_OUTOFMEMORY; pCapture = CoTaskMemAlloc(sizeof(CaptureGraphImpl)); if (pCapture) { pCapture->ICaptureGraphBuilder2_iface.lpVtbl = &builder2_Vtbl; pCapture->ICaptureGraphBuilder_iface.lpVtbl = &builder_Vtbl; pCapture->ref = 1; pCapture->mygraph = NULL; InitializeCriticalSection(&pCapture->csFilter); pCapture->csFilter.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": CaptureGraphImpl.csFilter"); *phr = S_OK; ObjectRefCount(TRUE); } return (IUnknown *)&pCapture->ICaptureGraphBuilder_iface; }
static HRESULT VfwPin_Construct( IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec, IPin ** ppPin ) { static const WCHAR wszOutputPinName[] = { 'O','u','t','p','u','t',0 }; PIN_INFO piOutput; HRESULT hr; *ppPin = NULL; piOutput.dir = PINDIR_OUTPUT; piOutput.pFilter = pBaseFilter; lstrcpyW(piOutput.achName, wszOutputPinName); hr = BaseOutputPin_Construct(&VfwPin_Vtbl, sizeof(VfwPinImpl), &piOutput, &output_BaseOutputFuncTable, pCritSec, ppPin); if (SUCCEEDED(hr)) { VfwPinImpl *pPinImpl = (VfwPinImpl*)*ppPin; pPinImpl->IKsPropertySet_iface.lpVtbl = &IKsPropertySet_VTable; ObjectRefCount(TRUE); } return hr; }
static ULONG WINAPI unknown_inner_Release(IUnknown *iface) { VfwCapture *This = impl_from_IUnknown(iface); ULONG ref = InterlockedDecrement(&This->filter.refCount); TRACE("(%p) ref=%d\n", This, ref); if (!ref) { IPin *conn = NULL; TRACE("destroying everything\n"); if (This->init) { if (This->filter.state != State_Stopped) qcap_driver_stop(This->driver_info, &This->filter.state); qcap_driver_destroy(This->driver_info); } IPin_ConnectedTo(This->pOutputPin, &conn); if (conn) { IPin_Disconnect(conn); IPin_Disconnect(This->pOutputPin); IPin_Release(conn); } IPin_Release(This->pOutputPin); BaseFilter_Destroy(&This->filter); CoTaskMemFree(This); ObjectRefCount(FALSE); } return ref; }
static ULONG WINAPI VfwPin_Release(IPin * iface) { VfwPinImpl *This = impl_from_IPin(iface); ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount); TRACE("() -> new refcount: %u\n", refCount); if (!refCount) { BaseOutputPin_Destroy(&This->pin); ObjectRefCount(FALSE); } return refCount; }
static ULONG WINAPI fnCaptureGraphBuilder2_Release(ICaptureGraphBuilder2 * iface) { CaptureGraphImpl *This = impl_from_ICaptureGraphBuilder2(iface); DWORD ref = InterlockedDecrement(&This->ref); TRACE("(%p/%p)->() Release from %d\n", This, iface, ref + 1); if (!ref) { This->csFilter.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->csFilter); if (This->mygraph) IGraphBuilder_Release(This->mygraph); CoTaskMemFree(This); ObjectRefCount(FALSE); } return ref; }
IUnknown * WINAPI QCAP_createVFWCaptureFilter(IUnknown *pUnkOuter, HRESULT *phr) { VfwCapture *pVfwCapture; HRESULT hr; TRACE("%p - %p\n", pUnkOuter, phr); *phr = E_OUTOFMEMORY; pVfwCapture = CoTaskMemAlloc( sizeof(VfwCapture) ); if (!pVfwCapture) return NULL; BaseFilter_Init(&pVfwCapture->filter, &VfwCapture_Vtbl, &CLSID_VfwCapture, (DWORD_PTR)(__FILE__ ": VfwCapture.csFilter"), &BaseFuncTable); pVfwCapture->IUnknown_inner.lpVtbl = &unknown_inner_vtbl; pVfwCapture->IAMStreamConfig_iface.lpVtbl = &IAMStreamConfig_VTable; pVfwCapture->IAMVideoProcAmp_iface.lpVtbl = &IAMVideoProcAmp_VTable; pVfwCapture->IPersistPropertyBag_iface.lpVtbl = &IPersistPropertyBag_VTable; pVfwCapture->init = FALSE; if (pUnkOuter) pVfwCapture->outer_unk = pUnkOuter; else pVfwCapture->outer_unk = &pVfwCapture->IUnknown_inner; hr = VfwPin_Construct(&pVfwCapture->filter.IBaseFilter_iface, &pVfwCapture->filter.csFilter, &pVfwCapture->pOutputPin); if (FAILED(hr)) { CoTaskMemFree(pVfwCapture); return NULL; } TRACE("-- created at %p\n", pVfwCapture); ObjectRefCount(TRUE); *phr = S_OK; return &pVfwCapture->IUnknown_inner; }