static GstStateChangeReturn gst_shape_wipe_change_state (GstElement * element, GstStateChange transition) { GstShapeWipe *self = GST_SHAPE_WIPE (element); GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: self->shutdown = FALSE; break; case GST_STATE_CHANGE_PAUSED_TO_READY: /* Unblock video sink chain function */ g_mutex_lock (&self->mask_mutex); self->shutdown = TRUE; g_cond_signal (&self->mask_cond); g_mutex_unlock (&self->mask_mutex); break; default: break; } if (GST_ELEMENT_CLASS (parent_class)->change_state) ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: gst_shape_wipe_reset (self); break; default: break; } return ret; }
static void gst_shape_wipe_init (GstShapeWipe * self) { self->video_sinkpad = gst_pad_new_from_static_template (&video_sink_pad_template, "video_sink"); gst_pad_set_chain_function (self->video_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_chain)); gst_pad_set_event_function (self->video_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_event)); gst_pad_set_query_function (self->video_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_video_sink_query)); gst_element_add_pad (GST_ELEMENT (self), self->video_sinkpad); self->mask_sinkpad = gst_pad_new_from_static_template (&mask_sink_pad_template, "mask_sink"); gst_pad_set_chain_function (self->mask_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_mask_sink_chain)); gst_pad_set_event_function (self->mask_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_mask_sink_event)); gst_pad_set_query_function (self->mask_sinkpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_mask_sink_query)); gst_element_add_pad (GST_ELEMENT (self), self->mask_sinkpad); self->srcpad = gst_pad_new_from_static_template (&src_pad_template, "src"); gst_pad_set_event_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_src_event)); gst_pad_set_query_function (self->srcpad, GST_DEBUG_FUNCPTR (gst_shape_wipe_src_query)); gst_element_add_pad (GST_ELEMENT (self), self->srcpad); g_mutex_init (&self->mask_mutex); g_cond_init (&self->mask_cond); gst_shape_wipe_reset (self); }
static void gst_shape_wipe_finalize (GObject * object) { GstShapeWipe *self = GST_SHAPE_WIPE (object); gst_shape_wipe_reset (self); g_cond_clear (&self->mask_cond); g_mutex_clear (&self->mask_mutex); G_OBJECT_CLASS (parent_class)->finalize (object); }
static void gst_shape_wipe_finalize (GObject * object) { GstShapeWipe *self = GST_SHAPE_WIPE (object); gst_shape_wipe_reset (self); if (self->mask_cond) g_cond_free (self->mask_cond); self->mask_cond = NULL; if (self->mask_mutex) g_mutex_free (self->mask_mutex); self->mask_mutex = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); }