blob: 1673468747ecf12ca48685a7b4a9e478235ed7ca [file] [log] [blame]
/* GStreamer Color Balance
* Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
*
* colorbalance.c: image color balance interface design
* virtual class function wrappers
*
* 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., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "colorbalance.h"
/**
* SECTION:gstcolorbalance
* @title: GstColorBalance
* @short_description: Interface for adjusting color balance settings
*
* This interface is implemented by elements which can perform some color
* balance operation on video frames they process. For example, modifying
* the brightness, contrast, hue or saturation.
*
* Example elements are 'xvimagesink' and 'colorbalance'
*
*/
/* FIXME 0.11: check if we need to add API for sometimes-supportedness
* (aka making up for GstImplementsInterface removal) */
/* FIXME 0.11: replace signals with messages (+ make API thread-safe) */
enum
{
VALUE_CHANGED,
LAST_SIGNAL
};
static void gst_color_balance_base_init (GstColorBalanceInterface * iface);
static guint gst_color_balance_signals[LAST_SIGNAL] = { 0 };
GType
gst_color_balance_get_type (void)
{
static GType gst_color_balance_type = 0;
if (!gst_color_balance_type) {
static const GTypeInfo gst_color_balance_info = {
sizeof (GstColorBalanceInterface),
(GBaseInitFunc) gst_color_balance_base_init,
NULL,
NULL,
NULL,
NULL,
0,
0,
NULL,
};
gst_color_balance_type = g_type_register_static (G_TYPE_INTERFACE,
"GstColorBalance", &gst_color_balance_info, 0);
}
return gst_color_balance_type;
}
static void
gst_color_balance_base_init (GstColorBalanceInterface * iface)
{
static gboolean initialized = FALSE;
if (!initialized) {
/**
* GstColorBalance::value-changed:
* @colorbalance: The GstColorBalance instance
* @channel: The #GstColorBalanceChannel
* @value: The new value
*
* Fired when the value of the indicated channel has changed.
*/
gst_color_balance_signals[VALUE_CHANGED] =
g_signal_new ("value-changed",
GST_TYPE_COLOR_BALANCE, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GstColorBalanceInterface, value_changed),
NULL, NULL, NULL,
G_TYPE_NONE, 2, GST_TYPE_COLOR_BALANCE_CHANNEL, G_TYPE_INT);
initialized = TRUE;
}
/* default virtual functions */
iface->list_channels = NULL;
iface->set_value = NULL;
iface->get_value = NULL;
iface->get_balance_type = NULL;
}
/**
* gst_color_balance_list_channels:
* @balance: A #GstColorBalance instance
*
* Retrieve a list of the available channels.
*
* Returns: (element-type GstColorBalanceChannel) (transfer none): A
* GList containing pointers to #GstColorBalanceChannel
* objects. The list is owned by the #GstColorBalance
* instance and must not be freed.
*/
const GList *
gst_color_balance_list_channels (GstColorBalance * balance)
{
GstColorBalanceInterface *iface;
g_return_val_if_fail (GST_IS_COLOR_BALANCE (balance), NULL);
iface = GST_COLOR_BALANCE_GET_INTERFACE (balance);
if (iface->list_channels) {
return iface->list_channels (balance);
}
return NULL;
}
/**
* gst_color_balance_set_value:
* @balance: A #GstColorBalance instance
* @channel: A #GstColorBalanceChannel instance
* @value: The new value for the channel.
*
* Sets the current value of the channel to the passed value, which must
* be between min_value and max_value.
*
* See Also: The #GstColorBalanceChannel.min_value and
* #GstColorBalanceChannel.max_value members of the
* #GstColorBalanceChannel object.
*/
void
gst_color_balance_set_value (GstColorBalance * balance,
GstColorBalanceChannel * channel, gint value)
{
GstColorBalanceInterface *iface = GST_COLOR_BALANCE_GET_INTERFACE (balance);
if (iface->set_value) {
iface->set_value (balance, channel, value);
}
}
/**
* gst_color_balance_get_value:
* @balance: A #GstColorBalance instance
* @channel: A #GstColorBalanceChannel instance
*
* Retrieve the current value of the indicated channel, between min_value
* and max_value.
*
* See Also: The #GstColorBalanceChannel.min_value and
* #GstColorBalanceChannel.max_value members of the
* #GstColorBalanceChannel object.
*
* Returns: The current value of the channel.
*/
gint
gst_color_balance_get_value (GstColorBalance * balance,
GstColorBalanceChannel * channel)
{
GstColorBalanceInterface *iface;
g_return_val_if_fail (GST_IS_COLOR_BALANCE (balance), 0);
iface = GST_COLOR_BALANCE_GET_INTERFACE (balance);
if (iface->get_value) {
return iface->get_value (balance, channel);
}
return channel->min_value;
}
/**
* gst_color_balance_get_balance_type:
* @balance: The #GstColorBalance implementation
*
* Get the #GstColorBalanceType of this implementation.
*
* Returns: A the #GstColorBalanceType.
*/
GstColorBalanceType
gst_color_balance_get_balance_type (GstColorBalance * balance)
{
GstColorBalanceInterface *iface;
g_return_val_if_fail (GST_IS_COLOR_BALANCE (balance),
GST_COLOR_BALANCE_SOFTWARE);
iface = GST_COLOR_BALANCE_GET_INTERFACE (balance);
g_return_val_if_fail (iface->get_balance_type != NULL,
GST_COLOR_BALANCE_SOFTWARE);
return iface->get_balance_type (balance);
}
/**
* gst_color_balance_value_changed:
* @balance: A #GstColorBalance instance
* @channel: A #GstColorBalanceChannel whose value has changed
* @value: The new value of the channel
*
* A helper function called by implementations of the GstColorBalance
* interface. It fires the #GstColorBalance::value-changed signal on the
* instance, and the #GstColorBalanceChannel::value-changed signal on the
* channel object.
*/
void
gst_color_balance_value_changed (GstColorBalance * balance,
GstColorBalanceChannel * channel, gint value)
{
g_return_if_fail (GST_IS_COLOR_BALANCE (balance));
g_signal_emit (G_OBJECT (balance),
gst_color_balance_signals[VALUE_CHANGED], 0, channel, value);
g_signal_emit_by_name (G_OBJECT (channel), "value_changed", value);
}