From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/media_source.c | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-)
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index 9e75e82063d..985aab8e434 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -1778,7 +1778,6 @@ struct create_object_context IUnknown IUnknown_iface; LONG refcount;
- IPropertyStore *props; IMFByteStream *stream; WCHAR *url; DWORD flags; @@ -1824,8 +1823,6 @@ static ULONG WINAPI create_object_context_Release(IUnknown *iface)
if (!refcount) { - if (context->props) - IPropertyStore_Release(context->props); if (context->stream) IMFByteStream_Release(context->stream); free(context->url); @@ -1866,9 +1863,6 @@ static HRESULT WINAPI stream_handler_BeginCreateObject(IMFByteStreamHandler *ifa
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) @@ -1991,9 +1985,9 @@ static HRESULT WINAPI stream_handler_callback_GetParameters(IMFAsyncCallback *if }
static HRESULT stream_handler_create_object(struct stream_handler *handler, WCHAR *url, IMFByteStream *stream, DWORD flags, - IPropertyStore *props, IUnknown **out_object, MF_OBJECT_TYPE *out_obj_type) + IUnknown **out_object, MF_OBJECT_TYPE *out_obj_type) { - TRACE("%p, %s, %p, %#lx, %p, %p, %p.\n", handler, debugstr_w(url), stream, flags, props, out_object, out_obj_type); + TRACE("%p, %s, %p, %#lx, %p, %p.\n", handler, debugstr_w(url), stream, flags, out_object, out_obj_type);
if (flags & MF_RESOLUTION_MEDIASOURCE) { @@ -2038,7 +2032,7 @@ static HRESULT WINAPI stream_handler_callback_Invoke(IMFAsyncCallback *iface, IM context = impl_from_IUnknown(context_object);
if (FAILED(hr = stream_handler_create_object(handler, context->url, context->stream, - context->flags, context->props, &object, &obj_type))) + context->flags, &object, &obj_type))) WARN("Failed to create object, hr %#lx\n", hr); else {
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/media_source.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-)
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index 985aab8e434..a5423411096 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -1823,8 +1823,7 @@ static ULONG WINAPI create_object_context_Release(IUnknown *iface)
if (!refcount) { - if (context->stream) - IMFByteStream_Release(context->stream); + IMFByteStream_Release(context->stream); free(context->url); free(context); } @@ -1852,6 +1851,8 @@ static HRESULT WINAPI stream_handler_BeginCreateObject(IMFByteStreamHandler *ifa if (cancel_cookie) *cancel_cookie = NULL;
+ if (!stream) + return E_INVALIDARG; if (FAILED(hr = MFCreateAsyncResult(NULL, callback, state, &caller))) return hr;
@@ -1865,16 +1866,9 @@ static HRESULT WINAPI stream_handler_BeginCreateObject(IMFByteStreamHandler *ifa context->refcount = 1; context->flags = flags; context->stream = stream; - if (context->stream) - IMFByteStream_AddRef(context->stream); + IMFByteStream_AddRef(context->stream); if (url) context->url = wcsdup(url); - if (!context->stream) - { - IMFAsyncResult_Release(caller); - IUnknown_Release(&context->IUnknown_iface); - return E_OUTOFMEMORY; - }
hr = MFCreateAsyncResult(&context->IUnknown_iface, &handler->IMFAsyncCallback_iface, (IUnknown *)caller, &item); IUnknown_Release(&context->IUnknown_iface);
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/media_source.c | 40 ++++++++++++------------------- 1 file changed, 15 insertions(+), 25 deletions(-)
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index a5423411096..0fb41c0e8db 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -1780,7 +1780,6 @@ struct create_object_context
IMFByteStream *stream; WCHAR *url; - DWORD flags; };
static struct create_object_context *impl_from_IUnknown(IUnknown *iface) @@ -1853,6 +1852,9 @@ static HRESULT WINAPI stream_handler_BeginCreateObject(IMFByteStreamHandler *ifa
if (!stream) return E_INVALIDARG; + if (flags != MF_RESOLUTION_MEDIASOURCE) + FIXME("Unimplemented flags %#lx\n", flags); + if (FAILED(hr = MFCreateAsyncResult(NULL, callback, state, &caller))) return hr;
@@ -1864,7 +1866,6 @@ static HRESULT WINAPI stream_handler_BeginCreateObject(IMFByteStreamHandler *ifa
context->IUnknown_iface.lpVtbl = &create_object_context_vtbl; context->refcount = 1; - context->flags = flags; context->stream = stream; IMFByteStream_AddRef(context->stream); if (url) @@ -1978,37 +1979,27 @@ static HRESULT WINAPI stream_handler_callback_GetParameters(IMFAsyncCallback *if return E_NOTIMPL; }
-static HRESULT stream_handler_create_object(struct stream_handler *handler, WCHAR *url, IMFByteStream *stream, DWORD flags, - IUnknown **out_object, MF_OBJECT_TYPE *out_obj_type) +static HRESULT stream_handler_create_object(struct stream_handler *handler, WCHAR *url, IMFByteStream *stream, + IUnknown **out_object) { - TRACE("%p, %s, %p, %#lx, %p, %p.\n", handler, debugstr_w(url), stream, flags, out_object, out_obj_type); + HRESULT hr; + struct media_source *new_source;
- if (flags & MF_RESOLUTION_MEDIASOURCE) - { - HRESULT hr; - struct media_source *new_source; + TRACE("%p, %s, %p, %p.\n", handler, debugstr_w(url), stream, out_object);
- if (FAILED(hr = media_source_constructor(stream, &new_source))) - return hr; + if (FAILED(hr = media_source_constructor(stream, &new_source))) + return hr;
- TRACE("->(%p)\n", new_source); + TRACE("->(%p)\n", new_source);
- *out_object = (IUnknown*)&new_source->IMFMediaSource_iface; - *out_obj_type = MF_OBJECT_MEDIASOURCE; + *out_object = (IUnknown*)&new_source->IMFMediaSource_iface;
- return S_OK; - } - else - { - FIXME("Unhandled flags %#lx.\n", flags); - return E_NOTIMPL; - } + return S_OK; }
static HRESULT WINAPI stream_handler_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) { struct stream_handler *handler = impl_from_IMFAsyncCallback(iface); - MF_OBJECT_TYPE obj_type = MF_OBJECT_INVALID; IUnknown *object = NULL, *context_object; struct create_object_context *context; struct result_entry *entry; @@ -2025,12 +2016,11 @@ static HRESULT WINAPI stream_handler_callback_Invoke(IMFAsyncCallback *iface, IM
context = impl_from_IUnknown(context_object);
- if (FAILED(hr = stream_handler_create_object(handler, context->url, context->stream, - context->flags, &object, &obj_type))) + if (FAILED(hr = stream_handler_create_object(handler, context->url, context->stream, &object))) WARN("Failed to create object, hr %#lx\n", hr); else { - if (FAILED(hr = result_entry_create(caller, obj_type, object, &entry))) + if (FAILED(hr = result_entry_create(caller, MF_OBJECT_MEDIASOURCE, object, &entry))) WARN("Failed to create handler result, hr %#lx\n", hr); else {
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/media_source.c | 31 +++++++------------------------ 1 file changed, 7 insertions(+), 24 deletions(-)
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index 0fb41c0e8db..cc501ce5c59 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -1520,7 +1520,7 @@ static void media_source_init_descriptors(struct media_source *source) } }
-static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_source **out_media_source) +static HRESULT media_source_create(IMFByteStream *bytestream, IMFMediaSource **out) { unsigned int stream_count = UINT_MAX; struct media_source *object; @@ -1622,10 +1622,11 @@ static HRESULT media_source_constructor(IMFByteStream *bytestream, struct media_ media_source_init_descriptors(object); object->state = SOURCE_STOPPED;
- *out_media_source = object; + *out = &object->IMFMediaSource_iface; + TRACE("Created IMFMediaSource %p\n", *out); return S_OK;
- fail: +fail: WARN("Failed to construct MFMediaSource, hr %#lx.\n", hr);
while (object->streams && object->stream_count--) @@ -1979,28 +1980,10 @@ static HRESULT WINAPI stream_handler_callback_GetParameters(IMFAsyncCallback *if return E_NOTIMPL; }
-static HRESULT stream_handler_create_object(struct stream_handler *handler, WCHAR *url, IMFByteStream *stream, - IUnknown **out_object) -{ - HRESULT hr; - struct media_source *new_source; - - TRACE("%p, %s, %p, %p.\n", handler, debugstr_w(url), stream, out_object); - - if (FAILED(hr = media_source_constructor(stream, &new_source))) - return hr; - - TRACE("->(%p)\n", new_source); - - *out_object = (IUnknown*)&new_source->IMFMediaSource_iface; - - return S_OK; -} - static HRESULT WINAPI stream_handler_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) { struct stream_handler *handler = impl_from_IMFAsyncCallback(iface); - IUnknown *object = NULL, *context_object; + IUnknown *object, *context_object; struct create_object_context *context; struct result_entry *entry; IMFAsyncResult *caller; @@ -2016,8 +1999,8 @@ static HRESULT WINAPI stream_handler_callback_Invoke(IMFAsyncCallback *iface, IM
context = impl_from_IUnknown(context_object);
- if (FAILED(hr = stream_handler_create_object(handler, context->url, context->stream, &object))) - WARN("Failed to create object, hr %#lx\n", hr); + if (FAILED(hr = media_source_create(context->stream, (IMFMediaSource **)&object))) + WARN("Failed to create media source, hr %#lx\n", hr); else { if (FAILED(hr = result_entry_create(caller, MF_OBJECT_MEDIASOURCE, object, &entry)))
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winegstreamer/media_source.c | 52 ++++++++++++------------------- 1 file changed, 20 insertions(+), 32 deletions(-)
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c index cc501ce5c59..891961a6ccd 100644 --- a/dlls/winegstreamer/media_source.c +++ b/dlls/winegstreamer/media_source.c @@ -1779,6 +1779,7 @@ struct create_object_context IUnknown IUnknown_iface; LONG refcount;
+ IMFAsyncResult *result; IMFByteStream *stream; WCHAR *url; }; @@ -1823,6 +1824,7 @@ static ULONG WINAPI create_object_context_Release(IUnknown *iface)
if (!refcount) { + IMFAsyncResult_Release(context->result); IMFByteStream_Release(context->stream); free(context->url); free(context); @@ -1843,7 +1845,7 @@ static HRESULT WINAPI stream_handler_BeginCreateObject(IMFByteStreamHandler *ifa { struct stream_handler *handler = impl_from_IMFByteStreamHandler(iface); struct create_object_context *context; - IMFAsyncResult *caller, *item; + IMFAsyncResult *result; HRESULT hr;
TRACE("%p, %s, %#lx, %p, %p, %p, %p.\n", iface, debugstr_w(url), flags, props, cancel_cookie, callback, state); @@ -1856,12 +1858,12 @@ static HRESULT WINAPI stream_handler_BeginCreateObject(IMFByteStreamHandler *ifa if (flags != MF_RESOLUTION_MEDIASOURCE) FIXME("Unimplemented flags %#lx\n", flags);
- if (FAILED(hr = MFCreateAsyncResult(NULL, callback, state, &caller))) + if (FAILED(hr = MFCreateAsyncResult(NULL, callback, state, &result))) return hr;
if (!(context = calloc(1, sizeof(*context)))) { - IMFAsyncResult_Release(caller); + IMFAsyncResult_Release(result); return E_OUTOFMEMORY; }
@@ -1869,25 +1871,21 @@ static HRESULT WINAPI stream_handler_BeginCreateObject(IMFByteStreamHandler *ifa context->refcount = 1; context->stream = stream; IMFByteStream_AddRef(context->stream); + context->result = result; + IMFAsyncResult_AddRef(context->result); if (url) context->url = wcsdup(url);
- hr = MFCreateAsyncResult(&context->IUnknown_iface, &handler->IMFAsyncCallback_iface, (IUnknown *)caller, &item); + hr = MFPutWorkItem(MFASYNC_CALLBACK_QUEUE_IO, &handler->IMFAsyncCallback_iface, &context->IUnknown_iface); 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); + if (SUCCEEDED(hr) && cancel_cookie) + { + *cancel_cookie = (IUnknown *)result; + IUnknown_AddRef(*cancel_cookie); } - IMFAsyncResult_Release(caller); + + IMFAsyncResult_Release(result);
return hr; } @@ -1983,27 +1981,19 @@ static HRESULT WINAPI stream_handler_callback_GetParameters(IMFAsyncCallback *if static HRESULT WINAPI stream_handler_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) { struct stream_handler *handler = impl_from_IMFAsyncCallback(iface); - IUnknown *object, *context_object; + IUnknown *object, *state = IMFAsyncResult_GetStateNoAddRef(result); struct create_object_context *context; struct result_entry *entry; - 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); + if (!state || !(context = impl_from_IUnknown(state))) + return E_INVALIDARG;
if (FAILED(hr = media_source_create(context->stream, (IMFMediaSource **)&object))) WARN("Failed to create media source, hr %#lx\n", hr); else { - if (FAILED(hr = result_entry_create(caller, MF_OBJECT_MEDIASOURCE, object, &entry))) + if (FAILED(hr = result_entry_create(context->result, MF_OBJECT_MEDIASOURCE, object, &entry))) WARN("Failed to create handler result, hr %#lx\n", hr); else { @@ -2015,10 +2005,8 @@ static HRESULT WINAPI stream_handler_callback_Invoke(IMFAsyncCallback *iface, IM IUnknown_Release(object); }
- IUnknown_Release(&context->IUnknown_iface); - - IMFAsyncResult_SetStatus(caller, hr); - MFInvokeCallback(caller); + IMFAsyncResult_SetStatus(context->result, hr); + MFInvokeCallback(context->result);
return S_OK; }