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:
parent
ae220de098
commit
b8b4c041ea
|
@ -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,7 +885,7 @@ 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);
|
||||
|
||||
|
@ -891,7 +895,7 @@ static ULONG WINAPI mfbytestream_AddRef(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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
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)
|
||||
|
|
Loading…
Reference in New Issue