gst-libs/gst/colorbalance/colorbalance.c: Adding a default type.
authorJulien Moutte <julien@moutte.net>
Wed, 14 Jan 2004 17:15:34 +0000 (17:15 +0000)
committerJulien Moutte <julien@moutte.net>
Wed, 14 Jan 2004 17:15:34 +0000 (17:15 +0000)
Original commit message from CVS:
2004-01-14  Julien MOUTTE <julien@moutte.net>

* gst-libs/gst/colorbalance/colorbalance.c:
(gst_color_balance_class_init): Adding a default type.
* gst-libs/gst/colorbalance/colorbalance.h: Adding a macro to access
the type.
* gst/videofilter/gstvideobalance.c: (gst_videobalance_get_type),
(gst_videobalance_dispose), (gst_videobalance_class_init),
(gst_videobalance_init), (gst_videobalance_interface_supported),
(gst_videobalance_interface_init),
(gst_videobalance_colorbalance_list_channels),
(gst_videobalance_colorbalance_set_value),
(gst_videobalance_colorbalance_get_value),
(gst_videobalance_colorbalance_init): Implementing colorbalance
interface.
* gst/videofilter/gstvideobalance.h: Adding colorbalance channels
list.
* sys/ximage/ximagesink.c: (gst_ximagesink_set_xwindow_id): Fixing a
bug which was triggering a BadAccess X error when setting an overlay
before pad was really negotiated.
* sys/xvimage/xvimagesink.c: (gst_xvimagesink_colorbalance_init):
Using the colorbalance type macro.

ChangeLog
gst/videofilter/gstvideobalance.c
gst/videofilter/gstvideobalance.h

index aafaea342d73a9d3e97416506f1394c928c494e2..b8bf8932fb398c5bfcb04391697345f8ccbb977b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2004-01-14  Julien MOUTTE <julien@moutte.net>
+
+       * gst-libs/gst/colorbalance/colorbalance.c:
+       (gst_color_balance_class_init): Adding a default type.
+       * gst-libs/gst/colorbalance/colorbalance.h: Adding a macro to access
+       the type.
+       * gst/videofilter/gstvideobalance.c: (gst_videobalance_get_type),
+       (gst_videobalance_dispose), (gst_videobalance_class_init),
+       (gst_videobalance_init), (gst_videobalance_interface_supported),
+       (gst_videobalance_interface_init),
+       (gst_videobalance_colorbalance_list_channels),
+       (gst_videobalance_colorbalance_set_value),
+       (gst_videobalance_colorbalance_get_value),
+       (gst_videobalance_colorbalance_init): Implementing colorbalance
+       interface.
+       * gst/videofilter/gstvideobalance.h: Adding colorbalance channels
+       list.
+       * sys/ximage/ximagesink.c: (gst_ximagesink_set_xwindow_id): Fixing a
+       bug which was triggering a BadAccess X error when setting an overlay
+       before pad was really negotiated.
+       * sys/xvimage/xvimagesink.c: (gst_xvimagesink_colorbalance_init):
+       Using the colorbalance type macro.
+
 2004-01-14  Benjamin Otte  <in7y118@public.uni-hamburg.de>
 
        * ext/flac/gstflacenc.c: (gst_flacenc_set_metadata),
index 5963e0fa9387436abfa41a642e40d27966733434..766cc928e399f3581e05932cac5b40152a016e6e 100644 (file)
@@ -32,6 +32,8 @@
 #include <string.h>
 #include <math.h>
 
