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