From 1ed37c8229f450008c591d442dba3f1e722969e9 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Mon, 26 Mar 2012 18:22:53 +0200 Subject: [PATCH] videofilter: avoid holding object lock when calling basetransform function --- gst/videofilter/gstgamma.c | 25 ++++++++++++++----------- gst/videofilter/gstvideobalance.c | 11 +++++++---- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/gst/videofilter/gstgamma.c b/gst/videofilter/gstgamma.c index f3d6198943..481f40452a 100644 --- a/gst/videofilter/gstgamma.c +++ b/gst/videofilter/gstgamma.c @@ -162,8 +162,8 @@ gst_gamma_set_property (GObject * object, guint prop_id, const GValue * value, val); GST_OBJECT_LOCK (gamma); gamma->gamma = val; - gst_gamma_calculate_tables (gamma); GST_OBJECT_UNLOCK (gamma); + gst_gamma_calculate_tables (gamma); break; } default: @@ -194,20 +194,23 @@ gst_gamma_calculate_tables (GstGamma * gamma) gint n; gdouble val; gdouble exp; + gboolean passthrough = FALSE; + GST_OBJECT_LOCK (gamma); if (gamma->gamma == 1.0) { - gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (gamma), TRUE); - return; + passthrough = TRUE; + } 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; - 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), passthrough); } static void diff --git a/gst/videofilter/gstvideobalance.c b/gst/videofilter/gstvideobalance.c index 12333789b0..aee281cceb 100644 --- a/gst/videofilter/gstvideobalance.c +++ b/gst/videofilter/gstvideobalance.c @@ -156,13 +156,16 @@ gst_video_balance_is_passthrough (GstVideoBalance * videobalance) static void gst_video_balance_update_properties (GstVideoBalance * videobalance) { - gboolean passthrough = gst_video_balance_is_passthrough (videobalance); + gboolean passthrough; 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) gst_video_balance_update_tables (videobalance); + GST_OBJECT_UNLOCK (videobalance); + + gst_base_transform_set_passthrough (base, passthrough); } static void @@ -713,8 +716,8 @@ gst_video_balance_set_property (GObject * object, guint prop_id, break; } - gst_video_balance_update_properties (balance); GST_OBJECT_UNLOCK (balance); + gst_video_balance_update_properties (balance); if (label) { GstColorBalanceChannel *channel =