From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/filtergraph.c | 32 -------------------------------- 1 file changed, 32 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index a441294b7d4..d151cdfde8e 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -1754,9 +1754,6 @@ static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface, LPCWSTR IFilterGraphImpl *This = impl_from_IFilterGraph2(iface); HRESULT hr; IBaseFilter* preader; - IFileSourceFilter* pfile = NULL; - AM_MEDIA_TYPE mt; - WCHAR* filename;
TRACE("(%p/%p)->(%s, %s, %p)\n", This, iface, debugstr_w(lpcwstrFileName), debugstr_w(lpcwstrFilterName), ppFilter);
@@ -1774,39 +1771,10 @@ static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface, LPCWSTR return hr; }
- hr = IBaseFilter_QueryInterface(preader, &IID_IFileSourceFilter, (LPVOID*)&pfile); - if (FAILED(hr)) { - WARN("Unable to get IFileSourceInterface (%x)\n", hr); - goto error; - } - - /* The file has been already loaded */ - hr = IFileSourceFilter_GetCurFile(pfile, &filename, &mt); - if (FAILED(hr)) { - WARN("GetCurFile (%x)\n", hr); - goto error; - } - - TRACE("File %s\n", debugstr_w(filename)); - TRACE("MajorType %s\n", debugstr_guid(&mt.majortype)); - TRACE("SubType %s\n", debugstr_guid(&mt.subtype)); - - CoTaskMemFree(filename); - FreeMediaType(&mt); - if (ppFilter) *ppFilter = preader; - IFileSourceFilter_Release(pfile);
return S_OK; - -error: - if (pfile) - IFileSourceFilter_Release(pfile); - IFilterGraph2_RemoveFilter(iface, preader); - IBaseFilter_Release(preader); - - return hr; }
static HRESULT WINAPI FilterGraph2_SetLogFile(IFilterGraph2 *iface, DWORD_PTR hFile)
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/filesource.c | 31 +++++++------------------------ dlls/quartz/filtergraph.c | 1 + 2 files changed, 8 insertions(+), 24 deletions(-)
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c index e66c3fadfaf..25c523b8374 100644 --- a/dlls/quartz/filesource.c +++ b/dlls/quartz/filesource.c @@ -191,8 +191,6 @@ static HRESULT process_pattern_string(LPCWSTR wszPatternString, IAsyncReader * p HRESULT hr = S_OK; ULONG strpos;
- TRACE("\t\tPattern string: %s\n", debugstr_w(wszPatternString)); - /* format: "offset, bytestocompare, mask, value" */
ulOffset = wcstol(wszPatternString, NULL, 10); @@ -281,8 +279,6 @@ HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID * BOOL bFound = FALSE; static const WCHAR wszMediaType[] = {'M','e','d','i','a',' ','T','y','p','e',0};
- TRACE("(%p, %s, %p, %p)\n", pReader, debugstr_w(pszFileName), majorType, minorType); - if(majorType) *majorType = GUID_NULL; if(minorType) @@ -308,7 +304,6 @@ HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID * break; if (RegOpenKeyExW(hkeyMediaType, wszMajorKeyName, 0, KEY_READ, &hkeyMajor) != ERROR_SUCCESS) break; - TRACE("%s\n", debugstr_w(wszMajorKeyName)); if (!wcscmp(wszExtensions, wszMajorKeyName)) { if (process_extensions(hkeyMajor, pszFileName, majorType, minorType, sourceFilter) == S_OK) @@ -335,8 +330,6 @@ HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID * if (RegOpenKeyExW(hkeyMajor, wszMinorKeyName, 0, KEY_READ, &hkeyMinor) != ERROR_SUCCESS) break;
- TRACE("\t%s\n", debugstr_w(wszMinorKeyName)); - if (RegQueryInfoKeyW(hkeyMinor, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &maxValueLen, NULL, NULL) != ERROR_SUCCESS) break;
@@ -387,22 +380,7 @@ HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID * } CloseHandle(hkeyMediaType);
- if (SUCCEEDED(hr) && !bFound) - { - ERR("Media class not found\n"); - hr = E_FAIL; - } - else if (bFound) - { - TRACE("Found file's class:\n"); - if(majorType) - TRACE("\tmajor = %s\n", qzdebugstr_guid(majorType)); - if(minorType) - TRACE("\tsubtype = %s\n", qzdebugstr_guid(minorType)); - if(sourceFilter) - TRACE("\tsource filter = %s\n", qzdebugstr_guid(sourceFilter)); - } - + if (hr == S_OK && !bFound) hr = E_FAIL; return hr; }
@@ -581,7 +559,12 @@ static HRESULT WINAPI FileSource_Load(IFileSourceFilter * iface, LPCOLESTR pszFi if (!pmt) { CopyMediaType(This->pmt, &default_mt); - if (FAILED(GetClassMediaFile(&This->IAsyncReader_iface, pszFileName, &This->pmt->majortype, &This->pmt->subtype, NULL))) + if (SUCCEEDED(GetClassMediaFile(&This->IAsyncReader_iface, pszFileName, &This->pmt->majortype, &This->pmt->subtype, NULL))) + { + TRACE("Found major type %s, subtype %s.\n", + debugstr_guid(&This->pmt->majortype), debugstr_guid(&This->pmt->subtype)); + } + else { This->pmt->majortype = MEDIATYPE_Stream; This->pmt->subtype = MEDIASUBTYPE_NULL; diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index d151cdfde8e..c52f0caabd0 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -1739,6 +1739,7 @@ static HRESULT GetFileSourceFilter(LPCOLESTR pszFileName, IBaseFilter **filter)
if (hr == S_OK) { + TRACE("Found source filter %s.\n", debugstr_guid(&clsid)); /* Release the AsyncReader filter and create the matching one */ IBaseFilter_Release(*filter); return CreateFilterInstanceAndLoadFile(&clsid, pszFileName, filter);
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/filesource.c | 88 +++++++++++++--------------------------- 1 file changed, 29 insertions(+), 59 deletions(-)
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c index 25c523b8374..bc4b5f27c8d 100644 --- a/dlls/quartz/filesource.c +++ b/dlls/quartz/filesource.c @@ -102,58 +102,6 @@ static const WCHAR subtype_name[] = { static const WCHAR source_filter_name[] = { 'S','o','u','r','c','e',' ','F','i','l','t','e','r',0};
-static HRESULT process_extensions(HKEY hkeyExtensions, LPCOLESTR pszFileName, GUID * majorType, GUID * minorType, GUID * sourceFilter) -{ - WCHAR *extension; - LONG l; - HKEY hsub; - WCHAR keying[39]; - DWORD size; - - if (!pszFileName) - return E_POINTER; - - /* Get the part of the name that matters */ - if (!(extension = wcsrchr(pszFileName, '.'))) - return E_FAIL; - - l = RegOpenKeyExW(hkeyExtensions, extension, 0, KEY_READ, &hsub); - if (l) - return E_FAIL; - - if (majorType) - { - size = sizeof(keying); - l = RegQueryValueExW(hsub, mediatype_name, NULL, NULL, (LPBYTE)keying, &size); - if (!l) - CLSIDFromString(keying, majorType); - } - - if (minorType) - { - size = sizeof(keying); - if (!l) - l = RegQueryValueExW(hsub, subtype_name, NULL, NULL, (LPBYTE)keying, &size); - if (!l) - CLSIDFromString(keying, minorType); - } - - if (sourceFilter) - { - size = sizeof(keying); - if (!l) - l = RegQueryValueExW(hsub, source_filter_name, NULL, NULL, (LPBYTE)keying, &size); - if (!l) - CLSIDFromString(keying, sourceFilter); - } - - RegCloseKey(hsub); - - if (!l) - return S_OK; - return E_FAIL; -} - static unsigned char byte_from_hex_char(WCHAR wHex) { switch (towlower(wHex)) @@ -278,6 +226,9 @@ HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID * HRESULT hr = S_OK; BOOL bFound = FALSE; static const WCHAR wszMediaType[] = {'M','e','d','i','a',' ','T','y','p','e',0}; + WCHAR extensions_path[278] = {'M','e','d','i','a',' ','T','y','p','e','\','E','x','t','e','n','s','i','o','n','s','\',0}; + const WCHAR *ext; + DWORD size;
if(majorType) *majorType = GUID_NULL; @@ -286,6 +237,31 @@ HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID * if(sourceFilter) *sourceFilter = GUID_NULL;
+ if ((ext = wcsrchr(pszFileName, '.'))) + { + WCHAR guidstr[39]; + HKEY key; + + wcscat(extensions_path, ext); + if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, extensions_path, 0, KEY_READ, &key)) + { + size = sizeof(guidstr); + if (majorType && !RegQueryValueExW(key, mediatype_name, NULL, NULL, (BYTE *)guidstr, &size)) + CLSIDFromString(guidstr, majorType); + + size = sizeof(guidstr); + if (minorType && !RegQueryValueExW(key, subtype_name, NULL, NULL, (BYTE *)guidstr, &size)) + CLSIDFromString(guidstr, minorType); + + size = sizeof(guidstr); + if (sourceFilter && !RegQueryValueExW(key, source_filter_name, NULL, NULL, (BYTE *)guidstr, &size)) + CLSIDFromString(guidstr, sourceFilter); + + RegCloseKey(key); + return S_OK; + } + } + lRet = RegOpenKeyExW(HKEY_CLASSES_ROOT, wszMediaType, 0, KEY_READ, &hkeyMediaType); hr = HRESULT_FROM_WIN32(lRet);
@@ -304,13 +280,7 @@ HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID * break; if (RegOpenKeyExW(hkeyMediaType, wszMajorKeyName, 0, KEY_READ, &hkeyMajor) != ERROR_SUCCESS) break; - if (!wcscmp(wszExtensions, wszMajorKeyName)) - { - if (process_extensions(hkeyMajor, pszFileName, majorType, minorType, sourceFilter) == S_OK) - bFound = TRUE; - } - /* We need a reader interface to check bytes */ - else if (pReader) + if (wcscmp(wszExtensions, wszMajorKeyName) && pReader) { DWORD indexMinor;
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/filesource.c | 187 ++++++++++++++++------------------- dlls/quartz/filtergraph.c | 9 +- dlls/quartz/quartz_private.h | 2 +- 3 files changed, 88 insertions(+), 110 deletions(-)
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c index bc4b5f27c8d..d547c12c9a7 100644 --- a/dlls/quartz/filesource.c +++ b/dlls/quartz/filesource.c @@ -219,25 +219,17 @@ static HRESULT process_pattern_string(LPCWSTR wszPatternString, IAsyncReader * p return hr; }
-HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID * majorType, GUID * minorType, GUID * sourceFilter) +BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype, + GUID *subtype, GUID *source_clsid) { - HKEY hkeyMediaType = NULL; - LONG lRet; - HRESULT hr = S_OK; - BOOL bFound = FALSE; - static const WCHAR wszMediaType[] = {'M','e','d','i','a',' ','T','y','p','e',0}; WCHAR extensions_path[278] = {'M','e','d','i','a',' ','T','y','p','e','\','E','x','t','e','n','s','i','o','n','s','\',0}; + static const WCHAR wszExtensions[] = {'E','x','t','e','n','s','i','o','n','s',0}; + static const WCHAR wszMediaType[] = {'M','e','d','i','a',' ','T','y','p','e',0}; + DWORD majortype_idx, size; const WCHAR *ext; - DWORD size; + HKEY parent_key;
- if(majorType) - *majorType = GUID_NULL; - if(minorType) - *minorType = GUID_NULL; - if(sourceFilter) - *sourceFilter = GUID_NULL; - - if ((ext = wcsrchr(pszFileName, '.'))) + if ((ext = wcsrchr(filename, '.'))) { WCHAR guidstr[39]; HKEY key; @@ -246,112 +238,104 @@ HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID * if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, extensions_path, 0, KEY_READ, &key)) { size = sizeof(guidstr); - if (majorType && !RegQueryValueExW(key, mediatype_name, NULL, NULL, (BYTE *)guidstr, &size)) - CLSIDFromString(guidstr, majorType); + if (majortype && !RegQueryValueExW(key, mediatype_name, NULL, NULL, (BYTE *)guidstr, &size)) + CLSIDFromString(guidstr, majortype);
size = sizeof(guidstr); - if (minorType && !RegQueryValueExW(key, subtype_name, NULL, NULL, (BYTE *)guidstr, &size)) - CLSIDFromString(guidstr, minorType); + if (subtype && !RegQueryValueExW(key, subtype_name, NULL, NULL, (BYTE *)guidstr, &size)) + CLSIDFromString(guidstr, subtype);
size = sizeof(guidstr); - if (sourceFilter && !RegQueryValueExW(key, source_filter_name, NULL, NULL, (BYTE *)guidstr, &size)) - CLSIDFromString(guidstr, sourceFilter); + if (source_clsid && !RegQueryValueExW(key, source_filter_name, NULL, NULL, (BYTE *)guidstr, &size)) + CLSIDFromString(guidstr, source_clsid);
RegCloseKey(key); - return S_OK; + return FALSE; } }
- lRet = RegOpenKeyExW(HKEY_CLASSES_ROOT, wszMediaType, 0, KEY_READ, &hkeyMediaType); - hr = HRESULT_FROM_WIN32(lRet); + if (!reader) + return FALSE;
- if (SUCCEEDED(hr)) + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszMediaType, 0, KEY_READ, &parent_key)) + return FALSE; + + for (majortype_idx = 0; ; ++majortype_idx) { - DWORD indexMajor; + WCHAR majortype_str[39]; + HKEY majortype_key; + DWORD subtype_idx;
- for (indexMajor = 0; !bFound; indexMajor++) + size = ARRAY_SIZE(majortype_str); + if (RegEnumKeyExW(parent_key, majortype_idx, majortype_str, &size, NULL, NULL, NULL, NULL)) + break; + + if (!wcscmp(majortype_str, wszExtensions)) + continue; + + if (RegOpenKeyExW(parent_key, majortype_str, 0, KEY_READ, &majortype_key)) + continue; + + for (subtype_idx = 0; ; ++subtype_idx) { - HKEY hkeyMajor; - WCHAR wszMajorKeyName[CHARS_IN_GUID]; - DWORD dwKeyNameLength = ARRAY_SIZE(wszMajorKeyName); - static const WCHAR wszExtensions[] = {'E','x','t','e','n','s','i','o','n','s',0}; + WCHAR subtype_str[39], *pattern; + DWORD value_idx, max_size; + HKEY subtype_key;
- if (RegEnumKeyExW(hkeyMediaType, indexMajor, wszMajorKeyName, &dwKeyNameLength, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) + size = ARRAY_SIZE(subtype_str); + if (RegEnumKeyExW(majortype_key, subtype_idx, subtype_str, &size, NULL, NULL, NULL, NULL)) break; - if (RegOpenKeyExW(hkeyMediaType, wszMajorKeyName, 0, KEY_READ, &hkeyMajor) != ERROR_SUCCESS) - break; - if (wcscmp(wszExtensions, wszMajorKeyName) && pReader) + + if (RegOpenKeyExW(majortype_key, subtype_str, 0, KEY_READ, &subtype_key)) + continue; + + if (RegQueryInfoKeyW(subtype_key, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &max_size, NULL, NULL)) + continue; + + pattern = heap_alloc(max_size); + + for (value_idx = 0; ; ++value_idx) { - DWORD indexMinor; + /* The longest name we should encounter is "Source Filter". */ + WCHAR value_name[14], source_clsid_str[39]; + DWORD value_len = ARRAY_SIZE(value_name);
- for (indexMinor = 0; !bFound; indexMinor++) - { - HKEY hkeyMinor; - WCHAR wszMinorKeyName[CHARS_IN_GUID]; - DWORD dwMinorKeyNameLen = ARRAY_SIZE(wszMinorKeyName); - WCHAR wszSourceFilterKeyName[CHARS_IN_GUID]; - DWORD dwSourceFilterKeyNameLen = sizeof(wszSourceFilterKeyName); - DWORD maxValueLen; - DWORD indexValue; + size = max_size; + if (RegEnumValueW(subtype_key, value_idx, value_name, &value_len, + NULL, NULL, (BYTE *)pattern, &max_size)) + break;
- if (RegEnumKeyExW(hkeyMajor, indexMinor, wszMinorKeyName, &dwMinorKeyNameLen, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) - break; + if (!wcscmp(value_name, source_filter_name)) + continue;
- if (RegOpenKeyExW(hkeyMajor, wszMinorKeyName, 0, KEY_READ, &hkeyMinor) != ERROR_SUCCESS) - break; + if (process_pattern_string(pattern, reader) != S_OK) + continue;
- if (RegQueryInfoKeyW(hkeyMinor, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &maxValueLen, NULL, NULL) != ERROR_SUCCESS) - break; + if (majortype) + CLSIDFromString(majortype_str, majortype); + if (subtype) + CLSIDFromString(subtype_str, subtype); + size = sizeof(source_clsid_str); + if (source_clsid && !RegQueryValueExW(subtype_key, source_filter_name, + NULL, NULL, (BYTE *)source_clsid_str, &size)) + CLSIDFromString(source_clsid_str, source_clsid);
- for (indexValue = 0; !bFound; indexValue++) - { - DWORD dwType; - WCHAR wszValueName[14]; /* longest name we should encounter will be "Source Filter" */ - LPWSTR wszPatternString = HeapAlloc(GetProcessHeap(), 0, maxValueLen); - DWORD dwValueNameLen = ARRAY_SIZE(wszValueName); - DWORD dwDataLen = maxValueLen; /* remember this is in bytes */ - - if (RegEnumValueW(hkeyMinor, indexValue, wszValueName, &dwValueNameLen, NULL, &dwType, (LPBYTE)wszPatternString, &dwDataLen) != ERROR_SUCCESS) - { - HeapFree(GetProcessHeap(), 0, wszPatternString); - break; - } - - if (wcscmp(wszValueName, source_filter_name)==0) { - HeapFree(GetProcessHeap(), 0, wszPatternString); - continue; - } - - /* if it is not the source filter value */ - if (process_pattern_string(wszPatternString, pReader) == S_OK) - { - HeapFree(GetProcessHeap(), 0, wszPatternString); - if (majorType && FAILED(CLSIDFromString(wszMajorKeyName, majorType))) - break; - if (minorType && FAILED(CLSIDFromString(wszMinorKeyName, minorType))) - break; - if (sourceFilter) - { - /* Look up the source filter key */ - if (RegQueryValueExW(hkeyMinor, source_filter_name, NULL, NULL, (LPBYTE)wszSourceFilterKeyName, &dwSourceFilterKeyNameLen)) - break; - if (FAILED(CLSIDFromString(wszSourceFilterKeyName, sourceFilter))) - break; - } - bFound = TRUE; - } else - HeapFree(GetProcessHeap(), 0, wszPatternString); - } - CloseHandle(hkeyMinor); - } + heap_free(pattern); + RegCloseKey(subtype_key); + RegCloseKey(majortype_key); + RegCloseKey(parent_key); + return TRUE; } - CloseHandle(hkeyMajor); - } - } - CloseHandle(hkeyMediaType);
- if (hr == S_OK && !bFound) hr = E_FAIL; - return hr; + heap_free(pattern); + RegCloseKey(subtype_key); + } + + RegCloseKey(majortype_key); + } + + RegCloseKey(parent_key); + return FALSE; }
static IPin *async_reader_get_pin(BaseFilter *iface, unsigned int index) @@ -529,16 +513,11 @@ static HRESULT WINAPI FileSource_Load(IFileSourceFilter * iface, LPCOLESTR pszFi if (!pmt) { CopyMediaType(This->pmt, &default_mt); - if (SUCCEEDED(GetClassMediaFile(&This->IAsyncReader_iface, pszFileName, &This->pmt->majortype, &This->pmt->subtype, NULL))) + if (get_media_type(&This->IAsyncReader_iface, pszFileName, &This->pmt->majortype, &This->pmt->subtype, NULL)) { TRACE("Found major type %s, subtype %s.\n", debugstr_guid(&This->pmt->majortype), debugstr_guid(&This->pmt->subtype)); } - else - { - This->pmt->majortype = MEDIATYPE_Stream; - This->pmt->subtype = MEDIASUBTYPE_NULL; - } } else CopyMediaType(This->pmt, pmt); diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index c52f0caabd0..681ebad5010 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -1691,11 +1691,10 @@ static HRESULT GetFileSourceFilter(LPCOLESTR pszFileName, IBaseFilter **filter) IFileSourceFilter* pSource = NULL; IPin * pOutputPin = NULL; static const WCHAR wszOutputPinName[] = { 'O','u','t','p','u','t',0 }; + BOOL ret;
/* Try to find a match without reading the file first */ - hr = GetClassMediaFile(NULL, pszFileName, NULL, NULL, &clsid); - - if (hr == S_OK) + if (get_media_type(NULL, pszFileName, NULL, NULL, &clsid)) return CreateFilterInstanceAndLoadFile(&clsid, pszFileName, filter);
/* Now create a AyncReader instance, to check for signature bytes in the file */ @@ -1734,10 +1733,10 @@ static HRESULT GetFileSourceFilter(LPCOLESTR pszFileName, IBaseFilter **filter) }
/* Try again find a match */ - hr = GetClassMediaFile(pReader, pszFileName, NULL, NULL, &clsid); + ret = get_media_type(pReader, pszFileName, NULL, NULL, &clsid); IAsyncReader_Release(pReader);
- if (hr == S_OK) + if (ret) { TRACE("Found source filter %s.\n", debugstr_guid(&clsid)); /* Release the AsyncReader filter and create the matching one */ diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h index a5157b12565..92af2312e67 100644 --- a/dlls/quartz/quartz_private.h +++ b/dlls/quartz/quartz_private.h @@ -77,6 +77,6 @@ extern void video_unregister_windowclass(void) DECLSPEC_HIDDEN; BOOL CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2, BOOL bWildcards); void dump_AM_MEDIA_TYPE(const AM_MEDIA_TYPE * pmt) DECLSPEC_HIDDEN;
-HRESULT GetClassMediaFile(IAsyncReader * pReader, LPCOLESTR pszFileName, GUID * majorType, GUID * minorType, GUID * sourceFilter); +BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype, GUID *subtype, GUID *source_clsid) DECLSPEC_HIDDEN;
#endif /* __QUARTZ_PRIVATE_INCLUDED__ */
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/filesource.c | 130 ++++++++++++++++++--------------------- 1 file changed, 60 insertions(+), 70 deletions(-)
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c index d547c12c9a7..c87f181679f 100644 --- a/dlls/quartz/filesource.c +++ b/dlls/quartz/filesource.c @@ -129,94 +129,84 @@ static unsigned char byte_from_hex_char(WCHAR wHex) } }
-static HRESULT process_pattern_string(LPCWSTR wszPatternString, IAsyncReader * pReader) +static BOOL process_pattern_string(const WCHAR *pattern, IAsyncReader *reader) { - ULONG ulOffset; - ULONG ulBytes; - BYTE * pbMask; - BYTE * pbValue; - BYTE * pbFile; - HRESULT hr = S_OK; - ULONG strpos; + BYTE *mask, *expect, *actual; + ULONG size, offset, i; + BOOL ret = TRUE;
- /* format: "offset, bytestocompare, mask, value" */ + /* format: "offset, size, mask, value" */
- ulOffset = wcstol(wszPatternString, NULL, 10); + offset = wcstol(pattern, NULL, 10);
- if (!(wszPatternString = wcschr(wszPatternString, ','))) - return E_INVALIDARG; + if (!(pattern = wcschr(pattern, ','))) + return FALSE; + pattern++;
- wszPatternString++; /* skip ',' */ + size = wcstol(pattern, NULL, 10); + mask = heap_alloc(size); + expect = heap_alloc(size); + memset(mask, 0xff, size);
- ulBytes = wcstol(wszPatternString, NULL, 10); + if (!(pattern = wcschr(pattern, ','))) + return FALSE; + pattern++; + while (!iswxdigit(*pattern) && (*pattern != ',')) + pattern++;
- pbMask = HeapAlloc(GetProcessHeap(), 0, ulBytes); - pbValue = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ulBytes); - pbFile = HeapAlloc(GetProcessHeap(), 0, ulBytes); - - /* default mask is match everything */ - memset(pbMask, 0xFF, ulBytes); - - if (!(wszPatternString = wcschr(wszPatternString, ','))) - hr = E_INVALIDARG; - - if (hr == S_OK) + for (i = 0; iswxdigit(*pattern) && (i/2 < size); pattern++, i++) { - wszPatternString++; /* skip ',' */ - while (!iswxdigit(*wszPatternString) && (*wszPatternString != ',')) wszPatternString++; - - for (strpos = 0; iswxdigit(*wszPatternString) && (strpos/2 < ulBytes); wszPatternString++, strpos++) - { - if ((strpos % 2) == 1) /* odd numbered position */ - pbMask[strpos / 2] |= byte_from_hex_char(*wszPatternString); - else - pbMask[strpos / 2] = byte_from_hex_char(*wszPatternString) << 4; - } - - if (!(wszPatternString = wcschr(wszPatternString, ','))) - hr = E_INVALIDARG; + if (i % 2) + mask[i / 2] |= byte_from_hex_char(*pattern); else - wszPatternString++; /* skip ',' */ + mask[i / 2] = byte_from_hex_char(*pattern) << 4; }
- if (hr == S_OK) + if (!(pattern = wcschr(pattern, ','))) { - for ( ; !iswxdigit(*wszPatternString) && (*wszPatternString != ','); wszPatternString++) - ; + heap_free(mask); + heap_free(expect); + return FALSE; + } + pattern++; + while (!iswxdigit(*pattern) && (*pattern != ',')) + pattern++;
- for (strpos = 0; iswxdigit(*wszPatternString) && (strpos/2 < ulBytes); wszPatternString++, strpos++) + for (i = 0; iswxdigit(*pattern) && (i/2 < size); pattern++, i++) + { + if (i % 2) + expect[i / 2] |= byte_from_hex_char(*pattern); + else + expect[i / 2] = byte_from_hex_char(*pattern) << 4; + } + + actual = heap_alloc(size); + if (FAILED(IAsyncReader_SyncRead(reader, offset, size, actual))) + { + heap_free(actual); + heap_free(expect); + heap_free(mask); + return FALSE; + } + + for (i = 0; i < size; ++i) + { + if ((actual[i] & mask[i]) != expect[i]) { - if ((strpos % 2) == 1) /* odd numbered position */ - pbValue[strpos / 2] |= byte_from_hex_char(*wszPatternString); - else - pbValue[strpos / 2] = byte_from_hex_char(*wszPatternString) << 4; + ret = FALSE; + break; } }
- if (hr == S_OK) - hr = IAsyncReader_SyncRead(pReader, ulOffset, ulBytes, pbFile); + heap_free(actual); + heap_free(expect); + heap_free(mask);
- if (hr == S_OK) - { - ULONG i; - for (i = 0; i < ulBytes; i++) - if ((pbFile[i] & pbMask[i]) != pbValue[i]) - { - hr = S_FALSE; - break; - } - } + /* If there is a following tuple, then we must match that as well. */ + if (ret && (pattern = wcschr(pattern, ','))) + return process_pattern_string(pattern + 1, reader);
- HeapFree(GetProcessHeap(), 0, pbMask); - HeapFree(GetProcessHeap(), 0, pbValue); - HeapFree(GetProcessHeap(), 0, pbFile); - - /* if we encountered no errors with this string, and there is a following tuple, then we - * have to match that as well to succeed */ - if ((hr == S_OK) && (wszPatternString = wcschr(wszPatternString, ','))) - return process_pattern_string(wszPatternString + 1, pReader); - else - return hr; + return TRUE; }
BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype, @@ -308,7 +298,7 @@ BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype if (!wcscmp(value_name, source_filter_name)) continue;
- if (process_pattern_string(pattern, reader) != S_OK) + if (!process_pattern_string(pattern, reader)) continue;
if (majortype)
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=55212
Your paranoid android.
=== debian10 (32 bit report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb87-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:avisplit crashed (c0000005) quartz:waveparser crashed (c0000005)
=== debian10 (32 bit Chinese:China report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb87-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:avisplit crashed (c0000005) quartz:waveparser crashed (c0000005)
=== debian10 (32 bit WoW report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. avisplit: Timeout filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb87-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:waveparser crashed (c0000005)
=== debian10 (64 bit WoW report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. avisplit: Timeout filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb87-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:waveparser crashed (c0000005)
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/filesource.c | 28 +++++++++++----- dlls/quartz/filtergraph.c | 65 +++--------------------------------- dlls/quartz/quartz_private.h | 2 +- 3 files changed, 24 insertions(+), 71 deletions(-)
diff --git a/dlls/quartz/filesource.c b/dlls/quartz/filesource.c index c87f181679f..47116a4d53a 100644 --- a/dlls/quartz/filesource.c +++ b/dlls/quartz/filesource.c @@ -129,10 +129,10 @@ static unsigned char byte_from_hex_char(WCHAR wHex) } }
-static BOOL process_pattern_string(const WCHAR *pattern, IAsyncReader *reader) +static BOOL process_pattern_string(const WCHAR *pattern, HANDLE file) { + ULONG size, offset, i, ret_size; BYTE *mask, *expect, *actual; - ULONG size, offset, i; BOOL ret = TRUE;
/* format: "offset, size, mask, value" */ @@ -181,7 +181,8 @@ static BOOL process_pattern_string(const WCHAR *pattern, IAsyncReader *reader) }
actual = heap_alloc(size); - if (FAILED(IAsyncReader_SyncRead(reader, offset, size, actual))) + SetFilePointer(file, offset, NULL, FILE_BEGIN); + if (!ReadFile(file, actual, size, &ret_size, NULL) || ret_size != size) { heap_free(actual); heap_free(expect); @@ -204,13 +205,12 @@ static BOOL process_pattern_string(const WCHAR *pattern, IAsyncReader *reader)
/* If there is a following tuple, then we must match that as well. */ if (ret && (pattern = wcschr(pattern, ','))) - return process_pattern_string(pattern + 1, reader); + return process_pattern_string(pattern + 1, file);
return TRUE; }
-BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype, - GUID *subtype, GUID *source_clsid) +BOOL get_media_type(const WCHAR *filename, GUID *majortype, GUID *subtype, GUID *source_clsid) { WCHAR extensions_path[278] = {'M','e','d','i','a',' ','T','y','p','e','\','E','x','t','e','n','s','i','o','n','s','\',0}; static const WCHAR wszExtensions[] = {'E','x','t','e','n','s','i','o','n','s',0}; @@ -218,6 +218,7 @@ BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype DWORD majortype_idx, size; const WCHAR *ext; HKEY parent_key; + HANDLE file;
if ((ext = wcsrchr(filename, '.'))) { @@ -244,11 +245,18 @@ BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype } }
- if (!reader) + if ((file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) + { + WARN("Failed to open file %s, error %u.\n", debugstr_w(filename), GetLastError()); return FALSE; + }
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszMediaType, 0, KEY_READ, &parent_key)) + { + CloseHandle(file); return FALSE; + }
for (majortype_idx = 0; ; ++majortype_idx) { @@ -298,7 +306,7 @@ BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype if (!wcscmp(value_name, source_filter_name)) continue;
- if (!process_pattern_string(pattern, reader)) + if (!process_pattern_string(pattern, file)) continue;
if (majortype) @@ -314,6 +322,7 @@ BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype RegCloseKey(subtype_key); RegCloseKey(majortype_key); RegCloseKey(parent_key); + CloseHandle(file); return TRUE; }
@@ -325,6 +334,7 @@ BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype }
RegCloseKey(parent_key); + CloseHandle(file); return FALSE; }
@@ -503,7 +513,7 @@ static HRESULT WINAPI FileSource_Load(IFileSourceFilter * iface, LPCOLESTR pszFi if (!pmt) { CopyMediaType(This->pmt, &default_mt); - if (get_media_type(&This->IAsyncReader_iface, pszFileName, &This->pmt->majortype, &This->pmt->subtype, NULL)) + if (get_media_type(pszFileName, &This->pmt->majortype, &This->pmt->subtype, NULL)) { TRACE("Found major type %s, subtype %s.\n", debugstr_guid(&This->pmt->majortype), debugstr_guid(&This->pmt->subtype)); diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index 681ebad5010..7fd3d833ec8 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -1683,69 +1683,12 @@ static HRESULT CreateFilterInstanceAndLoadFile(GUID* clsid, LPCOLESTR pszFileNam }
/* Some filters implement their own asynchronous reader (Theoretically they all should, try to load it first */ -static HRESULT GetFileSourceFilter(LPCOLESTR pszFileName, IBaseFilter **filter) +static HRESULT GetFileSourceFilter(const WCHAR *filename, IBaseFilter **filter) { - HRESULT hr; GUID clsid; - IAsyncReader * pReader = NULL; - IFileSourceFilter* pSource = NULL; - IPin * pOutputPin = NULL; - static const WCHAR wszOutputPinName[] = { 'O','u','t','p','u','t',0 }; - BOOL ret; - - /* Try to find a match without reading the file first */ - if (get_media_type(NULL, pszFileName, NULL, NULL, &clsid)) - return CreateFilterInstanceAndLoadFile(&clsid, pszFileName, filter); - - /* Now create a AyncReader instance, to check for signature bytes in the file */ - hr = CoCreateInstance(&CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)filter); - if (FAILED(hr)) - return hr; - - hr = IBaseFilter_QueryInterface(*filter, &IID_IFileSourceFilter, (LPVOID *)&pSource); - if (FAILED(hr)) - { - IBaseFilter_Release(*filter); - return hr; - } - - hr = IFileSourceFilter_Load(pSource, pszFileName, NULL); - IFileSourceFilter_Release(pSource); - if (FAILED(hr)) - { - IBaseFilter_Release(*filter); - return hr; - } - - hr = IBaseFilter_FindPin(*filter, wszOutputPinName, &pOutputPin); - if (FAILED(hr)) - { - IBaseFilter_Release(*filter); - return hr; - } - - hr = IPin_QueryInterface(pOutputPin, &IID_IAsyncReader, (LPVOID *)&pReader); - IPin_Release(pOutputPin); - if (FAILED(hr)) - { - IBaseFilter_Release(*filter); - return hr; - } - - /* Try again find a match */ - ret = get_media_type(pReader, pszFileName, NULL, NULL, &clsid); - IAsyncReader_Release(pReader); - - if (ret) - { - TRACE("Found source filter %s.\n", debugstr_guid(&clsid)); - /* Release the AsyncReader filter and create the matching one */ - IBaseFilter_Release(*filter); - return CreateFilterInstanceAndLoadFile(&clsid, pszFileName, filter); - } - - /* Return the AsyncReader filter */ - return S_OK; + if (!get_media_type(filename, NULL, NULL, &clsid)) + clsid = CLSID_AsyncReader; + return CreateFilterInstanceAndLoadFile(&clsid, filename, filter); }
static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface, LPCWSTR lpcwstrFileName, diff --git a/dlls/quartz/quartz_private.h b/dlls/quartz/quartz_private.h index 92af2312e67..874b29f2b12 100644 --- a/dlls/quartz/quartz_private.h +++ b/dlls/quartz/quartz_private.h @@ -77,6 +77,6 @@ extern void video_unregister_windowclass(void) DECLSPEC_HIDDEN; BOOL CompareMediaTypes(const AM_MEDIA_TYPE * pmt1, const AM_MEDIA_TYPE * pmt2, BOOL bWildcards); void dump_AM_MEDIA_TYPE(const AM_MEDIA_TYPE * pmt) DECLSPEC_HIDDEN;
-BOOL get_media_type(IAsyncReader *reader, const WCHAR *filename, GUID *majortype, GUID *subtype, GUID *source_clsid) DECLSPEC_HIDDEN; +BOOL get_media_type(const WCHAR *filename, GUID *majortype, GUID *subtype, GUID *source_clsid) DECLSPEC_HIDDEN;
#endif /* __QUARTZ_PRIVATE_INCLUDED__ */
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=55213
Your paranoid android.
=== debian10 (32 bit report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:avisplit crashed (c0000005) quartz:waveparser crashed (c0000005)
=== debian10 (32 bit Chinese:China report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:avisplit crashed (c0000005) quartz:waveparser crashed (c0000005)
=== debian10 (32 bit WoW report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. avisplit: Timeout filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:waveparser crashed (c0000005)
=== debian10 (64 bit WoW report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. avisplit: Timeout filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:waveparser crashed (c0000005)
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/filtergraph.c | 84 ++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 50 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index 7fd3d833ec8..f947327aaad 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -1655,68 +1655,52 @@ static HRESULT WINAPI FilterGraph2_RenderFile(IFilterGraph2 *iface, LPCWSTR lpcw return hr; }
-static HRESULT CreateFilterInstanceAndLoadFile(GUID* clsid, LPCOLESTR pszFileName, IBaseFilter **filter) -{ - IFileSourceFilter *source = NULL; - HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)filter); - TRACE("CLSID: %s\n", debugstr_guid(clsid)); - if (FAILED(hr)) - return hr; - - hr = IBaseFilter_QueryInterface(*filter, &IID_IFileSourceFilter, (LPVOID*)&source); - if (FAILED(hr)) - { - IBaseFilter_Release(*filter); - return hr; - } - - /* Load the file in the file source filter */ - hr = IFileSourceFilter_Load(source, pszFileName, NULL); - IFileSourceFilter_Release(source); - if (FAILED(hr)) { - WARN("Load (%x)\n", hr); - IBaseFilter_Release(*filter); - return hr; - } - - return hr; -} - -/* Some filters implement their own asynchronous reader (Theoretically they all should, try to load it first */ -static HRESULT GetFileSourceFilter(const WCHAR *filename, IBaseFilter **filter) +static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface, + const WCHAR *filename, const WCHAR *filter_name, IBaseFilter **ret_filter) { + IFilterGraphImpl *graph = impl_from_IFilterGraph2(iface); + IFileSourceFilter *filesource; + IBaseFilter *filter; + HRESULT hr; GUID clsid; + + TRACE("graph %p, filename %s, filter_name %s, ret_filter %p.\n", + graph, debugstr_w(filename), debugstr_w(filter_name), ret_filter); + if (!get_media_type(filename, NULL, NULL, &clsid)) clsid = CLSID_AsyncReader; - return CreateFilterInstanceAndLoadFile(&clsid, filename, filter); -} + TRACE("Using source filter %s.\n", debugstr_guid(&clsid));
-static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface, LPCWSTR lpcwstrFileName, - LPCWSTR lpcwstrFilterName, IBaseFilter **ppFilter) -{ - IFilterGraphImpl *This = impl_from_IFilterGraph2(iface); - HRESULT hr; - IBaseFilter* preader; - - TRACE("(%p/%p)->(%s, %s, %p)\n", This, iface, debugstr_w(lpcwstrFileName), debugstr_w(lpcwstrFilterName), ppFilter); - - /* Try from file name first, then fall back to default asynchronous reader */ - hr = GetFileSourceFilter(lpcwstrFileName, &preader); - if (FAILED(hr)) { - WARN("Unable to create file source filter (%x)\n", hr); + if (FAILED(hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, + &IID_IBaseFilter, (void **)&filter))) + { + WARN("Failed to create filter, hr %#x.\n", hr); return hr; }
- hr = IFilterGraph2_AddFilter(iface, preader, lpcwstrFilterName); - if (FAILED(hr)) { - WARN("Unable add filter (%x)\n", hr); - IBaseFilter_Release(preader); + if (FAILED(hr = IBaseFilter_QueryInterface(filter, &IID_IFileSourceFilter, (void **)&filesource))) + { + WARN("Failed to get IFileSourceFilter, hr %#x.\n", hr); + IBaseFilter_Release(filter); return hr; }
- if (ppFilter) - *ppFilter = preader; + hr = IFileSourceFilter_Load(filesource, filename, NULL); + IFileSourceFilter_Release(filesource); + if (FAILED(hr)) + { + WARN("Failed to load file, hr %#x.\n", hr); + return hr; + }
+ if (FAILED(hr = IFilterGraph2_AddFilter(iface, filter, filter_name))) + { + IBaseFilter_Release(filter); + return hr; + } + + if (ret_filter) + *ret_filter = filter; return S_OK; }
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=55214
Your paranoid android.
=== debian10 (32 bit report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:avisplit crashed (c0000005) quartz:waveparser crashed (c0000005)
=== debian10 (32 bit Chinese:China report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:avisplit crashed (c0000005) quartz:waveparser crashed (c0000005)
=== debian10 (32 bit WoW report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. avisplit: Timeout filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:waveparser crashed (c0000005)
=== debian10 (64 bit WoW report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. avisplit: Timeout filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:waveparser crashed (c0000005)
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/quartz/tests/filtergraph.c | 236 ++++++++++++++++++++++++++++---- 1 file changed, 213 insertions(+), 23 deletions(-)
diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c index aec93926eba..d7ae766f117 100644 --- a/dlls/quartz/tests/filtergraph.c +++ b/dlls/quartz/tests/filtergraph.c @@ -46,31 +46,35 @@ static const WCHAR mpegfile[] = {'t','e','s','t','.','m','p','g',0}; static const WCHAR mp3file[] = {'t','e','s','t','.','m','p','3',0}; static const WCHAR wavefile[] = {'t','e','s','t','.','w','a','v',0};
-static WCHAR *load_resource(const WCHAR *name) +static WCHAR *create_file(const WCHAR *name, const char *data, DWORD size) { static WCHAR pathW[MAX_PATH]; DWORD written; HANDLE file; - HRSRC res; - void *ptr;
GetTempPathW(ARRAY_SIZE(pathW), pathW); lstrcatW(pathW, name); - file = CreateFileW(pathW, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); - ok(file != INVALID_HANDLE_VALUE, "file creation failed, at %s, error %d\n", wine_dbgstr_w(pathW), - GetLastError()); - - res = FindResourceW(NULL, name, (LPCWSTR)RT_RCDATA); - ok( res != 0, "couldn't find resource\n" ); - ptr = LockResource( LoadResource( GetModuleHandleA(NULL), res )); - WriteFile( file, ptr, SizeofResource( GetModuleHandleA(NULL), res ), &written, NULL ); - ok( written == SizeofResource( GetModuleHandleA(NULL), res ), "couldn't write resource\n" ); - CloseHandle( file ); + ok(file != INVALID_HANDLE_VALUE, "Failed to create file %s, error %u.\n", + wine_dbgstr_w(pathW), GetLastError()); + WriteFile(file, data, size, &written, NULL); + ok(written = size, "Failed to write file data, error %u.\n", GetLastError()); + CloseHandle(file);
return pathW; }
+static WCHAR *load_resource(const WCHAR *name) +{ + HRSRC res; + void *ptr; + + res = FindResourceW(NULL, name, (const WCHAR *)RT_RCDATA); + ok(!!res, "Failed to find resource %s, error %u.\n", wine_dbgstr_w(name), GetLastError()); + ptr = LockResource(LoadResource(GetModuleHandleA(NULL), res)); + return create_file(name, ptr, SizeofResource(GetModuleHandleA(NULL), res)); +} + static IFilterGraph2 *create_graph(void) { IFilterGraph2 *ret; @@ -1175,6 +1179,9 @@ struct testfilter double seek_rate;
IReferenceClock IReferenceClock_iface; + + IFileSourceFilter IFileSourceFilter_iface; + WCHAR filename[MAX_PATH]; };
static inline struct testfilter *impl_from_IEnumPins(IEnumPins *iface) @@ -1267,30 +1274,31 @@ static HRESULT WINAPI testfilter_QueryInterface(IBaseFilter *iface, REFIID iid, || IsEqualGUID(iid, &IID_IBaseFilter)) { *out = &filter->IBaseFilter_iface; - IBaseFilter_AddRef(*out); - return S_OK; } else if (IsEqualGUID(iid, &IID_IAMFilterMiscFlags) && filter->IAMFilterMiscFlags_iface.lpVtbl) { *out = &filter->IAMFilterMiscFlags_iface; - IAMFilterMiscFlags_AddRef(*out); - return S_OK; } else if (IsEqualGUID(iid, &IID_IMediaSeeking) && filter->IMediaSeeking_iface.lpVtbl) { *out = &filter->IMediaSeeking_iface; - IMediaSeeking_AddRef(*out); - return S_OK; } else if (IsEqualGUID(iid, &IID_IReferenceClock) && filter->IReferenceClock_iface.lpVtbl) { *out = &filter->IReferenceClock_iface; - IMediaSeeking_AddRef(*out); - return S_OK; + } + else if (IsEqualGUID(iid, &IID_IFileSourceFilter) && filter->IFileSourceFilter_iface.lpVtbl) + { + *out = &filter->IFileSourceFilter_iface; + } + else + { + *out = NULL; + return E_NOINTERFACE; }
- *out = NULL; - return E_NOINTERFACE; + IUnknown_AddRef((IUnknown *)*out); + return S_OK; }
static ULONG WINAPI testfilter_AddRef(IBaseFilter *iface) @@ -1742,6 +1750,56 @@ static const IReferenceClockVtbl testclock_vtbl = testclock_Unadvise, };
+static struct testfilter *impl_from_IFileSourceFilter(IFileSourceFilter *iface) +{ + return CONTAINING_RECORD(iface, struct testfilter, IFileSourceFilter_iface); +} + +static HRESULT WINAPI testfilesource_QueryInterface(IFileSourceFilter *iface, REFIID iid, void **out) +{ + struct testfilter *filter = impl_from_IFileSourceFilter(iface); + return IBaseFilter_QueryInterface(&filter->IBaseFilter_iface, iid, out); +} + +static ULONG WINAPI testfilesource_AddRef(IFileSourceFilter *iface) +{ + struct testfilter *filter = impl_from_IFileSourceFilter(iface); + return InterlockedIncrement(&filter->ref); +} + +static ULONG WINAPI testfilesource_Release(IFileSourceFilter *iface) +{ + struct testfilter *filter = impl_from_IFileSourceFilter(iface); + return InterlockedDecrement(&filter->ref); +} + +static HRESULT WINAPI testfilesource_Load(IFileSourceFilter *iface, + const WCHAR *filename, const AM_MEDIA_TYPE *mt) +{ + struct testfilter *filter = impl_from_IFileSourceFilter(iface); + if (winetest_debug > 1) trace("%p->Load()\n", iface); + + wcscpy(filter->filename, filename); + + return S_OK; +} + +static HRESULT WINAPI testfilesource_GetCurFile(IFileSourceFilter *iface, + WCHAR **filename, AM_MEDIA_TYPE *mt) +{ + ok(0, "Unexpected call.\n"); + return E_NOTIMPL; +} + +static const IFileSourceFilterVtbl testfilesource_vtbl = +{ + testfilesource_QueryInterface, + testfilesource_AddRef, + testfilesource_Release, + testfilesource_Load, + testfilesource_GetCurFile, +}; + struct testfilter_cf { IClassFactory IClassFactory_iface; @@ -3827,6 +3885,137 @@ static void test_default_sync_source(void) ok(source.ref == 1, "Got outstanding refcount %d.\n", source.ref); }
+static void test_add_source_filter(void) +{ + static const char bogus_data[20] = {0xde, 0xad, 0xbe, 0xef}; + static const char midi_data[20] = {'M','T','h','d'}; + static const WCHAR testW[] = {'t','e','s','t',0}; + + IFilterGraph2 *graph = create_graph(); + IFileSourceFilter *filesource; + IBaseFilter *filter, *filter2; + FILTER_INFO filter_info; + const WCHAR *filename; + WCHAR *ret_filename; + AM_MEDIA_TYPE mt; + CLSID clsid; + HRESULT hr; + ULONG ref; + BOOL ret; + HKEY key; + + /* Test a file which should be registered by extension. */ + + filename = create_file(mp3file, midi_data, sizeof(midi_data)); + hr = IFilterGraph2_AddSourceFilter(graph, filename, testW, &filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IBaseFilter_GetClassID(filter, &clsid); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(IsEqualGUID(&clsid, &CLSID_AsyncReader), "Got filter %s.\n", wine_dbgstr_guid(&clsid)); + hr = IBaseFilter_QueryFilterInfo(filter, &filter_info); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!wcscmp(filter_info.achName, testW), "Got unexpected name %s.\n", wine_dbgstr_w(filter_info.achName)); + IFilterGraph_Release(filter_info.pGraph); + + hr = IBaseFilter_QueryInterface(filter, &IID_IFileSourceFilter, (void **)&filesource); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IFileSourceFilter_GetCurFile(filesource, &ret_filename, &mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!wcscmp(ret_filename, filename), "Expected filename %s, got %s.\n", + wine_dbgstr_w(filename), wine_dbgstr_w(ret_filename)); + ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Stream), "Got major type %s.\n", wine_dbgstr_guid(&mt.majortype)); + ok(IsEqualGUID(&mt.subtype, &MEDIASUBTYPE_MPEG1Audio), "Got subtype %s.\n", wine_dbgstr_guid(&mt.subtype)); + IFileSourceFilter_Release(filesource); + + hr = IFilterGraph2_AddSourceFilter(graph, filename, testW, &filter2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(filter2 != filter, "Filters shouldn't match.\n"); + hr = IFilterGraph2_RemoveFilter(graph, filter2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ref = IBaseFilter_Release(filter2); + ok(!ref, "Got outstanding refcount %d.\n", ref); + + hr = IFilterGraph2_RemoveFilter(graph, filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ret = DeleteFileW(filename); + ok(ret, "Failed to delete %s, error %u.\n", wine_dbgstr_w(filename), GetLastError()); + + /* Test a file which should be registered by signature. */ + + filename = create_file(avifile, midi_data, sizeof(midi_data)); + hr = IFilterGraph2_AddSourceFilter(graph, filename, NULL, &filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IBaseFilter_GetClassID(filter, &clsid); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(IsEqualGUID(&clsid, &CLSID_AsyncReader), "Got filter %s.\n", wine_dbgstr_guid(&clsid)); + hr = IBaseFilter_QueryFilterInfo(filter, &filter_info); + ok(hr == S_OK, "Got hr %#x.\n", hr); + todo_wine ok(!wcscmp(filter_info.achName, filename), "Got unexpected name %s.\n", wine_dbgstr_w(filter_info.achName)); + IFilterGraph_Release(filter_info.pGraph); + + hr = IBaseFilter_QueryInterface(filter, &IID_IFileSourceFilter, (void **)&filesource); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IFileSourceFilter_GetCurFile(filesource, &ret_filename, &mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!wcscmp(ret_filename, filename), "Expected filename %s, got %s.\n", + wine_dbgstr_w(filename), wine_dbgstr_w(ret_filename)); + ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Stream), "Got major type %s.\n", wine_dbgstr_guid(&mt.majortype)); + ok(IsEqualGUID(&mt.subtype, &MEDIATYPE_Midi), "Got subtype %s.\n", wine_dbgstr_guid(&mt.subtype)); + IFileSourceFilter_Release(filesource); + + hr = IFilterGraph2_RemoveFilter(graph, filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ret = DeleteFileW(filename); + ok(ret, "Failed to delete %s, error %u.\n", wine_dbgstr_w(filename), GetLastError()); + + if (!RegCreateKeyA(HKEY_CLASSES_ROOT, "Media Type\{abbccdde-0000-0000-0000-000000000000}" + "\{bccddeef-0000-0000-0000-000000000000}", &key)) + { + static const GUID testfilter_clsid = {0x12345678}; + struct testpin testfilter_pin; + struct testfilter testfilter; + struct testfilter_cf cf = {{&testfilter_cf_vtbl}, &testfilter}; + DWORD cookie; + + testsource_init(&testfilter_pin, NULL, 0); + testfilter_init(&testfilter, &testfilter_pin, 1); + testfilter.IFileSourceFilter_iface.lpVtbl = &testfilesource_vtbl; + + CoRegisterClassObject(&testfilter_clsid, (IUnknown *)&cf.IClassFactory_iface, + CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, &cookie); + RegSetValueExA(key, "0", 0, REG_SZ, (const BYTE *)"0,4,,deadbeef", 14); + RegSetValueExA(key, "Source Filter", 0, REG_SZ, (const BYTE *)"{12345678-0000-0000-0000-000000000000}", 39); + + filename = create_file(avifile, bogus_data, sizeof(bogus_data)); + hr = IFilterGraph2_AddSourceFilter(graph, filename, NULL, &filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(filter == &testfilter.IBaseFilter_iface, "Got unexpected filter %p.\n", filter); + + hr = IFilterGraph2_RemoveFilter(graph, filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + IBaseFilter_Release(filter); + ref = IBaseFilter_Release(&testfilter.IBaseFilter_iface); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ret = DeleteFileW(filename); + ok(ret, "Failed to delete %s, error %u.\n", wine_dbgstr_w(filename), GetLastError()); + RegDeleteKeyA(HKEY_CLASSES_ROOT, "Media Type\{abbccdde-0000-0000-0000-000000000000}" + "\{bccddeef-0000-0000-0000-000000000000}"); + RegDeleteKeyA(HKEY_CLASSES_ROOT, "Media Type\{abbccdde-0000-0000-0000-000000000000}"); + CoRevokeClassObject(cookie); + } + else + skip("Not enough permission to register media types.\n"); + + ref = IFilterGraph2_Release(graph); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + START_TEST(filtergraph) { CoInitializeEx(NULL, COINIT_MULTITHREADED); @@ -3848,6 +4037,7 @@ START_TEST(filtergraph) test_ec_complete(); test_graph_seeking(); test_default_sync_source(); + test_add_source_filter();
CoUninitialize(); test_render_with_multithread();
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=55215
Your paranoid android.
=== wvistau64 (32 bit report) ===
quartz: filtergraph.c:438: Test failed: GetState() failed: 40237 filtergraph.c:444: Test failed: GetState() failed: 40237 filtergraph.c:527: Test failed: didn't get EOS filtergraph.c:532: Test failed: expected 48e, got 0
=== w7u (32 bit report) ===
quartz: filtergraph.c:527: Test failed: didn't get EOS filtergraph.c:532: Test failed: expected 2ccdba, got 0
=== w8 (32 bit report) ===
quartz: filtergraph.c:527: Test failed: didn't get EOS filtergraph.c:532: Test failed: expected 2ccdba, got 0 filtergraph.c:783: Test failed: wait failed
=== w8adm (32 bit report) ===
quartz: filtergraph.c:527: Test failed: didn't get EOS filtergraph.c:532: Test failed: expected 2ccdba, got 0
=== w1064v1507 (32 bit report) ===
quartz: filtergraph.c:783: Test failed: wait failed
=== debian10 (32 bit report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:avisplit crashed (c0000005) quartz:waveparser crashed (c0000005)
=== debian10 (32 bit Chinese:China report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:avisplit crashed (c0000005) quartz:waveparser crashed (c0000005)
=== debian10 (32 bit WoW report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. avisplit: Timeout filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:waveparser crashed (c0000005)
=== debian10 (64 bit WoW report) ===
quartz: avisplit.c:97: Test failed: Got hr 0x80040207. avisplit: Timeout filesource.c:344: Test failed: Expected subtype {e436eb88-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb84-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb86-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e06d8022-db46-11cf-b4d1-00805f6cbbea}, got {7364696d-0000-0010-8000-00aa00389b71}. filesource.c:344: Test failed: Expected subtype {e436eb8b-524f-11ce-9f53-0020af0ba770}, got {7364696d-0000-0010-8000-00aa00389b71}. waveparser.c:94: Test failed: Got hr 0x80040207. Unhandled exception: page fault on execute access to 0x06455355 in 32-bit code (0x06455355).
Report errors: quartz:waveparser crashed (c0000005)