static gboolean gst_rsvg_overlay_data_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { GstRsvgOverlay *overlay = GST_RSVG_OVERLAY (GST_PAD_PARENT (pad)); GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event)); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS:{ guint data_size; GST_RSVG_LOCK (overlay); /* FIXME: rsvgdec looks for </svg> in data to determine the end of SVG code. Should we really do the same here? IOW, could data be sent and _pushed() before the EOS gets processed? */ data_size = gst_adapter_available (overlay->adapter); if (data_size) { gst_rsvg_overlay_set_svg_data (overlay, (const gchar *) gst_adapter_take (overlay->adapter, data_size), FALSE); gst_adapter_clear (overlay->adapter); } GST_RSVG_UNLOCK (overlay); } break; case GST_EVENT_FLUSH_STOP: gst_adapter_clear (overlay->adapter); break; default: break; } /* Dropping all events here */ gst_event_unref (event); return TRUE; }
static void gst_rsvg_overlay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstRsvgOverlay *overlay = GST_RSVG_OVERLAY (object); GST_RSVG_LOCK (overlay); switch (prop_id) { case PROP_DATA: { gst_rsvg_overlay_set_svg_data (overlay, g_value_get_string (value), FALSE); break; } case PROP_FILENAME: { gst_rsvg_overlay_set_svg_data (overlay, g_value_get_string (value), TRUE); break; } case PROP_FIT_TO_FRAME: { if (g_value_get_boolean (value)) { overlay->x_offset = 0; overlay->y_offset = 0; overlay->x_relative = 0.0; overlay->y_relative = 0.0; overlay->width = 0; overlay->height = 0; overlay->width_relative = 1.0; overlay->height_relative = 1.0; } else { overlay->width_relative = 0; overlay->height_relative = 0; } break; } case PROP_X: { overlay->x_offset = g_value_get_int (value); break; } case PROP_Y: { overlay->y_offset = g_value_get_int (value); break; } case PROP_X_RELATIVE: { overlay->x_relative = g_value_get_float (value); break; } case PROP_Y_RELATIVE: { overlay->y_relative = g_value_get_float (value); break; } case PROP_WIDTH: { overlay->width = g_value_get_int (value); break; } case PROP_HEIGHT: { overlay->height = g_value_get_int (value); break; } case PROP_WIDTH_RELATIVE: { overlay->width_relative = g_value_get_float (value); break; } case PROP_HEIGHT_RELATIVE: { overlay->height_relative = g_value_get_float (value); break; } default: { G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } GST_RSVG_UNLOCK (overlay); }