diff options
author | Tim-Philipp Müller <tim@centricular.net> | 2008-04-03 22:50:48 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.net> | 2008-04-03 22:50:48 +0000 |
commit | 27f764087c1222cd0ae1631bdb58098af2ab0e18 (patch) | |
tree | 4ebc20d0db3396825dcbf3fccbe92519c6efe7ec | |
parent | de38811fbe700207e3b446bc0ebb7e0e319003b4 (diff) |
ext/gdk_pixbuf/: Add gdkpixbufsink element for easy snapshotting (#525946).
Original commit message from CVS:
* ext/gdk_pixbuf/Makefile.am:
* ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init):
* ext/gdk_pixbuf/gstgdkpixbufsink.c:
(gst_gdk_pixbuf_sink_base_init),
(gst_gdk_pixbuf_sink_class_init), (gst_gdk_pixbuf_sink_init),
(gst_gdk_pixbuf_sink_start), (gst_gdk_pixbuf_sink_stop),
(gst_gdk_pixbuf_sink_set_caps),
(gst_gdk_pixbuf_sink_pixbuf_destroy_notify),
(gst_gdk_pixbuf_sink_get_pixbuf_from_buffer),
(gst_gdk_pixbuf_sink_handle_buffer), (gst_gdk_pixbuf_sink_preroll),
(gst_gdk_pixbuf_sink_render), (gst_gdk_pixbuf_sink_set_property),
(gst_gdk_pixbuf_sink_get_property):
* ext/gdk_pixbuf/gstgdkpixbufsink.h:
Add gdkpixbufsink element for easy snapshotting (#525946).
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | ext/gdk_pixbuf/Makefile.am | 8 | ||||
-rw-r--r-- | ext/gdk_pixbuf/gstgdkpixbuf.c | 9 | ||||
-rw-r--r-- | ext/gdk_pixbuf/gstgdkpixbufsink.c | 420 | ||||
-rw-r--r-- | ext/gdk_pixbuf/gstgdkpixbufsink.h | 75 |
5 files changed, 525 insertions, 4 deletions
@@ -1,3 +1,20 @@ +2008-04-03 Tim-Philipp Müller <tim at centricular dot net> + + * ext/gdk_pixbuf/Makefile.am: + * ext/gdk_pixbuf/gstgdkpixbuf.c: (plugin_init): + * ext/gdk_pixbuf/gstgdkpixbufsink.c: + (gst_gdk_pixbuf_sink_base_init), + (gst_gdk_pixbuf_sink_class_init), (gst_gdk_pixbuf_sink_init), + (gst_gdk_pixbuf_sink_start), (gst_gdk_pixbuf_sink_stop), + (gst_gdk_pixbuf_sink_set_caps), + (gst_gdk_pixbuf_sink_pixbuf_destroy_notify), + (gst_gdk_pixbuf_sink_get_pixbuf_from_buffer), + (gst_gdk_pixbuf_sink_handle_buffer), (gst_gdk_pixbuf_sink_preroll), + (gst_gdk_pixbuf_sink_render), (gst_gdk_pixbuf_sink_set_property), + (gst_gdk_pixbuf_sink_get_property): + * ext/gdk_pixbuf/gstgdkpixbufsink.h: + Add gdkpixbufsink element for easy snapshotting (#525946). + 2008-04-03 Sebastian Dröge <slomo@circular-chaos.org> * tests/check/pipelines/wavpack.c: (wavpack_suite): diff --git a/ext/gdk_pixbuf/Makefile.am b/ext/gdk_pixbuf/Makefile.am index 316ca4e5..63efd461 100644 --- a/ext/gdk_pixbuf/Makefile.am +++ b/ext/gdk_pixbuf/Makefile.am @@ -1,14 +1,18 @@ plugin_LTLIBRARIES = libgstgdkpixbuf.la -libgstgdkpixbuf_la_SOURCES = gstgdkpixbuf.c pixbufscale.c +libgstgdkpixbuf_la_SOURCES = gstgdkpixbuf.c gstgdkpixbufsink.c pixbufscale.c libgstgdkpixbuf_la_CFLAGS = \ $(GST_PLUGINS_BASE_CFLAGS) \ $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) $(GTK_CFLAGS) -libgstgdkpixbuf_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(GTK_LIBS) +libgstgdkpixbuf_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_MAJORMINOR) \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) $(GTK_LIBS) libgstgdkpixbuf_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) noinst_HEADERS = \ gstgdkpixbuf.h \ + gstgdkpixbufsink.h \ pixbufscale.h \ gstgdkanimation.h diff --git a/ext/gdk_pixbuf/gstgdkpixbuf.c b/ext/gdk_pixbuf/gstgdkpixbuf.c index 4289a955..61926cbe 100644 --- a/ext/gdk_pixbuf/gstgdkpixbuf.c +++ b/ext/gdk_pixbuf/gstgdkpixbuf.c @@ -22,11 +22,12 @@ #include "config.h" #endif #include <gst/gst.h> -#include <gdk-pixbuf/gdk-pixbuf.h> #include <gst/video/video.h> +#include <gdk-pixbuf/gdk-pixbuf.h> #include <string.h> #include "gstgdkpixbuf.h" +#include "gstgdkpixbufsink.h" GST_DEBUG_CATEGORY_STATIC (gst_gdk_pixbuf_debug); #define GST_CAT_DEFAULT gst_gdk_pixbuf_debug @@ -548,6 +549,10 @@ plugin_init (GstPlugin * plugin) gst_gdk_pixbuf_type_find, NULL, GST_CAPS_ANY, NULL); #endif + if (!gst_element_register (plugin, "gdkpixbufsink", GST_RANK_NONE, + GST_TYPE_GDK_PIXBUF_SINK)) + return FALSE; + if (!pixbufscale_init (plugin)) return FALSE; @@ -561,5 +566,5 @@ plugin_init (GstPlugin * plugin) GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "gdkpixbuf", - "GDK Pixbuf decoder & scaler", + "GdkPixbuf-based image decoder, scaler and sink", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/ext/gdk_pixbuf/gstgdkpixbufsink.c b/ext/gdk_pixbuf/gstgdkpixbufsink.c new file mode 100644 index 00000000..f4d318a1 --- /dev/null +++ b/ext/gdk_pixbuf/gstgdkpixbufsink.c @@ -0,0 +1,420 @@ +/* GStreamer GdkPixbuf sink + * Copyright (C) 2006-2008 Tim-Philipp Müller <tim centricular net> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is free software; you can redistribute it and/or + * 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 Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/** + * SECTION:element-gdkpixbufsink + * @short_description: video sink that converts RGB images to GdkPixbufs. + * @see_also: + * + * <refsect2> + * <para> + * This sink element takes RGB or RGBA images as input and wraps them into + * GdkPixbuf objects, for easy saving to file via the + * <ulink url="http://library.gnome.org/devel/gdk-pixbuf/unstable/index.html"> + * GdkPixbuf library API</ulink> or displaying in Gtk+ applications (e.g. using + * the <ulink url="http://library.gnome.org/devel/gtk/unstable/GtkImage.html"> + * GtkImage widget</ulink>). + * </para> + * <para> + * There are two ways to use this element and obtain the GdkPixbuf objects + * created: + * <itemizedlist> + * <listitem> + * Watching for element messages named <classname>"preroll-pixbuf" + * </classname> or <classname>"pixbuf"</classname> on the bus, which + * will be posted whenever an image would usually be rendered. See below for + * more details on these messages and how to extract the pixbuf object + * contained in them. + * </listitem> + * <listitem> + * Retrieving the current pixbuf via the <classname>"last-pixbuf" + * </classname> property when needed. + * </listitem> + * </itemizedlist> + * </para> + * <para> + * The primary purpose of this element is to abstract away the GstBuffer to + * GdkPixbuf conversion. Other than that it's very similar to the fakesink + * element. + * </para> + * <para> + * This element is meant for easy no-hassle video snapshotting. It is not + * suitable for video playback or video display at high framerates. Use + * ximagesink, xvimagesink or some other suitable video sink in connection + * with the GstXOverlay interface instead if you want to do video playback. + * </para> + * <title>Message details</title> + * <para> + * As mentioned above, this element will by default post element messages + * containing structures named <classname>"preroll-pixbuf" + * </classname> or <classname>"pixbuf"</classname> on the bus (this + * can be disabled by setting the + * <link linkend="GstGdkPixbufSink--send-messages">"send-messages" + * property</link> to #FALSE though). The element message's structure + * will have the following fields: + * <itemizedlist> + * <listitem> + * <classname>"pixbuf"</classname>: the GdkPixbuf object + * </listitem> + * <listitem> + * <classname>"pixel-aspect-ratio"</classname>: the pixel aspect + * ratio (PAR) of the input image (this field contains a #GstFraction); the + * PAR is usually 1:1 for images, but is often something non-1:1 in the case + * of video input. In this case the image may be distorted and you may need + * to rescale it accordingly before saving it to file or displaying it. This + * can easily be done using the + * <ulink url="http://library.gnome.org/devel/gdk-pixbuf/unstable/index.html"> + * GdkPixbuf library API</ulink> (the reason this is not done automatically + * is that the application will often scale the image anyway according to the + * size of the output window, in which case it is much more efficient to only + * scale once rather than twice). You can put a videoscale element and a + * capsfilter element with + * <literal>video/x-raw-rgb,pixel-aspect-ratio=(fraction)1/1</literal> caps + * in front of this element to make sure the pixbufs always have a 1:1 PAR. + * </listitem> + * </itemizedlist> + * </para> + * <title>Example pipeline</title> + * <para> + * <programlisting> + * gst-launch -m -v videotestsrc num-buffers=1 ! gdkpixbufsink + * </programlisting> + * Process one single test image as pixbuf (note that the output you see will + * be slightly misleading. The message structure does contain a valid pixbuf + * object even if the structure string says '(NULL)'). + * </para> + * </refsect2> + * + * Since: 0.10.8 + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "gstgdkpixbufsink.h" + +#include <gst/video/video.h> + +enum +{ + PROP_SEND_MESSAGES = 1, + PROP_LAST_PIXBUF +}; + +#define DEFAULT_SEND_MESSAGES TRUE + +GST_BOILERPLATE (GstGdkPixbufSink, gst_gdk_pixbuf_sink, GstVideoSink, + GST_TYPE_VIDEO_SINK); + +static void gst_gdk_pixbuf_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_gdk_pixbuf_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_gdk_pixbuf_sink_start (GstBaseSink * basesink); +static gboolean gst_gdk_pixbuf_sink_stop (GstBaseSink * basesink); +static gboolean gst_gdk_pixbuf_sink_set_caps (GstBaseSink * basesink, + GstCaps * caps); +static GstFlowReturn gst_gdk_pixbuf_sink_render (GstBaseSink * bsink, + GstBuffer * buf); +static GstFlowReturn gst_gdk_pixbuf_sink_preroll (GstBaseSink * bsink, + GstBuffer * buf); +static GdkPixbuf *gst_gdk_pixbuf_sink_get_pixbuf_from_buffer (GstGdkPixbufSink * + sink, GstBuffer * buf); + +#define WxH ", width = (int) [ 16, 4096 ], height = (int) [ 16, 4096 ]" + +static GstStaticPadTemplate pixbufsink_sink_factory = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_RGB WxH ";" GST_VIDEO_CAPS_RGBA WxH)); + +static void +gst_gdk_pixbuf_sink_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details_simple (element_class, "GdkPixbuf sink", + "Sink/Video", "Output images as GdkPixbuf objects in bus messages", + "Tim-Philipp Müller <tim centricular net>"); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&pixbufsink_sink_factory)); +} + +static void +gst_gdk_pixbuf_sink_class_init (GstGdkPixbufSinkClass * klass) +{ + GstBaseSinkClass *basesink_class = GST_BASE_SINK_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + + gobject_class->set_property = gst_gdk_pixbuf_sink_set_property; + gobject_class->get_property = gst_gdk_pixbuf_sink_get_property; + + g_object_class_install_property (gobject_class, PROP_SEND_MESSAGES, + g_param_spec_boolean ("send-messages", "Send Messages", + "Whether to post messages containing pixbufs on the bus", + DEFAULT_SEND_MESSAGES, G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, PROP_LAST_PIXBUF, + g_param_spec_object ("last-pixbuf", "Last Pixbuf", + "Last GdkPixbuf object rendered", GDK_TYPE_PIXBUF, G_PARAM_READABLE)); + + basesink_class->start = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_start); + basesink_class->stop = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_stop); + basesink_class->render = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_render); + basesink_class->preroll = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_preroll); + basesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_gdk_pixbuf_sink_set_caps); +} + +static void +gst_gdk_pixbuf_sink_init (GstGdkPixbufSink * sink, + GstGdkPixbufSinkClass * klass) +{ + sink->par_n = 0; + sink->par_d = 0; + sink->has_alpha = FALSE; + sink->last_pixbuf = NULL; + sink->send_messages = DEFAULT_SEND_MESSAGES; + + /* we're not a real video sink, we just derive from GstVideoSink in case + * anything interesting is added to it in future */ + gst_base_sink_set_max_lateness (GST_BASE_SINK (sink), -1); + gst_base_sink_set_qos_enabled (GST_BASE_SINK (sink), FALSE); +} + + +static gboolean +gst_gdk_pixbuf_sink_start (GstBaseSink * basesink) +{ + GST_LOG_OBJECT (basesink, "start"); + + return TRUE; +} + +static gboolean +gst_gdk_pixbuf_sink_stop (GstBaseSink * basesink) +{ + GstGdkPixbufSink *sink = GST_GDK_PIXBUF_SINK (basesink); + + GST_VIDEO_SINK_WIDTH (sink) = 0; + GST_VIDEO_SINK_HEIGHT (sink) = 0; + + sink->par_n = 0; + sink->par_d = 0; + sink->has_alpha = FALSE; + + if (sink->last_pixbuf) { + g_object_unref (sink->last_pixbuf); + sink->last_pixbuf = NULL; + } + + GST_LOG_OBJECT (sink, "stop"); + + return TRUE; +} + +static gboolean +gst_gdk_pixbuf_sink_set_caps (GstBaseSink * basesink, GstCaps * caps) +{ + GstGdkPixbufSink *sink = GST_GDK_PIXBUF_SINK (basesink); + GstVideoFormat fmt; + gint w, h, par_n, par_d; + + GST_LOG_OBJECT (sink, "caps: %" GST_PTR_FORMAT, caps); + + if (!gst_video_format_parse_caps (caps, &fmt, &w, &h)) { + GST_WARNING_OBJECT (sink, "parse_caps failed"); + return FALSE; + } + + if (!gst_video_parse_caps_pixel_aspect_ratio (caps, &par_n, &par_d)) { + GST_LOG_OBJECT (sink, "no pixel aspect ratio"); + return FALSE; + } + + g_assert ((fmt == GST_VIDEO_FORMAT_RGB && + gst_video_format_get_pixel_stride (fmt, 0) == 3) || + (fmt == GST_VIDEO_FORMAT_RGBA && + gst_video_format_get_pixel_stride (fmt, 0) == 4)); + + GST_VIDEO_SINK_WIDTH (sink) = w; + GST_VIDEO_SINK_HEIGHT (sink) = h; + + sink->rowstride = gst_video_format_get_row_stride (fmt, 0, w); + sink->has_alpha = (fmt == GST_VIDEO_FORMAT_RGBA); + + sink->par_n = par_n; + sink->par_d = par_d; + + GST_INFO_OBJECT (sink, "format : %d", fmt); + GST_INFO_OBJECT (sink, "width x height : %d x %d", w, h); + GST_INFO_OBJECT (sink, "pixel-aspect-ratio : %d/%d", par_d, par_n); + + return TRUE; +} + +static void +gst_gdk_pixbuf_sink_pixbuf_destroy_notify (guchar * pixels, GstBuffer * buf) +{ + gst_buffer_unref (buf); +} + +static GdkPixbuf * +gst_gdk_pixbuf_sink_get_pixbuf_from_buffer (GstGdkPixbufSink * sink, + GstBuffer * buf) +{ + GdkPixbuf *pix = NULL; + gint minsize, bytes_per_pixel; + + g_return_val_if_fail (GST_VIDEO_SINK_WIDTH (sink) > 0, NULL); + g_return_val_if_fail (GST_VIDEO_SINK_HEIGHT (sink) > 0, NULL); + + bytes_per_pixel = (sink->has_alpha) ? 4 : 3; + + /* last row needn't have row padding */ + minsize = (sink->rowstride * (GST_VIDEO_SINK_HEIGHT (sink) - 1)) + + (bytes_per_pixel * GST_VIDEO_SINK_WIDTH (sink)); + + g_return_val_if_fail (GST_BUFFER_SIZE (buf) >= minsize, NULL); + + pix = gdk_pixbuf_new_from_data (GST_BUFFER_DATA (buf), + GDK_COLORSPACE_RGB, sink->has_alpha, 8, GST_VIDEO_SINK_WIDTH (sink), + GST_VIDEO_SINK_HEIGHT (sink), sink->rowstride, + (GdkPixbufDestroyNotify) gst_gdk_pixbuf_sink_pixbuf_destroy_notify, + gst_buffer_ref (buf)); + + return pix; +} + +static GstFlowReturn +gst_gdk_pixbuf_sink_handle_buffer (GstBaseSink * basesink, GstBuffer * buf, + const gchar * msg_name) +{ + GstGdkPixbufSink *sink; + GdkPixbuf *pixbuf; + gboolean do_post; + + sink = GST_GDK_PIXBUF_SINK (basesink); + + pixbuf = gst_gdk_pixbuf_sink_get_pixbuf_from_buffer (sink, buf); + + GST_OBJECT_LOCK (sink); + + do_post = sink->send_messages; + + if (sink->last_pixbuf) + g_object_unref (sink->last_pixbuf); + + sink->last_pixbuf = pixbuf; /* take ownership */ + + GST_OBJECT_UNLOCK (sink); + + if (G_UNLIKELY (pixbuf == NULL)) + goto error; + + if (do_post) { + GstStructure *s; + GstMessage *msg; + + /* it's okay to keep using pixbuf here, we can be sure no one is going to + * unref or change sink->last_pixbuf before we return from this function. + * The structure will take its own ref to the pixbuf. */ + s = gst_structure_new (msg_name, + "pixbuf", GDK_TYPE_PIXBUF, pixbuf, + "pixel-aspect-ratio", GST_TYPE_FRACTION, sink->par_d, sink->par_n, + NULL); + + msg = gst_message_new_element (GST_OBJECT_CAST (sink), s); + gst_element_post_message (GST_ELEMENT_CAST (sink), msg); + } + + g_object_notify (G_OBJECT (sink), "last-pixbuf"); + + return GST_FLOW_OK; + +/* ERRORS */ +error: + { + /* This shouldn't really happen */ + GST_ELEMENT_ERROR (sink, LIBRARY, FAILED, + ("Couldn't create pixbuf from RGB image."), + ("Probably not enough free memory")); + return GST_FLOW_ERROR; + } +} + +static GstFlowReturn +gst_gdk_pixbuf_sink_preroll (GstBaseSink * basesink, GstBuffer * buf) +{ + return gst_gdk_pixbuf_sink_handle_buffer (basesink, buf, "preroll-pixbuf"); +} + +static GstFlowReturn +gst_gdk_pixbuf_sink_render (GstBaseSink * basesink, GstBuffer * buf) +{ + return gst_gdk_pixbuf_sink_handle_buffer (basesink, buf, "pixbuf"); +} + +static void +gst_gdk_pixbuf_sink_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstGdkPixbufSink *sink; + + sink = GST_GDK_PIXBUF_SINK (object); + + switch (prop_id) { + case PROP_SEND_MESSAGES: + GST_OBJECT_LOCK (sink); + sink->send_messages = g_value_get_boolean (value); + GST_OBJECT_UNLOCK (sink); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_gdk_pixbuf_sink_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstGdkPixbufSink *sink; + + sink = GST_GDK_PIXBUF_SINK (object); + + switch (prop_id) { + case PROP_SEND_MESSAGES: + GST_OBJECT_LOCK (sink); + g_value_set_boolean (value, sink->send_messages); + GST_OBJECT_UNLOCK (sink); + break; + case PROP_LAST_PIXBUF: + GST_OBJECT_LOCK (sink); + g_value_set_object (value, sink->last_pixbuf); + GST_OBJECT_UNLOCK (sink); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} diff --git a/ext/gdk_pixbuf/gstgdkpixbufsink.h b/ext/gdk_pixbuf/gstgdkpixbufsink.h new file mode 100644 index 00000000..5708d491 --- /dev/null +++ b/ext/gdk_pixbuf/gstgdkpixbufsink.h @@ -0,0 +1,75 @@ +/* GStreamer GdkPixbuf sink + * Copyright (C) 2006-2008 Tim-Philipp Müller <tim centricular net> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef GST_GDK_PIXBUF_SINK_H +#define GST_GDK_PIXBUF_SINK_H + +#include <gst/gst.h> + +#include <gst/video/gstvideosink.h> + +#include <gdk-pixbuf/gdk-pixbuf.h> + +#define GST_TYPE_GDK_PIXBUF_SINK (gst_gdk_pixbuf_sink_get_type()) +#define GST_GDK_PIXBUF_SINK(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GDK_PIXBUF_SINK,GstGdkPixbufSink)) +#define GST_GDK_PIXBUF_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GDK_PIXBUF_SINK,GstGdkPixbufSinkClass)) +#define GST_IS_GDK_PIXBUF_SINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GDK_PIXBUF_SINK)) +#define GST_IS_GDK_PIXBUF_SINK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GDK_PIXBUF_SINK)) + +typedef struct _GstGdkPixbufSink GstGdkPixbufSink; +typedef struct _GstGdkPixbufSinkClass GstGdkPixbufSinkClass; + +/** + * GstGdkPixbufSink: + * + * Opaque element structure. + */ +struct _GstGdkPixbufSink +{ + GstVideoSink basesink; + + /*< private >*/ + + /* current caps */ + gint width; + gint height; + gint rowstride; + gint par_n; + gint par_d; + gboolean has_alpha; + + /* properties */ + gboolean send_messages; + GdkPixbuf * last_pixbuf; +}; + +/** + * GstGdkPixbufSinkClass: + * + * Opaque element class structure. + */ +struct _GstGdkPixbufSinkClass +{ + GstVideoSinkClass basesinkclass; +}; + +GType gst_gdk_pixbuf_sink_get_type (void); + +#endif /* GST_GDK_PIXBUF_SINK_H */ + |