spectrum->interval = DEFAULT_INTERVAL;
spectrum->bands = DEFAULT_BANDS;
spectrum->threshold = DEFAULT_THRESHOLD;
+
+ g_mutex_init (&spectrum->lock);
}
static void
GstSpectrum *spectrum = GST_SPECTRUM (object);
gst_spectrum_reset_state (spectrum);
+ g_mutex_clear (&spectrum->lock);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
break;
case PROP_INTERVAL:{
guint64 interval = g_value_get_uint64 (value);
+ g_mutex_lock (&filter->lock);
if (filter->interval != interval) {
- GST_BASE_TRANSFORM_LOCK (filter);
filter->interval = interval;
gst_spectrum_reset_state (filter);
- GST_BASE_TRANSFORM_UNLOCK (filter);
}
- }
+ g_mutex_unlock (&filter->lock);
break;
+ }
case PROP_BANDS:{
guint bands = g_value_get_uint (value);
+ g_mutex_lock (&filter->lock);
if (filter->bands != bands) {
- GST_BASE_TRANSFORM_LOCK (filter);
filter->bands = bands;
gst_spectrum_reset_state (filter);
- GST_BASE_TRANSFORM_UNLOCK (filter);
}
- }
+ g_mutex_unlock (&filter->lock);
break;
+ }
case PROP_THRESHOLD:
filter->threshold = g_value_get_int (value);
break;
case PROP_MULTI_CHANNEL:{
gboolean multi_channel = g_value_get_boolean (value);
+ g_mutex_lock (&filter->lock);
if (filter->multi_channel != multi_channel) {
- GST_BASE_TRANSFORM_LOCK (filter);
filter->multi_channel = multi_channel;
gst_spectrum_reset_state (filter);
- GST_BASE_TRANSFORM_UNLOCK (filter);
}
- }
+ g_mutex_unlock (&filter->lock);
break;
+ }
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
gboolean multi_channel = spectrum->multi_channel;
GstSpectrumInputData input_data = NULL;
+ g_mutex_lock (&spectrum->lock);
switch (GST_AUDIO_INFO_FORMAT (info)) {
case GST_AUDIO_FORMAT_S16:
input_data =
spectrum->input_data = input_data;
gst_spectrum_reset_state (spectrum);
+ g_mutex_unlock (&spectrum->lock);
return TRUE;
}
GstSpectrumChannel *cd;
GstSpectrumInputData input_data;
+ g_mutex_lock (&spectrum->lock);
gst_buffer_map (buffer, &map, GST_MAP_READ);
data = map.data;
size = map.size;
spectrum->input_pos = input_pos;
gst_buffer_unmap (buffer, &map);
+ g_mutex_unlock (&spectrum->lock);
g_assert (size == 0);
#define gst_video_crop_parent_class parent_class
G_DEFINE_TYPE (GstVideoCrop, gst_video_crop, GST_TYPE_BASE_TRANSFORM);
+static void gst_video_crop_finalize (GObject * object);
+
static void gst_video_crop_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_video_crop_get_property (GObject * object, guint prop_id,
}
GST_OBJECT_UNLOCK (vcrop);
+
return GST_BASE_TRANSFORM_CLASS (parent_class)->src_event (trans,
(new_event ? new_event : event));
}
element_class = (GstElementClass *) klass;
basetransform_class = (GstBaseTransformClass *) klass;
- gst_element_class_set_details_simple (element_class, "Crop",
- "Filter/Effect/Video",
- "Crops video into a user-defined region",
- "Tim-Philipp Müller <tim centricular net>");
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
- gst_element_class_set_details_simple (element_class, "Crop",
- "Filter/Effect/Video",
- "Crops video into a user-defined region",
- "Tim-Philipp Müller <tim centricular net>");
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_template));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_template));
-
+ gobject_class->finalize = gst_video_crop_finalize;
gobject_class->set_property = gst_video_crop_set_property;
gobject_class->get_property = gst_video_crop_get_property;
g_param_spec_int ("bottom", "Bottom", "Pixels to crop at bottom",
0, G_MAXINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&sink_template));
+ gst_element_class_add_pad_template (element_class,
+ gst_static_pad_template_get (&src_template));
+ gst_element_class_set_details_simple (element_class, "Crop",
+ "Filter/Effect/Video",
+ "Crops video into a user-defined region",
+ "Tim-Philipp Müller <tim centricular net>");
+
basetransform_class->transform = GST_DEBUG_FUNCPTR (gst_video_crop_transform);
basetransform_class->transform_caps =
GST_DEBUG_FUNCPTR (gst_video_crop_transform_caps);
vcrop->crop_left = 0;
vcrop->crop_top = 0;
vcrop->crop_bottom = 0;
+
+ g_mutex_init (&vcrop->lock);
+}
+
+static void
+gst_video_crop_finalize (GObject * object)
+{
+ GstVideoCrop *vcrop;
+
+ vcrop = GST_VIDEO_CROP (object);
+
+ g_mutex_clear (&vcrop->lock);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
}
static gboolean
{
GstVideoCrop *vcrop = GST_VIDEO_CROP (trans);
+ g_mutex_lock (&vcrop->lock);
switch (vcrop->in.packing) {
case VIDEO_CROP_PIXEL_FORMAT_PACKED_SIMPLE:
gst_video_crop_transform_packed_simple (vcrop, inbuf, outbuf);
default:
g_assert_not_reached ();
}
+ g_mutex_unlock (&vcrop->lock);
return GST_FLOW_OK;
}
GST_LOG_OBJECT (crop, "incaps = %" GST_PTR_FORMAT ", outcaps = %"
GST_PTR_FORMAT, incaps, outcaps);
- if ((crop->crop_left | crop->crop_right | crop->crop_top | crop->
- crop_bottom) == 0) {
+ if ((crop->crop_left | crop->crop_right | crop->
+ crop_top | crop->crop_bottom) == 0) {
GST_LOG_OBJECT (crop, "we are using passthrough");
gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (crop), TRUE);
} else {
video_crop = GST_VIDEO_CROP (object);
/* don't modify while we are transforming */
- GST_BASE_TRANSFORM_LOCK (GST_BASE_TRANSFORM_CAST (video_crop));
+ g_mutex_lock (&video_crop->lock);
/* protect with the object lock so that we can read them */
GST_OBJECT_LOCK (video_crop);
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
- GST_OBJECT_UNLOCK (video_crop);
-
GST_LOG_OBJECT (video_crop, "l=%d,r=%d,b=%d,t=%d",
video_crop->crop_left, video_crop->crop_right, video_crop->crop_bottom,
video_crop->crop_top);
+ GST_OBJECT_UNLOCK (video_crop);
gst_base_transform_reconfigure (GST_BASE_TRANSFORM (video_crop));
- GST_BASE_TRANSFORM_UNLOCK (GST_BASE_TRANSFORM_CAST (video_crop));
+ g_mutex_unlock (&video_crop->lock);
}
static void
goto not_negotiated;
/* if no change is needed, we are done */
- if (GST_BASE_TRANSFORM (vfilter)->passthrough)
+ if (gst_base_transform_is_passthrough (GST_BASE_TRANSFORM (vfilter)))
goto done;
GST_OBJECT_LOCK (videobalance);
g_return_if_fail (GST_IS_VIDEO_FILTER (vb));
g_return_if_fail (channel->label != NULL);
- GST_BASE_TRANSFORM_LOCK (vb);
GST_OBJECT_LOCK (vb);
if (!g_ascii_strcasecmp (channel->label, "HUE")) {
new_val = (value + 1000.0) * 2.0 / 2000.0 - 1.0;
if (changed)
gst_video_balance_update_properties (vb);
GST_OBJECT_UNLOCK (vb);
- GST_BASE_TRANSFORM_UNLOCK (vb);
if (changed) {
gst_color_balance_value_changed (balance, channel,
gdouble d;
const gchar *label = NULL;
- GST_BASE_TRANSFORM_LOCK (balance);
GST_OBJECT_LOCK (balance);
switch (prop_id) {
case PROP_CONTRAST:
gst_video_balance_update_properties (balance);
GST_OBJECT_UNLOCK (balance);
- GST_BASE_TRANSFORM_UNLOCK (balance);
if (label) {
GstColorBalanceChannel *channel =