gdkpixbufoverlay: add "pixbuf" property

So we can set a GdkPixbuf directly instead of
reading it from an image file on the file system.
This commit is contained in:
Tim-Philipp Müller 2014-11-29 13:53:03 +00:00
parent 35f10e4630
commit 8c2d55d1e9
2 changed files with 49 additions and 9 deletions

View file

@ -1,5 +1,5 @@
/* GStreamer GdkPixbuf overlay /* GStreamer GdkPixbuf overlay
* Copyright (C) 2012 Tim-Philipp Müller <tim centricular net> * Copyright (C) 2012-2014 Tim-Philipp Müller <tim centricular net>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public * modify it under the terms of the GNU Library General Public
@ -73,11 +73,14 @@ static gboolean gst_gdk_pixbuf_overlay_set_info (GstVideoFilter * filter,
static gboolean static gboolean
gst_gdk_pixbuf_overlay_load_image (GstGdkPixbufOverlay * overlay, gst_gdk_pixbuf_overlay_load_image (GstGdkPixbufOverlay * overlay,
GError ** err); GError ** err);
static void gst_gdk_pixbuf_overlay_set_pixbuf (GstGdkPixbufOverlay * overlay,
GdkPixbuf * pixbuf);
enum enum
{ {
PROP_0, PROP_0,
PROP_LOCATION, PROP_LOCATION,
PROP_PIXBUF,
PROP_OFFSET_X, PROP_OFFSET_X,
PROP_OFFSET_Y, PROP_OFFSET_Y,
PROP_RELATIVE_X, PROP_RELATIVE_X,
@ -179,6 +182,17 @@ gst_gdk_pixbuf_overlay_class_init (GstGdkPixbufOverlayClass * klass)
g_param_spec_double ("alpha", "Alpha", "Global alpha of overlay image", g_param_spec_double ("alpha", "Alpha", "Global alpha of overlay image",
0.0, 1.0, 1.0, GST_PARAM_CONTROLLABLE | GST_PARAM_MUTABLE_PLAYING 0.0, 1.0, 1.0, GST_PARAM_CONTROLLABLE | GST_PARAM_MUTABLE_PLAYING
| G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* GstGdkPixbufOverlay:pixbuf:
*
* GdkPixbuf object to render.
*
* Since: 1.6
*/
g_object_class_install_property (gobject_class, PROP_PIXBUF,
g_param_spec_object ("pixbuf", "Pixbuf", "GdkPixbuf object to render",
GDK_TYPE_PIXBUF, GST_PARAM_CONTROLLABLE | GST_PARAM_MUTABLE_PLAYING
| G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
gst_element_class_add_pad_template (element_class, gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&sink_template)); gst_static_pad_template_get (&sink_template));
@ -206,6 +220,8 @@ gst_gdk_pixbuf_overlay_init (GstGdkPixbufOverlay * overlay)
overlay->overlay_height = 0; overlay->overlay_height = 0;
overlay->alpha = 1.0; overlay->alpha = 1.0;
overlay->pixbuf = NULL;
} }
void void
@ -226,8 +242,17 @@ gst_gdk_pixbuf_overlay_set_property (GObject * object, guint property_id,
err->message); err->message);
g_error_free (err); g_error_free (err);
} }
}
break; break;
}
case PROP_PIXBUF:{
GdkPixbuf *pixbuf = g_value_get_object (value);
if (overlay->pixbuf != NULL)
g_object_unref (overlay->pixbuf);
overlay->pixbuf = g_object_ref (pixbuf);
gst_gdk_pixbuf_overlay_set_pixbuf (overlay, g_object_ref (pixbuf));
break;
}
case PROP_OFFSET_X: case PROP_OFFSET_X:
overlay->offset_x = g_value_get_int (value); overlay->offset_x = g_value_get_int (value);
overlay->update_composition = TRUE; overlay->update_composition = TRUE;
@ -276,6 +301,9 @@ gst_gdk_pixbuf_overlay_get_property (GObject * object, guint property_id,
case PROP_LOCATION: case PROP_LOCATION:
g_value_set_string (value, overlay->location); g_value_set_string (value, overlay->location);
break; break;
case PROP_PIXBUF:
g_value_set_object (value, overlay->pixbuf);
break;
case PROP_OFFSET_X: case PROP_OFFSET_X:
g_value_set_int (value, overlay->offset_x); g_value_set_int (value, overlay->offset_x);
break; break;
@ -319,16 +347,26 @@ gst_gdk_pixbuf_overlay_finalize (GObject * object)
static gboolean static gboolean
gst_gdk_pixbuf_overlay_load_image (GstGdkPixbufOverlay * overlay, GError ** err) gst_gdk_pixbuf_overlay_load_image (GstGdkPixbufOverlay * overlay, GError ** err)
{ {
GstVideoMeta *video_meta;
GdkPixbuf *pixbuf; GdkPixbuf *pixbuf;
guint8 *pixels, *p;
gint width, height, stride, w, h, plane;
pixbuf = gdk_pixbuf_new_from_file (overlay->location, err); pixbuf = gdk_pixbuf_new_from_file (overlay->location, err);
if (pixbuf == NULL) if (pixbuf == NULL)
return FALSE; return FALSE;
gst_gdk_pixbuf_overlay_set_pixbuf (overlay, pixbuf);
return TRUE;
}
/* Takes ownership of pixbuf; call with OBJECT_LOCK */
static void
gst_gdk_pixbuf_overlay_set_pixbuf (GstGdkPixbufOverlay * overlay,
GdkPixbuf * pixbuf)
{
GstVideoMeta *video_meta;
guint8 *pixels, *p;
gint width, height, stride, w, h, plane;
if (!gdk_pixbuf_get_has_alpha (pixbuf)) { if (!gdk_pixbuf_get_has_alpha (pixbuf)) {
GdkPixbuf *alpha_pixbuf; GdkPixbuf *alpha_pixbuf;
@ -384,8 +422,7 @@ gst_gdk_pixbuf_overlay_load_image (GstGdkPixbufOverlay * overlay, GError ** err)
overlay->update_composition = TRUE; overlay->update_composition = TRUE;
GST_INFO_OBJECT (overlay, "Loaded image, %d x %d", width, height); GST_INFO_OBJECT (overlay, "Updated pixbuf, %d x %d", width, height);
return TRUE;
} }
static gboolean static gboolean

View file

@ -1,5 +1,5 @@
/* GStreamer GdkPixbuf overlay /* GStreamer GdkPixbuf overlay
* Copyright (C) 2012 Tim-Philipp Müller <tim centricular net> * Copyright (C) 2012-2014 Tim-Philipp Müller <tim centricular net>
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public * modify it under the terms of the GNU Library General Public
@ -49,6 +49,9 @@ struct _GstGdkPixbufOverlay
/* properties */ /* properties */
gchar * location; gchar * location;
/* pixbuf set via pixbuf property */
GdkPixbuf * pixbuf;
gint offset_x; gint offset_x;
gint offset_y; gint offset_y;
@ -61,7 +64,7 @@ struct _GstGdkPixbufOverlay
gdouble alpha; gdouble alpha;
/* the loaded image, as BGRA/ARGB pixels, with GstVideoMeta */ /* the loaded image, as BGRA/ARGB pixels, with GstVideoMeta */
GstBuffer * pixels; GstBuffer * pixels; /* OBJECT_LOCK */
GstVideoOverlayComposition * comp; GstVideoOverlayComposition * comp;