From: Conor McCarthy cmccarthy@codeweavers.com
The need to call media_engine_render_d3d11 becomes fully known in media_engine_transfer_d3d11(), so it makes sense to call it only from there.
Both of these functions call media_engine_lock_d3d_device() and therefore the null check of device_manager has no effect, so this commit removes it.
This change reveals a failure in test_effect() which previously was silent (nothing is transferred but no error was returned). --- dlls/mfmediaengine/main.c | 25 +++++++++++++++++++++--- dlls/mfmediaengine/tests/mfmediaengine.c | 1 + 2 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index 8624b8867ca..3594a52bb6e 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -2495,6 +2495,20 @@ static HRESULT get_d3d11_resource_from_sample(IMFSample *sample, ID3D11Texture2D return hr; }
+static BOOL transfer_needs_render_pipeline(const D3D11_TEXTURE2D_DESC *src_desc, const D3D11_TEXTURE2D_DESC *dst_desc, + const D3D11_BOX *src_box, const RECT *dst_rect) +{ + if (dst_rect->right && dst_rect->bottom + && (dst_rect->right - dst_rect->left != src_box->right - src_box->left + || dst_rect->bottom - dst_rect->top != src_box->bottom - src_box->top)) + return TRUE; + + return FALSE; +} + +static HRESULT media_engine_render_d3d11(struct media_engine *engine, ID3D11Texture2D *texture, + const MFVideoNormalizedRect *src_rect, const RECT *dst_rect, const MFARGB *color); + static HRESULT media_engine_transfer_d3d11(struct media_engine *engine, ID3D11Texture2D *dst_texture, const MFVideoNormalizedRect *src_rect, const RECT *dst_rect, const MFARGB *color) { @@ -2522,7 +2536,7 @@ static HRESULT media_engine_transfer_d3d11(struct media_engine *engine, ID3D11Te hr = get_d3d11_resource_from_sample(sample, &src_texture, &subresource); IMFSample_Release(sample); if (FAILED(hr)) - return hr; + return media_engine_render_d3d11(engine, dst_texture, src_rect, dst_rect, color);
ID3D11Texture2D_GetDesc(src_texture, &src_desc); ID3D11Texture2D_GetDesc(dst_texture, &dst_desc); @@ -2541,6 +2555,12 @@ static HRESULT media_engine_transfer_d3d11(struct media_engine *engine, ID3D11Te return MF_E_UNEXPECTED; }
+ if (transfer_needs_render_pipeline(&src_desc, &dst_desc, &src_box, dst_rect)) + { + ID3D11Texture2D_Release(src_texture); + return media_engine_render_d3d11(engine, dst_texture, src_rect, dst_rect, color); + } + if (FAILED(hr = media_engine_lock_d3d_device(engine, &device))) { ID3D11Texture2D_Release(src_texture); @@ -2722,8 +2742,7 @@ static HRESULT WINAPI media_engine_TransferVideoFrame(IMFMediaEngineEx *iface, I
if (SUCCEEDED(IUnknown_QueryInterface(surface, &IID_ID3D11Texture2D, (void **)&texture))) { - if (!engine->device_manager || FAILED(hr = media_engine_transfer_d3d11(engine, texture, src_rect, dst_rect, color))) - hr = media_engine_render_d3d11(engine, texture, src_rect, dst_rect, color); + hr = media_engine_transfer_d3d11(engine, texture, src_rect, dst_rect, color); ID3D11Texture2D_Release(texture); } else diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index 8ea7a69b158..288c7e6ae23 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -2018,6 +2018,7 @@ static void test_effect(void)
SetRect(&dst_rect, 0, 0, desc.Width, desc.Height); hr = IMFMediaEngineEx_TransferVideoFrame(notify->media_engine, (IUnknown *)texture, NULL, &dst_rect, NULL); + todo_wine ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
count = test_transform_get_sample_count(video_effect);