[PATCH 0/1] MR727: evr/filter: Implement pin's connect/disconnect.
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> -- https://gitlab.winehq.org/wine/wine/-/merge_requests/727
From: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/evr/evr.c | 82 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 61 insertions(+), 21 deletions(-) diff --git a/dlls/evr/evr.c b/dlls/evr/evr.c index 2f0eeb6a22d..d45bd361aff 100644 --- a/dlls/evr/evr.c +++ b/dlls/evr/evr.c @@ -224,29 +224,11 @@ static void evr_release_services(struct evr *filter) } } -static void evr_destroy(struct strmbase_renderer *iface) +static HRESULT evr_test_input_type(struct evr *filter, const AM_MEDIA_TYPE *mt, IMFMediaType **ret) { - struct evr *filter = impl_from_strmbase_renderer(iface); - - evr_uninitialize(filter); - strmbase_renderer_cleanup(&filter->renderer); - free(filter); -} - -static HRESULT evr_render(struct strmbase_renderer *iface, IMediaSample *sample) -{ - FIXME("Not implemented.\n"); - return E_NOTIMPL; -} - -static HRESULT evr_query_accept(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt) -{ - struct evr *filter = impl_from_strmbase_renderer(iface); IMFMediaType *media_type; HRESULT hr = S_OK; - EnterCriticalSection(&filter->renderer.filter.filter_cs); - if (!filter->presenter) hr = evr_initialize(filter, NULL, NULL); @@ -261,14 +243,70 @@ static HRESULT evr_query_accept(struct strmbase_renderer *iface, const AM_MEDIA_ if (SUCCEEDED(hr = MFInitMediaTypeFromAMMediaType(media_type, mt))) { /* TODO: some pin -> mixer input mapping is necessary to test the substreams. */ - hr = IMFTransform_SetInputType(filter->mixer, 0, media_type, MFT_SET_TYPE_TEST_ONLY); + if (SUCCEEDED(hr = IMFTransform_SetInputType(filter->mixer, 0, media_type, MFT_SET_TYPE_TEST_ONLY))) + { + if (ret) + IMFMediaType_AddRef((*ret = media_type)); + } } IMFMediaType_Release(media_type); + } + + return hr; +} - evr_release_services(filter); +static HRESULT evr_connect(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt) +{ + struct evr *filter = impl_from_strmbase_renderer(iface); + IMFMediaType *media_type; + HRESULT hr; + + if (SUCCEEDED(hr = evr_test_input_type(filter, mt, &media_type))) + { + if (SUCCEEDED(hr = IMFTransform_SetInputType(filter->mixer, 0, media_type, 0))) + hr = IMFVideoPresenter_ProcessMessage(filter->presenter, MFVP_MESSAGE_INVALIDATEMEDIATYPE, 0); + + IMFMediaType_Release(media_type); } + return hr; +} + +static void evr_disconnect(struct strmbase_renderer *iface) +{ + struct evr *filter = impl_from_strmbase_renderer(iface); + + if (filter->mixer) + IMFTransform_SetInputType(filter->mixer, 0, NULL, 0); + evr_release_services(filter); +} + +static void evr_destroy(struct strmbase_renderer *iface) +{ + struct evr *filter = impl_from_strmbase_renderer(iface); + + evr_uninitialize(filter); + strmbase_renderer_cleanup(&filter->renderer); + free(filter); +} + +static HRESULT evr_render(struct strmbase_renderer *iface, IMediaSample *sample) +{ + FIXME("Not implemented.\n"); + return E_NOTIMPL; +} + +static HRESULT evr_query_accept(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt) +{ + struct evr *filter = impl_from_strmbase_renderer(iface); + HRESULT hr; + + EnterCriticalSection(&filter->renderer.filter.filter_cs); + + hr = evr_test_input_type(filter, mt, NULL); + evr_release_services(filter); + LeaveCriticalSection(&filter->renderer.filter.filter_cs); return hr; @@ -279,6 +317,8 @@ static const struct strmbase_renderer_ops renderer_ops = .renderer_query_accept = evr_query_accept, .renderer_render = evr_render, .renderer_query_interface = evr_query_interface, + .renderer_connect = evr_connect, + .renderer_disconnect = evr_disconnect, .renderer_destroy = evr_destroy, }; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/727
On 8/30/22 06:24, Nikolay Sivov wrote:
+static HRESULT evr_connect(struct strmbase_renderer *iface, const AM_MEDIA_TYPE *mt) +{ + struct evr *filter = impl_from_strmbase_renderer(iface); + IMFMediaType *media_type; + HRESULT hr; + + if (SUCCEEDED(hr = evr_test_input_type(filter, mt, &media_type)))
It's perhaps worth noting that strmbase IPin::ReceiveConnection() [which calls this function] already calls query_accept(). Granted, evr_test_input_type() is also doing some other initialization, but arguably it could be named more appropriately in that case.
+ { + if (SUCCEEDED(hr = IMFTransform_SetInputType(filter->mixer, 0, media_type, 0))) + hr = IMFVideoPresenter_ProcessMessage(filter->presenter, MFVP_MESSAGE_INVALIDATEMEDIATYPE, 0); + + IMFMediaType_Release(media_type); }
+ return hr; +
This merge request was approved by Zebediah Figura. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/727
participants (4)
-
Nikolay Sivov -
Nikolay Sivov (@nsivov) -
Zebediah Figura -
Zebediah Figura (@zfigura)