summaryrefslogtreecommitdiffstats
path: root/gst/effectv/gstquark.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/gstquark.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/gstquark.c')
-rw-r--r--gst/effectv/gstquark.c328
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;
+}