X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gst%2Fmedian%2Fgstmedian.c;h=b4d41660c630dbf5bc1334eac7375c4d0ec60b5d;hb=e46d34995dbfd1481f962b620df4dfa4266f7977;hp=2c6113dc405b20abfb55e6ea92e175e11b4f0e1d;hpb=29aa39e99c71e2c7ae98883e72620e590e6ec965;p=platform%2Fupstream%2Fgst-plugins-good.git diff --git a/gst/median/gstmedian.c b/gst/median/gstmedian.c index 2c6113d..b4d4166 100644 --- a/gst/median/gstmedian.c +++ b/gst/median/gstmedian.c @@ -17,38 +17,44 @@ * Boston, MA 02111-1307, USA. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include #include +#include - +/* elementfactory information */ static GstElementDetails median_details = { "Median effect", - "Filter/Effect", - "apply a median filter to an image", - VERSION, - "Wim Taymans ", - "(C) 2000", + "Filter/Effect/Video", + "Apply a median filter to an image", + "Wim Taymans " }; -GST_PADTEMPLATE_FACTORY (median_src_factory, +GST_PAD_TEMPLATE_FACTORY (median_src_factory, "src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_CAPS_NEW ( + gst_caps_new ( "median_src", - "video/raw", - "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")) + "video/x-raw-yuv", + GST_VIDEO_YUV_PAD_TEMPLATE_PROPS ( + GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")) + ) ) ) -GST_PADTEMPLATE_FACTORY (median_sink_factory, +GST_PAD_TEMPLATE_FACTORY (median_sink_factory, "sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_CAPS_NEW ( - "median_src", - "video/raw", - "format", GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")) + gst_caps_new ( + "median_src", + "video/x-raw-yuv", + GST_VIDEO_YUV_PAD_TEMPLATE_PROPS ( + GST_PROPS_FOURCC (GST_STR_FOURCC ("I420")) + ) ) ) @@ -68,11 +74,12 @@ enum { static GType gst_median_get_type (void); static void gst_median_class_init (GstMedianClass *klass); +static void gst_median_base_init (GstMedianClass *klass); static void gst_median_init (GstMedian *median); static void median_5 (unsigned char *src, unsigned char *dest, int height, int width); static void median_9 (unsigned char *src, unsigned char *dest, int height, int width); -static void gst_median_chain (GstPad *pad, GstBuffer *buf); +static void gst_median_chain (GstPad *pad, GstData *_data); static void gst_median_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); static void gst_median_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); @@ -87,7 +94,10 @@ gst_median_get_type (void) if (!median_type) { static const GTypeInfo median_info = { - sizeof(GstMedianClass), NULL, NULL, (GClassInitFunc)gst_median_class_init, + sizeof(GstMedianClass), + (GBaseInitFunc)gst_median_base_init, + NULL, + (GClassInitFunc)gst_median_class_init, NULL, NULL, sizeof(GstMedian), @@ -100,6 +110,18 @@ gst_median_get_type (void) } static void +gst_median_base_init (GstMedianClass *klass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_pad_template (element_class, + GST_PAD_TEMPLATE_GET (median_sink_factory)); + gst_element_class_add_pad_template (element_class, + GST_PAD_TEMPLATE_GET (median_src_factory)); + gst_element_class_set_details (element_class, &median_details); +} + +static void gst_median_class_init (GstMedianClass *klass) { GObjectClass *gobject_class; @@ -132,24 +154,25 @@ gst_median_sinkconnect (GstPad *pad, GstCaps *caps) filter = GST_MEDIAN (gst_pad_get_parent (pad)); if (!GST_CAPS_IS_FIXED (caps)) - return GST_PAD_CONNECT_DELAYED; + return GST_PAD_LINK_DELAYED; - filter->width = gst_caps_get_int (caps, "width"); - filter->height = gst_caps_get_int (caps, "height"); + gst_caps_get_int (caps, "width", &filter->width); + gst_caps_get_int (caps, "height", &filter->height); - return GST_PAD_CONNECT_OK; + /* forward to the next plugin */ + return gst_pad_try_set_caps(filter->srcpad, gst_caps_copy_1(caps)); } void gst_median_init (GstMedian *median) { median->sinkpad = gst_pad_new_from_template ( - GST_PADTEMPLATE_GET (median_sink_factory), "sink"); - gst_pad_set_connect_function (median->sinkpad, gst_median_sinkconnect); + GST_PAD_TEMPLATE_GET (median_sink_factory), "sink"); + gst_pad_set_link_function (median->sinkpad, gst_median_sinkconnect); gst_pad_set_chain_function (median->sinkpad, gst_median_chain); gst_element_add_pad (GST_ELEMENT (median), median->sinkpad); median->srcpad = gst_pad_new_from_template ( - GST_PADTEMPLATE_GET (median_src_factory), "src"); + GST_PAD_TEMPLATE_GET (median_src_factory), "src"); gst_element_add_pad (GST_ELEMENT (median), median->srcpad); median->filtersize = 5; @@ -195,10 +218,13 @@ median_5 (unsigned char *src, unsigned char *dest, int width, int height) PIX_SORT(p[1],p[2]) ; dest[i] = p[2]; } - dest[i] = src[i++]; - dest[i] = src[i++]; + dest[i] = src[i]; + i++; + dest[i] = src[i]; + i++; } - dest[i] = src[i++]; + dest[i] = src[i]; + i++; } static void @@ -244,15 +270,19 @@ median_9 (unsigned char *src, unsigned char *dest, int width, int height) PIX_SORT(p[4], p[2]) ; dest[i] = p[4]; } - dest[i] = src[i++]; - dest[i] = src[i++]; + dest[i] = src[i]; + i++; + dest[i] = src[i]; + i++; } - dest[i] = src[i++]; + dest[i] = src[i]; + i++; } static void -gst_median_chain (GstPad *pad, GstBuffer *buf) +gst_median_chain (GstPad *pad, GstData *_data) { + GstBuffer *buf = GST_BUFFER (_data); GstMedian *median; guchar *data; gulong size; @@ -267,14 +297,14 @@ gst_median_chain (GstPad *pad, GstBuffer *buf) median = GST_MEDIAN (GST_OBJECT_PARENT (pad)); if (!median->active) { - gst_pad_push(median->srcpad,buf); + gst_pad_push(median->srcpad,GST_DATA (buf)); return; } data = GST_BUFFER_DATA(buf); size = GST_BUFFER_SIZE(buf); - GST_DEBUG (0,"median: have buffer of %d", GST_BUFFER_SIZE(buf)); + GST_DEBUG ("median: have buffer of %d", GST_BUFFER_SIZE(buf)); outbuf = gst_buffer_new(); GST_BUFFER_DATA(outbuf) = g_malloc(GST_BUFFER_SIZE(buf)); @@ -307,7 +337,7 @@ gst_median_chain (GstPad *pad, GstBuffer *buf) gst_buffer_unref(buf); - gst_pad_push(median->srcpad,outbuf); + gst_pad_push(median->srcpad,GST_DATA (outbuf)); } static void @@ -368,26 +398,20 @@ gst_median_get_property (GObject *object, guint prop_id, GValue *value, GParamSp static gboolean -plugin_init (GModule *module, GstPlugin *plugin) +plugin_init (GstPlugin *plugin) { - GstElementFactory *factory; - - factory = gst_elementfactory_new("median",GST_TYPE_MEDIAN, - &median_details); - g_return_val_if_fail(factory != NULL, FALSE); - - gst_elementfactory_add_padtemplate (factory, GST_PADTEMPLATE_GET (median_sink_factory)); - gst_elementfactory_add_padtemplate (factory, GST_PADTEMPLATE_GET (median_src_factory)); - - gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory)); - - return TRUE; + return gst_element_register (plugin, "median", + GST_RANK_NONE, GST_TYPE_MEDIAN); } -GstPluginDesc plugin_desc = { +GST_PLUGIN_DEFINE ( GST_VERSION_MAJOR, GST_VERSION_MINOR, "median", - plugin_init -}; - + "Video median filter", + plugin_init, + VERSION, + GST_LICENSE, + GST_PACKAGE, + GST_ORIGIN +)