videofilter: avoid holding object lock when calling basetransform function

This commit is contained in:
Mark Nauwelaerts 2012-03-26 18:22:53 +02:00
parent a34cbc7637
commit 1ed37c8229
2 changed files with 21 additions and 15 deletions

View File

@ -162,8 +162,8 @@ gst_gamma_set_property (GObject * object, guint prop_id, const GValue * value,
val); val);
GST_OBJECT_LOCK (gamma); GST_OBJECT_LOCK (gamma);
gamma->gamma = val; gamma->gamma = val;
gst_gamma_calculate_tables (gamma);
GST_OBJECT_UNLOCK (gamma); GST_OBJECT_UNLOCK (gamma);
gst_gamma_calculate_tables (gamma);
break; break;
} }
default: default:
@ -194,20 +194,23 @@ gst_gamma_calculate_tables (GstGamma * gamma)
gint n; gint n;
gdouble val; gdouble val;
gdouble exp; gdouble exp;
gboolean passthrough = FALSE;
GST_OBJECT_LOCK (gamma);
if (gamma->gamma == 1.0) { if (gamma->gamma == 1.0) {
gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (gamma), TRUE); passthrough = TRUE;
return; } else {
exp = 1.0 / gamma->gamma;
for (n = 0; n < 256; n++) {
val = n / 255.0;
val = pow (val, exp);
val = 255.0 * val;
gamma->gamma_table[n] = (guint8) floor (val + 0.5);
}
} }
gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (gamma), FALSE); GST_OBJECT_UNLOCK (gamma);
exp = 1.0 / gamma->gamma; gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (gamma), passthrough);
for (n = 0; n < 256; n++) {
val = n / 255.0;
val = pow (val, exp);
val = 255.0 * val;
gamma->gamma_table[n] = (guint8) floor (val + 0.5);
}
} }
static void static void

View File

@ -156,13 +156,16 @@ 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)
{ {
gboolean passthrough = gst_video_balance_is_passthrough (videobalance); gboolean passthrough;
GstBaseTransform *base = GST_BASE_TRANSFORM (videobalance); GstBaseTransform *base = GST_BASE_TRANSFORM (videobalance);
gst_base_transform_set_passthrough (base, passthrough); GST_OBJECT_LOCK (videobalance);
passthrough = gst_video_balance_is_passthrough (videobalance);
if (!passthrough) if (!passthrough)
gst_video_balance_update_tables (videobalance); gst_video_balance_update_tables (videobalance);
GST_OBJECT_UNLOCK (videobalance);
gst_base_transform_set_passthrough (base, passthrough);
} }
static void static void
@ -713,8 +716,8 @@ gst_video_balance_set_property (GObject * object, guint prop_id,
break; break;
} }
gst_video_balance_update_properties (balance);
GST_OBJECT_UNLOCK (balance); GST_OBJECT_UNLOCK (balance);
gst_video_balance_update_properties (balance);
if (label) { if (label) {
GstColorBalanceChannel *channel = GstColorBalanceChannel *channel =