From aa94247770732a40e46ab3d539dd9987062abef4 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Fri, 10 Oct 2003 12:47:42 +0000 Subject: Some interface implementations for video4linux/video4linux2 plugins: a Tuner interface, with which one can select inp... Original commit message from CVS: Some interface implementations for video4linux/video4linux2 plugins: * a Tuner interface, with which one can select inputs and stations. Audio work is underway here, but unfinished. * A Xoverlay interface with which one can do simple overlay. Similar to the API of the v4l/Xv XFree86 extension. Widget implementation for GTK-2.0 coming up in the sandbox. * Colorbalance - for adapting colors (brightness, contrast, etc.) - pretty basic and maybe somewhat overdesigned. But it'll do for now. Apart from these interfaces, there's also a loadable library 'xwindowlistener' that listenes to X for the movement of a window and the overlap of other windows. This is partly copied from xawtv (and thus partly GPL :(), but it's needed for the xoverlay interface implementation in the v4l/v4l2 elements. Lastly, some small changes to remove redundant properties from the v4l/v4l2 elements since these can be done much simpler. Comments appreciated! --- sys/v4l2/gstv4l2colorbalance.c | 151 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 sys/v4l2/gstv4l2colorbalance.c (limited to 'sys/v4l2/gstv4l2colorbalance.c') diff --git a/sys/v4l2/gstv4l2colorbalance.c b/sys/v4l2/gstv4l2colorbalance.c new file mode 100644 index 00000000..d0c1dcf8 --- /dev/null +++ b/sys/v4l2/gstv4l2colorbalance.c @@ -0,0 +1,151 @@ +/* GStreamer Color Balance interface implementation + * Copyright (C) 2003 Ronald Bultje + * + * gstv4l2colorbalance.c: color balance interface implementation for V4L2 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "gstv4l2colorbalance.h" +#include "gstv4l2element.h" + +static void +gst_v4l2_color_balance_channel_class_init(GstV4l2ColorBalanceChannelClass *klass); +static void +gst_v4l2_color_balance_channel_init (GstV4l2ColorBalanceChannel *channel); + +static const GList * +gst_v4l2_color_balance_list_channels (GstColorBalance *balance); +static void +gst_v4l2_color_balance_set_value (GstColorBalance *balance, + GstColorBalanceChannel *channel, + gint value); +static gint +gst_v4l2_color_balance_get_value (GstColorBalance *balance, + GstColorBalanceChannel *channel); + +static GstColorBalanceChannelClass *parent_class = NULL; + +GType +gst_v4l2_color_balance_channel_get_type (void) +{ + static GType gst_v4l2_color_balance_channel_type = 0; + + if (!gst_v4l2_color_balance_channel_type) { + static const GTypeInfo v4l2_tuner_channel_info = { + sizeof (GstV4l2ColorBalanceChannelClass), + NULL, + NULL, + (GClassInitFunc) gst_v4l2_color_balance_channel_class_init, + NULL, + NULL, + sizeof (GstV4l2ColorBalanceChannel), + 0, + (GInstanceInitFunc) gst_v4l2_color_balance_channel_init, + NULL + }; + + gst_v4l2_color_balance_channel_type = + g_type_register_static (GST_TYPE_COLOR_BALANCE_CHANNEL, + "GstV4l2ColorBalanceChannel", + &v4l2_tuner_channel_info, 0); + } + + return gst_v4l2_color_balance_channel_type; +} + +static void +gst_v4l2_color_balance_channel_class_init (GstV4l2ColorBalanceChannelClass *klass) +{ + parent_class = g_type_class_ref (GST_TYPE_COLOR_BALANCE_CHANNEL); +} + +static void +gst_v4l2_color_balance_channel_init (GstV4l2ColorBalanceChannel *channel) +{ + channel->index = 0; +} + +void +gst_v4l2_color_balance_interface_init (GstColorBalanceClass *klass) +{ + /* default virtual functions */ + klass->list_channels = gst_v4l2_color_balance_list_channels; + klass->set_value = gst_v4l2_color_balance_set_value; + klass->get_value = gst_v4l2_color_balance_get_value; +} + +static gboolean +gst_v4l2_color_balance_contains_channel (GstV4l2Element *v4l2element, + GstV4l2ColorBalanceChannel *v4l2channel) +{ + const GList *item; + + for (item = v4l2element->colors; item != NULL; item = item->next) + if (item->data == v4l2channel) + return TRUE; + + return FALSE; +} + +static const GList * +gst_v4l2_color_balance_list_channels (GstColorBalance *balance) +{ + return GST_V4L2ELEMENT (balance)->colors; +} + +static void +gst_v4l2_color_balance_set_value (GstColorBalance *balance, + GstColorBalanceChannel *channel, + gint value) +{ + GstV4l2Element *v4l2element = GST_V4L2ELEMENT (balance); + GstV4l2ColorBalanceChannel *v4l2channel = + GST_V4L2_COLOR_BALANCE_CHANNEL (channel); + + /* assert that we're opened and that we're using a known item */ + g_return_if_fail (GST_V4L2_IS_OPEN (v4l2element)); + g_return_if_fail (gst_v4l2_color_balance_contains_channel (v4l2element, + v4l2channel)); + + gst_v4l2_set_attribute (v4l2element, v4l2channel->index, value); +} + +static gint +gst_v4l2_color_balance_get_value (GstColorBalance *balance, + GstColorBalanceChannel *channel) +{ + GstV4l2Element *v4l2element = GST_V4L2ELEMENT (balance); + GstV4l2ColorBalanceChannel *v4l2channel = + GST_V4L2_COLOR_BALANCE_CHANNEL (channel); + gint value; + + /* assert that we're opened and that we're using a known item */ + g_return_val_if_fail (GST_V4L2_IS_OPEN (v4l2element), 0); + g_return_val_if_fail (gst_v4l2_color_balance_contains_channel (v4l2element, + v4l2channel), + 0); + + if (!gst_v4l2_get_attribute (v4l2element, v4l2channel->index, &value)) + return 0; + + return value; +} -- cgit v1.2.1