summaryrefslogtreecommitdiffstats
path: root/gst/debug
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/debug
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/debug')
-rw-r--r--gst/debug/Makefile.am8
-rw-r--r--gst/debug/gstnavigationtest.c302
-rw-r--r--gst/debug/gstnavigationtest.h19
3 files changed, 185 insertions, 144 deletions
diff --git a/gst/debug/Makefile.am b/gst/debug/Makefile.am
index da3b3a29..14bb3699 100644
--- a/gst/debug/Makefile.am
+++ b/gst/debug/Makefile.am
@@ -14,8 +14,12 @@ libgstefence_la_LIBADD = $(GST_LIBS)
libgstefence_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstnavigationtest_la_SOURCES = gstnavigationtest.c
-libgstnavigationtest_la_CFLAGS = $(GST_CFLAGS) -I$(top_srcdir)/gst/videofilter
-libgstnavigationtest_la_LIBADD = $(GST_LIBS) $(top_builddir)/gst/videofilter/libgstvideofilter-@GST_MAJORMINOR@.la
+libgstnavigationtest_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \
+ $(GST_PLUGINS_BASE_CFLAGS) \
+ -I$(top_srcdir)/gst/videofilter
+libgstnavigationtest_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) \
+ $(GST_PLUGINS_BASE_LIBS) \
+ $(top_builddir)/gst/videofilter/libgstvideofilter-@GST_MAJORMINOR@.la
libgstnavigationtest_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstdebug_la_SOURCES = \
diff --git a/gst/debug/gstnavigationtest.c b/gst/debug/gstnavigationtest.c
index 220947a8..bc40ae58 100644
--- a/gst/debug/gstnavigationtest.c
+++ b/gst/debug/gstnavigationtest.c
@@ -18,122 +18,40 @@
* Boston, MA 02111-1307, USA.
*/
-/*
- * This file was (probably) generated from gstnavigationtest.c,
- * gstnavigationtest.c,v 1.7 2003/11/08 02:48:59 dschleef Exp
- */
-
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include <gstnavigationtest.h>
+#include "gstnavigationtest.h"
#include <string.h>
#include <math.h>
-typedef struct
-{
- double x;
- double y;
- gint images_left;
- guint8 cy, cu, cv;
-} ButtonClick;
-
-static void gst_navigationtest_base_init (gpointer g_class);
-static void gst_navigationtest_class_init (gpointer g_class,
- gpointer class_data);
-static void gst_navigationtest_init (GTypeInstance * instance,
- gpointer g_class);
-
-static gboolean gst_navigationtest_handle_src_event (GstPad * pad,
- GstEvent * event);
-
-static GstStateChangeReturn
-gst_navigationtest_change_state (GstElement * element,
- GstStateChange transition);
-
-static void gst_navigationtest_planar411 (GstVideofilter * videofilter,
- void *dest, void *src);
-static void gst_navigationtest_setup (GstVideofilter * videofilter);
-
-static GstVideofilterClass *parent_class; /* NULL */
-
-GType
-gst_navigationtest_get_type (void)
-{
- static GType navigationtest_type = 0;
-
- if (!navigationtest_type) {
- static const GTypeInfo navigationtest_info = {
- sizeof (GstNavigationtestClass),
- gst_navigationtest_base_init,
- NULL,
- gst_navigationtest_class_init,
- NULL,
- NULL,
- sizeof (GstNavigationtest),
- 0,
- gst_navigationtest_init,
- };
-
- navigationtest_type = g_type_register_static (GST_TYPE_VIDEOFILTER,
- "GstNavigationtest", &navigationtest_info, 0);
- }
- return navigationtest_type;
-}
-
-static GstVideofilterFormat gst_navigationtest_formats[] = {
- {"I420", 12, gst_navigationtest_planar411,},
-};
-
-
-static void
-gst_navigationtest_base_init (gpointer g_class)
-{
- static GstElementDetails navigationtest_details =
- GST_ELEMENT_DETAILS ("Video Filter Template",
- "Filter/Video",
- "Template for a video filter",
- "David Schleef <ds@schleef.org>");
- GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class);
- int i;
+#include <gst/video/video.h>
- gst_element_class_set_details (element_class, &navigationtest_details);
+GST_DEBUG_CATEGORY (navigationtest_debug);
+#define GST_CAT_DEFAULT navigationtest_debug
- for (i = 0; i < G_N_ELEMENTS (gst_navigationtest_formats); i++) {
- gst_videofilter_class_add_format (videofilter_class,
- gst_navigationtest_formats + i);
- }
+static GstElementDetails navigationtest_details =
+GST_ELEMENT_DETAILS ("Video Navigation test",
+ "Filter/Effect/Video",
+ "Handle navigation events showing a black square following mouse pointer",
+ "David Schleef <ds@schleef.org>");
- gst_videofilter_class_add_pad_templates (GST_VIDEOFILTER_CLASS (g_class));
-}
+static GstStaticPadTemplate gst_navigationtest_src_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420"))
+ );
-static void
-gst_navigationtest_class_init (gpointer g_class, gpointer class_data)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- GstVideofilterClass *videofilter_class = GST_VIDEOFILTER_CLASS (g_class);
+static GstStaticPadTemplate gst_navigationtest_sink_template =
+GST_STATIC_PAD_TEMPLATE ("sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("I420"))
+ );
- parent_class = g_type_class_peek_parent (g_class);
-
- element_class->change_state = gst_navigationtest_change_state;
-
- videofilter_class->setup = gst_navigationtest_setup;
-}
-
-static void
-gst_navigationtest_init (GTypeInstance * instance, gpointer g_class)
-{
- GstNavigationtest *navtest = GST_NAVIGATIONTEST (instance);
- GstVideofilter *videofilter = GST_VIDEOFILTER (navtest);
-
- gst_pad_set_event_function (videofilter->srcpad,
- GST_DEBUG_FUNCPTR (gst_navigationtest_handle_src_event));
-
- navtest->x = -1;
- navtest->y = -1;
-}
+static GstVideofilterClass *parent_class = NULL;
static gboolean
gst_navigationtest_handle_src_event (GstPad * pad, GstEvent * event)
@@ -149,10 +67,8 @@ gst_navigationtest_handle_src_event (GstPad * pad, GstEvent * event)
const GstStructure *s = gst_event_get_structure (event);
gint fps_n, fps_d;
- fps_n = gst_value_get_fraction_numerator (
- (&GST_VIDEOFILTER (navtest)->framerate));
- fps_d = gst_value_get_fraction_denominator (
- (&GST_VIDEOFILTER (navtest)->framerate));
+ fps_n = gst_value_get_fraction_numerator ((&navtest->framerate));
+ fps_d = gst_value_get_fraction_denominator ((&navtest->framerate));
type = gst_structure_get_string (s, "event");
if (g_str_equal (type, "mouse-move")) {
@@ -189,16 +105,63 @@ gst_navigationtest_handle_src_event (GstPad * pad, GstEvent * event)
return gst_pad_event_default (pad, event);
}
-static void
-gst_navigationtest_setup (GstVideofilter * videofilter)
+/* Useful macros */
+#define GST_VIDEO_I420_Y_ROWSTRIDE(width) (GST_ROUND_UP_4(width))
+#define GST_VIDEO_I420_U_ROWSTRIDE(width) (GST_ROUND_UP_8(width)/2)
+#define GST_VIDEO_I420_V_ROWSTRIDE(width) ((GST_ROUND_UP_8(GST_VIDEO_I420_Y_ROWSTRIDE(width)))/2)
+
+#define GST_VIDEO_I420_Y_OFFSET(w,h) (0)
+#define GST_VIDEO_I420_U_OFFSET(w,h) (GST_VIDEO_I420_Y_OFFSET(w,h)+(GST_VIDEO_I420_Y_ROWSTRIDE(w)*GST_ROUND_UP_2(h)))
+#define GST_VIDEO_I420_V_OFFSET(w,h) (GST_VIDEO_I420_U_OFFSET(w,h)+(GST_VIDEO_I420_U_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2))
+
+#define GST_VIDEO_I420_SIZE(w,h) (GST_VIDEO_I420_V_OFFSET(w,h)+(GST_VIDEO_I420_V_ROWSTRIDE(w)*GST_ROUND_UP_2(h)/2))
+
+static gboolean
+gst_navigationtest_get_unit_size (GstBaseTransform * btrans, GstCaps * caps,
+ guint * size)
{
- GstNavigationtest *navigationtest;
+ GstNavigationtest *navtest;
+ GstStructure *structure;
+ gboolean ret = FALSE;
+ gint width, height;
- g_return_if_fail (GST_IS_NAVIGATIONTEST (videofilter));
- navigationtest = GST_NAVIGATIONTEST (videofilter);
+ navtest = GST_NAVIGATIONTEST (btrans);
- /* if any setup needs to be done, do it here */
+ structure = gst_caps_get_structure (caps, 0);
+
+ if (gst_structure_get_int (structure, "width", &width) &&
+ gst_structure_get_int (structure, "height", &height)) {
+ *size = GST_VIDEO_I420_SIZE (width, height);
+ ret = TRUE;
+ GST_DEBUG_OBJECT (navtest, "our frame size is %d bytes (%dx%d)", *size,
+ width, height);
+ }
+ return ret;
+}
+
+static gboolean
+gst_navigationtest_set_caps (GstBaseTransform * btrans, GstCaps * incaps,
+ GstCaps * outcaps)
+{
+ GstNavigationtest *navtest = GST_NAVIGATIONTEST (btrans);
+ gboolean ret = FALSE;
+ GstStructure *structure;
+
+ structure = gst_caps_get_structure (incaps, 0);
+
+ if (gst_structure_get_int (structure, "width", &navtest->width) &&
+ gst_structure_get_int (structure, "height", &navtest->height)) {
+ const GValue *framerate;
+
+ framerate = gst_structure_get_value (structure, "framerate");
+ if (framerate && GST_VALUE_HOLDS_FRACTION (framerate)) {
+ g_value_copy (framerate, &navtest->framerate);
+ ret = TRUE;
+ }
+ }
+
+ return ret;
}
static void
@@ -242,37 +205,37 @@ draw_box_planar411 (guint8 * dest, int width, int height, int x, int y,
}
}
-static void
-gst_navigationtest_planar411 (GstVideofilter * videofilter,
- void *dest, void *src)
+static GstFlowReturn
+gst_navigationtest_transform (GstBaseTransform * trans, GstBuffer * in,
+ GstBuffer * out)
{
- GstNavigationtest *navtest = (GstNavigationtest *) videofilter;
- gint width, height;
+ GstNavigationtest *navtest = GST_NAVIGATIONTEST (trans);
GSList *walk;
-
- g_return_if_fail (GST_IS_NAVIGATIONTEST (videofilter));
-
- width = gst_videofilter_get_input_width (videofilter);
- height = gst_videofilter_get_input_height (videofilter);
+ GstFlowReturn ret = GST_FLOW_OK;
/* do something interesting here. This simply copies the source
* to the destination. */
- memcpy (dest, src, width * height + (width / 2) * (height / 2) * 2);
+ gst_buffer_stamp (out, in);
+
+ memcpy (GST_BUFFER_DATA (out), GST_BUFFER_DATA (in),
+ MIN (GST_BUFFER_SIZE (in), GST_BUFFER_SIZE (out)));
walk = navtest->clicks;
while (walk) {
ButtonClick *click = walk->data;
walk = g_slist_next (walk);
- draw_box_planar411 (dest, width, height, rint (click->x),
- rint (click->y), click->cy, click->cu, click->cv);
+ draw_box_planar411 (GST_BUFFER_DATA (out), navtest->width, navtest->height,
+ rint (click->x), rint (click->y), click->cy, click->cu, click->cv);
if (--click->images_left < 1) {
navtest->clicks = g_slist_remove (navtest->clicks, click);
g_free (click);
}
}
- draw_box_planar411 (dest, width, height, rint (navtest->x),
- rint (navtest->y), 0, 128, 128);
+ draw_box_planar411 (GST_BUFFER_DATA (out), navtest->width, navtest->height,
+ rint (navtest->x), rint (navtest->y), 0, 128, 128);
+
+ return ret;
}
static GstStateChangeReturn
@@ -282,12 +245,6 @@ gst_navigationtest_change_state (GstElement * element,
GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS;
GstNavigationtest *navtest = GST_NAVIGATIONTEST (element);
- /* upwards state changes */
- switch (transition) {
- default:
- break;
- }
-
if (GST_ELEMENT_CLASS (parent_class)->change_state)
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
@@ -307,9 +264,84 @@ gst_navigationtest_change_state (GstElement * element,
return ret;
}
+static void
+gst_navigationtest_base_init (gpointer g_class)
+{
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+
+ gst_element_class_set_details (element_class, &navigationtest_details);
+
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_navigationtest_sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&gst_navigationtest_src_template));
+}
+
+static void
+gst_navigationtest_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);
+
+ element_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_navigationtest_change_state);
+
+ trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_navigationtest_set_caps);
+ trans_class->get_unit_size =
+ GST_DEBUG_FUNCPTR (gst_navigationtest_get_unit_size);
+ trans_class->transform = GST_DEBUG_FUNCPTR (gst_navigationtest_transform);
+}
+
+static void
+gst_navigationtest_init (GTypeInstance * instance, gpointer g_class)
+{
+ GstNavigationtest *navtest = GST_NAVIGATIONTEST (instance);
+ GstBaseTransform *btrans = GST_BASE_TRANSFORM (instance);
+
+ gst_pad_set_event_function (btrans->srcpad,
+ GST_DEBUG_FUNCPTR (gst_navigationtest_handle_src_event));
+
+ navtest->x = -1;
+ navtest->y = -1;
+}
+
+GType
+gst_navigationtest_get_type (void)
+{
+ static GType navigationtest_type = 0;
+
+ if (!navigationtest_type) {
+ static const GTypeInfo navigationtest_info = {
+ sizeof (GstNavigationtestClass),
+ gst_navigationtest_base_init,
+ NULL,
+ gst_navigationtest_class_init,
+ NULL,
+ NULL,
+ sizeof (GstNavigationtest),
+ 0,
+ gst_navigationtest_init,
+ };
+
+ navigationtest_type = g_type_register_static (GST_TYPE_VIDEOFILTER,
+ "GstNavigationtest", &navigationtest_info, 0);
+ }
+ return navigationtest_type;
+}
+
static gboolean
plugin_init (GstPlugin * plugin)
{
+ GST_DEBUG_CATEGORY_INIT (navigationtest_debug, "navigationtest", 0,
+ "navigationtest");
+
return gst_element_register (plugin, "navigationtest", GST_RANK_NONE,
GST_TYPE_NAVIGATIONTEST);
}
diff --git a/gst/debug/gstnavigationtest.h b/gst/debug/gstnavigationtest.h
index 4211fc3c..98abcd81 100644
--- a/gst/debug/gstnavigationtest.h
+++ b/gst/debug/gstnavigationtest.h
@@ -21,12 +21,8 @@
#ifndef __GST_NAVIGATIONTEST_H__
#define __GST_NAVIGATIONTEST_H__
-
-#include <gst/gst.h>
-
#include "gstvideofilter.h"
-
G_BEGIN_DECLS
#define GST_TYPE_NAVIGATIONTEST \
@@ -43,11 +39,21 @@ G_BEGIN_DECLS
typedef struct _GstNavigationtest GstNavigationtest;
typedef struct _GstNavigationtestClass GstNavigationtestClass;
+typedef struct
+{
+ gdouble x;
+ gdouble y;
+ gint images_left;
+ guint8 cy, cu, cv;
+} ButtonClick;
+
struct _GstNavigationtest {
GstVideofilter videofilter;
- double x;
- double y;
+ gint width, height;
+
+ GValue framerate;
+ gdouble x, y;
GSList *clicks;
};
@@ -61,4 +67,3 @@ GType gst_navigationtest_get_type(void);
G_END_DECLS
#endif /* __GST_NAVIGATIONTEST_H__ */
-