From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/mf/mf_private.h | 1 + dlls/mf/session.c | 23 ++++-------------- dlls/mf/topology.c | 25 +++++++++++++------- dlls/mf/topology_loader.c | 50 ++++++++++++++++----------------------- 4 files changed, 42 insertions(+), 57 deletions(-) diff --git a/dlls/mf/mf_private.h b/dlls/mf/mf_private.h index 1f2ef17a8c9..c1e83b2d71a 100644 --- a/dlls/mf/mf_private.h +++ b/dlls/mf/mf_private.h @@ -119,6 +119,7 @@ extern HRESULT urlmon_scheme_handler_construct(REFIID riid, void **obj); extern BOOL mf_is_sample_copier_transform(IMFTransform *transform); extern BOOL mf_is_sar_sink(IMFMediaSink *sink); extern HRESULT create_topology(TOPOID id, IMFTopology **topology); +extern MF_TOPOLOGY_TYPE topology_node_get_type(IMFTopologyNode *node); extern HRESULT topology_node_get_object(IMFTopologyNode *node, REFIID riid, void **obj); extern HRESULT topology_node_get_type_handler(IMFTopologyNode *node, DWORD stream, BOOL output, IMFMediaTypeHandler **handler); extern HRESULT topology_node_init_media_type(IMFTopologyNode *node, DWORD stream, BOOL output, IMFMediaType **type); diff --git a/dlls/mf/session.c b/dlls/mf/session.c index e6407934fdd..db837c369d7 100644 --- a/dlls/mf/session.c +++ b/dlls/mf/session.c @@ -567,7 +567,6 @@ static void session_set_topo_status(struct media_session *session, HRESULT statu static HRESULT session_bind_output_nodes(IMFTopology *topology) { - MF_TOPOLOGY_TYPE node_type; IMFStreamSink *stream_sink; IMFMediaSink *media_sink; WORD node_count = 0, i; @@ -584,7 +583,7 @@ static HRESULT session_bind_output_nodes(IMFTopology *topology) if (FAILED(hr = IMFTopology_GetNode(topology, i, &node))) break; - if (FAILED(hr = IMFTopologyNode_GetNodeType(node, &node_type)) || node_type != MF_TOPOLOGY_OUTPUT_NODE) + if (topology_node_get_type(node) != MF_TOPOLOGY_OUTPUT_NODE) { IMFTopologyNode_Release(node); continue; @@ -632,7 +631,6 @@ static HRESULT session_bind_output_nodes(IMFTopology *topology) static HRESULT session_init_media_types(IMFTopology *topology) { - MF_TOPOLOGY_TYPE node_type; WORD node_count, i, j; IMFTopologyNode *node; IMFMediaType *type; @@ -648,8 +646,7 @@ static HRESULT session_init_media_types(IMFTopology *topology) break; if (FAILED(hr = IMFTopologyNode_GetInputCount(node, &input_count)) - || FAILED(hr = IMFTopologyNode_GetNodeType(node, &node_type)) - || node_type != MF_TOPOLOGY_OUTPUT_NODE) + || topology_node_get_type(node) != MF_TOPOLOGY_OUTPUT_NODE) { IMFTopologyNode_Release(node); continue; @@ -827,7 +824,6 @@ static void release_topo_node(struct topo_node *node) static void session_shutdown_current_topology(struct media_session *session) { unsigned int shutdown, force_shutdown; - MF_TOPOLOGY_TYPE node_type; IMFStreamSink *stream_sink; IMFTopology *topology; IMFTopologyNode *node; @@ -843,8 +839,7 @@ static void session_shutdown_current_topology(struct media_session *session) while (SUCCEEDED(IMFTopology_GetNode(topology, idx++, &node))) { - if (SUCCEEDED(IMFTopologyNode_GetNodeType(node, &node_type)) && - node_type == MF_TOPOLOGY_OUTPUT_NODE) + if (topology_node_get_type(node) == MF_TOPOLOGY_OUTPUT_NODE) { shutdown = 1; IMFTopologyNode_GetUINT32(node, &MF_TOPONODE_NOSHUTDOWN_ON_REMOVE, &shutdown); @@ -1888,7 +1883,6 @@ static HRESULT session_append_node(struct media_session *session, IMFTopologyNod if (!(topo_node = calloc(1, sizeof(*topo_node)))) return E_OUTOFMEMORY; - IMFTopologyNode_GetNodeType(node, &topo_node->type); IMFTopologyNode_GetTopoNodeID(node, &topo_node->node_id); topo_node->node = node; IMFTopologyNode_AddRef(topo_node->node); @@ -1896,7 +1890,7 @@ static HRESULT session_append_node(struct media_session *session, IMFTopologyNod if (SUCCEEDED(IMFTopologyNode_GetUINT32(node, &MF_TOPONODE_MARKIN_HERE, &value)) && value) topo_node->flags |= TOPO_NODE_MARKIN_HERE; - switch (topo_node->type) + switch ((topo_node->type = topology_node_get_type(node))) { case MF_TOPOLOGY_OUTPUT_NODE: topo_node->u.sink.notify_cb.lpVtbl = &node_sample_allocator_cb_vtbl; @@ -2338,7 +2332,6 @@ static HRESULT session_check_stream_descriptor(IMFPresentationDescriptor *pd, IM static HRESULT session_check_topology(IMFTopology *topology) { - MF_TOPOLOGY_TYPE node_type; IMFTopologyNode *node; WORD node_count, i; HRESULT hr; @@ -2355,13 +2348,7 @@ static HRESULT session_check_topology(IMFTopology *topology) if (FAILED(hr = IMFTopology_GetNode(topology, i, &node))) break; - if (FAILED(hr = IMFTopologyNode_GetNodeType(node, &node_type))) - { - IMFTopologyNode_Release(node); - break; - } - - switch (node_type) + switch (topology_node_get_type(node)) { case MF_TOPOLOGY_SOURCESTREAM_NODE: { diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c index 572d4d426d3..48df8a6ec8b 100644 --- a/dlls/mf/topology.c +++ b/dlls/mf/topology.c @@ -1645,7 +1645,6 @@ static HRESULT WINAPI topology_node_GetInputPrefType(IMFTopologyNode *iface, DWO static HRESULT WINAPI topology_node_CloneFrom(IMFTopologyNode *iface, IMFTopologyNode *src_node) { struct topology_node *node = impl_from_IMFTopologyNode(iface); - MF_TOPOLOGY_TYPE node_type; IMFMediaType *mediatype; IUnknown *object; DWORD count, i; @@ -1654,10 +1653,7 @@ static HRESULT WINAPI topology_node_CloneFrom(IMFTopologyNode *iface, IMFTopolog TRACE("%p, %p.\n", iface, src_node); - if (FAILED(hr = IMFTopologyNode_GetNodeType(src_node, &node_type))) - return hr; - - if (node->node_type != node_type) + if (node->node_type != topology_node_get_type(src_node)) return MF_E_INVALIDREQUEST; if (FAILED(hr = IMFTopologyNode_GetTopoNodeID(src_node, &topoid))) @@ -1783,6 +1779,20 @@ static HRESULT create_topology_node(MF_TOPOLOGY_TYPE node_type, struct topology_ return S_OK; } +MF_TOPOLOGY_TYPE topology_node_get_type(IMFTopologyNode *node) +{ + MF_TOPOLOGY_TYPE type; + HRESULT hr; + + if (FAILED(hr = IMFTopologyNode_GetNodeType(node, &type))) + { + ERR("Failed to get node type, hr %#lx.\n", hr); + return -1; + } + + return type; +} + HRESULT topology_node_get_object(IMFTopologyNode *node, REFIID riid, void **obj) { IUnknown *unk; @@ -2013,10 +2023,7 @@ HRESULT topology_node_get_type_handler(IMFTopologyNode *node, DWORD stream, IMFTransform *transform; HRESULT hr; - if (FAILED(hr = IMFTopologyNode_GetNodeType(node, &node_type))) - return hr; - - switch (node_type) + switch ((node_type = topology_node_get_type(node))) { case MF_TOPOLOGY_OUTPUT_NODE: if (output || stream) diff --git a/dlls/mf/topology_loader.c b/dlls/mf/topology_loader.c index 012e519af8a..65d9a5e1df8 100644 --- a/dlls/mf/topology_loader.c +++ b/dlls/mf/topology_loader.c @@ -92,7 +92,6 @@ struct topoloader_context static HRESULT topology_loader_clone_node(struct topoloader_context *context, IMFTopologyNode *node, IMFTopologyNode **clone) { - MF_TOPOLOGY_TYPE node_type; HRESULT hr; TOPOID id; @@ -100,9 +99,7 @@ static HRESULT topology_loader_clone_node(struct topoloader_context *context, IM return hr; if (SUCCEEDED(hr = IMFTopology_GetNodeByID(context->output_topology, id, clone))) return hr; - - IMFTopologyNode_GetNodeType(node, &node_type); - if (FAILED(hr = MFCreateTopologyNode(node_type, clone))) + if (FAILED(hr = MFCreateTopologyNode(topology_node_get_type(node), clone))) return hr; hr = IMFTopologyNode_CloneFrom(*clone, node); @@ -417,7 +414,6 @@ static HRESULT topology_branch_connect_down(IMFTopology *topology, MF_CONNECT_ME { IMFMediaTypeHandler *down_handler; IMFMediaType *down_type = NULL; - MF_TOPOLOGY_TYPE type; UINT32 method; DWORD flags; HRESULT hr; @@ -443,7 +439,7 @@ static HRESULT topology_branch_connect_down(IMFTopology *topology, MF_CONNECT_ME { TRACE("Connected branch %s with upstream type %p.\n", debugstr_topology_branch(branch), up_type); - if (SUCCEEDED(IMFTopologyNode_GetNodeType(branch->down.node, &type)) && type == MF_TOPOLOGY_TRANSFORM_NODE + if (topology_node_get_type(branch->down.node) == MF_TOPOLOGY_TRANSFORM_NODE && FAILED(hr = IMFMediaTypeHandler_SetCurrentMediaType(down_handler, up_type))) WARN("Failed to set transform node media type, hr %#lx\n", hr); @@ -542,7 +538,6 @@ static HRESULT topology_loader_resolve_branches(struct topoloader_context *conte { struct list new_branches = LIST_INIT(new_branches); struct topology_branch *branch, *next; - MF_TOPOLOGY_TYPE node_type; HRESULT hr = S_OK; LIST_FOR_EACH_ENTRY_SAFE(branch, next, branches, struct topology_branch, entry) @@ -551,14 +546,12 @@ static HRESULT topology_loader_resolve_branches(struct topoloader_context *conte if (FAILED(hr = topology_node_list_branches(branch->down.node, &new_branches))) WARN("Failed to list branches from branch %s\n", debugstr_topology_branch(branch)); - else if (FAILED(hr = IMFTopologyNode_GetNodeType(branch->up.node, &node_type))) - WARN("Failed to get source node type for branch %s\n", debugstr_topology_branch(branch)); else if (FAILED(hr = topology_branch_clone_nodes(context, branch))) WARN("Failed to clone nodes for branch %s\n", debugstr_topology_branch(branch)); else { hr = topology_branch_connect(context->output_topology, MF_CONNECT_ALLOW_DECODER, branch, enumerate_source_types); - if (hr == MF_E_INVALIDMEDIATYPE && !enumerate_source_types && node_type == MF_TOPOLOGY_TRANSFORM_NODE) + if (hr == MF_E_INVALIDMEDIATYPE && !enumerate_source_types && topology_node_get_type(branch->up.node) == MF_TOPOLOGY_TRANSFORM_NODE) hr = topology_branch_connect(context->output_topology, MF_CONNECT_ALLOW_DECODER, branch, TRUE); } @@ -757,7 +750,6 @@ static HRESULT topology_loader_connect_d3d_aware_sink(struct topoloader_context static void topology_loader_resolve_complete(struct topoloader_context *context) { MFTOPOLOGY_DXVA_MODE dxva_mode; - MF_TOPOLOGY_TYPE node_type; IMFTopologyNode *node; WORD i, node_count; HRESULT hr; @@ -771,22 +763,23 @@ static void topology_loader_resolve_complete(struct topoloader_context *context) { if (SUCCEEDED(IMFTopology_GetNode(context->output_topology, i, &node))) { - IMFTopologyNode_GetNodeType(node, &node_type); - - if (node_type == MF_TOPOLOGY_OUTPUT_NODE) - { - /* Set MF_TOPONODE_STREAMID for all outputs. */ - if (FAILED(IMFTopologyNode_GetItem(node, &MF_TOPONODE_STREAMID, NULL))) - IMFTopologyNode_SetUINT32(node, &MF_TOPONODE_STREAMID, 0); - - if (FAILED(hr = topology_loader_connect_d3d_aware_sink(context, node, dxva_mode))) - WARN("Failed to connect D3D-aware input, hr %#lx.\n", hr); - } - else if (node_type == MF_TOPOLOGY_SOURCESTREAM_NODE) + switch (topology_node_get_type(node)) { - /* Set MF_TOPONODE_MEDIASTART for all sources. */ - if (FAILED(IMFTopologyNode_GetItem(node, &MF_TOPONODE_MEDIASTART, NULL))) - IMFTopologyNode_SetUINT64(node, &MF_TOPONODE_MEDIASTART, 0); + case MF_TOPOLOGY_OUTPUT_NODE: + /* Set MF_TOPONODE_STREAMID for all outputs. */ + if (FAILED(IMFTopologyNode_GetItem(node, &MF_TOPONODE_STREAMID, NULL))) + IMFTopologyNode_SetUINT32(node, &MF_TOPONODE_STREAMID, 0); + + if (FAILED(hr = topology_loader_connect_d3d_aware_sink(context, node, dxva_mode))) + WARN("Failed to connect D3D-aware input, hr %#lx.\n", hr); + break; + case MF_TOPOLOGY_SOURCESTREAM_NODE: + /* Set MF_TOPONODE_MEDIASTART for all sources. */ + if (FAILED(IMFTopologyNode_GetItem(node, &MF_TOPONODE_MEDIASTART, NULL))) + IMFTopologyNode_SetUINT64(node, &MF_TOPONODE_MEDIASTART, 0); + break; + default: + ; } IMFTopologyNode_Release(node); @@ -802,7 +795,6 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in struct topology_branch *branch, *next; UINT32 enumerate_source_types; IMFTopology *output_topology; - MF_TOPOLOGY_TYPE node_type; IMFTopologyNode *node; unsigned short i = 0; IMFStreamSink *sink; @@ -823,9 +815,7 @@ static HRESULT WINAPI topology_loader_Load(IMFTopoLoader *iface, IMFTopology *in */ while (SUCCEEDED(IMFTopology_GetNode(input_topology, i++, &node))) { - IMFTopologyNode_GetNodeType(node, &node_type); - - switch (node_type) + switch (topology_node_get_type(node)) { case MF_TOPOLOGY_OUTPUT_NODE: if (SUCCEEDED(hr = IMFTopologyNode_GetObject(node, &object))) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10474