Maarten Lankhorst : quartz: Try creating the file reader from the filter source first before falling back to the generic async file reader .

Alexandre Julliard julliard at winehq.org
Wed Apr 9 05:31:29 CDT 2008


Module: wine
Branch: master
Commit: 0117468754bdf53266b6ea752a44528abb744c67
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=0117468754bdf53266b6ea752a44528abb744c67

Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date:   Mon Apr  7 22:28:15 2008 -0700

quartz: Try creating the file reader from the filter source first before falling back to the generic async file reader.

---

 dlls/quartz/filtergraph.c |   69 +++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 66 insertions(+), 3 deletions(-)

diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 1c0acc7..91b872d 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -29,6 +29,8 @@
 #include "windef.h"
 #include "winbase.h"
 #include "winuser.h"
+#include "winreg.h"
+#include "shlwapi.h"
 #include "dshow.h"
 #include "wine/debug.h"
 #include "quartz_private.h"
@@ -1199,6 +1201,63 @@ static HRESULT WINAPI FilterGraph2_RenderFile(IFilterGraph2 *iface,
     return hr;
 }
 
+/* Some filters implement their own asynchronous reader (Theoretically they all should, try to load it first */
+static HRESULT GetFileSourceFilter(LPCOLESTR pszFileName, IBaseFilter **filter)
+{
+    static const WCHAR wszReg[] = {'M','e','d','i','a',' ','T','y','p','e','\\','E','x','t','e','n','s','i','o','n','s',0};
+    HRESULT hr = S_OK;
+    HKEY extkey;
+    LONG lRet;
+
+    lRet = RegOpenKeyExW(HKEY_CLASSES_ROOT, wszReg, 0, KEY_READ, &extkey);
+    hr = HRESULT_FROM_WIN32(lRet);
+
+    if (SUCCEEDED(hr))
+    {
+        static const WCHAR filtersource[] = {'S','o','u','r','c','e',' ','F','i','l','t','e','r',0};
+        WCHAR *ext = PathFindExtensionW(pszFileName);
+        WCHAR clsid_key[39];
+        GUID clsid;
+        DWORD size = sizeof(clsid_key);
+        HKEY pathkey;
+
+        if (!ext)
+        {
+            CloseHandle(extkey);
+            return E_FAIL;
+        }
+
+        lRet = RegOpenKeyExW(extkey, ext, 0, KEY_READ, &pathkey);
+        hr = HRESULT_FROM_WIN32(lRet);
+        CloseHandle(extkey);
+        if (FAILED(hr))
+            return hr;
+
+        lRet = RegQueryValueExW(pathkey, filtersource, NULL, NULL, (LPBYTE)clsid_key, &size);
+        hr = HRESULT_FROM_WIN32(lRet);
+        CloseHandle(pathkey);
+        if (FAILED(hr))
+            return hr;
+
+        CLSIDFromString(clsid_key, &clsid);
+
+        TRACE("CLSID: %s\n", debugstr_guid(&clsid));
+        hr = CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)filter);
+        if (SUCCEEDED(hr))
+        {
+            IFileSourceFilter *source = NULL;
+            hr = IBaseFilter_QueryInterface(*filter, &IID_IFileSourceFilter, (LPVOID*)&source);
+            if (SUCCEEDED(hr))
+                IFileSourceFilter_Release(source);
+            else
+                IBaseFilter_Release(*filter);
+        }
+    }
+    if (FAILED(hr))
+        *filter = NULL;
+    return hr;
+}
+
 static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface,
 						   LPCWSTR lpcwstrFileName,
 						   LPCWSTR lpcwstrFilterName,
@@ -1212,8 +1271,11 @@ static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface,
 
     TRACE("(%p/%p)->(%s, %s, %p)\n", This, iface, debugstr_w(lpcwstrFileName), debugstr_w(lpcwstrFilterName), ppFilter);
 
-    /* Instantiate a file source filter */ 
-    hr = CoCreateInstance(&CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)&preader);
+    /* Try from file name first, then fall back to default asynchronous reader */
+    hr = GetFileSourceFilter(lpcwstrFileName, &preader);
+
+    if (FAILED(hr))
+        hr = CoCreateInstance(&CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)&preader);
     if (FAILED(hr)) {
         ERR("Unable to create file source filter (%x)\n", hr);
         return hr;
@@ -1238,12 +1300,13 @@ static HRESULT WINAPI FilterGraph2_AddSourceFilter(IFilterGraph2 *iface,
         ERR("Load (%x)\n", hr);
         goto error;
     }
-    
+
     IFileSourceFilter_GetCurFile(pfile, &filename, &mt);
     if (FAILED(hr)) {
         ERR("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));




More information about the wine-cvs mailing list