Hello,
I am having problems with a simple chain element I have created. I'm trying to add a new argument to my code. It is a string type. The code compiles and runs, but I give it a value to the argument, and when I try to use the value, it appears as blank. Any suggestions? Thanks. I run it as: gst-launch -v -m videotestsrc pattern=snow ! template line_color="blue" ! autovideosink Heres is my header file: #ifndef __GST_TEMPLATE__ #define __GST_TEMPLATE__ #include "gstreamer-0.10/gst/gst.h" G_BEGIN_DECLS /* #defines don't like whitespacey bits */ #define GST_TYPE_TEMPLATE \ (gst_template_get_type()) #define GST_TEMPLATE(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TEMPLATE,GstTemplate)) #define GST_TEMPLATE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TEMPLATE,GstTemplateClass)) #define GST_IS_TEMPLATE(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_TEMPLATE)) #define GST_IS_TEMPLATE_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_TEMPLATE)) typedef struct _GstTemplate GstTemplate; typedef struct _GstTemplateClass GstTemplateClass; struct _GstTemplate { GstElement element; GstPad *sinkpad, *srcpad; gboolean silent; char *line_color; }; struct _GstTemplateClass { GstElementClass parent_class; }; GType gst_template_get_type (void); G_END_DECLS #endif /* __GST_TEMPLATE__ */ ------------------------------------Here is my source file---------------------------------- #ifdef HAVE_CONFIG_H # include <config.h> #endif #include <gst/gst.h> #include "gst_template.h" GST_DEBUG_CATEGORY_STATIC (gst_template_debug); #define GST_CAT_DEFAULT gst_template_debug enum { PROP_0, PROP_SILENT, LINE_COLOR }; static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("ANY") ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("ANY") ); GST_BOILERPLATE (GstTemplate, gst_template, GstElement, GST_TYPE_ELEMENT); static void gst_template_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_template_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_template_set_caps (GstPad * pad, GstCaps * caps); static GstFlowReturn gst_template_chain (GstPad * pad, GstBuffer * buf); static GType gst_tempalte_color_get_type (void) { static GType template_color_type = 0; static const GEnumValue template_color[] = { {GST_COLOR_RED, "The color red", "red"}, {GST_COLOR_BLUE, "The color blue", "blue"}, {0, NULL, NULL} }; if (!template_color_type) { template_color_type = g_enum_register_static ("Temlate", template_color); } return template_color_type; } static void gst_template_base_init (gpointer gclass) { GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); gst_element_class_set_details_simple(element_class, "Plugin Template", "Template", "Generic Chain Element", "name email"); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&src_factory)); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&sink_factory)); } static void gst_template_class_init (GstTemplateClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gobject_class->set_property = gst_template_set_property; gobject_class->get_property = gst_template_get_property; g_object_class_install_property (gobject_class, PROP_SILENT, g_param_spec_boolean ("silent", "Silent", "Produce verbose output ?",FALSE, G_PARAM_READWRITE)); g_object_class_install_property (gobject_class, LINE_COLOR, g_param_spec_string ("line_color", "Line_color", "Chenge the color of the line", "red", G_PARAM_READWRITE)); } static void gst_template_init (GstTemplate * filter, GstTemplateClass * gclass) { filter->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); gst_pad_set_setcaps_function (filter->sinkpad, GST_DEBUG_FUNCPTR(gst_template_set_caps)); gst_pad_set_getcaps_function (filter->sinkpad, GST_DEBUG_FUNCPTR(gst_pad_proxy_getcaps)); gst_pad_set_chain_function (filter->sinkpad, GST_DEBUG_FUNCPTR(gst_template_chain)); filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); gst_pad_set_getcaps_function (filter->srcpad, GST_DEBUG_FUNCPTR(gst_pad_proxy_getcaps)); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); filter->silent = FALSE; } static void gst_template_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { GstTemplate *filter = GST_TEMPLATE (object); switch (prop_id) { case PROP_SILENT: filter->silent = g_value_get_boolean (value); break; case LINE_COLOR: filter->line_color = g_value_get_string (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static void gst_template_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstTemplate *filter = GST_TEMPLATE (object); switch (prop_id) { case PROP_SILENT: g_value_set_boolean (value, filter->silent); break; case LINE_COLOR: g_value_set_string (value, filter->line_color); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } static gboolean gst_template_set_caps (GstPad * pad, GstCaps * caps) { GstStructure *structure = gst_caps_get_structure(caps,0); GstTemplate *filter; GstPad *otherpad; filter = GST_TEMPLATE (gst_pad_get_parent (pad)); gst_structure_get_int (structure, "rate", &filter->srcpad); otherpad = (pad == filter->srcpad) ? filter->sinkpad : filter->srcpad; gst_object_unref (filter); return gst_pad_set_caps (otherpad, caps); } static GstBuffer * gst_template_convert (GstPad * pad, GstBuffer *in) { GstBuffer *tempbuf; char *color; GstTemplate *filter; filter = GST_TEMPLATE (GST_OBJECT_PARENT (pad)); color = filter->line_color; g_print(" \n\nTHE COLOR IS %s\n\n",color); tempbuf = in; return tempbuf; } static GstFlowReturn gst_template_chain (GstPad * pad, GstBuffer * buf) { GstTemplate *filter; GstBuffer *outbuf; filter = GST_TEMPLATE (GST_OBJECT_PARENT (pad)); outbuf = gst_template_convert (pad, buf); return gst_pad_push (filter->srcpad, outbuf); } static gboolean plugin_init (GstPlugin * plugin) { GST_DEBUG_CATEGORY_INIT (gst_template_debug, "template", 0, "Template plugin"); return gst_element_register (plugin, "template", GST_RANK_NONE, GST_TYPE_TEMPLATE); } #ifndef PACKAGE #define PACKAGE "plugintemplate" #endif /* gstreamer looks for this structure to register plugins * * exchange the string 'Template plugin' with your plugin description */ GST_PLUGIN_DEFINE ( GST_VERSION_MAJOR, GST_VERSION_MINOR, "template", "Template Example", plugin_init, "0.10.28", "GPL", "GStreamer", "http://gstreamer.net/" )
All your bases are belong to us.
|
On Sat, 2012-04-14 at 22:36 -0700, iron_guitarist1987 wrote:
> filter->line_color = g_value_get_string (value); Try: g_free (filter->line_color); filter->line_color = g_value_dup_string (value); Cheers -Tim _______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |