Beispiel #1
0
static GstPad *
kms_hub_port_request_new_pad (GstElement * element,
    GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
{
  GstElement *output = NULL;

  if (templ ==
      gst_element_class_get_pad_template (GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS
              (element)), HUB_AUDIO_SINK_PAD)) {

    if (g_strcmp0 (name, HUB_AUDIO_SINK_PAD) != 0) {
      GST_ERROR_OBJECT (element,
          "Invalid pad name %s for template %" GST_PTR_FORMAT, name, templ);
      return NULL;
    }

    output = kms_element_get_audio_agnosticbin (KMS_ELEMENT (element));
  }
  else if (templ ==
      gst_element_class_get_pad_template (GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS
              (element)), HUB_VIDEO_SINK_PAD)) {
    if (g_strcmp0 (name, HUB_VIDEO_SINK_PAD) != 0) {
      GST_ERROR_OBJECT (element,
          "Invalid pad name %s for template %" GST_PTR_FORMAT, name, templ);
      return NULL;
    }

    output = kms_element_get_video_agnosticbin (KMS_ELEMENT (element));
  }
  else if (templ ==
      gst_element_class_get_pad_template (GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS
              (element)), HUB_DATA_SINK_PAD)) {
    if (g_strcmp0 (name, HUB_DATA_SINK_PAD) != 0) {
      GST_ERROR_OBJECT (element,
          "Invalid pad name %s for template %" GST_PTR_FORMAT, name, templ);
      return NULL;
    }

    output = kms_element_get_data_tee (KMS_ELEMENT (element));
  }

  if (output == NULL) {
    GST_WARNING_OBJECT (element, "No agnosticbin got for template %"
        GST_PTR_FORMAT, templ);
    return NULL;
  } else {
    return kms_hub_port_generate_sink_pad (element, templ, name, caps, output);
  }
}
static void
kms_show_data_init (KmsShowData *self)
{
  self->priv = KMS_SHOW_DATA_GET_PRIVATE (self);

  self->priv->text_overlay = gst_element_factory_make ("textoverlay", NULL);
  g_object_set (self->priv->text_overlay, "font-desc", "Sans 26", NULL);
  gst_bin_add (GST_BIN (self), self->priv->text_overlay);

  kms_show_data_connect_video (self, kms_element_get_video_agnosticbin (KMS_ELEMENT (self)));
  kms_show_data_connect_audio (self, kms_element_get_audio_agnosticbin (KMS_ELEMENT (self)));
  kms_show_data_connect_data (self, kms_element_get_data_tee (KMS_ELEMENT (self)));

  gst_element_sync_state_with_parent (self->priv->text_overlay);
}
static void
kms_send_data_init (KmsSendData * self)
{
  self->priv = KMS_SEND_DATA_GET_PRIVATE (self);

  self->priv->zbar = gst_element_factory_make ("zbar", NULL);

  gst_bin_add (GST_BIN (self), self->priv->zbar);

  g_object_set (G_OBJECT (self->priv->zbar), "qos", FALSE, NULL);

  kms_send_data_connect_video (self,
      kms_element_get_video_agnosticbin (KMS_ELEMENT (self)));
  kms_send_data_connect_audio (self,
      kms_element_get_audio_agnosticbin (KMS_ELEMENT (self)));
  kms_send_data_connect_data (self,
      kms_element_get_data_tee (KMS_ELEMENT (self)));

  gst_element_sync_state_with_parent (self->priv->zbar);
}
static GstPad *
kms_mixer_endpoint_request_new_pad (GstElement * element,
    GstPadTemplate * templ, const gchar * name, const GstCaps * caps)
{
  GstElement *agnosticbin = NULL;

  if (templ ==
      gst_element_class_get_pad_template (GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS
              (element)), MIXER_AUDIO_SINK_PAD)) {

    if (g_strcmp0 (name, MIXER_AUDIO_SINK_PAD) != 0) {
      GST_ERROR_OBJECT (element,
          "Invalid pad name %s for template %" GST_PTR_FORMAT, name, templ);
      return NULL;
    }

    agnosticbin = kms_element_get_audio_agnosticbin (KMS_ELEMENT (element));
  } else if (templ ==
      gst_element_class_get_pad_template (GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS
              (element)), MIXER_VIDEO_SINK_PAD)) {
    if (g_strcmp0 (name, MIXER_VIDEO_SINK_PAD) != 0) {
      GST_ERROR_OBJECT (element,
          "Invalid pad name %s for template %" GST_PTR_FORMAT, name, templ);
      return NULL;
    }

    agnosticbin = kms_element_get_video_agnosticbin (KMS_ELEMENT (element));
  }

  if (agnosticbin != NULL)
    return kms_mixer_endpoint_generate_sink_pad (element, templ, name, caps,
        agnosticbin);

  return
      GST_ELEMENT_CLASS (kms_mixer_end_point_parent_class)->request_new_pad
      (element, templ, name, caps);
}
static void
pad_added (GstElement * element, GstPad * pad, KmsPlayerEndPoint * self)
{
  GST_DEBUG ("Pad added");
  GstElement *appsrc, *agnosticbin, *appsink;
  GstPad *sinkpad;
  GstCaps *audio_caps, *video_caps;
  GstCaps *src_caps;

  /* Create and link appsrc--agnosticbin with proper caps */
  audio_caps = gst_caps_from_string (KMS_AGNOSTIC_AUDIO_CAPS);
  video_caps = gst_caps_from_string (KMS_AGNOSTIC_VIDEO_CAPS);
  src_caps = gst_pad_query_caps (pad, NULL);
  GST_TRACE ("caps are %" GST_PTR_FORMAT, src_caps);

  if (gst_caps_can_intersect (audio_caps, src_caps))
    agnosticbin = kms_element_get_audio_agnosticbin (KMS_ELEMENT (self));
  else if (gst_caps_can_intersect (video_caps, src_caps))
    agnosticbin = kms_element_get_video_agnosticbin (KMS_ELEMENT (self));
  else {
    GST_ELEMENT_WARNING (self, CORE, CAPS,
        ("Unsupported media received: %" GST_PTR_FORMAT, src_caps),
        ("Unsupported media received: %" GST_PTR_FORMAT, src_caps));
    goto end;
  }

  /* Create appsrc element and link to agnosticbin */
  appsrc = gst_element_factory_make ("appsrc", NULL);
  g_object_set (G_OBJECT (appsrc), "is-live", FALSE, "do-timestamp", FALSE,
      "min-latency", G_GUINT64_CONSTANT (0),
      "max-latency", G_GUINT64_CONSTANT (0), "format", GST_FORMAT_TIME,
      "caps", src_caps, NULL);

  gst_bin_add (GST_BIN (self), appsrc);
  gst_element_sync_state_with_parent (appsrc);
  if (!gst_element_link (appsrc, agnosticbin)) {
    GST_ERROR ("Could not link %s to element %s", GST_ELEMENT_NAME (appsrc),
        GST_ELEMENT_NAME (agnosticbin));
  }

  /* Create appsink and link to pad */
  appsink = gst_element_factory_make ("appsink", NULL);
  g_object_set (appsink, "sync", TRUE, "enable-last-sample",
      FALSE, "emit-signals", TRUE, NULL);
  gst_bin_add (GST_BIN (self->priv->pipeline), appsink);
  gst_element_sync_state_with_parent (appsink);

  sinkpad = gst_element_get_static_pad (appsink, "sink");
  gst_pad_link (pad, sinkpad);
  GST_DEBUG_OBJECT (self, "Linked %s---%s", GST_ELEMENT_NAME (element),
      GST_ELEMENT_NAME (appsink));
  g_object_unref (sinkpad);

  g_object_set_data (G_OBJECT (pad), APPSRC_DATA, appsrc);
  g_object_set_data (G_OBJECT (pad), APPSINK_DATA, appsink);

  /* Connect new-sample signal to callback */
  g_signal_connect (appsink, "new-sample", G_CALLBACK (new_sample_cb), appsrc);
  g_signal_connect (appsink, "eos", G_CALLBACK (eos_cb), appsrc);

end:
  if (src_caps != NULL)
    gst_caps_unref (src_caps);

  if (audio_caps != NULL)
    gst_caps_unref (audio_caps);

  if (video_caps != NULL)
    gst_caps_unref (video_caps);
}
static GstPadProbeReturn
set_appsrc_caps (GstPad * pad, GstPadProbeInfo * info, gpointer httpep)
{
  KmsHttpPostEndpoint *self = KMS_HTTP_POST_ENDPOINT (httpep);
  GstEvent *event = GST_PAD_PROBE_INFO_EVENT (info);
  GstCaps *audio_caps = NULL, *video_caps = NULL;
  GstElement *appsrc, *appsink, *agnosticbin;
  GstCaps *caps;
  gpointer data;

  if (GST_EVENT_TYPE (event) != GST_EVENT_CAPS) {
    return GST_PAD_PROBE_OK;
  }

  gst_event_parse_caps (event, &caps);
  if (caps == NULL) {
    GST_ERROR_OBJECT (pad, "Invalid caps received");
    return GST_PAD_PROBE_OK;
  }

  GST_TRACE ("caps are %" GST_PTR_FORMAT, caps);

  data = g_object_get_qdata (G_OBJECT (pad), appsrc_data_quark ());
  if (data != NULL) {
    goto end;
  }

  /* Get the proper agnosticbin */
  audio_caps = gst_caps_from_string (KMS_AGNOSTIC_AUDIO_CAPS);
  video_caps = gst_caps_from_string (KMS_AGNOSTIC_VIDEO_CAPS);

  if (gst_caps_can_intersect (audio_caps, caps))
    agnosticbin = kms_element_get_audio_agnosticbin (KMS_ELEMENT (self));
  else if (gst_caps_can_intersect (video_caps, caps))
    agnosticbin = kms_element_get_video_agnosticbin (KMS_ELEMENT (self));
  else {
    GST_ELEMENT_WARNING (self, CORE, CAPS,
        ("Unsupported media received: %" GST_PTR_FORMAT, caps),
        ("Unsupported media received: %" GST_PTR_FORMAT, caps));
    goto end;
  }

  /* Create appsrc element and link to agnosticbin */
  appsrc = gst_element_factory_make ("appsrc", NULL);
  g_object_set (G_OBJECT (appsrc), "is-live", TRUE, "do-timestamp", FALSE,
      "min-latency", G_GUINT64_CONSTANT (0),
      "max-latency", G_GUINT64_CONSTANT (0), "format", GST_FORMAT_TIME,
      "caps", caps, NULL);

  gst_bin_add (GST_BIN (self), appsrc);
  if (!gst_element_link (appsrc, agnosticbin)) {
    GST_ERROR ("Could not link %s to element %s", GST_ELEMENT_NAME (appsrc),
        GST_ELEMENT_NAME (agnosticbin));
  }

  /* Connect new-sample signal to callback */
  appsink = gst_pad_get_parent_element (pad);
  g_signal_connect (appsink, "new-sample", G_CALLBACK (new_sample_post_handler),
      appsrc);
  g_object_unref (appsink);

  g_object_set_qdata (G_OBJECT (pad), appsrc_data_quark (), appsrc);
  gst_element_sync_state_with_parent (appsrc);

end:
  if (audio_caps != NULL)
    gst_caps_unref (audio_caps);

  if (video_caps != NULL)
    gst_caps_unref (video_caps);

  return GST_PAD_PROBE_OK;
}
Beispiel #7
0
static void
kms_filter_element_set_filter (KmsFilterElement * self, GstElement * filter)
{
  GstPad *sink = NULL, *src = NULL;
  GstCaps *audio_caps = NULL, *video_caps = NULL;
  GstCaps *sink_caps = NULL, *src_caps = NULL;

  if (self->priv->filter != NULL) {
    GST_WARNING_OBJECT (self, "Factory changes are not currently allowed");
    g_object_unref (filter);
    return;
  }

  if (filter == NULL) {
    filter = gst_element_factory_make (self->priv->filter_factory, NULL);
  } else {
    GstElementFactory *factory = gst_element_get_factory (filter);

    if (factory == NULL) {
      GST_WARNING_OBJECT (self,
          "Cannot get filter factory from given filter %" GST_PTR_FORMAT,
          filter);
      return;
    }

    self->priv->filter_factory = g_strdup (GST_OBJECT_NAME (factory));
  }

  if (filter == NULL) {
    GST_ERROR_OBJECT (self, "Invalid factory \"%s\", element cannot be created",
        self->priv->filter_factory);
    return;
  }

  sink = gst_element_get_static_pad (filter, "sink");
  src = gst_element_get_static_pad (filter, "src");

  if (sink == NULL || src == NULL) {
    GST_ERROR_OBJECT (self, "Invalid factory \"%s\", unexpected pad templates",
        self->priv->filter_factory);
    g_object_unref (filter);
    goto end;
  }

  audio_caps = gst_caps_from_string (KMS_AGNOSTIC_AUDIO_CAPS);
  video_caps = gst_caps_from_string (KMS_AGNOSTIC_VIDEO_CAPS);

  sink_caps = gst_pad_query_caps (sink, NULL);
  src_caps = gst_pad_query_caps (src, NULL);

  KMS_FILTER_ELEMENT_LOCK (self);

  if (self->priv->filter_type == KMS_FILTER_TYPE_AUTODETECT) {
    if (gst_caps_can_intersect (audio_caps, sink_caps) &&
        gst_caps_can_intersect (audio_caps, src_caps)) {
      GST_DEBUG_OBJECT (self, "Connecting filter to audio");
      self->priv->filter_type = KMS_FILTER_TYPE_AUDIO;

    } else if (gst_caps_can_intersect (video_caps, sink_caps)
        && gst_caps_can_intersect (video_caps, src_caps)) {
      GST_DEBUG_OBJECT (self, "Connecting filter to video");
      self->priv->filter_type = KMS_FILTER_TYPE_VIDEO;

    } else {
      g_object_unref (filter);
      GST_ERROR_OBJECT (self, "Filter element cannot be connected");
      KMS_FILTER_ELEMENT_UNLOCK (self);
      goto end;
    }
  }

  if (self->priv->filter_type == KMS_FILTER_TYPE_VIDEO) {
    kms_filter_element_connect_filter (self, KMS_ELEMENT_PAD_TYPE_VIDEO, filter,
        sink, kms_element_get_video_agnosticbin (KMS_ELEMENT (self)));
    kms_filter_element_connect_passthrough (self, KMS_ELEMENT_PAD_TYPE_AUDIO,
        kms_element_get_audio_agnosticbin (KMS_ELEMENT (self)));
  } else if (self->priv->filter_type == KMS_FILTER_TYPE_AUDIO) {
    kms_filter_element_connect_filter (self, KMS_ELEMENT_PAD_TYPE_AUDIO, filter,
        sink, kms_element_get_audio_agnosticbin (KMS_ELEMENT (self)));
    kms_filter_element_connect_passthrough (self, KMS_ELEMENT_PAD_TYPE_VIDEO,
        kms_element_get_video_agnosticbin (KMS_ELEMENT (self)));
  } else {
    GST_WARNING_OBJECT (self, "No filter configured, working in passthrogh");
    kms_filter_element_connect_passthrough (self, KMS_ELEMENT_PAD_TYPE_VIDEO,
        kms_element_get_video_agnosticbin (KMS_ELEMENT (self)));
    kms_filter_element_connect_passthrough (self, KMS_ELEMENT_PAD_TYPE_AUDIO,
        kms_element_get_audio_agnosticbin (KMS_ELEMENT (self)));
  }

  /* Enable data pads */
  kms_filter_element_connect_passthrough (self, KMS_ELEMENT_PAD_TYPE_DATA,
      kms_element_get_data_tee (KMS_ELEMENT (self)));

  KMS_FILTER_ELEMENT_UNLOCK (self);

end:
  if (sink_caps != NULL)
    gst_caps_unref (sink_caps);

  if (src_caps != NULL)
    gst_caps_unref (src_caps);

  if (audio_caps != NULL)
    gst_caps_unref (audio_caps);

  if (video_caps != NULL)
    gst_caps_unref (video_caps);

  if (sink != NULL)
    g_object_unref (sink);

  if (src != NULL)
    g_object_unref (src);
}
Beispiel #8
0
static void
kms_dummy_src_set_property (GObject * object, guint property_id,
    const GValue * value, GParamSpec * pspec)
{
  KmsDummySrc *self = KMS_DUMMY_SRC (object);

  KMS_ELEMENT_LOCK (KMS_ELEMENT (self));
  switch (property_id) {
    case PROP_DATA:
      self->priv->data = g_value_get_boolean (value);

      if (self->priv->data && self->priv->dataappsrc == NULL) {
        GstElement *tee;
        GstCaps *caps;

        GST_DEBUG_OBJECT (self, "Creating data stream");
        tee = kms_element_get_data_tee (KMS_ELEMENT (self));
        caps = gst_caps_from_string (KMS_AGNOSTIC_DATA_CAPS);
        self->priv->dataappsrc = gst_element_factory_make ("appsrc", NULL);
        g_object_set (G_OBJECT (self->priv->dataappsrc), "is-live", TRUE,
            "caps", caps, "emit-signals", TRUE, "stream-type", 0,
            "format", GST_FORMAT_TIME, NULL);
        gst_caps_unref (caps);
        g_signal_connect (self->priv->dataappsrc, "need-data",
            G_CALLBACK (kms_dummy_src_feed_data_channel), self);
        gst_bin_add (GST_BIN (self), self->priv->dataappsrc);
        gst_element_link_pads (self->priv->dataappsrc, "src", tee, "sink");
        gst_element_sync_state_with_parent (self->priv->dataappsrc);
      }
      break;
    case PROP_AUDIO:
      self->priv->audio = g_value_get_boolean (value);

      if (self->priv->audio && self->priv->audioappsrc == NULL) {
        GstElement *agnosticbin;

        GST_DEBUG_OBJECT (self, "Creating audio stream");
        agnosticbin = kms_element_get_audio_agnosticbin (KMS_ELEMENT (self));

        self->priv->audioappsrc =
            gst_element_factory_make ("audiotestsrc", NULL);
        g_object_set (G_OBJECT (self->priv->audioappsrc), "is-live", TRUE,
            NULL);
        gst_bin_add (GST_BIN (self), self->priv->audioappsrc);
        gst_element_link_pads (self->priv->audioappsrc, "src", agnosticbin,
            "sink");
        gst_element_sync_state_with_parent (self->priv->audioappsrc);
      }
      break;
    case PROP_VIDEO:
      self->priv->video = g_value_get_boolean (value);

      if (self->priv->video && self->priv->videoappsrc == NULL) {
        GstElement *agnosticbin;

        GST_DEBUG_OBJECT (self, "Creating video stream");
        agnosticbin = kms_element_get_video_agnosticbin (KMS_ELEMENT (self));

        self->priv->videoappsrc =
            gst_element_factory_make ("videotestsrc", NULL);
        g_object_set (G_OBJECT (self->priv->videoappsrc), "is-live", TRUE,
            NULL);
        gst_bin_add (GST_BIN (self), self->priv->videoappsrc);
        gst_element_link_pads (self->priv->videoappsrc, "src", agnosticbin,
            "sink");
        gst_element_sync_state_with_parent (self->priv->videoappsrc);
      }
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
      break;
  }
  KMS_ELEMENT_UNLOCK (KMS_ELEMENT (self));
}