diff options
Diffstat (limited to 'gst/effectv/gstdice.c')
-rw-r--r-- | gst/effectv/gstdice.c | 307 |
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; +} |