+#include <gst/colorbalance/colorbalance.h>
+
 /* GstVideobalance signals and args */
 enum {
   /* FILL ME */
@@ -47,6 +49,8 @@ enum {
   /* FILL ME */
 };
 
+static GstVideofilterClass *parent_class = NULL;
+
 static void    gst_videobalance_base_init      (gpointer g_class);
 static void    gst_videobalance_class_init     (gpointer g_class, gpointer class_data);
 static void    gst_videobalance_init           (GTypeInstance *instance, gpointer g_class);
@@ -57,6 +61,11 @@ static void  gst_videobalance_get_property           (GObject *object, guint prop_id, GVal
 static void gst_videobalance_planar411(GstVideofilter *videofilter, void *dest, void *src);
 static void gst_videobalance_setup(GstVideofilter *videofilter);
 
+static void gst_videobalance_interface_init (GstImplementsInterfaceClass *klass);
+static void gst_videobalance_colorbalance_init (GstColorBalanceClass *iface);
+
+static void gst_videobalance_dispose (GObject *object);
+
 GType
 gst_videobalance_get_type (void)
 {
@@ -74,8 +83,26 @@ gst_videobalance_get_type (void)
       0,
       gst_videobalance_init,
     };
+    
+    static const GInterfaceInfo iface_info = {
+      (GInterfaceInitFunc) gst_videobalance_interface_init,
+      NULL,
+      NULL,
+    };
+    
+    static const GInterfaceInfo colorbalance_info = {
+      (GInterfaceInitFunc) gst_videobalance_colorbalance_init,
+      NULL,
+      NULL,
+    };
+    
     videobalance_type = g_type_register_static(GST_TYPE_VIDEOFILTER,
         "GstVideobalance", &videobalance_info, 0);
+    
+    g_type_add_interface_static (videobalance_type, GST_TYPE_IMPLEMENTS_INTERFACE,
+                                 &iface_info);
+    g_type_add_interface_static (videobalance_type, GST_TYPE_COLOR_BALANCE,
+                                 &colorbalance_info);
   }
   return videobalance_type;
 }
@@ -108,6 +135,29 @@ gst_videobalance_base_init (gpointer g_class)
   gst_videofilter_class_add_pad_templates (GST_VIDEOFILTER_CLASS (g_class));
 }
 
