Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/evr.c | 9 +++++++-- dlls/mf/tests/mf.c | 9 +++++++++ 2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c index ac3f17fa585..7567b1a7098 100644 --- a/dlls/mf/evr.c +++ b/dlls/mf/evr.c @@ -372,9 +372,14 @@ static HRESULT WINAPI video_stream_typehandler_IsMediaTypeSupported(IMFMediaType
static HRESULT WINAPI video_stream_typehandler_GetMediaTypeCount(IMFMediaTypeHandler *iface, DWORD *count) { - FIXME("%p, %p.\n", iface, count); + TRACE("%p, %p.\n", iface, count);
- return E_NOTIMPL; + if (!count) + return E_POINTER; + + *count = 0; + + return S_OK; }
static HRESULT WINAPI video_stream_typehandler_GetMediaTypeByIndex(IMFMediaTypeHandler *iface, DWORD index, diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index a63c353a4b5..db442453d6d 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -3296,6 +3296,15 @@ static void test_evr(void) ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(IsEqualGUID(&guid, &MFMediaType_Video), "Unexpected type %s.\n", wine_dbgstr_guid(&guid));
+ /* Supported types are not advertised. */ + hr = IMFMediaTypeHandler_GetMediaTypeCount(type_handler, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + count = 1; + hr = IMFMediaTypeHandler_GetMediaTypeCount(type_handler, &count); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(!count, "Unexpected count %u.\n", count); + IMFMediaTypeHandler_Release(type_handler);
/* Stream uses an allocator. */
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/evr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c index 7567b1a7098..ebeb8899eea 100644 --- a/dlls/mf/evr.c +++ b/dlls/mf/evr.c @@ -385,9 +385,9 @@ static HRESULT WINAPI video_stream_typehandler_GetMediaTypeCount(IMFMediaTypeHan static HRESULT WINAPI video_stream_typehandler_GetMediaTypeByIndex(IMFMediaTypeHandler *iface, DWORD index, IMFMediaType **type) { - FIXME("%p, %u, %p.\n", iface, index, type); + TRACE("%p, %u, %p.\n", iface, index, type);
- return E_NOTIMPL; + return MF_E_NO_MORE_TYPES; }
static HRESULT WINAPI video_stream_typehandler_SetCurrentMediaType(IMFMediaTypeHandler *iface, IMFMediaType *type)
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/evr.c | 39 +++++++++++++++++++++++++++++++++++---- dlls/mf/tests/mf.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 4 deletions(-)
diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c index ebeb8899eea..087ac2a88e3 100644 --- a/dlls/mf/evr.c +++ b/dlls/mf/evr.c @@ -392,16 +392,47 @@ static HRESULT WINAPI video_stream_typehandler_GetMediaTypeByIndex(IMFMediaTypeH
static HRESULT WINAPI video_stream_typehandler_SetCurrentMediaType(IMFMediaTypeHandler *iface, IMFMediaType *type) { - FIXME("%p, %p.\n", iface, type); + struct video_stream *stream = impl_from_IMFMediaTypeHandler(iface); + IMFVideoMediaType *video_type; + GUID subtype; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %p.\n", iface, type); + + if (!type) + return E_POINTER; + + if (!stream->parent) + return MF_E_STREAMSINK_REMOVED; + + if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) + return hr; + + /* Mixer expects special video media type instance. */ + if (FAILED(hr = MFCreateVideoMediaTypeFromSubtype(&subtype, &video_type))) + return hr; + + if (SUCCEEDED(hr = IMFMediaType_CopyAllItems(type, (IMFAttributes *)video_type))) + hr = IMFTransform_SetInputType(stream->parent->mixer, stream->id, (IMFMediaType *)video_type, 0); + + IMFVideoMediaType_Release(video_type); + + return hr; }
static HRESULT WINAPI video_stream_typehandler_GetCurrentMediaType(IMFMediaTypeHandler *iface, IMFMediaType **type) { - FIXME("%p, %p.\n", iface, type); + struct video_stream *stream = impl_from_IMFMediaTypeHandler(iface);
- return E_NOTIMPL; + TRACE("%p, %p.\n", iface, type); + + if (!type) + return E_POINTER; + + if (!stream->parent) + return MF_E_STREAMSINK_REMOVED; + + return IMFTransform_GetInputCurrentType(stream->parent->mixer, stream->id, type); }
static HRESULT WINAPI video_stream_typehandler_GetMajorType(IMFMediaTypeHandler *iface, GUID *type) diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index db442453d6d..5ffc191667b 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -3237,6 +3237,7 @@ static void test_evr(void) { IMFVideoSampleAllocatorCallback *allocator_callback; IMFStreamSink *stream_sink, *stream_sink2; + IMFMediaType *media_type, *media_type2; IMFMediaEventGenerator *ev_generator; IMFVideoSampleAllocator *allocator; IMFMediaTypeHandler *type_handler; @@ -3305,6 +3306,47 @@ static void test_evr(void) ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(!count, "Unexpected count %u.\n", count);
+ hr = IMFMediaTypeHandler_GetMediaTypeByIndex(type_handler, 0, NULL); + ok(hr == MF_E_NO_MORE_TYPES, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaTypeHandler_GetMediaTypeByIndex(type_handler, 0, &media_type); + ok(hr == MF_E_NO_MORE_TYPES, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaTypeHandler_GetCurrentMediaType(type_handler, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaTypeHandler_GetCurrentMediaType(type_handler, &media_type); + ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = MFCreateMediaType(&media_type); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &MFVideoFormat_RGB32); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_SIZE, (UINT64)640 << 32 | 480); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + hr = IMFMediaType_SetUINT32(media_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, media_type); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaTypeHandler_GetCurrentMediaType(type_handler, &media_type2); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + hr = IMFMediaType_QueryInterface(media_type2, &IID_IMFVideoMediaType, (void **)&unk); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + IUnknown_Release(unk); + IMFMediaType_Release(media_type2); + + IMFMediaType_Release(media_type); + IMFMediaTypeHandler_Release(type_handler);
/* Stream uses an allocator. */
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/evr/mixer.c | 12 +++++++----- dlls/evr/tests/evr.c | 12 ++++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/dlls/evr/mixer.c b/dlls/evr/mixer.c index 107438b1f17..54da3a9ce1c 100644 --- a/dlls/evr/mixer.c +++ b/dlls/evr/mixer.c @@ -611,12 +611,12 @@ static int rt_formats_sort_compare(const void *left, const void *right) }
static HRESULT video_mixer_collect_output_types(struct video_mixer *mixer, const DXVA2_VideoDesc *video_desc, - IDirectXVideoProcessorService *service, unsigned int device_count, const GUID *devices) + IDirectXVideoProcessorService *service, unsigned int device_count, const GUID *devices, unsigned int flags) { unsigned int i, j, format_count, count; D3DFORMAT *rt_formats = NULL, *formats, *ptr; + HRESULT hr = MF_E_INVALIDMEDIATYPE; GUID subtype; - HRESULT hr;
count = 0; for (i = 0; i < device_count; ++i) @@ -640,7 +640,7 @@ static HRESULT video_mixer_collect_output_types(struct video_mixer *mixer, const } }
- if (count) + if (count && !(flags & MFT_SET_TYPE_TEST_ONLY)) { qsort(rt_formats, count, sizeof(*rt_formats), rt_formats_sort_compare);
@@ -690,7 +690,8 @@ static HRESULT WINAPI video_mixer_transform_SetInputType(IMFTransform *iface, DW
EnterCriticalSection(&mixer->cs);
- video_mixer_clear_types(mixer); + if (!(flags & MFT_SET_TYPE_TEST_ONLY)) + video_mixer_clear_types(mixer);
if (!mixer->device_manager) hr = MF_E_NOT_INITIALIZED; @@ -708,7 +709,8 @@ static HRESULT WINAPI video_mixer_transform_SetInputType(IMFTransform *iface, DW if (SUCCEEDED(hr = IDirectXVideoProcessorService_GetVideoProcessorDeviceGuids(service, &video_desc, &count, &guids))) { - if (SUCCEEDED(hr = video_mixer_collect_output_types(mixer, &video_desc, service, count, guids))) + if (SUCCEEDED(hr = video_mixer_collect_output_types(mixer, &video_desc, service, count, + guids, flags)) && !(flags & MFT_SET_TYPE_TEST_ONLY)) { GUID subtype = { 0 };
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c index 7ad011d2a09..175c30e8188 100644 --- a/dlls/evr/tests/evr.c +++ b/dlls/evr/tests/evr.c @@ -862,6 +862,9 @@ static void test_default_mixer_type_negotiation(void) hr = IMFTransform_SetInputType(transform, 0, media_type, 0); ok(hr == MF_E_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr);
+ hr = IMFTransform_SetInputType(transform, 0, media_type, MFT_SET_TYPE_TEST_ONLY); + ok(hr == MF_E_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr); + /* Now try with device manager. */
window = create_window(); @@ -883,6 +886,9 @@ static void test_default_mixer_type_negotiation(void) hr = IMFTransform_SetInputType(transform, 0, media_type, 0); ok(hr == DXVA2_E_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr);
+ hr = IMFTransform_SetInputType(transform, 0, media_type, MFT_SET_TYPE_TEST_ONLY); + ok(hr == DXVA2_E_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr); + hr = IDirect3DDeviceManager9_ResetDevice(manager, device, token); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
@@ -904,6 +910,12 @@ static void test_default_mixer_type_negotiation(void) hr = IMFVideoMediaType_SetUINT32(video_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ hr = IMFTransform_SetInputType(transform, 0, (IMFMediaType *)video_type, MFT_SET_TYPE_TEST_ONLY); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMFTransform_GetInputCurrentType(transform, 0, &media_type); + ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#x.\n", hr); + hr = IMFTransform_SetInputType(transform, 0, (IMFMediaType *)video_type, 0); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/mf/evr.c | 60 +++++++++++++++++++++++++++++++++++++--------- dlls/mf/tests/mf.c | 12 ++++++++++ 2 files changed, 61 insertions(+), 11 deletions(-)
diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c index 087ac2a88e3..c3548170afb 100644 --- a/dlls/mf/evr.c +++ b/dlls/mf/evr.c @@ -362,12 +362,57 @@ static ULONG WINAPI video_stream_typehandler_Release(IMFMediaTypeHandler *iface) return IMFStreamSink_Release(&stream->IMFStreamSink_iface); }
+/* Mixer expects special video media type instance. */ +static HRESULT video_renderer_create_video_type(IMFMediaType *media_type, IMFVideoMediaType **video_type) +{ + GUID subtype; + HRESULT hr; + + *video_type = NULL; + + if (FAILED(hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &subtype))) + return hr; + + if (FAILED(hr = MFCreateVideoMediaTypeFromSubtype(&subtype, video_type))) + return hr; + + hr = IMFMediaType_CopyAllItems(media_type, (IMFAttributes *)*video_type); + if (FAILED(hr)) + { + IMFVideoMediaType_Release(*video_type); + *video_type = NULL; + } + + return hr; +} + static HRESULT WINAPI video_stream_typehandler_IsMediaTypeSupported(IMFMediaTypeHandler *iface, IMFMediaType *in_type, IMFMediaType **out_type) { - FIXME("%p, %p, %p.\n", iface, in_type, out_type); + struct video_stream *stream = impl_from_IMFMediaTypeHandler(iface); + IMFVideoMediaType *video_type; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %p, %p.\n", iface, in_type, out_type); + + if (!in_type) + return E_POINTER; + + if (!stream->parent) + return MF_E_INVALIDMEDIATYPE; + + if (FAILED(hr = video_renderer_create_video_type(in_type, &video_type))) + return hr; + + if (SUCCEEDED(hr = IMFTransform_SetInputType(stream->parent->mixer, stream->id, (IMFMediaType *)video_type, + MFT_SET_TYPE_TEST_ONLY))) + { + if (out_type) *out_type = NULL; + } + + IMFVideoMediaType_Release(video_type); + + return hr; }
static HRESULT WINAPI video_stream_typehandler_GetMediaTypeCount(IMFMediaTypeHandler *iface, DWORD *count) @@ -394,7 +439,6 @@ static HRESULT WINAPI video_stream_typehandler_SetCurrentMediaType(IMFMediaTypeH { struct video_stream *stream = impl_from_IMFMediaTypeHandler(iface); IMFVideoMediaType *video_type; - GUID subtype; HRESULT hr;
TRACE("%p, %p.\n", iface, type); @@ -405,16 +449,10 @@ static HRESULT WINAPI video_stream_typehandler_SetCurrentMediaType(IMFMediaTypeH if (!stream->parent) return MF_E_STREAMSINK_REMOVED;
- if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &subtype))) - return hr; - - /* Mixer expects special video media type instance. */ - if (FAILED(hr = MFCreateVideoMediaTypeFromSubtype(&subtype, &video_type))) + if (FAILED(hr = video_renderer_create_video_type(type, &video_type))) return hr;
- if (SUCCEEDED(hr = IMFMediaType_CopyAllItems(type, (IMFAttributes *)video_type))) - hr = IMFTransform_SetInputType(stream->parent->mixer, stream->id, (IMFMediaType *)video_type, 0); - + hr = IMFTransform_SetInputType(stream->parent->mixer, stream->id, (IMFMediaType *)video_type, 0); IMFVideoMediaType_Release(video_type);
return hr; diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c index 5ffc191667b..351a6e1edab 100644 --- a/dlls/mf/tests/mf.c +++ b/dlls/mf/tests/mf.c @@ -3332,9 +3332,21 @@ static void test_evr(void)
hr = IMFMediaType_SetUINT64(media_type, &MF_MT_FRAME_SIZE, (UINT64)640 << 32 | 480); ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, NULL, NULL); + ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr); + + hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type, &media_type2); + ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr); + hr = IMFMediaType_SetUINT32(media_type, &MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ media_type2 = (void *)0x1; + hr = IMFMediaTypeHandler_IsMediaTypeSupported(type_handler, media_type, &media_type2); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(!media_type2, "Unexpected media type %p.\n", media_type2); + hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, media_type); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);