/* * Input Pin */ static HRESULT QT_RemoveOutputPins(QTSplitter *This) { HRESULT hr; TRACE("(%p)\n", This); if (This->pVideo_Pin) { OutputQueue_Destroy(This->pVideo_Pin->queue); hr = BaseOutputPinImpl_BreakConnect(&This->pVideo_Pin->pin); TRACE("Disconnect: %08x\n", hr); IPin_Release(&This->pVideo_Pin->pin.pin.IPin_iface); This->pVideo_Pin = NULL; } if (This->pAudio_Pin) { OutputQueue_Destroy(This->pAudio_Pin->queue); hr = BaseOutputPinImpl_BreakConnect(&This->pAudio_Pin->pin); TRACE("Disconnect: %08x\n", hr); IPin_Release(&This->pAudio_Pin->pin.pin.IPin_iface); This->pAudio_Pin = NULL; } BaseFilterImpl_IncrementPinVersion(&This->filter); return S_OK; }
static HRESULT Parser_RemoveOutputPins(ParserImpl * This) { /* NOTE: should be in critical section when calling this function */ HRESULT hr; ULONG i; IPin ** ppOldPins = This->ppPins; TRACE("(%p)\n", This); /* reduce the pin array down to 1 (just our input pin) */ This->ppPins = CoTaskMemAlloc(sizeof(IPin *) * 1); memcpy(This->ppPins, ppOldPins, sizeof(IPin *) * 1); for (i = 0; i < This->cStreams; i++) { hr = ((BaseOutputPin *)ppOldPins[i + 1])->pFuncsTable->pfnBreakConnect((BaseOutputPin *)ppOldPins[i + 1]); TRACE("Disconnect: %08x\n", hr); IPin_Release(ppOldPins[i + 1]); } BaseFilterImpl_IncrementPinVersion(&This->filter); This->cStreams = 0; CoTaskMemFree(ppOldPins); return S_OK; }
static HRESULT QT_AddPin(QTSplitter *This, const PIN_INFO *piOutput, const AM_MEDIA_TYPE *amt, BOOL video) { HRESULT hr; IPin **target; if (video) target = (IPin**)&This->pVideo_Pin; else target = (IPin**)&This->pAudio_Pin; if (*target != NULL) { FIXME("We already have a %s pin\n",(video)?"video":"audio"); return E_FAIL; } hr = BaseOutputPin_Construct(&QT_OutputPin_Vtbl, sizeof(QTOutPin), piOutput, &output_BaseFuncTable, &output_BaseOutputFuncTable, &This->filter.csFilter, (IPin**)target); if (SUCCEEDED(hr)) { QTOutPin *pin = (QTOutPin*)*target; pin->pmt = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); CopyMediaType(pin->pmt, amt); pin->pin.pin.pinInfo.pFilter = (LPVOID)This; pin->IQualityControl_iface.lpVtbl = &QTOutPin_QualityControl_Vtbl; BaseFilterImpl_IncrementPinVersion(&This->filter); hr = OutputQueue_Construct(&pin->pin, TRUE, TRUE, 5, FALSE, THREAD_PRIORITY_NORMAL, &output_OutputQueueFuncTable, &pin->queue); } else ERR("Failed with error %x\n", hr); return hr; }
HRESULT Parser_AddPin(ParserImpl * This, const PIN_INFO * piOutput, ALLOCATOR_PROPERTIES * props, const AM_MEDIA_TYPE * amt) { IPin ** ppOldPins; HRESULT hr; ppOldPins = This->ppPins; This->ppPins = CoTaskMemAlloc((This->cStreams + 2) * sizeof(IPin *)); memcpy(This->ppPins, ppOldPins, (This->cStreams + 1) * sizeof(IPin *)); hr = BaseOutputPin_Construct(&Parser_OutputPin_Vtbl, sizeof(Parser_OutputPin), piOutput, &output_BaseOutputFuncTable, &This->filter.csFilter, This->ppPins + (This->cStreams + 1)); if (SUCCEEDED(hr)) { IPin *pPin = This->ppPins[This->cStreams + 1]; Parser_OutputPin *pin = unsafe_impl_Parser_OutputPin_from_IPin(pPin); pin->pmt = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE)); CopyMediaType(pin->pmt, amt); pin->dwSamplesProcessed = 0; pin->pin.pin.pinInfo.pFilter = (LPVOID)This; pin->allocProps = *props; This->cStreams++; BaseFilterImpl_IncrementPinVersion(&This->filter); CoTaskMemFree(ppOldPins); } else { CoTaskMemFree(This->ppPins); This->ppPins = ppOldPins; ERR("Failed with error %x\n", hr); } return hr; }