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 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); }
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)); }