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);
}
Example #2
0
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;
}