static gboolean gst_gdk_pixbuf_overlay_start (GstBaseTransform * trans) { GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (trans); GError *err = NULL; if (overlay->location != NULL) { if (!gst_gdk_pixbuf_overlay_load_image (overlay, &err)) goto error_loading_image; gst_base_transform_set_passthrough (trans, FALSE); } else { GST_WARNING_OBJECT (overlay, "no image location set, doing nothing"); gst_base_transform_set_passthrough (trans, TRUE); } return TRUE; /* ERRORS */ error_loading_image: { GST_ELEMENT_ERROR (overlay, RESOURCE, OPEN_READ, ("Could not load overlay image."), ("%s", err->message)); g_error_free (err); return FALSE; } }
static void gst_gdk_pixbuf_overlay_before_transform (GstBaseTransform * trans, GstBuffer * outbuf) { GstClockTime stream_time; GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (trans); gboolean set_passthrough = FALSE; stream_time = gst_segment_to_stream_time (&trans->segment, GST_FORMAT_TIME, GST_BUFFER_TIMESTAMP (outbuf)); if (GST_CLOCK_TIME_IS_VALID (stream_time)) gst_object_sync_values (GST_OBJECT (trans), stream_time); /* now properties have been sync'ed; maybe need to update composition */ GST_OBJECT_LOCK (overlay); if (G_UNLIKELY (overlay->update_composition)) { gst_gdk_pixbuf_overlay_update_composition (overlay); overlay->update_composition = FALSE; set_passthrough = TRUE; } GST_OBJECT_UNLOCK (overlay); /* determine passthrough mode so the buffer is writable if needed * when passed into _transform_ip */ if (G_UNLIKELY (set_passthrough)) gst_base_transform_set_passthrough (trans, overlay->comp == NULL); }
void gst_gdk_pixbuf_overlay_finalize (GObject * object) { GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (object); g_free (overlay->location); overlay->location = NULL; G_OBJECT_CLASS (gst_gdk_pixbuf_overlay_parent_class)->finalize (object); }
void gst_gdk_pixbuf_overlay_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (object); GST_OBJECT_LOCK (overlay); switch (property_id) { case PROP_LOCATION:{ GError *err = NULL; g_free (overlay->location); overlay->location = g_value_dup_string (value); if (!gst_gdk_pixbuf_overlay_load_image (overlay, &err)) { GST_ERROR_OBJECT (overlay, "Could not load overlay image: %s", err->message); g_error_free (err); } } break; case PROP_OFFSET_X: overlay->offset_x = g_value_get_int (value); overlay->update_composition = TRUE; break; case PROP_OFFSET_Y: overlay->offset_y = g_value_get_int (value); overlay->update_composition = TRUE; break; case PROP_RELATIVE_X: overlay->relative_x = g_value_get_double (value); overlay->update_composition = TRUE; break; case PROP_RELATIVE_Y: overlay->relative_y = g_value_get_double (value); overlay->update_composition = TRUE; break; case PROP_OVERLAY_WIDTH: overlay->overlay_width = g_value_get_int (value); overlay->update_composition = TRUE; break; case PROP_OVERLAY_HEIGHT: overlay->overlay_height = g_value_get_int (value); overlay->update_composition = TRUE; break; case PROP_ALPHA: overlay->alpha = g_value_get_double (value); overlay->update_composition = TRUE; break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } GST_OBJECT_UNLOCK (overlay); }
static GstFlowReturn gst_gdk_pixbuf_overlay_transform_frame_ip (GstVideoFilter * filter, GstVideoFrame * frame) { GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (filter); if (overlay->comp != NULL) gst_video_overlay_composition_blend (overlay->comp, frame); return GST_FLOW_OK; }
void gst_gdk_pixbuf_overlay_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (object); GST_OBJECT_LOCK (overlay); switch (property_id) { case PROP_LOCATION: g_value_set_string (value, overlay->location); break; case PROP_PIXBUF: g_value_set_object (value, overlay->pixbuf); break; case PROP_OFFSET_X: g_value_set_int (value, overlay->offset_x); break; case PROP_OFFSET_Y: g_value_set_int (value, overlay->offset_y); break; case PROP_RELATIVE_X: g_value_set_double (value, overlay->relative_x); break; case PROP_RELATIVE_Y: g_value_set_double (value, overlay->relative_y); break; case PROP_COEF_X: g_value_set_double (value, overlay->coef_x); break; case PROP_COEF_Y: g_value_set_double (value, overlay->coef_y); break; case PROP_OVERLAY_WIDTH: g_value_set_int (value, overlay->overlay_width); break; case PROP_OVERLAY_HEIGHT: g_value_set_int (value, overlay->overlay_height); break; case PROP_ALPHA: g_value_set_double (value, overlay->alpha); break; case PROP_POSITIONING_MODE: g_value_set_enum (value, overlay->positioning_mode); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } GST_OBJECT_UNLOCK (overlay); }
static gboolean gst_gdk_pixbuf_overlay_stop (GstBaseTransform * trans) { GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (trans); if (overlay->comp) { gst_video_overlay_composition_unref (overlay->comp); overlay->comp = NULL; } gst_buffer_replace (&overlay->pixels, NULL); return TRUE; }
static gboolean gst_gdk_pixbuf_overlay_set_caps (GstBaseTransform * trans, GstCaps * incaps, GstCaps * outcaps) { GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (trans); GstVideoFormat video_format; int w, h; if (!gst_video_format_parse_caps (incaps, &video_format, &w, &h)) return FALSE; overlay->format = video_format; overlay->width = w; overlay->height = h; return TRUE; }
static GstFlowReturn gst_gdk_pixbuf_overlay_transform_ip (GstBaseTransform * trans, GstBuffer * buf) { GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (trans); GST_OBJECT_LOCK (overlay); if (G_UNLIKELY (overlay->update_composition)) { gst_gdk_pixbuf_overlay_update_composition (overlay); overlay->update_composition = FALSE; } GST_OBJECT_UNLOCK (overlay); if (overlay->comp != NULL) gst_video_overlay_composition_blend (overlay->comp, buf); return GST_FLOW_OK; }
static GstFlowReturn gst_gdk_pixbuf_overlay_transform_frame_ip (GstVideoFilter * filter, GstVideoFrame * frame) { GstGdkPixbufOverlay *overlay = GST_GDK_PIXBUF_OVERLAY (filter); GST_OBJECT_LOCK (overlay); if (G_UNLIKELY (overlay->update_composition)) { gst_gdk_pixbuf_overlay_update_composition (overlay); overlay->update_composition = FALSE; } GST_OBJECT_UNLOCK (overlay); if (overlay->comp != NULL) gst_video_overlay_composition_blend (overlay->comp, frame); return GST_FLOW_OK; }