Module: wine Branch: master Commit: 813596f64c688ea2b0084ee7727e8c8bbc59a930 URL: https://source.winehq.org/git/wine.git/?a=commit;h=813596f64c688ea2b0084ee77...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Thu Nov 5 18:37:24 2020 +0300
evr/presenter: Implement GetCurrentMediaType().
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/evr/presenter.c | 71 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 10 deletions(-)
diff --git a/dlls/evr/presenter.c b/dlls/evr/presenter.c index 01623815dd3..1b98e63a49a 100644 --- a/dlls/evr/presenter.c +++ b/dlls/evr/presenter.c @@ -71,6 +71,7 @@ struct video_presenter
IDirect3DDeviceManager9 *device_manager; struct streaming_thread thread; + IMFMediaType *media_type; UINT reset_token; HWND video_window; MFVideoNormalizedRect src_rect; @@ -168,6 +169,38 @@ static void video_presenter_get_native_video_size(struct video_presenter *presen IMFMediaType_Release(media_type); }
+static void video_presenter_reset_media_type(struct video_presenter *presenter) +{ + if (presenter->media_type) + IMFMediaType_Release(presenter->media_type); + presenter->media_type = NULL; + + /* FIXME: release samples pool */ +} + +static HRESULT video_presenter_set_media_type(struct video_presenter *presenter, IMFMediaType *media_type) +{ + unsigned int flags; + + if (!media_type) + { + video_presenter_reset_media_type(presenter); + return S_OK; + } + + if (presenter->media_type && IMFMediaType_IsEqual(presenter->media_type, media_type, &flags) == S_OK) + return S_OK; + + video_presenter_reset_media_type(presenter); + + /* FIXME: allocate samples pool */ + + presenter->media_type = media_type; + IMFMediaType_AddRef(presenter->media_type); + + return S_OK; +} + static HRESULT video_presenter_invalidate_media_type(struct video_presenter *presenter) { IMFMediaType *media_type; @@ -182,16 +215,16 @@ static HRESULT video_presenter_invalidate_media_type(struct video_presenter *pre
/* FIXME: potentially adjust frame size */
- if (SUCCEEDED(IMFTransform_SetOutputType(presenter->mixer, 0, media_type, MFT_SET_TYPE_TEST_ONLY))) - { - /* FIXME: should keep a copy internally too */ + hr = IMFTransform_SetOutputType(presenter->mixer, 0, media_type, MFT_SET_TYPE_TEST_ONLY);
- hr = IMFTransform_SetOutputType(presenter->mixer, 0, media_type, 0); - IMFMediaType_Release(media_type); - break; - } + if (SUCCEEDED(hr)) + hr = video_presenter_set_media_type(presenter, media_type);
+ hr = IMFTransform_SetOutputType(presenter->mixer, 0, media_type, 0); IMFMediaType_Release(media_type); + + if (SUCCEEDED(hr)) + break; }
return hr; @@ -478,11 +511,29 @@ static HRESULT WINAPI video_presenter_ProcessMessage(IMFVideoPresenter *iface, M return hr; }
-static HRESULT WINAPI video_presenter_GetCurrentMediaType(IMFVideoPresenter *iface, IMFVideoMediaType **media_type) +static HRESULT WINAPI video_presenter_GetCurrentMediaType(IMFVideoPresenter *iface, + IMFVideoMediaType **media_type) { - FIXME("%p, %p.\n", iface, media_type); + struct video_presenter *presenter = impl_from_IMFVideoPresenter(iface); + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %p.\n", iface, media_type); + + EnterCriticalSection(&presenter->cs); + + if (presenter->state == PRESENTER_STATE_SHUT_DOWN) + hr = MF_E_SHUTDOWN; + else if (!presenter->media_type) + hr = MF_E_NOT_INITIALIZED; + else + { + hr = IMFMediaType_QueryInterface(presenter->media_type, &IID_IMFVideoMediaType, + (void **)media_type); + } + + LeaveCriticalSection(&presenter->cs); + + return hr; }
static const IMFVideoPresenterVtbl video_presenter_vtbl =