summaryrefslogtreecommitdiff
path: root/ext/vulkan/vksink.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/vulkan/vksink.c')
-rw-r--r--ext/vulkan/vksink.c30
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;
+}