| /* |
| * |
| * Copyright 2014 Austin English |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #include <stdarg.h> |
| #include <string.h> |
| |
| #define COBJMACROS |
| |
| #include "windef.h" |
| #include "winbase.h" |
| #include "winuser.h" |
| #include "winreg.h" |
| |
| #include "initguid.h" |
| #include "mfapi.h" |
| #include "mfidl.h" |
| #include "mferror.h" |
| |
| #include "wine/debug.h" |
| #include "wine/unicode.h" |
| |
| WINE_DEFAULT_DEBUG_CHANNEL(mfplat); |
| |
| static const WCHAR transform_keyW[] = {'M','e','d','i','a','F','o','u','n','d','a','t','i','o','n','\\', |
| 'T','r','a','n','s','f','o','r','m','s',0}; |
| static const WCHAR categories_keyW[] = {'M','e','d','i','a','F','o','u','n','d','a','t','i','o','n','\\', |
| 'T','r','a','n','s','f','o','r','m','s','\\', |
| 'C','a','t','e','g','o','r','i','e','s',0}; |
| static const WCHAR inputtypesW[] = {'I','n','p','u','t','T','y','p','e','s',0}; |
| static const WCHAR outputtypesW[] = {'O','u','t','p','u','t','T','y','p','e','s',0}; |
| static const WCHAR szGUIDFmt[] = |
| { |
| '%','0','8','x','-','%','0','4','x','-','%','0','4','x','-','%','0', |
| '2','x','%','0','2','x','-','%','0','2','x','%','0','2','x','%','0','2', |
| 'x','%','0','2','x','%','0','2','x','%','0','2','x',0 |
| }; |
| |
| static const BYTE guid_conv_table[256] = |
| { |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */ |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */ |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */ |
| 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, /* 0x30 */ |
| 0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */ |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */ |
| 0, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf /* 0x60 */ |
| }; |
| |
| static WCHAR* GUIDToString(WCHAR *str, REFGUID guid) |
| { |
| sprintfW(str, szGUIDFmt, guid->Data1, guid->Data2, |
| guid->Data3, guid->Data4[0], guid->Data4[1], |
| guid->Data4[2], guid->Data4[3], guid->Data4[4], |
| guid->Data4[5], guid->Data4[6], guid->Data4[7]); |
| |
| return str; |
| } |
| |
| static inline BOOL is_valid_hex(WCHAR c) |
| { |
| if (!(((c >= '0') && (c <= '9')) || |
| ((c >= 'a') && (c <= 'f')) || |
| ((c >= 'A') && (c <= 'F')))) |
| return FALSE; |
| return TRUE; |
| } |
| |
| static BOOL GUIDFromString(LPCWSTR s, GUID *id) |
| { |
| int i; |
| |
| /* in form XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX */ |
| |
| id->Data1 = 0; |
| for (i = 0; i < 8; i++) |
| { |
| if (!is_valid_hex(s[i])) return FALSE; |
| id->Data1 = (id->Data1 << 4) | guid_conv_table[s[i]]; |
| } |
| if (s[8]!='-') return FALSE; |
| |
| id->Data2 = 0; |
| for (i = 9; i < 13; i++) |
| { |
| if (!is_valid_hex(s[i])) return FALSE; |
| id->Data2 = (id->Data2 << 4) | guid_conv_table[s[i]]; |
| } |
| if (s[13]!='-') return FALSE; |
| |
| id->Data3 = 0; |
| for (i = 14; i < 18; i++) |
| { |
| if (!is_valid_hex(s[i])) return FALSE; |
| id->Data3 = (id->Data3 << 4) | guid_conv_table[s[i]]; |
| } |
| if (s[18]!='-') return FALSE; |
| |
| for (i = 19; i < 36; i+=2) |
| { |
| if (i == 23) |
| { |
| if (s[i]!='-') return FALSE; |
| i++; |
| } |
| if (!is_valid_hex(s[i]) || !is_valid_hex(s[i+1])) return FALSE; |
| id->Data4[(i-19)/2] = guid_conv_table[s[i]] << 4 | guid_conv_table[s[i+1]]; |
| } |
| |
| if (!s[37]) return TRUE; |
| return FALSE; |
| } |
| |
| BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, LPVOID reserved) |
| { |
| switch (reason) |
| { |
| case DLL_WINE_PREATTACH: |
| return FALSE; /* prefer native version */ |
| case DLL_PROCESS_ATTACH: |
| DisableThreadLibraryCalls(instance); |
| break; |
| } |
| |
| return TRUE; |
| } |
| |
| static HRESULT register_transform(CLSID *clsid, WCHAR *name, |
| UINT32 cinput, MFT_REGISTER_TYPE_INFO *input_types, |
| UINT32 coutput, MFT_REGISTER_TYPE_INFO *output_types) |
| { |
| static const WCHAR reg_format[] = {'%','s','\\','%','s',0}; |
| HKEY hclsid = 0; |
| WCHAR buffer[64]; |
| DWORD size; |
| WCHAR str[250]; |
| |
| GUIDToString(buffer, clsid); |
| sprintfW(str, reg_format, transform_keyW, buffer); |
| |
| if (RegCreateKeyW(HKEY_CLASSES_ROOT, str, &hclsid)) |
| return E_FAIL; |
| |
| size = (strlenW(name) + 1) * sizeof(WCHAR); |
| if (RegSetValueExW(hclsid, NULL, 0, REG_SZ, (BYTE *)name, size)) |
| goto err; |
| |
| if (cinput && input_types) |
| { |
| size = cinput * sizeof(MFT_REGISTER_TYPE_INFO); |
| if (RegSetValueExW(hclsid, inputtypesW, 0, REG_BINARY, (BYTE *)input_types, size)) |
| goto err; |
| } |
| |
| if (coutput && output_types) |
| { |
| size = coutput * sizeof(MFT_REGISTER_TYPE_INFO); |
| if (RegSetValueExW(hclsid, outputtypesW, 0, REG_BINARY, (BYTE *)output_types, size)) |
| goto err; |
| } |
| |
| RegCloseKey(hclsid); |
| return S_OK; |
| |
| err: |
| RegCloseKey(hclsid); |
| return E_FAIL; |
| } |
| |
| static HRESULT register_category(CLSID *clsid, GUID *category) |
| { |
| static const WCHAR reg_format[] = {'%','s','\\','%','s','\\','%','s',0}; |
| HKEY htmp1; |
| WCHAR guid1[64], guid2[64]; |
| WCHAR str[350]; |
| |
| GUIDToString(guid1, category); |
| GUIDToString(guid2, clsid); |
| |
| sprintfW(str, reg_format, categories_keyW, guid1, guid2); |
| |
| if (RegCreateKeyW(HKEY_CLASSES_ROOT, str, &htmp1)) |
| return E_FAIL; |
| |
| RegCloseKey(htmp1); |
| return S_OK; |
| } |
| |
| /*********************************************************************** |
| * MFTRegister (mfplat.@) |
| */ |
| HRESULT WINAPI MFTRegister(CLSID clsid, GUID category, LPWSTR name, UINT32 flags, UINT32 cinput, |
| MFT_REGISTER_TYPE_INFO *input_types, UINT32 coutput, |
| MFT_REGISTER_TYPE_INFO *output_types, IMFAttributes *attributes) |
| { |
| HRESULT hr; |
| |
| TRACE("(%s, %s, %s, %x, %u, %p, %u, %p, %p)\n", debugstr_guid(&clsid), debugstr_guid(&category), |
| debugstr_w(name), flags, cinput, input_types, |
| coutput, output_types, attributes); |
| |
| if (attributes) |
| FIXME("attributes not yet supported.\n"); |
| |
| if (flags) |
| FIXME("flags not yet supported.\n"); |
| |
| hr = register_transform(&clsid, name, cinput, input_types, coutput, output_types); |
| if(FAILED(hr)) |
| ERR("Failed to write register transform\n"); |
| |
| if (SUCCEEDED(hr)) |
| hr = register_category(&clsid, &category); |
| |
| return hr; |
| } |
| |
| static BOOL match_type(const WCHAR *clsid_str, const WCHAR *type_str, MFT_REGISTER_TYPE_INFO *type) |
| { |
| HKEY htransform, hfilter; |
| DWORD reg_type, size; |
| LONG ret = FALSE; |
| MFT_REGISTER_TYPE_INFO *info = NULL; |
| int i; |
| |
| if (RegOpenKeyW(HKEY_CLASSES_ROOT, transform_keyW, &htransform)) |
| return FALSE; |
| |
| if (RegOpenKeyW(htransform, clsid_str, &hfilter)) |
| { |
| RegCloseKey(htransform); |
| return FALSE; |
| } |
| |
| if (RegQueryValueExW(hfilter, type_str, NULL, ®_type, NULL, &size) != ERROR_SUCCESS) |
| goto out; |
| |
| if (reg_type != REG_BINARY) |
| goto out; |
| |
| if (!size || size % (sizeof(MFT_REGISTER_TYPE_INFO)) != 0) |
| goto out; |
| |
| info = HeapAlloc(GetProcessHeap(), 0, size); |
| if (!info) |
| goto out; |
| |
| if (RegQueryValueExW(hfilter, type_str, NULL, ®_type, (LPBYTE)info, &size) != ERROR_SUCCESS) |
| goto out; |
| |
| for (i = 0; i < size / sizeof(MFT_REGISTER_TYPE_INFO); i++) |
| { |
| if (IsEqualGUID(&info[i].guidMajorType, &type->guidMajorType) && |
| IsEqualGUID(&info[i].guidSubtype, &type->guidSubtype)) |
| { |
| ret = TRUE; |
| break; |
| } |
| } |
| |
| out: |
| HeapFree(GetProcessHeap(), 0, info); |
| RegCloseKey(hfilter); |
| RegCloseKey(htransform); |
| return ret; |
| } |
| |
| /*********************************************************************** |
| * MFTEnum (mfplat.@) |
| */ |
| HRESULT WINAPI MFTEnum(GUID category, UINT32 flags, MFT_REGISTER_TYPE_INFO *input_type, |
| MFT_REGISTER_TYPE_INFO *output_type, IMFAttributes *attributes, |
| CLSID **pclsids, UINT32 *pcount) |
| { |
| WCHAR buffer[64], clsid_str[MAX_PATH] = {0}; |
| HKEY hcategory, hlist; |
| DWORD index = 0; |
| DWORD size = MAX_PATH; |
| CLSID *clsids = NULL; |
| UINT32 count = 0; |
| LONG ret; |
| |
| TRACE("(%s, %x, %p, %p, %p, %p, %p)\n", debugstr_guid(&category), flags, input_type, |
| output_type, attributes, pclsids, pcount); |
| |
| if (!pclsids || !pcount) |
| return E_INVALIDARG; |
| |
| if (RegOpenKeyW(HKEY_CLASSES_ROOT, categories_keyW, &hcategory)) |
| return E_FAIL; |
| |
| GUIDToString(buffer, &category); |
| |
| ret = RegOpenKeyW(hcategory, buffer, &hlist); |
| RegCloseKey(hcategory); |
| if (ret) return E_FAIL; |
| |
| while (RegEnumKeyExW(hlist, index, clsid_str, &size, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) |
| { |
| GUID clsid; |
| void *tmp; |
| |
| if (!GUIDFromString(clsid_str, &clsid)) |
| goto next; |
| |
| if (output_type && !match_type(clsid_str, outputtypesW, output_type)) |
| goto next; |
| |
| if (input_type && !match_type(clsid_str, inputtypesW, input_type)) |
| goto next; |
| |
| tmp = CoTaskMemRealloc(clsids, (count + 1) * sizeof(GUID)); |
| if (!tmp) |
| { |
| CoTaskMemFree(clsids); |
| RegCloseKey(hlist); |
| return E_OUTOFMEMORY; |
| } |
| |
| clsids = tmp; |
| clsids[count++] = clsid; |
| |
| next: |
| size = MAX_PATH; |
| index++; |
| } |
| |
| *pclsids = clsids; |
| *pcount = count; |
| |
| RegCloseKey(hlist); |
| return S_OK; |
| } |
| |
| /*********************************************************************** |
| * MFTEnumEx (mfplat.@) |
| */ |
| HRESULT WINAPI MFTEnumEx(GUID category, UINT32 flags, const MFT_REGISTER_TYPE_INFO *input_type, |
| const MFT_REGISTER_TYPE_INFO *output_type, IMFActivate ***activate, |
| UINT32 *pcount) |
| { |
| FIXME("(%s, %x, %p, %p, %p, %p): stub\n", debugstr_guid(&category), flags, input_type, |
| output_type, activate, pcount); |
| |
| *pcount = 0; |
| return S_OK; |
| } |
| |
| /*********************************************************************** |
| * MFTUnregister (mfplat.@) |
| */ |
| HRESULT WINAPI MFTUnregister(CLSID clsid) |
| { |
| WCHAR buffer[64], category[MAX_PATH]; |
| HKEY htransform, hcategory, htmp; |
| DWORD size = MAX_PATH; |
| DWORD index = 0; |
| |
| TRACE("(%s)\n", debugstr_guid(&clsid)); |
| |
| GUIDToString(buffer, &clsid); |
| |
| if (!RegOpenKeyW(HKEY_CLASSES_ROOT, transform_keyW, &htransform)) |
| { |
| RegDeleteKeyW(htransform, buffer); |
| RegCloseKey(htransform); |
| } |
| |
| if (!RegOpenKeyW(HKEY_CLASSES_ROOT, categories_keyW, &hcategory)) |
| { |
| while (RegEnumKeyExW(hcategory, index, category, &size, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) |
| { |
| if (!RegOpenKeyW(hcategory, category, &htmp)) |
| { |
| RegDeleteKeyW(htmp, buffer); |
| RegCloseKey(htmp); |
| } |
| size = MAX_PATH; |
| index++; |
| } |
| RegCloseKey(hcategory); |
| } |
| |
| return S_OK; |
| } |
| |
| /*********************************************************************** |
| * MFStartup (mfplat.@) |
| */ |
| HRESULT WINAPI MFStartup(ULONG version, DWORD flags) |
| { |
| FIXME("(%u, %u): stub\n", version, flags); |
| return MF_E_BAD_STARTUP_VERSION; |
| } |
| |
| /*********************************************************************** |
| * MFShutdown (mfplat.@) |
| */ |
| HRESULT WINAPI MFShutdown(void) |
| { |
| FIXME("(): stub\n"); |
| return S_OK; |
| } |
| |
| static HRESULT WINAPI MFPluginControl_QueryInterface(IMFPluginControl *iface, REFIID riid, void **ppv) |
| { |
| if(IsEqualGUID(riid, &IID_IUnknown)) { |
| TRACE("(IID_IUnknown %p)\n", ppv); |
| *ppv = iface; |
| }else if(IsEqualGUID(riid, &IID_IMFPluginControl)) { |
| TRACE("(IID_IMFPluginControl %p)\n", ppv); |
| *ppv = iface; |
| }else { |
| FIXME("(%s %p)\n", debugstr_guid(riid), ppv); |
| *ppv = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| IUnknown_AddRef((IUnknown*)*ppv); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI MFPluginControl_AddRef(IMFPluginControl *iface) |
| { |
| TRACE("\n"); |
| return 2; |
| } |
| |
| static ULONG WINAPI MFPluginControl_Release(IMFPluginControl *iface) |
| { |
| TRACE("\n"); |
| return 1; |
| } |
| |
| static HRESULT WINAPI MFPluginControl_GetPreferredClsid(IMFPluginControl *iface, DWORD plugin_type, |
| const WCHAR *selector, CLSID *clsid) |
| { |
| FIXME("(%d %s %p)\n", plugin_type, debugstr_w(selector), clsid); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI MFPluginControl_GetPreferredClsidByIndex(IMFPluginControl *iface, DWORD plugin_type, |
| DWORD index, WCHAR **selector, CLSID *clsid) |
| { |
| FIXME("(%d %d %p %p)\n", plugin_type, index, selector, clsid); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI MFPluginControl_SetPreferredClsid(IMFPluginControl *iface, DWORD plugin_type, |
| const WCHAR *selector, const CLSID *clsid) |
| { |
| FIXME("(%d %s %s)\n", plugin_type, debugstr_w(selector), debugstr_guid(clsid)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI MFPluginControl_IsDisabled(IMFPluginControl *iface, DWORD plugin_type, REFCLSID clsid) |
| { |
| FIXME("(%d %s)\n", plugin_type, debugstr_guid(clsid)); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI MFPluginControl_GetDisabledByIndex(IMFPluginControl *iface, DWORD plugin_type, DWORD index, CLSID *clsid) |
| { |
| FIXME("(%d %d %p)\n", plugin_type, index, clsid); |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI MFPluginControl_SetDisabled(IMFPluginControl *iface, DWORD plugin_type, REFCLSID clsid, BOOL disabled) |
| { |
| FIXME("(%d %s %x)\n", plugin_type, debugstr_guid(clsid), disabled); |
| return E_NOTIMPL; |
| } |
| |
| static const IMFPluginControlVtbl MFPluginControlVtbl = { |
| MFPluginControl_QueryInterface, |
| MFPluginControl_AddRef, |
| MFPluginControl_Release, |
| MFPluginControl_GetPreferredClsid, |
| MFPluginControl_GetPreferredClsidByIndex, |
| MFPluginControl_SetPreferredClsid, |
| MFPluginControl_IsDisabled, |
| MFPluginControl_GetDisabledByIndex, |
| MFPluginControl_SetDisabled |
| }; |
| |
| static IMFPluginControl plugin_control = { &MFPluginControlVtbl }; |
| |
| /*********************************************************************** |
| * MFGetPluginControl (mfplat.@) |
| */ |
| HRESULT WINAPI MFGetPluginControl(IMFPluginControl **ret) |
| { |
| TRACE("(%p)\n", ret); |
| |
| *ret = &plugin_control; |
| return S_OK; |
| } |
| |
| typedef struct _mfattributes |
| { |
| IMFAttributes IMFAttributes_iface; |
| LONG ref; |
| } mfattributes; |
| |
| static inline mfattributes *impl_from_IMFAttributes(IMFAttributes *iface) |
| { |
| return CONTAINING_RECORD(iface, mfattributes, IMFAttributes_iface); |
| } |
| |
| static HRESULT WINAPI mfattributes_QueryInterface(IMFAttributes *iface, REFIID riid, void **out) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), out); |
| |
| if(IsEqualGUID(riid, &IID_IUnknown) || |
| IsEqualGUID(riid, &IID_IMFAttributes)) |
| { |
| *out = &This->IMFAttributes_iface; |
| } |
| else |
| { |
| FIXME("(%s, %p)\n", debugstr_guid(riid), out); |
| *out = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| IUnknown_AddRef((IUnknown*)*out); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI mfattributes_AddRef(IMFAttributes *iface) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| ULONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p) ref=%u\n", This, ref); |
| |
| return ref; |
| } |
| |
| static ULONG WINAPI mfattributes_Release(IMFAttributes *iface) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| ULONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p) ref=%u\n", This, ref); |
| |
| if (!ref) |
| { |
| HeapFree(GetProcessHeap(), 0, This); |
| } |
| |
| return ref; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetItem(IMFAttributes *iface, REFGUID key, PROPVARIANT *value) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetItemType(IMFAttributes *iface, REFGUID key, MF_ATTRIBUTE_TYPE *type) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), type); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_CompareItem(IMFAttributes *iface, REFGUID key, REFPROPVARIANT value, BOOL *result) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p, %p\n", This, debugstr_guid(key), value, result); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_Compare(IMFAttributes *iface, IMFAttributes *theirs, MF_ATTRIBUTES_MATCH_TYPE type, |
| BOOL *result) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %p, %d, %p\n", This, theirs, type, result); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetUINT32(IMFAttributes *iface, REFGUID key, UINT32 *value) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetUINT64(IMFAttributes *iface, REFGUID key, UINT64 *value) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetDouble(IMFAttributes *iface, REFGUID key, double *value) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetGUID(IMFAttributes *iface, REFGUID key, GUID *value) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetStringLength(IMFAttributes *iface, REFGUID key, UINT32 *length) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), length); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetString(IMFAttributes *iface, REFGUID key, WCHAR *value, |
| UINT32 size, UINT32 *length) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p, %d, %p\n", This, debugstr_guid(key), value, size, length); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetAllocatedString(IMFAttributes *iface, REFGUID key, |
| WCHAR **value, UINT32 *length) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p, %p\n", This, debugstr_guid(key), value, length); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetBlobSize(IMFAttributes *iface, REFGUID key, UINT32 *size) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetBlob(IMFAttributes *iface, REFGUID key, UINT8 *buf, |
| UINT32 bufsize, UINT32 *blobsize) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p, %d, %p\n", This, debugstr_guid(key), buf, bufsize, blobsize); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetAllocatedBlob(IMFAttributes *iface, REFGUID key, UINT8 **buf, UINT32 *size) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p, %p\n", This, debugstr_guid(key), buf, size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetUnknown(IMFAttributes *iface, REFGUID key, REFIID riid, void **ppv) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %s, %p\n", This, debugstr_guid(key), debugstr_guid(riid), ppv); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_SetItem(IMFAttributes *iface, REFGUID key, REFPROPVARIANT Value) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), Value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_DeleteItem(IMFAttributes *iface, REFGUID key) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s\n", This, debugstr_guid(key)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_DeleteAllItems(IMFAttributes *iface) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_SetUINT32(IMFAttributes *iface, REFGUID key, UINT32 value) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %d\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_SetUINT64(IMFAttributes *iface, REFGUID key, UINT64 value) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %s\n", This, debugstr_guid(key), wine_dbgstr_longlong(value)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_SetDouble(IMFAttributes *iface, REFGUID key, double value) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %f\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_SetGUID(IMFAttributes *iface, REFGUID key, REFGUID value) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %s\n", This, debugstr_guid(key), debugstr_guid(value)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_SetString(IMFAttributes *iface, REFGUID key, const WCHAR *value) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %s\n", This, debugstr_guid(key), debugstr_w(value)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_SetBlob(IMFAttributes *iface, REFGUID key, const UINT8 *buf, UINT32 size) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p, %d\n", This, debugstr_guid(key), buf, size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_SetUnknown(IMFAttributes *iface, REFGUID key, IUnknown *unknown) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), unknown); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_LockStore(IMFAttributes *iface) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_UnlockStore(IMFAttributes *iface) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetCount(IMFAttributes *iface, UINT32 *items) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %p\n", This, items); |
| |
| if(items) |
| *items = 0; |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_GetItemByIndex(IMFAttributes *iface, UINT32 index, GUID *key, PROPVARIANT *value) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %d, %p, %p\n", This, index, key, value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfattributes_CopyAllItems(IMFAttributes *iface, IMFAttributes *dest) |
| { |
| mfattributes *This = impl_from_IMFAttributes(iface); |
| |
| FIXME("%p, %p\n", This, dest); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IMFAttributesVtbl mfattributes_vtbl = |
| { |
| mfattributes_QueryInterface, |
| mfattributes_AddRef, |
| mfattributes_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 |
| }; |
| |
| /*********************************************************************** |
| * MFCreateAttributes (mfplat.@) |
| */ |
| HRESULT WINAPI MFCreateAttributes(IMFAttributes **attributes, UINT32 size) |
| { |
| mfattributes *object; |
| |
| TRACE("%p, %d\n", attributes, size); |
| |
| object = HeapAlloc( GetProcessHeap(), 0, sizeof(*object) ); |
| if(!object) |
| return E_OUTOFMEMORY; |
| |
| object->ref = 1; |
| object->IMFAttributes_iface.lpVtbl = &mfattributes_vtbl; |
| |
| *attributes = &object->IMFAttributes_iface; |
| return S_OK; |
| } |
| |
| typedef struct _mfsourceresolver |
| { |
| IMFSourceResolver IMFSourceResolver_iface; |
| LONG ref; |
| } mfsourceresolver; |
| |
| static inline mfsourceresolver *impl_from_IMFSourceResolver(IMFSourceResolver *iface) |
| { |
| return CONTAINING_RECORD(iface, mfsourceresolver, IMFSourceResolver_iface); |
| } |
| |
| static HRESULT WINAPI mfsourceresolver_QueryInterface(IMFSourceResolver *iface, REFIID riid, void **obj) |
| { |
| mfsourceresolver *This = impl_from_IMFSourceResolver(iface); |
| |
| TRACE("(%p->(%s, %p)\n", This, debugstr_guid(riid), obj); |
| |
| if (IsEqualIID(riid, &IID_IMFSourceResolver) || |
| IsEqualIID(riid, &IID_IUnknown)) |
| { |
| *obj = &This->IMFSourceResolver_iface; |
| } |
| else |
| { |
| *obj = NULL; |
| FIXME("unsupported interface %s\n", debugstr_guid(riid)); |
| return E_NOINTERFACE; |
| } |
| |
| IUnknown_AddRef((IUnknown *)*obj); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI mfsourceresolver_AddRef(IMFSourceResolver *iface) |
| { |
| mfsourceresolver *This = impl_from_IMFSourceResolver(iface); |
| ULONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p)->(%u)\n", This, ref); |
| |
| return ref; |
| } |
| |
| static ULONG WINAPI mfsourceresolver_Release(IMFSourceResolver *iface) |
| { |
| mfsourceresolver *This = impl_from_IMFSourceResolver(iface); |
| ULONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p)->(%u)\n", This, ref); |
| |
| if (!ref) |
| HeapFree(GetProcessHeap(), 0, This); |
| |
| return ref; |
| } |
| |
| static HRESULT WINAPI mfsourceresolver_CreateObjectFromURL(IMFSourceResolver *iface, const WCHAR *url, |
| DWORD flags, IPropertyStore *props, MF_OBJECT_TYPE *obj_type, IUnknown **object) |
| { |
| mfsourceresolver *This = impl_from_IMFSourceResolver(iface); |
| |
| FIXME("(%p)->(%s, %#x, %p, %p, %p): stub\n", This, debugstr_w(url), flags, props, obj_type, object); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfsourceresolver_CreateObjectFromByteStream(IMFSourceResolver *iface, IMFByteStream *stream, |
| const WCHAR *url, DWORD flags, IPropertyStore *props, MF_OBJECT_TYPE *obj_type, IUnknown **object) |
| { |
| mfsourceresolver *This = impl_from_IMFSourceResolver(iface); |
| |
| FIXME("(%p)->(%p, %s, %#x, %p, %p, %p): stub\n", This, stream, debugstr_w(url), flags, props, obj_type, object); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfsourceresolver_BeginCreateObjectFromURL(IMFSourceResolver *iface, const WCHAR *url, |
| DWORD flags, IPropertyStore *props, IUnknown **cancel_cookie, IMFAsyncCallback *callback, IUnknown *unk_state) |
| { |
| mfsourceresolver *This = impl_from_IMFSourceResolver(iface); |
| |
| FIXME("(%p)->(%s, %#x, %p, %p, %p, %p): stub\n", This, debugstr_w(url), flags, props, cancel_cookie, |
| callback, unk_state); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfsourceresolver_EndCreateObjectFromURL(IMFSourceResolver *iface, IMFAsyncResult *result, |
| MF_OBJECT_TYPE *obj_type, IUnknown **object) |
| { |
| mfsourceresolver *This = impl_from_IMFSourceResolver(iface); |
| |
| FIXME("(%p)->(%p, %p, %p): stub\n", This, result, obj_type, object); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfsourceresolver_BeginCreateObjectFromByteStream(IMFSourceResolver *iface, IMFByteStream *stream, |
| const WCHAR *url, DWORD flags, IPropertyStore *props, IUnknown **cancel_cookie, IMFAsyncCallback *callback, |
| IUnknown *unk_state) |
| { |
| mfsourceresolver *This = impl_from_IMFSourceResolver(iface); |
| |
| FIXME("(%p)->(%p, %s, %#x, %p, %p, %p, %p): stub\n", This, stream, debugstr_w(url), flags, props, cancel_cookie, |
| callback, unk_state); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfsourceresolver_EndCreateObjectFromByteStream(IMFSourceResolver *iface, IMFAsyncResult *result, |
| MF_OBJECT_TYPE *obj_type, IUnknown **object) |
| { |
| mfsourceresolver *This = impl_from_IMFSourceResolver(iface); |
| |
| FIXME("(%p)->(%p, %p, %p): stub\n", This, result, obj_type, object); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfsourceresolver_CancelObjectCreation(IMFSourceResolver *iface, IUnknown *cancel_cookie) |
| { |
| mfsourceresolver *This = impl_from_IMFSourceResolver(iface); |
| |
| FIXME("(%p)->(%p): stub\n", This, cancel_cookie); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IMFSourceResolverVtbl mfsourceresolvervtbl = |
| { |
| mfsourceresolver_QueryInterface, |
| mfsourceresolver_AddRef, |
| mfsourceresolver_Release, |
| mfsourceresolver_CreateObjectFromURL, |
| mfsourceresolver_CreateObjectFromByteStream, |
| mfsourceresolver_BeginCreateObjectFromURL, |
| mfsourceresolver_EndCreateObjectFromURL, |
| mfsourceresolver_BeginCreateObjectFromByteStream, |
| mfsourceresolver_EndCreateObjectFromByteStream, |
| mfsourceresolver_CancelObjectCreation, |
| }; |
| |
| /*********************************************************************** |
| * MFCreateSourceResolver (mfplat.@) |
| */ |
| HRESULT WINAPI MFCreateSourceResolver(IMFSourceResolver **resolver) |
| { |
| mfsourceresolver *object; |
| |
| TRACE("%p\n", resolver); |
| |
| if (!resolver) |
| return E_POINTER; |
| |
| object = HeapAlloc( GetProcessHeap(), 0, sizeof(*object) ); |
| if (!object) |
| return E_OUTOFMEMORY; |
| |
| object->IMFSourceResolver_iface.lpVtbl = &mfsourceresolvervtbl; |
| object->ref = 1; |
| |
| *resolver = &object->IMFSourceResolver_iface; |
| return S_OK; |
| } |
| |
| typedef struct _mfmediatype |
| { |
| IMFMediaType IMFMediaType_iface; |
| LONG ref; |
| } mfmediatype; |
| |
| static inline mfmediatype *impl_from_IMFMediaType(IMFMediaType *iface) |
| { |
| return CONTAINING_RECORD(iface, mfmediatype, IMFMediaType_iface); |
| } |
| |
| static HRESULT WINAPI mediatype_QueryInterface(IMFMediaType *iface, REFIID riid, void **object) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), object); |
| |
| if(IsEqualGUID(riid, &IID_IUnknown) || |
| IsEqualGUID(riid, &IID_IMFAttributes) || |
| IsEqualGUID(riid, &IID_IMFMediaType)) |
| { |
| *object = &This->IMFMediaType_iface; |
| } |
| else |
| { |
| FIXME("(%s, %p)\n", debugstr_guid(riid), object); |
| *object = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| IUnknown_AddRef((IUnknown*)*object); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI mediatype_AddRef(IMFMediaType *iface) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| ULONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p) ref=%u\n", This, ref); |
| |
| return ref; |
| } |
| |
| static ULONG WINAPI mediatype_Release(IMFMediaType *iface) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| ULONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p) ref=%u\n", This, ref); |
| |
| if (!ref) |
| { |
| HeapFree(GetProcessHeap(), 0, This); |
| } |
| |
| return ref; |
| } |
| |
| static HRESULT WINAPI mediatype_GetItem(IMFMediaType *iface, REFGUID key, PROPVARIANT *value) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetItemType(IMFMediaType *iface, REFGUID key, MF_ATTRIBUTE_TYPE *type) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), type); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_CompareItem(IMFMediaType *iface, REFGUID key, REFPROPVARIANT value, BOOL *result) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p, %p\n", This, debugstr_guid(key), value, result); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_Compare(IMFMediaType *iface, IMFAttributes *attrs, MF_ATTRIBUTES_MATCH_TYPE type, |
| BOOL *result) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %p, %d, %p\n", This, attrs, type, result); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetUINT32(IMFMediaType *iface, REFGUID key, UINT32 *value) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetUINT64(IMFMediaType *iface, REFGUID key, UINT64 *value) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetDouble(IMFMediaType *iface, REFGUID key, double *value) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetGUID(IMFMediaType *iface, REFGUID key, GUID *value) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetStringLength(IMFMediaType *iface, REFGUID key, UINT32 *length) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), length); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetString(IMFMediaType *iface, REFGUID key, WCHAR *value, |
| UINT32 size, UINT32 *length) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p, %d, %p\n", This, debugstr_guid(key), value, size, length); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetAllocatedString(IMFMediaType *iface, REFGUID key, |
| WCHAR **value, UINT32 *length) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p, %p\n", This, debugstr_guid(key), value, length); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetBlobSize(IMFMediaType *iface, REFGUID key, UINT32 *size) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetBlob(IMFMediaType *iface, REFGUID key, UINT8 *buf, |
| UINT32 bufsize, UINT32 *blobsize) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p, %d, %p\n", This, debugstr_guid(key), buf, bufsize, blobsize); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetAllocatedBlob(IMFMediaType *iface, REFGUID key, UINT8 **buf, UINT32 *size) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p, %p\n", This, debugstr_guid(key), buf, size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetUnknown(IMFMediaType *iface, REFGUID key, REFIID riid, void **ppv) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %s, %p\n", This, debugstr_guid(key), debugstr_guid(riid), ppv); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_SetItem(IMFMediaType *iface, REFGUID key, REFPROPVARIANT value) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_DeleteItem(IMFMediaType *iface, REFGUID key) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s\n", This, debugstr_guid(key)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_DeleteAllItems(IMFMediaType *iface) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_SetUINT32(IMFMediaType *iface, REFGUID key, UINT32 value) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %d\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_SetUINT64(IMFMediaType *iface, REFGUID key, UINT64 value) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %s\n", This, debugstr_guid(key), wine_dbgstr_longlong(value)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_SetDouble(IMFMediaType *iface, REFGUID key, double value) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %f\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_SetGUID(IMFMediaType *iface, REFGUID key, REFGUID value) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %s\n", This, debugstr_guid(key), debugstr_guid(value)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_SetString(IMFMediaType *iface, REFGUID key, const WCHAR *value) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %s\n", This, debugstr_guid(key), debugstr_w(value)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_SetBlob(IMFMediaType *iface, REFGUID key, const UINT8 *buf, UINT32 size) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p, %d\n", This, debugstr_guid(key), buf, size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_SetUnknown(IMFMediaType *iface, REFGUID key, IUnknown *unknown) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), unknown); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_LockStore(IMFMediaType *iface) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_UnlockStore(IMFMediaType *iface) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetCount(IMFMediaType *iface, UINT32 *items) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %p\n", This, items); |
| |
| if(items) |
| *items = 0; |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetItemByIndex(IMFMediaType *iface, UINT32 index, GUID *key, PROPVARIANT *value) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %d, %p, %p\n", This, index, key, value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_CopyAllItems(IMFMediaType *iface, IMFAttributes *dest) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %p\n", This, dest); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetMajorType(IMFMediaType *iface, GUID *guid) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %p\n", This, guid); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_IsCompressedFormat(IMFMediaType *iface, BOOL *compressed) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %p\n", This, compressed); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_IsEqual(IMFMediaType *iface, IMFMediaType *type, DWORD *flags) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %p, %p\n", This, type, flags); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_GetRepresentation(IMFMediaType *iface, GUID guid, void **representation) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(&guid), representation); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mediatype_FreeRepresentation(IMFMediaType *iface, GUID guid, void *representation) |
| { |
| mfmediatype *This = impl_from_IMFMediaType(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(&guid), representation); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IMFMediaTypeVtbl mediatype_vtbl = |
| { |
| mediatype_QueryInterface, |
| mediatype_AddRef, |
| mediatype_Release, |
| mediatype_GetItem, |
| mediatype_GetItemType, |
| mediatype_CompareItem, |
| mediatype_Compare, |
| mediatype_GetUINT32, |
| mediatype_GetUINT64, |
| mediatype_GetDouble, |
| mediatype_GetGUID, |
| mediatype_GetStringLength, |
| mediatype_GetString, |
| mediatype_GetAllocatedString, |
| mediatype_GetBlobSize, |
| mediatype_GetBlob, |
| mediatype_GetAllocatedBlob, |
| mediatype_GetUnknown, |
| mediatype_SetItem, |
| mediatype_DeleteItem, |
| mediatype_DeleteAllItems, |
| mediatype_SetUINT32, |
| mediatype_SetUINT64, |
| mediatype_SetDouble, |
| mediatype_SetGUID, |
| mediatype_SetString, |
| mediatype_SetBlob, |
| mediatype_SetUnknown, |
| mediatype_LockStore, |
| mediatype_UnlockStore, |
| mediatype_GetCount, |
| mediatype_GetItemByIndex, |
| mediatype_CopyAllItems, |
| mediatype_GetMajorType, |
| mediatype_IsCompressedFormat, |
| mediatype_IsEqual, |
| mediatype_GetRepresentation, |
| mediatype_FreeRepresentation |
| }; |
| |
| /*********************************************************************** |
| * MFCreateMediaType (mfplat.@) |
| */ |
| HRESULT WINAPI MFCreateMediaType(IMFMediaType **type) |
| { |
| mfmediatype *object; |
| |
| TRACE("%p\n", type); |
| |
| if(!type) |
| return E_INVALIDARG; |
| |
| object = HeapAlloc( GetProcessHeap(), 0, sizeof(*object) ); |
| if(!object) |
| return E_OUTOFMEMORY; |
| |
| object->ref = 1; |
| object->IMFMediaType_iface.lpVtbl = &mediatype_vtbl; |
| |
| *type = &object->IMFMediaType_iface; |
| return S_OK; |
| } |
| |
| typedef struct _mfeventqueue |
| { |
| IMFMediaEventQueue IMFMediaEventQueue_iface; |
| LONG ref; |
| } mfeventqueue; |
| |
| static inline mfeventqueue *impl_from_IMFMediaEventQueue(IMFMediaEventQueue *iface) |
| { |
| return CONTAINING_RECORD(iface, mfeventqueue, IMFMediaEventQueue_iface); |
| } |
| |
| static HRESULT WINAPI mfeventqueue_QueryInterface(IMFMediaEventQueue *iface, REFIID riid, void **out) |
| { |
| mfeventqueue *This = impl_from_IMFMediaEventQueue(iface); |
| |
| TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), out); |
| |
| if(IsEqualGUID(riid, &IID_IUnknown) || |
| IsEqualGUID(riid, &IID_IMFMediaEventQueue)) |
| { |
| *out = &This->IMFMediaEventQueue_iface; |
| } |
| else |
| { |
| FIXME("(%s, %p)\n", debugstr_guid(riid), out); |
| *out = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| IUnknown_AddRef((IUnknown*)*out); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI mfeventqueue_AddRef(IMFMediaEventQueue *iface) |
| { |
| mfeventqueue *This = impl_from_IMFMediaEventQueue(iface); |
| ULONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p) ref=%u\n", This, ref); |
| |
| return ref; |
| } |
| |
| static ULONG WINAPI mfeventqueue_Release(IMFMediaEventQueue *iface) |
| { |
| mfeventqueue *This = impl_from_IMFMediaEventQueue(iface); |
| ULONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p) ref=%u\n", This, ref); |
| |
| if (!ref) |
| { |
| HeapFree(GetProcessHeap(), 0, This); |
| } |
| |
| return ref; |
| } |
| |
| static HRESULT WINAPI mfeventqueue_GetEvent(IMFMediaEventQueue *iface, DWORD flags, IMFMediaEvent **event) |
| { |
| mfeventqueue *This = impl_from_IMFMediaEventQueue(iface); |
| |
| FIXME("%p, %p\n", This, event); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfeventqueue_BeginGetEvent(IMFMediaEventQueue *iface, IMFAsyncCallback *callback, IUnknown *state) |
| { |
| mfeventqueue *This = impl_from_IMFMediaEventQueue(iface); |
| |
| FIXME("%p, %p, %p\n", This, callback, state); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfeventqueue_EndGetEvent(IMFMediaEventQueue *iface, IMFAsyncResult *result, IMFMediaEvent **event) |
| { |
| mfeventqueue *This = impl_from_IMFMediaEventQueue(iface); |
| |
| FIXME("%p, %p, %p\n", This, result, event); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfeventqueue_QueueEvent(IMFMediaEventQueue *iface, IMFMediaEvent *event) |
| { |
| mfeventqueue *This = impl_from_IMFMediaEventQueue(iface); |
| |
| FIXME("%p, %p\n", This, event); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfeventqueue_QueueEventParamVar(IMFMediaEventQueue *iface, MediaEventType met, |
| REFGUID type, HRESULT status, const PROPVARIANT *value) |
| { |
| mfeventqueue *This = impl_from_IMFMediaEventQueue(iface); |
| |
| FIXME("%p, %d, %s, 0x%08x, %p\n", This, met, debugstr_guid(type), status, value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfeventqueue_QueueEventParamUnk(IMFMediaEventQueue *iface, MediaEventType met, REFGUID type, |
| HRESULT status, IUnknown *unk) |
| { |
| mfeventqueue *This = impl_from_IMFMediaEventQueue(iface); |
| |
| FIXME("%p, %d, %s, 0x%08x, %p\n", This, met, debugstr_guid(type), status, unk); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfeventqueue_Shutdown(IMFMediaEventQueue *iface) |
| { |
| mfeventqueue *This = impl_from_IMFMediaEventQueue(iface); |
| |
| FIXME("%p\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IMFMediaEventQueueVtbl mfeventqueue_vtbl = |
| { |
| mfeventqueue_QueryInterface, |
| mfeventqueue_AddRef, |
| mfeventqueue_Release, |
| mfeventqueue_GetEvent, |
| mfeventqueue_BeginGetEvent, |
| mfeventqueue_EndGetEvent, |
| mfeventqueue_QueueEvent, |
| mfeventqueue_QueueEventParamVar, |
| mfeventqueue_QueueEventParamUnk, |
| mfeventqueue_Shutdown |
| }; |
| |
| /*********************************************************************** |
| * MFCreateEventQueue (mfplat.@) |
| */ |
| HRESULT WINAPI MFCreateEventQueue(IMFMediaEventQueue **queue) |
| { |
| mfeventqueue *object; |
| |
| TRACE("%p\n", queue); |
| |
| object = HeapAlloc( GetProcessHeap(), 0, sizeof(*object) ); |
| if(!object) |
| return E_OUTOFMEMORY; |
| |
| object->ref = 1; |
| object->IMFMediaEventQueue_iface.lpVtbl = &mfeventqueue_vtbl; |
| |
| *queue = &object->IMFMediaEventQueue_iface; |
| |
| return S_OK; |
| } |
| |
| typedef struct _mfdescriptor |
| { |
| IMFStreamDescriptor IMFStreamDescriptor_iface; |
| LONG ref; |
| } mfdescriptor; |
| |
| static inline mfdescriptor *impl_from_IMFStreamDescriptor(IMFStreamDescriptor *iface) |
| { |
| return CONTAINING_RECORD(iface, mfdescriptor, IMFStreamDescriptor_iface); |
| } |
| |
| static HRESULT WINAPI mfdescriptor_QueryInterface(IMFStreamDescriptor *iface, REFIID riid, void **out) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), out); |
| |
| if(IsEqualGUID(riid, &IID_IUnknown) || |
| IsEqualGUID(riid, &IID_IMFAttributes) || |
| IsEqualGUID(riid, &IID_IMFStreamDescriptor)) |
| { |
| *out = &This->IMFStreamDescriptor_iface; |
| } |
| else |
| { |
| FIXME("(%s, %p)\n", debugstr_guid(riid), out); |
| *out = NULL; |
| return E_NOINTERFACE; |
| } |
| |
| IUnknown_AddRef((IUnknown*)*out); |
| return S_OK; |
| } |
| |
| static ULONG WINAPI mfdescriptor_AddRef(IMFStreamDescriptor *iface) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| ULONG ref = InterlockedIncrement(&This->ref); |
| |
| TRACE("(%p) ref=%u\n", This, ref); |
| |
| return ref; |
| } |
| |
| static ULONG WINAPI mfdescriptor_Release(IMFStreamDescriptor *iface) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| ULONG ref = InterlockedDecrement(&This->ref); |
| |
| TRACE("(%p) ref=%u\n", This, ref); |
| |
| if (!ref) |
| { |
| HeapFree(GetProcessHeap(), 0, This); |
| } |
| |
| return ref; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetItem(IMFStreamDescriptor *iface, REFGUID key, PROPVARIANT *value) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetItemType(IMFStreamDescriptor *iface, REFGUID key, MF_ATTRIBUTE_TYPE *type) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), type); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_CompareItem(IMFStreamDescriptor *iface, REFGUID key, REFPROPVARIANT value, BOOL *result) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p, %p\n", This, debugstr_guid(key), value, result); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_Compare(IMFStreamDescriptor *iface, IMFAttributes *theirs, MF_ATTRIBUTES_MATCH_TYPE type, |
| BOOL *result) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %p, %d, %p\n", This, theirs, type, result); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetUINT32(IMFStreamDescriptor *iface, REFGUID key, UINT32 *value) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetUINT64(IMFStreamDescriptor *iface, REFGUID key, UINT64 *value) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetDouble(IMFStreamDescriptor *iface, REFGUID key, double *value) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetGUID(IMFStreamDescriptor *iface, REFGUID key, GUID *value) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetStringLength(IMFStreamDescriptor *iface, REFGUID key, UINT32 *length) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), length); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetString(IMFStreamDescriptor *iface, REFGUID key, WCHAR *value, |
| UINT32 size, UINT32 *length) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p, %d, %p\n", This, debugstr_guid(key), value, size, length); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetAllocatedString(IMFStreamDescriptor *iface, REFGUID key, |
| WCHAR **value, UINT32 *length) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p, %p\n", This, debugstr_guid(key), value, length); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetBlobSize(IMFStreamDescriptor *iface, REFGUID key, UINT32 *size) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetBlob(IMFStreamDescriptor *iface, REFGUID key, UINT8 *buf, |
| UINT32 bufsize, UINT32 *blobsize) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p, %d, %p\n", This, debugstr_guid(key), buf, bufsize, blobsize); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetAllocatedBlob(IMFStreamDescriptor *iface, REFGUID key, UINT8 **buf, UINT32 *size) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p, %p\n", This, debugstr_guid(key), buf, size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetUnknown(IMFStreamDescriptor *iface, REFGUID key, REFIID riid, void **ppv) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %s, %p\n", This, debugstr_guid(key), debugstr_guid(riid), ppv); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_SetItem(IMFStreamDescriptor *iface, REFGUID key, REFPROPVARIANT Value) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), Value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_DeleteItem(IMFStreamDescriptor *iface, REFGUID key) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s\n", This, debugstr_guid(key)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_DeleteAllItems(IMFStreamDescriptor *iface) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_SetUINT32(IMFStreamDescriptor *iface, REFGUID key, UINT32 value) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %d\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_SetUINT64(IMFStreamDescriptor *iface, REFGUID key, UINT64 value) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %s\n", This, debugstr_guid(key), wine_dbgstr_longlong(value)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_SetDouble(IMFStreamDescriptor *iface, REFGUID key, double value) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %f\n", This, debugstr_guid(key), value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_SetGUID(IMFStreamDescriptor *iface, REFGUID key, REFGUID value) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %s\n", This, debugstr_guid(key), debugstr_guid(value)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_SetString(IMFStreamDescriptor *iface, REFGUID key, const WCHAR *value) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %s\n", This, debugstr_guid(key), debugstr_w(value)); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_SetBlob(IMFStreamDescriptor *iface, REFGUID key, const UINT8 *buf, UINT32 size) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p, %d\n", This, debugstr_guid(key), buf, size); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_SetUnknown(IMFStreamDescriptor *iface, REFGUID key, IUnknown *unknown) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %s, %p\n", This, debugstr_guid(key), unknown); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_LockStore(IMFStreamDescriptor *iface) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_UnlockStore(IMFStreamDescriptor *iface) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p\n", This); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetCount(IMFStreamDescriptor *iface, UINT32 *items) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %p\n", This, items); |
| |
| if(items) |
| *items = 0; |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetItemByIndex(IMFStreamDescriptor *iface, UINT32 index, GUID *key, PROPVARIANT *value) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %d, %p, %p\n", This, index, key, value); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_CopyAllItems(IMFStreamDescriptor *iface, IMFAttributes *dest) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %p\n", This, dest); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetStreamIdentifier(IMFStreamDescriptor *iface, DWORD *identifier) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %p\n", This, identifier); |
| |
| return E_NOTIMPL; |
| } |
| |
| static HRESULT WINAPI mfdescriptor_GetMediaTypeHandler(IMFStreamDescriptor *iface, IMFMediaTypeHandler **handler) |
| { |
| mfdescriptor *This = impl_from_IMFStreamDescriptor(iface); |
| |
| FIXME("%p, %p\n", This, handler); |
| |
| return E_NOTIMPL; |
| } |
| |
| static const IMFStreamDescriptorVtbl mfdescriptor_vtbl = |
| { |
| mfdescriptor_QueryInterface, |
| mfdescriptor_AddRef, |
| mfdescriptor_Release, |
| mfdescriptor_GetItem, |
| mfdescriptor_GetItemType, |
| mfdescriptor_CompareItem, |
| mfdescriptor_Compare, |
| mfdescriptor_GetUINT32, |
| mfdescriptor_GetUINT64, |
| mfdescriptor_GetDouble, |
| mfdescriptor_GetGUID, |
| mfdescriptor_GetStringLength, |
| mfdescriptor_GetString, |
| mfdescriptor_GetAllocatedString, |
| mfdescriptor_GetBlobSize, |
| mfdescriptor_GetBlob, |
| mfdescriptor_GetAllocatedBlob, |
| mfdescriptor_GetUnknown, |
| mfdescriptor_SetItem, |
| mfdescriptor_DeleteItem, |
| mfdescriptor_DeleteAllItems, |
| mfdescriptor_SetUINT32, |
| mfdescriptor_SetUINT64, |
| mfdescriptor_SetDouble, |
| mfdescriptor_SetGUID, |
| mfdescriptor_SetString, |
| mfdescriptor_SetBlob, |
| mfdescriptor_SetUnknown, |
| mfdescriptor_LockStore, |
| mfdescriptor_UnlockStore, |
| mfdescriptor_GetCount, |
| mfdescriptor_GetItemByIndex, |
| mfdescriptor_CopyAllItems, |
| mfdescriptor_GetStreamIdentifier, |
| mfdescriptor_GetMediaTypeHandler |
| }; |
| |
| HRESULT WINAPI MFCreateStreamDescriptor(DWORD identifier, DWORD count, |
| IMFMediaType **types, IMFStreamDescriptor **descriptor) |
| { |
| mfdescriptor *object; |
| |
| TRACE("%d, %d, %p, %p\n", identifier, count, types, descriptor); |
| |
| object = HeapAlloc( GetProcessHeap(), 0, sizeof(*object) ); |
| if(!object) |
| return E_OUTOFMEMORY; |
| |
| object->ref = 1; |
| object->IMFStreamDescriptor_iface.lpVtbl = &mfdescriptor_vtbl; |
| |
| *descriptor = &object->IMFStreamDescriptor_iface; |
| return S_OK; |
| } |