2 * Copyright 2019 Nikolay Sivov for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #define NONAMELESSUNION
26 #include "d3d9types.h"
28 #include "wine/heap.h"
29 #include "wine/debug.h"
39 IMFAttributes IMFAttributes_iface
;
42 struct attribute
*attributes
;
47 extern HRESULT
init_attributes_object(struct attributes
*object
, UINT32 size
) DECLSPEC_HIDDEN
;
48 extern void clear_attributes_object(struct attributes
*object
) DECLSPEC_HIDDEN
;
49 extern const char *debugstr_attr(const GUID
*guid
) DECLSPEC_HIDDEN
;
50 extern const char *debugstr_mf_guid(const GUID
*guid
) DECLSPEC_HIDDEN
;
52 extern HRESULT
attributes_GetItem(struct attributes
*object
, REFGUID key
, PROPVARIANT
*value
) DECLSPEC_HIDDEN
;
53 extern HRESULT
attributes_GetItemType(struct attributes
*object
, REFGUID key
, MF_ATTRIBUTE_TYPE
*type
) DECLSPEC_HIDDEN
;
54 extern HRESULT
attributes_CompareItem(struct attributes
*object
, REFGUID key
, REFPROPVARIANT value
,
55 BOOL
*result
) DECLSPEC_HIDDEN
;
56 extern HRESULT
attributes_Compare(struct attributes
*object
, IMFAttributes
*theirs
,
57 MF_ATTRIBUTES_MATCH_TYPE match_type
, BOOL
*ret
) DECLSPEC_HIDDEN
;
58 extern HRESULT
attributes_GetUINT32(struct attributes
*object
, REFGUID key
, UINT32
*value
) DECLSPEC_HIDDEN
;
59 extern HRESULT
attributes_GetUINT64(struct attributes
*object
, REFGUID key
, UINT64
*value
) DECLSPEC_HIDDEN
;
60 extern HRESULT
attributes_GetDouble(struct attributes
*object
, REFGUID key
, double *value
) DECLSPEC_HIDDEN
;
61 extern HRESULT
attributes_GetGUID(struct attributes
*object
, REFGUID key
, GUID
*value
) DECLSPEC_HIDDEN
;
62 extern HRESULT
attributes_GetStringLength(struct attributes
*object
, REFGUID key
, UINT32
*length
) DECLSPEC_HIDDEN
;
63 extern HRESULT
attributes_GetString(struct attributes
*object
, REFGUID key
, WCHAR
*value
, UINT32 size
,
64 UINT32
*length
) DECLSPEC_HIDDEN
;
65 extern HRESULT
attributes_GetAllocatedString(struct attributes
*object
, REFGUID key
, WCHAR
**value
,
66 UINT32
*length
) DECLSPEC_HIDDEN
;
67 extern HRESULT
attributes_GetBlobSize(struct attributes
*object
, REFGUID key
, UINT32
*size
) DECLSPEC_HIDDEN
;
68 extern HRESULT
attributes_GetBlob(struct attributes
*object
, REFGUID key
, UINT8
*buf
, UINT32 bufsize
,
69 UINT32
*blobsize
) DECLSPEC_HIDDEN
;
70 extern HRESULT
attributes_GetAllocatedBlob(struct attributes
*object
, REFGUID key
, UINT8
**buf
,
71 UINT32
*size
) DECLSPEC_HIDDEN
;
72 extern HRESULT
attributes_GetUnknown(struct attributes
*object
, REFGUID key
, REFIID riid
, void **out
) DECLSPEC_HIDDEN
;
73 extern HRESULT
attributes_SetItem(struct attributes
*object
, REFGUID key
, REFPROPVARIANT value
) DECLSPEC_HIDDEN
;
74 extern HRESULT
attributes_DeleteItem(struct attributes
*object
, REFGUID key
) DECLSPEC_HIDDEN
;
75 extern HRESULT
attributes_DeleteAllItems(struct attributes
*object
) DECLSPEC_HIDDEN
;
76 extern HRESULT
attributes_SetUINT32(struct attributes
*object
, REFGUID key
, UINT32 value
) DECLSPEC_HIDDEN
;
77 extern HRESULT
attributes_SetUINT64(struct attributes
*object
, REFGUID key
, UINT64 value
) DECLSPEC_HIDDEN
;
78 extern HRESULT
attributes_SetDouble(struct attributes
*object
, REFGUID key
, double value
) DECLSPEC_HIDDEN
;
79 extern HRESULT
attributes_SetGUID(struct attributes
*object
, REFGUID key
, REFGUID value
) DECLSPEC_HIDDEN
;
80 extern HRESULT
attributes_SetString(struct attributes
*object
, REFGUID key
, const WCHAR
*value
) DECLSPEC_HIDDEN
;
81 extern HRESULT
attributes_SetBlob(struct attributes
*object
, REFGUID key
, const UINT8
*buf
,
82 UINT32 size
) DECLSPEC_HIDDEN
;
83 extern HRESULT
attributes_SetUnknown(struct attributes
*object
, REFGUID key
, IUnknown
*unknown
) DECLSPEC_HIDDEN
;
84 extern HRESULT
attributes_LockStore(struct attributes
*object
) DECLSPEC_HIDDEN
;
85 extern HRESULT
attributes_UnlockStore(struct attributes
*object
) DECLSPEC_HIDDEN
;
86 extern HRESULT
attributes_GetCount(struct attributes
*object
, UINT32
*items
) DECLSPEC_HIDDEN
;
87 extern HRESULT
attributes_GetItemByIndex(struct attributes
*object
, UINT32 index
, GUID
*key
,
88 PROPVARIANT
*value
) DECLSPEC_HIDDEN
;
89 extern HRESULT
attributes_CopyAllItems(struct attributes
*object
, IMFAttributes
*dest
) DECLSPEC_HIDDEN
;
91 static inline BOOL
mf_array_reserve(void **elements
, size_t *capacity
, size_t count
, size_t size
)
93 size_t new_capacity
, max_capacity
;
96 if (count
<= *capacity
)
99 max_capacity
= ~(SIZE_T
)0 / size
;
100 if (count
> max_capacity
)
103 new_capacity
= max(4, *capacity
);
104 while (new_capacity
< count
&& new_capacity
<= max_capacity
/ 2)
106 if (new_capacity
< count
)
107 new_capacity
= max_capacity
;
109 if (!(new_elements
= heap_realloc(*elements
, new_capacity
* size
)))
112 *elements
= new_elements
;
113 *capacity
= new_capacity
;
118 extern unsigned int mf_format_get_stride(const GUID
*subtype
, unsigned int width
, BOOL
*is_yuv
) DECLSPEC_HIDDEN
;
120 static inline const char *debugstr_propvar(const PROPVARIANT
*v
)
128 return wine_dbg_sprintf("%p {VT_EMPTY}", v
);
130 return wine_dbg_sprintf("%p {VT_NULL}", v
);
132 return wine_dbg_sprintf("%p {VT_UI4: %d}", v
, v
->ulVal
);
134 return wine_dbg_sprintf("%p {VT_UI8: %s}", v
, wine_dbgstr_longlong(v
->uhVal
.QuadPart
));
136 return wine_dbg_sprintf("%p {VT_R8: %lf}", v
, v
->dblVal
);
138 return wine_dbg_sprintf("%p {VT_CLSID: %s}", v
, debugstr_mf_guid(v
->puuid
));
140 return wine_dbg_sprintf("%p {VT_LPWSTR: %s}", v
, wine_dbgstr_w(v
->pwszVal
));
141 case VT_VECTOR
| VT_UI1
:
142 return wine_dbg_sprintf("%p {VT_VECTOR|VT_UI1: %p}", v
, v
->caub
.pElems
);
144 return wine_dbg_sprintf("%p {VT_UNKNOWN: %p}", v
, v
->punkVal
);
146 return wine_dbg_sprintf("%p {vt %#x}", v
, v
->vt
);
150 static inline const char *debugstr_fourcc(DWORD format
)
152 static const struct format_name
158 { D3DFMT_R8G8B8
, "R8G8B8" },
159 { D3DFMT_A8R8G8B8
, "A8R8G8B8" },
160 { D3DFMT_X8R8G8B8
, "X8R8G8B8" },
161 { D3DFMT_R5G6B5
, "R5G6B5" },
162 { D3DFMT_X1R5G5B5
, "X1R5G6B5" },
163 { D3DFMT_A2B10G10R10
, "A2B10G10R10" },
166 { D3DFMT_D16
, "D16" },
167 { D3DFMT_L16
, "L16" },
168 { D3DFMT_A16B16G16R16F
, "A16B16G16R16F" },
172 if ((format
& 0xff) == format
)
174 for (i
= 0; i
< ARRAY_SIZE(formats
); ++i
)
176 if (formats
[i
].format
== format
)
177 return wine_dbg_sprintf("%s", wine_dbgstr_an(formats
[i
].name
, -1));
180 return wine_dbg_sprintf("%#x", format
);
183 return wine_dbgstr_an((char *)&format
, 4);
186 static inline const char *debugstr_time(LONGLONG time
)
188 ULONGLONG abstime
= time
>= 0 ? time
: -time
;
189 unsigned int i
= 0, j
= 0;
190 char buffer
[23], rev
[23];
192 while (abstime
|| i
<= 8)
194 buffer
[i
++] = '0' + (abstime
% 10);
196 if (i
== 7) buffer
[i
++] = '.';
198 if (time
< 0) buffer
[i
++] = '-';
200 while (i
--) rev
[j
++] = buffer
[i
];
201 while (rev
[j
-1] == '0' && rev
[j
-2] != '.') --j
;
204 return wine_dbg_sprintf("%s", rev
);