diff options
Diffstat (limited to 'ext/vulkan/vksink.c')
-rw-r--r-- | ext/vulkan/vksink.c | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/ext/vulkan/vksink.c b/ext/vulkan/vksink.c index c9893deeb..ea141df3b 100644 --- a/ext/vulkan/vksink.c +++ b/ext/vulkan/vksink.c @@ -65,6 +65,10 @@ static GstFlowReturn gst_vulkan_sink_prepare (GstBaseSink * bsink, static GstFlowReturn gst_vulkan_sink_show_frame (GstVideoSink * bsink, GstBuffer * buf); +static void gst_vulkan_sink_video_overlay_init (GstVideoOverlayInterface * + iface); + + static GstStaticPadTemplate gst_vulkan_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, @@ -91,7 +95,9 @@ enum #define gst_vulkan_sink_parent_class parent_class G_DEFINE_TYPE_WITH_CODE (GstVulkanSink, gst_vulkan_sink, GST_TYPE_VIDEO_SINK, GST_DEBUG_CATEGORY_INIT (gst_debug_vulkan_sink, - "vulkansink", 0, "Vulkan Video Sink")); + "vulkansink", 0, "Vulkan Video Sink"); + G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_OVERLAY, + gst_vulkan_sink_video_overlay_init)); static void gst_vulkan_sink_class_init (GstVulkanSinkClass * klass) @@ -261,6 +267,7 @@ gst_vulkan_sink_change_state (GstElement * element, GstStateChange transition) return GST_STATE_CHANGE_FAILURE; } + /* FIXME: this probably doesn't need to be so early in the setup process */ if (!(vk_sink->window = gst_vulkan_display_create_window (vk_sink->display))) { GST_ELEMENT_ERROR (vk_sink, RESOURCE, NOT_FOUND, @@ -268,6 +275,13 @@ gst_vulkan_sink_change_state (GstElement * element, GstStateChange transition) return GST_STATE_CHANGE_FAILURE; } + if (!vk_sink->set_window_handle) + gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (vk_sink)); + + if (vk_sink->set_window_handle) + gst_vulkan_window_set_window_handle (vk_sink->window, + vk_sink->set_window_handle); + if (!gst_vulkan_window_open (vk_sink->window, &error)) { GST_ELEMENT_ERROR (vk_sink, RESOURCE, NOT_FOUND, ("Failed to open window"), ("%s", error->message)); @@ -501,3 +515,17 @@ gst_vulkan_sink_show_frame (GstVideoSink * vsink, GstBuffer * buf) return GST_FLOW_OK; } + +static void +gst_vulkan_sink_set_window_handle (GstVideoOverlay * voverlay, guintptr handle) +{ + GstVulkanSink *vk_sink = GST_VULKAN_SINK (voverlay); + + vk_sink->set_window_handle = handle; +} + +static void +gst_vulkan_sink_video_overlay_init (GstVideoOverlayInterface * iface) +{ + iface->set_window_handle = gst_vulkan_sink_set_window_handle; +} |