mfplat/mediatype: Enable IMFVideoMediaType based on major type.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2020-10-12 14:17:23 +03:00 committed by Alexandre Julliard
parent 62fa286edf
commit a6166a5e1a
2 changed files with 101 additions and 60 deletions

View file

@ -96,20 +96,32 @@ static struct presentation_desc *impl_from_IMFPresentationDescriptor(IMFPresenta
static HRESULT WINAPI mediatype_QueryInterface(IMFMediaType *iface, REFIID riid, void **out) static HRESULT WINAPI mediatype_QueryInterface(IMFMediaType *iface, REFIID riid, void **out)
{ {
struct media_type *media_type = impl_from_IMFMediaType(iface);
GUID major = { 0 };
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out); TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
if (IsEqualIID(riid, &IID_IMFMediaType) || attributes_GetGUID(&media_type->attributes, &MF_MT_MAJOR_TYPE, &major);
if (IsEqualGUID(&major, &MFMediaType_Video) && IsEqualIID(riid, &IID_IMFVideoMediaType))
{
*out = &media_type->IMFVideoMediaType_iface;
}
else if (IsEqualIID(riid, &IID_IMFMediaType) ||
IsEqualIID(riid, &IID_IMFAttributes) || IsEqualIID(riid, &IID_IMFAttributes) ||
IsEqualIID(riid, &IID_IUnknown)) IsEqualIID(riid, &IID_IUnknown))
{ {
*out = iface; *out = &media_type->IMFMediaType_iface;
IMFMediaType_AddRef(iface);
return S_OK;
} }
else
{
WARN("Unsupported %s.\n", debugstr_guid(riid)); WARN("Unsupported %s.\n", debugstr_guid(riid));
*out = NULL; *out = NULL;
return E_NOINTERFACE; return E_NOINTERFACE;
}
IUnknown_AddRef((IUnknown *)*out);
return S_OK;
} }
static ULONG WINAPI mediatype_AddRef(IMFMediaType *iface) static ULONG WINAPI mediatype_AddRef(IMFMediaType *iface)
@ -613,48 +625,20 @@ static const IMFMediaTypeVtbl mediatypevtbl =
static HRESULT WINAPI video_mediatype_QueryInterface(IMFVideoMediaType *iface, REFIID riid, void **out) static HRESULT WINAPI video_mediatype_QueryInterface(IMFVideoMediaType *iface, REFIID riid, void **out)
{ {
TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out); struct media_type *media_type = impl_from_IMFVideoMediaType(iface);
return IMFMediaType_QueryInterface(&media_type->IMFMediaType_iface, riid, out);
if (IsEqualIID(riid, &IID_IMFVideoMediaType) ||
IsEqualIID(riid, &IID_IMFMediaType) ||
IsEqualIID(riid, &IID_IMFAttributes) ||
IsEqualIID(riid, &IID_IUnknown))
{
*out = iface;
IMFVideoMediaType_AddRef(iface);
return S_OK;
}
WARN("Unsupported %s.\n", debugstr_guid(riid));
*out = NULL;
return E_NOINTERFACE;
} }
static ULONG WINAPI video_mediatype_AddRef(IMFVideoMediaType *iface) static ULONG WINAPI video_mediatype_AddRef(IMFVideoMediaType *iface)
{ {
struct media_type *media_type = impl_from_IMFVideoMediaType(iface); struct media_type *media_type = impl_from_IMFVideoMediaType(iface);
ULONG refcount = InterlockedIncrement(&media_type->attributes.ref); return IMFMediaType_AddRef(&media_type->IMFMediaType_iface);
TRACE("%p, refcount %u.\n", iface, refcount);
return refcount;
} }
static ULONG WINAPI video_mediatype_Release(IMFVideoMediaType *iface) static ULONG WINAPI video_mediatype_Release(IMFVideoMediaType *iface)
{ {
struct media_type *media_type = impl_from_IMFVideoMediaType(iface); struct media_type *media_type = impl_from_IMFVideoMediaType(iface);
ULONG refcount = InterlockedDecrement(&media_type->attributes.ref); return IMFMediaType_Release(&media_type->IMFMediaType_iface);
TRACE("%p, refcount %u.\n", iface, refcount);
if (!refcount)
{
clear_attributes_object(&media_type->attributes);
CoTaskMemFree(media_type->video_format);
heap_free(media_type);
}
return refcount;
} }
static HRESULT WINAPI video_mediatype_GetItem(IMFVideoMediaType *iface, REFGUID key, PROPVARIANT *value) static HRESULT WINAPI video_mediatype_GetItem(IMFVideoMediaType *iface, REFGUID key, PROPVARIANT *value)
@ -1039,6 +1023,28 @@ static const IMFVideoMediaTypeVtbl videomediatypevtbl =
video_mediatype_GetVideoRepresentation, video_mediatype_GetVideoRepresentation,
}; };
static HRESULT create_media_type(struct media_type **ret)
{
struct media_type *object;
HRESULT hr;
object = heap_alloc_zero(sizeof(*object));
if (!object)
return E_OUTOFMEMORY;
if (FAILED(hr = init_attributes_object(&object->attributes, 0)))
{
heap_free(object);
return hr;
}
object->IMFMediaType_iface.lpVtbl = &mediatypevtbl;
object->IMFVideoMediaType_iface.lpVtbl = &videomediatypevtbl;
*ret = object;
return S_OK;
}
/*********************************************************************** /***********************************************************************
* MFCreateMediaType (mfplat.@) * MFCreateMediaType (mfplat.@)
*/ */
@ -1052,16 +1058,8 @@ HRESULT WINAPI MFCreateMediaType(IMFMediaType **media_type)
if (!media_type) if (!media_type)
return E_INVALIDARG; return E_INVALIDARG;
object = heap_alloc(sizeof(*object)); if (FAILED(hr = create_media_type(&object)))
if (!object)
return E_OUTOFMEMORY;
if (FAILED(hr = init_attributes_object(&object->attributes, 0)))
{
heap_free(object);
return hr; return hr;
}
object->IMFMediaType_iface.lpVtbl = &mediatypevtbl;
*media_type = &object->IMFMediaType_iface; *media_type = &object->IMFMediaType_iface;
@ -2633,19 +2631,11 @@ HRESULT WINAPI MFCreateVideoMediaTypeFromSubtype(const GUID *subtype, IMFVideoMe
if (!media_type) if (!media_type)
return E_INVALIDARG; return E_INVALIDARG;
object = heap_alloc(sizeof(*object)); if (FAILED(hr = create_media_type(&object)))
if (!object)
return E_OUTOFMEMORY;
if (FAILED(hr = init_attributes_object(&object->attributes, 0)))
{
heap_free(object);
return hr; return hr;
}
object->IMFVideoMediaType_iface.lpVtbl = &videomediatypevtbl;
IMFVideoMediaType_SetGUID(&object->IMFVideoMediaType_iface, &MF_MT_MAJOR_TYPE, &MFMediaType_Video); IMFMediaType_SetGUID(&object->IMFMediaType_iface, &MF_MT_MAJOR_TYPE, &MFMediaType_Video);
IMFVideoMediaType_SetGUID(&object->IMFVideoMediaType_iface, &MF_MT_SUBTYPE, subtype); IMFMediaType_SetGUID(&object->IMFMediaType_iface, &MF_MT_SUBTYPE, subtype);
*media_type = &object->IMFVideoMediaType_iface; *media_type = &object->IMFVideoMediaType_iface;

View file

@ -763,8 +763,10 @@ static void init_functions(void)
static void test_media_type(void) static void test_media_type(void)
{ {
IMFMediaType *mediatype, *mediatype2; IMFMediaType *mediatype, *mediatype2;
IMFVideoMediaType *video_type;
IUnknown *unk, *unk2;
DWORD count, flags;
BOOL compressed; BOOL compressed;
DWORD flags;
HRESULT hr; HRESULT hr;
GUID guid; GUID guid;
@ -862,6 +864,55 @@ if(0)
IMFMediaType_Release(mediatype2); IMFMediaType_Release(mediatype2);
IMFMediaType_Release(mediatype); IMFMediaType_Release(mediatype);
/* IMFVideoMediaType */
hr = MFCreateMediaType(&mediatype);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMFMediaType_QueryInterface(mediatype, &IID_IMFVideoMediaType, (void **)&unk);
ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
hr = IMFMediaType_QueryInterface(mediatype, &IID_IUnknown, (void **)&unk);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(unk == (IUnknown *)mediatype, "Unexpected pointer.\n");
IUnknown_Release(unk);
hr = IMFMediaType_SetGUID(mediatype, &MF_MT_MAJOR_TYPE, &MFMediaType_Video);
ok(hr == S_OK, "Failed to set GUID value, hr %#x.\n", hr);
hr = IMFMediaType_QueryInterface(mediatype, &IID_IMFVideoMediaType, (void **)&unk);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(unk2 == (IUnknown *)mediatype, "Unexpected pointer.\n");
IUnknown_Release(unk2);
IUnknown_Release(unk);
hr = MFCreateVideoMediaTypeFromSubtype(&MFVideoFormat_RGB555, &video_type);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMFVideoMediaType_QueryInterface(video_type, &IID_IMFMediaType, (void **)&unk);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
IUnknown_Release(unk);
hr = IMFVideoMediaType_QueryInterface(video_type, &IID_IMFVideoMediaType, (void **)&unk);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
IUnknown_Release(unk);
/* Major and subtype are set on creation. */
hr = IMFVideoMediaType_GetCount(video_type, &count);
ok(count == 2, "Unexpected attribute count %#x.\n", hr);
hr = IMFVideoMediaType_DeleteAllItems(video_type);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMFVideoMediaType_GetCount(video_type, &count);
ok(!count, "Unexpected attribute count %#x.\n", hr);
hr = IMFVideoMediaType_QueryInterface(video_type, &IID_IMFVideoMediaType, (void **)&unk);
ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr);
IMFVideoMediaType_Release(video_type);
IMFMediaType_Release(mediatype);
} }
static void test_MFCreateMediaEvent(void) static void test_MFCreateMediaEvent(void)