Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/strmbase/pin.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/dlls/strmbase/pin.c b/dlls/strmbase/pin.c index 5255a6c7b0b..3dd00b27ccc 100644 --- a/dlls/strmbase/pin.c +++ b/dlls/strmbase/pin.c @@ -633,6 +633,9 @@ HRESULT WINAPI BaseInputPinImpl_ReceiveConnection(IPin * iface, IPin * pReceiveP TRACE("(%p)->(%p, %p)\n", This, pReceivePin, pmt); strmbase_dump_media_type(pmt);
+ if (!pmt) + return E_POINTER; + EnterCriticalSection(&This->pin.filter->csFilter); { if (This->pin.filter->state != State_Stopped)
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/avimux.c | 71 ++++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 46 deletions(-)
diff --git a/dlls/qcap/avimux.c b/dlls/qcap/avimux.c index 63e98e8877b..c17d91322bf 100644 --- a/dlls/qcap/avimux.c +++ b/dlls/qcap/avimux.c @@ -1410,41 +1410,15 @@ static HRESULT WINAPI AviMuxIn_Receive(struct strmbase_sink *base, IMediaSample return hr; }
-static const struct strmbase_sink_ops sink_ops = -{ - .base.pin_query_interface = sink_query_interface, - .base.pin_query_accept = sink_query_accept, - .base.pin_get_media_type = strmbase_pin_get_media_type, - .pfnReceive = AviMuxIn_Receive, -}; - -static inline AviMux* impl_from_in_IPin(IPin *iface) +static HRESULT avi_mux_sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *pmt) { - struct strmbase_pin *pin = CONTAINING_RECORD(iface, struct strmbase_pin, IPin_iface); - return impl_from_strmbase_filter(pin->filter); -} - -static inline AviMuxIn* AviMuxIn_from_IPin(IPin *iface) -{ - return CONTAINING_RECORD(iface, AviMuxIn, pin.pin.IPin_iface); -} - -static HRESULT WINAPI AviMuxIn_ReceiveConnection(IPin *iface, - IPin *pConnector, const AM_MEDIA_TYPE *pmt) -{ - AviMux *This = impl_from_in_IPin(iface); - AviMuxIn *avimuxin = AviMuxIn_from_IPin(iface); + AviMuxIn *avimuxin = impl_sink_from_strmbase_pin(&iface->pin); + AviMux *This = impl_from_strmbase_filter(iface->pin.filter); HRESULT hr;
- TRACE("pin %p, pConnector %p, pmt %p.\n", avimuxin, pConnector, pmt); - if(!pmt) return E_POINTER;
- hr = BaseInputPinImpl_ReceiveConnection(iface, pConnector, pmt); - if(FAILED(hr)) - return hr; - if(IsEqualIID(&pmt->majortype, &MEDIATYPE_Video) && IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo)) { ALLOCATOR_PROPERTIES req, act; @@ -1468,10 +1442,8 @@ static HRESULT WINAPI AviMuxIn_ReceiveConnection(IPin *iface, hr = IMemAllocator_SetProperties(avimuxin->samples_allocator, &req, &act); if(SUCCEEDED(hr)) hr = IMemAllocator_Commit(avimuxin->samples_allocator); - if(FAILED(hr)) { - BaseInputPinImpl_Disconnect(iface); + if (FAILED(hr)) return hr; - }
size = pmt->cbFormat - FIELD_OFFSET(VIDEOINFOHEADER, bmiHeader); avimuxin->strf = CoTaskMemAlloc(sizeof(RIFFCHUNK) + ALIGN(FIELD_OFFSET(BITMAPINFO, bmiColors[vih->bmiHeader.biClrUsed]))); @@ -1489,23 +1461,15 @@ static HRESULT WINAPI AviMuxIn_ReceiveConnection(IPin *iface, return create_input_pin(This); }
-static HRESULT WINAPI AviMuxIn_Disconnect(IPin *iface) +static void avi_mux_sink_disconnect(struct strmbase_sink *iface) { - AviMuxIn *avimuxin = AviMuxIn_from_IPin(iface); + AviMuxIn *avimuxin = impl_sink_from_strmbase_pin(&iface->pin); IMediaSample **prev, *cur; - HRESULT hr; - - TRACE("pin %p.\n", avimuxin); - - hr = BaseInputPinImpl_Disconnect(iface); - if(FAILED(hr)) - return hr;
IMemAllocator_Decommit(avimuxin->samples_allocator); while(avimuxin->samples_head) { cur = avimuxin->samples_head; - hr = IMediaSample_GetPointer(cur, (BYTE**)&prev); - if(FAILED(hr)) + if (FAILED(IMediaSample_GetPointer(cur, (BYTE **)&prev))) break; prev--;
@@ -1518,7 +1482,22 @@ static HRESULT WINAPI AviMuxIn_Disconnect(IPin *iface) } CoTaskMemFree(avimuxin->strf); avimuxin->strf = NULL; - return hr; +} + +static const struct strmbase_sink_ops sink_ops = +{ + .base.pin_query_interface = sink_query_interface, + .base.pin_query_accept = sink_query_accept, + .base.pin_get_media_type = strmbase_pin_get_media_type, + .pfnReceive = AviMuxIn_Receive, + .sink_connect = avi_mux_sink_connect, + .sink_disconnect = avi_mux_sink_disconnect, +}; + +static inline AviMux* impl_from_in_IPin(IPin *iface) +{ + struct strmbase_pin *pin = CONTAINING_RECORD(iface, struct strmbase_pin, IPin_iface); + return impl_from_strmbase_filter(pin->filter); }
static const IPinVtbl AviMuxIn_PinVtbl = { @@ -1526,8 +1505,8 @@ static const IPinVtbl AviMuxIn_PinVtbl = { BasePinImpl_AddRef, BasePinImpl_Release, BaseInputPinImpl_Connect, - AviMuxIn_ReceiveConnection, - AviMuxIn_Disconnect, + BaseInputPinImpl_ReceiveConnection, + BaseInputPinImpl_Disconnect, BasePinImpl_ConnectedTo, BasePinImpl_ConnectionMediaType, BasePinImpl_QueryPinInfo,
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/winegstreamer/gstdemux.c | 83 ++++++++++++++--------------------- 1 file changed, 34 insertions(+), 49 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index e7d0313d7ce..589a7b7af17 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -52,7 +52,7 @@ struct gstdemux struct strmbase_filter filter; IAMStreamSelect IAMStreamSelect_iface;
- struct strmbase_pin sink; + struct strmbase_sink sink; IAsyncReader *reader; IMemAllocator *alloc; struct gstdemux_source **ppPins; @@ -1184,7 +1184,7 @@ static struct strmbase_pin *gstdemux_get_pin(struct strmbase_filter *base, unsig struct gstdemux *filter = impl_from_strmbase_filter(base);
if (!index) - return &filter->sink; + return &filter->sink.pin; else if (index <= filter->cStreams) return &filter->ppPins[index - 1]->pin.pin; return NULL; @@ -1199,28 +1199,27 @@ static void gstdemux_destroy(struct strmbase_filter *iface) CloseHandle(filter->duration_event);
/* Don't need to clean up output pins, disconnecting input pin will do that */ - if (filter->sink.peer) + if (filter->sink.pin.peer) { - hr = IPin_Disconnect(filter->sink.peer); + hr = IPin_Disconnect(filter->sink.pin.peer); assert(hr == S_OK); - hr = IPin_Disconnect(&filter->sink.IPin_iface); + hr = IPin_Disconnect(&filter->sink.pin.IPin_iface); assert(hr == S_OK); }
- FreeMediaType(&filter->sink.mt); 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) { gst_bus_set_sync_handler(filter->bus, NULL, NULL, NULL); gst_object_unref(filter->bus); } + strmbase_sink_cleanup(&filter->sink); strmbase_filter_cleanup(&filter->filter); heap_free(filter); } @@ -1351,10 +1350,10 @@ static HRESULT sink_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE return S_FALSE; }
-static const BasePinFuncTable sink_ops = +static const struct strmbase_sink_ops sink_ops = { - .pin_query_accept = sink_query_accept, - .pin_get_media_type = strmbase_pin_get_media_type, + .base.pin_query_accept = sink_query_accept, + .base.pin_get_media_type = strmbase_pin_get_media_type, };
static BOOL gstdecoder_init_gst(struct gstdemux *filter) @@ -1437,13 +1436,10 @@ IUnknown * CALLBACK Gstreamer_Splitter_create(IUnknown *outer, HRESULT *phr) }
strmbase_filter_init(&object->filter, outer, &CLSID_Gstreamer_Splitter, &filter_ops); + strmbase_sink_init(&object->sink, &GST_InputPin_Vtbl, &object->filter, + wcsInputPinName, &sink_ops, NULL);
object->no_more_pads_event = CreateEventW(NULL, FALSE, FALSE, NULL); - object->sink.dir = PINDIR_INPUT; - object->sink.filter = &object->filter; - lstrcpynW(object->sink.name, wcsInputPinName, ARRAY_SIZE(object->sink.name)); - object->sink.IPin_iface.lpVtbl = &GST_InputPin_Vtbl; - object->sink.pFuncsTable = &sink_ops; object->init_gst = gstdecoder_init_gst; *phr = S_OK;
@@ -1907,7 +1903,7 @@ static HRESULT GST_RemoveOutputPins(struct gstdemux *This)
static inline struct gstdemux *impl_from_sink_IPin(IPin *iface) { - return CONTAINING_RECORD(iface, struct gstdemux, sink.IPin_iface); + return CONTAINING_RECORD(iface, struct gstdemux, sink.pin.IPin_iface); }
static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) @@ -1922,7 +1918,7 @@ static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, mark_wine_thread();
EnterCriticalSection(&filter->filter.csFilter); - if (!filter->sink.peer) + if (!filter->sink.pin.peer) { ALLOCATOR_PROPERTIES props; IMemAllocator *pAlloc = NULL; @@ -1963,8 +1959,8 @@ static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, if (pAlloc) IMemAllocator_Release(pAlloc); if (SUCCEEDED(hr)) { - CopyMediaType(&filter->sink.mt, pmt); - filter->sink.peer = pReceivePin; + CopyMediaType(&filter->sink.pin.mt, pmt); + filter->sink.pin.peer = pReceivePin; IPin_AddRef(pReceivePin); hr = IMemAllocator_Commit(filter->alloc); } else { @@ -1995,13 +1991,13 @@ static HRESULT WINAPI GSTInPin_Disconnect(IPin *iface)
hr = IBaseFilter_GetState(&filter->filter.IBaseFilter_iface, INFINITE, &state); EnterCriticalSection(&filter->filter.csFilter); - if (filter->sink.peer) + if (filter->sink.pin.peer) { if (SUCCEEDED(hr) && state == State_Stopped) { IMemAllocator_Decommit(filter->alloc); - IPin_Disconnect(filter->sink.peer); - IPin_Release(filter->sink.peer); - filter->sink.peer = NULL; + IPin_Disconnect(filter->sink.pin.peer); + IPin_Release(filter->sink.pin.peer); + filter->sink.pin.peer = NULL; hr = GST_RemoveOutputPins(filter); } else hr = VFW_E_NOT_STOPPED; @@ -2220,10 +2216,10 @@ static HRESULT wave_parser_sink_query_accept(struct strmbase_pin *iface, const A return S_FALSE; }
-static const BasePinFuncTable wave_parser_sink_ops = +static const struct strmbase_sink_ops wave_parser_sink_ops = { - .pin_query_accept = wave_parser_sink_query_accept, - .pin_get_media_type = strmbase_pin_get_media_type, + .base.pin_query_accept = wave_parser_sink_query_accept, + .base.pin_get_media_type = strmbase_pin_get_media_type, };
static BOOL wave_parser_init_gst(struct gstdemux *filter) @@ -2305,12 +2301,8 @@ IUnknown * CALLBACK wave_parser_create(IUnknown *outer, HRESULT *phr) }
strmbase_filter_init(&object->filter, outer, &CLSID_WAVEParser, &filter_ops); - - object->sink.dir = PINDIR_INPUT; - object->sink.filter = &object->filter; - lstrcpynW(object->sink.name, sink_name, ARRAY_SIZE(object->sink.name)); - object->sink.IPin_iface.lpVtbl = &GST_InputPin_Vtbl; - object->sink.pFuncsTable = &wave_parser_sink_ops; + strmbase_sink_init(&object->sink, &GST_InputPin_Vtbl, &object->filter, + sink_name, &wave_parser_sink_ops, NULL); object->init_gst = wave_parser_init_gst; *phr = S_OK;
@@ -2326,10 +2318,10 @@ static HRESULT avi_splitter_sink_query_accept(struct strmbase_pin *iface, const return S_FALSE; }
-static const BasePinFuncTable avi_splitter_sink_ops = +static const struct strmbase_sink_ops avi_splitter_sink_ops = { - .pin_query_accept = avi_splitter_sink_query_accept, - .pin_get_media_type = strmbase_pin_get_media_type, + .base.pin_query_accept = avi_splitter_sink_query_accept, + .base.pin_get_media_type = strmbase_pin_get_media_type, };
static BOOL avi_splitter_init_gst(struct gstdemux *filter) @@ -2411,13 +2403,9 @@ IUnknown * CALLBACK avi_splitter_create(IUnknown *outer, HRESULT *phr) }
strmbase_filter_init(&object->filter, outer, &CLSID_AviSplitter, &filter_ops); - + strmbase_sink_init(&object->sink, &GST_InputPin_Vtbl, &object->filter, + sink_name, &avi_splitter_sink_ops, NULL); object->no_more_pads_event = CreateEventW(NULL, FALSE, FALSE, NULL); - object->sink.dir = PINDIR_INPUT; - object->sink.filter = &object->filter; - lstrcpynW(object->sink.name, sink_name, ARRAY_SIZE(object->sink.name)); - object->sink.IPin_iface.lpVtbl = &GST_InputPin_Vtbl; - object->sink.pFuncsTable = &avi_splitter_sink_ops; object->init_gst = avi_splitter_init_gst; *phr = S_OK;
@@ -2438,10 +2426,10 @@ static HRESULT mpeg_splitter_sink_query_accept(struct strmbase_pin *iface, const return S_FALSE; }
-static const BasePinFuncTable mpeg_splitter_sink_ops = +static const struct strmbase_sink_ops mpeg_splitter_sink_ops = { - .pin_query_accept = mpeg_splitter_sink_query_accept, - .pin_get_media_type = strmbase_pin_get_media_type, + .base.pin_query_accept = mpeg_splitter_sink_query_accept, + .base.pin_get_media_type = strmbase_pin_get_media_type, };
static BOOL mpeg_splitter_init_gst(struct gstdemux *filter) @@ -2549,14 +2537,11 @@ IUnknown * CALLBACK mpeg_splitter_create(IUnknown *outer, HRESULT *phr) }
strmbase_filter_init(&object->filter, outer, &CLSID_MPEG1Splitter, &mpeg_splitter_ops); + strmbase_sink_init(&object->sink, &GST_InputPin_Vtbl, &object->filter, + sink_name, &mpeg_splitter_sink_ops, NULL); object->IAMStreamSelect_iface.lpVtbl = &stream_select_vtbl;
object->duration_event = CreateEventW(NULL, FALSE, FALSE, NULL); - object->sink.dir = PINDIR_INPUT; - object->sink.filter = &object->filter; - lstrcpynW(object->sink.name, sink_name, ARRAY_SIZE(object->sink.name)); - object->sink.IPin_iface.lpVtbl = &GST_InputPin_Vtbl; - object->sink.pFuncsTable = &mpeg_splitter_sink_ops; object->init_gst = mpeg_splitter_init_gst; *phr = S_OK;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/winegstreamer/gstdemux.c | 182 ++++++++++++++-------------------- 1 file changed, 74 insertions(+), 108 deletions(-)
diff --git a/dlls/winegstreamer/gstdemux.c b/dlls/winegstreamer/gstdemux.c index 589a7b7af17..fb60d69e2ac 100644 --- a/dlls/winegstreamer/gstdemux.c +++ b/dlls/winegstreamer/gstdemux.c @@ -1343,6 +1343,11 @@ static const struct strmbase_filter_ops filter_ops = .filter_wait_state = gstdemux_wait_state, };
+static inline struct gstdemux *impl_from_strmbase_sink(struct strmbase_sink *iface) +{ + return CONTAINING_RECORD(iface, struct gstdemux, sink); +} + static HRESULT sink_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) { if (IsEqualGUID(&mt->majortype, &MEDIATYPE_Stream)) @@ -1350,10 +1355,71 @@ static HRESULT sink_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE return S_FALSE; }
+static HRESULT gstdemux_sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *pmt) +{ + struct gstdemux *filter = impl_from_strmbase_sink(iface); + IMemAllocator *allocator = NULL; + ALLOCATOR_PROPERTIES props; + HRESULT hr = S_OK; + + mark_wine_thread(); + + props.cBuffers = 8; + props.cbBuffer = 16384; + props.cbAlign = 1; + props.cbPrefix = 0; + + filter->reader = NULL; + filter->alloc = NULL; + if (FAILED(hr = IPin_QueryInterface(peer, &IID_IAsyncReader, (void **)&filter->reader))) + return hr; + + if (FAILED(hr = GST_Connect(filter, peer, &props))) + goto err; + + /* Some applications depend on IAsyncReader::RequestAllocator() passing a + * non-NULL preferred allocator. */ + hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC, + &IID_IMemAllocator, (void **)&allocator); + if (FAILED(hr)) + goto err; + hr = IAsyncReader_RequestAllocator(filter->reader, allocator, &props, &filter->alloc); + IMemAllocator_Release(allocator); + if (FAILED(hr)) + { + WARN("Failed to get allocator, hr %#x.\n", hr); + goto err; + } + + if (FAILED(hr = IMemAllocator_Commit(filter->alloc))) + { + WARN("Failed to commit allocator, hr %#x.\n", hr); + goto err; + } + + return S_OK; +err: + GST_RemoveOutputPins(filter); + IAsyncReader_Release(filter->reader); + return hr; +} + +static void gstdemux_sink_disconnect(struct strmbase_sink *iface) +{ + struct gstdemux *filter = impl_from_strmbase_sink(iface); + + mark_wine_thread(); + + IMemAllocator_Decommit(filter->alloc); + GST_RemoveOutputPins(filter); +} + static const struct strmbase_sink_ops sink_ops = { .base.pin_query_accept = sink_query_accept, .base.pin_get_media_type = strmbase_pin_get_media_type, + .sink_connect = gstdemux_sink_connect, + .sink_disconnect = gstdemux_sink_disconnect, };
static BOOL gstdecoder_init_gst(struct gstdemux *filter) @@ -1901,112 +1967,6 @@ static HRESULT GST_RemoveOutputPins(struct gstdemux *This) return S_OK; }
-static inline struct gstdemux *impl_from_sink_IPin(IPin *iface) -{ - return CONTAINING_RECORD(iface, struct gstdemux, sink.pin.IPin_iface); -} - -static HRESULT WINAPI GSTInPin_ReceiveConnection(IPin *iface, IPin *pReceivePin, const AM_MEDIA_TYPE *pmt) -{ - struct gstdemux *filter = impl_from_sink_IPin(iface); - PIN_DIRECTION pindirReceive; - HRESULT hr = S_OK; - - TRACE("filter %p, peer %p, mt %p.\n", filter, pReceivePin, pmt); - strmbase_dump_media_type(pmt); - - mark_wine_thread(); - - EnterCriticalSection(&filter->filter.csFilter); - if (!filter->sink.pin.peer) - { - ALLOCATOR_PROPERTIES props; - IMemAllocator *pAlloc = NULL; - - props.cBuffers = 8; - props.cbBuffer = 16384; - props.cbAlign = 1; - props.cbPrefix = 0; - - if (IPin_QueryAccept(iface, pmt) != S_OK) - hr = VFW_E_TYPE_NOT_ACCEPTED; - - if (SUCCEEDED(hr)) { - IPin_QueryDirection(pReceivePin, &pindirReceive); - if (pindirReceive != PINDIR_OUTPUT) { - ERR("Can't connect from non-output pin\n"); - hr = VFW_E_INVALID_DIRECTION; - } - } - - filter->reader = NULL; - filter->alloc = NULL; - if (SUCCEEDED(hr)) - hr = IPin_QueryInterface(pReceivePin, &IID_IAsyncReader, (LPVOID *)&filter->reader); - if (SUCCEEDED(hr)) - hr = GST_Connect(filter, pReceivePin, &props); - - /* A certain IAsyncReader::RequestAllocator expects to be passed - non-NULL preferred allocator */ - if (SUCCEEDED(hr)) - hr = CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC, - &IID_IMemAllocator, (LPVOID *)&pAlloc); - if (SUCCEEDED(hr)) { - 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(&filter->sink.pin.mt, pmt); - filter->sink.pin.peer = pReceivePin; - IPin_AddRef(pReceivePin); - hr = IMemAllocator_Commit(filter->alloc); - } else { - GST_RemoveOutputPins(filter); - 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 - hr = VFW_E_ALREADY_CONNECTED; - LeaveCriticalSection(&filter->filter.csFilter); - return hr; -} - -static HRESULT WINAPI GSTInPin_Disconnect(IPin *iface) -{ - struct gstdemux *filter = impl_from_sink_IPin(iface); - HRESULT hr; - FILTER_STATE state; - - TRACE("filter %p.\n", filter); - - mark_wine_thread(); - - hr = IBaseFilter_GetState(&filter->filter.IBaseFilter_iface, INFINITE, &state); - EnterCriticalSection(&filter->filter.csFilter); - if (filter->sink.pin.peer) - { - if (SUCCEEDED(hr) && state == State_Stopped) { - IMemAllocator_Decommit(filter->alloc); - IPin_Disconnect(filter->sink.pin.peer); - IPin_Release(filter->sink.pin.peer); - filter->sink.pin.peer = NULL; - hr = GST_RemoveOutputPins(filter); - } else - hr = VFW_E_NOT_STOPPED; - } else - hr = S_FALSE; - LeaveCriticalSection(&filter->filter.csFilter); - return hr; -} - static HRESULT WINAPI GSTInPin_EndOfStream(IPin *iface) { FIXME("iface %p, stub!\n", iface); @@ -2040,8 +2000,8 @@ static const IPinVtbl GST_InputPin_Vtbl = { BasePinImpl_AddRef, BasePinImpl_Release, BaseInputPinImpl_Connect, - GSTInPin_ReceiveConnection, - GSTInPin_Disconnect, + BaseInputPinImpl_ReceiveConnection, + BaseInputPinImpl_Disconnect, BasePinImpl_ConnectedTo, BasePinImpl_ConnectionMediaType, BasePinImpl_QueryPinInfo, @@ -2220,6 +2180,8 @@ static const struct strmbase_sink_ops wave_parser_sink_ops = { .base.pin_query_accept = wave_parser_sink_query_accept, .base.pin_get_media_type = strmbase_pin_get_media_type, + .sink_connect = gstdemux_sink_connect, + .sink_disconnect = gstdemux_sink_disconnect, };
static BOOL wave_parser_init_gst(struct gstdemux *filter) @@ -2322,6 +2284,8 @@ static const struct strmbase_sink_ops avi_splitter_sink_ops = { .base.pin_query_accept = avi_splitter_sink_query_accept, .base.pin_get_media_type = strmbase_pin_get_media_type, + .sink_connect = gstdemux_sink_connect, + .sink_disconnect = gstdemux_sink_disconnect, };
static BOOL avi_splitter_init_gst(struct gstdemux *filter) @@ -2430,6 +2394,8 @@ static const struct strmbase_sink_ops mpeg_splitter_sink_ops = { .base.pin_query_accept = mpeg_splitter_sink_query_accept, .base.pin_get_media_type = strmbase_pin_get_media_type, + .sink_connect = gstdemux_sink_connect, + .sink_disconnect = gstdemux_sink_disconnect, };
static BOOL mpeg_splitter_init_gst(struct gstdemux *filter)
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qcap/avico.c | 58 ++++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 41 deletions(-)
diff --git a/dlls/qcap/avico.c b/dlls/qcap/avico.c index f822d4e4616..ecda162be86 100644 --- a/dlls/qcap/avico.c +++ b/dlls/qcap/avico.c @@ -272,52 +272,13 @@ static const IPersistPropertyBagVtbl PersistPropertyBagVtbl = { AVICompressorPropertyBag_Save };
-static inline AVICompressor *impl_from_IPin(IPin *iface) -{ - return impl_from_strmbase_filter(CONTAINING_RECORD(iface, struct strmbase_pin, IPin_iface)->filter); -} - -static HRESULT WINAPI AVICompressorIn_ReceiveConnection(IPin *iface, - IPin *pConnector, const AM_MEDIA_TYPE *pmt) -{ - AVICompressor *This = impl_from_IPin(iface); - HRESULT hres; - - TRACE("(%p)->(%p AM_MEDIA_TYPE(%p))\n", This, pConnector, pmt); - - hres = BaseInputPinImpl_ReceiveConnection(iface, pConnector, pmt); - if(FAILED(hres)) - return hres; - - hres = fill_format_info(This, (VIDEOINFOHEADER*)pmt->pbFormat); - if(FAILED(hres)) - BaseInputPinImpl_Disconnect(iface); - return hres; -} - -static HRESULT WINAPI AVICompressorIn_Disconnect(IPin *iface) -{ - AVICompressor *This = impl_from_IPin(iface); - HRESULT hres; - - TRACE("(%p)\n", This); - - hres = BaseInputPinImpl_Disconnect(iface); - if(FAILED(hres)) - return hres; - - heap_free(This->videoinfo); - This->videoinfo = NULL; - return S_OK; -} - static const IPinVtbl AVICompressorInputPinVtbl = { BasePinImpl_QueryInterface, BasePinImpl_AddRef, BasePinImpl_Release, BaseInputPinImpl_Connect, - AVICompressorIn_ReceiveConnection, - AVICompressorIn_Disconnect, + BaseInputPinImpl_ReceiveConnection, + BaseInputPinImpl_Disconnect, BasePinImpl_ConnectedTo, BasePinImpl_ConnectionMediaType, BasePinImpl_QueryPinInfo, @@ -465,12 +426,27 @@ static HRESULT WINAPI AVICompressorIn_Receive(struct strmbase_sink *base, IMedia return hres; }
+static HRESULT sink_connect(struct strmbase_sink *iface, IPin *peer, const AM_MEDIA_TYPE *mt) +{ + AVICompressor *filter = impl_from_strmbase_pin(&iface->pin); + return fill_format_info(filter, (VIDEOINFOHEADER *)mt->pbFormat); +} + +static void sink_disconnect(struct strmbase_sink *iface) +{ + AVICompressor *filter = impl_from_strmbase_pin(&iface->pin); + heap_free(filter->videoinfo); + filter->videoinfo = NULL; +} + static const struct strmbase_sink_ops sink_ops = { .base.pin_query_accept = sink_query_accept, .base.pin_get_media_type = strmbase_pin_get_media_type, .base.pin_query_interface = sink_query_interface, .pfnReceive = AVICompressorIn_Receive, + .sink_connect = sink_connect, + .sink_disconnect = sink_disconnect, };
static HRESULT source_get_media_type(struct strmbase_pin *base, unsigned int iPosition, AM_MEDIA_TYPE *amt)
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/qedit/samplegrabber.c | 74 ++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 44 deletions(-)
diff --git a/dlls/qedit/samplegrabber.c b/dlls/qedit/samplegrabber.c index c65ab9caa70..91b8d9dce64 100644 --- a/dlls/qedit/samplegrabber.c +++ b/dlls/qedit/samplegrabber.c @@ -446,49 +446,6 @@ SampleGrabber_IMemInputPin_ReceiveCanBlock(IMemInputPin *iface) return This->memOutput ? IMemInputPin_ReceiveCanBlock(This->memOutput) : S_OK; }
-/* IPin - input pin */ -static HRESULT WINAPI -SampleGrabber_In_IPin_ReceiveConnection(IPin *iface, IPin *connector, const AM_MEDIA_TYPE *type) -{ - SG_Impl *filter = CONTAINING_RECORD(iface, SG_Impl, sink.pin.IPin_iface); - - TRACE("filter %p, connector %p, type %p.\n", filter, connector, type); - - if (!connector) - return E_POINTER; - if (filter->sink.pin.peer) - return VFW_E_ALREADY_CONNECTED; - if (filter->filter.state != State_Stopped) - return VFW_E_NOT_STOPPED; - if (type) { - TRACE("Media type: %s/%s ssize: %u format: %s (%u bytes)\n", - debugstr_guid(&type->majortype), debugstr_guid(&type->subtype), - type->lSampleSize, - debugstr_guid(&type->formattype), type->cbFormat); - if (!IsEqualGUID(&type->formattype, &FORMAT_None) && - !IsEqualGUID(&type->formattype, &GUID_NULL) && - !type->pbFormat) - return VFW_E_INVALIDMEDIATYPE; - if (!IsEqualGUID(&filter->mtype.majortype,&GUID_NULL) && - !IsEqualGUID(&filter->mtype.majortype,&type->majortype)) - return VFW_E_TYPE_NOT_ACCEPTED; - if (!IsEqualGUID(&filter->mtype.subtype,&MEDIASUBTYPE_None) && - !IsEqualGUID(&filter->mtype.subtype,&type->subtype)) - return VFW_E_TYPE_NOT_ACCEPTED; - if (!IsEqualGUID(&filter->mtype.formattype,&GUID_NULL) && - !IsEqualGUID(&filter->mtype.formattype,&FORMAT_None) && - !IsEqualGUID(&filter->mtype.formattype,&type->formattype)) - return VFW_E_TYPE_NOT_ACCEPTED; - - FreeMediaType(&filter->mtype); - CopyMediaType(&filter->mtype, type); - CopyMediaType(&filter->sink.pin.mt, type); - } - IPin_AddRef(filter->sink.pin.peer = connector); - - return S_OK; -} - static const ISampleGrabberVtbl ISampleGrabber_VTable = { SampleGrabber_ISampleGrabber_QueryInterface, @@ -522,7 +479,7 @@ static const IPinVtbl sink_vtbl = BasePinImpl_AddRef, BasePinImpl_Release, BaseInputPinImpl_Connect, - SampleGrabber_In_IPin_ReceiveConnection, + BaseInputPinImpl_ReceiveConnection, BaseInputPinImpl_Disconnect, BasePinImpl_ConnectedTo, BasePinImpl_ConnectionMediaType, @@ -574,11 +531,40 @@ static HRESULT sample_grabber_sink_get_media_type(struct strmbase_pin *iface, return VFW_S_NO_MORE_ITEMS; }
+static HRESULT sample_grabber_sink_connect(struct strmbase_sink *iface, + IPin *peer, const AM_MEDIA_TYPE *mt) +{ + SG_Impl *filter = impl_from_sink_pin(&iface->pin); + + if (!IsEqualGUID(&mt->formattype, &FORMAT_None) + && !IsEqualGUID(&mt->formattype, &GUID_NULL) && !mt->pbFormat) + return VFW_E_INVALIDMEDIATYPE; + + if (!IsEqualGUID(&filter->mtype.majortype, &GUID_NULL) + && !IsEqualGUID(&filter->mtype.majortype, &mt->majortype)) + return VFW_E_TYPE_NOT_ACCEPTED; + + if (!IsEqualGUID(&filter->mtype.subtype,&MEDIASUBTYPE_None) + && !IsEqualGUID(&filter->mtype.subtype, &mt->subtype)) + return VFW_E_TYPE_NOT_ACCEPTED; + + if (!IsEqualGUID(&filter->mtype.formattype, &GUID_NULL) + && !IsEqualGUID(&filter->mtype.formattype, &FORMAT_None) + && !IsEqualGUID(&filter->mtype.formattype, &mt->formattype)) + return VFW_E_TYPE_NOT_ACCEPTED; + + FreeMediaType(&filter->mtype); + CopyMediaType(&filter->mtype, mt); + + return S_OK; +} + static const struct strmbase_sink_ops sink_ops = { .base.pin_query_interface = sample_grabber_sink_query_interface, .base.pin_query_accept = sample_grabber_sink_query_accept, .base.pin_get_media_type = sample_grabber_sink_get_media_type, + .sink_connect = sample_grabber_sink_connect, };
static inline SG_Impl *impl_from_source_pin(struct strmbase_pin *iface)