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/gstvertigo.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/gstvertigo.c')
-rw-r--r-- | gst/effectv/gstvertigo.c | 304 |
1 files changed, 152 insertions, 152 deletions
diff --git a/gst/effectv/gstvertigo.c b/gst/effectv/gstvertigo.c index d44a5a0b..abe92a52 100644 --- a/gst/effectv/gstvertigo.c +++ b/gst/effectv/gstvertigo.c @@ -25,10 +25,13 @@ #ifdef HAVE_CONFIG_H #include "config.h" #endif + +#include <gstvideofilter.h> + #include <math.h> #include <string.h> -#include <gst/gst.h> -#include <gstvideofilter.h> + +#include <gst/video/video.h> #define GST_TYPE_VERTIGOTV \ (gst_vertigotv_get_type()) @@ -61,18 +64,11 @@ struct _GstVertigoTV struct _GstVertigoTVClass { GstVideofilterClass parent_class; - - void (*reset) (GstElement * element); }; -/* Filter signals and args */ -enum -{ - /* FILL ME */ - RESET_SIGNAL, - LAST_SIGNAL -}; +GType gst_vertigotv_get_type (void); +/* Filter signals and args */ enum { ARG_0, @@ -80,152 +76,77 @@ enum ARG_ZOOM_SPEED }; -static void gst_vertigotv_base_init (gpointer g_class); -static void gst_vertigotv_class_init (GstVertigoTVClass * klass, - gpointer class_data); -static void gst_vertigotv_init (GTypeInstance * instance, gpointer g_class); -static void gst_vertigotv_setup (GstVideofilter * videofilter); - -static void gst_vertigotv_reset_handler (GstElement * element); - -static void gst_vertigotv_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_vertigotv_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static void gst_vertigotv_rgb32 (GstVideofilter * videofilter, void *d, - void *s); - -static guint gst_vertigotv_signals[LAST_SIGNAL] = { 0 }; - -GType -gst_vertigotv_get_type (void) +static GstElementDetails vertigotv_details = GST_ELEMENT_DETAILS ("VertigoTV", + "Filter/Effect/Video", + "A loopback alpha blending effector with rotating and scaling", + "Wim Taymans <wim.taymans@chello.be>"); + +static GstStaticPadTemplate gst_vertigotv_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx) + ); + +static GstStaticPadTemplate gst_vertigotv_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx) + ); + +static GstVideofilterClass *parent_class = NULL; + +static gboolean +gst_vertigotv_set_caps (GstBaseTransform * btrans, GstCaps * incaps, + GstCaps * outcaps) { - static GType vertigotv_type = 0; + GstVertigoTV *filter = GST_VERTIGOTV (btrans); + GstStructure *structure; + gboolean ret = FALSE; - if (!vertigotv_type) { - static const GTypeInfo vertigotv_info = { - sizeof (GstVertigoTVClass), - gst_vertigotv_base_init, - NULL, - (GClassInitFunc) gst_vertigotv_class_init, - NULL, - NULL, - sizeof (GstVertigoTV), - 0, - (GInstanceInitFunc) gst_vertigotv_init, - }; + structure = gst_caps_get_structure (incaps, 0); - vertigotv_type = - g_type_register_static (GST_TYPE_VIDEOFILTER, "GstVertigoTV", - &vertigotv_info, 0); - } - return vertigotv_type; -} - -static GstVideofilterFormat gst_vertigotv_formats[] = { - {"RGB ", 32, gst_vertigotv_rgb32, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000, - 0xff000000} -}; + if (gst_structure_get_int (structure, "width", &filter->width) && + gst_structure_get_int (structure, "height", &filter->height)) { + gint area = filter->width * filter->height; -static void -gst_vertigotv_base_init (gpointer g_class) -{ - /* elementfactory information */ - static GstElementDetails vertigotv_details = GST_ELEMENT_DETAILS ("VertigoTV", - "Filter/Effect/Video", - "A loopback alpha blending effector with rotating and scaling", - "Wim Taymans <wim.taymans@chello.be>"); - GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class); - int i; + g_free (filter->buffer); + filter->buffer = (guint32 *) g_malloc (area * 2 * sizeof (guint32)); - gst_element_class_set_details (element_class, &vertigotv_details); + memset (filter->buffer, 0, area * 2 * sizeof (guint32)); + filter->current_buffer = filter->buffer; + filter->alt_buffer = filter->buffer + area; + filter->phase = 0; - for (i = 0; i < G_N_ELEMENTS (gst_vertigotv_formats); i++) { - gst_videofilter_class_add_format (videofilter_class, - gst_vertigotv_formats + i); + ret = TRUE; } - gst_videofilter_class_add_pad_templates (GST_VIDEOFILTER_CLASS (g_class)); + return ret; } -static void -gst_vertigotv_class_init (GstVertigoTVClass * klass, gpointer class_data) -{ - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - GstVideofilterClass *videofilter_class; - - gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; - videofilter_class = GST_VIDEOFILTER_CLASS (klass); - - gst_vertigotv_signals[RESET_SIGNAL] = - g_signal_new ("reset-parms", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, - G_STRUCT_OFFSET (GstVertigoTVClass, reset), - NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - - klass->reset = gst_vertigotv_reset_handler; - - gobject_class->set_property = gst_vertigotv_set_property; - gobject_class->get_property = gst_vertigotv_get_property; - - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SPEED, - g_param_spec_float ("speed", "Speed", "Control the speed of movement", - 0.01, 100.0, 0.02, G_PARAM_READWRITE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ZOOM_SPEED, - g_param_spec_float ("zoom_speed", "Zoom Speed", - "Control the rate of zooming", 1.01, 1.1, 1.01, G_PARAM_READWRITE)); - - videofilter_class->setup = gst_vertigotv_setup; -} - -static void -gst_vertigotv_reset_handler (GstElement * element) -{ - GstVertigoTV *filter = GST_VERTIGOTV (element); - - filter->phase = 0.0; - filter->phase_increment = 0.02; - filter->zoomrate = 1.01; -} - -static void -gst_vertigotv_setup (GstVideofilter * videofilter) +static gboolean +gst_vertigotv_get_unit_size (GstBaseTransform * btrans, GstCaps * caps, + guint * size) { GstVertigoTV *filter; - gint area; - int width = gst_videofilter_get_input_width (videofilter); - int height = gst_videofilter_get_input_height (videofilter); - - g_return_if_fail (GST_IS_VERTIGOTV (videofilter)); - filter = GST_VERTIGOTV (videofilter); - - filter->width = width; - filter->height = height; + GstStructure *structure; + gboolean ret = FALSE; + gint width, height; - area = width * height; + filter = GST_VERTIGOTV (btrans); - g_free (filter->buffer); - filter->buffer = (guint32 *) g_malloc (area * 2 * sizeof (guint32)); + structure = gst_caps_get_structure (caps, 0); - memset (filter->buffer, 0, area * 2 * sizeof (guint32)); - filter->current_buffer = filter->buffer; - filter->alt_buffer = filter->buffer + area; - filter->phase = 0; -} - -static void -gst_vertigotv_init (GTypeInstance * instance, gpointer g_class) -{ - GstVertigoTV *filter = GST_VERTIGOTV (instance); + 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); + } - filter->buffer = NULL; - filter->phase = 0.0; - filter->phase_increment = 0.02; - filter->zoomrate = 1.01; + return ret; } static void @@ -276,22 +197,22 @@ gst_vertigotv_set_parms (GstVertigoTV * filter) filter->phase = 0; } -static void -gst_vertigotv_rgb32 (GstVideofilter * videofilter, void *d, void *s) +static GstFlowReturn +gst_vertigotv_transform (GstBaseTransform * trans, GstBuffer * in, + GstBuffer * out) { GstVertigoTV *filter; - guint32 *src, *dest; - guint32 *p; + guint32 *src, *dest, *p; guint32 v; - gint x, y; - gint ox, oy; - gint i; - gint width, height, area; + gint x, y, ox, oy, i, width, height, area; + GstFlowReturn ret = GST_FLOW_OK; + + filter = GST_VERTIGOTV (trans); - filter = GST_VERTIGOTV (videofilter); + gst_buffer_stamp (out, in); - src = (guint32 *) s; - dest = (guint32 *) d; + src = (guint32 *) GST_BUFFER_DATA (in); + dest = (guint32 *) GST_BUFFER_DATA (out); width = filter->width; height = filter->height; @@ -327,6 +248,8 @@ gst_vertigotv_rgb32 (GstVideofilter * videofilter, void *d, void *s) p = filter->current_buffer; filter->current_buffer = filter->alt_buffer; filter->alt_buffer = p; + + return ret; } static void @@ -373,3 +296,80 @@ gst_vertigotv_get_property (GObject * object, guint prop_id, GValue * value, break; } } + +static void +gst_vertigotv_base_init (gpointer g_class) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + + gst_element_class_set_details (element_class, &vertigotv_details); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_vertigotv_sink_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&gst_vertigotv_src_template)); +} + +static void +gst_vertigotv_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_vertigotv_set_property; + gobject_class->get_property = gst_vertigotv_get_property; + + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SPEED, + g_param_spec_float ("speed", "Speed", "Control the speed of movement", + 0.01, 100.0, 0.02, G_PARAM_READWRITE)); + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ZOOM_SPEED, + g_param_spec_float ("zoom_speed", "Zoom Speed", + "Control the rate of zooming", 1.01, 1.1, 1.01, G_PARAM_READWRITE)); + + trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_vertigotv_set_caps); + trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_vertigotv_get_unit_size); + trans_class->transform = GST_DEBUG_FUNCPTR (gst_vertigotv_transform); +} + +static void +gst_vertigotv_init (GTypeInstance * instance, gpointer g_class) +{ + GstVertigoTV *filter = GST_VERTIGOTV (instance); + + filter->buffer = NULL; + filter->phase = 0.0; + filter->phase_increment = 0.02; + filter->zoomrate = 1.01; +} + +GType +gst_vertigotv_get_type (void) +{ + static GType vertigotv_type = 0; + + if (!vertigotv_type) { + static const GTypeInfo vertigotv_info = { + sizeof (GstVertigoTVClass), + gst_vertigotv_base_init, + NULL, + (GClassInitFunc) gst_vertigotv_class_init, + NULL, + NULL, + sizeof (GstVertigoTV), + 0, + (GInstanceInitFunc) gst_vertigotv_init, + }; + + vertigotv_type = + g_type_register_static (GST_TYPE_VIDEOFILTER, "GstVertigoTV", + &vertigotv_info, 0); + } + return vertigotv_type; +} |