diff --git a/patches/mfplat-streaming-support/0007-Implement-stub-bytestream-handler-and-source.patch b/patches/mfplat-streaming-support/0007-Implement-stub-bytestream-handler-and-source.patch deleted file mode 100644 index 18556083..00000000 --- a/patches/mfplat-streaming-support/0007-Implement-stub-bytestream-handler-and-source.patch +++ /dev/null @@ -1,878 +0,0 @@ -From 97478b5836fca83cbb536420bc76eceee68d664a Mon Sep 17 00:00:00 2001 -From: Derek Lesho -Date: Wed, 25 Mar 2020 10:03:52 -0500 -Subject: [PATCH 07/54] Implement stub bytestream handler and source. - -Signed-off-by: Derek Lesho ---- - dlls/mfplat/tests/mfplat.c | 9 +- - dlls/winegstreamer/Makefile.in | 1 + - dlls/winegstreamer/gst_private.h | 6 + - dlls/winegstreamer/media_source.c | 680 +++++++++++++++++++ - dlls/winegstreamer/mfplat.c | 9 + - dlls/winegstreamer/winegstreamer.rgs | 32 + - dlls/winegstreamer/winegstreamer_classes.idl | 7 + - include/mfidl.idl | 1 + - 8 files changed, 740 insertions(+), 5 deletions(-) - create mode 100644 dlls/winegstreamer/media_source.c - -diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c -index 01749dd9ef..c9548c6b18 100644 ---- a/dlls/mfplat/tests/mfplat.c -+++ b/dlls/mfplat/tests/mfplat.c -@@ -529,7 +529,10 @@ static void test_source_resolver(void) - ok(obj_type == MF_OBJECT_MEDIASOURCE, "got %d\n", obj_type); - - hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, &descriptor); -+todo_wine - ok(hr == S_OK, "Failed to get presentation descriptor, hr %#x.\n", hr); -+ if (FAILED(hr)) -+ goto skip_source_tests; - ok(descriptor != NULL, "got %p\n", descriptor); - - hr = IMFPresentationDescriptor_GetStreamDescriptorByIndex(descriptor, 0, &selected, &sd); -@@ -540,10 +543,7 @@ static void test_source_resolver(void) - IMFStreamDescriptor_Release(sd); - - hr = IMFMediaTypeHandler_GetMajorType(handler, &guid); --todo_wine - ok(hr == S_OK, "Failed to get stream major type, hr %#x.\n", hr); -- if (FAILED(hr)) -- goto skip_source_tests; - - /* Check major/minor type for the test media. */ - ok(IsEqualGUID(&guid, &MFMediaType_Video), "Unexpected major type %s.\n", debugstr_guid(&guid)); -@@ -624,6 +624,7 @@ todo_wine - get_event((IMFMediaEventGenerator *)mediasource, MEEndOfPresentation, NULL); - - IMFMediaTypeHandler_Release(handler); -+ IMFPresentationDescriptor_Release(descriptor); - - hr = IMFMediaSource_Shutdown(mediasource); - ok(hr == S_OK, "Unexpected hr %#x.\n", hr); -@@ -632,8 +633,6 @@ todo_wine - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); - - skip_source_tests: -- -- IMFPresentationDescriptor_Release(descriptor); - IMFMediaSource_Release(mediasource); - IMFByteStream_Release(stream); - -diff --git a/dlls/winegstreamer/Makefile.in b/dlls/winegstreamer/Makefile.in -index 337c1086e6..e578d194f7 100644 ---- a/dlls/winegstreamer/Makefile.in -+++ b/dlls/winegstreamer/Makefile.in -@@ -10,6 +10,7 @@ C_SRCS = \ - gst_cbs.c \ - gstdemux.c \ - main.c \ -+ media_source.c \ - mediatype.c \ - mfplat.c \ - pin.c \ -diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h -index e6fb841fc8..71ca429088 100644 ---- a/dlls/winegstreamer/gst_private.h -+++ b/dlls/winegstreamer/gst_private.h -@@ -54,4 +54,10 @@ void start_dispatch_thread(void) DECLSPEC_HIDDEN; - - extern HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj) DECLSPEC_HIDDEN; - -+enum source_type -+{ -+ SOURCE_TYPE_MPEG_4, -+}; -+HRESULT container_stream_handler_construct(REFIID riid, void **obj, enum source_type); -+ - #endif /* __GST_PRIVATE_INCLUDED__ */ -diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c -new file mode 100644 -index 0000000000..df28f54444 ---- /dev/null -+++ b/dlls/winegstreamer/media_source.c -@@ -0,0 +1,680 @@ -+#include "gst_private.h" -+ -+#include -+ -+#define COBJMACROS -+#define NONAMELESSUNION -+ -+#include "mfapi.h" -+#include "mferror.h" -+#include "mfidl.h" -+ -+#include "wine/debug.h" -+#include "wine/heap.h" -+#include "wine/list.h" -+ -+WINE_DEFAULT_DEBUG_CHANNEL(mfplat); -+ -+struct media_source -+{ -+ IMFMediaSource IMFMediaSource_iface; -+ LONG ref; -+ IMFMediaEventQueue *event_queue; -+}; -+ -+static inline struct media_source *impl_from_IMFMediaSource(IMFMediaSource *iface) -+{ -+ return CONTAINING_RECORD(iface, struct media_source, IMFMediaSource_iface); -+} -+ -+static HRESULT WINAPI media_source_QueryInterface(IMFMediaSource *iface, REFIID riid, void **out) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ -+ TRACE("(%p)->(%s %p)\n", source, debugstr_guid(riid), out); -+ -+ if (IsEqualIID(riid, &IID_IMFMediaSource) || -+ IsEqualIID(riid, &IID_IMFMediaEventGenerator) || -+ IsEqualIID(riid, &IID_IUnknown)) -+ { -+ *out = &source->IMFMediaSource_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 media_source_AddRef(IMFMediaSource *iface) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ ULONG ref = InterlockedIncrement(&source->ref); -+ -+ TRACE("(%p) ref=%u\n", source, ref); -+ -+ return ref; -+} -+ -+static ULONG WINAPI media_source_Release(IMFMediaSource *iface) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ ULONG ref = InterlockedDecrement(&source->ref); -+ -+ TRACE("(%p) ref=%u\n", source, ref); -+ -+ if (!ref) -+ { -+ heap_free(source); -+ } -+ -+ return ref; -+} -+ -+static HRESULT WINAPI media_source_GetEvent(IMFMediaSource *iface, DWORD flags, IMFMediaEvent **event) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ -+ TRACE("(%p)->(%#x, %p)\n", source, flags, event); -+ -+ return IMFMediaEventQueue_GetEvent(source->event_queue, flags, event); -+} -+ -+static HRESULT WINAPI media_source_BeginGetEvent(IMFMediaSource *iface, IMFAsyncCallback *callback, IUnknown *state) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ -+ TRACE("(%p)->(%p, %p)\n", source, callback, state); -+ -+ return IMFMediaEventQueue_BeginGetEvent(source->event_queue, callback, state); -+} -+ -+static HRESULT WINAPI media_source_EndGetEvent(IMFMediaSource *iface, IMFAsyncResult *result, IMFMediaEvent **event) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ -+ TRACE("(%p)->(%p, %p)\n", source, result, event); -+ -+ return IMFMediaEventQueue_EndGetEvent(source->event_queue, result, event); -+} -+ -+static HRESULT WINAPI media_source_QueueEvent(IMFMediaSource *iface, MediaEventType event_type, REFGUID ext_type, -+ HRESULT hr, const PROPVARIANT *value) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ -+ TRACE("(%p)->(%d, %s, %#x, %p)\n", source, event_type, debugstr_guid(ext_type), hr, value); -+ -+ return IMFMediaEventQueue_QueueEventParamVar(source->event_queue, event_type, ext_type, hr, value); -+} -+ -+static HRESULT WINAPI media_source_GetCharacteristics(IMFMediaSource *iface, DWORD *characteristics) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ -+ FIXME("(%p)->(%p): stub\n", source, characteristics); -+ -+ return E_NOTIMPL; -+} -+ -+static HRESULT WINAPI media_source_CreatePresentationDescriptor(IMFMediaSource *iface, IMFPresentationDescriptor **descriptor) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ -+ FIXME("(%p)->(%p): stub\n", source, descriptor); -+ -+ return E_NOTIMPL; -+} -+ -+static HRESULT WINAPI media_source_Start(IMFMediaSource *iface, IMFPresentationDescriptor *descriptor, -+ const GUID *time_format, const PROPVARIANT *start_position) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ -+ FIXME("(%p)->(%p, %p, %p): stub\n", source, descriptor, time_format, start_position); -+ -+ return E_NOTIMPL; -+} -+ -+static HRESULT WINAPI media_source_Stop(IMFMediaSource *iface) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ -+ FIXME("(%p): stub\n", source); -+ -+ return E_NOTIMPL; -+} -+ -+static HRESULT WINAPI media_source_Pause(IMFMediaSource *iface) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ -+ FIXME("(%p): stub\n", source); -+ -+ return E_NOTIMPL; -+} -+ -+static HRESULT media_source_teardown(struct media_source *source) -+{ -+ if (source->event_queue) -+ IMFMediaEventQueue_Release(source->event_queue); -+ -+ return S_OK; -+} -+ -+static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface) -+{ -+ struct media_source *source = impl_from_IMFMediaSource(iface); -+ -+ FIXME("(%p): stub\n", source); -+ -+ return E_NOTIMPL; -+} -+ -+static const IMFMediaSourceVtbl IMFMediaSource_vtbl = -+{ -+ media_source_QueryInterface, -+ media_source_AddRef, -+ media_source_Release, -+ media_source_GetEvent, -+ media_source_BeginGetEvent, -+ media_source_EndGetEvent, -+ media_source_QueueEvent, -+ media_source_GetCharacteristics, -+ media_source_CreatePresentationDescriptor, -+ media_source_Start, -+ media_source_Stop, -+ media_source_Pause, -+ media_source_Shutdown, -+}; -+ -+static HRESULT media_source_constructor(IMFByteStream *bytestream, enum source_type type, struct media_source **out_media_source) -+{ -+ struct media_source *object = heap_alloc_zero(sizeof(*object)); -+ HRESULT hr; -+ -+ if (!object) -+ return E_OUTOFMEMORY; -+ -+ if (FAILED(hr = MFCreateEventQueue(&object->event_queue))) -+ goto fail; -+ -+ object->IMFMediaSource_iface.lpVtbl = &IMFMediaSource_vtbl; -+ object->ref = 1; -+ -+ *out_media_source = object; -+ return S_OK; -+ -+ fail: -+ WARN("Failed to construct MFMediaSource, hr %#x.\n", hr); -+ -+ media_source_teardown(object); -+ heap_free(object); -+ return hr; -+} -+ -+/* IMFByteStreamHandler */ -+ -+struct container_stream_handler_result -+{ -+ struct list entry; -+ IMFAsyncResult *result; -+ MF_OBJECT_TYPE obj_type; -+ IUnknown *object; -+}; -+ -+struct container_stream_handler -+{ -+ IMFByteStreamHandler IMFByteStreamHandler_iface; -+ IMFAsyncCallback IMFAsyncCallback_iface; -+ LONG refcount; -+ enum source_type type; -+ struct list results; -+ CRITICAL_SECTION cs; -+}; -+ -+static struct container_stream_handler *impl_from_IMFByteStreamHandler(IMFByteStreamHandler *iface) -+{ -+ return CONTAINING_RECORD(iface, struct container_stream_handler, IMFByteStreamHandler_iface); -+} -+ -+static struct container_stream_handler *impl_from_IMFAsyncCallback(IMFAsyncCallback *iface) -+{ -+ return CONTAINING_RECORD(iface, struct container_stream_handler, IMFAsyncCallback_iface); -+} -+ -+static HRESULT WINAPI container_stream_handler_QueryInterface(IMFByteStreamHandler *iface, REFIID riid, void **obj) -+{ -+ TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); -+ -+ if (IsEqualIID(riid, &IID_IMFByteStreamHandler) || -+ IsEqualIID(riid, &IID_IUnknown)) -+ { -+ *obj = iface; -+ IMFByteStreamHandler_AddRef(iface); -+ return S_OK; -+ } -+ -+ WARN("Unsupported %s.\n", debugstr_guid(riid)); -+ *obj = NULL; -+ return E_NOINTERFACE; -+} -+ -+static ULONG WINAPI container_stream_handler_AddRef(IMFByteStreamHandler *iface) -+{ -+ struct container_stream_handler *handler = impl_from_IMFByteStreamHandler(iface); -+ ULONG refcount = InterlockedIncrement(&handler->refcount); -+ -+ TRACE("%p, refcount %u.\n", handler, refcount); -+ -+ return refcount; -+} -+ -+static ULONG WINAPI container_stream_handler_Release(IMFByteStreamHandler *iface) -+{ -+ struct container_stream_handler *handler = impl_from_IMFByteStreamHandler(iface); -+ ULONG refcount = InterlockedDecrement(&handler->refcount); -+ struct container_stream_handler_result *result, *next; -+ -+ TRACE("%p, refcount %u.\n", iface, refcount); -+ -+ if (!refcount) -+ { -+ LIST_FOR_EACH_ENTRY_SAFE(result, next, &handler->results, struct container_stream_handler_result, entry) -+ { -+ list_remove(&result->entry); -+ IMFAsyncResult_Release(result->result); -+ if (result->object) -+ IUnknown_Release(result->object); -+ heap_free(result); -+ } -+ DeleteCriticalSection(&handler->cs); -+ heap_free(handler); -+ } -+ -+ return refcount; -+} -+ -+struct create_object_context -+{ -+ IUnknown IUnknown_iface; -+ LONG refcount; -+ -+ IPropertyStore *props; -+ IMFByteStream *stream; -+ WCHAR *url; -+ DWORD flags; -+}; -+ -+static struct create_object_context *impl_from_IUnknown(IUnknown *iface) -+{ -+ return CONTAINING_RECORD(iface, struct create_object_context, IUnknown_iface); -+} -+ -+static HRESULT WINAPI create_object_context_QueryInterface(IUnknown *iface, REFIID riid, void **obj) -+{ -+ TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj); -+ -+ if (IsEqualIID(riid, &IID_IUnknown)) -+ { -+ *obj = iface; -+ IUnknown_AddRef(iface); -+ return S_OK; -+ } -+ -+ WARN("Unsupported %s.\n", debugstr_guid(riid)); -+ *obj = NULL; -+ return E_NOINTERFACE; -+} -+ -+static ULONG WINAPI create_object_context_AddRef(IUnknown *iface) -+{ -+ struct create_object_context *context = impl_from_IUnknown(iface); -+ ULONG refcount = InterlockedIncrement(&context->refcount); -+ -+ TRACE("%p, refcount %u.\n", iface, refcount); -+ -+ return refcount; -+} -+ -+static ULONG WINAPI create_object_context_Release(IUnknown *iface) -+{ -+ struct create_object_context *context = impl_from_IUnknown(iface); -+ ULONG refcount = InterlockedDecrement(&context->refcount); -+ -+ TRACE("%p, refcount %u.\n", iface, refcount); -+ -+ if (!refcount) -+ { -+ if (context->props) -+ IPropertyStore_Release(context->props); -+ if (context->stream) -+ IMFByteStream_Release(context->stream); -+ if (context->url) -+ heap_free(context->url); -+ heap_free(context); -+ } -+ -+ return refcount; -+} -+ -+static const IUnknownVtbl create_object_context_vtbl = -+{ -+ create_object_context_QueryInterface, -+ create_object_context_AddRef, -+ create_object_context_Release, -+}; -+ -+static WCHAR *heap_strdupW(const WCHAR *str) -+{ -+ WCHAR *ret = NULL; -+ -+ if (str) -+ { -+ unsigned int size; -+ -+ size = (lstrlenW(str) + 1) * sizeof(WCHAR); -+ ret = heap_alloc(size); -+ if (ret) -+ memcpy(ret, str, size); -+ } -+ -+ return ret; -+} -+ -+static HRESULT WINAPI container_stream_handler_BeginCreateObject(IMFByteStreamHandler *iface, IMFByteStream *stream, const WCHAR *url, DWORD flags, -+ IPropertyStore *props, IUnknown **cancel_cookie, IMFAsyncCallback *callback, IUnknown *state) -+{ -+ struct container_stream_handler *this = impl_from_IMFByteStreamHandler(iface); -+ struct create_object_context *context; -+ IMFAsyncResult *caller, *item; -+ HRESULT hr; -+ -+ TRACE("%p, %s, %#x, %p, %p, %p, %p.\n", iface, debugstr_w(url), flags, props, cancel_cookie, callback, state); -+ -+ if (cancel_cookie) -+ *cancel_cookie = NULL; -+ -+ if (FAILED(hr = MFCreateAsyncResult(NULL, callback, state, &caller))) -+ return hr; -+ -+ context = heap_alloc(sizeof(*context)); -+ if (!context) -+ { -+ IMFAsyncResult_Release(caller); -+ return E_OUTOFMEMORY; -+ } -+ -+ context->IUnknown_iface.lpVtbl = &create_object_context_vtbl; -+ context->refcount = 1; -+ context->props = props; -+ if (context->props) -+ IPropertyStore_AddRef(context->props); -+ context->flags = flags; -+ context->stream = stream; -+ if (context->stream) -+ IMFByteStream_AddRef(context->stream); -+ if (url) -+ context->url = heap_strdupW(url); -+ if (!context->stream) -+ { -+ IMFAsyncResult_Release(caller); -+ IUnknown_Release(&context->IUnknown_iface); -+ return E_OUTOFMEMORY; -+ } -+ -+ hr = MFCreateAsyncResult(&context->IUnknown_iface, &this->IMFAsyncCallback_iface, (IUnknown *)caller, &item); -+ IUnknown_Release(&context->IUnknown_iface); -+ if (SUCCEEDED(hr)) -+ { -+ if (SUCCEEDED(hr = MFPutWorkItemEx(MFASYNC_CALLBACK_QUEUE_IO, item))) -+ { -+ if (cancel_cookie) -+ { -+ *cancel_cookie = (IUnknown *)caller; -+ IUnknown_AddRef(*cancel_cookie); -+ } -+ } -+ -+ IMFAsyncResult_Release(item); -+ } -+ IMFAsyncResult_Release(caller); -+ -+ return hr; -+} -+ -+static HRESULT WINAPI container_stream_handler_EndCreateObject(IMFByteStreamHandler *iface, IMFAsyncResult *result, -+ MF_OBJECT_TYPE *obj_type, IUnknown **object) -+{ -+ struct container_stream_handler *this = impl_from_IMFByteStreamHandler(iface); -+ struct container_stream_handler_result *found = NULL, *cur; -+ HRESULT hr; -+ -+ TRACE("%p, %p, %p, %p.\n", iface, result, obj_type, object); -+ -+ EnterCriticalSection(&this->cs); -+ -+ LIST_FOR_EACH_ENTRY(cur, &this->results, struct container_stream_handler_result, entry) -+ { -+ if (result == cur->result) -+ { -+ list_remove(&cur->entry); -+ found = cur; -+ break; -+ } -+ } -+ -+ LeaveCriticalSection(&this->cs); -+ -+ if (found) -+ { -+ *obj_type = found->obj_type; -+ *object = found->object; -+ hr = IMFAsyncResult_GetStatus(found->result); -+ IMFAsyncResult_Release(found->result); -+ heap_free(found); -+ } -+ else -+ { -+ *obj_type = MF_OBJECT_INVALID; -+ *object = NULL; -+ hr = MF_E_UNEXPECTED; -+ } -+ -+ return hr; -+} -+ -+static HRESULT WINAPI container_stream_handler_CancelObjectCreation(IMFByteStreamHandler *iface, IUnknown *cancel_cookie) -+{ -+ struct container_stream_handler *this = impl_from_IMFByteStreamHandler(iface); -+ struct container_stream_handler_result *found = NULL, *cur; -+ -+ TRACE("%p, %p.\n", iface, cancel_cookie); -+ -+ EnterCriticalSection(&this->cs); -+ -+ LIST_FOR_EACH_ENTRY(cur, &this->results, struct container_stream_handler_result, entry) -+ { -+ if (cancel_cookie == (IUnknown *)cur->result) -+ { -+ list_remove(&cur->entry); -+ found = cur; -+ break; -+ } -+ } -+ -+ LeaveCriticalSection(&this->cs); -+ -+ if (found) -+ { -+ IMFAsyncResult_Release(found->result); -+ if (found->object) -+ IUnknown_Release(found->object); -+ heap_free(found); -+ } -+ -+ return found ? S_OK : MF_E_UNEXPECTED; -+} -+ -+static HRESULT WINAPI container_stream_handler_GetMaxNumberOfBytesRequiredForResolution(IMFByteStreamHandler *iface, QWORD *bytes) -+{ -+ FIXME("stub (%p %p)\n", iface, bytes); -+ return E_NOTIMPL; -+} -+ -+static const IMFByteStreamHandlerVtbl container_stream_handler_vtbl = -+{ -+ container_stream_handler_QueryInterface, -+ container_stream_handler_AddRef, -+ container_stream_handler_Release, -+ container_stream_handler_BeginCreateObject, -+ container_stream_handler_EndCreateObject, -+ container_stream_handler_CancelObjectCreation, -+ container_stream_handler_GetMaxNumberOfBytesRequiredForResolution, -+}; -+ -+static HRESULT WINAPI container_stream_handler_callback_QueryInterface(IMFAsyncCallback *iface, REFIID riid, void **obj) -+{ -+ if (IsEqualIID(riid, &IID_IMFAsyncCallback) || -+ IsEqualIID(riid, &IID_IUnknown)) -+ { -+ *obj = iface; -+ IMFAsyncCallback_AddRef(iface); -+ return S_OK; -+ } -+ -+ WARN("Unsupported %s.\n", debugstr_guid(riid)); -+ *obj = NULL; -+ return E_NOINTERFACE; -+} -+ -+static ULONG WINAPI container_stream_handler_callback_AddRef(IMFAsyncCallback *iface) -+{ -+ struct container_stream_handler *handler = impl_from_IMFAsyncCallback(iface); -+ return IMFByteStreamHandler_AddRef(&handler->IMFByteStreamHandler_iface); -+} -+ -+static ULONG WINAPI container_stream_handler_callback_Release(IMFAsyncCallback *iface) -+{ -+ struct container_stream_handler *handler = impl_from_IMFAsyncCallback(iface); -+ return IMFByteStreamHandler_Release(&handler->IMFByteStreamHandler_iface); -+} -+ -+static HRESULT WINAPI container_stream_handler_callback_GetParameters(IMFAsyncCallback *iface, DWORD *flags, DWORD *queue) -+{ -+ return E_NOTIMPL; -+} -+ -+static HRESULT container_stream_handler_create_object(struct container_stream_handler *This, WCHAR *url, IMFByteStream *stream, DWORD flags, -+ IPropertyStore *props, IUnknown **out_object, MF_OBJECT_TYPE *out_obj_type) -+{ -+ TRACE("(%p %s %p %u %p %p %p)\n", This, debugstr_w(url), stream, flags, props, out_object, out_obj_type); -+ -+ if (flags & MF_RESOLUTION_MEDIASOURCE) -+ { -+ HRESULT hr; -+ struct media_source *new_source; -+ -+ if (FAILED(hr = media_source_constructor(stream, This->type, &new_source))) -+ return hr; -+ -+ TRACE("->(%p)\n", new_source); -+ -+ *out_object = (IUnknown*)&new_source->IMFMediaSource_iface; -+ *out_obj_type = MF_OBJECT_MEDIASOURCE; -+ -+ return S_OK; -+ } -+ else -+ { -+ FIXME("flags = %08x\n", flags); -+ return E_NOTIMPL; -+ } -+} -+ -+static HRESULT WINAPI container_stream_handler_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) -+{ -+ struct container_stream_handler *handler = impl_from_IMFAsyncCallback(iface); -+ struct container_stream_handler_result *handler_result; -+ MF_OBJECT_TYPE obj_type = MF_OBJECT_INVALID; -+ IUnknown *object = NULL, *context_object; -+ struct create_object_context *context; -+ IMFAsyncResult *caller; -+ HRESULT hr; -+ -+ caller = (IMFAsyncResult *)IMFAsyncResult_GetStateNoAddRef(result); -+ -+ if (FAILED(hr = IMFAsyncResult_GetObject(result, &context_object))) -+ { -+ WARN("Expected context set for callee result.\n"); -+ return hr; -+ } -+ -+ context = impl_from_IUnknown(context_object); -+ -+ hr = container_stream_handler_create_object(handler, context->url, context->stream, context->flags, context->props, &object, &obj_type); -+ -+ handler_result = heap_alloc(sizeof(*handler_result)); -+ if (handler_result) -+ { -+ handler_result->result = caller; -+ IMFAsyncResult_AddRef(handler_result->result); -+ handler_result->obj_type = obj_type; -+ handler_result->object = object; -+ -+ EnterCriticalSection(&handler->cs); -+ list_add_tail(&handler->results, &handler_result->entry); -+ LeaveCriticalSection(&handler->cs); -+ } -+ else -+ { -+ if (object) -+ IUnknown_Release(object); -+ hr = E_OUTOFMEMORY; -+ } -+ -+ IUnknown_Release(&context->IUnknown_iface); -+ -+ IMFAsyncResult_SetStatus(caller, hr); -+ MFInvokeCallback(caller); -+ -+ return S_OK; -+} -+ -+static const IMFAsyncCallbackVtbl container_stream_handler_callback_vtbl = -+{ -+ container_stream_handler_callback_QueryInterface, -+ container_stream_handler_callback_AddRef, -+ container_stream_handler_callback_Release, -+ container_stream_handler_callback_GetParameters, -+ container_stream_handler_callback_Invoke, -+}; -+ -+HRESULT container_stream_handler_construct(REFIID riid, void **obj, enum source_type type) -+{ -+ struct container_stream_handler *this; -+ HRESULT hr; -+ -+ TRACE("%s, %p.\n", debugstr_guid(riid), obj); -+ -+ this = heap_alloc_zero(sizeof(*this)); -+ if (!this) -+ return E_OUTOFMEMORY; -+ -+ list_init(&this->results); -+ InitializeCriticalSection(&this->cs); -+ -+ this->type = type; -+ this->IMFByteStreamHandler_iface.lpVtbl = &container_stream_handler_vtbl; -+ this->IMFAsyncCallback_iface.lpVtbl = &container_stream_handler_callback_vtbl; -+ this->refcount = 1; -+ -+ hr = IMFByteStreamHandler_QueryInterface(&this->IMFByteStreamHandler_iface, riid, obj); -+ IMFByteStreamHandler_Release(&this->IMFByteStreamHandler_iface); -+ -+ return hr; -+} -\ No newline at end of file -diff --git a/dlls/winegstreamer/mfplat.c b/dlls/winegstreamer/mfplat.c -index 55b9b08876..16e55247de 100644 ---- a/dlls/winegstreamer/mfplat.c -+++ b/dlls/winegstreamer/mfplat.c -@@ -398,6 +398,11 @@ failed: - return hr; - } - -+static HRESULT mp4_stream_handler_create(REFIID riid, void **ret) -+{ -+ return container_stream_handler_construct(riid, ret, SOURCE_TYPE_MPEG_4); -+} -+ - static const struct class_object - { - const GUID *clsid; -@@ -406,6 +411,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) -@@ -414,6 +420,9 @@ HRESULT mfplat_get_class_object(REFCLSID rclsid, REFIID riid, void **obj) - unsigned int i; - HRESULT hr; - -+ if (!(init_gstreamer())) -+ return CLASS_E_CLASSNOTAVAILABLE; -+ - for (i = 0; i < ARRAY_SIZE(class_objects); ++i) - { - if (IsEqualGUID(class_objects[i].clsid, rclsid)) -diff --git a/dlls/winegstreamer/winegstreamer.rgs b/dlls/winegstreamer/winegstreamer.rgs -index 923ba673f8..0bc26761e9 100644 ---- a/dlls/winegstreamer/winegstreamer.rgs -+++ b/dlls/winegstreamer/winegstreamer.rgs -@@ -12,3 +12,35 @@ HKCR - } - } - } -+ -+HKLM -+{ -+ NoRemove 'Software' -+ { -+ NoRemove 'Microsoft' -+ { -+ NoRemove 'Windows Media Foundation' -+ { -+ NoRemove 'ByteStreamHandlers' -+ { -+ '.m4v' -+ { -+ val '{271C3902-6095-4c45-A22F-20091816EE9E}' = s 'MPEG4 Byte Stream Handler' -+ } -+ '.mp4' -+ { -+ val '{271C3902-6095-4c45-A22F-20091816EE9E}' = s 'MPEG4 Byte Stream Handler' -+ } -+ 'video/m4v' -+ { -+ val '{271C3902-6095-4c45-A22F-20091816EE9E}' = s 'MPEG4 Byte Stream Handler' -+ } -+ 'video/mp4' -+ { -+ val '{271C3902-6095-4c45-A22F-20091816EE9E}' = s 'MPEG4 Byte Stream Handler' -+ } -+ } -+ } -+ } -+ } -+} -\ No newline at end of file -diff --git a/dlls/winegstreamer/winegstreamer_classes.idl b/dlls/winegstreamer/winegstreamer_classes.idl -index fa0e178405..997a28b052 100644 ---- a/dlls/winegstreamer/winegstreamer_classes.idl -+++ b/dlls/winegstreamer/winegstreamer_classes.idl -@@ -54,3 +54,10 @@ coclass Gstreamer_Splitter {} - uuid(88753b26-5b24-49bd-b2e7-0c445c78c982) - ] - coclass VideoProcessorMFT {} -+ -+[ -+ helpstring("MP4 Byte Stream Handler"), -+ threading(both), -+ uuid(271c3902-6095-4c45-a22f-20091816ee9e) -+] -+coclass MPEG4ByteStreamHandler {} -diff --git a/include/mfidl.idl b/include/mfidl.idl -index 4ceeb707bd..fc13dfba7a 100644 ---- a/include/mfidl.idl -+++ b/include/mfidl.idl -@@ -1241,3 +1241,4 @@ cpp_quote("EXTERN_GUID(MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_ACTIVATE, 0xba491365, - cpp_quote("EXTERN_GUID(MF_ACTIVATE_CUSTOM_VIDEO_PRESENTER_FLAGS, 0xba491366, 0xbe50, 0x451e, 0x95, 0xab, 0x6d, 0x4a, 0xcc, 0xc7, 0xda, 0xd8);") - - 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.28.0 - diff --git a/patches/mfplat-streaming-support/0008-winegstreamer-Implement-IMFMediaSource-Shutdown.patch b/patches/mfplat-streaming-support/0008-winegstreamer-Implement-IMFMediaSource-Shutdown.patch deleted file mode 100644 index dd533aab..00000000 --- a/patches/mfplat-streaming-support/0008-winegstreamer-Implement-IMFMediaSource-Shutdown.patch +++ /dev/null @@ -1,154 +0,0 @@ -From 431129df1f3ee134e792b05456325c91d76a683d Mon Sep 17 00:00:00 2001 -From: Derek Lesho -Date: Mon, 30 Mar 2020 15:19:01 -0500 -Subject: [PATCH 08/54] winegstreamer: Implement IMFMediaSource::Shutdown. - -Signed-off-by: Derek Lesho ---- - dlls/mfplat/tests/mfplat.c | 2 +- - dlls/winegstreamer/media_source.c | 39 +++++++++++++++++++++++++++++-- - 2 files changed, 38 insertions(+), 3 deletions(-) - -diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c -index c9548c6b18..af7e0d0459 100644 ---- a/dlls/mfplat/tests/mfplat.c -+++ b/dlls/mfplat/tests/mfplat.c -@@ -626,13 +626,13 @@ todo_wine - IMFMediaTypeHandler_Release(handler); - IMFPresentationDescriptor_Release(descriptor); - -+skip_source_tests: - hr = IMFMediaSource_Shutdown(mediasource); - ok(hr == S_OK, "Unexpected hr %#x.\n", hr); - - hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, NULL); - ok(hr == MF_E_SHUTDOWN, "Unexpected hr %#x.\n", hr); - --skip_source_tests: - IMFMediaSource_Release(mediasource); - IMFByteStream_Release(stream); - -diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c -index df28f54444..09a40a0620 100644 ---- a/dlls/winegstreamer/media_source.c -+++ b/dlls/winegstreamer/media_source.c -@@ -20,6 +20,14 @@ struct media_source - IMFMediaSource IMFMediaSource_iface; - LONG ref; - IMFMediaEventQueue *event_queue; -+ enum -+ { -+ SOURCE_OPENING, -+ SOURCE_STOPPED, /* (READY) */ -+ SOURCE_PAUSED, -+ SOURCE_RUNNING, -+ SOURCE_SHUTDOWN, -+ } state; - }; - - static inline struct media_source *impl_from_IMFMediaSource(IMFMediaSource *iface) -@@ -81,6 +89,9 @@ static HRESULT WINAPI media_source_GetEvent(IMFMediaSource *iface, DWORD flags, - - TRACE("(%p)->(%#x, %p)\n", source, flags, event); - -+ if (source->state == SOURCE_SHUTDOWN) -+ return MF_E_SHUTDOWN; -+ - return IMFMediaEventQueue_GetEvent(source->event_queue, flags, event); - } - -@@ -90,6 +101,9 @@ static HRESULT WINAPI media_source_BeginGetEvent(IMFMediaSource *iface, IMFAsync - - TRACE("(%p)->(%p, %p)\n", source, callback, state); - -+ if (source->state == SOURCE_SHUTDOWN) -+ return MF_E_SHUTDOWN; -+ - return IMFMediaEventQueue_BeginGetEvent(source->event_queue, callback, state); - } - -@@ -99,6 +113,9 @@ static HRESULT WINAPI media_source_EndGetEvent(IMFMediaSource *iface, IMFAsyncRe - - TRACE("(%p)->(%p, %p)\n", source, result, event); - -+ if (source->state == SOURCE_SHUTDOWN) -+ return MF_E_SHUTDOWN; -+ - return IMFMediaEventQueue_EndGetEvent(source->event_queue, result, event); - } - -@@ -109,6 +126,9 @@ static HRESULT WINAPI media_source_QueueEvent(IMFMediaSource *iface, MediaEventT - - TRACE("(%p)->(%d, %s, %#x, %p)\n", source, event_type, debugstr_guid(ext_type), hr, value); - -+ if (source->state == SOURCE_SHUTDOWN) -+ return MF_E_SHUTDOWN; -+ - return IMFMediaEventQueue_QueueEventParamVar(source->event_queue, event_type, ext_type, hr, value); - } - -@@ -118,6 +138,9 @@ static HRESULT WINAPI media_source_GetCharacteristics(IMFMediaSource *iface, DWO - - FIXME("(%p)->(%p): stub\n", source, characteristics); - -+ if (source->state == SOURCE_SHUTDOWN) -+ return MF_E_SHUTDOWN; -+ - return E_NOTIMPL; - } - -@@ -127,6 +150,9 @@ static HRESULT WINAPI media_source_CreatePresentationDescriptor(IMFMediaSource * - - FIXME("(%p)->(%p): stub\n", source, descriptor); - -+ if (source->state == SOURCE_SHUTDOWN) -+ return MF_E_SHUTDOWN; -+ - return E_NOTIMPL; - } - -@@ -137,6 +163,9 @@ static HRESULT WINAPI media_source_Start(IMFMediaSource *iface, IMFPresentationD - - FIXME("(%p)->(%p, %p, %p): stub\n", source, descriptor, time_format, start_position); - -+ if (source->state == SOURCE_SHUTDOWN) -+ return MF_E_SHUTDOWN; -+ - return E_NOTIMPL; - } - -@@ -146,6 +175,9 @@ static HRESULT WINAPI media_source_Stop(IMFMediaSource *iface) - - FIXME("(%p): stub\n", source); - -+ if (source->state == SOURCE_SHUTDOWN) -+ return MF_E_SHUTDOWN; -+ - return E_NOTIMPL; - } - -@@ -170,9 +202,10 @@ static HRESULT WINAPI media_source_Shutdown(IMFMediaSource *iface) - { - struct media_source *source = impl_from_IMFMediaSource(iface); - -- FIXME("(%p): stub\n", source); -+ TRACE("(%p)\n", source); - -- return E_NOTIMPL; -+ source->state = SOURCE_SHUTDOWN; -+ return media_source_teardown(source); - } - - static const IMFMediaSourceVtbl IMFMediaSource_vtbl = -@@ -203,6 +236,8 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, enum source_t - if (FAILED(hr = MFCreateEventQueue(&object->event_queue))) - goto fail; - -+ object->state = SOURCE_STOPPED; -+ - object->IMFMediaSource_iface.lpVtbl = &IMFMediaSource_vtbl; - object->ref = 1; - --- -2.28.0 - diff --git a/patches/mfplat-streaming-support/definition b/patches/mfplat-streaming-support/definition index 46a40d0b..4922e06b 100644 --- a/patches/mfplat-streaming-support/definition +++ b/patches/mfplat-streaming-support/definition @@ -1 +1,2 @@ Fixes: [49692] mfplat: Improved support for multiple video formats. +Disabled: True diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index b3c3fccd..da836828 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -52,7 +52,7 @@ usage() # Get the upstream commit sha upstream_commit() { - echo "432858b285d2b63eca6f99a162c9a13dd6e6ac71" + echo "7ec069d85f5235db98e57291825b9d602ae47ed5" } # Show version information @@ -148,7 +148,6 @@ patch_enable_all () enable_krnl386_exe16_GDT_LDT_Emulation="$1" enable_krnl386_exe16_Invalid_Console_Handles="$1" enable_loader_KeyboardLayouts="$1" - enable_mfplat_streaming_support="$1" enable_mmsystem_dll16_MIDIHDR_Refcount="$1" enable_mountmgr_DosDevices="$1" enable_mscoree_CorValidateImage="$1" @@ -537,9 +536,6 @@ patch_enable () loader-KeyboardLayouts) enable_loader_KeyboardLayouts="$2" ;; - mfplat-streaming-support) - enable_mfplat_streaming_support="$2" - ;; mmsystem.dll16-MIDIHDR_Refcount) enable_mmsystem_dll16_MIDIHDR_Refcount="$2" ;; @@ -3117,135 +3113,6 @@ if test "$enable_loader_KeyboardLayouts" -eq 1; then ) >> "$patchlist" fi -# Patchset mfplat-streaming-support -# | -# | This patchset fixes the following Wine bugs: -# | * [#49692] mfplat: Improved support for multiple video formats. -# | -# | Modified files: -# | * dlls/mf/Makefile.in, dlls/mf/handler.c, dlls/mf/handler.h, dlls/mf/main.c, dlls/mf/session.c, dlls/mf/tests/mf.c, -# | dlls/mf/topology.c, dlls/mfplat/mediatype.c, dlls/mfplat/tests/mfplat.c, dlls/mfreadwrite/reader.c, -# | dlls/winegstreamer/Makefile.in, dlls/winegstreamer/colorconvert.c, dlls/winegstreamer/gst_cbs.c, -# | dlls/winegstreamer/gst_cbs.h, dlls/winegstreamer/gst_private.h, dlls/winegstreamer/main.c, -# | dlls/winegstreamer/media_source.c, dlls/winegstreamer/mf_decode.c, dlls/winegstreamer/mfplat.c, -# | dlls/winegstreamer/winegstreamer.rgs, dlls/winegstreamer/winegstreamer_classes.idl, include/mfidl.idl, -# | tools/make_makefiles, tools/makedep.c -# | -if test "$enable_mfplat_streaming_support" -eq 1; then - patch_apply mfplat-streaming-support/0001-Revert-mf-topoloader-Add-a-structure-for-iterative-b.patch - patch_apply mfplat-streaming-support/0002-Revert-mf-topoloader-Clone-source-nodes-as-a-first-l.patch - patch_apply mfplat-streaming-support/0003-Revert-mf-topoloader-Switch-to-public-interface-for-.patch - patch_apply mfplat-streaming-support/0004-mf-tests-Sink-objects-are-stream-sinks-not-media-sin.patch - patch_apply mfplat-streaming-support/0005-mf-tests-Add-tests-for-the-topology-loader.patch - patch_apply mfplat-streaming-support/0006-mf-Partially-implement-the-topology-loader.patch - patch_apply mfplat-streaming-support/0007-Implement-stub-bytestream-handler-and-source.patch - patch_apply mfplat-streaming-support/0008-winegstreamer-Implement-IMFMediaSource-Shutdown.patch - patch_apply mfplat-streaming-support/0009-winegstreamer-Add-a-GstPad-wrapping-the-media-source.patch - patch_apply mfplat-streaming-support/0010-winegstreamer-Find-an-appropriate-demuxer-for-the-so.patch - patch_apply mfplat-streaming-support/0011-winegstreamer-Use-the-demuxer-to-establish-IMFMediaS.patch - patch_apply mfplat-streaming-support/0012-winegstreamer-Implement-IMFMediaStream-GetStreamDesc.patch - patch_apply mfplat-streaming-support/0013-winegstreamer-Translate-H.264-caps-to-attributes.patch - patch_apply mfplat-streaming-support/0014-winegstreamer-Translate-WMV-caps-to-attributes.patch - patch_apply mfplat-streaming-support/0015-winegstreamer-Translate-AAC-caps-to-attributes.patch - patch_apply mfplat-streaming-support/0016-winegstreamer-Translate-MPEG-4-Section-2-caps-to-att.patch - patch_apply mfplat-streaming-support/0017-winegstreamer-Translate-WMA-caps-to-attributes.patch - patch_apply mfplat-streaming-support/0018-winegstreamer-Implement-IMFMediaSource-CreatePresent.patch - patch_apply mfplat-streaming-support/0019-winegstreamer-Implement-IMFMediaSource-Start.patch - patch_apply mfplat-streaming-support/0020-winegstreamer-Insert-parser-into-pipeline-to-rectify.patch - patch_apply mfplat-streaming-support/0021-winegstreamer-Implement-IMFMediaStream-RequestSample.patch - patch_apply mfplat-streaming-support/0022-winegstreamer-Implement-IMFMediaSource-GetCharacteri.patch - patch_apply mfplat-streaming-support/0023-winegstreamer-Calculate-the-MF_PD_DURATION-of-the-me.patch - patch_apply mfplat-streaming-support/0024-tools-Add-support-for-multiple-parent-directories.patch - patch_apply mfplat-streaming-support/0025-mf-Introduce-handler-helper.patch - patch_apply mfplat-streaming-support/0026-winegstreamer-Introduce-IMFMediaType-GstCaps-convert.patch - patch_apply mfplat-streaming-support/0027-winegstreamer-Translate-H.264-attributes-to-caps.patch - patch_apply mfplat-streaming-support/0028-winegstreamer-Translate-WMV-attributes-to-caps.patch - patch_apply mfplat-streaming-support/0029-winegstreamer-Translate-AAC-attributes-to-caps.patch - patch_apply mfplat-streaming-support/0030-winegstreamer-Translate-MPEG-4-Section-2-attributes-.patch - patch_apply mfplat-streaming-support/0031-winegstreamer-Translate-WMA-attributes-to-caps.patch - patch_apply mfplat-streaming-support/0032-Introduce-IMFSample-GstBuffer-converter.patch - patch_apply mfplat-streaming-support/0033-winegstreamer-Implement-decoder-MFT-on-gstreamer.patch - patch_apply mfplat-streaming-support/0034-mfreadwrite-Select-all-streams-when-creating-a-sourc.patch - patch_apply mfplat-streaming-support/0035-Miscellaneous.patch - patch_apply mfplat-streaming-support/0036-WMV.patch - patch_apply mfplat-streaming-support/0037-mf-Ask-for-more-samples-from-upstream-node-when-upon.patch - patch_apply mfplat-streaming-support/0038-mf-Miscelaneous-fixes-to-topology-resolution.patch - patch_apply mfplat-streaming-support/0039-Rewrite-branch-resolver.patch - patch_apply mfplat-streaming-support/0040-winegstreamer-Implement-IMFMedisStream-GetMediaSourc.patch - patch_apply mfplat-streaming-support/0041-Expose-PCM-output-type-on-AAC-decoder.patch - patch_apply mfplat-streaming-support/0042-Set-BPS-on-AAC.patch - patch_apply mfplat-streaming-support/0043-mfplat-Add-I420-format-information.patch - patch_apply mfplat-streaming-support/0044-winegstreamer-Implement-Color-Converter-MFT.patch - patch_apply mfplat-streaming-support/0045-HACK-Set-BPS-to-16-for-output-template.patch - patch_apply mfplat-streaming-support/0046-Set-wait-on-eos-to-allow-other-streams-to-continue-w.patch - patch_apply mfplat-streaming-support/0047-Report-streams-backwards-and-only-select-one-of-each.patch - patch_apply mfplat-streaming-support/0048-winegstreamer-Implement-IMFMediaSource-Stop.patch - patch_apply mfplat-streaming-support/0049-winegstreamer-Introduce-MPEG-4-Section-2-video-decod.patch - patch_apply mfplat-streaming-support/0050-HACK-Switch-between-all-selection-streams-on-MF_SOUR.patch - patch_apply mfplat-streaming-support/0051-winegstreamer-Introduce-WMA-audio-decoder.patch - patch_apply mfplat-streaming-support/0052-winegstreamer-Fix-unrecognized-format-errors-when-tr.patch - patch_apply mfplat-streaming-support/0053-winegstreamer-Translate-WMV3-attributes-to-caps.patch - patch_apply mfplat-streaming-support/0054-winegstreamer-expose-NV12-as-the-first-color-space-i.patch - patch_apply mfplat-streaming-support/0055-winegstreamer-Support-eAVEncH264VProfile_Constrained.patch - ( - printf '%s\n' '+ { "Alistair Leslie-Hughes", "Revert \"mf/topoloader: Add a structure for iterative branch resolution.\".", 1 },'; - printf '%s\n' '+ { "Alistair Leslie-Hughes", "Revert \"mf/topoloader: Clone source nodes as a first layer of resulting topology.\".", 1 },'; - printf '%s\n' '+ { "Alistair Leslie-Hughes", "Revert \"mf/topoloader: Switch to public interface for initial topology validation.\".", 1 },'; - printf '%s\n' '+ { "Sergio Gómez Del Real", "mf/tests: Sink objects are stream sinks, not media sinks.", 1 },'; - printf '%s\n' '+ { "Sergio Gómez Del Real", "mf/tests: Add tests for the topology loader.", 1 },'; - printf '%s\n' '+ { "Sergio Gómez Del Real", "mf: Partially implement the topology loader.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "Implement stub bytestream handler and source.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Implement IMFMediaSource::Shutdown.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Add a GstPad wrapping the media source'\''s bytestream.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Find an appropriate demuxer for the source.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Use the demuxer to establish IMFMediaStreams.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Implement IMFMediaStream::GetStreamDescriptor.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Translate H.264 caps to attributes.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Translate WMV caps to attributes.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Translate AAC caps to attributes.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Translate MPEG-4 Section-2 caps to attributes.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Translate WMA caps to attributes.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Implement IMFMediaSource::CreatePresentationDescriptor.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Implement IMFMediaSource::Start.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Insert parser into pipeline to rectify type differences.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Implement IMFMediaStream::RequestSample.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Implement IMFMediaSource::GetCharacteristics.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Calculate the MF_PD_DURATION of the media source'\''s PD.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "tools: Add support for multiple parent directories.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "mf: Introduce handler helper.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Introduce IMFMediaType -> GstCaps converter.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Translate H.264 attributes to caps.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Translate WMV attributes to caps.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Translate AAC attributes to caps.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Translate MPEG-4 Section-2 attributes to caps.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Translate WMA attributes to caps.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "Introduce IMFSample -> GstBuffer converter.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Implement decoder MFT on gstreamer.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "mfreadwrite: Select all streams when creating a source reader.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "Miscellaneous.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "WMV.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "mf: Ask for more samples from upstream node when upon MF_E_TRANSFORM_NEED_MORE_INPUT.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "mf: Miscelaneous fixes to topology resolution.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "Rewrite branch resolver.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Implement IMFMedisStream::GetMediaSource.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "Expose PCM output type on AAC decoder.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "Set BPS on AAC.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "mfplat: Add I420 format information.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Implement Color Converter MFT.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "HACK: Set BPS to 16 for output template.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "Set \"wait-on-eos\" to allow other streams to continue while appsink buffers.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "Report streams backwards and only select one of each stream type.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Implement IMFMediaSource::Stop.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Introduce MPEG-4 Section-2 video decoder.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "HACK: Switch between all selection streams on MF_SOURCE_READER_ANY_STREAM.", 1 },'; - printf '%s\n' '+ { "Derek Lesho", "winegstreamer: Introduce WMA audio decoder.", 1 },'; - printf '%s\n' '+ { "Victor Hermann Chiletto", "winegstreamer: Fix unrecognized format errors when transforming caps to media type.", 1 },'; - printf '%s\n' '+ { "Victor Hermann Chiletto", "winegstreamer: Translate WMV3 attributes to caps.", 1 },'; - printf '%s\n' '+ { "Victor Hermann Chiletto", "winegstreamer: Expose NV12 as the first color space in IMFTransform::GetOutputAvailableType.", 1 },'; - printf '%s\n' '+ { "Alistair Leslie-Hughes", "winegstreamer: Support eAVEncH264VProfile_ConstrainedBase media type.", 1 },'; - ) >> "$patchlist" -fi - # Patchset mmsystem.dll16-MIDIHDR_Refcount # | # | This patchset fixes the following Wine bugs: diff --git a/staging/upstream-commit b/staging/upstream-commit index 280702bd..069f40c9 100644 --- a/staging/upstream-commit +++ b/staging/upstream-commit @@ -1 +1 @@ -432858b285d2b63eca6f99a162c9a13dd6e6ac71 +7ec069d85f5235db98e57291825b9d602ae47ed5