static GstStateChangeReturn gst_deinterleave_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstDeinterleave *self = GST_DEINTERLEAVE (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_deinterleave_remove_pads (self); self->func = NULL; if (self->pending_events) { g_list_foreach (self->pending_events, (GFunc) gst_mini_object_unref, NULL); g_list_free (self->pending_events); self->pending_events = NULL; } break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_deinterleave_remove_pads (self); self->func = NULL; if (self->pending_events) { g_list_foreach (self->pending_events, (GFunc) gst_mini_object_unref, NULL); g_list_free (self->pending_events); self->pending_events = NULL; } break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; }
static gboolean gst_deinterleave_sink_activate_push (GstPad * pad, gboolean active) { GstDeinterleave *self = GST_DEINTERLEAVE (gst_pad_get_parent (pad)); /* Reset everything when the pad is deactivated */ if (!active) { gst_deinterleave_remove_pads (self); if (self->pos) { g_free (self->pos); self->pos = NULL; } self->channels = 0; self->width = 0; self->func = NULL; if (self->pending_events) { g_list_foreach (self->pending_events, (GFunc) gst_mini_object_unref, NULL); g_list_free (self->pending_events); self->pending_events = NULL; } } gst_object_unref (self); return TRUE; }