+static void
+gst_videobalance_dispose (GObject *object)
+{
+  GList *channels = NULL;
+  GstVideobalance *balance;
+
+  balance = GST_VIDEOBALANCE (object);
+  
+  channels = balance->channels;
+  
+  while (channels)
+    {
+      GstColorBalanceChannel *channel = channels->data;
+      g_object_unref (channel);
+      channels = g_list_next (channels);
+    }
+    
+  if (balance->channels)
+    g_list_free (balance->channels);
+  
+  G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
 static void
 gst_videobalance_class_init (gpointer g_class, gpointer class_data)
 {
@@ -117,6 +167,8 @@ gst_videobalance_class_init (gpointer g_class, gpointer class_data)
   gobject_class = G_OBJECT_CLASS (g_class);
   videofilter_class = GST_VIDEOFILTER_CLASS (g_class);
 
+  parent_class = g_type_class_ref (GST_TYPE_VIDEOFILTER);
+  
   g_object_class_install_property(gobject_class, ARG_CONTRAST,
       g_param_spec_double("contrast","Contrast","contrast",
       0, 2, 1, G_PARAM_READWRITE));
@@ -132,6 +184,7 @@ gst_videobalance_class_init (gpointer g_class, gpointer class_data)
 
   gobject_class->set_property = gst_videobalance_set_property;
   gobject_class->get_property = gst_videobalance_get_property;
+  gobject_class->dispose = gst_videobalance_dispose;
 
   videofilter_class->setup = gst_videobalance_setup;
 }
@@ -141,7 +194,10 @@ gst_videobalance_init (GTypeInstance *instance, gpointer g_class)
 {
   GstVideobalance *videobalance = GST_VIDEOBALANCE (instance);
   GstVideofilter *videofilter;
-
+  char *channels[4] = { "HUE", "SATURATION",
+                        "BRIGHTNESS", "CONTRAST" };
+  gint i;
+                        
   GST_DEBUG("gst_videobalance_init");
 
   videofilter = GST_VIDEOFILTER(videobalance);
@@ -151,7 +207,101 @@ gst_videobalance_init (GTypeInstance *instance, gpointer g_class)
   videobalance->brightness = 0;
   videobalance->saturation = 1;
   videobalance->hue = 0;
+                        
+  /* 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 = G_MININT;
+      channel->max_value = G_MAXINT;
+      
+      videobalance->channels = g_list_append (videobalance->channels,
+                                              channel);
+    }
+
+}
+
+static gboolean
+gst_videobalance_interface_supported (GstImplementsInterface *iface, GType type)
+{
+  g_assert (type == GST_TYPE_COLOR_BALANCE);
+  return TRUE;
+}
 
+static void
+gst_videobalance_interface_init (GstImplementsInterfaceClass *klass)
+{
+  klass->supported = gst_videobalance_interface_supported;
+}
+
+static const GList *
+gst_videobalance_colorbalance_list_channels (GstColorBalance *balance)
+{
+  GstVideobalance *videobalance = GST_VIDEOBALANCE (balance);
+  
+  g_return_val_if_fail (videobalance != NULL, NULL);
+  g_return_val_if_fail (GST_IS_VIDEOBALANCE (videobalance), NULL);
+  
+  if (videobalance->channels)
+    return videobalance->channels;
+  else
+    return NULL;
+}
+
+static void
+gst_videobalance_colorbalance_set_value (GstColorBalance        *balance,
+                                         GstColorBalanceChannel *channel,
+                                         gint                    value)
+{
+  GstVideobalance *vb = GST_VIDEOBALANCE (balance);
+  
+  g_return_if_fail (vb != NULL);
+  g_return_if_fail (GST_IS_VIDEOBALANCE (vb));
+  g_return_if_fail (channel->label != NULL);
+  
+  if (!g_ascii_strcasecmp (channel->label, "HUE"))
+    vb->hue = (value - G_MININT) * 2 / ((double) G_MAXINT - G_MININT) - 1;
+  else if (!g_ascii_strcasecmp (channel->label, "SATURATION"))
+    vb->saturation = (value - G_MININT) * 2 / ((double) G_MAXINT - G_MININT);
+  else if (!g_ascii_strcasecmp (channel->label, "BRIGHTNESS"))
+    vb->brightness = (value - G_MININT) * 2 / ((double) G_MAXINT - G_MININT) - 1;
+  else if (!g_ascii_strcasecmp (channel->label, "CONTRAST"))
+    vb->contrast = (value - G_MININT) * 2 / ((double) G_MAXINT - G_MININT);
+}
+
+static gint
+gst_videobalance_colorbalance_get_value (GstColorBalance        *balance,
+                                         GstColorBalanceChannel *channel)
+{
+  GstVideobalance *vb = GST_VIDEOBALANCE (balance);
+  gint value = 0;
+  
+  g_return_val_if_fail (vb != NULL, 0);
+  g_return_val_if_fail (GST_IS_VIDEOBALANCE (vb), 0);
+  g_return_val_if_fail (channel->label != NULL, 0);
+  
+  if (!g_ascii_strcasecmp (channel->label, "HUE"))
+    value = (vb->hue + 1) * ((double) G_MAXINT - G_MININT) / 2 + G_MININT;
+  else if (!g_ascii_strcasecmp (channel->label, "SATURATION"))
+    value = vb->saturation * ((double) G_MAXINT - G_MININT) / 2 + G_MININT;
+  else if (!g_ascii_strcasecmp (channel->label, "BRIGHTNESS"))
+    value = (vb->brightness + 1) * ((double) G_MAXINT - G_MININT) / 2 + G_MININT;
+  else if (!g_ascii_strcasecmp (channel->label, "CONTRAST"))
+    value = vb->contrast * ((double) G_MAXINT - G_MININT) / 2 + G_MININT;
+  
+  return value;
+}
+
+static void
+gst_videobalance_colorbalance_init (GstColorBalanceClass *iface)
+{
+  GST_COLOR_BALANCE_TYPE (iface) = GST_COLOR_BALANCE_SOFTWARE;
+  iface->list_channels = gst_videobalance_colorbalance_list_channels;
+  iface->set_value = gst_videobalance_colorbalance_set_value;
+  iface->get_value = gst_videobalance_colorbalance_get_value;
 }
 
 static void
index 5c8b3cf40298e92b2ed0015154b8497a389e085a..f0856dde8527fb3c0e68fe330e94a2641ba922a5 100644 (file)
@@ -50,6 +50,8 @@ struct _GstVideobalance {
   double brightness;
   double hue;
   double saturation;
+  
+  GList *channels;
 };
 
 struct _GstVideobalanceClass {
@@ -61,4 +63,3 @@ GType gst_videobalance_get_type(void);
 G_END_DECLS
 
 #endif /* __GST_VIDEOBALANCE_H__ */
-