diff --git a/configure.ac b/configure.ac index 7561c00379..dca8d0be17 100644 --- a/configure.ac +++ b/configure.ac @@ -353,6 +353,7 @@ AG_GST_CHECK_PLUGIN(sdi) AG_GST_CHECK_PLUGIN(sdp) AG_GST_CHECK_PLUGIN(segmentclip) AG_GST_CHECK_PLUGIN(siren) +AG_GST_CHECK_PLUGIN(smooth) AG_GST_CHECK_PLUGIN(speed) AG_GST_CHECK_PLUGIN(subenc) AG_GST_CHECK_PLUGIN(stereo) @@ -1947,6 +1948,7 @@ gst/sdi/Makefile gst/sdp/Makefile gst/segmentclip/Makefile gst/siren/Makefile +gst/smooth/Makefile gst/speed/Makefile gst/subenc/Makefile gst/stereo/Makefile diff --git a/gst/smooth/Makefile.am b/gst/smooth/Makefile.am index a640d96246..36de16113c 100644 --- a/gst/smooth/Makefile.am +++ b/gst/smooth/Makefile.am @@ -2,9 +2,29 @@ plugin_LTLIBRARIES = libgstsmooth.la libgstsmooth_la_SOURCES = gstsmooth.c -libgstsmooth_la_CFLAGS = $(GST_CFLAGS) -libgstsmooth_la_LIBADD = +libgstsmooth_la_CFLAGS = \ + $(GST_PLUGINS_BASE_CFLAGS) \ + $(GST_BASE_CFLAGS) \ + $(GST_CFLAGS) +libgstsmooth_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) \ + $(GST_LIBS) libgstsmooth_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstsmooth_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = gstsmooth.h + +Android.mk: Makefile.am $(BUILT_SOURCES) + androgenizer \ + -:PROJECT libgstsmooth -:SHARED libgstsmooth \ + -:TAGS eng debug \ + -:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \ + -:SOURCES $(libgstsmooth_la_SOURCES) \ + -:CFLAGS $(DEFS) $(DEFAULT_INCLUDES) $(libgstsmooth_la_CFLAGS) \ + -:LDFLAGS $(libgstsmooth_la_LDFLAGS) \ + $(libgstsmooth_la_LIBADD) \ + -ldl \ + -:PASSTHROUGH LOCAL_ARM_MODE:=arm \ + LOCAL_MODULE_PATH:='$$(TARGET_OUT)/lib/gstreamer-0.10' \ + > $@ diff --git a/gst/smooth/gstsmooth.c b/gst/smooth/gstsmooth.c index 0d301b4c81..66eade1d78 100644 --- a/gst/smooth/gstsmooth.c +++ b/gst/smooth/gstsmooth.c @@ -1,5 +1,7 @@ /* GStreamer * Copyright (C) <1999> Erik Walthinsen + * <2001> Wim Taymans + * <2011> Stefan Sauer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -24,20 +26,15 @@ #include "gstsmooth.h" #include -/* Smooth signals and args */ -enum -{ - /* FILL ME */ - LAST_SIGNAL -}; +/* Smooth args */ enum { - ARG_0, - ARG_ACTIVE, - ARG_TOLERANCE, - ARG_FILTERSIZE, - ARG_LUM_ONLY + PROP_0, + PROP_ACTIVE, + PROP_TOLERANCE, + PROP_FILTER_SIZE, + PROP_LUMA_ONLY }; static GstStaticPadTemplate gst_smooth_src_template = @@ -56,11 +53,12 @@ GST_STATIC_PAD_TEMPLATE ("sink", ) ); -static void gst_smooth_class_init (GstSmoothClass * klass); -static void gst_smooth_base_init (GstSmoothClass * klass); -static void gst_smooth_init (GstSmooth * smooth); -static void gst_smooth_chain (GstPad * pad, GstData * _data); +static gboolean gst_smooth_set_caps (GstBaseTransform * btrans, + GstCaps * incaps, GstCaps * outcaps); + +static GstFlowReturn gst_smooth_transform (GstBaseTransform * btrans, + GstBuffer * inbuf, GstBuffer * outbuf); static void smooth_filter (unsigned char *dest, unsigned char *src, int width, int height, int tolerance, int filtersize); @@ -69,38 +67,12 @@ static void gst_smooth_set_property (GObject * object, guint prop_id, static void gst_smooth_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static GstElementClass *parent_class = NULL; - -/*static guint gst_smooth_signals[LAST_SIGNAL] = { 0 }; */ - -GType -gst_smooth_get_type (void) -{ - static GType smooth_type = 0; - - if (!smooth_type) { - static const GTypeInfo smooth_info = { - sizeof (GstSmoothClass), - (GBaseInitFunc) gst_smooth_base_init, - NULL, - (GClassInitFunc) gst_smooth_class_init, - NULL, - NULL, - sizeof (GstSmooth), - 0, - (GInstanceInitFunc) gst_smooth_init, - }; - - smooth_type = - g_type_register_static (GST_TYPE_ELEMENT, "GstSmooth", &smooth_info, 0); - } - return smooth_type; -} +GST_BOILERPLATE (GstSmooth, gst_smooth, GstVideoFilter, GST_TYPE_VIDEO_FILTER); static void -gst_smooth_base_init (GstSmoothClass * klass) +gst_smooth_base_init (gpointer g_class) { - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_smooth_sink_template)); @@ -115,76 +87,63 @@ gst_smooth_base_init (GstSmoothClass * klass) static void gst_smooth_class_init (GstSmoothClass * klass) { - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - - gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; - - parent_class = g_type_class_peek_parent (klass); - - /* FIXME: add long property descriptions */ - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ACTIVE, - g_param_spec_boolean ("active", "active", "active", TRUE, - G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TOLERANCE, - g_param_spec_int ("tolerance", "tolerance", "tolerance", G_MININT, - G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FILTERSIZE, - g_param_spec_int ("filtersize", "filtersize", "filtersize", G_MININT, - G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + GObjectClass *gobject_class = (GObjectClass *) klass; + GstBaseTransformClass *btrans_class = (GstBaseTransformClass *) klass; gobject_class->set_property = gst_smooth_set_property; gobject_class->get_property = gst_smooth_get_property; + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ACTIVE, + g_param_spec_boolean ("active", "active", "process video", TRUE, + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TOLERANCE, + g_param_spec_int ("tolerance", + "tolerance", "contrast tolerance for smoothing", G_MININT, + G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FILTER_SIZE, + g_param_spec_int ("filter-size", "filter-size", "size of media filter", + G_MININT, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LUMA_ONLY, + g_param_spec_boolean ("luma-only", "luma-only", "only filter luma part", + TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + btrans_class->transform = GST_DEBUG_FUNCPTR (gst_smooth_transform); + btrans_class->set_caps = GST_DEBUG_FUNCPTR (gst_smooth_set_caps); } -static GstPadLinkReturn -gst_smooth_link (GstPad * pad, const GstCaps * caps) +static gboolean +gst_smooth_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) { GstSmooth *filter; GstStructure *structure; gboolean ret; - filter = GST_SMOOTH (gst_pad_get_parent (pad)); + filter = GST_SMOOTH (btrans); - structure = gst_caps_get_structure (caps, 0); + structure = gst_caps_get_structure (incaps, 0); ret = gst_structure_get_int (structure, "width", &filter->width); ret &= gst_structure_get_int (structure, "height", &filter->height); - if (!ret) - return GST_PAD_LINK_REFUSED; - - return gst_pad_try_set_caps (filter->srcpad, caps); + return ret; } static void -gst_smooth_init (GstSmooth * smooth) +gst_smooth_init (GstSmooth * smooth, GstSmoothClass * klass) { - smooth->sinkpad = - gst_pad_new_from_static_template (&gst_smooth_sink_template, "sink"); - gst_pad_set_link_function (smooth->sinkpad, gst_smooth_link); - gst_pad_set_chain_function (smooth->sinkpad, gst_smooth_chain); - gst_element_add_pad (GST_ELEMENT (smooth), smooth->sinkpad); - - smooth->srcpad = - gst_pad_new_from_static_template (&gst_smooth_sink_template, "src"); - gst_pad_set_link_function (smooth->srcpad, gst_smooth_link); - gst_element_add_pad (GST_ELEMENT (smooth), smooth->srcpad); - smooth->active = TRUE; smooth->tolerance = 8; smooth->filtersize = 3; - smooth->lum_only = TRUE; + smooth->luma_only = TRUE; } static void -smooth_filter (unsigned char *dest, unsigned char *src, int width, int height, - int tolerance, int filtersize) +smooth_filter (guchar * dest, guchar * src, gint width, gint height, + gint tolerance, gint filtersize) { - int refval, aktval, upperval, lowerval, numvalues, sum; - int x, y, fx, fy, fy1, fy2, fx1, fx2; - unsigned char *srcp = src; + gint refval, aktval, upperval, lowerval, numvalues, sum; + gint x, y, fx, fy, fy1, fy2, fx1, fx2; + guchar *srcp = src; fy1 = 0; fy2 = MIN (filtersize + 1, height) * width; @@ -224,57 +183,44 @@ smooth_filter (unsigned char *dest, unsigned char *src, int width, int height, } } -static void -gst_smooth_chain (GstPad * pad, GstData * _data) +static GstFlowReturn +gst_smooth_transform (GstBaseTransform * btrans, GstBuffer * inbuf, + GstBuffer * outbuf) { - GstBuffer *buf = GST_BUFFER (_data); GstSmooth *smooth; - guchar *data; + guchar *idata, *odata; gulong size; - GstBuffer *outbuf; gint lumsize, chromsize; - g_return_if_fail (pad != NULL); - g_return_if_fail (GST_IS_PAD (pad)); - g_return_if_fail (buf != NULL); - - smooth = GST_SMOOTH (GST_OBJECT_PARENT (pad)); + smooth = GST_SMOOTH (btrans); + idata = GST_BUFFER_DATA (inbuf); + odata = GST_BUFFER_DATA (outbuf); + size = GST_BUFFER_SIZE (inbuf); if (!smooth->active) { - gst_pad_push (smooth->srcpad, GST_DATA (buf)); - return; + memcpy (odata, idata, size); + return GST_FLOW_OK; } - data = GST_BUFFER_DATA (buf); - size = GST_BUFFER_SIZE (buf); - - GST_DEBUG ("smooth: have buffer of %d", GST_BUFFER_SIZE (buf)); - - outbuf = gst_buffer_new (); - GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (buf)); - GST_BUFFER_SIZE (outbuf) = GST_BUFFER_SIZE (buf); + GST_DEBUG_OBJECT (smooth, "smooth: have buffer of %d", size); lumsize = smooth->width * smooth->height; chromsize = lumsize / 4; - smooth_filter (GST_BUFFER_DATA (outbuf), data, smooth->width, smooth->height, + smooth_filter (odata, idata, smooth->width, smooth->height, smooth->tolerance, smooth->filtersize); - if (!smooth->lum_only) { - smooth_filter (GST_BUFFER_DATA (outbuf) + lumsize, data + lumsize, + if (!smooth->luma_only) { + smooth_filter (odata + lumsize, idata + lumsize, smooth->width / 2, smooth->height / 2, smooth->tolerance, smooth->filtersize / 2); - smooth_filter (GST_BUFFER_DATA (outbuf) + lumsize + chromsize, - data + lumsize + chromsize, smooth->width / 2, smooth->height / 2, + smooth_filter (odata + lumsize + chromsize, + idata + lumsize + chromsize, smooth->width / 2, smooth->height / 2, smooth->tolerance, smooth->filtersize / 2); } else { - memcpy (GST_BUFFER_DATA (outbuf) + lumsize, data + lumsize, chromsize * 2); + memcpy (odata + lumsize, idata + lumsize, chromsize * 2); } - GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); - - gst_buffer_unref (buf); - - gst_pad_push (smooth->srcpad, GST_DATA (outbuf)); + return GST_FLOW_OK; } static void @@ -287,19 +233,20 @@ gst_smooth_set_property (GObject * object, guint prop_id, const GValue * value, smooth = GST_SMOOTH (object); switch (prop_id) { - case ARG_ACTIVE: + case PROP_ACTIVE: smooth->active = g_value_get_boolean (value); break; - case ARG_TOLERANCE: + case PROP_TOLERANCE: smooth->tolerance = g_value_get_int (value); break; - case ARG_FILTERSIZE: + case PROP_FILTER_SIZE: smooth->filtersize = g_value_get_int (value); break; - case ARG_LUM_ONLY: - smooth->lum_only = g_value_get_boolean (value); + case PROP_LUMA_ONLY: + smooth->luma_only = g_value_get_boolean (value); break; default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } @@ -314,17 +261,17 @@ gst_smooth_get_property (GObject * object, guint prop_id, GValue * value, smooth = GST_SMOOTH (object); switch (prop_id) { - case ARG_ACTIVE: + case PROP_ACTIVE: g_value_set_boolean (value, smooth->active); break; - case ARG_TOLERANCE: + case PROP_TOLERANCE: g_value_set_int (value, smooth->tolerance); break; - case ARG_FILTERSIZE: + case PROP_FILTER_SIZE: g_value_set_int (value, smooth->filtersize); break; - case ARG_LUM_ONLY: - g_value_set_boolean (value, smooth->lum_only); + case PROP_LUMA_ONLY: + g_value_set_boolean (value, smooth->luma_only); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); diff --git a/gst/smooth/gstsmooth.h b/gst/smooth/gstsmooth.h index 6e6579f118..67e700025b 100644 --- a/gst/smooth/gstsmooth.h +++ b/gst/smooth/gstsmooth.h @@ -23,6 +23,8 @@ #include +#include +#include #ifdef __cplusplus extern "C" { @@ -44,7 +46,7 @@ typedef struct _GstSmooth GstSmooth; typedef struct _GstSmoothClass GstSmoothClass; struct _GstSmooth { - GstElement element; + GstVideoFilter element; int format; int width; @@ -53,13 +55,13 @@ struct _GstSmooth { gboolean active; int tolerance; int filtersize; - gboolean lum_only; + gboolean luma_only; GstPad *sinkpad,*srcpad; }; struct _GstSmoothClass { - GstElementClass parent_class; + GstVideoFilterClass parent_class; }; GType gst_smooth_get_type(void);