static void connect_sink_func (const gchar * key, KmsSinkPadData * data, KmsRecorderEndpoint * self) { MarkBufferProbeData *markdata; StreamE2EAvgStat *stat; KmsMediaType type; GstPad *sinkpad; gchar *id; if (gst_pad_is_linked (data->sink_target)) { /* Pad was not previously removed */ return; } sinkpad = kms_element_connect_sink_target_full (KMS_ELEMENT (self), data->sink_target, data->type, data->description, connect_pad_signals_cb, self); switch (data->type) { case KMS_ELEMENT_PAD_TYPE_AUDIO: type = KMS_MEDIA_TYPE_AUDIO; break; case KMS_ELEMENT_PAD_TYPE_VIDEO: type = KMS_MEDIA_TYPE_VIDEO; break; default: GST_DEBUG_OBJECT (self, "No e2e stats will be collected for pad type %u", data->type); return; } id = kms_stats_create_id_for_pad (GST_ELEMENT (self), sinkpad); stat = g_hash_table_lookup (self->priv->stats.avg_e2e, id); if (stat == NULL) { stat = kms_stats_stream_e2e_avg_stat_new (type); g_hash_table_insert (self->priv->stats.avg_e2e, g_strdup (id), stat); } markdata = mark_buffer_probe_data_new (); markdata->id = id; markdata->stat = kms_stats_stream_e2e_avg_stat_ref (stat); kms_stats_add_buffer_latency_notification_probe (sinkpad, add_mark_data_cb, TRUE /* lock the data */ , markdata, (GDestroyNotify) mark_buffer_probe_data_destroy); }
static gboolean kms_dummy_sink_request_new_sink_pad (KmsElement * obj, KmsElementPadType type, const gchar * description, const gchar * name) { KmsDummySink *self = KMS_DUMMY_SINK (obj); KmsDummySinkElement *dummy; GstElement *sink; GstPad *sinkpad; KMS_ELEMENT_LOCK (KMS_ELEMENT (self)); if (g_hash_table_contains (self->priv->sinks, name)) { KMS_ELEMENT_UNLOCK (KMS_ELEMENT (self)); return TRUE; } sink = gst_element_factory_make ("fakesink", NULL); g_object_set (sink, "async", FALSE, "sync", FALSE, NULL); dummy = create_dummy_sink_element (type, description, sink); if (!gst_bin_add (GST_BIN (self), sink)) { KMS_ELEMENT_UNLOCK (KMS_ELEMENT (self)); destroy_dummy_sink_element (dummy); return FALSE; } g_hash_table_insert (self->priv->sinks, g_strdup (name), dummy); KMS_ELEMENT_UNLOCK (KMS_ELEMENT (self)); gst_element_sync_state_with_parent (sink); sinkpad = gst_element_get_static_pad (sink, "sink"); kms_element_connect_sink_target_full (KMS_ELEMENT (self), sinkpad, type, description, NULL, NULL); g_object_unref (sinkpad); return TRUE; }