static IPin* WINAPI BaseRenderer_GetPin(BaseFilter *iface, int pos) { BaseRenderer *This = impl_from_BaseFilter(iface); if (pos >= 1 || pos < 0) return NULL; IPin_AddRef(&This->pInputPin->pin.IPin_iface); return &This->pInputPin->pin.IPin_iface; }
static IPin* WINAPI DSoundRender_GetPin(BaseFilter *iface, int pos) { DSoundRenderImpl *This = (DSoundRenderImpl *)iface; if (pos >= 1 || pos < 0) return NULL; IPin_AddRef((IPin*)This->pInputPin); return (IPin*)This->pInputPin; }
static IPin* WINAPI VfwCapture_GetPin(BaseFilter *iface, int pos) { VfwCapture *This = impl_from_BaseFilter(iface); if (pos >= 1 || pos < 0) return NULL; IPin_AddRef(This->pOutputPin); return This->pOutputPin; }
static IPin* WINAPI TransformFilter_GetPin(BaseFilter *iface, int pos) { TransformFilter *This = impl_from_BaseFilter(iface); if (pos >= This->npins || pos < 0) return NULL; IPin_AddRef(This->ppPins[pos]); return This->ppPins[pos]; }
static IPin* WINAPI MediaStreamFilterImpl_GetPin(BaseFilter *iface, int pos) { IMediaStreamFilterImpl* This = (IMediaStreamFilterImpl*)iface; if (pos < This->nb_streams) { IPin_AddRef(This->pins[pos]); return This->pins[pos]; } return NULL; }
/* FIXME: WRONG */ static IPin* WINAPI Parser_GetPin(BaseFilter *iface, int pos) { ParserImpl *This = impl_from_BaseFilter(iface); TRACE("Asking for pos %x\n", pos); /* Input pin also has a pin, hence the > and not >= */ if (pos > This->cStreams || pos < 0) return NULL; IPin_AddRef(This->ppPins[pos]); return This->ppPins[pos]; }
/* IBaseFilter */ static HRESULT WINAPI SampleGrabber_IBaseFilter_FindPin(IBaseFilter *iface, LPCWSTR id, IPin **pin) { SG_Impl *This = impl_from_IBaseFilter(iface); TRACE("(%p)->(%s, %p)\n", This, debugstr_w(id), pin); if (!id || !pin) return E_POINTER; if (!lstrcmpiW(id,pin_in_name)) { *pin = &This->pin_in.IPin_iface; IPin_AddRef(*pin); return S_OK; } else if (!lstrcmpiW(id,pin_out_name)) { *pin = &This->pin_out.IPin_iface; IPin_AddRef(*pin); return S_OK; } *pin = NULL; return VFW_E_NOT_FOUND; }
static HRESULT DSoundRender_GetPin(IBaseFilter *iface, ULONG pos, IPin **pin, DWORD *lastsynctick) { DSoundRenderImpl *This = (DSoundRenderImpl *)iface; /* Our pins are static, not changing so setting static tick count is ok */ *lastsynctick = 0; if (pos >= 1) return S_FALSE; *pin = (IPin *)This->pInputPin; IPin_AddRef(*pin); return S_OK; }
static HRESULT TransformFilter_GetPin(IBaseFilter *iface, ULONG pos, IPin **pin, DWORD *lastsynctick) { TransformFilterImpl *This = (TransformFilterImpl *)iface; /* Our pins are static, not changing so setting static tick count is ok */ *lastsynctick = 0; if (pos >= This->npins) return S_FALSE; *pin = This->ppPins[pos]; IPin_AddRef(*pin); return S_OK; }
static IPin *WINAPI SampleGrabber_GetPin(BaseFilter *iface, int pos) { SG_Impl *This = impl_from_BaseFilter(iface); IPin *pin; if (pos == 0) pin = &This->pin_in.IPin_iface; else if (pos == 1) pin = &This->pin_out.IPin_iface; else return NULL; IPin_AddRef(pin); return pin; }
/* IPin */ static HRESULT WINAPI SampleGrabber_IPin_ConnectedTo(IPin *iface, IPin **pin) { SG_Pin *This = impl_from_IPin(iface); TRACE("(%p)->(%p) pair = %p\n", This, pin, This->pair); if (!pin) return E_POINTER; *pin = This->pair; if (*pin) { IPin_AddRef(*pin); return S_OK; } return VFW_E_NOT_CONNECTED; }
static IPin* WINAPI QT_GetPin(BaseFilter *iface, int pos) { QTSplitter *This = impl_from_BaseFilter(iface); TRACE("Asking for pos %x\n", pos); if (pos > 2 || pos < 0) return NULL; switch (pos) { case 0: IPin_AddRef(&This->pInputPin.pin.IPin_iface); return &This->pInputPin.pin.IPin_iface; case 1: if (This->pVideo_Pin) IPin_AddRef(&This->pVideo_Pin->pin.pin.IPin_iface); return &This->pVideo_Pin->pin.pin.IPin_iface; case 2: if (This->pAudio_Pin) IPin_AddRef(&This->pAudio_Pin->pin.pin.IPin_iface); return &This->pAudio_Pin->pin.pin.IPin_iface; default: return NULL; } }
static HRESULT WINAPI NullRenderer_FindPin(IBaseFilter * iface, LPCWSTR Id, IPin **ppPin) { NullRendererImpl *This = (NullRendererImpl *)iface; TRACE("(%p/%p)->(%p,%p)\n", This, iface, debugstr_w(Id), ppPin); if (!Id || !ppPin) return E_POINTER; if (!lstrcmpiW(Id,wcsInputPinName) || !lstrcmpiW(Id,wcsAltInputPinName)) { *ppPin = (IPin *)This->pInputPin; IPin_AddRef(*ppPin); return S_OK; } *ppPin = NULL; return VFW_E_NOT_FOUND; }
HRESULT WINAPI BaseRendererImpl_FindPin(IBaseFilter * iface, LPCWSTR Id, IPin **ppPin) { BaseRenderer *This = impl_from_IBaseFilter(iface); TRACE("(%p)->(%p,%p)\n", This, debugstr_w(Id), ppPin); if (!Id || !ppPin) return E_POINTER; if (!lstrcmpiW(Id,wcsInputPinName) || !lstrcmpiW(Id,wcsAltInputPinName)) { *ppPin = &This->pInputPin->pin.IPin_iface; IPin_AddRef(*ppPin); return S_OK; } *ppPin = NULL; return VFW_E_NOT_FOUND; }
/* IPin - input pin */ static HRESULT WINAPI SampleGrabber_In_IPin_QueryInternalConnections(IPin *iface, IPin **pins, ULONG *nPins) { SG_Pin *This = impl_from_IPin(iface); TRACE("(%p)->(%p, %p) size = %u\n", This, pins, nPins, (nPins ? *nPins : 0)); if (!nPins) return E_POINTER; if (*nPins) { if (!pins) return E_POINTER; IPin_AddRef(&This->sg->pin_out.IPin_iface); *pins = &This->sg->pin_out.IPin_iface; *nPins = 1; return S_OK; } *nPins = 1; return S_FALSE; }
HRESULT WINAPI EnumMediaTypes_Construct(BasePin *basePin, BasePin_GetMediaType enumFunc, BasePin_GetMediaTypeVersion versionFunc, IEnumMediaTypes ** ppEnum) { ULONG i; IEnumMediaTypesImpl * pEnumMediaTypes = CoTaskMemAlloc(sizeof(IEnumMediaTypesImpl)); AM_MEDIA_TYPE amt; *ppEnum = NULL; if (!pEnumMediaTypes) return E_OUTOFMEMORY; pEnumMediaTypes->IEnumMediaTypes_iface.lpVtbl = &IEnumMediaTypesImpl_Vtbl; pEnumMediaTypes->refCount = 1; pEnumMediaTypes->uIndex = 0; pEnumMediaTypes->enumMediaFunction = enumFunc; pEnumMediaTypes->mediaVersionFunction = versionFunc; IPin_AddRef(&basePin->IPin_iface); pEnumMediaTypes->basePin = basePin; i = 0; while (enumFunc(basePin, i, &amt) == S_OK) { FreeMediaType(&amt); i++; } pEnumMediaTypes->enumMediaDetails.cMediaTypes = i; pEnumMediaTypes->enumMediaDetails.pMediaTypes = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE) * i); memset(pEnumMediaTypes->enumMediaDetails.pMediaTypes, 0, sizeof(AM_MEDIA_TYPE) * i); for (i = 0; i < pEnumMediaTypes->enumMediaDetails.cMediaTypes; i++) { HRESULT hr; if (FAILED(hr = enumFunc(basePin, i, &pEnumMediaTypes->enumMediaDetails.pMediaTypes[i]))) { IEnumMediaTypes_Release(&pEnumMediaTypes->IEnumMediaTypes_iface); return hr; } } *ppEnum = &pEnumMediaTypes->IEnumMediaTypes_iface; pEnumMediaTypes->currentVersion = versionFunc(basePin); return S_OK; }
/* IEnumPins */ static HRESULT WINAPI Fixed_IEnumPins_Next(IEnumPins *iface, ULONG nPins, IPin **pins, ULONG *fetched) { PE_Impl *This = (PE_Impl *)iface; ULONG count = 0; TRACE("(%p)->(%u, %p, %p) index = %u\n", This, nPins, pins, fetched, This->index); if (!nPins) return E_INVALIDARG; if (!pins || ((nPins != 1) && !fetched)) return E_POINTER; while ((count < nPins) && (This->index < This->numPins)) { IPin *pin = This->pins[This->index++]; IPin_AddRef(pin); pins[count++] = pin; } if (fetched) *fetched = count; return (count == nPins) ? S_OK : S_FALSE; }
static IPin* WINAPI AVICompressor_GetPin(BaseFilter *iface, int pos) { AVICompressor *This = impl_from_BaseFilter(iface); IPin *ret; TRACE("(%p)->(%d)\n", This, pos); switch(pos) { case 0: ret = &This->in->pin.IPin_iface; break; case 1: ret = &This->out->pin.IPin_iface; break; default: TRACE("No pin %d\n", pos); return NULL; }; IPin_AddRef(ret); return ret; }
static ULONG WINAPI KSP_AddRef(IKsPropertySet * iface) { VfwPinImpl *This = impl_from_IKsPropertySet(iface); return IPin_AddRef(&This->pin.pin.IPin_iface); }
static GstCaps * gst_dshowaudiosrc_getcaps_from_streamcaps (GstDshowAudioSrc * src, IPin * pin, IAMStreamConfig * streamcaps) { GstCaps *caps = NULL; HRESULT hres = S_OK; RPC_STATUS rpcstatus; int icount = 0; int isize = 0; AUDIO_STREAM_CONFIG_CAPS ascc; int i = 0; if (!streamcaps) return NULL; IAMStreamConfig_GetNumberOfCapabilities (streamcaps, &icount, &isize); if (isize != sizeof (ascc)) return NULL; for (; i < icount; i++) { GstCapturePinMediaType *pin_mediatype = g_new0 (GstCapturePinMediaType, 1); IPin_AddRef (pin); pin_mediatype->capture_pin = pin; hres = IAMStreamConfig_GetStreamCaps (streamcaps, i, &pin_mediatype->mediatype, (BYTE *) & ascc); if (hres == S_OK && pin_mediatype->mediatype) { GstCaps *mediacaps = NULL; if (!caps) caps = gst_caps_new_empty (); if ((UuidCompare (&pin_mediatype->mediatype->subtype, &MEDIASUBTYPE_PCM, &rpcstatus) == 0 && rpcstatus == RPC_S_OK) && (UuidCompare (&pin_mediatype->mediatype->formattype, &FORMAT_WaveFormatEx, &rpcstatus) == 0 && rpcstatus == RPC_S_OK)) { WAVEFORMATEX *wavformat = (WAVEFORMATEX *) pin_mediatype->mediatype->pbFormat; mediacaps = gst_caps_new_simple ("audio/x-raw-int", "width", G_TYPE_INT, wavformat->wBitsPerSample, "depth", G_TYPE_INT, wavformat->wBitsPerSample, "endianness", G_TYPE_INT, G_BYTE_ORDER, "signed", G_TYPE_BOOLEAN, TRUE, "channels", G_TYPE_INT, wavformat->nChannels, "rate", G_TYPE_INT, wavformat->nSamplesPerSec, NULL); if (mediacaps) { src->pins_mediatypes = g_list_append (src->pins_mediatypes, pin_mediatype); gst_caps_append (caps, mediacaps); } else { gst_dshow_free_pin_mediatype (pin_mediatype); } } else { gst_dshow_free_pin_mediatype (pin_mediatype); } } else { gst_dshow_free_pin_mediatype (pin_mediatype); } } if (caps && gst_caps_is_empty (caps)) { gst_caps_unref (caps); caps = NULL; } return caps; }
static HRESULT WINAPI DSoundRender_InputPin_ReceiveConnection(IPin * iface, IPin * pReceivePin, const AM_MEDIA_TYPE * pmt) { BaseInputPin *This = (BaseInputPin *)iface; PIN_DIRECTION pindirReceive; DSoundRenderImpl *DSImpl; HRESULT hr = S_OK; TRACE("(%p)->(%p, %p)\n", This, pReceivePin, pmt); dump_AM_MEDIA_TYPE(pmt); EnterCriticalSection(This->pin.pCritSec); { DSImpl = (DSoundRenderImpl*)This->pin.pinInfo.pFilter; DSImpl->rtLastStop = -1; if (This->pin.pConnectedTo) hr = VFW_E_ALREADY_CONNECTED; if (SUCCEEDED(hr) && This->pin.pFuncsTable->pfnCheckMediaType((BasePin*)This, pmt) != S_OK) hr = VFW_E_TYPE_NOT_ACCEPTED; if (SUCCEEDED(hr)) { IPin_QueryDirection(pReceivePin, &pindirReceive); if (pindirReceive != PINDIR_OUTPUT) { ERR("Can't connect from non-output pin\n"); hr = VFW_E_INVALID_DIRECTION; } } if (SUCCEEDED(hr)) { WAVEFORMATEX *format; DSBUFFERDESC buf_desc; TRACE("MajorType %s\n", debugstr_guid(&pmt->majortype)); TRACE("SubType %s\n", debugstr_guid(&pmt->subtype)); TRACE("Format %s\n", debugstr_guid(&pmt->formattype)); TRACE("Size %d\n", pmt->cbFormat); format = (WAVEFORMATEX*)pmt->pbFormat; DSImpl->buf_size = format->nAvgBytesPerSec; memset(&buf_desc,0,sizeof(DSBUFFERDESC)); buf_desc.dwSize = sizeof(DSBUFFERDESC); buf_desc.dwFlags = DSBCAPS_CTRLVOLUME | DSBCAPS_CTRLPAN | DSBCAPS_CTRLFREQUENCY | DSBCAPS_GETCURRENTPOSITION2; buf_desc.dwBufferBytes = DSImpl->buf_size; buf_desc.lpwfxFormat = format; hr = IDirectSound_CreateSoundBuffer(DSImpl->dsound, &buf_desc, &DSImpl->dsbuffer, NULL); if (FAILED(hr)) ERR("Can't create sound buffer (%x)\n", hr); } if (SUCCEEDED(hr)) { hr = IDirectSoundBuffer_SetVolume(DSImpl->dsbuffer, DSImpl->volume); if (FAILED(hr)) ERR("Can't set volume to %d (%x)\n", DSImpl->volume, hr); hr = IDirectSoundBuffer_SetPan(DSImpl->dsbuffer, DSImpl->pan); if (FAILED(hr)) ERR("Can't set pan to %d (%x)\n", DSImpl->pan, hr); DSImpl->write_pos = 0; hr = S_OK; } if (SUCCEEDED(hr)) { CopyMediaType(&This->pin.mtCurrent, pmt); This->pin.pConnectedTo = pReceivePin; IPin_AddRef(pReceivePin); } else if (hr != VFW_E_ALREADY_CONNECTED) { if (DSImpl->dsbuffer) IDirectSoundBuffer_Release(DSImpl->dsbuffer); DSImpl->dsbuffer = NULL; } } LeaveCriticalSection(This->pin.pCritSec); return hr; }
static HRESULT WINAPI QTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) { HRESULT hr = S_OK; ALLOCATOR_PROPERTIES props; QTInPin *This = impl_from_IPin(iface); TRACE("(%p/%p)->(%p, %p)\n", This, iface, pReceivePin, pmt); EnterCriticalSection(This->pin.pCritSec); This->pReader = NULL; if (This->pin.pConnectedTo) hr = VFW_E_ALREADY_CONNECTED; else if (IPin_QueryAccept(iface, pmt) != S_OK) hr = VFW_E_TYPE_NOT_ACCEPTED; else { PIN_DIRECTION pindirReceive; IPin_QueryDirection(pReceivePin, &pindirReceive); if (pindirReceive != PINDIR_OUTPUT) hr = VFW_E_INVALID_DIRECTION; } if (FAILED(hr)) { LeaveCriticalSection(This->pin.pCritSec); return hr; } hr = IPin_QueryInterface(pReceivePin, &IID_IAsyncReader, (LPVOID *)&This->pReader); if (FAILED(hr)) { LeaveCriticalSection(This->pin.pCritSec); TRACE("Input source is not an AsyncReader\n"); return hr; } LeaveCriticalSection(This->pin.pCritSec); EnterCriticalSection(&impl_from_IBaseFilter(This->pin.pinInfo.pFilter)->filter.csFilter); hr = QT_Process_Movie(impl_from_IBaseFilter(This->pin.pinInfo.pFilter)); if (FAILED(hr)) { LeaveCriticalSection(&impl_from_IBaseFilter(This->pin.pinInfo.pFilter)->filter.csFilter); TRACE("Unable to process movie\n"); return hr; } This->pAlloc = NULL; props.cBuffers = 8; props.cbAlign = 1; props.cbBuffer = impl_from_IBaseFilter(This->pin.pinInfo.pFilter)->outputSize + props.cbAlign; props.cbPrefix = 0; hr = IAsyncReader_RequestAllocator(This->pReader, NULL, &props, &This->pAlloc); if (SUCCEEDED(hr)) { CopyMediaType(&This->pin.mtCurrent, pmt); This->pin.pConnectedTo = pReceivePin; IPin_AddRef(pReceivePin); hr = IMemAllocator_Commit(This->pAlloc); } else { QT_RemoveOutputPins(impl_from_IBaseFilter(This->pin.pinInfo.pFilter)); if (This->pReader) IAsyncReader_Release(This->pReader); This->pReader = NULL; if (This->pAlloc) IMemAllocator_Release(This->pAlloc); This->pAlloc = NULL; } TRACE("Size: %i\n", props.cbBuffer); LeaveCriticalSection(&impl_from_IBaseFilter(This->pin.pinInfo.pFilter)->filter.csFilter); return hr; }
ULONG WINAPI QT_QualityControl_AddRef(IQualityControl *iface) { QTOutPin *This = impl_from_IQualityControl(iface); return IPin_AddRef(&This->pin.pin.IPin_iface); }