[v2 PATCH 7/8] mfplat: Add support for blob attribute values.
Nikolay Sivov
nsivov at codeweavers.com
Fri Mar 15 05:56:48 CDT 2019
From: Jactry Zeng <jzeng at codeweavers.com>
Signed-off-by: Jactry Zeng <jzeng at codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/mfplat/main.c | 82 ++++++++++++++++++++++++++++++++++----
dlls/mfplat/tests/mfplat.c | 38 +++++++++++++++++-
2 files changed, 111 insertions(+), 9 deletions(-)
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 30bb808f6a..2ef4077921 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -872,24 +872,84 @@ static HRESULT WINAPI mfattributes_GetAllocatedString(IMFAttributes *iface, REFG
static HRESULT WINAPI mfattributes_GetBlobSize(IMFAttributes *iface, REFGUID key, UINT32 *size)
{
- FIXME("%p, %s, %p.\n", iface, debugstr_attr(key), size);
+ struct attributes *attributes = impl_from_IMFAttributes(iface);
+ struct attribute *attribute;
+ HRESULT hr = S_OK;
- return E_NOTIMPL;
+ TRACE("%p, %s, %p.\n", iface, debugstr_attr(key), size);
+
+ EnterCriticalSection(&attributes->cs);
+
+ attribute = attributes_find_item(attributes, key, NULL);
+ if (attribute)
+ {
+ if (attribute->value.vt == MF_ATTRIBUTE_BLOB)
+ *size = attribute->value.u.caub.cElems;
+ else
+ hr = MF_E_INVALIDTYPE;
+ }
+ else
+ hr = MF_E_ATTRIBUTENOTFOUND;
+
+ LeaveCriticalSection(&attributes->cs);
+
+ return hr;
}
static HRESULT WINAPI mfattributes_GetBlob(IMFAttributes *iface, REFGUID key, UINT8 *buf,
UINT32 bufsize, UINT32 *blobsize)
{
- FIXME("%p, %s, %p, %d, %p.\n", iface, debugstr_attr(key), buf, bufsize, blobsize);
+ struct attributes *attributes = impl_from_IMFAttributes(iface);
+ struct attribute *attribute;
+ HRESULT hr;
- return E_NOTIMPL;
+ TRACE("%p, %s, %p, %d, %p.\n", iface, debugstr_attr(key), buf, bufsize, blobsize);
+
+ EnterCriticalSection(&attributes->cs);
+
+ attribute = attributes_find_item(attributes, key, NULL);
+ if (attribute)
+ {
+ if (attribute->value.vt == MF_ATTRIBUTE_BLOB)
+ {
+ UINT32 size = attribute->value.u.caub.cElems;
+
+ if (bufsize >= size)
+ hr = PropVariantToBuffer(&attribute->value, buf, size);
+ else
+ hr = E_NOT_SUFFICIENT_BUFFER;
+
+ if (blobsize)
+ *blobsize = size;
+ }
+ else
+ hr = MF_E_INVALIDTYPE;
+ }
+ else
+ hr = MF_E_ATTRIBUTENOTFOUND;
+
+ LeaveCriticalSection(&attributes->cs);
+
+ return hr;
}
static HRESULT WINAPI mfattributes_GetAllocatedBlob(IMFAttributes *iface, REFGUID key, UINT8 **buf, UINT32 *size)
{
- FIXME("%p, %s, %p, %p.\n", iface, debugstr_attr(key), buf, size);
+ struct attributes *attributes = impl_from_IMFAttributes(iface);
+ PROPVARIANT attrval;
+ HRESULT hr;
- return E_NOTIMPL;
+ TRACE("%p, %s, %p, %p.\n", iface, debugstr_attr(key), buf, size);
+
+ attrval.vt = VT_VECTOR | VT_UI1;
+ hr = attributes_get_item(attributes, key, &attrval);
+ if (SUCCEEDED(hr))
+ {
+ *buf = attrval.u.caub.pElems;
+ *size = attrval.u.caub.cElems;
+ }
+
+ return hr;
}
static HRESULT WINAPI mfattributes_GetUnknown(IMFAttributes *iface, REFGUID key, REFIID riid, void **ppv)
@@ -1070,9 +1130,15 @@ static HRESULT WINAPI mfattributes_SetString(IMFAttributes *iface, REFGUID key,
static HRESULT WINAPI mfattributes_SetBlob(IMFAttributes *iface, REFGUID key, const UINT8 *buf, UINT32 size)
{
- FIXME("%p, %s, %p, %u.\n", iface, debugstr_attr(key), buf, size);
+ struct attributes *attributes = impl_from_IMFAttributes(iface);
+ PROPVARIANT attrval;
- return E_NOTIMPL;
+ TRACE("%p, %s, %p, %u.\n", iface, debugstr_attr(key), buf, size);
+
+ attrval.vt = VT_VECTOR | VT_UI1;
+ attrval.u.caub.cElems = size;
+ attrval.u.caub.pElems = (UINT8 *)buf;
+ return attributes_set_item(attributes, key, &attrval);
}
static HRESULT WINAPI mfattributes_SetUnknown(IMFAttributes *iface, REFGUID key, IUnknown *unknown)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 73367b67ad..edf3c6e694 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -501,9 +501,11 @@ static void check_attr_count(IMFAttributes* obj, UINT32 expected, int line)
static void test_MFCreateAttributes(void)
{
static const WCHAR stringW[] = {'W','i','n','e',0};
+ static const UINT8 blob[] = {0,1,2,3,4,5};
IMFAttributes *attributes, *attributes1;
+ UINT8 blob_value[256], *blob_buf = NULL;
+ UINT32 value, string_length, size;
PROPVARIANT propvar, ret_propvar;
- UINT32 value, string_length;
double double_value;
IUnknown *unk_value;
WCHAR bufferW[256];
@@ -724,6 +726,40 @@ static void test_MFCreateAttributes(void)
ok(hr == S_OK, "Failed to copy items, hr %#x.\n", hr);
CHECK_ATTR_COUNT(attributes, 0);
+ /* Blob */
+ hr = IMFAttributes_SetBlob(attributes, &DUMMY_GUID1, blob, sizeof(blob));
+ ok(hr == S_OK, "Failed to set blob attribute, hr %#x.\n", hr);
+ CHECK_ATTR_COUNT(attributes, 1);
+ hr = IMFAttributes_GetBlobSize(attributes, &DUMMY_GUID1, &size);
+ ok(hr == S_OK, "Failed to get blob size, hr %#x.\n", hr);
+ ok(size == sizeof(blob), "Unexpected blob size %u.\n", size);
+
+ hr = IMFAttributes_GetBlobSize(attributes, &DUMMY_GUID2, &size);
+ ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr);
+
+ size = 0;
+ hr = IMFAttributes_GetBlob(attributes, &DUMMY_GUID1, blob_value, sizeof(blob_value), &size);
+ ok(hr == S_OK, "Failed to get blob, hr %#x.\n", hr);
+ ok(size == sizeof(blob), "Unexpected blob size %u.\n", size);
+ ok(!memcmp(blob_value, blob, size), "Unexpected blob.\n");
+
+ hr = IMFAttributes_GetBlob(attributes, &DUMMY_GUID2, blob_value, sizeof(blob_value), &size);
+ ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr);
+
+ memset(blob_value, 0, sizeof(blob_value));
+ size = 0;
+ hr = IMFAttributes_GetAllocatedBlob(attributes, &DUMMY_GUID1, &blob_buf, &size);
+ ok(hr == S_OK, "Failed to get allocated blob, hr %#x.\n", hr);
+ ok(size == sizeof(blob), "Unexpected blob size %u.\n", size);
+ ok(!memcmp(blob_buf, blob, size), "Unexpected blob.\n");
+ CoTaskMemFree(blob_buf);
+
+ hr = IMFAttributes_GetAllocatedBlob(attributes, &DUMMY_GUID2, &blob_buf, &size);
+ ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFAttributes_GetBlob(attributes, &DUMMY_GUID1, blob_value, sizeof(blob) - 1, NULL);
+ ok(hr == E_NOT_SUFFICIENT_BUFFER, "Unexpected hr %#x.\n", hr);
+
IMFAttributes_Release(attributes);
IMFAttributes_Release(attributes1);
}
--
2.20.1
More information about the wine-devel
mailing list