Nikolay Sivov : mf: Keep transform node input/output streams map.
Alexandre Julliard
julliard at winehq.org
Fri Mar 13 15:24:44 CDT 2020
Module: wine
Branch: master
Commit: f45419d05a6eee84a7d30a605ae23f13cd276f06
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f45419d05a6eee84a7d30a605ae23f13cd276f06
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Mar 13 15:34:36 2020 +0300
mf: Keep transform node input/output streams map.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mf/session.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index 64988579f4..62b2b4f0ec 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -136,6 +136,14 @@ struct topo_node
{
unsigned int requests;
} sink;
+ struct
+ {
+ unsigned int *input_map;
+ unsigned int input_count;
+
+ unsigned int *output_map;
+ unsigned int output_count;
+ } transform;
} u;
};
@@ -623,6 +631,10 @@ static void release_topo_node(struct topo_node *node)
if (node->u.source.source)
IMFMediaSource_Release(node->u.source.source);
break;
+ case MF_TOPOLOGY_TRANSFORM_NODE:
+ heap_free(node->u.transform.input_map);
+ heap_free(node->u.transform.output_map);
+ break;
default:
;
}
@@ -945,6 +957,40 @@ static HRESULT session_add_media_sink(struct media_session *session, IMFTopology
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)
{
struct topo_node *topo_node;
@@ -1010,7 +1056,9 @@ static HRESULT session_append_node(struct media_session *session, IMFTopologyNod
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);
break;
More information about the wine-cvs
mailing list