static void kms_alpha_blending_port_data_destroy (KmsAlphaBlendingData * port_data) { KmsAlphaBlending *self = port_data->mixer; GstPad *audiosink; gchar *padname; KMS_ALPHA_BLENDING_LOCK (self); port_data->removing = TRUE; kms_base_hub_unlink_video_sink (KMS_BASE_HUB (self), port_data->id); kms_base_hub_unlink_audio_sink (KMS_BASE_HUB (self), port_data->id); if (port_data->input) { GstEvent *event; gboolean result; GstPad *pad; if (port_data->videorate == NULL) { KMS_ALPHA_BLENDING_UNLOCK (self); return; } pad = gst_element_get_static_pad (port_data->videorate, "sink"); if (pad == NULL) { KMS_ALPHA_BLENDING_UNLOCK (self); return; } if (!GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_FLAG_EOS)) { event = gst_event_new_eos (); result = gst_pad_send_event (pad, event); if (port_data->input && self->priv->n_elems > 0) { port_data->input = FALSE; self->priv->n_elems--; } if (!result) { GST_WARNING ("EOS event did not send"); } gst_element_unlink (port_data->videoconvert, port_data->videorate); g_object_unref (pad); KMS_ALPHA_BLENDING_UNLOCK (self); } else { gboolean remove = FALSE; /* EOS callback was triggered before we could remove the port data */ /* so we have to remove elements to avoid memory leaks. */ remove = port_data->eos_managed; gst_element_unlink (port_data->videoconvert, port_data->videorate); g_object_unref (pad); KMS_ALPHA_BLENDING_UNLOCK (self); if (remove) { /* Remove pipeline without helding the mutex */ kms_loop_idle_add_full (self->priv->loop, G_PRIORITY_DEFAULT, (GSourceFunc) remove_elements_from_pipeline, KMS_ALPHA_BLENDING_REF (port_data), (GDestroyNotify) kms_ref_struct_unref); } } } else { GstElement *videoconvert; videoconvert = g_object_ref (port_data->videoconvert); port_data->videoconvert = NULL; if (port_data->probe_id > 0) { gst_pad_remove_probe (port_data->video_mixer_pad, port_data->probe_id); } if (port_data->link_probe_id > 0) { gst_pad_remove_probe (port_data->videoconvert_sink_pad, port_data->link_probe_id); } KMS_ALPHA_BLENDING_UNLOCK (self); gst_bin_remove (GST_BIN (self), videoconvert); gst_element_set_state (videoconvert, GST_STATE_NULL); g_object_unref (videoconvert); } padname = g_strdup_printf (AUDIO_SINK_PAD, port_data->id); audiosink = gst_element_get_static_pad (self->priv->audiomixer, padname); gst_element_release_request_pad (self->priv->audiomixer, audiosink); gst_object_unref (audiosink); g_free (padname); KMS_ALPHA_BLENDING_UNREF (port_data); }
static void kms_composite_mixer_port_data_destroy (gpointer data) { KmsCompositeMixerData *port_data = (KmsCompositeMixerData *) data; KmsCompositeMixer *self = port_data->mixer; GstPad *audiosink; gchar *padname; KMS_COMPOSITE_MIXER_LOCK (self); port_data->removing = TRUE; kms_base_hub_unlink_video_sink (KMS_BASE_HUB (self), port_data->id); kms_base_hub_unlink_audio_sink (KMS_BASE_HUB (self), port_data->id); if (port_data->input) { GstEvent *event; gboolean result; GstPad *pad; if (port_data->capsfilter == NULL) { KMS_COMPOSITE_MIXER_UNLOCK (self); return; } pad = gst_element_get_static_pad (port_data->capsfilter, "sink"); if (pad == NULL) { KMS_COMPOSITE_MIXER_UNLOCK (self); return; } if (!GST_OBJECT_FLAG_IS_SET (pad, GST_PAD_FLAG_EOS)) { if (GST_PAD_IS_FLUSHING (pad)) { gst_pad_send_event (pad, gst_event_new_flush_stop (FALSE)); } event = gst_event_new_eos (); result = gst_pad_send_event (pad, event); if (port_data->input && self->priv->n_elems > 0) { port_data->input = FALSE; self->priv->n_elems--; kms_composite_mixer_recalculate_sizes (self); } KMS_COMPOSITE_MIXER_UNLOCK (self); if (!result) { GST_WARNING ("EOS event did not send"); } } else { gboolean remove = FALSE; /* EOS callback was triggered before we could remove the port data */ /* so we have to remove elements to avoid memory leaks. */ remove = port_data->eos_managed; KMS_COMPOSITE_MIXER_UNLOCK (self); if (remove) { /* Remove pipeline without helding the mutex */ kms_loop_idle_add_full (self->priv->loop, G_PRIORITY_DEFAULT, (GSourceFunc) remove_elements_from_pipeline, KMS_COMPOSITE_MIXER_REF (port_data), (GDestroyNotify) kms_ref_struct_unref); } } gst_element_unlink (port_data->capsfilter, port_data->tee); g_object_unref (pad); } else { if (port_data->probe_id > 0) { gst_pad_remove_probe (port_data->video_mixer_pad, port_data->probe_id); } if (port_data->latency_probe_id > 0) { gst_pad_remove_probe (port_data->video_mixer_pad, port_data->latency_probe_id); } if (port_data->link_probe_id > 0) { gst_pad_remove_probe (port_data->tee_sink_pad, port_data->link_probe_id); } KMS_COMPOSITE_MIXER_UNLOCK (self); gst_element_unlink (port_data->capsfilter, port_data->tee); gst_element_unlink (port_data->tee, port_data->fakesink); gst_bin_remove (GST_BIN (self), g_object_ref (port_data->capsfilter)); gst_element_set_state (port_data->capsfilter, GST_STATE_NULL); g_object_unref (port_data->capsfilter); port_data->capsfilter = NULL; gst_bin_remove (GST_BIN (self), g_object_ref (port_data->tee)); gst_element_set_state (port_data->tee, GST_STATE_NULL); g_object_unref (port_data->tee); port_data->tee = NULL; gst_bin_remove (GST_BIN (self), g_object_ref (port_data->fakesink)); gst_element_set_state (port_data->fakesink, GST_STATE_NULL); g_object_unref (port_data->fakesink); port_data->fakesink = NULL; } padname = g_strdup_printf (AUDIO_SINK_PAD, port_data->id); audiosink = gst_element_get_static_pad (self->priv->audiomixer, padname); gst_element_release_request_pad (self->priv->audiomixer, audiosink); gst_object_unref (audiosink); g_free (padname); }