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,
#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)
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,
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));
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;
+}