From 593632083c93f2dfdb81202ad329620ffd4925c4 Mon Sep 17 00:00:00 2001 From: Julien Moutte Date: Mon, 12 Jan 2004 19:50:29 +0000 Subject: [PATCH] gst-libs/gst/colorbalance/colorbalancechannel.c: Adding safety check in dispose method. Original commit message from CVS: 2004-01-12 Julien MOUTTE * gst-libs/gst/colorbalance/colorbalancechannel.c: (gst_color_balance_channel_dispose): Adding safety check in dispose method. * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), (gst_xvimagesink_xcontext_clear), (gst_xvimagesink_interface_supported), (gst_xvimagesink_colorbalance_list_channels), (gst_xvimagesink_colorbalance_set_value), (gst_xvimagesink_colorbalance_get_value), (gst_xvimagesink_colorbalance_init), (gst_xvimagesink_get_type): Adding colorbalance interface support to set XV parameters such as HUE, BRIGHTNESS, CONTRAST, SATURATION. * sys/xvimage/xvimagesink.h: Adding the channels list for colorbalance interface. --- ChangeLog | 17 +++ .../gst/colorbalance/colorbalancechannel.c | 5 +- gst-libs/gst/interfaces/colorbalancechannel.c | 5 +- sys/xvimage/xvimagesink.c | 115 +++++++++++++++++- sys/xvimage/xvimagesink.h | 1 + 5 files changed, 135 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7fa934a7b5..8c6e86eb30 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2004-01-12 Julien MOUTTE + + * gst-libs/gst/colorbalance/colorbalancechannel.c: + (gst_color_balance_channel_dispose): Adding safety check in dispose + method. + * sys/xvimage/xvimagesink.c: (gst_xvimagesink_xcontext_get), + (gst_xvimagesink_xcontext_clear), + (gst_xvimagesink_interface_supported), + (gst_xvimagesink_colorbalance_list_channels), + (gst_xvimagesink_colorbalance_set_value), + (gst_xvimagesink_colorbalance_get_value), + (gst_xvimagesink_colorbalance_init), (gst_xvimagesink_get_type): + Adding colorbalance interface support to set XV parameters such as + HUE, BRIGHTNESS, CONTRAST, SATURATION. + * sys/xvimage/xvimagesink.h: Adding the channels list for colorbalance + interface. + 2004-01-12 Thomas Vander Stichele * gst/audioconvert/gstaudioconvert.c: (gst_audio_convert_get_type), diff --git a/gst-libs/gst/colorbalance/colorbalancechannel.c b/gst-libs/gst/colorbalance/colorbalancechannel.c index f87101200f..e8c6e87bbe 100644 --- a/gst-libs/gst/colorbalance/colorbalancechannel.c +++ b/gst-libs/gst/colorbalance/colorbalancechannel.c @@ -96,7 +96,10 @@ gst_color_balance_channel_dispose (GObject *object) { GstColorBalanceChannel *channel = GST_COLOR_BALANCE_CHANNEL (object); - g_free (channel->label); + if (channel->label) + g_free (channel->label); + + channel->label = NULL; if (parent_class->dispose) parent_class->dispose (object); diff --git a/gst-libs/gst/interfaces/colorbalancechannel.c b/gst-libs/gst/interfaces/colorbalancechannel.c index f87101200f..e8c6e87bbe 100644 --- a/gst-libs/gst/interfaces/colorbalancechannel.c +++ b/gst-libs/gst/interfaces/colorbalancechannel.c @@ -96,7 +96,10 @@ gst_color_balance_channel_dispose (GObject *object) { GstColorBalanceChannel *channel = GST_COLOR_BALANCE_CHANNEL (object); - g_free (channel->label); + if (channel->label) + g_free (channel->label); + + channel->label = NULL; if (parent_class->dispose) parent_class->dispose (object); diff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c index a9f6d16bb2..1835887de0 100644 --- a/sys/xvimage/xvimagesink.c +++ b/sys/xvimage/xvimagesink.c @@ -24,6 +24,7 @@ /* Our interfaces */ #include #include +#include /* Object header */ #include "xvimagesink.h" @@ -529,6 +530,8 @@ gst_xvimagesink_xcontext_get (GstXvImageSink *xvimagesink) GstXContext *xcontext = NULL; XPixmapFormatValues *px_formats = NULL; gint nb_formats = 0, i; + char *channels[4] = { "XV_HUE", "XV_SATURATION", + "XV_BRIGHTNESS", "XV_CONTRAST" }; g_return_val_if_fail (xvimagesink != NULL, NULL); g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), NULL); @@ -616,6 +619,19 @@ gst_xvimagesink_xcontext_get (GstXvImageSink *xvimagesink) g_mutex_unlock (xvimagesink->x_lock); + /* Generate the channels list */ + for (i = 0; i < (sizeof (channels) / sizeof (char *)); i++) + { + GstColorBalanceChannel *channel; + + channel = g_object_new (GST_TYPE_COLOR_BALANCE_CHANNEL, NULL); + channel->label = g_strdup (channels[i]); + channel->min_value = -1000; + channel->max_value = 1000; + xcontext->channels_list = g_list_append (xcontext->channels_list, + channel); + } + return xcontext; } @@ -624,24 +640,36 @@ gst_xvimagesink_xcontext_get (GstXvImageSink *xvimagesink) static void gst_xvimagesink_xcontext_clear (GstXvImageSink *xvimagesink) { - GList *list; + GList *formats_list, *channels_list; g_return_if_fail (xvimagesink != NULL); g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink)); - list = xvimagesink->xcontext->formats_list; + formats_list = xvimagesink->xcontext->formats_list; - while (list) + while (formats_list) { - GstXvImageFormat *format = list->data; + GstXvImageFormat *format = formats_list->data; gst_caps_free (format->caps); g_free (format); - list = g_list_next (list); + formats_list = g_list_next (formats_list); } if (xvimagesink->xcontext->formats_list) g_list_free (xvimagesink->xcontext->formats_list); + + channels_list = xvimagesink->xcontext->channels_list; + + while (channels_list) + { + GstColorBalanceChannel *channel = channels_list->data; + g_object_unref (channel); + channels_list = g_list_next (channels_list); + } + if (xvimagesink->xcontext->channels_list) + g_list_free (xvimagesink->xcontext->channels_list); + gst_caps_free (xvimagesink->xcontext->caps); g_mutex_lock (xvimagesink->x_lock); @@ -1039,7 +1067,9 @@ gst_xvimagesink_imagepool_clear (GstXvImageSink *xvimagesink) static gboolean gst_xvimagesink_interface_supported (GstImplementsInterface *iface, GType type) { - g_assert (type == GST_TYPE_NAVIGATION || type == GST_TYPE_X_OVERLAY); + g_assert (type == GST_TYPE_NAVIGATION || + type == GST_TYPE_X_OVERLAY || + type == GST_TYPE_COLOR_BALANCE); return TRUE; } @@ -1192,6 +1222,72 @@ gst_xvimagesink_xoverlay_init (GstXOverlayClass *iface) iface->get_desired_size = gst_xvimagesink_get_desired_size; } +static const GList * +gst_xvimagesink_colorbalance_list_channels (GstColorBalance *balance) +{ + GstXvImageSink *xvimagesink = GST_XVIMAGESINK (balance); + + g_return_val_if_fail (xvimagesink != NULL, NULL); + g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), NULL); + + if (xvimagesink->xcontext) + return xvimagesink->xcontext->channels_list; + else + return NULL; +} + +static void +gst_xvimagesink_colorbalance_set_value (GstColorBalance *balance, + GstColorBalanceChannel *channel, + gint value) +{ + GstXvImageSink *xvimagesink = GST_XVIMAGESINK (balance); + + g_return_if_fail (xvimagesink != NULL); + g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink)); + g_return_if_fail (channel->label != NULL); + + g_mutex_lock (xvimagesink->x_lock); + + XvSetPortAttribute (xvimagesink->xcontext->disp, + xvimagesink->xcontext->xv_port_id, + XInternAtom (xvimagesink->xcontext->disp, + channel->label, 1), value); + + g_mutex_unlock (xvimagesink->x_lock); +} + +static gint +gst_xvimagesink_colorbalance_get_value (GstColorBalance *balance, + GstColorBalanceChannel *channel) +{ + GstXvImageSink *xvimagesink = GST_XVIMAGESINK (balance); + gint value; + + g_return_val_if_fail (xvimagesink != NULL, 0); + g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), 0); + g_return_val_if_fail (channel->label != NULL, 0); + + g_mutex_lock (xvimagesink->x_lock); + + XvGetPortAttribute (xvimagesink->xcontext->disp, + xvimagesink->xcontext->xv_port_id, + XInternAtom (xvimagesink->xcontext->disp, + channel->label, 1), &value); + + g_mutex_unlock (xvimagesink->x_lock); + + return value; +} + +static void +gst_xvimagesink_colorbalance_init (GstColorBalanceClass *iface) +{ + iface->list_channels = gst_xvimagesink_colorbalance_list_channels; + iface->set_value = gst_xvimagesink_colorbalance_set_value; + iface->get_value = gst_xvimagesink_colorbalance_get_value; +} + /* =========================================== */ /* */ /* Init & Class init */ @@ -1339,6 +1435,11 @@ gst_xvimagesink_get_type (void) NULL, NULL, }; + static const GInterfaceInfo colorbalance_info = { + (GInterfaceInitFunc) gst_xvimagesink_colorbalance_init, + NULL, + NULL, + }; xvimagesink_type = g_type_register_static (GST_TYPE_VIDEOSINK, "GstXvImageSink", @@ -1350,6 +1451,8 @@ gst_xvimagesink_get_type (void) &navigation_info); g_type_add_interface_static (xvimagesink_type, GST_TYPE_X_OVERLAY, &overlay_info); + g_type_add_interface_static (xvimagesink_type, GST_TYPE_COLOR_BALANCE, + &colorbalance_info); } return xvimagesink_type; diff --git a/sys/xvimage/xvimagesink.h b/sys/xvimage/xvimagesink.h index 74a471ad02..36c1a68e2e 100644 --- a/sys/xvimage/xvimagesink.h +++ b/sys/xvimage/xvimagesink.h @@ -84,6 +84,7 @@ struct _GstXContext { gint im_format; GList *formats_list; + GList *channels_list; GstCaps *caps; };