From: Bernhard Kölbl besentv@gmail.com
This behavior seems to match the Windows behavior the closest. Additionally the docu mentions the output(engine) format being used as render target. --- dlls/mfmediaengine/main.c | 23 +++++++++++++++++++++++ dlls/mfmediaengine/tests/mfmediaengine.c | 8 ++++---- 2 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c index b2ddc376db8..68696d328e9 100644 --- a/dlls/mfmediaengine/main.c +++ b/dlls/mfmediaengine/main.c @@ -1029,9 +1029,12 @@ static HRESULT media_engine_create_audio_renderer(struct media_engine *engine, I
static HRESULT media_engine_create_video_renderer(struct media_engine *engine, IMFTopologyNode **node) { + D3D11_TEXTURE2D_DESC texture_desc; DXGI_FORMAT output_format; + ID3D11Texture2D *texture; IMFMediaType *media_type; IMFActivate *activate; + ID3D11Device *device; GUID subtype; HRESULT hr;
@@ -1043,6 +1046,26 @@ static HRESULT media_engine_create_video_renderer(struct media_engine *engine, I return E_FAIL; }
+ if (FAILED(hr = media_engine_lock_d3d_device(engine, &device))) + return hr; + + /* Check if supplied format is valid for render targets. */ + memset(&texture_desc, 0, sizeof(D3D11_TEXTURE2D_DESC)); + texture_desc.Width = 320; + texture_desc.Height = 240; + texture_desc.MipLevels = 1; + texture_desc.ArraySize = 1; + texture_desc.Format = output_format; + texture_desc.SampleDesc.Count = 1; + texture_desc.Usage = D3D11_USAGE_DEFAULT; + texture_desc.BindFlags = D3D11_BIND_RENDER_TARGET; + + if (FAILED(ID3D11Device_CreateTexture2D(device, &texture_desc, NULL, &texture))) + return MF_E_INVALIDMEDIATYPE; + + ID3D11Texture2D_Release(texture); + media_engine_unlock_d3d_device(engine, device); + memcpy(&subtype, &MFVideoFormat_Base, sizeof(subtype)); if (!(subtype.Data1 = MFMapDXGIFormatToDX9Format(output_format))) { diff --git a/dlls/mfmediaengine/tests/mfmediaengine.c b/dlls/mfmediaengine/tests/mfmediaengine.c index ed0d1fc1c63..d1a8fdb8a87 100644 --- a/dlls/mfmediaengine/tests/mfmediaengine.c +++ b/dlls/mfmediaengine/tests/mfmediaengine.c @@ -1451,19 +1451,19 @@ static void test_formats(void) }, /* Some exotic, ridiculous and non-exisiting media engine formats. */ { - .engine_fmt = DXGI_FORMAT_D24_UNORM_S8_UINT, .bad_fmt = TRUE, .engine_todo = TRUE, + .engine_fmt = DXGI_FORMAT_D24_UNORM_S8_UINT, .bad_fmt = TRUE, .output_fmt = DXGI_FORMAT_B8G8R8A8_UNORM, .exp_hr = S_OK, }, { - .engine_fmt = DXGI_FORMAT_BC2_UNORM_SRGB, .bad_fmt = TRUE, .engine_todo = TRUE, + .engine_fmt = DXGI_FORMAT_BC2_UNORM_SRGB, .bad_fmt = TRUE, .output_fmt = DXGI_FORMAT_B8G8R8A8_UNORM, .exp_hr = S_OK, }, { - .engine_fmt = DXGI_FORMAT_NV12, .bad_fmt = TRUE, .engine_todo = TRUE, + .engine_fmt = DXGI_FORMAT_NV12, .bad_fmt = TRUE, .output_fmt = DXGI_FORMAT_B8G8R8A8_UNORM, .exp_hr = S_OK, .output_todo = TRUE, }, { - .engine_fmt = NON_EXISITING_DXGI_FORMAT, .bad_fmt = TRUE, .engine_todo = TRUE, + .engine_fmt = NON_EXISITING_DXGI_FORMAT, .bad_fmt = TRUE, .output_fmt = DXGI_FORMAT_B8G8R8A8_UNORM, .exp_hr = S_OK, }, /* Texture format working with NVIDIA and AMD driver, but broken in VMs. */