vulkan: Add iOS window implementation
[platform/upstream/gst-plugins-bad.git] / ext / vulkan / vksink.c
index c9893de..ea141df 100644 (file)
@@ -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;
+}