static void test_ifiltermapper_from_filtergraph(void) { IFilterGraph2* pgraph2 = NULL; IFilterMapper2 *pMapper2 = NULL; IFilterGraph *filtergraph = NULL; HRESULT hr; ULONG refcount; hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (LPVOID*)&pgraph2); ok(hr == S_OK, "CoCreateInstance failed with %08x\n", hr); if (!pgraph2) goto out; hr = IFilterGraph2_QueryInterface(pgraph2, &IID_IFilterMapper2, (LPVOID*)&pMapper2); ok(hr == S_OK, "IFilterGraph2_QueryInterface failed with %08x\n", hr); if (!pMapper2) goto out; refcount = getRefcount((IUnknown*)pgraph2); ok(refcount == 2, "unexpected reference count: %u\n", refcount); refcount = getRefcount((IUnknown*)pMapper2); ok(refcount == 2, "unexpected reference count: %u\n", refcount); IFilterMapper2_AddRef(pMapper2); refcount = getRefcount((IUnknown*)pgraph2); ok(refcount == 3, "unexpected reference count: %u\n", refcount); refcount = getRefcount((IUnknown*)pMapper2); ok(refcount == 3, "unexpected reference count: %u\n", refcount); IFilterMapper2_Release(pMapper2); hr = IFilterMapper2_QueryInterface(pMapper2, &IID_IFilterGraph, (LPVOID*)&filtergraph); ok(hr == S_OK, "IFilterMapper2_QueryInterface failed with %08x\n", hr); if (!filtergraph) goto out; IFilterMapper2_Release(pMapper2); pMapper2 = NULL; IFilterGraph_Release(filtergraph); filtergraph = NULL; hr = CoCreateInstance(&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterMapper2, (LPVOID*)&pMapper2); ok(hr == S_OK, "CoCreateInstance failed with %08x\n", hr); if (!pMapper2) goto out; hr = IFilterMapper2_QueryInterface(pMapper2, &IID_IFilterGraph, (LPVOID*)&filtergraph); ok(hr == E_NOINTERFACE, "IFilterMapper2_QueryInterface unexpected result: %08x\n", hr); out: if (pMapper2) IFilterMapper2_Release(pMapper2); if (filtergraph) IFilterGraph_Release(filtergraph); if (pgraph2) IFilterGraph2_Release(pgraph2); }
static gboolean gst_dshowaudiosrc_close (GstAudioSrc * asrc) { GstDshowAudioSrc *src = GST_DSHOWAUDIOSRC (asrc); if (!src->filter_graph) return TRUE; /*remove filters from the graph */ IFilterGraph_RemoveFilter (src->filter_graph, src->audio_cap_filter); IFilterGraph_RemoveFilter (src->filter_graph, src->dshow_fakesink); /*release our gstreamer dshow sink */ IBaseFilter_Release (src->dshow_fakesink); src->dshow_fakesink = NULL; /*release media filter interface */ IMediaFilter_Release (src->media_filter); src->media_filter = NULL; /*release the filter graph manager */ IFilterGraph_Release (src->filter_graph); src->filter_graph = NULL; return TRUE; }
/** * Pops up a user dialog allowing them to adjust properties for the given filter, if possible. */ void dshow_show_filter_properties(IBaseFilter *device_filter, AVFormatContext *avctx) { ISpecifyPropertyPages *property_pages = NULL; IUnknown *device_filter_iunknown = NULL; HRESULT hr; FILTER_INFO filter_info = {0}; /* a warning on this line is false positive GCC bug 53119 AFAICT */ CAUUID ca_guid = {0}; hr = IBaseFilter_QueryInterface(device_filter, &IID_ISpecifyPropertyPages, (void **)&property_pages); if (hr != S_OK) { av_log(avctx, AV_LOG_WARNING, "requested filter does not have a property page to show"); goto end; } hr = IBaseFilter_QueryFilterInfo(device_filter, &filter_info); if (hr != S_OK) { goto fail; } hr = IBaseFilter_QueryInterface(device_filter, &IID_IUnknown, (void **)&device_filter_iunknown); if (hr != S_OK) { goto fail; } hr = ISpecifyPropertyPages_GetPages(property_pages, &ca_guid); if (hr != S_OK) { goto fail; } hr = OleCreatePropertyFrame(NULL, 0, 0, filter_info.achName, 1, &device_filter_iunknown, ca_guid.cElems, ca_guid.pElems, 0, 0, NULL); if (hr != S_OK) { goto fail; } goto end; fail: av_log(avctx, AV_LOG_ERROR, "Failure showing property pages for filter"); end: if (property_pages) ISpecifyPropertyPages_Release(property_pages); if (device_filter_iunknown) IUnknown_Release(device_filter_iunknown); if (filter_info.pGraph) IFilterGraph_Release(filter_info.pGraph); if (ca_guid.pElems) CoTaskMemFree(ca_guid.pElems); }
static gboolean gst_dshowvideodec_destroy_graph_and_filters (GstDshowVideoDec * vdec) { if (vdec->mediafilter) { IMediaFilter_Stop (vdec->mediafilter); } if (vdec->gstdshowsrcfilter) { IGstDshowInterface_Release (vdec->gstdshowsrcfilter); vdec->gstdshowsrcfilter = NULL; } if (vdec->srcfilter) { if (vdec->filtergraph) IFilterGraph_RemoveFilter (vdec->filtergraph, vdec->srcfilter); IBaseFilter_Release (vdec->srcfilter); vdec->srcfilter = NULL; } if (vdec->decfilter) { if (vdec->filtergraph) IFilterGraph_RemoveFilter (vdec->filtergraph, vdec->decfilter); IBaseFilter_Release (vdec->decfilter); vdec->decfilter = NULL; } if (vdec->sinkfilter) { if (vdec->filtergraph) IFilterGraph_RemoveFilter (vdec->filtergraph, vdec->sinkfilter); IBaseFilter_Release (vdec->sinkfilter); vdec->sinkfilter = NULL; } if (vdec->mediafilter) { IMediaFilter_Release (vdec->mediafilter); vdec->mediafilter = NULL; } if (vdec->filtergraph) { IFilterGraph_Release (vdec->filtergraph); vdec->filtergraph = NULL; } return TRUE; }
static gboolean gst_dshowvideodec_create_graph_and_filters (GstDshowVideoDec * vdec) { HRESULT hres = S_FALSE; GstDshowVideoDecClass *klass = (GstDshowVideoDecClass *) G_OBJECT_GET_CLASS (vdec); /* create the filter graph manager object */ hres = CoCreateInstance (&CLSID_FilterGraph, NULL, CLSCTX_INPROC, &IID_IFilterGraph, (LPVOID *) & vdec->filtergraph); if (hres != S_OK || !vdec->filtergraph) { GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't create an instance " "of the directshow graph manager (error=%d)", hres), (NULL)); goto error; } hres = IFilterGraph_QueryInterface (vdec->filtergraph, &IID_IMediaFilter, (void **) &vdec->mediafilter); if (hres != S_OK || !vdec->mediafilter) { GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't get IMediacontrol interface " "from the graph manager (error=%d)", hres), (NULL)); goto error; } /* create fake src filter */ hres = CoCreateInstance (&CLSID_DshowFakeSrc, NULL, CLSCTX_INPROC, &IID_IBaseFilter, (LPVOID *) & vdec->srcfilter); if (hres != S_OK || !vdec->srcfilter) { GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't create an instance " "of the directshow fakesrc (error=%d)", hres), (NULL)); goto error; } /* search a decoder filter and create it */ if (!gst_dshow_find_filter (klass->entry->input_majortype, klass->entry->input_subtype, klass->entry->output_majortype, klass->entry->output_subtype, klass->entry->preferred_filter_substring, &vdec->decfilter)) { GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't create an instance " "of the decoder filter"), (NULL)); goto error; } /* create fake sink filter */ hres = CoCreateInstance (&CLSID_DshowFakeSink, NULL, CLSCTX_INPROC, &IID_IBaseFilter, (LPVOID *) & vdec->sinkfilter); if (hres != S_OK || !vdec->sinkfilter) { GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't create an instance " "of the directshow fakesink (error=%d)", hres), (NULL)); goto error; } /* add filters to the graph */ hres = IFilterGraph_AddFilter (vdec->filtergraph, vdec->srcfilter, L"src"); if (hres != S_OK) { GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't add fakesrc filter " "to the graph (error=%d)", hres), (NULL)); goto error; } hres = IFilterGraph_AddFilter (vdec->filtergraph, vdec->decfilter, L"decoder"); if (hres != S_OK) { GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't add decoder filter " "to the graph (error=%d)", hres), (NULL)); goto error; } hres = IFilterGraph_AddFilter (vdec->filtergraph, vdec->sinkfilter, L"sink"); if (hres != S_OK) { GST_ELEMENT_ERROR (vdec, STREAM, FAILED, ("Can't add fakesink filter " "to the graph (error=%d)", hres), (NULL)); goto error; } return TRUE; error: if (vdec->srcfilter) { IBaseFilter_Release (vdec->srcfilter); vdec->srcfilter = NULL; } if (vdec->decfilter) { IBaseFilter_Release (vdec->decfilter); vdec->decfilter = NULL; } if (vdec->sinkfilter) { IBaseFilter_Release (vdec->sinkfilter); vdec->sinkfilter = NULL; } if (vdec->mediafilter) { IMediaFilter_Release (vdec->mediafilter); vdec->mediafilter = NULL; } if (vdec->filtergraph) { IFilterGraph_Release (vdec->filtergraph); vdec->filtergraph = NULL; } return FALSE; }
static gboolean gst_dshowaudiosrc_open (GstAudioSrc * asrc) { HRESULT hres = S_FALSE; GstDshowAudioSrc *src = GST_DSHOWAUDIOSRC (asrc); hres = CoCreateInstance (&CLSID_FilterGraph, NULL, CLSCTX_INPROC, &IID_IFilterGraph, (LPVOID *) & src->filter_graph); if (hres != S_OK || !src->filter_graph) { GST_CAT_ERROR (dshowaudiosrc_debug, "Can't create an instance of the directshow graph manager (error=%d)", hres); goto error; } hres = IFilterGraph_QueryInterface (src->filter_graph, &IID_IMediaFilter, (void **) &src->media_filter); if (hres != S_OK || !src->media_filter) { GST_CAT_ERROR (dshowaudiosrc_debug, "Can't get IMediacontrol interface from the graph manager (error=%d)", hres); goto error; } hres = CoCreateInstance (&CLSID_DshowFakeSink, NULL, CLSCTX_INPROC, &IID_IBaseFilter, (LPVOID *) & src->dshow_fakesink); if (hres != S_OK || !src->dshow_fakesink) { GST_CAT_ERROR (dshowaudiosrc_debug, "Can't create an instance of the directshow fakesink (error=%d)", hres); goto error; } hres = IFilterGraph_AddFilter (src->filter_graph, src->audio_cap_filter, L"capture"); if (hres != S_OK) { GST_CAT_ERROR (dshowaudiosrc_debug, "Can't add the directshow capture filter to the graph (error=%d)", hres); goto error; } hres = IFilterGraph_AddFilter (src->filter_graph, src->dshow_fakesink, L"fakesink"); if (hres != S_OK) { GST_CAT_ERROR (dshowaudiosrc_debug, "Can't add our fakesink filter to the graph (error=%d)", hres); goto error; } return TRUE; error: if (src->dshow_fakesink) { IBaseFilter_Release (src->dshow_fakesink); src->dshow_fakesink = NULL; } if (src->media_filter) { IMediaFilter_Release (src->media_filter); src->media_filter = NULL; } if (src->filter_graph) { IFilterGraph_Release (src->filter_graph); src->filter_graph = NULL; } return FALSE; }