static GstBusSyncReply bus_sync_signal_handler (GstBus * bus, GstMessage * msg, gpointer data) { KmsPlayerEndPoint *self = KMS_PLAYER_END_POINT (data); if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS) { kms_loop_idle_add_full (self->priv->loop, G_PRIORITY_HIGH_IDLE, kms_player_end_point_emit_EOS_signal, g_object_ref (self), g_object_unref); } else if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { if (g_str_has_prefix (GST_OBJECT_NAME (msg->src), "decodebin")) { kms_loop_idle_add_full (self->priv->loop, G_PRIORITY_HIGH_IDLE, kms_player_end_point_emit_invalid_media_signal, g_object_ref (self), g_object_unref); } else if (g_strcmp0 (GST_OBJECT_NAME (msg->src), "source") == 0) { kms_loop_idle_add_full (self->priv->loop, G_PRIORITY_HIGH_IDLE, kms_player_end_point_emit_invalid_uri_signal, g_object_ref (self), g_object_unref); } else { kms_loop_idle_add_full (self->priv->loop, G_PRIORITY_HIGH_IDLE, kms_player_end_point_post_media_error, g_object_ref (self), g_object_unref); } } return GST_BUS_PASS; }
static GstPadProbeReturn stop_notification_cb (GstPad * srcpad, GstPadProbeInfo * info, gpointer user_data) { KmsRecorderEndpoint *recorder = KMS_RECORDER_ENDPOINT (user_data); if (GST_EVENT_TYPE (GST_PAD_PROBE_INFO_DATA (info)) != GST_EVENT_EOS) return GST_PAD_PROBE_OK; kms_loop_idle_add_full (recorder->priv->loop, G_PRIORITY_HIGH_IDLE, set_to_null_state_on_EOS, g_object_ref (recorder), g_object_unref); return GST_PAD_PROBE_OK; }
static GstBusSyncReply bus_sync_signal_handler (GstBus * bus, GstMessage * msg, gpointer data) { KmsRecorderEndPoint *self = KMS_RECORDER_END_POINT (data); if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { GError *err = NULL; gst_message_parse_error (msg, &err, NULL); GST_ERROR ("ERROR %s", err->message); g_object_set_data_full (G_OBJECT (self), "message", g_strdup (err->message), (GDestroyNotify) g_free); kms_loop_idle_add_full (self->priv->loop, G_PRIORITY_HIGH_IDLE, kms_recorder_end_point_post_error, g_object_ref (self), g_object_unref); g_error_free (err); } return GST_BUS_PASS; }
static GstBusSyncReply bus_sync_signal_handler (GstBus * bus, GstMessage * msg, gpointer data) { KmsRecorderEndpoint *self = KMS_RECORDER_ENDPOINT (data); if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) { ErrorData *data; GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (self), GST_DEBUG_GRAPH_SHOW_ALL, GST_ELEMENT_NAME (self)); kms_muxing_pipeline_dot_file (self->priv->mux); GST_ERROR_OBJECT (self, "Message %" GST_PTR_FORMAT, msg); data = create_error_data (self, msg); GST_ERROR_OBJECT (self, "Error: %" GST_PTR_FORMAT, msg); kms_loop_idle_add_full (self->priv->loop, G_PRIORITY_HIGH_IDLE, kms_recorder_endpoint_post_error, data, delete_error_data); } return GST_BUS_PASS; }
static GstPadProbeReturn cb_EOS_received (GstPad * pad, GstPadProbeInfo * info, KmsAlphaBlendingData * port_data) { KmsAlphaBlending *self = port_data->mixer; GstEvent *event; if (GST_EVENT_TYPE (GST_PAD_PROBE_INFO_EVENT (info)) != GST_EVENT_EOS) { return GST_PAD_PROBE_OK; } KMS_ALPHA_BLENDING_LOCK (self); if (!port_data->removing) { port_data->eos_managed = TRUE; KMS_ALPHA_BLENDING_UNLOCK (self); return GST_PAD_PROBE_OK; } if (port_data->probe_id > 0) { gst_pad_remove_probe (pad, port_data->probe_id); port_data->probe_id = 0; } KMS_ALPHA_BLENDING_UNLOCK (self); event = gst_event_new_eos (); gst_pad_send_event (pad, event); 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); return GST_PAD_PROBE_DROP; }
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); }
guint kms_loop_idle_add (KmsLoop * self, GSourceFunc function, gpointer data) { return kms_loop_idle_add_full (self, G_PRIORITY_DEFAULT_IDLE, function, data, NULL); }