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