[PATCH v2 09/11] winegstreamer: Add mp4 media source using qtdemux.

Derek Lesho dlesho at codeweavers.com
Mon Feb 10 16:32:39 CST 2020


Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
 dlls/mf/mf.rgs                | 11 +++++++++++
 dlls/mfplat/tests/mfplat.c    | 36 ++++++++++-------------------------
 dlls/winegstreamer/mfplat.c   |  9 ++++++++-
 dlls/winegstreamer/mfplat.idl |  7 +++++++
 include/mfidl.idl             |  1 +
 5 files changed, 37 insertions(+), 27 deletions(-)

diff --git a/dlls/mf/mf.rgs b/dlls/mf/mf.rgs
index f127df7632..11fb106b4f 100644
--- a/dlls/mf/mf.rgs
+++ b/dlls/mf/mf.rgs
@@ -13,6 +13,17 @@ HKLM
                         val '{477ec299-1421-4bdd-971f-7ccb933f21ad}' = s 'File Scheme Handler'
                     }
                 }
+                NoRemove 'ByteStreamHandlers'
+                {
+                    '.mp4'
+                    {
+                        val '{271C3902-6095-4c45-A22F-20091816EE9E}' = s 'MPEG4 Byte Stream Handler'
+                    }
+                    'video/mp4'
+                    {
+                        val '{271C3902-6095-4c45-A22F-20091816EE9E}' = s 'MPEG4 Byte Stream Handler'
+                    }
+                }
             }
         }
     }
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index f056bbda2a..e08486bce1 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -432,7 +432,7 @@ static void test_source_resolver(void)
     WCHAR *filename;
     GUID guid;
     PROPVARIANT empty_var;
-    BOOL selected, do_uninit, skip_source_tests;
+    BOOL selected, do_uninit;
     ULONG refcount;
 
     if (!pMFCreateSourceResolver)
@@ -513,38 +513,23 @@ static void test_source_resolver(void)
     ok(hr == S_OK, "Failed to get type handler, hr %#x.\n", hr);
 
     hr = IMFMediaTypeHandler_GetMajorType(handler, &guid);
-todo_wine
     ok(hr == S_OK, "Failed to get stream major type, hr %#x.\n", hr);
-    if (hr == S_OK)
-    {
-        ok (IsEqualGUID(&guid, &MFMediaType_Video), "Unexpected major type %s.\n", debugstr_guid(&guid));
-
-        hr = IMFMediaTypeHandler_GetCurrentMediaType(handler, &type);
-        ok (hr == S_OK, "Failed to get current media type, hr %#x.\n", hr);
-
-        hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &guid);
-        ok(hr == S_OK, "Failed to get media sub type, hr %#x.\n", hr);
-        ok(IsEqualGUID(&guid, &MFVideoFormat_M4S2), "Unexpected sub type %s.\n", debugstr_guid(&guid));
+    ok (IsEqualGUID(&guid, &MFMediaType_Video), "Unexpected major type %s.\n", debugstr_guid(&guid));
 
-        hr = IMFPresentationDescriptor_SelectStream(descriptor, 0);
-        ok(hr == S_OK, "Failed to select video stream, hr %#x.\n", hr);
+    hr = IMFMediaTypeHandler_GetCurrentMediaType(handler, &type);
+    ok (hr == S_OK, "Failed to get current media type, hr %#x.\n", hr);
 
-        IMFMediaType_Release(type);
+    hr = IMFMediaType_GetGUID(type, &MF_MT_SUBTYPE, &guid);
+    ok(hr == S_OK, "Failed to get media sub type, hr %#x.\n", hr);
+    ok(IsEqualGUID(&guid, &MFVideoFormat_M4S2), "Unexpected sub type %s.\n", debugstr_guid(&guid));
 
