diff options
Diffstat (limited to 'gst/debug/gstnavigationtest.c')
-rw-r--r-- | gst/debug/gstnavigationtest.c | 302 |
1 files changed, 167 insertions, 135 deletions
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); } |