Esempio n. 1
0
static void
kms_base_rtp_session_add_bundle_connection (KmsBaseRtpSession * self,
    KmsIRtpConnection * conn, SdpMediaConfig * mconf, gboolean active)
{
  gboolean added;
  GstElement *ssrcdemux;
  GstElement *rtcpdemux;        /* FIXME: Useful for local and remote ssrcs mapping */
  GstPad *src, *sink;

  if (GPOINTER_TO_UINT (g_object_get_qdata (G_OBJECT (conn),
              bundle_conn_added_quark ()))) {
    GST_DEBUG_OBJECT (self, "Connection configured");
    return;
  }

  g_object_set_qdata (G_OBJECT (conn), bundle_conn_added_quark (),
      GUINT_TO_POINTER (TRUE));

  g_object_get (conn, "added", &added, NULL);
  if (!added) {
    kms_i_rtp_connection_add (conn, GST_BIN (self), active);
  }

  ssrcdemux = gst_element_factory_make ("rtpssrcdemux", NULL);
  rtcpdemux = gst_element_factory_make ("rtcpdemux", NULL);

  g_object_set_qdata_full (G_OBJECT (ssrcdemux), rtcp_demux_peer_quark (),
      g_object_ref (rtcpdemux), g_object_unref);
  g_signal_connect (ssrcdemux, "new-ssrc-pad",
      G_CALLBACK (rtp_ssrc_demux_new_ssrc_pad), self);

  kms_i_rtp_connection_sink_sync_state_with_parent (conn);
  gst_bin_add_many (GST_BIN (self), ssrcdemux, rtcpdemux, NULL);

  /* RTP */
  src = kms_i_rtp_connection_request_rtp_src (conn);
  sink = gst_element_get_static_pad (ssrcdemux, "sink");
  kms_base_rtp_session_link_pads (src, sink);
  g_object_unref (src);
  g_object_unref (sink);

  /* RTCP */
  src = kms_i_rtp_connection_request_rtcp_src (conn);
  sink = gst_element_get_static_pad (rtcpdemux, "sink");
  kms_base_rtp_session_link_pads (src, sink);
  g_object_unref (src);
  g_object_unref (sink);
  gst_element_link_pads (rtcpdemux, "rtcp_src", ssrcdemux, "rtcp_sink");

  gst_element_sync_state_with_parent_target_state (ssrcdemux);
  gst_element_sync_state_with_parent_target_state (rtcpdemux);

  kms_i_rtp_connection_src_sync_state_with_parent (conn);
}
Esempio n. 2
0
static void
kms_base_rtp_session_add_connection_src (KmsBaseRtpSession * self,
    KmsIRtpConnection * conn, SdpMediaConfig * mconf)
{
  GstPad *src, *sink;

  /* RTP */
  sink =
      kms_i_rtp_session_manager_request_rtp_sink (self->manager, self, mconf);
  src = kms_i_rtp_connection_request_rtp_src (conn);
  kms_base_rtp_session_link_pads (src, sink);
  g_object_unref (src);
  g_object_unref (sink);

  /* RTCP */
  sink =
      kms_i_rtp_session_manager_request_rtcp_sink (self->manager, self, mconf);
  src = kms_i_rtp_connection_request_rtcp_src (conn);
  kms_base_rtp_session_link_pads (src, sink);
  g_object_unref (src);
  g_object_unref (sink);
}
Esempio n. 3
0
static void
kms_base_rtp_session_add_rtcp_mux_connection (KmsBaseRtpSession * self,
    KmsIRtpConnection * conn, SdpMediaConfig * mconf, gboolean active)
{
  /* FIXME: Useful for local and remote ssrcs mapping */
  GstElement *rtcpdemux = gst_element_factory_make ("rtcpdemux", NULL);
  GstPad *src, *sink;

  kms_i_rtp_connection_add (conn, GST_BIN (self), active);
  kms_i_rtp_connection_sink_sync_state_with_parent (conn);
  gst_bin_add (GST_BIN (self), rtcpdemux);

  /* RTP */
  src = kms_i_rtp_connection_request_rtp_src (conn);
  sink =
      kms_i_rtp_session_manager_request_rtp_sink (self->manager, self, mconf);
  kms_base_rtp_session_link_pads (src, sink);
  g_object_unref (src);
  g_object_unref (sink);

  /* RTCP */
  src = gst_element_get_static_pad (rtcpdemux, "rtcp_src");
  sink =
      kms_i_rtp_session_manager_request_rtcp_sink (self->manager, self, mconf);
  g_object_unref (src);
  g_object_unref (sink);

  src = kms_i_rtp_connection_request_rtcp_src (conn);
  sink = gst_element_get_static_pad (rtcpdemux, "sink");
  kms_base_rtp_session_link_pads (src, sink);
  g_object_unref (src);
  g_object_unref (sink);

  gst_element_sync_state_with_parent_target_state (rtcpdemux);
  kms_base_rtp_session_add_connection_sink (self, conn, mconf);

  kms_i_rtp_connection_src_sync_state_with_parent (conn);
}