Adding GstVideoOverlay interface.
authorJulien Moutte <julien@moutte.net>
Sat, 15 Nov 2003 15:02:49 +0000 (15:02 +0000)
committerJulien Moutte <julien@moutte.net>
Sat, 15 Nov 2003 15:02:49 +0000 (15:02 +0000)
Original commit message from CVS:
Adding GstVideoOverlay interface.

gst-libs/gst/videooverlay/Makefile.am [new file with mode: 0644]
gst-libs/gst/videooverlay/gstvideooverlay.c [new file with mode: 0644]
gst-libs/gst/videooverlay/gstvideooverlay.h [new file with mode: 0644]

diff --git a/gst-libs/gst/videooverlay/Makefile.am b/gst-libs/gst/videooverlay/Makefile.am
new file mode 100644 (file)
index 0000000..9e82faa
--- /dev/null
@@ -0,0 +1,10 @@
+libgstinterfacesincludedir = \
+       $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/videooverlay
+
+libgstinterfacesinclude_HEADERS = gstvideooverlay.h
+
+noinst_LTLIBRARIES = libgstvideooverlay.la
+
+libgstvideooverlay_la_SOURCES = gstvideooverlay.c
+libgstvideooverlay_la_CFLAGS = $(GST_CFLAGS) $(GST_OPT_CFLAGS)
+
diff --git a/gst-libs/gst/videooverlay/gstvideooverlay.c b/gst-libs/gst/videooverlay/gstvideooverlay.c
new file mode 100644 (file)
index 0000000..c3b95f5
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ *  GStreamer Video Overlay interface.
+ *
+ *  Copyright (C) <2003> Julien Moutte <julien@moutte.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstvideooverlay.h"
+
+/* VideoSink signals and args */
+
+enum {
+  HAVE_VIDEO_OVERLAY,
+  HAVE_SIZE,
+  LAST_SIGNAL
+};
+
+static guint gst_video_overlay_signals[LAST_SIGNAL] = { 0 };
+
+/* Initing stuff */
+
+static void
+gst_video_overlay_base_init (gpointer g_class)
+{
+  static gboolean initialized = FALSE;
+  
+  if (! initialized)
+    {
+      gst_video_overlay_signals[HAVE_SIZE] =
+        g_signal_new ("have_size",
+                      GST_TYPE_VIDEO_OVERLAY, G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (GstVideoOverlayInterface, have_size),
+                      NULL, NULL,
+                      gst_marshal_VOID__INT_INT, G_TYPE_NONE, 2,
+                     G_TYPE_UINT, G_TYPE_UINT);
+
+      gst_video_overlay_signals[HAVE_VIDEO_OVERLAY] =
+        g_signal_new ("have_video_overlay",
+                      GST_TYPE_VIDEO_OVERLAY, G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (GstVideoOverlayInterface, have_video_overlay),
+                      NULL, NULL,
+                      g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1,
+                     G_TYPE_POINTER);
+      
+      initialized = TRUE;
+    }
+}
+
+/* Public virtual methods */
+
+/**
+ * gst_video_overlay_set_video_overlay:
+ * @overlay: a #GstVideoOverlay to set the video overlay on.
+ * @video_out: the #gpointer linking to video overlay.
+ *
+ * This will call the video overlay's set_video_overlay method. You should
+ * use this method to tell to a video overlay to display video output to a
+ * specific video overlay resource.
+ */
+void
+gst_video_overlay_set_video_overlay (GstVideoOverlay *overlay,
+                                     GstVideoOverlayResource *resource)
+{
+  GstVideoOverlayInterface *interface;
+  
+  g_return_if_fail (overlay != NULL);
+  g_return_if_fail (GST_IS_VIDEO_OVERLAY (overlay));
+  
+  interface = GST_VIDEO_OVERLAY_GET_INTERFACE (overlay);
+  
+  if (interface->set_video_out)
+    interface->set_video_out (overlay, resource);
+}
+
+/* Public methods */
+
+/**
+ * gst_video_overlay_got_video_overlay:
+ * @overlay: a #GstVideoOverlay which got a video overlay resource.
+ * @video_out: a #gpointer linking to the video overlay ressource.
+ *
+ * This will fire an have_video_out signal.
+ *
+ * This function should be used by video overlay developpers.
+ */
+void
+gst_video_overlay_got_video_overlay (GstVideoOverlay *overlay,
+                                     GstVideoOverlayResource *resource)
+{
+  g_return_if_fail (overlay != NULL);
+  g_return_if_fail (GST_IS_VIDEO_OVERLAY (overlay));
+  
+  g_signal_emit (G_OBJECT (overlay),
+                 gst_video_overlay_signals[HAVE_VIDEO_OVERLAY], 0, resource);
+}
+
+/**
+ * gst_video_overlay_got_video_size:
+ * @overlay: a #GstVideoOverlay which received video geometry.
+ * @width: a width as a #gint.
+ * @height: a height as a #gint.
+ *
+ * This will fire an have_size signal.
+ *
+ * This function should be used by video overlay developpers.
+ */
+void
+gst_video_overlay_got_video_size (GstVideoOverlay *overlay,
+                                  gint width, gint height)
+{
+  g_return_if_fail (overlay != NULL);
+  g_return_if_fail (GST_IS_VIDEO_OVERLAY (overlay));
+  
+  g_signal_emit (G_OBJECT (overlay), gst_video_overlay_signals[HAVE_SIZE],
+                 0, width, height);
+}
+
+GType
+gst_video_overlay_get_type (void)
+{
+  static GType overlay_type = 0;
+
+  if (!overlay_type)
+    {
+      static const GTypeInfo overlay_info = {
+        sizeof (GstVideoOverlayInterface), /* class_size */
+        gst_video_overlay_base_init,   /* base_init */
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        0,
+        0,
+        NULL
+      };
+    
+      overlay_type = g_type_register_static (G_TYPE_INTERFACE,
+                                             "GstVideoOverlay",
+                                             &overlay_info, 0);
+      g_type_interface_add_prerequisite (overlay_type,
+                                         GST_TYPE_INTERFACE);
+    }
+    
+  return overlay_type;
+}
diff --git a/gst-libs/gst/videooverlay/gstvideooverlay.h b/gst-libs/gst/videooverlay/gstvideooverlay.h
new file mode 100644 (file)
index 0000000..e8a33a6
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ *  GStreamer Video Overlay interface.
+ *
+ *  Copyright (C) <2003> Julien Moutte <julien@moutte.net>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+#ifndef __GST_VIDEO_OVERLAY_H__
+#define __GST_VIDEO_OVERLAY_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+  
+#define GST_TYPE_VIDEO_OVERLAY               (gst_video_overlay_get_type ())
+#define GST_VIDEO_OVERLAY(obj)               (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VIDEO_OVERLAY, GstVideoOverlay))
+#define GST_IS_VIDEO_OVERLAY(obj)            (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VIDEO_OVERLAY))
+#define GST_VIDEO_OVERLAY_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_VIDEO_OVERLAY, GstVideoOverlayInterface))
+  
+typedef struct _GstVideoOverlay GstVideoOverlay;
+typedef struct _GstVideoOverlayInterface GstVideoOverlayInterface;
+
+typedef struct _GstVideoOverlayResource GstVideoOverlayResource;
+
+typedef enum {
+  GST_VIDEO_OVERLAY_RESOURCE_TYPE_XID,
+  GST_VIDEO_OVERLAY_RESOURCE_TYPE_DIRECTFB
+} GstVideoOverlayResourceType;
+
+struct _GstVideoOverlayResource
+{
+  GstVideoOverlayResourceType resource_type;
+  union
+  {
+    struct
+    {
+      guint32 xid;
+    } x_resource;
+    struct
+    {
+      gpointer display_layer;
+      gpointer window;
+    } dfb_resource;
+  } resource_data;
+};
+
+struct _GstVideoOverlay;
+
+struct GstVideoOverlayInterface {
+  GTypeInterface parent_class;
+  
+  /* public virtual methods */
+  void (*set_video_overlay) (GstVideoOverlay *overlay,
+                             GstVideoOverlayResource *resource);
+
+  /* signals */
+  void (*have_video_overlay)  (GstVideoOverlay *overlay,
+                               GstVideoOverlayResource *resource);
+  void (*have_size)       (GstVideoOverlay *overlay, gint width, gint height);
+};
+
+GType gst_video_overlay_get_type (void);
+
+/* public virtual methods */
+void gst_video_overlay_set_video_overlay (GstVideoOverlay *overlay,
+                                          GstVideoOverlayResource *resource);
+
+/* public methods to fire signals */
+void gst_video_overlay_got_video_overlay (GstVideoOverlay *overlay,
+                                          GstVideoOverlayResource *resource);
+void gst_video_overlay_got_video_size (GstVideoOverlay *overlay,
+                                       gint width, gint height);
+
+G_END_DECLS
+
+#endif  /* __GST_VIDEO_OVERLAY_H__ */