summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulien Moutte <julien@moutte.net>2003-11-15 15:02:49 +0000
committerJulien Moutte <julien@moutte.net>2003-11-15 15:02:49 +0000
commit72f15128dc08372240581ecff21c958e5d9b6dc5 (patch)
tree87553a8d9d816c6dfce91a7422cfc93fde44f7ae
parent689e45ff69d096060557a543b59095f8afc3bd3c (diff)
downloadgstreamer-plugins-bad-72f15128dc08372240581ecff21c958e5d9b6dc5.tar.gz
Adding GstVideoOverlay interface.
Original commit message from CVS: Adding GstVideoOverlay interface.
-rw-r--r--gst-libs/gst/videooverlay/Makefile.am10
-rw-r--r--gst-libs/gst/videooverlay/gstvideooverlay.c162
-rw-r--r--gst-libs/gst/videooverlay/gstvideooverlay.h89
3 files changed, 261 insertions, 0 deletions
diff --git a/gst-libs/gst/videooverlay/Makefile.am b/gst-libs/gst/videooverlay/Makefile.am
new file mode 100644
index 000000000..9e82faaae
--- /dev/null
+++ b/gst-libs/gst/videooverlay/Makefile.am
@@ -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
index 000000000..c3b95f55e
--- /dev/null
+++ b/gst-libs/gst/videooverlay/gstvideooverlay.c
@@ -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
index 000000000..e8a33a6b0
--- /dev/null
+++ b/gst-libs/gst/videooverlay/gstvideooverlay.h
@@ -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__ */