mfplat: Add IMFAttributes interface to IMFByteStream.

Signed-off-by: Sven Baars <sven.wine@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Sven Baars 2018-11-03 22:25:07 +01:00 committed by Alexandre Julliard
parent ae220de098
commit b8b4c041ea
2 changed files with 124 additions and 9 deletions

View File

@ -847,8 +847,8 @@ HRESULT WINAPI MFCreateAttributes(IMFAttributes **attributes, UINT32 size)
typedef struct _mfbytestream
{
mfattributes attributes;
IMFByteStream IMFByteStream_iface;
LONG ref;
} mfbytestream;
static inline mfbytestream *impl_from_IMFByteStream(IMFByteStream *iface)
@ -867,6 +867,10 @@ static HRESULT WINAPI mfbytestream_QueryInterface(IMFByteStream *iface, REFIID r
{
*out = &This->IMFByteStream_iface;
}
else if(IsEqualGUID(riid, &IID_IMFAttributes))
{
*out = &This->attributes.IMFAttributes_iface;
}
else
{
FIXME("(%s, %p)\n", debugstr_guid(riid), out);
@ -881,17 +885,17 @@ static HRESULT WINAPI mfbytestream_QueryInterface(IMFByteStream *iface, REFIID r
static ULONG WINAPI mfbytestream_AddRef(IMFByteStream *iface)
{
mfbytestream *This = impl_from_IMFByteStream(iface);
ULONG ref = InterlockedIncrement(&This->ref);
ULONG ref = InterlockedIncrement(&This->attributes.ref);
TRACE("(%p) ref=%u\n", This, ref);
return ref;
}
static ULONG WINAPI mfbytestream_Release(IMFByteStream *iface)
static ULONG WINAPI mfbytestream_Release(IMFByteStream *iface)
{
mfbytestream *This = impl_from_IMFByteStream(iface);
ULONG ref = InterlockedDecrement(&This->ref);
ULONG ref = InterlockedDecrement(&This->attributes.ref);
TRACE("(%p) ref=%u\n", This, ref);
@ -1044,7 +1048,7 @@ static HRESULT WINAPI mfbytestream_Close(IMFByteStream *iface)
return E_NOTIMPL;
}
static const IMFByteStreamVtbl mfbytesteam_vtbl =
static const IMFByteStreamVtbl mfbytestream_vtbl =
{
mfbytestream_QueryInterface,
mfbytestream_AddRef,
@ -1066,6 +1070,67 @@ static const IMFByteStreamVtbl mfbytesteam_vtbl =
mfbytestream_Close
};
static inline mfbytestream *impl_from_IMFByteStream_IMFAttributes(IMFAttributes *iface)
{
return CONTAINING_RECORD(iface, mfbytestream, attributes.IMFAttributes_iface);
}
static HRESULT WINAPI mfbytestream_attributes_QueryInterface(
IMFAttributes *iface, REFIID riid, void **out)
{
mfbytestream *This = impl_from_IMFByteStream_IMFAttributes(iface);
return IMFByteStream_QueryInterface(&This->IMFByteStream_iface, riid, out);
}
static ULONG WINAPI mfbytestream_attributes_AddRef(IMFAttributes *iface)
{
mfbytestream *This = impl_from_IMFByteStream_IMFAttributes(iface);
return IMFByteStream_AddRef(&This->IMFByteStream_iface);
}
static ULONG WINAPI mfbytestream_attributes_Release(IMFAttributes *iface)
{
mfbytestream *This = impl_from_IMFByteStream_IMFAttributes(iface);
return IMFByteStream_Release(&This->IMFByteStream_iface);
}
static const IMFAttributesVtbl mfbytestream_attributes_vtbl =
{
mfbytestream_attributes_QueryInterface,
mfbytestream_attributes_AddRef,
mfbytestream_attributes_Release,
mfattributes_GetItem,
mfattributes_GetItemType,
mfattributes_CompareItem,
mfattributes_Compare,
mfattributes_GetUINT32,
mfattributes_GetUINT64,
mfattributes_GetDouble,
mfattributes_GetGUID,
mfattributes_GetStringLength,
mfattributes_GetString,
mfattributes_GetAllocatedString,
mfattributes_GetBlobSize,
mfattributes_GetBlob,
mfattributes_GetAllocatedBlob,
mfattributes_GetUnknown,
mfattributes_SetItem,
mfattributes_DeleteItem,
mfattributes_DeleteAllItems,
mfattributes_SetUINT32,
mfattributes_SetUINT64,
mfattributes_SetDouble,
mfattributes_SetGUID,
mfattributes_SetString,
mfattributes_SetBlob,
mfattributes_SetUnknown,
mfattributes_LockStore,
mfattributes_UnlockStore,
mfattributes_GetCount,
mfattributes_GetItemByIndex,
mfattributes_CopyAllItems
};
HRESULT WINAPI MFCreateMFByteStreamOnStream(IStream *stream, IMFByteStream **bytestream)
{
mfbytestream *object;
@ -1076,8 +1141,9 @@ HRESULT WINAPI MFCreateMFByteStreamOnStream(IStream *stream, IMFByteStream **byt
if(!object)
return E_OUTOFMEMORY;
object->ref = 1;
object->IMFByteStream_iface.lpVtbl = &mfbytesteam_vtbl;
init_attribute_object(&object->attributes, 0);
object->IMFByteStream_iface.lpVtbl = &mfbytestream_vtbl;
object->attributes.IMFAttributes_iface.lpVtbl = &mfbytestream_attributes_vtbl;
*bytestream = &object->IMFByteStream_iface;

View File

@ -258,8 +258,12 @@ static void test_MFCreateAttributes(void)
static void test_MFCreateMFByteStreamOnStream(void)
{
IMFByteStream *bytestream;
IMFByteStream *bytestream2;
IStream *stream;
IMFAttributes *attributes = NULL;
IUnknown *unknown;
HRESULT hr;
ULONG ref;
if(!pMFCreateMFByteStreamOnStream)
{
@ -270,11 +274,56 @@ static void test_MFCreateMFByteStreamOnStream(void)
hr = CreateStreamOnHGlobal(NULL, TRUE, &stream);
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = pMFCreateMFByteStreamOnStream(stream, &bytestream );
hr = pMFCreateMFByteStreamOnStream(stream, &bytestream);
ok(hr == S_OK, "got 0x%08x\n", hr);
IStream_Release(stream);
hr = IUnknown_QueryInterface(bytestream, &IID_IUnknown,
(void **)&unknown);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok((void *)unknown == (void *)bytestream, "got %p\n", unknown);
ref = IUnknown_Release(unknown);
ok(ref == 1, "got %u\n", ref);
hr = IUnknown_QueryInterface(unknown, &IID_IMFByteStream,
(void **)&bytestream2);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(bytestream2 == bytestream, "got %p\n", bytestream2);
ref = IMFByteStream_Release(bytestream2);
ok(ref == 1, "got %u\n", ref);
hr = IUnknown_QueryInterface(bytestream, &IID_IMFAttributes,
(void **)&attributes);
ok(hr == S_OK ||
/* w7pro64 */
broken(hr == E_NOINTERFACE), "got 0x%08x\n", hr);
if (hr != S_OK)
{
win_skip("Can not retrieve IMFAttributes interface from IMFByteStream\n");
IStream_Release(stream);
IMFByteStream_Release(bytestream);
return;
}
ok(attributes != NULL, "got NULL\n");
hr = IUnknown_QueryInterface(attributes, &IID_IUnknown,
(void **)&unknown);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok((void *)unknown == (void *)bytestream, "got %p\n", unknown);
ref = IUnknown_Release(unknown);
ok(ref == 2, "got %u\n", ref);
hr = IUnknown_QueryInterface(attributes, &IID_IMFByteStream,
(void **)&bytestream2);
ok(hr == S_OK, "got 0x%08x\n", hr);
ok(bytestream2 == bytestream, "got %p\n", bytestream2);
ref = IMFByteStream_Release(bytestream2);
ok(ref == 2, "got %u\n", ref);
IMFAttributes_Release(attributes);
IMFByteStream_Release(bytestream);
IStream_Release(stream);
}
static void test_MFCreateMemoryBuffer(void)