summaryrefslogtreecommitdiffstats
path: root/gst/effectv/gstshagadelic.c
diff options
context:
space:
mode:
authorJulien Moutte <julien@moutte.net>2005-11-23 15:50:51 +0000
committerJulien Moutte <julien@moutte.net>2005-11-23 15:50:51 +0000
commit2ea4f5b3c92819681f2d9e6f5f8d014b4d179344 (patch)
treedb8696ff4b83e3f0ea882402e3435d8dacdbb488 /gst/effectv/gstshagadelic.c
parent48520a455d828b4a6885fb37be48ebb720ae259b (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/gstshagadelic.c')
-rw-r--r--gst/effectv/gstshagadelic.c258
1 files changed, 123 insertions, 135 deletions
diff --git a/gst/effectv/gstshagadelic.c b/gst/effectv/gstshagadelic.c
index e3c50d23..cedf9c92 100644
--- a/gst/effectv/gstshagadelic.c
+++ b/gst/effectv/gstshagadelic.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_SHAGADELICTV \
(gst_shagadelictv_get_type())
@@ -64,135 +67,81 @@ struct _GstShagadelicTVClass
GstVideofilterClass parent_class;
};
-/* Filter signals and args */
-enum
-{
- /* FILL ME */
- LAST_SIGNAL
-};
-
-enum
-{
- ARG_0
-};
-
-static void gst_shagadelictv_base_init (gpointer g_class);
-static void gst_shagadelictv_class_init (gpointer g_class, gpointer class_data);
-static void gst_shagadelictv_init (GTypeInstance * instance, gpointer g_class);
+GType gst_shagadelictv_get_type (void);
static void gst_shagadelic_initialize (GstShagadelicTV * filter);
-static void gst_shagadelictv_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec);
-static void gst_shagadelictv_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec);
-static void gst_shagadelictv_setup (GstVideofilter * videofilter);
-static void gst_shagadelictv_rgb32 (GstVideofilter * videofilter, void *d,
- void *s);
-
-/*static guint gst_shagadelictv_signals[LAST_SIGNAL] = { 0 }; */
-
-GType
-gst_shagadelictv_get_type (void)
+static GstElementDetails shagadelictv_details =
+GST_ELEMENT_DETAILS ("ShagadelicTV",
+ "Filter/Effect/Video",
+ "Oh behave, ShagedelicTV makes images shagadelic!",
+ "Wim Taymans <wim.taymans@chello.be>");
+
+static GstStaticPadTemplate gst_shagadelictv_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_BGRx)
+ );
+
+static GstStaticPadTemplate gst_shagadelictv_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_shagadelictv_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
+ GstCaps * outcaps)
{
- static GType shagadelictv_type = 0;
-
- if (!shagadelictv_type) {
- static const GTypeInfo shagadelictv_info = {
- sizeof (GstShagadelicTVClass),
- gst_shagadelictv_base_init,
- NULL,
- (GClassInitFunc) gst_shagadelictv_class_init,
- NULL,
- NULL,
- sizeof (GstShagadelicTV),
- 0,
- (GInstanceInitFunc) gst_shagadelictv_init,
- };
+ GstShagadelicTV *filter = GST_SHAGADELICTV (btrans);
+ GstStructure *structure;
+ gboolean ret = FALSE;
- shagadelictv_type =
- g_type_register_static (GST_TYPE_VIDEOFILTER, "GstShagadelicTV",
- &shagadelictv_info, 0);
- }
- return shagadelictv_type;
-}
-
-static GstVideofilterFormat gst_shagadelictv_formats[] = {
- {"RGB ", 32, gst_shagadelictv_rgb32, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000,
- 0xff000000}
-};
+ structure = gst_caps_get_structure (incaps, 0);
-static void
-gst_shagadelictv_base_init (gpointer g_class)
-{
- /* elementfactory information */
- static GstElementDetails gst_shagadelictv_details =
- GST_ELEMENT_DETAILS ("ShagadelicTV",
- "Filter/Effect/Video",
- "Oh behave, ShagedelicTV makes images shagadelic!",
- "Wim Taymans <wim.taymans@chello.be>");
+ if (gst_structure_get_int (structure, "width", &filter->width) &&
+ gst_structure_get_int (structure, "height", &filter->height)) {
+ gint area = filter->width * filter->height;
- GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class);
- int i;
+ g_free (filter->ripple);
+ g_free (filter->spiral);
- gst_element_class_set_details (element_class, &gst_shagadelictv_details);
+ filter->ripple = (gchar *) g_malloc (area * 4);
+ filter->spiral = (gchar *) g_malloc (area);
- for (i = 0; i < G_N_ELEMENTS (gst_shagadelictv_formats); i++) {
- gst_videofilter_class_add_format (videofilter_class,
- gst_shagadelictv_formats + i);
+ gst_shagadelic_initialize (filter);
+ ret = TRUE;
}
- gst_videofilter_class_add_pad_templates (GST_VIDEOFILTER_CLASS (g_class));
-}
-
-static void
-gst_shagadelictv_class_init (gpointer g_class, gpointer class_data)
-{
- GObjectClass *gobject_class;
- GstVideofilterClass *videofilter_class;
-
- gobject_class = G_OBJECT_CLASS (g_class);
- videofilter_class = GST_VIDEOFILTER_CLASS (g_class);
-
- gobject_class->set_property = gst_shagadelictv_set_property;
- gobject_class->get_property = gst_shagadelictv_get_property;
-
- videofilter_class->setup = gst_shagadelictv_setup;
-}
-
-static void
-gst_shagadelictv_init (GTypeInstance * instance, gpointer g_class)
-{
- GstShagadelicTV *filter = GST_SHAGADELICTV (instance);
-
- filter->ripple = NULL;
- filter->spiral = NULL;
+ return ret;
}
-static void
-gst_shagadelictv_setup (GstVideofilter * videofilter)
+static gboolean
+gst_shagadelictv_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
+ guint * size)
{
GstShagadelicTV *filter;
- int width = gst_videofilter_get_input_width (videofilter);
- int height = gst_videofilter_get_input_height (videofilter);
- int area;
-
- g_return_if_fail (GST_IS_SHAGADELICTV (videofilter));
- filter = GST_SHAGADELICTV (videofilter);
-
- filter->width = width;
- filter->height = height;
+ GstStructure *structure;
+ gboolean ret = FALSE;
+ gint width, height;
- area = filter->width * filter->height;
+ filter = GST_SHAGADELICTV (btrans);
- g_free (filter->ripple);
- g_free (filter->spiral);
+ structure = gst_caps_get_structure (caps, 0);
- filter->ripple = (gchar *) g_malloc (area * 4);
- filter->spiral = (gchar *) g_malloc (area);
+ 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);
+ }
- gst_shagadelic_initialize (filter);
+ return ret;
}
static unsigned int
@@ -261,8 +210,9 @@ gst_shagadelic_initialize (GstShagadelicTV * filter)
filter->phase = 0;
}
-static void
-gst_shagadelictv_rgb32 (GstVideofilter * videofilter, void *d, void *s)
+static GstFlowReturn
+gst_shagadelictv_transform (GstBaseTransform * trans, GstBuffer * in,
+ GstBuffer * out)
{
GstShagadelicTV *filter;
guint32 *src, *dest;
@@ -270,11 +220,14 @@ gst_shagadelictv_rgb32 (GstVideofilter * videofilter, void *d, void *s)
guint32 v;
guchar r, g, b;
gint width, height;
+ GstFlowReturn ret = GST_FLOW_OK;
+
+ filter = GST_SHAGADELICTV (trans);
- filter = GST_SHAGADELICTV (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;
@@ -310,37 +263,72 @@ gst_shagadelictv_rgb32 (GstVideofilter * videofilter, void *d, void *s)
filter->ry += filter->rvy;
filter->bx += filter->bvx;
filter->by += filter->bvy;
+
+ return ret;
}
static void
-gst_shagadelictv_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
+gst_shagadelictv_base_init (gpointer g_class)
{
- GstShagadelicTV *filter;
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- g_return_if_fail (GST_IS_SHAGADELICTV (object));
+ gst_element_class_set_details (element_class, &shagadelictv_details);
- filter = GST_SHAGADELICTV (object);
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_shagadelictv_sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_shagadelictv_src_template));
+}
- switch (prop_id) {
- default:
- break;
- }
+static void
+gst_shagadelictv_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);
+
+ trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_shagadelictv_set_caps);
+ trans_class->get_unit_size =
+ GST_DEBUG_FUNCPTR (gst_shagadelictv_get_unit_size);
+ trans_class->transform = GST_DEBUG_FUNCPTR (gst_shagadelictv_transform);
}
static void
-gst_shagadelictv_get_property (GObject * object, guint prop_id, GValue * value,
- GParamSpec * pspec)
+gst_shagadelictv_init (GTypeInstance * instance, gpointer g_class)
{
- GstShagadelicTV *filter;
+ GstShagadelicTV *filter = GST_SHAGADELICTV (instance);
- g_return_if_fail (GST_IS_SHAGADELICTV (object));
+ filter->ripple = NULL;
+ filter->spiral = NULL;
+}
- filter = GST_SHAGADELICTV (object);
+GType
+gst_shagadelictv_get_type (void)
+{
+ static GType shagadelictv_type = 0;
+
+ if (!shagadelictv_type) {
+ static const GTypeInfo shagadelictv_info = {
+ sizeof (GstShagadelicTVClass),
+ gst_shagadelictv_base_init,
+ NULL,
+ (GClassInitFunc) gst_shagadelictv_class_init,
+ NULL,
+ NULL,
+ sizeof (GstShagadelicTV),
+ 0,
+ (GInstanceInitFunc) gst_shagadelictv_init,
+ };
- switch (prop_id) {
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
+ shagadelictv_type =
+ g_type_register_static (GST_TYPE_VIDEOFILTER, "GstShagadelicTV",
+ &shagadelictv_info, 0);
}
+ return shagadelictv_type;
}