videobalance: Some random cleanup

This commit is contained in:
Sebastian Dröge 2010-04-18 21:58:13 +02:00
parent 17ba0818b1
commit e13cd55fab
2 changed files with 111 additions and 124 deletions

View file

@ -87,11 +87,44 @@ GST_STATIC_PAD_TEMPLATE ("sink",
GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ IYUV, I420, YV12 }")) GST_STATIC_CAPS (GST_VIDEO_CAPS_YUV ("{ IYUV, I420, YV12 }"))
); );
static void gst_video_balance_colorbalance_init (GstColorBalanceClass * iface);
static void gst_video_balance_interface_init (GstImplementsInterfaceClass *
klass);
static void gst_video_balance_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_video_balance_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
static void
_do_init (GType video_balance_type)
{
static const GInterfaceInfo iface_info = {
(GInterfaceInitFunc) gst_video_balance_interface_init,
NULL,
NULL,
};
static const GInterfaceInfo colorbalance_info = {
(GInterfaceInitFunc) gst_video_balance_colorbalance_init,
NULL,
NULL,
};
g_type_add_interface_static (video_balance_type,
GST_TYPE_IMPLEMENTS_INTERFACE, &iface_info);
g_type_add_interface_static (video_balance_type, GST_TYPE_COLOR_BALANCE,
&colorbalance_info);
}
GST_BOILERPLATE_FULL (GstVideoBalance, gst_video_balance, GstVideoFilter,
GST_TYPE_VIDEO_FILTER, _do_init);
/* /*
* look-up tables (LUT). * look-up tables (LUT).
*/ */
static void static void
gst_video_balance_update_tables_planar411 (GstVideoBalance * vb) gst_video_balance_update_tables (GstVideoBalance * vb)
{ {
gint i, j; gint i, j;
gdouble y, u, v, hue_cos, hue_sin; gdouble y, u, v, hue_cos, hue_sin;
@ -106,8 +139,6 @@ gst_video_balance_update_tables_planar411 (GstVideoBalance * vb)
vb->tabley[i] = rint (y); vb->tabley[i] = rint (y);
} }
/* FIXME this is a bogus transformation for hue, but you get
* the idea */
hue_cos = cos (M_PI * vb->hue); hue_cos = cos (M_PI * vb->hue);
hue_sin = sin (M_PI * vb->hue); hue_sin = sin (M_PI * vb->hue);
@ -142,11 +173,13 @@ gst_video_balance_is_passthrough (GstVideoBalance * videobalance)
static void static void
gst_video_balance_update_properties (GstVideoBalance * videobalance) gst_video_balance_update_properties (GstVideoBalance * videobalance)
{ {
videobalance->passthru = gst_video_balance_is_passthrough (videobalance); gboolean passthrough = gst_video_balance_is_passthrough (videobalance);
if (!videobalance->passthru) { gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (videobalance),
gst_video_balance_update_tables_planar411 (videobalance); passthrough);
}
if (!passthrough)
gst_video_balance_update_tables (videobalance);
} }
/* Useful macros */ /* Useful macros */
@ -163,7 +196,7 @@ static void
gst_video_balance_planar411_ip (GstVideoBalance * videobalance, guint8 * data, gst_video_balance_planar411_ip (GstVideoBalance * videobalance, guint8 * data,
gint width, gint height) gint width, gint height)
{ {
int x, y; gint x, y;
guint8 *ydata; guint8 *ydata;
guint8 *udata, *vdata; guint8 *udata, *vdata;
gint ystride, ustride, vstride; gint ystride, ustride, vstride;
@ -212,23 +245,22 @@ static gboolean
gst_video_balance_set_caps (GstBaseTransform * base, GstCaps * incaps, gst_video_balance_set_caps (GstBaseTransform * base, GstCaps * incaps,
GstCaps * outcaps) GstCaps * outcaps)
{ {
GstVideoBalance *this; GstVideoBalance *videobalance = GST_VIDEO_BALANCE (base);
GstStructure *structure; GstStructure *structure;
gboolean res; gboolean res;
this = GST_VIDEO_BALANCE (base); GST_DEBUG_OBJECT (videobalance,
"in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, incaps, outcaps);
GST_DEBUG_OBJECT (this,
"set_caps: in %" GST_PTR_FORMAT " out %" GST_PTR_FORMAT, incaps, outcaps);
structure = gst_caps_get_structure (incaps, 0); structure = gst_caps_get_structure (incaps, 0);
res = gst_structure_get_int (structure, "width", &this->width); res = gst_structure_get_int (structure, "width", &videobalance->width);
res &= gst_structure_get_int (structure, "height", &this->height); res &= gst_structure_get_int (structure, "height", &videobalance->height);
if (!res) if (!res)
goto done; goto done;
this->size = GST_VIDEO_I420_SIZE (this->width, this->height); videobalance->size =
GST_VIDEO_I420_SIZE (videobalance->width, videobalance->height);
done: done:
return res; return res;
@ -237,14 +269,12 @@ done:
static GstFlowReturn static GstFlowReturn
gst_video_balance_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) gst_video_balance_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
{ {
GstVideoBalance *videobalance; GstVideoBalance *videobalance = GST_VIDEO_BALANCE (base);
guint8 *data; guint8 *data;
guint size; guint size;
videobalance = GST_VIDEO_BALANCE (base);
/* if no change is needed, we are done */ /* if no change is needed, we are done */
if (videobalance->passthru) if (base->passthrough)
goto done; goto done;
data = GST_BUFFER_DATA (outbuf); data = GST_BUFFER_DATA (outbuf);
@ -269,17 +299,6 @@ wrong_size:
} }
} }
/****************
* Boilerplate
*/
static GstVideoFilterClass *parent_class = NULL;
static void gst_video_balance_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_video_balance_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
static void static void
gst_video_balance_base_init (gpointer g_class) gst_video_balance_base_init (gpointer g_class)
{ {
@ -300,11 +319,9 @@ static void
gst_video_balance_finalize (GObject * object) gst_video_balance_finalize (GObject * object)
{ {
GList *channels = NULL; GList *channels = NULL;
GstVideoBalance *balance; GstVideoBalance *balance = GST_VIDEO_BALANCE (object);
gint i; gint i;
balance = GST_VIDEO_BALANCE (object);
if (balance->tableu) { if (balance->tableu) {
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
g_free (balance->tableu[i]); g_free (balance->tableu[i]);
@ -340,33 +357,28 @@ gst_video_balance_finalize (GObject * object)
} }
static void static void
gst_video_balance_class_init (gpointer g_class, gpointer class_data) gst_video_balance_class_init (GstVideoBalanceClass * klass)
{ {
GObjectClass *gobject_class; GObjectClass *gobject_class = (GObjectClass *) klass;
GstBaseTransformClass *trans_class; GstBaseTransformClass *trans_class = (GstBaseTransformClass *) klass;
gobject_class = G_OBJECT_CLASS (g_class);
trans_class = GST_BASE_TRANSFORM_CLASS (g_class);
parent_class = g_type_class_peek_parent (g_class);
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_video_balance_finalize);
gobject_class->set_property = gst_video_balance_set_property; gobject_class->set_property = gst_video_balance_set_property;
gobject_class->get_property = gst_video_balance_get_property; gobject_class->get_property = gst_video_balance_get_property;
g_object_class_install_property (gobject_class, PROP_CONTRAST, g_object_class_install_property (gobject_class, PROP_CONTRAST,
g_param_spec_double ("contrast", "Contrast", "contrast", g_param_spec_double ("contrast", "Contrast", "contrast",
0.0, 2.0, DEFAULT_PROP_CONTRAST, G_PARAM_READWRITE)); 0.0, 2.0, DEFAULT_PROP_CONTRAST,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_BRIGHTNESS, g_object_class_install_property (gobject_class, PROP_BRIGHTNESS,
g_param_spec_double ("brightness", "Brightness", "brightness", g_param_spec_double ("brightness", "Brightness", "brightness", -1.0, 1.0,
-1.0, 1.0, DEFAULT_PROP_BRIGHTNESS, G_PARAM_READWRITE)); DEFAULT_PROP_BRIGHTNESS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_HUE, g_object_class_install_property (gobject_class, PROP_HUE,
g_param_spec_double ("hue", "Hue", "hue", g_param_spec_double ("hue", "Hue", "hue", -1.0, 1.0, DEFAULT_PROP_HUE,
-1.0, 1.0, DEFAULT_PROP_HUE, G_PARAM_READWRITE)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_SATURATION, g_object_class_install_property (gobject_class, PROP_SATURATION,
g_param_spec_double ("saturation", "Saturation", "saturation", g_param_spec_double ("saturation", "Saturation", "saturation", 0.0, 2.0,
0.0, 2.0, DEFAULT_PROP_SATURATION, G_PARAM_READWRITE)); DEFAULT_PROP_SATURATION, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_video_balance_finalize);
trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_balance_set_caps); trans_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_balance_set_caps);
trans_class->transform_ip = trans_class->transform_ip =
@ -374,24 +386,20 @@ gst_video_balance_class_init (gpointer g_class, gpointer class_data)
} }
static void static void
gst_video_balance_init (GTypeInstance * instance, gpointer g_class) gst_video_balance_init (GstVideoBalance * videobalance,
GstVideoBalanceClass * klass)
{ {
GstVideoBalance *videobalance = GST_VIDEO_BALANCE (instance); const gchar *channels[4] = { "HUE", "SATURATION",
const char *channels[4] = { "HUE", "SATURATION",
"BRIGHTNESS", "CONTRAST" "BRIGHTNESS", "CONTRAST"
}; };
gint i; gint i;
GST_DEBUG ("gst_video_balance_init"); /* Initialize propertiews */
/* do stuff */
videobalance->contrast = DEFAULT_PROP_CONTRAST; videobalance->contrast = DEFAULT_PROP_CONTRAST;
videobalance->brightness = DEFAULT_PROP_BRIGHTNESS; videobalance->brightness = DEFAULT_PROP_BRIGHTNESS;
videobalance->hue = DEFAULT_PROP_HUE; videobalance->hue = DEFAULT_PROP_HUE;
videobalance->saturation = DEFAULT_PROP_SATURATION; videobalance->saturation = DEFAULT_PROP_SATURATION;
gst_video_balance_update_properties (videobalance);
videobalance->tabley = g_new (guint8, 256); videobalance->tabley = g_new (guint8, 256);
videobalance->tableu = g_new (guint8 *, 256); videobalance->tableu = g_new (guint8 *, 256);
videobalance->tablev = g_new (guint8 *, 256); videobalance->tablev = g_new (guint8 *, 256);
@ -400,8 +408,10 @@ gst_video_balance_init (GTypeInstance * instance, gpointer g_class)
videobalance->tablev[i] = g_new (guint8, 256); videobalance->tablev[i] = g_new (guint8, 256);
} }
gst_video_balance_update_properties (videobalance);
/* Generate the channels list */ /* Generate the channels list */
for (i = 0; i < (sizeof (channels) / sizeof (char *)); i++) { for (i = 0; i < G_N_ELEMENTS (channels); i++) {
GstColorBalanceChannel *channel; GstColorBalanceChannel *channel;
channel = g_object_new (GST_TYPE_COLOR_BALANCE_CHANNEL, NULL); channel = g_object_new (GST_TYPE_COLOR_BALANCE_CHANNEL, NULL);
@ -411,7 +421,6 @@ gst_video_balance_init (GTypeInstance * instance, gpointer g_class)
videobalance->channels = g_list_append (videobalance->channels, channel); videobalance->channels = g_list_append (videobalance->channels, channel);
} }
} }
static gboolean static gboolean
@ -444,6 +453,8 @@ gst_video_balance_colorbalance_set_value (GstColorBalance * balance,
GstColorBalanceChannel * channel, gint value) GstColorBalanceChannel * channel, gint value)
{ {
GstVideoBalance *vb = GST_VIDEO_BALANCE (balance); GstVideoBalance *vb = GST_VIDEO_BALANCE (balance);
gdouble new_val;
gboolean changed;
g_return_if_fail (vb != NULL); g_return_if_fail (vb != NULL);
g_return_if_fail (GST_IS_VIDEO_BALANCE (vb)); g_return_if_fail (GST_IS_VIDEO_BALANCE (vb));
@ -451,16 +462,27 @@ gst_video_balance_colorbalance_set_value (GstColorBalance * balance,
g_return_if_fail (channel->label != NULL); g_return_if_fail (channel->label != NULL);
if (!g_ascii_strcasecmp (channel->label, "HUE")) { if (!g_ascii_strcasecmp (channel->label, "HUE")) {
vb->hue = (value + 1000.0) * 2.0 / 2000.0 - 1.0; new_val = (value + 1000.0) * 2.0 / 2000.0 - 1.0;
changed = new_val != vb->hue;
vb->hue = new_val;
} else if (!g_ascii_strcasecmp (channel->label, "SATURATION")) { } else if (!g_ascii_strcasecmp (channel->label, "SATURATION")) {
vb->saturation = (value + 1000.0) * 2.0 / 2000.0; new_val = (value + 1000.0) * 2.0 / 2000.0;
changed = new_val != vb->saturation;
vb->saturation = new_val;
} else if (!g_ascii_strcasecmp (channel->label, "BRIGHTNESS")) { } else if (!g_ascii_strcasecmp (channel->label, "BRIGHTNESS")) {
vb->brightness = (value + 1000.0) * 2.0 / 2000.0 - 1.0; new_val = (value + 1000.0) * 2.0 / 2000.0 - 1.0;
changed = new_val != vb->brightness;
vb->brightness = new_val;
} else if (!g_ascii_strcasecmp (channel->label, "CONTRAST")) { } else if (!g_ascii_strcasecmp (channel->label, "CONTRAST")) {
vb->contrast = (value + 1000.0) * 2.0 / 2000.0; new_val = (value + 1000.0) * 2.0 / 2000.0;
changed = new_val != vb->contrast;
vb->contrast = new_val;
} }
gst_video_balance_update_properties (vb); gst_video_balance_update_properties (vb);
gst_color_balance_value_changed (balance, channel,
gst_color_balance_get_value (balance, channel));
} }
static gint static gint
@ -500,96 +522,63 @@ static void
gst_video_balance_set_property (GObject * object, guint prop_id, gst_video_balance_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec) const GValue * value, GParamSpec * pspec)
{ {
GstVideoBalance *src; GstVideoBalance *balance = GST_VIDEO_BALANCE (object);
gdouble d;
src = GST_VIDEO_BALANCE (object);
GST_DEBUG ("gst_video_balance_set_property");
switch (prop_id) { switch (prop_id) {
case PROP_CONTRAST: case PROP_CONTRAST:
src->contrast = g_value_get_double (value); d = g_value_get_double (value);
GST_DEBUG_OBJECT (balance, "Changing contrast from %lf to %lf",
balance->contrast, d);
balance->contrast = d;
break; break;
case PROP_BRIGHTNESS: case PROP_BRIGHTNESS:
src->brightness = g_value_get_double (value); d = g_value_get_double (value);
GST_DEBUG_OBJECT (balance, "Changing brightness from %lf to %lf",
balance->brightness, d);
balance->brightness = d;
break; break;
case PROP_HUE: case PROP_HUE:
src->hue = g_value_get_double (value); d = g_value_get_double (value);
GST_DEBUG_OBJECT (balance, "Changing hue from %lf to %lf", balance->hue,
d);
balance->hue = d;
break; break;
case PROP_SATURATION: case PROP_SATURATION:
src->saturation = g_value_get_double (value); d = g_value_get_double (value);
GST_DEBUG_OBJECT (balance, "Changing saturation from %lf to %lf",
balance->saturation, d);
balance->saturation = d;
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
} }
gst_video_balance_update_properties (src); gst_video_balance_update_properties (balance);
} }
static void static void
gst_video_balance_get_property (GObject * object, guint prop_id, GValue * value, gst_video_balance_get_property (GObject * object, guint prop_id, GValue * value,
GParamSpec * pspec) GParamSpec * pspec)
{ {
GstVideoBalance *src; GstVideoBalance *balance = GST_VIDEO_BALANCE (object);
src = GST_VIDEO_BALANCE (object);
switch (prop_id) { switch (prop_id) {
case PROP_CONTRAST: case PROP_CONTRAST:
g_value_set_double (value, src->contrast); g_value_set_double (value, balance->contrast);
break; break;
case PROP_BRIGHTNESS: case PROP_BRIGHTNESS:
g_value_set_double (value, src->brightness); g_value_set_double (value, balance->brightness);
break; break;
case PROP_HUE: case PROP_HUE:
g_value_set_double (value, src->hue); g_value_set_double (value, balance->hue);
break; break;
case PROP_SATURATION: case PROP_SATURATION:
g_value_set_double (value, src->saturation); g_value_set_double (value, balance->saturation);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
} }
} }
GType
gst_video_balance_get_type (void)
{
static GType video_balance_type = 0;
if (!video_balance_type) {
static const GTypeInfo video_balance_info = {
sizeof (GstVideoBalanceClass),
gst_video_balance_base_init,
NULL,
gst_video_balance_class_init,
NULL,
NULL,
sizeof (GstVideoBalance),
0,
gst_video_balance_init,
};
static const GInterfaceInfo iface_info = {
(GInterfaceInitFunc) gst_video_balance_interface_init,
NULL,
NULL,
};
static const GInterfaceInfo colorbalance_info = {
(GInterfaceInitFunc) gst_video_balance_colorbalance_init,
NULL,
NULL,
};
video_balance_type = g_type_register_static (GST_TYPE_VIDEO_FILTER,
"GstVideoBalance", &video_balance_info, 0);
g_type_add_interface_static (video_balance_type,
GST_TYPE_IMPLEMENTS_INTERFACE, &iface_info);
g_type_add_interface_static (video_balance_type, GST_TYPE_COLOR_BALANCE,
&colorbalance_info);
}
return video_balance_type;
}

View file

@ -56,8 +56,6 @@ struct _GstVideoBalance {
gdouble hue; gdouble hue;
gdouble saturation; gdouble saturation;
gboolean passthru;
/* format */ /* format */
gint width; gint width;
gint height; gint height;