static HRESULT WINAPI IAMMultiMediaStreamImpl_OpenFile(IAMMultiMediaStream* iface, LPCWSTR filename, DWORD flags) { IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); HRESULT ret = S_OK; IBaseFilter *BaseFilter = NULL; IEnumPins *EnumPins = NULL; IPin *ipin; PIN_DIRECTION pin_direction; const WCHAR sourceW[] = {'S','o','u','r','c','e',0}; TRACE("(%p/%p)->(%s,%x)\n", This, iface, debugstr_w(filename), flags); if (!filename) return E_POINTER; /* If Initialize was not called before, we do it here */ if (!This->pFilterGraph) ret = IAMMultiMediaStream_Initialize(iface, STREAMTYPE_READ, 0, NULL); if (SUCCEEDED(ret)) ret = IGraphBuilder_AddSourceFilter(This->pFilterGraph, filename, sourceW, &BaseFilter); if (SUCCEEDED(ret)) ret = IBaseFilter_EnumPins(BaseFilter, &EnumPins); if (SUCCEEDED(ret)) ret = IEnumPins_Next(EnumPins, 1, &ipin, NULL); if (SUCCEEDED(ret)) { ret = IPin_QueryDirection(ipin, &pin_direction); if (ret == S_OK && pin_direction == PINDIR_OUTPUT) This->ipin = ipin; } if (SUCCEEDED(ret) && !(flags & AMMSF_NORENDER)) ret = IGraphBuilder_Render(This->pFilterGraph, This->ipin); if (EnumPins) IEnumPins_Release(EnumPins); if (BaseFilter) IBaseFilter_Release(BaseFilter); return ret; }
static HRESULT WINAPI MediaDet_put_Filename(IMediaDet* iface, BSTR newVal) { static const WCHAR reader[] = {'R','e','a','d','e','r',0}; MediaDetImpl *This = impl_from_IMediaDet(iface); IGraphBuilder *gb; IBaseFilter *bf; HRESULT hr; TRACE("(%p)->(%s)\n", This, debugstr_w(newVal)); if (This->graph) { WARN("MSDN says not to call this method twice\n"); MD_cleanup(This); } hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IGraphBuilder, (void **) &gb); if (FAILED(hr)) return hr; hr = IGraphBuilder_AddSourceFilter(gb, newVal, reader, &bf); if (FAILED(hr)) { IGraphBuilder_Release(gb); return hr; } This->graph = gb; This->source = bf; hr = GetSplitter(This); if (FAILED(hr)) return hr; return MediaDet_put_CurrentStream(iface, 0); }
static HRESULT WINAPI IAMMultiMediaStreamImpl_OpenFile(IAMMultiMediaStream* iface, LPCWSTR pszFileName, DWORD dwFlags) { HRESULT ret; IAMMultiMediaStreamImpl *This = impl_from_IAMMultiMediaStream(iface); IFileSourceFilter *SourceFilter; IBaseFilter *BaseFilter; IEnumPins *EnumPins; IPin *ipin; PIN_DIRECTION pin_direction; TRACE("(%p/%p)->(%s,%x)\n", This, iface, debugstr_w(pszFileName), dwFlags); ret = CoCreateInstance(&CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, &IID_IFileSourceFilter, (void**)&SourceFilter); if(ret != S_OK) return ret; ret = IFileSourceFilter_Load(SourceFilter, pszFileName, NULL); if(ret != S_OK) { IFileSourceFilter_Release(SourceFilter); return ret; } ret = IFileSourceFilter_QueryInterface(SourceFilter, &IID_IBaseFilter, (void**)&BaseFilter); if(ret != S_OK) { IFileSourceFilter_Release(SourceFilter); return ret; } ret = IBaseFilter_EnumPins(BaseFilter, &EnumPins); if(ret != S_OK) { goto end; } ret = IEnumPins_Next(EnumPins, 1, &ipin, NULL); if(ret == S_OK) { ret = IPin_QueryDirection(ipin, &pin_direction); IEnumPins_Release(EnumPins); if(ret == S_OK && pin_direction == PINDIR_OUTPUT) This->ipin = ipin; else goto end; } else { IEnumPins_Release(EnumPins); goto end; } /* If Initialize was not called before, we do it here */ if (!This->pFilterGraph) { ret = IAMMultiMediaStream_Initialize(iface, STREAMTYPE_READ, 0, NULL); if (FAILED(ret)) goto end; } ret = IFilterGraph_QueryInterface(This->pFilterGraph, &IID_IGraphBuilder, (void**)&This->GraphBuilder); if(ret != S_OK) { goto end; } ret = IGraphBuilder_AddSourceFilter(This->GraphBuilder, pszFileName, pszFileName, &BaseFilter); end: IBaseFilter_Release(BaseFilter); IFileSourceFilter_Release(SourceFilter); return ret; }