Nikolay Sivov : mfreadwrite: Implement MFCreateSourceReaderFromURL().

Alexandre Julliard julliard at winehq.org
Tue Mar 12 16:56:15 CDT 2019


Module: wine
Branch: master
Commit: 9bf4db1325d303a876bf282543289e15f9c698ad
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9bf4db1325d303a876bf282543289e15f9c698ad

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Mar 12 09:07:46 2019 +0300

mfreadwrite: Implement MFCreateSourceReaderFromURL().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mfreadwrite/main.c           | 60 ++++++++++++++++++++++++++++++++++++++-
 dlls/mfreadwrite/mfreadwrite.spec |  2 +-
 include/mfreadwrite.idl           |  1 +
 3 files changed, 61 insertions(+), 2 deletions(-)

diff --git a/dlls/mfreadwrite/main.c b/dlls/mfreadwrite/main.c
index bcf79a8..88903ce 100644
--- a/dlls/mfreadwrite/main.c
+++ b/dlls/mfreadwrite/main.c
@@ -273,6 +273,47 @@ static HRESULT create_source_reader_from_stream(IMFByteStream *stream, IMFAttrib
     return hr;
 }
 
+static HRESULT create_source_reader_from_url(const WCHAR *url, IMFAttributes *attributes, REFIID riid, void **out)
+{
+    IMFSourceResolver *resolver;
+    IUnknown *object = NULL;
+    MF_OBJECT_TYPE obj_type;
+    IMFMediaSource *source;
+    HRESULT hr;
+
+    if (FAILED(hr = MFCreateSourceResolver(&resolver)))
+        return hr;
+
+    hr = IMFSourceResolver_CreateObjectFromURL(resolver, url, MF_RESOLUTION_MEDIASOURCE, NULL, &obj_type,
+            (IUnknown **)&object);
+    if (SUCCEEDED(hr))
+    {
+        switch (obj_type)
+        {
+            case MF_OBJECT_BYTESTREAM:
+                hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, (IMFByteStream *)object, NULL,
+                        MF_RESOLUTION_MEDIASOURCE, NULL, &obj_type, (IUnknown **)&source);
+                break;
+            case MF_OBJECT_MEDIASOURCE:
+                source = (IMFMediaSource *)object;
+                IMFMediaSource_AddRef(source);
+                break;
+            default:
+                WARN("Unknown object type %d.\n", obj_type);
+                hr = E_UNEXPECTED;
+        }
+        IUnknown_Release(object);
+    }
+
+    IMFSourceResolver_Release(resolver);
+    if (FAILED(hr))
+        return hr;
+
+    hr = create_source_reader_from_source(source, attributes, riid, out);
+    IMFMediaSource_Release(source);
+    return hr;
+}
+
 static HRESULT WINAPI sink_writer_QueryInterface(IMFSinkWriter *iface, REFIID riid, void **out)
 {
     TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
@@ -480,6 +521,16 @@ HRESULT WINAPI MFCreateSourceReaderFromMediaSource(IMFMediaSource *source, IMFAt
     return create_source_reader_from_source(source, attributes, &IID_IMFSourceReader, (void **)reader);
 }
 
+/***********************************************************************
+ *      MFCreateSourceReaderFromURL (mfreadwrite.@)
+ */
+HRESULT WINAPI MFCreateSourceReaderFromURL(const WCHAR *url, IMFAttributes *attributes, IMFSourceReader **reader)
+{
+    TRACE("%s, %p, %p.\n", debugstr_w(url), attributes, reader);
+
+    return create_source_reader_from_url(url, attributes, &IID_IMFSourceReader, (void **)reader);
+}
+
 static HRESULT WINAPI readwrite_factory_QueryInterface(IMFReadWriteClassFactory *iface, REFIID riid, void **out)
 {
     if (IsEqualIID(riid, &IID_IMFReadWriteClassFactory) ||
@@ -508,7 +559,14 @@ static ULONG WINAPI readwrite_factory_Release(IMFReadWriteClassFactory *iface)
 static HRESULT WINAPI readwrite_factory_CreateInstanceFromURL(IMFReadWriteClassFactory *iface, REFCLSID clsid,
         const WCHAR *url, IMFAttributes *attributes, REFIID riid, void **out)
 {
-    FIXME("%s, %s, %p, %s, %p.\n", debugstr_guid(clsid), debugstr_w(url), attributes, debugstr_guid(riid), out);
+    TRACE("%s, %s, %p, %s, %p.\n", debugstr_guid(clsid), debugstr_w(url), attributes, debugstr_guid(riid), out);
+
+    if (IsEqualGUID(clsid, &CLSID_MFSourceReader))
+    {
+        return create_source_reader_from_url(url, attributes, &IID_IMFSourceReader, out);
+    }
+
+    FIXME("Unsupported %s.\n", debugstr_guid(clsid));
 
     return E_NOTIMPL;
 }
diff --git a/dlls/mfreadwrite/mfreadwrite.spec b/dlls/mfreadwrite/mfreadwrite.spec
index d8ed694..3a215a9 100644
--- a/dlls/mfreadwrite/mfreadwrite.spec
+++ b/dlls/mfreadwrite/mfreadwrite.spec
@@ -6,4 +6,4 @@
 @ stub MFCreateSinkWriterFromURL
 @ stdcall MFCreateSourceReaderFromByteStream(ptr ptr ptr)
 @ stdcall MFCreateSourceReaderFromMediaSource(ptr ptr ptr)
-@ stub MFCreateSourceReaderFromURL
+@ stdcall MFCreateSourceReaderFromURL(wstr ptr ptr)
diff --git a/include/mfreadwrite.idl b/include/mfreadwrite.idl
index 82f67d4..2647127 100644
--- a/include/mfreadwrite.idl
+++ b/include/mfreadwrite.idl
@@ -151,3 +151,4 @@ cpp_quote( "HRESULT WINAPI MFCreateSourceReaderFromByteStream(IMFByteStream *str
 cpp_quote( "                                                  IMFSourceReader **reader);" )
 cpp_quote( "HRESULT WINAPI MFCreateSourceReaderFromMediaSource(IMFMediaSource *source, IMFAttributes *attributes," )
 cpp_quote( "                                                   IMFSourceReader **reader);" )
+cpp_quote( "HRESULT WINAPI MFCreateSourceReaderFromURL(const WCHAR *url, IMFAttributes *attributes, IMFSourceReader **reader);" )




More information about the wine-cvs mailing list