Nikolay Sivov : mf/session: Query and initialize sample allocators for capable output nodes.

Alexandre Julliard julliard at winehq.org
Thu Nov 12 15:17:45 CST 2020


Module: wine
Branch: master
Commit: 9008b2c9b77364d98cd6671ee6b2f9fc936bf90d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9008b2c9b77364d98cd6671ee6b2f9fc936bf90d

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Nov 12 13:36:37 2020 +0300

mf/session: Query and initialize sample allocators for capable output nodes.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mf/session.c | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/dlls/mf/session.c b/dlls/mf/session.c
index d586f1c6be9..af8500cb7d6 100644
--- a/dlls/mf/session.c
+++ b/dlls/mf/session.c
@@ -171,6 +171,7 @@ struct topo_node
         struct
         {
             unsigned int requests;
+            IMFVideoSampleAllocator *allocator;
         } sink;
         struct
         {
@@ -742,6 +743,10 @@ static void release_topo_node(struct topo_node *node)
             heap_free(node->u.transform.input_map);
             heap_free(node->u.transform.output_map);
             break;
+        case MF_TOPOLOGY_OUTPUT_NODE:
+            if (node->u.sink.allocator)
+                IMFVideoSampleAllocator_Release(node->u.sink.allocator);
+            break;
         default:
             ;
     }
@@ -1185,10 +1190,25 @@ static HRESULT session_set_transform_stream_info(struct topo_node *node)
     return hr;
 }
 
+static HRESULT session_get_stream_sink_type(IMFStreamSink *sink, IMFMediaType **media_type)
+{
+    IMFMediaTypeHandler *handler;
+    HRESULT hr;
+
+    if (SUCCEEDED(hr = IMFStreamSink_GetMediaTypeHandler(sink, &handler)))
+    {
+        hr = IMFMediaTypeHandler_GetCurrentMediaType(handler, media_type);
+        IMFMediaTypeHandler_Release(handler);
+    }
+
+    return hr;
+}
+
 static HRESULT session_append_node(struct media_session *session, IMFTopologyNode *node)
 {
     struct topo_node *topo_node;
     IMFMediaSink *media_sink;
+    IMFMediaType *media_type;
     IMFStreamDescriptor *sd;
     HRESULT hr = S_OK;
     IUnknown *object;
@@ -1217,7 +1237,18 @@ static HRESULT session_append_node(struct media_session *session, IMFTopologyNod
             if (FAILED(hr = IMFStreamSink_GetMediaSink(topo_node->object.sink_stream, &media_sink)))
                 break;
 
-            hr = session_add_media_sink(session, node, media_sink);
+            if (SUCCEEDED(hr = session_add_media_sink(session, node, media_sink)))
+            {
+                if (SUCCEEDED(session_get_stream_sink_type(topo_node->object.sink_stream, &media_type)))
+                {
+                    if (SUCCEEDED(MFGetService(topo_node->object.object, &MR_VIDEO_ACCELERATION_SERVICE,
+                        &IID_IMFVideoSampleAllocator, (void **)&topo_node->u.sink.allocator)))
+                    {
+                        IMFVideoSampleAllocator_InitializeSampleAllocator(topo_node->u.sink.allocator, 2, media_type);
+                    }
+                    IMFMediaType_Release(media_type);
+                }
+            }
             IMFMediaSink_Release(media_sink);
 
             break;




More information about the wine-cvs mailing list