Ejemplo n.º 1
0
static GstSDPMedia *
reject_media_answer (const GstSDPMedia * offered)
{
  GstSDPMedia *media;
  const gchar *mid;
  guint i, len;

  gst_sdp_media_new (&media);

  /* [rfc3264] To reject an offered stream, the port number in the */
  /* corresponding stream in the answer MUST be set to zero. Any   */
  /* media formats listed are ignored. */

  gst_sdp_media_set_media (media, gst_sdp_media_get_media (offered));
  gst_sdp_media_set_port_info (media, 0, 1);
  gst_sdp_media_set_proto (media, gst_sdp_media_get_proto (offered));

  len = gst_sdp_media_formats_len (offered);
  for (i = 0; i < len; i++) {
    const gchar *format;

    format = gst_sdp_media_get_format (offered, i);
    gst_sdp_media_insert_format (media, i, format);
  }

  /* [rfc5888] mid attribute must be present in answer as well */
  mid = gst_sdp_media_get_attribute_val (offered, "mid");
  if (mid == NULL) {
    return media;
  }

  gst_sdp_media_add_attribute (media, "mid", mid);

  return media;
}
Ejemplo n.º 2
0
static gboolean
accept_fmtp_attribute (const GstSDPMedia * offer,
    const GstSDPAttribute * attr, GstSDPMedia * media, SdpMessageContext * ctx)
{
  guint i, len;
  gchar **fmtp;
  gboolean ret = FALSE;

  fmtp = g_strsplit (attr->value, " ", 0);

  /* Check that answer supports this format */
  len = gst_sdp_media_formats_len (media);

  for (i = 0; i < len; i++) {
    const gchar *fmt;

    fmt = gst_sdp_media_get_format (media, i);
    if (g_strcmp0 (fmt, fmtp[0] /* format */ ) == 0) {
      ret = TRUE;
      break;
    }
  }

  g_strfreev (fmtp);

  return ret;
}
Ejemplo n.º 3
0
static gboolean
format_supported (const GstSDPMedia * media, const gchar * fmt)
{
  guint i, len;

  len = gst_sdp_media_formats_len (media);

  for (i = 0; i < len; i++) {
    const gchar *format;

    format = gst_sdp_media_get_format (media, i);

    if (g_strcmp0 (format, fmt) == 0) {
      return TRUE;
    }
  }

  return FALSE;
}
Ejemplo n.º 4
0
static gboolean
kms_sdp_reject_media_handler_init_answer (KmsSdpMediaHandler * handler,
        const GstSDPMedia * offer, GstSDPMedia * answer, GError ** error)
{
    guint i, len;

    if (gst_sdp_media_set_media (answer,
                                 gst_sdp_media_get_media (offer)) != GST_SDP_OK) {
        g_set_error (error, KMS_SDP_AGENT_ERROR, SDP_AGENT_INVALID_PARAMETER,
                     "Can not set '%s' media ttribute", gst_sdp_media_get_media (offer));
        return FALSE;
    }

    if (gst_sdp_media_set_proto (answer,
                                 gst_sdp_media_get_proto (offer)) != GST_SDP_OK) {
        g_set_error (error, KMS_SDP_AGENT_ERROR, SDP_AGENT_INVALID_PARAMETER,
                     "Can not set proto '%s' attribute", gst_sdp_media_get_proto (offer));
        return FALSE;
    }

    if (gst_sdp_media_set_port_info (answer, 0, 1) != GST_SDP_OK) {
        g_set_error_literal (error, KMS_SDP_AGENT_ERROR,
                             SDP_AGENT_INVALID_PARAMETER, "Can not set port info attribute");
        return FALSE;
    }

    len = gst_sdp_media_formats_len (offer);
    for (i = 0; i < len; i++) {
        const gchar *format;

        format = gst_sdp_media_get_format (offer, i);
        gst_sdp_media_insert_format (answer, i, format);
    }

    return TRUE;
}