summaryrefslogtreecommitdiffstats
path: root/gst/effectv/gstdice.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/gstdice.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/gstdice.c')
-rw-r--r--gst/effectv/gstdice.c307
1 files changed, 153 insertions, 154 deletions
diff --git a/gst/effectv/gstdice.c b/gst/effectv/gstdice.c
index e3506e73..3d2376c5 100644
--- a/gst/effectv/gstdice.c
+++ b/gst/effectv/gstdice.c
@@ -13,9 +13,13 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
+
+#include <gstvideofilter.h>
+
#include <string.h>
#include <gst/gst.h>
-#include <gstvideofilter.h>
+
+#include <gst/video/video.h>
#define GST_TYPE_DICETV \
(gst_dicetv_get_type())
@@ -60,164 +64,85 @@ struct _GstDiceTV
struct _GstDiceTVClass
{
GstVideofilterClass parent_class;
-
- void (*reset) (GstElement * element);
-};
-
-/* Filter signals and args */
-enum
-{
- /* FILL ME */
- RESET_SIGNAL,
- LAST_SIGNAL
};
-enum
-{
- ARG_0,
- ARG_CUBE_BITS
-};
+GType gst_dicetv_get_type (void);
-static void gst_dicetv_base_init (gpointer g_class);
-static void gst_dicetv_class_init (gpointer g_class, gpointer class_data);
-static void gst_dicetv_init (GTypeInstance * instance, gpointer g_class);
-
-static void gst_dicetv_reset_handler (GstElement * elem);
static void gst_dicetv_create_map (GstDiceTV * filter);
-static void gst_dicetv_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec);
-static void gst_dicetv_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec);
-static void gst_dicetv_setup (GstVideofilter * videofilter);
-static void gst_dicetv_draw (GstVideofilter * videofilter, void *d, void *s);
-
-static guint gst_dicetv_signals[LAST_SIGNAL] = { 0 };
+static GstElementDetails gst_dicetv_details = GST_ELEMENT_DETAILS ("DiceTV",
+ "Filter/Effect/Video",
+ "'Dices' the screen up into many small squares",
+ "Wim Taymans <wim.taymans@chello.be>");
+
+static GstStaticPadTemplate gst_dicetv_src_template =
+ GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xRGB ";"
+ GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR)
+ );
+
+static GstStaticPadTemplate gst_dicetv_sink_template =
+ GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_RGBx ";" GST_VIDEO_CAPS_xRGB ";"
+ GST_VIDEO_CAPS_BGRx ";" GST_VIDEO_CAPS_xBGR)
+ );
+
+static GstVideofilterClass *parent_class = NULL;
-GType
-gst_dicetv_get_type (void)
+enum
{
- static GType dicetv_type = 0;
-
- if (!dicetv_type) {
- static const GTypeInfo dicetv_info = {
- sizeof (GstDiceTVClass),
- gst_dicetv_base_init,
- NULL,
- (GClassInitFunc) gst_dicetv_class_init,
- NULL,
- NULL,
- sizeof (GstDiceTV),
- 0,
- (GInstanceInitFunc) gst_dicetv_init,
- };
-
- dicetv_type =
- g_type_register_static (GST_TYPE_VIDEOFILTER, "GstDiceTV", &dicetv_info,
- 0);
- }
- return dicetv_type;
-}
-
-static GstVideofilterFormat gst_dicetv_formats[] = {
- {"RGB ", 32, gst_dicetv_draw, 24, G_BIG_ENDIAN, 0x00ff0000, 0x0000ff00,
- 0x000000ff},
- {"RGB ", 32, gst_dicetv_draw, 24, G_BIG_ENDIAN, 0xff000000, 0x00ff0000,
- 0x0000ff00},
- {"RGB ", 32, gst_dicetv_draw, 24, G_BIG_ENDIAN, 0x000000ff, 0x0000ff00,
- 0x00ff0000},
- {"RGB ", 32, gst_dicetv_draw, 24, G_BIG_ENDIAN, 0x0000ff00, 0x00ff0000,
- 0xff000000},
+ ARG_0,
+ ARG_CUBE_BITS
};
-static void
-gst_dicetv_base_init (gpointer g_class)
+static gboolean
+gst_dicetv_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
+ GstCaps * outcaps)
{
- /* elementfactory information */
- static GstElementDetails gst_dicetv_details = GST_ELEMENT_DETAILS ("DiceTV",
- "Filter/Effect/Video",
- "'Dices' the screen up into many small squares",
- "Wim Taymans <wim.taymans@chello.be>");
-
- GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class);
- int i;
-
- gst_element_class_set_details (element_class, &gst_dicetv_details);
-
- for (i = 0; i < G_N_ELEMENTS (gst_dicetv_formats); i++) {
- gst_videofilter_class_add_format (videofilter_class,
- gst_dicetv_formats + i);
+ GstDiceTV *filter = GST_DICETV (btrans);
+ GstStructure *structure;
+ gboolean ret = FALSE;
+
+ structure = gst_caps_get_structure (incaps, 0);
+
+ if (gst_structure_get_int (structure, "width", &filter->width) &&
+ gst_structure_get_int (structure, "height", &filter->height)) {
+ g_free (filter->dicemap);
+ filter->dicemap =
+ (gchar *) g_malloc (filter->height * filter->width * sizeof (char));
+ gst_dicetv_create_map (filter);
+ ret = TRUE;
}
- gst_videofilter_class_add_pad_templates (GST_VIDEOFILTER_CLASS (g_class));
-}
-
-static void
-gst_dicetv_class_init (gpointer g_class, gpointer class_data)
-{
- GObjectClass *gobject_class;
- GstVideofilterClass *videofilter_class;
- GstDiceTVClass *dicetv_class;
-
- gobject_class = G_OBJECT_CLASS (g_class);
- videofilter_class = GST_VIDEOFILTER_CLASS (g_class);
- dicetv_class = GST_DICETV_CLASS (g_class);
-
- gst_dicetv_signals[RESET_SIGNAL] =
- g_signal_new ("reset",
- G_TYPE_FROM_CLASS (g_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (GstDiceTVClass, reset),
- NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
-
- dicetv_class->reset = gst_dicetv_reset_handler;
-
- gobject_class->set_property = gst_dicetv_set_property;
- gobject_class->get_property = gst_dicetv_get_property;
-
- g_object_class_install_property (gobject_class, ARG_CUBE_BITS,
- g_param_spec_int ("square_bits", "Square Bits", "The size of the Squares",
- MIN_CUBE_BITS, MAX_CUBE_BITS, DEFAULT_CUBE_BITS, G_PARAM_READWRITE));
-
- videofilter_class->setup = gst_dicetv_setup;
+ return ret;
}
-static void
-gst_dicetv_setup (GstVideofilter * videofilter)
+static gboolean
+gst_dicetv_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
+ guint * size)
{
- GstDiceTV *dicetv;
-
- g_return_if_fail (GST_IS_DICETV (videofilter));
- dicetv = GST_DICETV (videofilter);
-
- dicetv->width = gst_videofilter_get_input_width (videofilter);
- dicetv->height = gst_videofilter_get_input_height (videofilter);
+ GstDiceTV *filter;
+ GstStructure *structure;
+ gboolean ret = FALSE;
+ gint width, height;
- g_free (dicetv->dicemap);
- dicetv->dicemap =
- (gchar *) g_malloc (dicetv->height * dicetv->width * sizeof (char));
- gst_dicetv_create_map (dicetv);
-}
+ filter = GST_DICETV (btrans);
-static void
-gst_dicetv_init (GTypeInstance * instance, gpointer g_class)
-{
- GstDiceTV *filter = GST_DICETV (instance);
+ structure = gst_caps_get_structure (caps, 0);
- filter->dicemap = NULL;
- filter->g_cube_bits = DEFAULT_CUBE_BITS;
- filter->g_cube_size = 0;
- filter->g_map_height = 0;
- filter->g_map_width = 0;
-}
-
-static void
-gst_dicetv_reset_handler (GstElement * element)
-{
- GstDiceTV *filter = GST_DICETV (element);
+ 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_dicetv_create_map (filter);
+ return ret;
}
static unsigned int
@@ -228,23 +153,20 @@ fastrand (void)
return (fastrand_val = fastrand_val * 1103515245 + 12345);
}
-static void
-gst_dicetv_draw (GstVideofilter * videofilter, void *d, void *s)
+static GstFlowReturn
+gst_dicetv_transform (GstBaseTransform * trans, GstBuffer * in, GstBuffer * out)
{
GstDiceTV *filter;
- guint32 *src;
- guint32 *dest;
- gint i;
- gint map_x, map_y, map_i;
- gint base;
- gint dx, dy, di;
- gint video_width;
- gint g_cube_bits;
- gint g_cube_size;
+ guint32 *src, *dest;
+ gint i, map_x, map_y, map_i, base, dx, dy, di;
+ gint video_width, g_cube_bits, g_cube_size;
+ GstFlowReturn ret = GST_FLOW_OK;
- filter = GST_DICETV (videofilter);
- src = (guint32 *) s;
- dest = (guint32 *) d;
+ filter = GST_DICETV (trans);
+ src = (guint32 *) GST_BUFFER_DATA (in);
+ dest = (guint32 *) GST_BUFFER_DATA (out);
+
+ gst_buffer_stamp (out, in);
video_width = filter->width;
g_cube_bits = filter->g_cube_bits;
@@ -304,6 +226,8 @@ gst_dicetv_draw (GstVideofilter * videofilter, void *d, void *s)
map_i++;
}
}
+
+ return ret;
}
static void
@@ -364,3 +288,78 @@ gst_dicetv_get_property (GObject * object, guint prop_id, GValue * value,
break;
}
}
+
+static void
+gst_dicetv_base_init (gpointer g_class)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+
+ gst_element_class_set_details (element_class, &gst_dicetv_details);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_dicetv_sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_dicetv_src_template));
+}
+
+static void
+gst_dicetv_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_dicetv_set_property;
+ gobject_class->get_property = gst_dicetv_get_property;
+
+ g_object_class_install_property (gobject_class, ARG_CUBE_BITS,
+ g_param_spec_int ("square_bits", "Square Bits", "The size of the Squares",
+ MIN_CUBE_BITS, MAX_CUBE_BITS, DEFAULT_CUBE_BITS, G_PARAM_READWRITE));
+
+ trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_dicetv_set_caps);
+ trans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_dicetv_get_unit_size);
+ trans_class->transform = GST_DEBUG_FUNCPTR (gst_dicetv_transform);
+}
+
+static void
+gst_dicetv_init (GTypeInstance * instance, gpointer g_class)
+{
+ GstDiceTV *filter = GST_DICETV (instance);
+
+ filter->dicemap = NULL;
+ filter->g_cube_bits = DEFAULT_CUBE_BITS;
+ filter->g_cube_size = 0;
+ filter->g_map_height = 0;
+ filter->g_map_width = 0;
+}
+
+GType
+gst_dicetv_get_type (void)
+{
+ static GType dicetv_type = 0;
+
+ if (!dicetv_type) {
+ static const GTypeInfo dicetv_info = {
+ sizeof (GstDiceTVClass),
+ gst_dicetv_base_init,
+ NULL,
+ (GClassInitFunc) gst_dicetv_class_init,
+ NULL,
+ NULL,
+ sizeof (GstDiceTV),
+ 0,
+ (GInstanceInitFunc) gst_dicetv_init,
+ };
+
+ dicetv_type =
+ g_type_register_static (GST_TYPE_VIDEOFILTER, "GstDiceTV", &dicetv_info,
+ 0);
+ }
+ return dicetv_type;
+}