diff options
author | Julien Moutte <julien@moutte.net> | 2005-11-23 15:50:51 +0000 |
---|---|---|
committer | Julien Moutte <julien@moutte.net> | 2005-11-23 15:50:51 +0000 |
commit | 2ea4f5b3c92819681f2d9e6f5f8d014b4d179344 (patch) | |
tree | db8696ff4b83e3f0ea882402e3435d8dacdbb488 /gst/effectv/gstquark.c | |
parent | 48520a455d828b4a6885fb37be48ebb720ae259b (diff) |
VideoFilter inherits from
Original commit message from CVS:
2005-11-23 Julien MOUTTE <julien@moutte.net>
* ext/cairo/gsttimeoverlay.c:
(gst_timeoverlay_update_font_height),
(gst_timeoverlay_set_caps), (gst_timeoverlay_get_unit_size),
(gst_timeoverlay_transform), (gst_timeoverlay_base_init),
(gst_timeoverlay_class_init), (gst_timeoverlay_init),
(gst_timeoverlay_get_type):
* ext/cairo/gsttimeoverlay.h:
* gst/debug/Makefile.am:
* gst/debug/gstnavigationtest.c:
(gst_navigationtest_handle_src_event),
(gst_navigationtest_get_unit_size),
(gst_navigationtest_set_caps),
(gst_navigationtest_transform),
(gst_navigationtest_change_state),
(gst_navigationtest_base_init), (gst_navigationtest_class_init),
(gst_navigationtest_init), (gst_navigationtest_get_type),
(plugin_init):
* gst/debug/gstnavigationtest.h:
* gst/effectv/Makefile.am:
* gst/effectv/gstaging.c: (gst_agingtv_set_caps),
(gst_agingtv_get_unit_size), (gst_agingtv_transform),
(gst_agingtv_base_init), (gst_agingtv_class_init),
(gst_agingtv_init), (gst_agingtv_get_type):
* gst/effectv/gstdice.c: (gst_dicetv_set_caps),
(gst_dicetv_get_unit_size), (gst_dicetv_transform),
(gst_dicetv_base_init), (gst_dicetv_class_init),
(gst_dicetv_init),
(gst_dicetv_get_type):
* gst/effectv/gstedge.c: (gst_edgetv_set_caps),
(gst_edgetv_get_unit_size), (gst_edgetv_transform),
(gst_edgetv_base_init), (gst_edgetv_class_init),
(gst_edgetv_init),
(gst_edgetv_get_type):
* gst/effectv/gsteffectv.c:
* gst/effectv/gsteffectv.h:
* gst/effectv/gstquark.c: (gst_quarktv_set_caps),
(gst_quarktv_get_unit_size), (fastrand),
(gst_quarktv_transform),
(gst_quarktv_change_state), (gst_quarktv_base_init),
(gst_quarktv_class_init), (gst_quarktv_init),
(gst_quarktv_get_type):
* gst/effectv/gstrev.c: (gst_revtv_set_caps),
(gst_revtv_get_unit_size), (gst_revtv_transform),
(gst_revtv_base_init), (gst_revtv_class_init), (gst_revtv_init),
(gst_revtv_get_type):
* gst/effectv/gstshagadelic.c: (gst_shagadelictv_set_caps),
(gst_shagadelictv_get_unit_size), (gst_shagadelictv_transform),
(gst_shagadelictv_base_init), (gst_shagadelictv_class_init),
(gst_shagadelictv_init), (gst_shagadelictv_get_type):
* gst/effectv/gstvertigo.c: (gst_vertigotv_set_caps),
(gst_vertigotv_get_unit_size), (gst_vertigotv_transform),
(gst_vertigotv_base_init), (gst_vertigotv_class_init),
(gst_vertigotv_init), (gst_vertigotv_get_type):
* gst/effectv/gstwarp.c: (gst_warptv_set_caps),
(gst_warptv_get_unit_size), (gst_warptv_transform),
(gst_warptv_base_init), (gst_warptv_class_init),
(gst_warptv_init),
(gst_warptv_get_type):
* gst/videofilter/Makefile.am:
* gst/videofilter/gstvideobalance.c:
* gst/videofilter/gstvideobalance.h:
* gst/videofilter/gstvideofilter.c: (gst_videofilter_get_type),
(gst_videofilter_class_init), (gst_videofilter_init):
* gst/videofilter/gstvideofilter.h:
* gst/videofilter/gstvideoflip.c: (gst_videoflip_set_caps),
(gst_videoflip_transform_caps), (gst_videoflip_get_unit_size),
(gst_videoflip_flip), (gst_videoflip_transform),
(gst_videoflip_handle_src_event), (gst_videoflip_set_property),
(gst_videoflip_base_init), (gst_videoflip_class_init),
(gst_videoflip_init), (plugin_init), (gst_videoflip_get_type):
* gst/videofilter/gstvideoflip.h: VideoFilter inherits from
BaseTransform, it's just a place holder for now and every video
effect plugin has been ported to use BaseTransform features
directly. QuarkTV was fixed too (was broken), navigationtest
works
and best for the end, videoflip converts navigation events
depending
on flip method ! Fixes #320953
Diffstat (limited to 'gst/effectv/gstquark.c')
-rw-r--r-- | gst/effectv/gstquark.c | 328 |
1 files changed, 156 insertions, 172 deletions
diff --git a/gst/effectv/gstquark.c b/gst/effectv/gstquark.c index 48641e6e..d0cc1971 100644 --- a/gst/effectv/gstquark.c +++ b/gst/effectv/gstquark.c @@ -24,10 +24,13 @@ #ifdef HAVE_CONFIG_H #include "config.h" #endif + +#include <gstvideofilter.h> + #include <math.h> #include <string.h> -#include <gst/gst.h> -#include "gsteffectv.h" + +#include <gst/video/video.h> #define GST_TYPE_QUARKTV \ (gst_quarktv_get_type()) @@ -40,7 +43,7 @@ #define GST_IS_QUARKTV_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_QUARKTV)) -/* number of frames of time-buffer. It should be as a configurable paramter */ +/* number of frames of time-buffer. It should be as a configurable paramater */ /* This number also must be 2^n just for the speed. */ #define PLANES 16 @@ -49,9 +52,7 @@ typedef struct _GstQuarkTVClass GstQuarkTVClass; struct _GstQuarkTV { - GstElement element; - - GstPad *sinkpad, *srcpad; + GstVideofilter element; gint width, height; gint area; @@ -62,20 +63,7 @@ struct _GstQuarkTV struct _GstQuarkTVClass { - GstElementClass parent_class; -}; - -/* elementfactory information */ -static GstElementDetails gst_quarktv_details = GST_ELEMENT_DETAILS ("QuarkTV", - "Filter/Effect/Video", - "Motion dissolver", - "FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>"); - -/* Filter signals and args */ -enum -{ - /* FILL ME */ - LAST_SIGNAL + GstVideofilterClass parent_class; }; enum @@ -84,179 +72,103 @@ enum ARG_PLANES }; -static void gst_quarktv_base_init (gpointer g_class); -static void gst_quarktv_class_init (GstQuarkTVClass * klass); -static void gst_quarktv_init (GstQuarkTV * filter); - -static GstStateChangeReturn gst_quarktv_change_state (GstElement * element, - GstStateChange transition); - -static void gst_quarktv_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_quarktv_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); - -static GstFlowReturn gst_quarktv_chain (GstPad * pad, GstBuffer * buffer); - -static GstElementClass *parent_class = NULL; - -/* static guint gst_quarktv_signals[LAST_SIGNAL] = { 0 }; */ - -static inline guint32 -fastrand (void) -{ - static unsigned int fastrand_val; +GType gst_quarktv_get_type (void); - return (fastrand_val = fastrand_val * 1103515245 + 12345); -} +static GstElementDetails quarktv_details = GST_ELEMENT_DETAILS ("QuarkTV", + "Filter/Effect/Video", + "Motion dissolver", + "FUKUCHI, Kentarou <fukuchi@users.sourceforge.net>"); -GType -gst_quarktv_get_type (void) +static GstStaticPadTemplate gst_quarktv_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx) + ); + +static GstStaticPadTemplate gst_quarktv_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx "; " GST_VIDEO_CAPS_RGBx) + ); + +static GstVideofilterClass *parent_class = NULL; + +static gboolean +gst_quarktv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) { - static GType quarktv_type = 0; + GstQuarkTV *filter = GST_QUARKTV (btrans); + GstStructure *structure; + gboolean ret = FALSE; - if (!quarktv_type) { - static const GTypeInfo quarktv_info = { - sizeof (GstQuarkTVClass), - gst_quarktv_base_init, - NULL, - (GClassInitFunc) gst_quarktv_class_init, - NULL, - NULL, - sizeof (GstQuarkTV), - 0, - (GInstanceInitFunc) gst_quarktv_init, - }; + structure = gst_caps_get_structure (incaps, 0); - quarktv_type = - g_type_register_static (GST_TYPE_ELEMENT, "GstQuarkTV", &quarktv_info, - 0); + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + filter->area = filter->width * filter->height; + ret = TRUE; } - return quarktv_type; -} - -static void -gst_quarktv_base_init (gpointer g_class) -{ - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_effectv_src_template)); - gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_effectv_sink_template)); - - gst_element_class_set_details (element_class, &gst_quarktv_details); -} - -static void -gst_quarktv_class_init (GstQuarkTVClass * klass) -{ - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - - gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; - - parent_class = g_type_class_ref (GST_TYPE_ELEMENT); - - gobject_class->set_property = gst_quarktv_set_property; - gobject_class->get_property = gst_quarktv_get_property; - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PLANES, - g_param_spec_int ("planes", "Planes", "Number of frames in the buffer", - 1, 32, PLANES, G_PARAM_READWRITE)); - - gstelement_class->change_state = gst_quarktv_change_state; + return ret; } -static GstPadLinkReturn -gst_quarktv_link (GstPad * pad, GstPad * peer) +static gboolean +gst_quarktv_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, + guint * size) { GstQuarkTV *filter; - GstPad *otherpad; - - //gint i; - //GstStructure *structure; - //GstPadLinkReturn res; - - filter = GST_QUARKTV (gst_pad_get_parent (pad)); - g_return_val_if_fail (GST_IS_QUARKTV (filter), GST_PAD_LINK_REFUSED); - - otherpad = (pad == filter->srcpad ? filter->sinkpad : filter->srcpad); + GstStructure *structure; + gboolean ret = FALSE; + gint width, height; -#if 0 - res = gst_pad_try_set_caps (otherpad, caps); - if (GST_PAD_LINK_FAILED (res)) - return res; + filter = GST_QUARKTV (btrans); structure = gst_caps_get_structure (caps, 0); - if (!gst_structure_get_int (structure, "width", &filter->width) || - !gst_structure_get_int (structure, "height", &filter->height)) - return GST_PAD_LINK_REFUSED; - - filter->area = filter->width * filter->height; - for (i = 0; i < filter->planes; i++) { - if (filter->planetable[i]) - gst_buffer_unref (filter->planetable[i]); - filter->planetable[i] = NULL; + if (gst_structure_get_int (structure, "width", &width) && + gst_structure_get_int (structure, "height", &height)) { + *size = width * height * 32 / 8; + ret = TRUE; + GST_DEBUG_OBJECT (filter, "our frame size is %d bytes (%dx%d)", *size, + width, height); } -#endif - return GST_PAD_LINK_OK; + return ret; } -static void -gst_quarktv_init (GstQuarkTV * filter) +static inline guint32 +fastrand (void) { - filter->sinkpad = - gst_pad_new_from_template (gst_static_pad_template_get - (&gst_effectv_sink_template), "sink"); - //gst_pad_set_getcaps_function (filter->sinkpad, gst_pad_proxy_getcaps); - gst_pad_set_chain_function (filter->sinkpad, gst_quarktv_chain); - gst_pad_set_link_function (filter->sinkpad, gst_quarktv_link); - gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); - - filter->srcpad = - gst_pad_new_from_template (gst_static_pad_template_get - (&gst_effectv_src_template), "src"); - //gst_pad_set_getcaps_function (filter->srcpad, gst_pad_proxy_getcaps); - gst_pad_set_link_function (filter->srcpad, gst_quarktv_link); - gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); + static unsigned int fastrand_val; - filter->planes = PLANES; - filter->current_plane = filter->planes - 1; + return (fastrand_val = fastrand_val * 1103515245 + 12345); } static GstFlowReturn -gst_quarktv_chain (GstPad * pad, GstBuffer * buf) +gst_quarktv_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) { GstQuarkTV *filter; - guint32 *src, *dest; - GstBuffer *outbuf; gint area; - GstFlowReturn ret; + guint32 *src, *dest; + GstFlowReturn ret = GST_FLOW_OK; - filter = GST_QUARKTV (gst_pad_get_parent (pad)); + filter = GST_QUARKTV (trans); - src = (guint32 *) GST_BUFFER_DATA (buf); + gst_buffer_stamp (out, in); area = filter->area; - - ret = - gst_pad_alloc_buffer (filter->srcpad, 0, area, GST_PAD_CAPS (pad), - &outbuf); - if (ret != GST_FLOW_OK) - goto no_buffer; - - dest = (guint32 *) GST_BUFFER_DATA (outbuf); - GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buf); + src = (guint32 *) GST_BUFFER_DATA (in); + dest = (guint32 *) GST_BUFFER_DATA (out); if (filter->planetable[filter->current_plane]) gst_buffer_unref (filter->planetable[filter->current_plane]); - filter->planetable[filter->current_plane] = buf; + filter->planetable[filter->current_plane] = gst_buffer_ref (in); + /* For each pixel */ while (--area) { GstBuffer *rand; @@ -265,27 +177,37 @@ gst_quarktv_chain (GstPad * pad, GstBuffer * buf) filter->planetable[(filter->current_plane + (fastrand () >> 24)) & (filter->planes - 1)]; + /* Copy the pixel from the random buffer to dest */ dest[area] = (rand ? ((guint32 *) GST_BUFFER_DATA (rand))[area] : 0); } - ret = gst_pad_push (filter->srcpad, outbuf); - filter->current_plane--; if (filter->current_plane < 0) filter->current_plane = filter->planes - 1; return ret; - -no_buffer: - { - return ret; - } } static GstStateChangeReturn gst_quarktv_change_state (GstElement * element, GstStateChange transition) { GstQuarkTV *filter = GST_QUARKTV (element); + GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; + + switch (transition) { + case GST_STATE_CHANGE_READY_TO_PAUSED: + { + filter->planetable = + (GstBuffer **) g_malloc (filter->planes * sizeof (GstBuffer *)); + memset (filter->planetable, 0, filter->planes * sizeof (GstBuffer *)); + break; + } + default: + break; + } + + if (GST_ELEMENT_CLASS (parent_class)->change_state) + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: @@ -301,18 +223,11 @@ gst_quarktv_change_state (GstElement * element, GstStateChange transition) filter->planetable = NULL; break; } - case GST_STATE_CHANGE_READY_TO_PAUSED: - { - filter->planetable = - (GstBuffer **) g_malloc (filter->planes * sizeof (GstBuffer *)); - memset (filter->planetable, 0, filter->planes * sizeof (GstBuffer *)); - break; - } default: break; } - return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + return ret; } @@ -377,3 +292,72 @@ gst_quarktv_get_property (GObject * object, guint prop_id, GValue * value, break; } } + +static void +gst_quarktv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details (element_class, &quarktv_details); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_quarktv_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_quarktv_src_template)); +} + +static void +gst_quarktv_class_init (gpointer klass, gpointer class_data) +{ + GObjectClass *gobject_class; + GstElementClass *element_class; + GstBaseTransformClass *trans_class; + + gobject_class = (GObjectClass *) klass; + element_class = (GstElementClass *) klass; + trans_class = (GstBaseTransformClass *) klass; + + parent_class = g_type_class_peek_parent (klass); + + gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_quarktv_set_property); + gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_quarktv_get_property); + + element_class->change_state = GST_DEBUG_FUNCPTR (gst_quarktv_change_state); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_quarktv_set_caps); + trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_quarktv_get_unit_size); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_quarktv_transform); +} + +static void +gst_quarktv_init (GTypeInstance * instance, gpointer g_class) +{ + GstQuarkTV *filter = GST_QUARKTV (instance); + + filter->planes = PLANES; + filter->current_plane = filter->planes - 1; +} + +GType +gst_quarktv_get_type (void) +{ + static GType quarktv_type = 0; + + if (!quarktv_type) { + static const GTypeInfo quarktv_info = { + sizeof (GstQuarkTVClass), + gst_quarktv_base_init, + NULL, + gst_quarktv_class_init, + NULL, + NULL, + sizeof (GstQuarkTV), + 0, + gst_quarktv_init, + }; + + quarktv_type = g_type_register_static (GST_TYPE_VIDEOFILTER, + "GstQuarkTV", &quarktv_info, 0); + } + return quarktv_type; +} |