static HRESULT WINAPI TransformFilter_InputPin_EndOfStream(IPin * iface) { BaseInputPin* This = impl_BaseInputPin_from_IPin(iface); TransformFilter* pTransform; IPin* ppin; HRESULT hr; TRACE("(%p)->()\n", iface); /* Since we process samples synchronously, just forward notification downstream */ pTransform = impl_from_IBaseFilter(This->pin.pinInfo.pFilter); if (!pTransform) hr = E_FAIL; else hr = IPin_ConnectedTo(pTransform->ppPins[1], &ppin); if (SUCCEEDED(hr)) { hr = IPin_EndOfStream(ppin); IPin_Release(ppin); } if (FAILED(hr)) ERR("%x\n", hr); return hr; }
/* IMemInputPin */ static HRESULT WINAPI SampleGrabber_IMemInputPin_Receive(IMemInputPin *iface, IMediaSample *sample) { SG_Impl *This = impl_from_IMemInputPin(iface); HRESULT hr; TRACE("(%p)->(%p) output = %p, grabber = %p\n", This, sample, This->memOutput, This->grabberIface); if (!sample) return E_POINTER; if ((This->filter.state != State_Running) || (This->oneShot == OneShot_Past)) return S_FALSE; SampleGrabber_callback(This, sample); hr = This->memOutput ? IMemInputPin_Receive(This->memOutput, sample) : S_OK; if (This->oneShot == OneShot_Wait) { This->oneShot = OneShot_Past; hr = S_FALSE; if (This->pin_out.pair) IPin_EndOfStream(This->pin_out.pair); } return hr; }