Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/avimux.c | 51 +++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 25 deletions(-)
diff --git a/dlls/qcap/avimux.c b/dlls/qcap/avimux.c index d289d2b9fed..9dcff5074e6 100644 --- a/dlls/qcap/avimux.c +++ b/dlls/qcap/avimux.c @@ -139,7 +139,8 @@ static void avi_mux_destroy(BaseFilter *iface) IPin_Disconnect(&filter->in[i]->pin.pin.IPin_iface); IMemAllocator_Release(filter->in[i]->samples_allocator); filter->in[i]->samples_allocator = NULL; - BaseInputPinImpl_Release(&filter->in[i]->pin.pin.IPin_iface); + strmbase_sink_cleanup(&filter->in[i]->pin); + heap_free(filter->in[i]); }
heap_free(filter->idx1); @@ -2214,6 +2215,7 @@ static const IQualityControlVtbl AviMuxIn_QualityControlVtbl = { static HRESULT create_input_pin(AviMux *avimux) { static const WCHAR name[] = {'I','n','p','u','t',' ','0','0',0}; + AviMuxIn *object; PIN_INFO info; HRESULT hr;
@@ -2226,40 +2228,39 @@ static HRESULT create_input_pin(AviMux *avimux) info.achName[7] = '0' + (avimux->input_pin_no+1) % 10; info.achName[6] = '0' + (avimux->input_pin_no+1) / 10;
- hr = BaseInputPin_Construct(&AviMuxIn_PinVtbl, sizeof(AviMuxIn), &info, - &AviMuxIn_BaseInputFuncTable, &avimux->filter.csFilter, NULL, (IPin**)&avimux->in[avimux->input_pin_no]); - if(FAILED(hr)) - return hr; - avimux->in[avimux->input_pin_no]->pin.IMemInputPin_iface.lpVtbl = &AviMuxIn_MemInputPinVtbl; - avimux->in[avimux->input_pin_no]->IAMStreamControl_iface.lpVtbl = &AviMuxIn_AMStreamControlVtbl; - avimux->in[avimux->input_pin_no]->IPropertyBag_iface.lpVtbl = &AviMuxIn_PropertyBagVtbl; - avimux->in[avimux->input_pin_no]->IQualityControl_iface.lpVtbl = &AviMuxIn_QualityControlVtbl; + if (!(object = heap_alloc_zero(sizeof(*object)))) + return E_OUTOFMEMORY; + + strmbase_sink_init(&object->pin, &AviMuxIn_PinVtbl, &info, + &AviMuxIn_BaseInputFuncTable, &avimux->filter.csFilter, NULL); + object->pin.IMemInputPin_iface.lpVtbl = &AviMuxIn_MemInputPinVtbl; + object->IAMStreamControl_iface.lpVtbl = &AviMuxIn_AMStreamControlVtbl; + object->IPropertyBag_iface.lpVtbl = &AviMuxIn_PropertyBagVtbl; + object->IQualityControl_iface.lpVtbl = &AviMuxIn_QualityControlVtbl;
- avimux->in[avimux->input_pin_no]->samples_head = NULL; hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, - &IID_IMemAllocator, (void**)&avimux->in[avimux->input_pin_no]->samples_allocator); - if(FAILED(hr)) { - BaseInputPinImpl_Release(&avimux->in[avimux->input_pin_no]->pin.pin.IPin_iface); + &IID_IMemAllocator, (void **)&object->samples_allocator); + if (FAILED(hr)) + { + strmbase_sink_cleanup(&object->pin); + heap_free(object); return hr; }
hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, - &IID_IMemAllocator, (void**)&avimux->in[avimux->input_pin_no]->pin.pAllocator); - if(FAILED(hr)) { - IMemAllocator_Release(avimux->in[avimux->input_pin_no]->samples_allocator); - BaseInputPinImpl_Release(&avimux->in[avimux->input_pin_no]->pin.pin.IPin_iface); + &IID_IMemAllocator, (void **)&object->pin.pAllocator); + if (FAILED(hr)) + { + IMemAllocator_Release(object->samples_allocator); + strmbase_sink_cleanup(&object->pin); + heap_free(object); return hr; }
- avimux->in[avimux->input_pin_no]->stream_time = 0; - memset(&avimux->in[avimux->input_pin_no]->strh, 0, sizeof(avimux->in[avimux->input_pin_no]->strh)); - avimux->in[avimux->input_pin_no]->strf = NULL; - memset(&avimux->in[avimux->input_pin_no]->indx_data, 0, sizeof(avimux->in[avimux->input_pin_no]->indx_data)); - memset(&avimux->in[avimux->input_pin_no]->ix_data, 0, sizeof(avimux->in[avimux->input_pin_no]->ix_data)); - avimux->in[avimux->input_pin_no]->indx = (AVISUPERINDEX*)&avimux->in[avimux->input_pin_no]->indx_data; - avimux->in[avimux->input_pin_no]->ix = (AVISTDINDEX*)avimux->in[avimux->input_pin_no]->ix_data; + object->indx = (AVISUPERINDEX *)&object->indx_data; + object->ix = (AVISTDINDEX *)object->ix_data;
- avimux->input_pin_no++; + avimux->in[avimux->input_pin_no++] = object; return S_OK; }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/pin.c | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-)
diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c index aa195c3dd2c..eb0f4693f67 100644 --- a/dlls/strmbase/pin.c +++ b/dlls/strmbase/pin.c @@ -740,14 +740,12 @@ static void strmbase_pin_init(BasePin *pin, const IPinVtbl *vtbl, pin->pFuncsTable = func_table; }
-static HRESULT OutputPin_Init(const IPinVtbl *vtbl, const PIN_INFO *info, - const BaseOutputPinFuncTable *func_table, CRITICAL_SECTION *cs, BaseOutputPin *pin) +static void strmbase_source_init(BaseOutputPin *pin, const IPinVtbl *vtbl, + const PIN_INFO *info, const BaseOutputPinFuncTable *func_table, CRITICAL_SECTION *cs) { memset(pin, 0, sizeof(*pin)); strmbase_pin_init(&pin->pin, vtbl, &func_table->base, info, cs); pin->pFuncsTable = func_table; - - return S_OK; }
HRESULT WINAPI BaseOutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outputpin_size, const PIN_INFO * pPinInfo, const BaseOutputPinFuncTable* vtbl, LPCRITICAL_SECTION pCritSec, IPin ** ppPin) @@ -770,14 +768,9 @@ HRESULT WINAPI BaseOutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outp if (!pPinImpl) return E_OUTOFMEMORY;
- if (SUCCEEDED(OutputPin_Init(OutputPin_Vtbl, pPinInfo, vtbl, pCritSec, pPinImpl))) - { - *ppPin = &pPinImpl->pin.IPin_iface; - return S_OK; - } - - CoTaskMemFree(pPinImpl); - return E_FAIL; + strmbase_source_init(pPinImpl, OutputPin_Vtbl, pPinInfo, vtbl, pCritSec); + *ppPin = &pPinImpl->pin.IPin_iface; + return S_OK; }
HRESULT WINAPI BaseOutputPin_Destroy(BaseOutputPin *This)
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/pin.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c index eb0f4693f67..f1b24c3dad7 100644 --- a/dlls/strmbase/pin.c +++ b/dlls/strmbase/pin.c @@ -773,12 +773,17 @@ HRESULT WINAPI BaseOutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outp return S_OK; }
+static void strmbase_source_cleanup(BaseOutputPin *pin) +{ + FreeMediaType(&pin->pin.mtCurrent); + if (pin->pAllocator) + IMemAllocator_Release(pin->pAllocator); + pin->pAllocator = NULL; +} + HRESULT WINAPI BaseOutputPin_Destroy(BaseOutputPin *This) { - FreeMediaType(&This->pin.mtCurrent); - if (This->pAllocator) - IMemAllocator_Release(This->pAllocator); - This->pAllocator = NULL; + strmbase_source_cleanup(This); CoTaskMemFree(This); return S_OK; }
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/avico.c | 23 ++++++++--------------- dlls/strmbase/pin.c | 4 ++-- include/wine/strmbase.h | 3 +++ 3 files changed, 13 insertions(+), 17 deletions(-)
diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c index 841db700d63..399fe0979d9 100644 --- a/dlls/qcap/avico.c +++ b/dlls/qcap/avico.c @@ -38,7 +38,7 @@ typedef struct { IPersistPropertyBag IPersistPropertyBag_iface;
BaseInputPin sink; - BaseOutputPin *out; + BaseOutputPin source;
DWORD fcc_handler; HIC hic; @@ -148,7 +148,7 @@ static HRESULT WINAPI AVICompressor_Run(IBaseFilter *iface, REFERENCE_TIME tStar if(This->filter.state == State_Running) return S_OK;
- hres = IMemAllocator_Commit(This->out->pAllocator); + hres = IMemAllocator_Commit(This->source.pAllocator); if(FAILED(hres)) { FIXME("Commit failed: %08x\n", hres); return hres; @@ -185,7 +185,7 @@ static IPin *avi_compressor_get_pin(BaseFilter *iface, unsigned int index) if (index == 0) return &filter->sink.pin.IPin_iface; else if (index == 1) - return &filter->out->pin.IPin_iface; + return &filter->source.pin.IPin_iface; return NULL; }
@@ -197,8 +197,7 @@ static void avi_compressor_destroy(BaseFilter *iface) ICClose(filter->hic); heap_free(filter->videoinfo); strmbase_sink_cleanup(&filter->sink); - if (filter->out) - BaseOutputPinImpl_Release(&filter->out->pin.IPin_iface); + strmbase_source_cleanup(&filter->source); strmbase_filter_cleanup(&filter->filter); heap_free(filter); } @@ -472,7 +471,7 @@ static HRESULT WINAPI AVICompressorIn_Receive(BaseInputPin *base, IMediaSample * return hres; }
- hres = BaseOutputPinImpl_GetDeliveryBuffer(This->out, &out_sample, &start, &stop, 0); + hres = BaseOutputPinImpl_GetDeliveryBuffer(&This->source, &out_sample, &start, &stop, 0); if(FAILED(hres)) return hres;
@@ -503,7 +502,7 @@ static HRESULT WINAPI AVICompressorIn_Receive(BaseInputPin *base, IMediaSample * else IMediaSample_SetMediaTime(out_sample, NULL, NULL);
- hres = BaseOutputPinImpl_Deliver(This->out, out_sample); + hres = BaseOutputPinImpl_Deliver(&This->source, out_sample); if(FAILED(hres)) WARN("Deliver failed: %08x\n", hres);
@@ -618,7 +617,6 @@ IUnknown* WINAPI QCAP_createAVICompressor(IUnknown *outer, HRESULT *phr) PIN_INFO in_pin_info = {NULL, PINDIR_INPUT, {'I','n',0}}; PIN_INFO out_pin_info = {NULL, PINDIR_OUTPUT, {'O','u','t',0}}; AVICompressor *compressor; - HRESULT hres;
compressor = heap_alloc_zero(sizeof(*compressor)); if(!compressor) { @@ -636,13 +634,8 @@ IUnknown* WINAPI QCAP_createAVICompressor(IUnknown *outer, HRESULT *phr) &AVICompressorBaseInputPinVtbl, &compressor->filter.csFilter, 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)) { - strmbase_filter_cleanup(&compressor->filter); - *phr = hres; - return NULL; - } + strmbase_source_init(&compressor->source, &AVICompressorOutputPinVtbl, &out_pin_info, + &AVICompressorBaseOutputPinVtbl, &compressor->filter.csFilter);
*phr = S_OK; return &compressor->filter.IUnknown_inner; diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c index f1b24c3dad7..f57875133a0 100644 --- a/dlls/strmbase/pin.c +++ b/dlls/strmbase/pin.c @@ -740,7 +740,7 @@ static void strmbase_pin_init(BasePin *pin, const IPinVtbl *vtbl, pin->pFuncsTable = func_table; }
-static void strmbase_source_init(BaseOutputPin *pin, const IPinVtbl *vtbl, +void strmbase_source_init(BaseOutputPin *pin, const IPinVtbl *vtbl, const PIN_INFO *info, const BaseOutputPinFuncTable *func_table, CRITICAL_SECTION *cs) { memset(pin, 0, sizeof(*pin)); @@ -773,7 +773,7 @@ HRESULT WINAPI BaseOutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outp return S_OK; }
-static void strmbase_source_cleanup(BaseOutputPin *pin) +void strmbase_source_cleanup(BaseOutputPin *pin) { FreeMediaType(&pin->pin.mtCurrent); if (pin->pAllocator) diff --git a/include/wine/strmbase.h b/include/wine/strmbase.h index 8c6123c16b6..1a8b8aa43e0 100644 --- a/include/wine/strmbase.h +++ b/include/wine/strmbase.h @@ -135,6 +135,9 @@ HRESULT WINAPI BaseOutputPinImpl_AttemptConnection(BaseOutputPin *pin, IPin *pee
HRESULT WINAPI BaseOutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outputpin_size, const PIN_INFO * pPinInfo, const BaseOutputPinFuncTable* pBaseOutputFuncsTable, LPCRITICAL_SECTION pCritSec, IPin ** ppPin); HRESULT WINAPI BaseOutputPin_Destroy(BaseOutputPin *This); +void strmbase_source_cleanup(BaseOutputPin *pin); +void strmbase_source_init(BaseOutputPin *pin, const IPinVtbl *vtbl, const PIN_INFO *info, + const BaseOutputPinFuncTable *func_table, CRITICAL_SECTION *cs);
/* Base Input Pin */ HRESULT WINAPI BaseInputPinImpl_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv);
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/smartteefilter.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/dlls/qcap/smartteefilter.c b/dlls/qcap/smartteefilter.c index 69341af8fdd..541d7a8153b 100644 --- a/dlls/qcap/smartteefilter.c +++ b/dlls/qcap/smartteefilter.c @@ -38,7 +38,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(qcap); typedef struct { BaseFilter filter; BaseInputPin sink; - BaseOutputPin *capture; + BaseOutputPin capture; BaseOutputPin *preview; } SmartTeeFilter;
@@ -125,7 +125,7 @@ static IPin *smart_tee_get_pin(BaseFilter *iface, unsigned int index) if (index == 0) return &filter->sink.pin.IPin_iface; else if (index == 1) - return &filter->capture->pin.IPin_iface; + return &filter->capture.pin.IPin_iface; else if (index == 2) return &filter->preview->pin.IPin_iface; return NULL; @@ -136,8 +136,7 @@ static void smart_tee_destroy(BaseFilter *iface) SmartTeeFilter *filter = impl_from_BaseFilter(iface);
strmbase_sink_cleanup(&filter->sink); - if (filter->capture) - BaseOutputPinImpl_Release(&filter->capture->pin.IPin_iface); + strmbase_source_cleanup(&filter->capture); if (filter->preview) BaseOutputPinImpl_Release(&filter->preview->pin.IPin_iface); strmbase_filter_cleanup(&filter->filter); @@ -308,11 +307,11 @@ static HRESULT WINAPI SmartTeeFilterInput_Receive(BaseInputPin *base, IMediaSamp
/* FIXME: we should ideally do each of these in a separate thread */ EnterCriticalSection(&This->filter.csFilter); - if (This->capture->pin.pConnectedTo) - hrCapture = copy_sample(inputSample, This->capture->pAllocator, &captureSample); + if (This->capture.pin.pConnectedTo) + hrCapture = copy_sample(inputSample, This->capture.pAllocator, &captureSample); LeaveCriticalSection(&This->filter.csFilter); if (SUCCEEDED(hrCapture)) - hrCapture = BaseOutputPinImpl_Deliver(This->capture, captureSample); + hrCapture = BaseOutputPinImpl_Deliver(&This->capture, captureSample); if (captureSample) IMediaSample_Release(captureSample);
@@ -535,10 +534,8 @@ IUnknown* WINAPI QCAP_createSmartTeeFilter(IUnknown *outer, HRESULT *phr) goto end;
capturePinInfo.pFilter = &This->filter.IBaseFilter_iface; - hr = BaseOutputPin_Construct(&SmartTeeFilterCaptureVtbl, sizeof(BaseOutputPin), &capturePinInfo, - &SmartTeeFilterCaptureFuncs, &This->filter.csFilter, (IPin**)&This->capture); - if (FAILED(hr)) - goto end; + strmbase_source_init(&This->capture, &SmartTeeFilterCaptureVtbl, &capturePinInfo, + &SmartTeeFilterCaptureFuncs, &This->filter.csFilter);
previewPinInfo.pFilter = &This->filter.IBaseFilter_iface; hr = BaseOutputPin_Construct(&SmartTeeFilterPreviewVtbl, sizeof(BaseOutputPin), &previewPinInfo,
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/smartteefilter.c | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-)
diff --git a/dlls/qcap/smartteefilter.c b/dlls/qcap/smartteefilter.c index 541d7a8153b..51efe17b75b 100644 --- a/dlls/qcap/smartteefilter.c +++ b/dlls/qcap/smartteefilter.c @@ -38,8 +38,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(qcap); typedef struct { BaseFilter filter; BaseInputPin sink; - BaseOutputPin capture; - BaseOutputPin *preview; + BaseOutputPin capture, preview; } SmartTeeFilter;
static inline SmartTeeFilter *impl_from_BaseFilter(BaseFilter *filter) @@ -127,7 +126,7 @@ static IPin *smart_tee_get_pin(BaseFilter *iface, unsigned int index) else if (index == 1) return &filter->capture.pin.IPin_iface; else if (index == 2) - return &filter->preview->pin.IPin_iface; + return &filter->preview.pin.IPin_iface; return NULL; }
@@ -137,8 +136,7 @@ static void smart_tee_destroy(BaseFilter *iface)
strmbase_sink_cleanup(&filter->sink); strmbase_source_cleanup(&filter->capture); - if (filter->preview) - BaseOutputPinImpl_Release(&filter->preview->pin.IPin_iface); + strmbase_source_cleanup(&filter->preview); strmbase_filter_cleanup(&filter->filter); CoTaskMemFree(filter); } @@ -316,14 +314,14 @@ static HRESULT WINAPI SmartTeeFilterInput_Receive(BaseInputPin *base, IMediaSamp IMediaSample_Release(captureSample);
EnterCriticalSection(&This->filter.csFilter); - if (This->preview->pin.pConnectedTo) - hrPreview = copy_sample(inputSample, This->preview->pAllocator, &previewSample); + if (This->preview.pin.pConnectedTo) + hrPreview = copy_sample(inputSample, This->preview.pAllocator, &previewSample); LeaveCriticalSection(&This->filter.csFilter); /* No timestamps on preview stream: */ if (SUCCEEDED(hrPreview)) hrPreview = IMediaSample_SetTime(previewSample, NULL, NULL); if (SUCCEEDED(hrPreview)) - hrPreview = BaseOutputPinImpl_Deliver(This->preview, previewSample); + hrPreview = BaseOutputPinImpl_Deliver(&This->preview, previewSample); if (previewSample) IMediaSample_Release(previewSample);
@@ -531,22 +529,20 @@ IUnknown* WINAPI QCAP_createSmartTeeFilter(IUnknown *outer, HRESULT *phr) hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, &IID_IMemAllocator, (void**)&This->sink.pAllocator); if (FAILED(hr)) - goto end; + { + *phr = hr; + strmbase_filter_cleanup(&This->filter); + return NULL; + }
capturePinInfo.pFilter = &This->filter.IBaseFilter_iface; strmbase_source_init(&This->capture, &SmartTeeFilterCaptureVtbl, &capturePinInfo, &SmartTeeFilterCaptureFuncs, &This->filter.csFilter);
previewPinInfo.pFilter = &This->filter.IBaseFilter_iface; - hr = BaseOutputPin_Construct(&SmartTeeFilterPreviewVtbl, sizeof(BaseOutputPin), &previewPinInfo, - &SmartTeeFilterPreviewFuncs, &This->filter.csFilter, (IPin**)&This->preview); + strmbase_source_init(&This->preview, &SmartTeeFilterPreviewVtbl, &previewPinInfo, + &SmartTeeFilterPreviewFuncs, &This->filter.csFilter);
-end: - *phr = hr; - if (SUCCEEDED(hr)) { - return &This->filter.IUnknown_inner; - } else { - strmbase_filter_cleanup(&This->filter); - return NULL; - } + *phr = S_OK; + return &This->filter.IUnknown_inner; }