-        skip_source_tests = FALSE;
-    }
-    else
-    {
-        /* skip media source tests to avoid crashing, as the media source is fake */
-        skip_source_tests = TRUE;
-    }
+    hr = IMFPresentationDescriptor_SelectStream(descriptor, 0);
+    ok(hr == S_OK, "Failed to select video stream, hr %#x.\n", hr);
 
+    IMFMediaType_Release(type);
     IMFMediaTypeHandler_Release(handler);
     IMFStreamDescriptor_Release(sd);
 
-    if (skip_source_tests)
-        goto source_tests_end;
-
     empty_var.vt = VT_EMPTY;
     hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &empty_var);
     ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr);
@@ -631,7 +616,6 @@ todo_wine
     hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, NULL);
     ok (hr == MF_E_SHUTDOWN, "Got 0x%08x\n", hr);
 
-    source_tests_end:
     refcount = IMFMediaSource_Release(mediasource);
     ok(!refcount, "Unexpected refcount %u.\n", refcount);
     refcount = IMFByteStream_Release(stream);
diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c
index 0a25cad48f..53aa0bc8f1 100644
--- a/dlls/winegstreamer/mfplat.c
+++ b/dlls/winegstreamer/mfplat.c
@@ -21,13 +21,14 @@
 
 #include "gst_private.h"
 
+#include "gst_private.h"
+
 #include <stdarg.h>
 
 #define COBJMACROS
 #define NONAMELESSUNION
 
 #include "mfapi.h"
-#include "mfidl.h"
 
 #include "wine/debug.h"
 #include "wine/heap.h"
@@ -407,6 +408,11 @@ failed:
     return hr;
 }
 
+static HRESULT mp4_stream_handler_create(REFIID riid, void **ret)
+{
+    return container_stream_handler_construct(riid, ret, "qtdemux");
+}
+
 static const struct class_object
 {
     const GUID *clsid;
@@ -415,6 +421,7 @@ static const struct class_object
 class_objects[] =
 {
     { &CLSID_VideoProcessorMFT, &video_processor_create },
+    { &CLSID_MPEG4ByteStreamHandler, &mp4_stream_handler_create },
 };
 
 HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj)
diff --git a/dlls/winegstreamer/mfplat.idl b/dlls/winegstreamer/mfplat.idl
index 05a75bdb8e..947b47f435 100644
--- a/dlls/winegstreamer/mfplat.idl
+++ b/dlls/winegstreamer/mfplat.idl
@@ -24,3 +24,10 @@
 
 ]
 coclass VideoProcessorMFT { }
+
+[
+    helpstring("MP4 Byte Stream Handler"),
+    threading(both),
+    uuid(271c3902-6095-4c45-a22f-20091816ee9e)
+]
+coclass MPEG4ByteStreamHandler { }
\ No newline at end of file
diff --git a/include/mfidl.idl b/include/mfidl.idl
index da43399828..4c94c5d03e 100644
--- a/include/mfidl.idl
+++ b/include/mfidl.idl
@@ -910,3 +910,4 @@ cpp_quote("EXTERN_GUID(MF_SESSION_APPROX_EVENT_OCCURRENCE_TIME, 0x190e852f, 0x62
 cpp_quote("EXTERN_GUID(MF_PMP_SERVER_CONTEXT, 0x2f00c910, 0xd2cf, 0x4278, 0x8b, 0x6a, 0xd0, 0x77, 0xfa, 0xc3, 0xa2, 0x5f);")
 
 cpp_quote("EXTERN_GUID(CLSID_VideoProcessorMFT, 0x88753b26, 0x5b24, 0x49bd, 0xb2, 0xe7, 0xc, 0x44, 0x5c, 0x78, 0xc9, 0x82);")
+cpp_quote("EXTERN_GUID(CLSID_MPEG4ByteStreamHandler, 0x271c3902, 0x6095, 0x4c45, 0xa2, 0x2f, 0x20, 0x09, 0x18, 0x16, 0xee, 0x9e);")
\ No newline at end of file
-- 
2.25.0




More information about the wine-devel mailing list