mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-01 09:21:03 +00:00
sys/xvimage/xvimagesink.c: Implementing correct colorbalance properties. They can now be set when the element is stil...
Original commit message from CVS: 2004-01-16 Julien MOUTTE <julien@moutte.net> * sys/xvimage/xvimagesink.c: (gst_xvimagesink_update_colorbalance), (gst_xvimagesink_xcontext_get), (gst_xvimagesink_change_state), (gst_xvimagesink_set_xwindow_id), (gst_xvimagesink_colorbalance_set_value), (gst_xvimagesink_colorbalance_get_value), (gst_xvimagesink_set_property), (gst_xvimagesink_get_property), (gst_xvimagesink_init), (gst_xvimagesink_class_init): Implementing correct colorbalance properties. They can now be set when the element is still in NULL state. The values will be committed to the Xv Port when xcontext is initialized. * sys/xvimage/xvimagesink.h: Added hue, saturation, contrast, brightness int values in the GstXvImagesink structure.
This commit is contained in:
parent
285797683c
commit
7d4f2bd655
3 changed files with 167 additions and 98 deletions
15
ChangeLog
15
ChangeLog
|
@ -1,3 +1,18 @@
|
||||||
|
2004-01-16 Julien MOUTTE <julien@moutte.net>
|
||||||
|
|
||||||
|
* sys/xvimage/xvimagesink.c: (gst_xvimagesink_update_colorbalance),
|
||||||
|
(gst_xvimagesink_xcontext_get), (gst_xvimagesink_change_state),
|
||||||
|
(gst_xvimagesink_set_xwindow_id),
|
||||||
|
(gst_xvimagesink_colorbalance_set_value),
|
||||||
|
(gst_xvimagesink_colorbalance_get_value),
|
||||||
|
(gst_xvimagesink_set_property), (gst_xvimagesink_get_property),
|
||||||
|
(gst_xvimagesink_init), (gst_xvimagesink_class_init): Implementing
|
||||||
|
correct colorbalance properties. They can now be set when the element
|
||||||
|
is still in NULL state. The values will be committed to the Xv Port
|
||||||
|
when xcontext is initialized.
|
||||||
|
* sys/xvimage/xvimagesink.h: Added hue, saturation, contrast,
|
||||||
|
brightness int values in the GstXvImagesink structure.
|
||||||
|
|
||||||
2004-01-16 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
2004-01-16 Ronald Bultje <rbultje@ronald.bitfreak.net>
|
||||||
|
|
||||||
* gst-libs/gst/Makefile.am:
|
* gst-libs/gst/Makefile.am:
|
||||||
|
|
|
@ -307,6 +307,80 @@ gst_xvimagesink_xwindow_resize (GstXvImageSink *xvimagesink,
|
||||||
g_mutex_unlock (xvimagesink->x_lock);
|
g_mutex_unlock (xvimagesink->x_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This function commits our internal colorbalance settings to our grabbed Xv
|
||||||
|
port. If the xcontext is not initialized yet it simply returns */
|
||||||
|
static void
|
||||||
|
gst_xvimagesink_update_colorbalance (GstXvImageSink *xvimagesink)
|
||||||
|
{
|
||||||
|
GList *channels = NULL;
|
||||||
|
|
||||||
|
g_return_if_fail (xvimagesink != NULL);
|
||||||
|
g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
|
||||||
|
|
||||||
|
/* If we haven't initialized the X context we can't update anything */
|
||||||
|
if (xvimagesink->xcontext == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* For each channel of the colorbalance we calculate the correct value
|
||||||
|
doing range conversion and then set the Xv port attribute to match our
|
||||||
|
values. */
|
||||||
|
channels = xvimagesink->xcontext->channels_list;
|
||||||
|
|
||||||
|
while (channels)
|
||||||
|
{
|
||||||
|
if (channels->data && GST_IS_COLOR_BALANCE_CHANNEL (channels->data))
|
||||||
|
{
|
||||||
|
GstColorBalanceChannel *channel = NULL;
|
||||||
|
gint value = 0;
|
||||||
|
gdouble convert_coef;
|
||||||
|
|
||||||
|
channel = GST_COLOR_BALANCE_CHANNEL (channels->data);
|
||||||
|
g_object_ref (channel);
|
||||||
|
|
||||||
|
/* Our range conversion coef */
|
||||||
|
convert_coef = (channel->max_value - channel->min_value) / 2000;
|
||||||
|
|
||||||
|
if (g_ascii_strcasecmp (channel->label, "XV_HUE") == 0)
|
||||||
|
{
|
||||||
|
value = (xvimagesink->hue + 1000) * convert_coef +
|
||||||
|
channel->min_value;
|
||||||
|
}
|
||||||
|
else if (g_ascii_strcasecmp (channel->label, "XV_SATURATION") == 0)
|
||||||
|
{
|
||||||
|
value = (xvimagesink->saturation + 1000) * convert_coef +
|
||||||
|
channel->min_value;
|
||||||
|
}
|
||||||
|
else if (g_ascii_strcasecmp (channel->label, "XV_CONTRAST") == 0)
|
||||||
|
{
|
||||||
|
value = (xvimagesink->contrast + 1000) * convert_coef +
|
||||||
|
channel->min_value;
|
||||||
|
}
|
||||||
|
else if (g_ascii_strcasecmp (channel->label, "XV_BRIGHTNESS") == 0)
|
||||||
|
{
|
||||||
|
value = (xvimagesink->brightness + 1000) * convert_coef +
|
||||||
|
channel->min_value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_warning ("got an unknown channel %s", channel->label);
|
||||||
|
g_object_unref (channel);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Committing to Xv port */
|
||||||
|
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);
|
||||||
|
|
||||||
|
g_object_unref (channel);
|
||||||
|
}
|
||||||
|
channels = g_list_next (channels);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* This function handles XEvents that might be in the queue. It generates
|
/* This function handles XEvents that might be in the queue. It generates
|
||||||
GstEvent that will be sent upstream in the pipeline to handle interactivity
|
GstEvent that will be sent upstream in the pipeline to handle interactivity
|
||||||
and navigation. It will also listen for configure events on the window to
|
and navigation. It will also listen for configure events on the window to
|
||||||
|
@ -887,6 +961,8 @@ gst_xvimagesink_change_state (GstElement *element)
|
||||||
xvimagesink->xcontext = gst_xvimagesink_xcontext_get (xvimagesink);
|
xvimagesink->xcontext = gst_xvimagesink_xcontext_get (xvimagesink);
|
||||||
if (!xvimagesink->xcontext)
|
if (!xvimagesink->xcontext)
|
||||||
return GST_STATE_FAILURE;
|
return GST_STATE_FAILURE;
|
||||||
|
else /* If context initialized correctly let's commit our colorbalance */
|
||||||
|
gst_xvimagesink_update_colorbalance (xvimagesink);
|
||||||
break;
|
break;
|
||||||
case GST_STATE_READY_TO_PAUSED:
|
case GST_STATE_READY_TO_PAUSED:
|
||||||
xvimagesink->time = 0;
|
xvimagesink->time = 0;
|
||||||
|
@ -1151,6 +1227,8 @@ gst_xvimagesink_set_xwindow_id (GstXOverlay *overlay, XID xwindow_id)
|
||||||
g_warning ("xvimagesink was unable to obtain the X11 context.");
|
g_warning ("xvimagesink was unable to obtain the X11 context.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else /* If context initialized correctly let's commit our colorbalance */
|
||||||
|
gst_xvimagesink_update_colorbalance (xvimagesink);
|
||||||
|
|
||||||
/* Clear image pool as the images are unusable anyway */
|
/* Clear image pool as the images are unusable anyway */
|
||||||
gst_xvimagesink_imagepool_clear (xvimagesink);
|
gst_xvimagesink_imagepool_clear (xvimagesink);
|
||||||
|
@ -1261,14 +1339,29 @@ gst_xvimagesink_colorbalance_set_value (GstColorBalance *balance,
|
||||||
g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
|
g_return_if_fail (GST_IS_XVIMAGESINK (xvimagesink));
|
||||||
g_return_if_fail (channel->label != NULL);
|
g_return_if_fail (channel->label != NULL);
|
||||||
|
|
||||||
g_mutex_lock (xvimagesink->x_lock);
|
if (g_ascii_strcasecmp (channel->label, "XV_HUE") == 0)
|
||||||
|
{
|
||||||
|
xvimagesink->hue = value;
|
||||||
|
}
|
||||||
|
else if (g_ascii_strcasecmp (channel->label, "XV_SATURATION") == 0)
|
||||||
|
{
|
||||||
|
xvimagesink->saturation = value;
|
||||||
|
}
|
||||||
|
else if (g_ascii_strcasecmp (channel->label, "XV_CONTRAST") == 0)
|
||||||
|
{
|
||||||
|
xvimagesink->contrast = value;
|
||||||
|
}
|
||||||
|
else if (g_ascii_strcasecmp (channel->label, "XV_BRIGHTNESS") == 0)
|
||||||
|
{
|
||||||
|
xvimagesink->brightness = value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_warning ("got an unknown channel %s", channel->label);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
XvSetPortAttribute (xvimagesink->xcontext->disp,
|
gst_xvimagesink_update_colorbalance (xvimagesink);
|
||||||
xvimagesink->xcontext->xv_port_id,
|
|
||||||
XInternAtom (xvimagesink->xcontext->disp,
|
|
||||||
channel->label, 1), value);
|
|
||||||
|
|
||||||
g_mutex_unlock (xvimagesink->x_lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gint
|
static gint
|
||||||
|
@ -1276,20 +1369,32 @@ gst_xvimagesink_colorbalance_get_value (GstColorBalance *balance,
|
||||||
GstColorBalanceChannel *channel)
|
GstColorBalanceChannel *channel)
|
||||||
{
|
{
|
||||||
GstXvImageSink *xvimagesink = GST_XVIMAGESINK (balance);
|
GstXvImageSink *xvimagesink = GST_XVIMAGESINK (balance);
|
||||||
gint value;
|
gint value = 0;
|
||||||
|
|
||||||
g_return_val_if_fail (xvimagesink != NULL, 0);
|
g_return_val_if_fail (xvimagesink != NULL, 0);
|
||||||
g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), 0);
|
g_return_val_if_fail (GST_IS_XVIMAGESINK (xvimagesink), 0);
|
||||||
g_return_val_if_fail (channel->label != NULL, 0);
|
g_return_val_if_fail (channel->label != NULL, 0);
|
||||||
|
|
||||||
g_mutex_lock (xvimagesink->x_lock);
|
if (g_ascii_strcasecmp (channel->label, "XV_HUE") == 0)
|
||||||
|
{
|
||||||
XvGetPortAttribute (xvimagesink->xcontext->disp,
|
value = xvimagesink->hue;
|
||||||
xvimagesink->xcontext->xv_port_id,
|
}
|
||||||
XInternAtom (xvimagesink->xcontext->disp,
|
else if (g_ascii_strcasecmp (channel->label, "XV_SATURATION") == 0)
|
||||||
channel->label, 1), &value);
|
{
|
||||||
|
value = xvimagesink->saturation;
|
||||||
g_mutex_unlock (xvimagesink->x_lock);
|
}
|
||||||
|
else if (g_ascii_strcasecmp (channel->label, "XV_CONTRAST") == 0)
|
||||||
|
{
|
||||||
|
value = xvimagesink->contrast;
|
||||||
|
}
|
||||||
|
else if (g_ascii_strcasecmp (channel->label, "XV_BRIGHTNESS") == 0)
|
||||||
|
{
|
||||||
|
value = xvimagesink->brightness;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_warning ("got an unknown channel %s", channel->label);
|
||||||
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
@ -1322,40 +1427,20 @@ gst_xvimagesink_set_property (GObject *object, guint prop_id,
|
||||||
switch (prop_id)
|
switch (prop_id)
|
||||||
{
|
{
|
||||||
case ARG_HUE:
|
case ARG_HUE:
|
||||||
g_mutex_lock (xvimagesink->x_lock);
|
xvimagesink->hue = g_value_get_int (value);
|
||||||
XvSetPortAttribute (xvimagesink->xcontext->disp,
|
gst_xvimagesink_update_colorbalance (xvimagesink);
|
||||||
xvimagesink->xcontext->xv_port_id,
|
|
||||||
XInternAtom (xvimagesink->xcontext->disp,
|
|
||||||
"XV_HUE", 1),
|
|
||||||
g_value_get_int (value));
|
|
||||||
g_mutex_unlock (xvimagesink->x_lock);
|
|
||||||
break;
|
break;
|
||||||
case ARG_CONTRAST:
|
case ARG_CONTRAST:
|
||||||
g_mutex_lock (xvimagesink->x_lock);
|
xvimagesink->contrast = g_value_get_int (value);
|
||||||
XvSetPortAttribute (xvimagesink->xcontext->disp,
|
gst_xvimagesink_update_colorbalance (xvimagesink);
|
||||||
xvimagesink->xcontext->xv_port_id,
|
|
||||||
XInternAtom (xvimagesink->xcontext->disp,
|
|
||||||
"XV_CONTRAST", 1),
|
|
||||||
g_value_get_int (value));
|
|
||||||
g_mutex_unlock (xvimagesink->x_lock);
|
|
||||||
break;
|
break;
|
||||||
case ARG_BRIGHTNESS:
|
case ARG_BRIGHTNESS:
|
||||||
g_mutex_lock (xvimagesink->x_lock);
|
xvimagesink->brightness = g_value_get_int (value);
|
||||||
XvSetPortAttribute (xvimagesink->xcontext->disp,
|
gst_xvimagesink_update_colorbalance (xvimagesink);
|
||||||
xvimagesink->xcontext->xv_port_id,
|
|
||||||
XInternAtom (xvimagesink->xcontext->disp,
|
|
||||||
"XV_BRIGHTNESS", 1),
|
|
||||||
g_value_get_int (value));
|
|
||||||
g_mutex_unlock (xvimagesink->x_lock);
|
|
||||||
break;
|
break;
|
||||||
case ARG_SATURATION:
|
case ARG_SATURATION:
|
||||||
g_mutex_lock (xvimagesink->x_lock);
|
xvimagesink->saturation = g_value_get_int (value);
|
||||||
XvSetPortAttribute (xvimagesink->xcontext->disp,
|
gst_xvimagesink_update_colorbalance (xvimagesink);
|
||||||
xvimagesink->xcontext->xv_port_id,
|
|
||||||
XInternAtom (xvimagesink->xcontext->disp,
|
|
||||||
"XV_SATURATION", 1),
|
|
||||||
g_value_get_int (value));
|
|
||||||
g_mutex_unlock (xvimagesink->x_lock);
|
|
||||||
break;
|
break;
|
||||||
case ARG_DISPLAY:
|
case ARG_DISPLAY:
|
||||||
xvimagesink->display_name = g_strdup (g_value_get_string (value));
|
xvimagesink->display_name = g_strdup (g_value_get_string (value));
|
||||||
|
@ -1379,56 +1464,16 @@ gst_xvimagesink_get_property (GObject *object, guint prop_id,
|
||||||
switch (prop_id)
|
switch (prop_id)
|
||||||
{
|
{
|
||||||
case ARG_HUE:
|
case ARG_HUE:
|
||||||
{
|
g_value_set_int (value, xvimagesink->hue);
|
||||||
gint l_value;
|
|
||||||
g_mutex_lock (xvimagesink->x_lock);
|
|
||||||
XvGetPortAttribute (xvimagesink->xcontext->disp,
|
|
||||||
xvimagesink->xcontext->xv_port_id,
|
|
||||||
XInternAtom (xvimagesink->xcontext->disp,
|
|
||||||
"XV_HUE", 1),
|
|
||||||
&l_value);
|
|
||||||
g_mutex_unlock (xvimagesink->x_lock);
|
|
||||||
g_value_set_int (value, l_value);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case ARG_CONTRAST:
|
case ARG_CONTRAST:
|
||||||
{
|
g_value_set_int (value, xvimagesink->contrast);
|
||||||
gint l_value;
|
|
||||||
g_mutex_lock (xvimagesink->x_lock);
|
|
||||||
XvGetPortAttribute (xvimagesink->xcontext->disp,
|
|
||||||
xvimagesink->xcontext->xv_port_id,
|
|
||||||
XInternAtom (xvimagesink->xcontext->disp,
|
|
||||||
"XV_CONTRAST", 1),
|
|
||||||
&l_value);
|
|
||||||
g_mutex_unlock (xvimagesink->x_lock);
|
|
||||||
g_value_set_int (value, l_value);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case ARG_BRIGHTNESS:
|
case ARG_BRIGHTNESS:
|
||||||
{
|
g_value_set_int (value, xvimagesink->brightness);
|
||||||
gint l_value;
|
|
||||||
g_mutex_lock (xvimagesink->x_lock);
|
|
||||||
XvGetPortAttribute (xvimagesink->xcontext->disp,
|
|
||||||
xvimagesink->xcontext->xv_port_id,
|
|
||||||
XInternAtom (xvimagesink->xcontext->disp,
|
|
||||||
"XV_BRIGHTNESS", 1),
|
|
||||||
&l_value);
|
|
||||||
g_mutex_unlock (xvimagesink->x_lock);
|
|
||||||
g_value_set_int (value, l_value);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case ARG_SATURATION:
|
case ARG_SATURATION:
|
||||||
{
|
g_value_set_int (value, xvimagesink->saturation);
|
||||||
gint l_value;
|
|
||||||
g_mutex_lock (xvimagesink->x_lock);
|
|
||||||
XvGetPortAttribute (xvimagesink->xcontext->disp,
|
|
||||||
xvimagesink->xcontext->xv_port_id,
|
|
||||||
XInternAtom (xvimagesink->xcontext->disp,
|
|
||||||
"XV_SATURATION", 1),
|
|
||||||
&l_value);
|
|
||||||
g_mutex_unlock (xvimagesink->x_lock);
|
|
||||||
g_value_set_int (value, l_value);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case ARG_DISPLAY:
|
case ARG_DISPLAY:
|
||||||
g_value_set_string (value, g_strdup (xvimagesink->display_name));
|
g_value_set_string (value, g_strdup (xvimagesink->display_name));
|
||||||
|
@ -1502,6 +1547,9 @@ gst_xvimagesink_init (GstXvImageSink *xvimagesink)
|
||||||
xvimagesink->xwindow = NULL;
|
xvimagesink->xwindow = NULL;
|
||||||
xvimagesink->xvimage = NULL;
|
xvimagesink->xvimage = NULL;
|
||||||
|
|
||||||
|
xvimagesink->hue = xvimagesink->saturation = 0;
|
||||||
|
xvimagesink->contrast = xvimagesink->brightness = 0;
|
||||||
|
|
||||||
xvimagesink->framerate = 0;
|
xvimagesink->framerate = 0;
|
||||||
|
|
||||||
xvimagesink->x_lock = g_mutex_new ();
|
xvimagesink->x_lock = g_mutex_new ();
|
||||||
|
@ -1538,17 +1586,17 @@ gst_xvimagesink_class_init (GstXvImageSinkClass *klass)
|
||||||
parent_class = g_type_class_ref (GST_TYPE_VIDEOSINK);
|
parent_class = g_type_class_ref (GST_TYPE_VIDEOSINK);
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class, ARG_CONTRAST,
|
g_object_class_install_property (gobject_class, ARG_CONTRAST,
|
||||||
g_param_spec_double ("contrast", "Contrast", "contrast",
|
g_param_spec_int ("contrast", "Contrast", "The contrast of the video",
|
||||||
-1000, 2, 1, G_PARAM_READWRITE));
|
-1000, 1000, 0, G_PARAM_READWRITE));
|
||||||
g_object_class_install_property(gobject_class, ARG_BRIGHTNESS,
|
g_object_class_install_property(gobject_class, ARG_BRIGHTNESS,
|
||||||
g_param_spec_double ("brightness", "Brightness", "brightness",
|
g_param_spec_int ("brightness", "Brightness", "The brightness of the video",
|
||||||
-1, 1, 0, G_PARAM_READWRITE));
|
-1000, 1000, 0, G_PARAM_READWRITE));
|
||||||
g_object_class_install_property (gobject_class, ARG_HUE,
|
g_object_class_install_property (gobject_class, ARG_HUE,
|
||||||
g_param_spec_double ("hue", "Hue", "hue",
|
g_param_spec_int ("hue", "Hue", "The hue of the video",
|
||||||
-1, 1, 0, G_PARAM_READWRITE));
|
-1000, 1000, 0, G_PARAM_READWRITE));
|
||||||
g_object_class_install_property (gobject_class, ARG_SATURATION,
|
g_object_class_install_property (gobject_class, ARG_SATURATION,
|
||||||
g_param_spec_double ("saturation", "Saturation", "saturation",
|
g_param_spec_int ("saturation", "Saturation", "The saturation of the video",
|
||||||
0, 2, 1, G_PARAM_READWRITE));
|
-1000, 1000, 0, G_PARAM_READWRITE));
|
||||||
g_object_class_install_property (gobject_class, ARG_DISPLAY,
|
g_object_class_install_property (gobject_class, ARG_DISPLAY,
|
||||||
g_param_spec_string ("display", "Display", "X Display name",
|
g_param_spec_string ("display", "Display", "X Display name",
|
||||||
NULL, G_PARAM_READWRITE));
|
NULL, G_PARAM_READWRITE));
|
||||||
|
|
|
@ -129,6 +129,12 @@ struct _GstXvImageSink {
|
||||||
GstXvImage *xvimage;
|
GstXvImage *xvimage;
|
||||||
|
|
||||||
gdouble framerate;
|
gdouble framerate;
|
||||||
|
|
||||||
|
gint brightness;
|
||||||
|
gint contrast;
|
||||||
|
gint hue;
|
||||||
|
gint saturation;
|
||||||
|
|
||||||
GMutex *x_lock;
|
GMutex *x_lock;
|
||||||
|
|
||||||
/* Unused */
|
/* Unused */
|
||||||
|
|
Loading…
Reference in a new issue