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; }
static HRESULT VfwPin_Construct( IBaseFilter * pBaseFilter, LPCRITICAL_SECTION pCritSec, IPin ** ppPin ) { static const WCHAR wszOutputPinName[] = { 'O','u','t','p','u','t',0 }; PIN_INFO piOutput; HRESULT hr; *ppPin = NULL; piOutput.dir = PINDIR_OUTPUT; piOutput.pFilter = pBaseFilter; lstrcpyW(piOutput.achName, wszOutputPinName); hr = BaseOutputPin_Construct(&VfwPin_Vtbl, sizeof(VfwPinImpl), &piOutput, &output_BaseOutputFuncTable, pCritSec, ppPin); if (SUCCEEDED(hr)) { VfwPinImpl *pPinImpl = (VfwPinImpl*)*ppPin; pPinImpl->IKsPropertySet_iface.lpVtbl = &IKsPropertySet_VTable; ObjectRefCount(TRUE); } return hr; }
static HRESULT TransformFilter_Init(const IBaseFilterVtbl *pVtbl, const CLSID* pClsid, const TransformFilterFuncTable* pFuncsTable, TransformFilter* pTransformFilter) { HRESULT hr; PIN_INFO piInput; PIN_INFO piOutput; BaseFilter_Init(&pTransformFilter->filter, pVtbl, pClsid, (DWORD_PTR)(__FILE__ ": TransformFilter.csFilter"), &tfBaseFuncTable); /* pTransformFilter is already allocated */ pTransformFilter->pFuncsTable = pFuncsTable; ZeroMemory(&pTransformFilter->pmt, sizeof(pTransformFilter->pmt)); pTransformFilter->npins = 2; pTransformFilter->ppPins = CoTaskMemAlloc(2 * sizeof(IPin *)); /* construct input pin */ piInput.dir = PINDIR_INPUT; piInput.pFilter = (IBaseFilter *)pTransformFilter; lstrcpynW(piInput.achName, wcsInputPinName, sizeof(piInput.achName) / sizeof(piInput.achName[0])); piOutput.dir = PINDIR_OUTPUT; piOutput.pFilter = (IBaseFilter *)pTransformFilter; lstrcpynW(piOutput.achName, wcsOutputPinName, sizeof(piOutput.achName) / sizeof(piOutput.achName[0])); hr = BaseInputPin_Construct(&TransformFilter_InputPin_Vtbl, &piInput, &tf_input_BaseFuncTable, &tf_input_BaseInputFuncTable, &pTransformFilter->filter.csFilter, NULL, &pTransformFilter->ppPins[0]); if (SUCCEEDED(hr)) { hr = BaseOutputPin_Construct(&TransformFilter_OutputPin_Vtbl, sizeof(BaseOutputPin), &piOutput, &tf_output_BaseFuncTable, &tf_output_BaseOutputFuncTable, &pTransformFilter->filter.csFilter, &pTransformFilter->ppPins[1]); if (FAILED(hr)) ERR("Cannot create output pin (%x)\n", hr); else { QualityControlImpl_init(&pTransformFilter->qcimpl, (IPin*)pTransformFilter->ppPins[0], (IBaseFilter*)pTransformFilter); pTransformFilter->qcimpl.lpVtbl = &TransformFilter_QualityControl_Vtbl; } } if (FAILED(hr)) { CoTaskMemFree(pTransformFilter->ppPins); BaseFilterImpl_Release((IBaseFilter*)pTransformFilter); } return hr; }
IUnknown* WINAPI QCAP_createAVICompressor(IUnknown *outer, HRESULT *phr) { PIN_INFO in_pin_info = {NULL, PINDIR_INPUT, {'I','n','p','u','t',0}}; PIN_INFO out_pin_info = {NULL, PINDIR_OUTPUT, {'O','u','t','p','u','t',0}}; AVICompressor *compressor; HRESULT hres; TRACE("\n"); compressor = heap_alloc_zero(sizeof(*compressor)); if(!compressor) { *phr = E_NOINTERFACE; return NULL; } BaseFilter_Init(&compressor->filter, &AVICompressorVtbl, &CLSID_AVICo, (DWORD_PTR)(__FILE__ ": AVICompressor.csFilter"), &filter_func_table); compressor->IPersistPropertyBag_iface.lpVtbl = &PersistPropertyBagVtbl; in_pin_info.pFilter = &compressor->filter.IBaseFilter_iface; hres = BaseInputPin_Construct(&AVICompressorInputPinVtbl, sizeof(BaseInputPin), &in_pin_info, &AVICompressorBaseInputPinVtbl, &compressor->filter.csFilter, NULL, (IPin**)&compressor->in); if(FAILED(hres)) { IBaseFilter_Release(&compressor->filter.IBaseFilter_iface); *phr = hres; return NULL; } out_pin_info.pFilter = &compressor->filter.IBaseFilter_iface; hres = BaseOutputPin_Construct(&AVICompressorOutputPinVtbl, sizeof(BaseOutputPin), &out_pin_info, &AVICompressorBaseOutputPinVtbl, &compressor->filter.csFilter, (IPin**)&compressor->out); if(FAILED(hres)) { IBaseFilter_Release(&compressor->filter.IBaseFilter_iface); *phr = hres; return NULL; } *phr = S_OK; return (IUnknown*)&compressor->filter.IBaseFilter_iface; }
static HRESULT TransformFilter_Init(const IBaseFilterVtbl *pVtbl, const CLSID* pClsid, const TransformFilterFuncTable* pFuncsTable, TransformFilter* pTransformFilter) { HRESULT hr; PIN_INFO piInput; PIN_INFO piOutput; BaseFilter_Init(&pTransformFilter->filter, pVtbl, pClsid, (DWORD_PTR)(__FILE__ ": TransformFilter.csFilter"), &tfBaseFuncTable); InitializeCriticalSection(&pTransformFilter->csReceive); pTransformFilter->csReceive.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__": TransformFilter.csReceive"); /* pTransformFilter is already allocated */ pTransformFilter->pFuncsTable = pFuncsTable; ZeroMemory(&pTransformFilter->pmt, sizeof(pTransformFilter->pmt)); pTransformFilter->npins = 2; pTransformFilter->ppPins = CoTaskMemAlloc(2 * sizeof(IPin *)); /* construct input pin */ piInput.dir = PINDIR_INPUT; piInput.pFilter = &pTransformFilter->filter.IBaseFilter_iface; lstrcpynW(piInput.achName, wcsInputPinName, sizeof(piInput.achName) / sizeof(piInput.achName[0])); piOutput.dir = PINDIR_OUTPUT; piOutput.pFilter = &pTransformFilter->filter.IBaseFilter_iface; lstrcpynW(piOutput.achName, wcsOutputPinName, sizeof(piOutput.achName) / sizeof(piOutput.achName[0])); hr = BaseInputPin_Construct(&TransformFilter_InputPin_Vtbl, &piInput, &tf_input_BaseFuncTable, &tf_input_BaseInputFuncTable, &pTransformFilter->filter.csFilter, NULL, &pTransformFilter->ppPins[0]); if (SUCCEEDED(hr)) { hr = BaseOutputPin_Construct(&TransformFilter_OutputPin_Vtbl, sizeof(BaseOutputPin), &piOutput, &tf_output_BaseFuncTable, &tf_output_BaseOutputFuncTable, &pTransformFilter->filter.csFilter, &pTransformFilter->ppPins[1]); if (FAILED(hr)) ERR("Cannot create output pin (%x)\n", hr); else { QualityControlImpl_Create( pTransformFilter->ppPins[0], &pTransformFilter->filter.IBaseFilter_iface, &pTransformFilter->qcimpl); pTransformFilter->qcimpl->IQualityControl_iface.lpVtbl = &TransformFilter_QualityControl_Vtbl; } } if (SUCCEEDED(hr)) { ISeekingPassThru *passthru; pTransformFilter->seekthru_unk = NULL; hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown*)pTransformFilter, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&pTransformFilter->seekthru_unk); if (SUCCEEDED(hr)) { IUnknown_QueryInterface(pTransformFilter->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru); ISeekingPassThru_Init(passthru, FALSE, pTransformFilter->ppPins[0]); ISeekingPassThru_Release(passthru); } } if (FAILED(hr)) { CoTaskMemFree(pTransformFilter->ppPins); BaseFilterImpl_Release(&pTransformFilter->filter.IBaseFilter_iface); } return hr; }