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; }
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; }