Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/mf/copier.c | 4 +--
dlls/mf/mf_private.h | 3 ++-
dlls/mf/session.c | 55 +++++++++++++--------------------------
dlls/mf/topology.c | 62 +++++++++++++++++++++-----------------------
4 files changed, 52 insertions(+), 72 deletions(-)
diff --git a/dlls/mf/copier.c b/dlls/mf/copier.c
index cbdac97292b..1a07d6abefd 100644
--- a/dlls/mf/copier.c
+++ b/dlls/mf/copier.c
@@ -561,9 +561,9 @@ static const IMFTransformVtbl sample_copier_transform_vtbl =
sample_copier_transform_ProcessOutput,
};
-BOOL mf_is_sample_copier_transform(IUnknown *transform)
+BOOL mf_is_sample_copier_transform(IMFTransform *transform)
{
- return transform->lpVtbl == (IUnknownVtbl *)&sample_copier_transform_vtbl;
+ return transform->lpVtbl == &sample_copier_transform_vtbl;
}
/***********************************************************************
diff --git a/dlls/mf/mf_private.h b/dlls/mf/mf_private.h
index 0c4dde0c4fc..cc270a8cf57 100644
--- a/dlls/mf/mf_private.h
+++ b/dlls/mf/mf_private.h
@@ -80,4 +80,5 @@ static inline const char *debugstr_time(LONGLONG time)
return wine_dbg_sprintf("%s", rev);
}
-extern BOOL mf_is_sample_copier_transform(IUnknown *transform) DECLSPEC_HIDDEN;
+extern BOOL mf_is_sample_copier_transform(IMFTransform *transform) DECLSPEC_HIDDEN;
+extern HRESULT topology_node_get_object(IMFTopologyNode *node, REFIID riid, void **obj) DECLSPEC_HIDDEN;
diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index 1a7439a13c3..af0407f6a0b 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -792,7 +792,6 @@ static void session_shutdown_current_topology(struct media_session *session)
IMFTopologyNode *node;
IMFActivate *activate;
IMFMediaSink *sink;
- IUnknown *object;
WORD idx = 0;
HRESULT hr;
@@ -818,20 +817,15 @@ static void session_shutdown_current_topology(struct media_session *session)
WARN("Failed to shut down activation object for the sink, hr %#x.\n", hr);
IMFActivate_Release(activate);
}
- else if (SUCCEEDED(IMFTopologyNode_GetObject(node, &object)))
+ else if (SUCCEEDED(topology_node_get_object(node, &IID_IMFStreamSink, (void **)&stream_sink)))
{
- if (SUCCEEDED(IUnknown_QueryInterface(object, &IID_IMFStreamSink, (void **)&stream_sink)))
+ if (SUCCEEDED(IMFStreamSink_GetMediaSink(stream_sink, &sink)))
{
- if (SUCCEEDED(IMFStreamSink_GetMediaSink(stream_sink, &sink)))
- {
- IMFMediaSink_Shutdown(sink);
- IMFMediaSink_Release(sink);
- }
-
- IMFStreamSink_Release(stream_sink);
+ IMFMediaSink_Shutdown(sink);
+ IMFMediaSink_Release(sink);
}
- IUnknown_Release(object);
+ IMFStreamSink_Release(stream_sink);
}
}
}
@@ -1358,7 +1352,6 @@ static HRESULT session_append_node(struct media_session *session, IMFTopologyNod
IMFMediaType *media_type;
IMFStreamDescriptor *sd;
HRESULT hr = S_OK;
- IUnknown *object;
if (!(topo_node = heap_alloc_zero(sizeof(*topo_node))))
return E_OUTOFMEMORY;
@@ -1374,15 +1367,11 @@ static HRESULT session_append_node(struct media_session *session, IMFTopologyNod
case MF_TOPOLOGY_OUTPUT_NODE:
topo_node->u.sink.notify_cb.lpVtbl = &node_sample_allocator_cb_vtbl;
- if (FAILED(hr = IMFTopologyNode_GetObject(node, &object)))
+ if (FAILED(hr = topology_node_get_object(node, &IID_IMFStreamSink, (void **)&topo_node->object.object)))
{
- WARN("Node %s does not have associated object.\n", wine_dbgstr_longlong(topo_node->node_id));
+ WARN("Failed to get stream sink interface, hr %#x.\n", hr);
break;
}
- hr = IUnknown_QueryInterface(object, &IID_IMFStreamSink, (void **)&topo_node->object.object);
- IUnknown_Release(object);
- if (FAILED(hr))
- break;
if (FAILED(hr = IMFStreamSink_GetMediaSink(topo_node->object.sink_stream, &media_sink)))
break;
@@ -1433,14 +1422,11 @@ static HRESULT session_append_node(struct media_session *session, IMFTopologyNod
break;
case MF_TOPOLOGY_TRANSFORM_NODE:
- if (SUCCEEDED(hr = IMFTopologyNode_GetObject(node, &object)))
- {
- hr = IUnknown_QueryInterface(object, &IID_IMFTransform, (void **)&topo_node->object.transform);
- IUnknown_Release(object);
- }
- if (SUCCEEDED(hr))
+ if (SUCCEEDED(hr = topology_node_get_object(node, &IID_IMFTransform, (void **)&topo_node->object.transform)))
+ {
hr = session_set_transform_stream_info(topo_node);
+ }
else
WARN("Failed to get IMFTransform for MFT node, hr %#x.\n", hr);
@@ -2017,10 +2003,10 @@ static HRESULT WINAPI session_get_service_GetService(IMFGetService *iface, REFGU
{
IMFStreamSink *stream_sink;
IMFTopologyNode *node;
- IUnknown *vr, *object;
IMFCollection *nodes;
IMFMediaSink *sink;
unsigned int i = 0;
+ IUnknown *vr;
HRESULT hr;
EnterCriticalSection(&session->cs);
@@ -2033,23 +2019,18 @@ static HRESULT WINAPI session_get_service_GetService(IMFGetService *iface, REFGU
{
while (IMFCollection_GetElement(nodes, i++, (IUnknown **)&node) == S_OK)
{
- if (SUCCEEDED(IMFTopologyNode_GetObject(node, &object)))
+ if (SUCCEEDED(topology_node_get_object(node, &IID_IMFStreamSink, (void **)&stream_sink)))
{
- if (SUCCEEDED(IUnknown_QueryInterface(object, &IID_IMFStreamSink, (void **)&stream_sink)))
+ if (SUCCEEDED(IMFStreamSink_GetMediaSink(stream_sink, &sink)))
{
- if (SUCCEEDED(IMFStreamSink_GetMediaSink(stream_sink, &sink)))
+ if (SUCCEEDED(IMFMediaSink_QueryInterface(sink, &IID_IMFVideoRenderer, (void **)&vr)))
{
- if (SUCCEEDED(IMFMediaSink_QueryInterface(sink, &IID_IMFVideoRenderer, (void **)&vr)))
- {
- if (FAILED(hr = MFGetService(vr, service, riid, obj)))
- WARN("Failed to get service from video renderer %#x.\n", hr);
- IUnknown_Release(vr);
- }
+ if (FAILED(hr = MFGetService(vr, service, riid, obj)))
+ WARN("Failed to get service from video renderer %#x.\n", hr);
+ IUnknown_Release(vr);
}
- IMFStreamSink_Release(stream_sink);
}
-
- IUnknown_Release(object);
+ IMFStreamSink_Release(stream_sink);
}
IMFTopologyNode_Release(node);
diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c
index e33dbc2efc7..af28de0819d 100644
--- a/dlls/mf/topology.c
+++ b/dlls/mf/topology.c
@@ -1786,6 +1786,22 @@ static HRESULT create_topology_node(MF_TOPOLOGY_TYPE node_type, struct topology_
return S_OK;
}
+HRESULT topology_node_get_object(IMFTopologyNode *node, REFIID riid, void **obj)
+{
+ IUnknown *unk;
+ HRESULT hr;
+
+ *obj = NULL;
+
+ if (SUCCEEDED(hr = IMFTopologyNode_GetObject(node, &unk)))
+ {
+ hr = IUnknown_QueryInterface(unk, riid, obj);
+ IUnknown_Release(unk);
+ }
+
+ return hr;
+}
+
/***********************************************************************
* MFCreateTopologyNode (mf.@)
*/
@@ -1817,7 +1833,6 @@ HRESULT WINAPI MFGetTopoNodeCurrentType(IMFTopologyNode *node, DWORD stream, BOO
IMFStreamDescriptor *sd;
IMFTransform *transform;
UINT32 primary_output;
- IUnknown *object;
HRESULT hr;
TRACE("%p, %u, %d, %p.\n", node, stream, output, type);
@@ -1828,12 +1843,7 @@ HRESULT WINAPI MFGetTopoNodeCurrentType(IMFTopologyNode *node, DWORD stream, BOO
switch (node_type)
{
case MF_TOPOLOGY_OUTPUT_NODE:
- if (FAILED(hr = IMFTopologyNode_GetObject(node, &object)))
- return hr;
-
- hr = IUnknown_QueryInterface(object, &IID_IMFStreamSink, (void **)&stream_sink);
- IUnknown_Release(object);
- if (SUCCEEDED(hr))
+ if (SUCCEEDED(topology_node_get_object(node, &IID_IMFStreamSink, (void **)&stream_sink)))
{
hr = IMFStreamSink_GetMediaTypeHandler(stream_sink, &type_handler);
IMFStreamSink_Release(stream_sink);
@@ -1861,12 +1871,7 @@ HRESULT WINAPI MFGetTopoNodeCurrentType(IMFTopologyNode *node, DWORD stream, BOO
}
break;
case MF_TOPOLOGY_TRANSFORM_NODE:
- if (FAILED(hr = IMFTopologyNode_GetObject(node, &object)))
- return hr;
-
- hr = IUnknown_QueryInterface(object, &IID_IMFTransform, (void **)&transform);
- IUnknown_Release(object);
- if (SUCCEEDED(hr))
+ if (SUCCEEDED(hr = topology_node_get_object(node, &IID_IMFTransform, (void **)&transform)))
{
if (output)
hr = IMFTransform_GetOutputCurrentType(transform, stream, type);
@@ -2163,7 +2168,6 @@ static HRESULT topology_loader_get_node_type_handler(IMFTopologyNode *node, IMFM
MF_TOPOLOGY_TYPE node_type;
IMFStreamSink *stream_sink;
IMFStreamDescriptor *sd;
- IUnknown *object;
HRESULT hr;
if (FAILED(hr = IMFTopologyNode_GetNodeType(node, &node_type)))
@@ -2172,14 +2176,10 @@ static HRESULT topology_loader_get_node_type_handler(IMFTopologyNode *node, IMFM
switch (node_type)
{
case MF_TOPOLOGY_OUTPUT_NODE:
- if (SUCCEEDED(hr = IMFTopologyNode_GetObject(node, (IUnknown **)&object)))
+ if (SUCCEEDED(hr = topology_node_get_object(node, &IID_IMFStreamSink, (void **)&stream_sink)))
{
- if (SUCCEEDED(hr = IUnknown_QueryInterface(object, &IID_IMFStreamSink, (void **)&stream_sink)))
- {
- hr = IMFStreamSink_GetMediaTypeHandler(stream_sink, handler);
- IMFStreamSink_Release(stream_sink);
- }
- IUnknown_Release(object);
+ hr = IMFStreamSink_GetMediaTypeHandler(stream_sink, handler);
+ IMFStreamSink_Release(stream_sink);
}
break;
case MF_TOPOLOGY_SOURCESTREAM_NODE:
@@ -2368,22 +2368,20 @@ static BOOL topology_loader_is_node_d3d_aware(IMFTopologyNode *node)
{
IMFAttributes *attributes;
unsigned int d3d_aware = 0;
- IUnknown *object = NULL;
+ IMFTransform *transform;
- if (FAILED(IMFTopologyNode_GetObject(node, &object)))
+ if (FAILED(topology_node_get_object(node, &IID_IMFAttributes, (void **)&attributes)))
return FALSE;
- if (SUCCEEDED(IUnknown_QueryInterface(object, &IID_IMFAttributes, (void **)&attributes)))
+ IMFAttributes_GetUINT32(attributes, &MF_SA_D3D_AWARE, &d3d_aware);
+ IMFAttributes_Release(attributes);
+
+ if (!d3d_aware && SUCCEEDED(topology_node_get_object(node, &IID_IMFTransform, (void **)&transform)))
{
- IMFAttributes_GetUINT32(attributes, &MF_SA_D3D_AWARE, &d3d_aware);
- IMFAttributes_Release(attributes);
+ d3d_aware = mf_is_sample_copier_transform(transform);
+ IMFTransform_Release(transform);
}
- if (!d3d_aware)
- d3d_aware = mf_is_sample_copier_transform(object);
-
- IUnknown_Release(object);
-
return !!d3d_aware;
}
@@ -2454,7 +2452,7 @@ static HRESULT topology_loader_connect_d3d_aware_input(struct topoloader_context
IMFTransform *copier = NULL;
HRESULT hr = S_OK;
- IMFTopologyNode_GetObject(node, (IUnknown **)&stream_sink);
+ topology_node_get_object(node, &IID_IMFStreamSink, (void **)&stream_sink);
if (topology_loader_is_node_d3d_aware(node))
{
--
2.29.2