mf: Copy preferred types when cloning nodes.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2019-10-08 15:58:55 +03:00 committed by Alexandre Julliard
parent 34c52b946a
commit c1c77f22bc
2 changed files with 91 additions and 0 deletions

View File

@ -656,6 +656,71 @@ static void test_topology(void)
IMFTopologyNode_Release(node); IMFTopologyNode_Release(node);
IMFTopologyNode_Release(node2); IMFTopologyNode_Release(node2);
/* Cloning nodes of different types. */
hr = MFCreateTopologyNode(MF_TOPOLOGY_SOURCESTREAM_NODE, &node);
ok(hr == S_OK, "Failed to create topology node, hr %#x.\n", hr);
hr = MFCreateTopologyNode(MF_TOPOLOGY_OUTPUT_NODE, &node2);
ok(hr == S_OK, "Failed to create topology node, hr %#x.\n", hr);
hr = IMFTopologyNode_CloneFrom(node, node2);
ok(hr == MF_E_INVALIDREQUEST, "Unexpected hr %#x.\n", hr);
IMFTopologyNode_Release(node2);
/* Cloning preferred types. */
hr = MFCreateTopologyNode(MF_TOPOLOGY_SOURCESTREAM_NODE, &node2);
ok(hr == S_OK, "Failed to create topology node, hr %#x.\n", hr);
hr = MFCreateMediaType(&mediatype);
ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr);
hr = IMFTopologyNode_SetOutputPrefType(node2, 0, mediatype);
ok(hr == S_OK, "Failed to set preferred type, hr %#x.\n", hr);
/* Vista checks for additional attributes. */
hr = IMFTopologyNode_CloneFrom(node, node2);
ok(hr == S_OK || broken(hr == MF_E_ATTRIBUTENOTFOUND) /* Vista */, "Failed to clone a node, hr %#x.\n", hr);
hr = IMFTopologyNode_GetOutputPrefType(node, 0, &mediatype2);
ok(hr == S_OK, "Failed to get preferred type, hr %#x.\n", hr);
ok(mediatype == mediatype2, "Unexpected media type.\n");
IMFMediaType_Release(mediatype2);
IMFMediaType_Release(mediatype);
IMFTopologyNode_Release(node2);
/* Existing preferred types are not cleared. */
hr = MFCreateTopologyNode(MF_TOPOLOGY_SOURCESTREAM_NODE, &node2);
ok(hr == S_OK, "Failed to create topology node, hr %#x.\n", hr);
hr = IMFTopologyNode_GetOutputCount(node, &count);
ok(hr == S_OK, "Failed to get output count, hr %#x.\n", hr);
ok(count == 1, "Unexpected output count.\n");
hr = IMFTopologyNode_CloneFrom(node, node2);
ok(hr == S_OK || broken(hr == MF_E_ATTRIBUTENOTFOUND) /* Vista */, "Failed to clone a node, hr %#x.\n", hr);
hr = IMFTopologyNode_GetOutputCount(node, &count);
ok(hr == S_OK, "Failed to get output count, hr %#x.\n", hr);
ok(count == 1, "Unexpected output count.\n");
hr = IMFTopologyNode_GetOutputPrefType(node, 0, &mediatype2);
ok(hr == S_OK, "Failed to get preferred type, hr %#x.\n", hr);
ok(!!mediatype2, "Unexpected media type.\n");
IMFMediaType_Release(mediatype2);
hr = IMFTopologyNode_CloneFrom(node2, node);
ok(hr == S_OK || broken(hr == MF_E_ATTRIBUTENOTFOUND) /* Vista */, "Failed to clone a node, hr %#x.\n", hr);
hr = IMFTopologyNode_GetOutputCount(node2, &count);
ok(hr == S_OK, "Failed to get output count, hr %#x.\n", hr);
ok(count == 1, "Unexpected output count.\n");
IMFTopologyNode_Release(node2);
IMFTopologyNode_Release(node);
IMFTopology_Release(topology); IMFTopology_Release(topology);
} }

View File

@ -1628,7 +1628,9 @@ static HRESULT WINAPI topology_node_CloneFrom(IMFTopologyNode *iface, IMFTopolog
{ {
struct topology_node *node = impl_from_IMFTopologyNode(iface); struct topology_node *node = impl_from_IMFTopologyNode(iface);
MF_TOPOLOGY_TYPE node_type; MF_TOPOLOGY_TYPE node_type;
IMFMediaType *mediatype;
IUnknown *object; IUnknown *object;
DWORD count, i;
TOPOID topoid; TOPOID topoid;
HRESULT hr; HRESULT hr;
@ -1656,6 +1658,30 @@ static HRESULT WINAPI topology_node_CloneFrom(IMFTopologyNode *iface, IMFTopolog
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
node->id = topoid; node->id = topoid;
if (SUCCEEDED(IMFTopologyNode_GetInputCount(src_node, &count)))
{
for (i = 0; i < count; ++i)
{
if (SUCCEEDED(IMFTopologyNode_GetInputPrefType(src_node, i, &mediatype)))
{
IMFTopologyNode_SetInputPrefType(iface, i, mediatype);
IMFMediaType_Release(mediatype);
}
}
}
if (SUCCEEDED(IMFTopologyNode_GetOutputCount(src_node, &count)))
{
for (i = 0; i < count; ++i)
{
if (SUCCEEDED(IMFTopologyNode_GetOutputPrefType(src_node, i, &mediatype)))
{
IMFTopologyNode_SetOutputPrefType(iface, i, mediatype);
IMFMediaType_Release(mediatype);
}
}
}
LeaveCriticalSection(&node->cs); LeaveCriticalSection(&node->cs);
if (object) if (object)