static void kms_agnostic_bin2_init (KmsAgnosticBin2 * self) { GstPadTemplate *templ; GstElement *tee, *fakesink; GstPad *target, *sink; self->priv = KMS_AGNOSTIC_BIN2_GET_PRIVATE (self); tee = gst_element_factory_make ("tee", NULL); self->priv->input_tee = tee; fakesink = gst_element_factory_make ("fakesink", NULL); g_object_set (fakesink, "async", FALSE, "sync", FALSE, NULL); gst_bin_add_many (GST_BIN (self), tee, fakesink, NULL); gst_element_link_many (tee, fakesink, NULL); target = gst_element_get_static_pad (tee, "sink"); templ = gst_static_pad_template_get (&sink_factory); self->priv->sink = gst_ghost_pad_new_from_template ("sink", target, templ); gst_pad_set_query_function (self->priv->sink, kms_agnostic_bin2_sink_query); gst_pad_set_chain_function (self->priv->sink, kms_agnostic_bin2_sink_chain); gst_pad_set_chain_list_function (self->priv->sink, kms_agnostic_bin2_sink_chain_list); kms_utils_manage_gaps (self->priv->sink); g_object_unref (templ); g_object_unref (target); sink = gst_element_get_static_pad (fakesink, "sink"); gst_pad_add_probe (sink, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, kms_agnostic_bin2_sink_caps_probe, self, NULL); g_object_unref (sink); gst_element_add_pad (GST_ELEMENT (self), self->priv->sink); self->priv->started = FALSE; self->priv->remove_pool = g_thread_pool_new (remove_on_unlinked_async, NULL, -1, FALSE, NULL); self->priv->bins = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref); g_rec_mutex_init (&self->priv->thread_mutex); self->priv->min_bitrate = MIN_BITRATE_DEFAULT; self->priv->max_bitrate = MAX_BITRATE_DEFAULT; self->priv->bitrate_unlimited = FALSE; }
GstPad * kms_element_connect_sink_target_full (KmsElement * self, GstPad * target, KmsElementPadType type, const gchar * description) { GstPad *pad; gchar *pad_name; GstPadTemplate *templ; templ = gst_static_pad_template_get (&sink_factory); pad_name = get_pad_name (type, description); pad = gst_ghost_pad_new_from_template (pad_name, target, templ); g_free (pad_name); g_object_unref (templ); if (type == KMS_ELEMENT_PAD_TYPE_VIDEO) { kms_utils_drop_until_keyframe (pad, TRUE); kms_utils_manage_gaps (pad); } gst_pad_set_query_function (pad, kms_element_pad_query); gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | GST_PAD_PROBE_TYPE_EVENT_FLUSH, accept_eos_probe, self, NULL); g_signal_connect (G_OBJECT (pad), "unlinked", G_CALLBACK (send_flush_on_unlink), NULL); if (GST_STATE (self) >= GST_STATE_PAUSED || GST_STATE_PENDING (self) >= GST_STATE_PAUSED || GST_STATE_TARGET (self) >= GST_STATE_PAUSED) { gst_pad_set_active (pad, TRUE); } if (gst_element_add_pad (GST_ELEMENT (self), pad)) { kms_element_set_sink_input_stats (self, pad, type); return pad; } g_object_unref (pad); return NULL; }