[PATCH 3/5] winegstreamer: Get rid of the GSTInPin structure.
Zebediah Figura
z.figura12 at gmail.com
Sun Sep 8 13:55:04 CDT 2019
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/winegstreamer/gstdemux.c | 164 +++++++++++++++-------------------
1 file changed, 74 insertions(+), 90 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c
index 4b64dbae49e..3761dbcdfcc 100644
--- a/dlls/winegstreamer/gstdemux.c
+++ b/dlls/winegstreamer/gstdemux.c
@@ -48,16 +48,13 @@ WINE_DEFAULT_DEBUG_CHANNEL(gstreamer);
static pthread_key_t wine_gst_key;
typedef struct GSTOutPin GSTOutPin;
-typedef struct GSTInPin {
- BasePin pin;
- IAsyncReader *pReader;
- IMemAllocator *pAlloc;
-} GSTInPin;
typedef struct GSTImpl {
struct strmbase_filter filter;
- GSTInPin pInputPin;
+ BasePin sink;
+ IAsyncReader *reader;
+ IMemAllocator *alloc;
GSTOutPin **ppPins;
LONG cStreams;
@@ -364,8 +361,8 @@ static gboolean gst_base_src_perform_seek(GSTImpl *This, GstEvent *event)
tevent = gst_event_new_flush_start();
gst_event_set_seqnum(tevent, seqnum);
gst_pad_push_event(This->my_src, tevent);
- if (This->pInputPin.pReader)
- IAsyncReader_BeginFlush(This->pInputPin.pReader);
+ if (This->reader)
+ IAsyncReader_BeginFlush(This->reader);
if (thread)
gst_pad_set_active(This->my_src, 1);
}
@@ -377,8 +374,8 @@ static gboolean gst_base_src_perform_seek(GSTImpl *This, GstEvent *event)
tevent = gst_event_new_flush_stop(TRUE);
gst_event_set_seqnum(tevent, seqnum);
gst_pad_push_event(This->my_src, tevent);
- if (This->pInputPin.pReader)
- IAsyncReader_EndFlush(This->pInputPin.pReader);
+ if (This->reader)
+ IAsyncReader_EndFlush(This->reader);
if (thread)
gst_pad_set_active(This->my_src, 1);
}
@@ -397,14 +394,14 @@ static gboolean event_src(GstPad *pad, GstObject *parent, GstEvent *event)
return gst_base_src_perform_seek(This, event);
case GST_EVENT_FLUSH_START:
EnterCriticalSection(&This->filter.csFilter);
- if (This->pInputPin.pReader)
- IAsyncReader_BeginFlush(This->pInputPin.pReader);
+ if (This->reader)
+ IAsyncReader_BeginFlush(This->reader);
LeaveCriticalSection(&This->filter.csFilter);
break;
case GST_EVENT_FLUSH_STOP:
EnterCriticalSection(&This->filter.csFilter);
- if (This->pInputPin.pReader)
- IAsyncReader_EndFlush(This->pInputPin.pReader);
+ if (This->reader)
+ IAsyncReader_EndFlush(This->reader);
LeaveCriticalSection(&This->filter.csFilter);
break;
default:
@@ -505,7 +502,7 @@ static DWORD CALLBACK push_data(LPVOID iface)
IBaseFilter_AddRef(&This->filter.IBaseFilter_iface);
if (!This->stop)
- IAsyncReader_Length(This->pInputPin.pReader, &maxlen, &curlen);
+ IAsyncReader_Length(This->reader, &maxlen, &curlen);
else
maxlen = This->stop;
@@ -522,8 +519,7 @@ static DWORD CALLBACK push_data(LPVOID iface)
BYTE *data;
int ret;
- TRACE("pAlloc: %p\n", This->pInputPin.pAlloc);
- hr = IMemAllocator_GetBuffer(This->pInputPin.pAlloc, &buf, NULL, NULL, 0);
+ hr = IMemAllocator_GetBuffer(This->alloc, &buf, NULL, NULL, 0);
if (FAILED(hr))
break;
@@ -537,13 +533,13 @@ static DWORD CALLBACK push_data(LPVOID iface)
tStop = tStart + MEDIATIME_FROM_BYTES(len);
IMediaSample_SetTime(buf, &tStart, &tStop);
- hr = IAsyncReader_Request(This->pInputPin.pReader, buf, 0);
+ hr = IAsyncReader_Request(This->reader, buf, 0);
if (FAILED(hr)) {
IMediaSample_Release(buf);
break;
}
This->nextofs += len;
- hr = IAsyncReader_WaitForNext(This->pInputPin.pReader, -1, &buf, &user);
+ hr = IAsyncReader_WaitForNext(This->reader, -1, &buf, &user);
if (FAILED(hr) || !buf) {
if (buf)
IMediaSample_Release(buf);
@@ -577,7 +573,7 @@ static DWORD CALLBACK push_data(LPVOID iface)
TRACE("Almost stopping.. %08x\n", hr);
do {
- IAsyncReader_WaitForNext(This->pInputPin.pReader, 0, &buf, &user);
+ IAsyncReader_WaitForNext(This->reader, 0, &buf, &user);
if (buf)
IMediaSample_Release(buf);
} while (buf);
@@ -700,7 +696,7 @@ static GstFlowReturn request_buffer_src(GstPad *pad, GstObject *parent, guint64
*buf = gst_buffer_new_and_alloc(len);
gst_buffer_map(*buf, &info, GST_MAP_WRITE);
- hr = IAsyncReader_SyncRead(This->pInputPin.pReader, ofs, len, info.data);
+ hr = IAsyncReader_SyncRead(This->reader, ofs, len, info.data);
gst_buffer_unmap(*buf, &info);
if (FAILED(hr)) {
ERR("Returned %08x\n", hr);
@@ -986,14 +982,14 @@ static gboolean activate_push(GstPad *pad, gboolean activate)
if (!activate) {
TRACE("Deactivating\n");
if (!This->initial)
- IAsyncReader_BeginFlush(This->pInputPin.pReader);
+ IAsyncReader_BeginFlush(This->reader);
if (This->push_thread) {
WaitForSingleObject(This->push_thread, -1);
CloseHandle(This->push_thread);
This->push_thread = NULL;
}
if (!This->initial)
- IAsyncReader_EndFlush(This->pInputPin.pReader);
+ IAsyncReader_EndFlush(This->reader);
if (This->filter.state == State_Stopped)
This->nextofs = This->start;
} else if (!This->push_thread) {
@@ -1074,9 +1070,8 @@ static void unknown_type(GstElement *bin, GstPad *pad, GstCaps *caps, gpointer u
g_free(strcaps);
}
-static HRESULT GST_Connect(GSTInPin *pPin, IPin *pConnectPin, ALLOCATOR_PROPERTIES *props)
+static HRESULT GST_Connect(GSTImpl *This, IPin *pConnectPin, ALLOCATOR_PROPERTIES *props)
{
- GSTImpl *This = impl_from_strmbase_filter(pPin->pin.filter);
int ret, i;
LONGLONG avail, duration;
GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE(
@@ -1086,10 +1081,8 @@ static HRESULT GST_Connect(GSTInPin *pPin, IPin *pConnectPin, ALLOCATOR_PROPERTI
GST_STATIC_CAPS_ANY);
GstElement *gstfilter;
- TRACE("%p %p %p\n", pPin, pConnectPin, props);
-
This->props = *props;
- IAsyncReader_Length(pPin->pReader, &This->filesize, &avail);
+ IAsyncReader_Length(This->reader, &This->filesize, &avail);
if (!This->bus) {
This->bus = gst_bus_new();
@@ -1179,7 +1172,7 @@ static IPin *gstdemux_get_pin(struct strmbase_filter *base, unsigned int index)
GSTImpl *filter = impl_from_strmbase_filter(base);
if (!index)
- return &filter->pInputPin.pin.IPin_iface;
+ return &filter->sink.IPin_iface;
else if (index <= filter->cStreams)
return &filter->ppPins[index - 1]->pin.pin.IPin_iface;
return NULL;
@@ -1188,31 +1181,28 @@ static IPin *gstdemux_get_pin(struct strmbase_filter *base, unsigned int index)
static void gstdemux_destroy(struct strmbase_filter *iface)
{
GSTImpl *filter = impl_from_strmbase_filter(iface);
- IPin *connected = NULL;
HRESULT hr;
CloseHandle(filter->no_more_pads_event);
CloseHandle(filter->push_event);
/* Don't need to clean up output pins, disconnecting input pin will do that */
- IPin_ConnectedTo((IPin *)&filter->pInputPin, &connected);
- if (connected)
+ if (filter->sink.pConnectedTo)
{
- hr = IPin_Disconnect(connected);
+ hr = IPin_Disconnect(filter->sink.pConnectedTo);
assert(hr == S_OK);
- IPin_Release(connected);
- hr = IPin_Disconnect(&filter->pInputPin.pin.IPin_iface);
+ hr = IPin_Disconnect(&filter->sink.IPin_iface);
assert(hr == S_OK);
}
- FreeMediaType(&filter->pInputPin.pin.mtCurrent);
- if (filter->pInputPin.pAlloc)
- IMemAllocator_Release(filter->pInputPin.pAlloc);
- filter->pInputPin.pAlloc = NULL;
- if (filter->pInputPin.pReader)
- IAsyncReader_Release(filter->pInputPin.pReader);
- filter->pInputPin.pReader = NULL;
- filter->pInputPin.pin.IPin_iface.lpVtbl = NULL;
+ FreeMediaType(&filter->sink.mtCurrent);
+ if (filter->alloc)
+ IMemAllocator_Release(filter->alloc);
+ filter->alloc = NULL;
+ if (filter->reader)
+ IAsyncReader_Release(filter->reader);
+ filter->reader = NULL;
+ filter->sink.IPin_iface.lpVtbl = NULL;
if (filter->bus)
{
@@ -1258,12 +1248,10 @@ IUnknown * CALLBACK Gstreamer_Splitter_create(IUnknown *outer, HRESULT *phr)
This->push_event = CreateEventW(NULL, 0, 0, NULL);
This->bus = NULL;
- This->pInputPin.pin.dir = PINDIR_INPUT;
- This->pInputPin.pin.filter = &This->filter;
- lstrcpynW(This->pInputPin.pin.name, wcsInputPinName, ARRAY_SIZE(This->pInputPin.pin.name));
- This->pInputPin.pin.IPin_iface.lpVtbl = &GST_InputPin_Vtbl;
- This->pInputPin.pin.pConnectedTo = NULL;
- ZeroMemory(&This->pInputPin.pin.mtCurrent, sizeof(AM_MEDIA_TYPE));
+ This->sink.dir = PINDIR_INPUT;
+ This->sink.filter = &This->filter;
+ lstrcpynW(This->sink.name, wcsInputPinName, ARRAY_SIZE(This->sink.name));
+ This->sink.IPin_iface.lpVtbl = &GST_InputPin_Vtbl;
*phr = S_OK;
TRACE("Created GStreamer demuxer %p.\n", This);
@@ -1696,18 +1684,18 @@ static HRESULT WINAPI GSTOutPin_DecideBufferSize(BaseOutputPin *iface, IMemAlloc
static HRESULT WINAPI GSTOutPin_DecideAllocator(BaseOutputPin *base, IMemInputPin *pPin, IMemAllocator **pAlloc)
{
GSTOutPin *pin = impl_source_from_IPin(&base->pin.IPin_iface);
- GSTImpl *GSTfilter = impl_from_strmbase_filter(pin->pin.pin.filter);
+ GSTImpl *filter = impl_from_strmbase_filter(pin->pin.pin.filter);
HRESULT hr;
TRACE("pin %p, peer %p, allocator %p.\n", pin, pPin, pAlloc);
*pAlloc = NULL;
- if (GSTfilter->pInputPin.pAlloc)
+ if (filter->alloc)
{
- hr = IMemInputPin_NotifyAllocator(pPin, GSTfilter->pInputPin.pAlloc, FALSE);
+ hr = IMemInputPin_NotifyAllocator(pPin, filter->alloc, FALSE);
if (SUCCEEDED(hr))
{
- *pAlloc = GSTfilter->pInputPin.pAlloc;
+ *pAlloc = filter->alloc;
IMemAllocator_AddRef(*pAlloc);
}
}
@@ -1835,25 +1823,25 @@ static HRESULT GST_RemoveOutputPins(GSTImpl *This)
return S_OK;
}
-static inline GSTInPin *impl_sink_from_IPin(IPin *iface)
+static inline GSTImpl *impl_from_sink_IPin(IPin *iface)
{
- return CONTAINING_RECORD(iface, GSTInPin, pin.IPin_iface);
+ return CONTAINING_RECORD(iface, GSTImpl, sink.IPin_iface);
}
static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
{
- GSTInPin *This = impl_sink_from_IPin(iface);
- GSTImpl *filter = impl_from_strmbase_filter(This->pin.filter);
+ GSTImpl *filter = impl_from_sink_IPin(iface);
PIN_DIRECTION pindirReceive;
HRESULT hr = S_OK;
- TRACE("(%p/%p)->(%p, %p)\n", This, iface, pReceivePin, pmt);
+ TRACE("filter %p, peer %p, mt %p.\n", filter, pReceivePin, pmt);
dump_AM_MEDIA_TYPE(pmt);
mark_wine_thread();
EnterCriticalSection(&filter->filter.csFilter);
- if (!This->pin.pConnectedTo) {
+ if (!filter->sink.pConnectedTo)
+ {
ALLOCATOR_PROPERTIES props;
IMemAllocator *pAlloc = NULL;
@@ -1873,13 +1861,13 @@ static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin,
}
}
- This->pReader = NULL;
- This->pAlloc = NULL;
+ filter->reader = NULL;
+ filter->alloc = NULL;
ResetEvent(filter->push_event);
if (SUCCEEDED(hr))
- hr = IPin_QueryInterface(pReceivePin, &IID_IAsyncReader, (LPVOID *)&This->pReader);
+ hr = IPin_QueryInterface(pReceivePin, &IID_IAsyncReader, (LPVOID *)&filter->reader);
if (SUCCEEDED(hr))
- hr = GST_Connect(This, pReceivePin, &props);
+ hr = GST_Connect(filter, pReceivePin, &props);
/* A certain IAsyncReader::RequestAllocator expects to be passed
non-NULL preferred allocator */
@@ -1887,26 +1875,26 @@ static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin,
hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC,
&IID_IMemAllocator, (LPVOID *)&pAlloc);
if (SUCCEEDED(hr)) {
- hr = IAsyncReader_RequestAllocator(This->pReader, pAlloc, &props, &This->pAlloc);
+ hr = IAsyncReader_RequestAllocator(filter->reader, pAlloc, &props, &filter->alloc);
if (FAILED(hr))
WARN("Can't get an allocator, got %08x\n", hr);
}
if (pAlloc)
IMemAllocator_Release(pAlloc);
if (SUCCEEDED(hr)) {
- CopyMediaType(&This->pin.mtCurrent, pmt);
- This->pin.pConnectedTo = pReceivePin;
+ CopyMediaType(&filter->sink.mtCurrent, pmt);
+ filter->sink.pConnectedTo = pReceivePin;
IPin_AddRef(pReceivePin);
- hr = IMemAllocator_Commit(This->pAlloc);
+ hr = IMemAllocator_Commit(filter->alloc);
SetEvent(filter->push_event);
} else {
GST_RemoveOutputPins(filter);
- if (This->pReader)
- IAsyncReader_Release(This->pReader);
- This->pReader = NULL;
- if (This->pAlloc)
- IMemAllocator_Release(This->pAlloc);
- This->pAlloc = NULL;
+ if (filter->reader)
+ IAsyncReader_Release(filter->reader);
+ filter->reader = NULL;
+ if (filter->alloc)
+ IMemAllocator_Release(filter->alloc);
+ filter->alloc = NULL;
}
TRACE("Size: %i\n", props.cbBuffer);
} else
@@ -1917,26 +1905,24 @@ static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin,
static HRESULT WINAPI GSTInPin_Disconnect(IPin *iface)
{
- GSTInPin *This = impl_sink_from_IPin(iface);
- GSTImpl *filter = impl_from_strmbase_filter(This->pin.filter);
+ GSTImpl *filter = impl_from_sink_IPin(iface);
HRESULT hr;
FILTER_STATE state;
- TRACE("(%p)\n", This);
+ TRACE("filter %p.\n", filter);
mark_wine_thread();
hr = IBaseFilter_GetState(&filter->filter.IBaseFilter_iface, INFINITE, &state);
EnterCriticalSection(&filter->filter.csFilter);
- if (This->pin.pConnectedTo) {
- GSTImpl *Parser = impl_from_strmbase_filter(This->pin.filter);
-
+ if (filter->sink.pConnectedTo)
+ {
if (SUCCEEDED(hr) && state == State_Stopped) {
- IMemAllocator_Decommit(This->pAlloc);
- IPin_Disconnect(This->pin.pConnectedTo);
- IPin_Release(This->pin.pConnectedTo);
- This->pin.pConnectedTo = NULL;
- hr = GST_RemoveOutputPins(Parser);
+ IMemAllocator_Decommit(filter->alloc);
+ IPin_Disconnect(filter->sink.pConnectedTo);
+ IPin_Release(filter->sink.pConnectedTo);
+ filter->sink.pConnectedTo = NULL;
+ hr = GST_RemoveOutputPins(filter);
} else
hr = VFW_E_NOT_STOPPED;
} else
@@ -1947,9 +1933,7 @@ static HRESULT WINAPI GSTInPin_Disconnect(IPin *iface)
static HRESULT WINAPI GSTInPin_QueryAccept(IPin *iface, const AM_MEDIA_TYPE *pmt)
{
- GSTInPin *This = impl_sink_from_IPin(iface);
-
- TRACE("(%p)->(%p)\n", This, pmt);
+ TRACE("iface %p, mt %p.\n", iface, pmt);
dump_AM_MEDIA_TYPE(pmt);
if (IsEqualIID(&pmt->majortype, &MEDIATYPE_Stream))
@@ -1987,9 +1971,9 @@ static HRESULT WINAPI GSTInPin_NewSegment(IPin *iface, REFERENCE_TIME start,
static HRESULT WINAPI GSTInPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv)
{
- GSTInPin *This = impl_sink_from_IPin(iface);
+ GSTImpl *filter = impl_from_sink_IPin(iface);
- TRACE("(%p/%p)->(%s, %p)\n", This, iface, debugstr_guid(riid), ppv);
+ TRACE("filter %p, riid %s, ppv %p.\n", filter, debugstr_guid(riid), ppv);
*ppv = NULL;
@@ -1999,7 +1983,7 @@ static HRESULT WINAPI GSTInPin_QueryInterface(IPin * iface, REFIID riid, LPVOID
*ppv = iface;
else if (IsEqualIID(riid, &IID_IMediaSeeking))
{
- return IBaseFilter_QueryInterface(&This->pin.filter->IBaseFilter_iface, &IID_IMediaSeeking, ppv);
+ return IBaseFilter_QueryInterface(&filter->filter.IBaseFilter_iface, &IID_IMediaSeeking, ppv);
}
if (*ppv)
--
2.23.0
More information about the wine-devel
mailing list