Ejemplo n.º 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);
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
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);
}
Ejemplo n.º 5
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));
}