[PATCH 3/5] mf/session: Query and initialize sample allocators for capable output nodes.
Nikolay Sivov
nsivov at codeweavers.com
Thu Nov 12 04:36:37 CST 2020
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
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;
--
2.28.0
More information about the wine-devel
mailing list