Nikolay Sivov : mf: Implement CloneFrom() for nodes.
Alexandre Julliard
julliard at winehq.org
Tue May 7 17:32:46 CDT 2019
Module: wine
Branch: master
Commit: 71397e6ebf0171b894663c7bc583b970601cdae4
URL: https://source.winehq.org/git/wine.git/?a=commit;h=71397e6ebf0171b894663c7bc583b970601cdae4
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue May 7 15:25:45 2019 +0300
mf: Implement CloneFrom() for nodes.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mf/topology.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 46 insertions(+), 7 deletions(-)
diff --git a/dlls/mf/topology.c b/dlls/mf/topology.c
index f40fe00..298200c 100644
--- a/dlls/mf/topology.c
+++ b/dlls/mf/topology.c
@@ -1078,18 +1078,15 @@ static HRESULT WINAPI topology_node_CopyAllItems(IMFTopologyNode *iface, IMFAttr
return IMFAttributes_CopyAllItems(node->attributes, dest);
}
-static HRESULT WINAPI topology_node_SetObject(IMFTopologyNode *iface, IUnknown *object)
+static HRESULT topology_node_set_object(struct topology_node *node, IUnknown *object)
{
static const GUID *iids[3] = { &IID_IPersist, &IID_IPersistStorage, &IID_IPersistPropertyBag };
- struct topology_node *node = impl_from_IMFTopologyNode(iface);
IPersist *persist = NULL;
BOOL has_object_id;
GUID object_id;
unsigned int i;
HRESULT hr;
- TRACE("%p, %p.\n", iface, object);
-
has_object_id = IMFAttributes_GetGUID(node->attributes, &MF_TOPONODE_TRANSFORM_OBJECTID, &object_id) == S_OK;
if (object && !has_object_id)
@@ -1130,6 +1127,15 @@ static HRESULT WINAPI topology_node_SetObject(IMFTopologyNode *iface, IUnknown *
return S_OK;
}
+static HRESULT WINAPI topology_node_SetObject(IMFTopologyNode *iface, IUnknown *object)
+{
+ struct topology_node *node = impl_from_IMFTopologyNode(iface);
+
+ TRACE("%p, %p.\n", iface, object);
+
+ return topology_node_set_object(node, object);
+}
+
static HRESULT WINAPI topology_node_GetObject(IMFTopologyNode *iface, IUnknown **object)
{
struct topology_node *node = impl_from_IMFTopologyNode(iface);
@@ -1367,11 +1373,44 @@ static HRESULT WINAPI topology_node_GetInputPrefType(IMFTopologyNode *iface, DWO
return hr;
}
-static HRESULT WINAPI topology_node_CloneFrom(IMFTopologyNode *iface, IMFTopologyNode *node)
+static HRESULT WINAPI topology_node_CloneFrom(IMFTopologyNode *iface, IMFTopologyNode *src_node)
{
- FIXME("(%p)->(%p)\n", iface, node);
+ struct topology_node *node = impl_from_IMFTopologyNode(iface);
+ MF_TOPOLOGY_TYPE node_type;
+ IUnknown *object;
+ TOPOID topoid;
+ HRESULT hr;
- return E_NOTIMPL;
+ TRACE("%p, %p.\n", iface, src_node);
+
+ if (FAILED(hr = IMFTopologyNode_GetNodeType(src_node, &node_type)))
+ return hr;
+
+ if (node->node_type != node_type)
+ return MF_E_INVALIDREQUEST;
+
+ if (FAILED(hr = IMFTopologyNode_GetTopoNodeID(src_node, &topoid)))
+ return hr;
+
+ object = NULL;
+ IMFTopologyNode_GetObject(src_node, &object);
+
+ EnterCriticalSection(&node->cs);
+
+ hr = IMFTopologyNode_CopyAllItems(src_node, node->attributes);
+
+ if (SUCCEEDED(hr))
+ hr = topology_node_set_object(node, object);
+
+ if (SUCCEEDED(hr))
+ node->id = topoid;
+
+ LeaveCriticalSection(&node->cs);
+
+ if (object)
+ IUnknown_Release(object);
+
+ return hr;
}
static const IMFTopologyNodeVtbl topologynodevtbl =
More information about the wine-cvs
mailing list