Zebediah Figura : winegstreamer: Use strmbase_source_init().
Alexandre Julliard
julliard at winehq.org
Thu Sep 5 16:54:00 CDT 2019
Module: wine
Branch: master
Commit: 06d72b61ced162b0c19102fe48d3f38598cd5c0f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=06d72b61ced162b0c19102fe48d3f38598cd5c0f
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Wed Sep 4 19:43:19 2019 -0500
winegstreamer: Use strmbase_source_init().
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winegstreamer/gst_private.h | 1 +
dlls/winegstreamer/gstdemux.c | 58 +++++++++++++++++++++-------------------
2 files changed, 31 insertions(+), 28 deletions(-)
diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index 06236e2..18d6eb8 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -30,6 +30,7 @@
#include "winuser.h"
#include "dshow.h"
#include "strmif.h"
+#include "wine/heap.h"
#include "wine/strmbase.h"
#define MEDIATIME_FROM_BYTES(x) ((LONGLONG)(x) * 10000000)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 9e634bc..aa27a36 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -104,7 +104,7 @@ static const IPinVtbl GST_InputPin_Vtbl;
static const IBaseFilterVtbl GST_Vtbl;
static const IQualityControlVtbl GSTOutPin_QualityControl_Vtbl;
-static HRESULT GST_AddPin(GSTImpl *This, const PIN_INFO *piOutput, const AM_MEDIA_TYPE *amt);
+static BOOL create_pin(GSTImpl *filter, const PIN_INFO *pin_info, const AM_MEDIA_TYPE *mt);
static HRESULT GST_RemoveOutputPins(GSTImpl *This);
static HRESULT WINAPI GST_ChangeCurrent(IMediaSeeking *iface);
static HRESULT WINAPI GST_ChangeStop(IMediaSeeking *iface);
@@ -825,9 +825,9 @@ static void init_new_decoded_pad(GstElement *bin, GstPad *pad, GSTImpl *This)
return;
}
- hr = GST_AddPin(This, &piOutput, &amt);
- if (FAILED(hr)) {
- ERR("%08x\n", hr);
+ if (!create_pin(This, &piOutput, &amt))
+ {
+ ERR("Failed to allocate memory.\n");
return;
}
@@ -1771,13 +1771,12 @@ static void free_source_pin(GSTOutPin *pin)
gst_object_unref(pin->my_sink);
CloseHandle(pin->caps_event);
DeleteMediaType(pin->pmt);
- FreeMediaType(&pin->pin.pin.mtCurrent);
gst_segment_free(pin->segment);
if (pin->gstpool)
gst_object_unref(pin->gstpool);
- if (pin->pin.pAllocator)
- IMemAllocator_Release(pin->pin.pAllocator);
- CoTaskMemFree(pin);
+
+ strmbase_source_cleanup(&pin->pin);
+ heap_free(pin);
}
static const IPinVtbl GST_OutputPin_Vtbl = {
@@ -1811,27 +1810,30 @@ static const BaseOutputPinFuncTable output_BaseOutputFuncTable = {
GSTOutPin_DecideAllocator,
};
-static HRESULT GST_AddPin(GSTImpl *This, const PIN_INFO *piOutput, const AM_MEDIA_TYPE *amt)
+static BOOL create_pin(GSTImpl *filter, const PIN_INFO *pin_info, const AM_MEDIA_TYPE *mt)
{
- HRESULT hr;
- This->ppPins = CoTaskMemRealloc(This->ppPins, (This->cStreams + 1) * sizeof(IPin *));
-
- hr = BaseOutputPin_Construct(&GST_OutputPin_Vtbl, sizeof(GSTOutPin), piOutput, &output_BaseOutputFuncTable, &This->filter.csFilter, (IPin**)(This->ppPins + This->cStreams));
- if (SUCCEEDED(hr)) {
- GSTOutPin *pin = This->ppPins[This->cStreams];
- memset((char*)pin + sizeof(pin->pin), 0, sizeof(GSTOutPin) - sizeof(pin->pin));
- pin->pmt = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
- CopyMediaType(pin->pmt, amt);
- pin->pin.pin.pinInfo.pFilter = &This->filter.IBaseFilter_iface;
- pin->caps_event = CreateEventW(NULL, 0, 0, NULL);
- pin->segment = gst_segment_new();
- This->cStreams++;
- pin->IQualityControl_iface.lpVtbl = &GSTOutPin_QualityControl_Vtbl;
- SourceSeeking_Init(&pin->seek, &GST_Seeking_Vtbl, GST_ChangeStop, GST_ChangeCurrent, GST_ChangeRate, &This->filter.csFilter);
- BaseFilterImpl_IncrementPinVersion(&This->filter);
- } else
- ERR("Failed with error %x\n", hr);
- return hr;
+ GSTOutPin *pin, **new_array;
+
+ if (!(new_array = CoTaskMemRealloc(filter->ppPins, (filter->cStreams + 1) * sizeof(*new_array))))
+ return FALSE;
+ filter->ppPins = new_array;
+
+ if (!(pin = heap_alloc_zero(sizeof(*pin))))
+ return FALSE;
+
+ strmbase_source_init(&pin->pin, &GST_OutputPin_Vtbl, pin_info,
+ &output_BaseOutputFuncTable, &filter->filter.csFilter);
+ pin->pmt = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
+ CopyMediaType(pin->pmt, mt);
+ pin->caps_event = CreateEventW(NULL, FALSE, FALSE, NULL);
+ pin->segment = gst_segment_new();
+ pin->IQualityControl_iface.lpVtbl = &GSTOutPin_QualityControl_Vtbl;
+ SourceSeeking_Init(&pin->seek, &GST_Seeking_Vtbl, GST_ChangeStop,
+ GST_ChangeCurrent, GST_ChangeRate, &filter->filter.csFilter);
+ BaseFilterImpl_IncrementPinVersion(&filter->filter);
+
+ filter->ppPins[filter->cStreams++] = pin;
+ return TRUE;
}
static HRESULT GST_RemoveOutputPins(GSTImpl *This)
More information about the wine-cvs
mailing list