mf: Keep transform node input/output streams map.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2020-03-13 15:34:36 +03:00 committed by Alexandre Julliard
parent c6f0124e84
commit f45419d05a
1 changed files with 49 additions and 1 deletions

View File

@ -136,6 +136,14 @@ struct topo_node
{ {
unsigned int requests; unsigned int requests;
} sink; } sink;
struct
{
unsigned int *input_map;
unsigned int input_count;
unsigned int *output_map;
unsigned int output_count;
} transform;
} u; } u;
}; };
@ -623,6 +631,10 @@ static void release_topo_node(struct topo_node *node)
if (node->u.source.source) if (node->u.source.source)
IMFMediaSource_Release(node->u.source.source); IMFMediaSource_Release(node->u.source.source);
break; break;
case MF_TOPOLOGY_TRANSFORM_NODE:
heap_free(node->u.transform.input_map);
heap_free(node->u.transform.output_map);
break;
default: default:
; ;
} }
@ -945,6 +957,40 @@ static HRESULT session_add_media_sink(struct media_session *session, IMFTopology
return S_OK; return S_OK;
} }
static HRESULT session_set_transform_stream_info(struct topo_node *node)
{
unsigned int *input_map = NULL, *output_map = NULL;
unsigned int input_count, output_count;
HRESULT hr;
hr = IMFTransform_GetStreamCount(node->object.transform, &input_count, &output_count);
if (SUCCEEDED(hr) && (input_count > 1 || output_count > 1))
{
unsigned int *input_map, *output_map;
input_map = heap_calloc(input_count, sizeof(*input_map));
output_map = heap_calloc(output_count, sizeof(*output_map));
if (FAILED(IMFTransform_GetStreamIDs(node->object.transform, input_count, input_map,
output_count, output_map)))
{
/* Assume sequential identifiers. */
heap_free(input_map);
heap_free(output_map);
input_map = output_map = NULL;
}
}
if (SUCCEEDED(hr))
{
node->u.transform.input_count = input_count;
node->u.transform.output_count = output_count;
node->u.transform.input_map = input_map;
node->u.transform.output_map = output_map;
}
return hr;
}
static HRESULT session_append_node(struct media_session *session, IMFTopologyNode *node) static HRESULT session_append_node(struct media_session *session, IMFTopologyNode *node)
{ {
struct topo_node *topo_node; struct topo_node *topo_node;
@ -1010,7 +1056,9 @@ static HRESULT session_append_node(struct media_session *session, IMFTopologyNod
IUnknown_Release(object); IUnknown_Release(object);
} }
if (FAILED(hr)) if (SUCCEEDED(hr))
hr = session_set_transform_stream_info(topo_node);
else
WARN("Failed to get IMFTransform for MFT node, hr %#x.\n", hr); WARN("Failed to get IMFTransform for MFT node, hr %#x.\n", hr);
break; break;