static ULONG WINAPI MediaStreamFilterImpl_AddRef(IMediaStreamFilter *iface) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); ULONG ref = BaseFilterImpl_AddRef(&This->filter.IBaseFilter_iface); TRACE("(%p)->(): new ref = %u\n", iface, ref); return ref; }
static HRESULT WINAPI BasePinImpl_CheckMediaType(BasePin *This, const AM_MEDIA_TYPE *pmt) { IMediaStreamFilterImpl *filter = impl_from_IMediaStreamFilter((IMediaStreamFilter*)This->pinInfo.pFilter); MSPID purpose_id; ULONG i; TRACE("Checking media type %s - %s\n", debugstr_guid(&pmt->majortype), debugstr_guid(&pmt->subtype)); /* Find which stream is associated with the pin */ for (i = 0; i < filter->nb_streams; i++) if (&This->IPin_iface == filter->pins[i]) break; if (i == filter->nb_streams) return S_FALSE; if (FAILED(IMediaStream_GetInformation(filter->streams[i], &purpose_id, NULL))) return S_FALSE; TRACE("Checking stream with purpose id %s\n", debugstr_guid(&purpose_id)); if (IsEqualGUID(&purpose_id, &MSPID_PrimaryVideo) && IsEqualGUID(&pmt->majortype, &MEDIATYPE_Video)) { if (IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB1) || IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB4) || IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB8) || IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB565) || IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB555) || IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB24) || IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_RGB32)) { TRACE("Video sub-type %s matches\n", debugstr_guid(&pmt->subtype)); return S_OK; } } else if (IsEqualGUID(&purpose_id, &MSPID_PrimaryAudio) && IsEqualGUID(&pmt->majortype, &MEDIATYPE_Audio)) { if (IsEqualGUID(&pmt->subtype, &MEDIASUBTYPE_PCM)) { TRACE("Audio sub-type %s matches\n", debugstr_guid(&pmt->subtype)); return S_OK; } } return S_FALSE; }
static HRESULT WINAPI MediaStreamFilterImpl_AddMediaStream(IMediaStreamFilter* iface, IAMMediaStream *pAMMediaStream) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); IMediaStream** streams; IPin** pins; MediaStreamFilter_InputPin* pin; HRESULT hr; PIN_INFO info; MSPID purpose_id; TRACE("(%p)->(%p)\n", iface, pAMMediaStream); streams = CoTaskMemRealloc(This->streams, (This->nb_streams + 1) * sizeof(IMediaStream*)); if (!streams) return E_OUTOFMEMORY; This->streams = streams; pins = CoTaskMemRealloc(This->pins, (This->nb_streams + 1) * sizeof(IPin*)); if (!pins) return E_OUTOFMEMORY; This->pins = pins; info.pFilter = (IBaseFilter*)&This->filter; info.dir = PINDIR_INPUT; hr = IAMMediaStream_GetInformation(pAMMediaStream, &purpose_id, NULL); if (FAILED(hr)) return hr; /* Pin name is "I{guid MSPID_PrimaryVideo or MSPID_PrimaryAudio}" */ info.achName[0] = 'I'; StringFromGUID2(&purpose_id, info.achName + 1, 40); hr = BaseInputPin_Construct(&MediaStreamFilter_InputPin_Vtbl, sizeof(BaseInputPin), &info, &input_BaseFuncTable, &input_BaseInputFuncTable, &This->filter.csFilter, NULL, &This->pins[This->nb_streams]); if (FAILED(hr)) return hr; pin = (MediaStreamFilter_InputPin*)This->pins[This->nb_streams]; pin->pin.pin.pinInfo.pFilter = (LPVOID)This; This->streams[This->nb_streams] = (IMediaStream*)pAMMediaStream; This->nb_streams++; IMediaStream_AddRef((IMediaStream*)pAMMediaStream); 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; }
static HRESULT WINAPI MediaStreamFilterImpl_GetMediaStream(IMediaStreamFilter* iface, REFMSPID idPurpose, IMediaStream **ppMediaStream) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); MSPID purpose_id; unsigned int i; TRACE("(%p)->(%s,%p)\n", iface, debugstr_guid(idPurpose), ppMediaStream); for (i = 0; i < This->nb_streams; i++) { IMediaStream_GetInformation(This->streams[i], &purpose_id, NULL); if (IsEqualIID(&purpose_id, idPurpose)) { *ppMediaStream = This->streams[i]; IMediaStream_AddRef(*ppMediaStream); return S_OK; } } return MS_E_NOSTREAM; }
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; }
static HRESULT WINAPI MediaStreamFilterImpl_QueryVendorInfo(IMediaStreamFilter *iface, LPWSTR *vendor_info) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); return BaseFilterImpl_QueryVendorInfo(&This->filter.IBaseFilter_iface, vendor_info); }
static HRESULT WINAPI MediaStreamFilterImpl_JoinFilterGraph(IMediaStreamFilter *iface, IFilterGraph *graph, LPCWSTR name) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); return BaseFilterImpl_JoinFilterGraph(&This->filter.IBaseFilter_iface, graph, name); }
static HRESULT WINAPI MediaStreamFilterImpl_QueryFilterInfo(IMediaStreamFilter *iface, FILTER_INFO *info) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); return BaseFilterImpl_QueryFilterInfo(&This->filter.IBaseFilter_iface, info); }
static HRESULT WINAPI MediaStreamFilterImpl_EnumPins(IMediaStreamFilter *iface, IEnumPins **enum_pins) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); return BaseFilterImpl_EnumPins(&This->filter.IBaseFilter_iface, enum_pins); }
static HRESULT WINAPI MediaStreamFilterImpl_GetSyncSource(IMediaStreamFilter *iface, IReferenceClock **clock) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); return BaseFilterImpl_GetSyncSource(&This->filter.IBaseFilter_iface, clock); }
static HRESULT WINAPI MediaStreamFilterImpl_GetState(IMediaStreamFilter *iface, DWORD ms_timeout, FILTER_STATE *state) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); return BaseFilterImpl_GetState(&This->filter.IBaseFilter_iface, ms_timeout, state); }
static HRESULT WINAPI MediaStreamFilterImpl_GetClassID(IMediaStreamFilter *iface, CLSID *clsid) { IMediaStreamFilterImpl *This = impl_from_IMediaStreamFilter(iface); return BaseFilterImpl_GetClassID(&This->filter.IBaseFilter_iface, clsid); }