From 72f15128dc08372240581ecff21c958e5d9b6dc5 Mon Sep 17 00:00:00 2001 From: Julien Moutte Date: Sat, 15 Nov 2003 15:02:49 +0000 Subject: [PATCH] Adding GstVideoOverlay interface. Original commit message from CVS: Adding GstVideoOverlay interface. --- gst-libs/gst/videooverlay/Makefile.am | 10 ++ gst-libs/gst/videooverlay/gstvideooverlay.c | 162 ++++++++++++++++++++ gst-libs/gst/videooverlay/gstvideooverlay.h | 89 +++++++++++ 3 files changed, 261 insertions(+) create mode 100644 gst-libs/gst/videooverlay/Makefile.am create mode 100644 gst-libs/gst/videooverlay/gstvideooverlay.c create mode 100644 gst-libs/gst/videooverlay/gstvideooverlay.h diff --git a/gst-libs/gst/videooverlay/Makefile.am b/gst-libs/gst/videooverlay/Makefile.am new file mode 100644 index 0000000000..9e82faaae5 --- /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 0000000000..c3b95f55e7 --- /dev/null +++ b/gst-libs/gst/videooverlay/gstvideooverlay.c @@ -0,0 +1,162 @@ +/* + * GStreamer Video Overlay interface. + * + * Copyright (C) <2003> Julien Moutte + * + * 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 0000000000..e8a33a6b08 --- /dev/null +++ b/gst-libs/gst/videooverlay/gstvideooverlay.h @@ -0,0 +1,89 @@ +/* + * GStreamer Video Overlay interface. + * + * Copyright (C) <2003> Julien Moutte + * + * 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 + +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__ */