Esempio n. 1
0
static void
create_media_offers (SdpHandler * sdp_handler, struct SdpOfferData *data)
{
  SdpMediaConfig *m_conf;
  GstSDPMedia *media;
  GError *err = NULL;
  GSList *l;

  media = kms_sdp_media_handler_create_offer (sdp_handler->handler,
      sdp_handler->media, &err);

  if (err != NULL) {
    GST_ERROR_OBJECT (sdp_handler->handler, "%s", err->message);
    g_error_free (err);
    return;
  }

  m_conf = kms_sdp_message_context_add_media (data->ctx, media, &err);
  if (m_conf == NULL) {
    GST_ERROR_OBJECT (sdp_handler->handler, "%s", err->message);
    g_error_free (err);
    return;
  }

  for (l = data->agent->priv->groups; l != NULL; l = l->next) {
    SdpHandlerGroup *group = l->data;
    GSList *ll;

    for (ll = group->handlers; ll != NULL; ll = ll->next) {
      SdpHandler *h = ll->data;
      SdpMediaGroup *m_group;

      if (sdp_handler->id != h->id) {
        continue;
      }

      m_group = kms_sdp_message_context_get_group (data->ctx, group->id);
      if (m_group == NULL) {
        m_group = kms_sdp_message_context_create_group (data->ctx, group->id);
      }

      if (!kms_sdp_message_context_add_media_to_group (m_group, m_conf, &err)) {
        GST_ERROR_OBJECT (sdp_handler->handler, "%s", err->message);
        g_error_free (err);
        return;
      }
    }
  }

  if (data->agent->priv->configure_media_callback_data != NULL) {
    data->agent->priv->configure_media_callback_data->callback (data->agent,
        m_conf, data->agent->priv->configure_media_callback_data->user_data);
  }
}
Esempio n. 2
0
static gboolean
create_media_answer (const GstSDPMedia * media, struct SdpAnswerData *data)
{
  KmsSdpAgent *agent = data->agent;
  GstSDPMedia *answer_media = NULL;
  SdpHandler *sdp_handler;
  GError **err = data->err;

  SDP_AGENT_LOCK (agent);

  sdp_handler = kms_sdp_agent_get_handler_for_media (agent, media);

  SDP_AGENT_UNLOCK (agent);

  if (sdp_handler == NULL) {
    GST_WARNING_OBJECT (agent,
        "No handler for '%s' media proto '%s' found",
        gst_sdp_media_get_media (media), gst_sdp_media_get_proto (media));
    goto answer;
  }

  answer_media = kms_sdp_media_handler_create_answer (sdp_handler->handler,
      data->ctx, media, err);

  if (answer_media == NULL) {
    return FALSE;
  }

answer:
  {
    SdpMediaConfig *mconf;
    gboolean do_call = TRUE;

    if (answer_media == NULL) {
      answer_media = reject_media_answer (media);
      do_call = FALSE;
    }

    mconf = kms_sdp_message_context_add_media (data->ctx, answer_media, err);
    if (mconf == NULL) {
      return FALSE;
    }

    if (do_call && data->agent->priv->configure_media_callback_data != NULL) {
      data->agent->priv->configure_media_callback_data->callback (data->agent,
          mconf, data->agent->priv->configure_media_callback_data->user_data);
    }

    return TRUE;
  }
}
Esempio n. 3
0
static gboolean
add_media_context (const GstSDPMedia * media, struct SdpMediaContextData *data)
{
  SdpMessageContext *ctx = data->ctx;
  GstSDPMedia *cpy;

  if (gst_sdp_media_copy (media, &cpy) != GST_SDP_OK) {
    g_set_error_literal (data->err, KMS_SDP_AGENT_ERROR,
        SDP_AGENT_UNEXPECTED_ERROR, "Can not copy media entry");
    return FALSE;
  }

  if (kms_sdp_message_context_add_media (ctx, cpy, data->err) == NULL) {
    return FALSE;
  }

  return TRUE;
}