/* * Input Pin */ static HRESULT QT_RemoveOutputPins(QTSplitter *This) { HRESULT hr; TRACE("(%p)\n", This); if (This->pVideo_Pin) { OutputQueue_Destroy(This->pVideo_Pin->queue); hr = BaseOutputPinImpl_BreakConnect(&This->pVideo_Pin->pin); TRACE("Disconnect: %08x\n", hr); IPin_Release(&This->pVideo_Pin->pin.pin.IPin_iface); This->pVideo_Pin = NULL; } if (This->pAudio_Pin) { OutputQueue_Destroy(This->pAudio_Pin->queue); hr = BaseOutputPinImpl_BreakConnect(&This->pAudio_Pin->pin); TRACE("Disconnect: %08x\n", hr); IPin_Release(&This->pAudio_Pin->pin.pin.IPin_iface); This->pAudio_Pin = NULL; } BaseFilterImpl_IncrementPinVersion(&This->filter); return S_OK; }
static ULONG WINAPI NullRendererInner_Release(IUnknown * iface) { ICOM_THIS_MULTI(NullRendererImpl, IInner_vtbl, iface); ULONG refCount = InterlockedDecrement(&This->refCount); TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1); if (!refCount) { IPin *pConnectedTo; if (This->pClock) IReferenceClock_Release(This->pClock); if (SUCCEEDED(IPin_ConnectedTo((IPin *)This->pInputPin, &pConnectedTo))) { IPin_Disconnect(pConnectedTo); IPin_Release(pConnectedTo); } IPin_Disconnect((IPin *)This->pInputPin); IPin_Release((IPin *)This->pInputPin); This->lpVtbl = NULL; This->csFilter.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->csFilter); TRACE("Destroying Null Renderer\n"); CoTaskMemFree(This); return 0; } else return refCount; }
void Parser_Destroy(ParserImpl *This) { IPin *connected = NULL; ULONG pinref; assert(!This->filter.refCount); PullPin_WaitForStateChange(This->pInputPin, INFINITE); /* Don't need to clean up output pins, freeing input pin will do that */ IPin_ConnectedTo(&This->pInputPin->pin.IPin_iface, &connected); if (connected) { assert(IPin_Disconnect(connected) == S_OK); IPin_Release(connected); assert(IPin_Disconnect(&This->pInputPin->pin.IPin_iface) == S_OK); } pinref = IPin_Release(&This->pInputPin->pin.IPin_iface); if (pinref) { /* Valgrind could find this, if I kill it here */ ERR("pinref should be null, is %u, destroying anyway\n", pinref); assert((LONG)pinref > 0); while (pinref) pinref = IPin_Release(&This->pInputPin->pin.IPin_iface); } CoTaskMemFree(This->ppPins); TRACE("Destroying parser\n"); CoTaskMemFree(This); }
ULONG WINAPI BaseRendererImpl_Release(IBaseFilter* iface) { BaseRenderer *This = impl_from_IBaseFilter(iface); ULONG refCount = BaseFilterImpl_Release(iface); if (!refCount) { IPin *pConnectedTo; if (SUCCEEDED(IPin_ConnectedTo(&This->pInputPin->pin.IPin_iface, &pConnectedTo))) { IPin_Disconnect(pConnectedTo); IPin_Release(pConnectedTo); } IPin_Disconnect(&This->pInputPin->pin.IPin_iface); IPin_Release(&This->pInputPin->pin.IPin_iface); if (This->pPosition) IUnknown_Release(This->pPosition); This->csRenderLock.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->csRenderLock); BaseRendererImpl_ClearPendingSample(This); CloseHandle(This->evComplete); CloseHandle(This->ThreadSignal); CloseHandle(This->RenderEvent); QualityControlImpl_Destroy(This->qcimpl); } return refCount; }
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 void test_AviCo(void) { IPersistPropertyBag *persist_bag; IPin *pin, *in_pin, *out_pin; IEnumPins *enum_pins; IBaseFilter *avico; PIN_INFO pin_info; HRESULT hres; static const WCHAR inputW[] = {'I','n','p','u','t',0}; static const WCHAR outputW[] = {'O','u','t','p','u','t',0}; hres = CoCreateInstance(&CLSID_AVICo, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (void**)&avico); if(hres == REGDB_E_CLASSNOTREG) { win_skip("CLSID_AVICo not restered\n"); return; } ok(hres == S_OK, "Could not create CLSID_AVICo class: %08x\n", hres); hres = IBaseFilter_QueryInterface(avico, &IID_IPin, (void**)&pin); ok(hres == E_NOINTERFACE, "QueryInterface(IID_IPin) returned: %08x\n", hres); hres = IBaseFilter_QueryInterface(avico, &IID_IPersistPropertyBag, (void**)&persist_bag); ok(hres == S_OK, "QueryInterface(IID_IPersistPropertyBag) returned: %08x\n", hres); SET_EXPECT(Read_FccHandler); hres = IPersistPropertyBag_Load(persist_bag, &PropertyBag, NULL); ok(hres == S_OK, "Load failed: %08x\n", hres); CHECK_CALLED(Read_FccHandler); IPersistPropertyBag_Release(persist_bag); hres = IBaseFilter_EnumPins(avico, &enum_pins); ok(hres == S_OK, "EnumPins failed: %08x\n", hres); hres = IEnumPins_Next(enum_pins, 1, &in_pin, NULL); ok(hres == S_OK, "Next failed: %08x\n", hres); hres = IPin_QueryPinInfo(in_pin, &pin_info); ok(hres == S_OK, "QueryPinInfo failed: %08x\n", hres); ok(pin_info.pFilter == avico, "pin_info.pFilter != avico\n"); ok(pin_info.dir == PINDIR_INPUT, "pin_info.dir = %d\n", pin_info.dir); ok(!lstrcmpW(pin_info.achName, inputW), "pin_info.achName = %s\n", wine_dbgstr_w(pin_info.achName)); hres = IEnumPins_Next(enum_pins, 1, &out_pin, NULL); ok(hres == S_OK, "Next failed: %08x\n", hres); hres = IPin_QueryPinInfo(out_pin, &pin_info); ok(hres == S_OK, "QueryPinInfo failed: %08x\n", hres); ok(pin_info.pFilter == avico, "pin_info.pFilter != avico\n"); ok(pin_info.dir == PINDIR_OUTPUT, "pin_info.dir = %d\n", pin_info.dir); ok(!lstrcmpW(pin_info.achName, outputW), "pin_info.achName = %s\n", wine_dbgstr_w(pin_info.achName)); IEnumPins_Release(enum_pins); IPin_Release(in_pin); IPin_Release(out_pin); IBaseFilter_Release(avico); }
static void QT_Destroy(QTSplitter *This) { IPin *connected = NULL; ULONG pinref; TRACE("Destroying\n"); EnterCriticalSection(&This->csReceive); /* Don't need to clean up output pins, disconnecting input pin will do that */ IPin_ConnectedTo(&This->pInputPin.pin.IPin_iface, &connected); if (connected) { IPin_Disconnect(connected); IPin_Release(connected); } pinref = IPin_Release(&This->pInputPin.pin.IPin_iface); if (pinref) { ERR("pinref should be null, is %u, destroying anyway\n", pinref); assert((LONG)pinref > 0); while (pinref) pinref = IPin_Release(&This->pInputPin.pin.IPin_iface); } if (This->pQTMovie) { DisposeMovie(This->pQTMovie); This->pQTMovie = NULL; } if (This->vContext) QTVisualContextRelease(This->vContext); if (This->aSession) MovieAudioExtractionEnd(This->aSession); ExitMoviesOnThread(); LeaveCriticalSection(&This->csReceive); if (This->loaderThread) { WaitForSingleObject(This->loaderThread, INFINITE); CloseHandle(This->loaderThread); } if (This->splitterThread) { SetEvent(This->runEvent); WaitForSingleObject(This->splitterThread, INFINITE); CloseHandle(This->splitterThread); } CloseHandle(This->runEvent); This->csReceive.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->csReceive); BaseFilter_Destroy(&This->filter); CoTaskMemFree(This); }
HRESULT WINAPI QualityControlImpl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm) { QualityControlImpl *This = impl_from_IQualityControl(iface); HRESULT hr = S_FALSE; TRACE("%p %p { 0x%x %u " XTIME_FMT " " XTIME_FMT " }\n", This, sender, qm.Type, qm.Proportion, XTIME(qm.Late), XTIME(qm.TimeStamp)); if (This->tonotify) return IQualityControl_Notify(This->tonotify, This->self, qm); if (This->input) { IPin *to = NULL; IPin_ConnectedTo(This->input, &to); if (to) { IQualityControl *qc = NULL; IPin_QueryInterface(to, &IID_IQualityControl, (void**)&qc); if (qc) { hr = IQualityControl_Notify(qc, This->self, qm); IQualityControl_Release(qc); } IPin_Release(to); } } return hr; }
static ULONG WINAPI IAMMultiMediaStreamImpl_Release(IAMMultiMediaStream* iface) { IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); ULONG ref = InterlockedDecrement(&This->ref); ULONG i; TRACE("(%p/%p)\n", iface, This); if (!ref) { for(i = 0; i < This->nbStreams; i++) IMediaStream_Release(This->pStreams[i]); if (This->ipin) IPin_Release(This->ipin); if (This->media_stream_filter) IBaseFilter_Release(This->media_stream_filter); if (This->media_seeking) IMediaSeeking_Release(This->media_seeking); if (This->media_control) IMediaControl_Release(This->media_control); if (This->pFilterGraph) IGraphBuilder_Release(This->pFilterGraph); HeapFree(GetProcessHeap(), 0, This); } return ref; }
static BOOL pin_matches(IPin *pin, PIN_DIRECTION direction, const GUID *cat, const GUID *type, BOOL unconnected) { IPin *partner; PIN_DIRECTION pindir; IPin_QueryDirection(pin, &pindir); if (pindir != direction) { TRACE("No match, wrong direction\n"); return FALSE; } if (unconnected && IPin_ConnectedTo(pin, &partner) == S_OK) { IPin_Release(partner); TRACE("No match, %p already connected to %p\n", pin, partner); return FALSE; } if (cat || type) FIXME("Ignoring category/type\n"); TRACE("Match made in heaven\n"); return TRUE; }
static HRESULT Parser_RemoveOutputPins(ParserImpl * This) { /* NOTE: should be in critical section when calling this function */ HRESULT hr; ULONG i; IPin ** ppOldPins = This->ppPins; TRACE("(%p)\n", This); /* reduce the pin array down to 1 (just our input pin) */ This->ppPins = CoTaskMemAlloc(sizeof(IPin *) * 1); memcpy(This->ppPins, ppOldPins, sizeof(IPin *) * 1); for (i = 0; i < This->cStreams; i++) { hr = ((BaseOutputPin *)ppOldPins[i + 1])->pFuncsTable->pfnBreakConnect((BaseOutputPin *)ppOldPins[i + 1]); TRACE("Disconnect: %08x\n", hr); IPin_Release(ppOldPins[i + 1]); } BaseFilterImpl_IncrementPinVersion(&This->filter); This->cStreams = 0; CoTaskMemFree(ppOldPins); return S_OK; }
static HRESULT WINAPI TransformFilter_InputPin_EndOfStream(IPin * iface) { BaseInputPin* This = impl_BaseInputPin_from_IPin(iface); TransformFilter* pTransform; IPin* ppin; HRESULT hr; TRACE("(%p)->()\n", iface); /* Since we process samples synchronously, just forward notification downstream */ pTransform = impl_from_IBaseFilter(This->pin.pinInfo.pFilter); if (!pTransform) hr = E_FAIL; else hr = IPin_ConnectedTo(pTransform->ppPins[1], &ppin); if (SUCCEEDED(hr)) { hr = IPin_EndOfStream(ppin); IPin_Release(ppin); } if (FAILED(hr)) ERR("%x\n", hr); return hr; }
static ULONG WINAPI DSoundRender_Release(IBaseFilter * iface) { DSoundRenderImpl *This = (DSoundRenderImpl *)iface; ULONG refCount = InterlockedDecrement(&This->refCount); TRACE("(%p)->() Release from %d\n", This, refCount + 1); if (!refCount) { IPin *pConnectedTo; if (This->pClock) IReferenceClock_Release(This->pClock); if (This->dsbuffer) IDirectSoundBuffer_Release(This->dsbuffer); This->dsbuffer = NULL; if (This->dsound) IDirectSound_Release(This->dsound); This->dsound = NULL; if (SUCCEEDED(IPin_ConnectedTo((IPin *)This->pInputPin, &pConnectedTo))) { IPin_Disconnect(pConnectedTo); IPin_Release(pConnectedTo); } IPin_Disconnect((IPin *)This->pInputPin); IPin_Release((IPin *)This->pInputPin); This->lpVtbl = NULL; This->IBasicAudio_vtbl = NULL; This->csFilter.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->csFilter); CloseHandle(This->state_change); CloseHandle(This->blocked); TRACE("Destroying Audio Renderer\n"); CoTaskMemFree(This); return 0; } else return refCount; }
static ULONG WINAPI TransformFilter_Release(IBaseFilter * iface) { TransformFilterImpl *This = (TransformFilterImpl *)iface; ULONG refCount = InterlockedDecrement(&This->refCount); TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1); if (!refCount) { ULONG i; if (This->pClock) IReferenceClock_Release(This->pClock); for (i = 0; i < This->npins; i++) { IPin *pConnectedTo; if (SUCCEEDED(IPin_ConnectedTo(This->ppPins[i], &pConnectedTo))) { IPin_Disconnect(pConnectedTo); IPin_Release(pConnectedTo); } IPin_Disconnect(This->ppPins[i]); IPin_Release(This->ppPins[i]); } CoTaskMemFree(This->ppPins); This->lpVtbl = NULL; This->csFilter.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->csFilter); TRACE("Destroying transform filter\n"); FreeMediaType(&This->pmt); CoTaskMemFree(This); return 0; } else return refCount; }
static ULONG WINAPI DSoundRender_Release(IBaseFilter * iface) { DSoundRenderImpl *This = (DSoundRenderImpl *)iface; ULONG refCount = BaseFilterImpl_Release(iface); TRACE("(%p)->() Release from %d\n", This, refCount + 1); if (!refCount) { IPin *pConnectedTo; if (This->dsbuffer) IDirectSoundBuffer_Release(This->dsbuffer); This->dsbuffer = NULL; if (This->dsound) IDirectSound_Release(This->dsound); This->dsound = NULL; if (SUCCEEDED(IPin_ConnectedTo((IPin *)This->pInputPin, &pConnectedTo))) { IPin_Disconnect(pConnectedTo); IPin_Release(pConnectedTo); } IPin_Disconnect((IPin *)This->pInputPin); IPin_Release((IPin *)This->pInputPin); This->IBasicAudio_vtbl = NULL; if (This->seekthru_unk) IUnknown_Release(This->seekthru_unk); CloseHandle(This->state_change); CloseHandle(This->blocked); TRACE("Destroying Audio Renderer\n"); CoTaskMemFree(This); return 0; } else return refCount; }
static HRESULT WINAPI fnCaptureGraphBuilder2_RenderStream(ICaptureGraphBuilder2 * iface, const GUID *pCategory, const GUID *pType, IUnknown *pSource, IBaseFilter *pfCompressor, IBaseFilter *pfRenderer) { CaptureGraphImpl *This = impl_from_ICaptureGraphBuilder2(iface); IPin *pin_in = NULL; IPin *pin_out = NULL; HRESULT hr; FIXME("(%p/%p)->(%s, %s, %p, %p, %p) Stub!\n", This, iface, debugstr_guid(pCategory), debugstr_guid(pType), pSource, pfCompressor, pfRenderer); if (pfCompressor) FIXME("Intermediate streams not supported yet\n"); if (!This->mygraph) { FIXME("Need a capture graph\n"); return E_UNEXPECTED; } ICaptureGraphBuilder2_FindPin(iface, pSource, PINDIR_OUTPUT, pCategory, pType, TRUE, 0, &pin_in); if (!pin_in) return E_FAIL; ICaptureGraphBuilder2_FindPin(iface, (IUnknown*)pfRenderer, PINDIR_INPUT, pCategory, pType, TRUE, 0, &pin_out); if (!pin_out) { IPin_Release(pin_in); return E_FAIL; } /* Uses 'Intelligent Connect', so Connect, not ConnectDirect here */ hr = IGraphBuilder_Connect(This->mygraph, pin_in, pin_out); IPin_Release(pin_in); IPin_Release(pin_out); return hr; }
HRESULT qcap_driver_stop(Capture *capBox, FILTER_STATE *state) { TRACE("%p -> (%p)\n", capBox, state); if (*state == State_Stopped) return S_OK; EnterCriticalSection(&capBox->CritSect); if (capBox->thread) { if (*state == State_Paused) ResumeThread(capBox->thread); capBox->stopped = 1; capBox->thread = 0; if (capBox->iscommitted) { IMemInputPin *pMem = NULL; IMemAllocator * pAlloc = NULL; IPin *pConnect = NULL; HRESULT hr; capBox->iscommitted = 0; hr = IPin_ConnectedTo(capBox->pOut, &pConnect); if (SUCCEEDED(hr)) hr = IPin_QueryInterface(pConnect, &IID_IMemInputPin, (void **) &pMem); if (SUCCEEDED(hr)) hr = IMemInputPin_GetAllocator(pMem, &pAlloc); if (SUCCEEDED(hr)) hr = IMemAllocator_Decommit(pAlloc); if (pAlloc) IMemAllocator_Release(pAlloc); if (pMem) IMemInputPin_Release(pMem); if (pConnect) IPin_Release(pConnect); if (hr != S_OK && hr != VFW_E_NOT_COMMITTED) WARN("Decommitting allocator: %x\n", hr); } V4l_Unprepare(capBox); } *state = State_Stopped; LeaveCriticalSection(&capBox->CritSect); return S_OK; }
ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface) { TransformFilter *This = impl_from_IBaseFilter(iface); ULONG refCount = InterlockedDecrement(&This->filter.refCount); TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1); if (!refCount) { ULONG i; for (i = 0; i < This->npins; i++) { IPin *pConnectedTo; if (SUCCEEDED(IPin_ConnectedTo(This->ppPins[i], &pConnectedTo))) { IPin_Disconnect(pConnectedTo); IPin_Release(pConnectedTo); } IPin_Disconnect(This->ppPins[i]); IPin_Release(This->ppPins[i]); } CoTaskMemFree(This->ppPins); TRACE("Destroying transform filter\n"); This->csReceive.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->csReceive); FreeMediaType(&This->pmt); QualityControlImpl_Destroy(This->qcimpl); IUnknown_Release(This->seekthru_unk); BaseFilter_Destroy(&This->filter); CoTaskMemFree(This); return 0; } else return refCount; }
static HRESULT SetCurPin(MediaDetImpl *This, LONG strm) { IEnumPins *pins; IPin *pin; HRESULT hr; assert(This->splitter); assert(0 <= strm && strm < This->num_streams); if (This->cur_pin) { IPin_Release(This->cur_pin); This->cur_pin = NULL; } hr = IBaseFilter_EnumPins(This->splitter, &pins); if (FAILED(hr)) return hr; while (IEnumPins_Next(pins, 1, &pin, NULL) == S_OK && !This->cur_pin) { PIN_DIRECTION dir; hr = IPin_QueryDirection(pin, &dir); if (FAILED(hr)) { IPin_Release(pin); IEnumPins_Release(pins); return hr; } if (dir == PINDIR_OUTPUT && strm-- == 0) This->cur_pin = pin; else IPin_Release(pin); } IEnumPins_Release(pins); assert(This->cur_pin); return S_OK; }
static void MD_cleanup(MediaDetImpl *This) { if (This->cur_pin) IPin_Release(This->cur_pin); This->cur_pin = NULL; if (This->source) IBaseFilter_Release(This->source); This->source = NULL; if (This->splitter) IBaseFilter_Release(This->splitter); This->splitter = NULL; if (This->graph) IGraphBuilder_Release(This->graph); This->graph = NULL; This->num_streams = -1; This->cur_stream = 0; }
static HRESULT get_connected(PassThruImpl *This, REFIID riid, LPVOID *ppvObj) { HRESULT hr; IPin *pin; *ppvObj = NULL; hr = IPin_ConnectedTo(This->pin, &pin); if (FAILED(hr)) return VFW_E_NOT_CONNECTED; hr = IPin_QueryInterface(pin, riid, ppvObj); IPin_Release(pin); if (FAILED(hr)) hr = E_NOTIMPL; return hr; }
static gboolean gst_dshowvideodec_get_filter_output_format (GstDshowVideoDec * vdec, GUID * subtype, VIDEOINFOHEADER ** format, guint * size) { IPin *output_pin = NULL; IEnumMediaTypes *enum_mediatypes = NULL; HRESULT hres; ULONG fetched; BOOL ret = FALSE; if (!vdec->decfilter) return FALSE; if (!gst_dshow_get_pin_from_filter (vdec->decfilter, PINDIR_OUTPUT, &output_pin)) { GST_ELEMENT_ERROR (vdec, CORE, NEGOTIATION, ("failed getting ouput pin from the decoder"), (NULL)); return FALSE; } hres = IPin_EnumMediaTypes (output_pin, &enum_mediatypes); if (hres == S_OK && enum_mediatypes) { AM_MEDIA_TYPE *mediatype = NULL; IEnumMediaTypes_Reset (enum_mediatypes); while (hres = IEnumMoniker_Next (enum_mediatypes, 1, &mediatype, &fetched), hres == S_OK) { RPC_STATUS rpcstatus; if ((UuidCompare (&mediatype->subtype, subtype, &rpcstatus) == 0 && rpcstatus == RPC_S_OK) && (UuidCompare (&mediatype->formattype, &FORMAT_VideoInfo, &rpcstatus) == 0 && rpcstatus == RPC_S_OK)) { *size = mediatype->cbFormat; *format = g_malloc0 (*size); memcpy (*format, mediatype->pbFormat, *size); ret = TRUE; } gst_dshow_free_mediatype (mediatype); if (ret) break; } IEnumMediaTypes_Release (enum_mediatypes); } if (output_pin) { IPin_Release (output_pin); } return ret; }
static gboolean gst_dshowaudiosrc_unprepare (GstAudioSrc * asrc) { IPin *input_pin = NULL, *output_pin = NULL; HRESULT hres = S_FALSE; GstDshowAudioSrc *src = GST_DSHOWAUDIOSRC (asrc); /* disconnect filters */ gst_dshow_get_pin_from_filter (src->audio_cap_filter, PINDIR_OUTPUT, &output_pin); if (output_pin) { hres = IFilterGraph_Disconnect (src->filter_graph, output_pin); IPin_Release (output_pin); } gst_dshow_get_pin_from_filter (src->dshow_fakesink, PINDIR_INPUT, &input_pin); if (input_pin) { hres = IFilterGraph_Disconnect (src->filter_graph, input_pin); IPin_Release (input_pin); } return TRUE; }
ULONG WINAPI TransformFilterImpl_Release(IBaseFilter * iface) { TransformFilter *This = (TransformFilter *)iface; ULONG refCount = BaseFilterImpl_Release(iface); TRACE("(%p/%p)->() Release from %d\n", This, iface, refCount + 1); if (!refCount) { ULONG i; for (i = 0; i < This->npins; i++) { IPin *pConnectedTo; if (SUCCEEDED(IPin_ConnectedTo(This->ppPins[i], &pConnectedTo))) { IPin_Disconnect(pConnectedTo); IPin_Release(pConnectedTo); } IPin_Disconnect(This->ppPins[i]); IPin_Release(This->ppPins[i]); } CoTaskMemFree(This->ppPins); TRACE("Destroying transform filter\n"); FreeMediaType(&This->pmt); CoTaskMemFree(This); return 0; } else return refCount; }
static void test_basefilter(void) { IEnumPins *pin_enum = NULL; IBaseFilter *base = NULL; IPin *pins[2]; ULONG ref; HRESULT hr; IUnknown_QueryInterface(pAviSplitter, &IID_IBaseFilter, (void **)&base); if (base == NULL) { /* test_query_interface handles this case */ skip("No IBaseFilter\n"); return; } hr = IBaseFilter_EnumPins(base, NULL); ok(hr == E_POINTER, "hr = %08x and not E_POINTER\n", hr); hr= IBaseFilter_EnumPins(base, &pin_enum); ok(hr == S_OK, "hr = %08x and not S_OK\n", hr); hr = IEnumPins_Next(pin_enum, 1, NULL, NULL); ok(hr == E_POINTER, "hr = %08x and not E_POINTER\n", hr); hr = IEnumPins_Next(pin_enum, 2, pins, NULL); ok(hr == E_INVALIDARG, "hr = %08x and not E_INVALIDARG\n", hr); pins[0] = (void *)0xdead; pins[1] = (void *)0xdeed; hr = IEnumPins_Next(pin_enum, 2, pins, &ref); ok(hr == S_FALSE, "hr = %08x instead of S_FALSE\n", hr); ok(pins[0] != (void *)0xdead && pins[0] != NULL, "pins[0] = %p\n", pins[0]); if (pins[0] != (void *)0xdead && pins[0] != NULL) { test_pin(pins[0]); IPin_Release(pins[0]); } ok(pins[1] == (void *)0xdeed, "pins[1] = %p\n", pins[1]); ref = IEnumPins_Release(pin_enum); ok(ref == 0, "ref is %u and not 0!\n", ref); IBaseFilter_Release(base); }
static ULONG WINAPI IEnumMediaTypesImpl_Release(IEnumMediaTypes * iface) { IEnumMediaTypesImpl *This = impl_from_IEnumMediaTypes(iface); ULONG ref = InterlockedDecrement(&This->refCount); TRACE("(%p)->(): new ref = %u\n", iface, ref); if (!ref) { ULONG i; for (i = 0; i < This->enumMediaDetails.cMediaTypes; i++) FreeMediaType(&This->enumMediaDetails.pMediaTypes[i]); CoTaskMemFree(This->enumMediaDetails.pMediaTypes); IPin_Release(&This->basePin->IPin_iface); CoTaskMemFree(This); } return ref; }
static HRESULT WINAPI MediaDet_get_OutputStreams(IMediaDet* iface, LONG *pVal) { MediaDetImpl *This = impl_from_IMediaDet(iface); IEnumPins *pins; IPin *pin; HRESULT hr; TRACE("(%p)\n", This); if (!This->splitter) return E_INVALIDARG; if (This->num_streams != -1) { *pVal = This->num_streams; return S_OK; } *pVal = 0; hr = IBaseFilter_EnumPins(This->splitter, &pins); if (FAILED(hr)) return hr; while (IEnumPins_Next(pins, 1, &pin, NULL) == S_OK) { PIN_DIRECTION dir; hr = IPin_QueryDirection(pin, &dir); IPin_Release(pin); if (FAILED(hr)) { IEnumPins_Release(pins); return hr; } if (dir == PINDIR_OUTPUT) ++*pVal; } IEnumPins_Release(pins); This->num_streams = *pVal; return S_OK; }
static ULONG WINAPI MediaStreamFilterImpl_Release(IMediaStreamFilter *iface) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); ULONG ref = BaseFilterImpl_Release(&This->filter.IBaseFilter_iface); TRACE("(%p)->(): new ref = %u\n", iface, ref); if (!ref) { ULONG i; for (i = 0; i < This->nb_streams; i++) { IMediaStream_Release(This->streams[i]); IPin_Release(This->pins[i]); } HeapFree(GetProcessHeap(), 0, This); } return ref; }
HRESULT WINAPI QualityControlImpl_Notify(IQualityControl *iface, IBaseFilter *sender, Quality qm) { HRESULT hr = S_FALSE; QualityControlImpl *This = (QualityControlImpl*)iface; if (This->tonotify) return IQualityControl_Notify(This->tonotify, This->self, qm); if (This->input) { IPin *to = NULL; IPin_ConnectedTo(This->input, &to); if (to) { IQualityControl *qc = NULL; IPin_QueryInterface(to, &IID_IQualityControl, (void**)&qc); if (qc) { hr = IQualityControl_Notify(qc, This->self, qm); IQualityControl_Release(qc); } IPin_Release(to); } } return hr; }
static ULONG WINAPI MediaStreamFilterImpl_Release(IMediaStreamFilter *iface) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); ULONG ref = InterlockedDecrement(&This->filter.refCount); TRACE("(%p)->(): new ref = %u\n", iface, ref); if (!ref) { ULONG i; for (i = 0; i < This->nb_streams; i++) { IMediaStream_Release(This->streams[i]); IPin_Release(This->pins[i]); } CoTaskMemFree(This->streams); CoTaskMemFree(This->pins); BaseFilter_Destroy(&This->filter); HeapFree(GetProcessHeap(), 0, This); } return ref; }