GstSDPMessage * kms_sdp_session_process_offer (KmsSdpSession * self, GstSDPMessage * offer) { SdpMessageContext *ctx; GstSDPMessage *answer = NULL, *copy; GError *err = NULL; GST_DEBUG_OBJECT (self, "Process offer"); ctx = kms_sdp_message_context_new_from_sdp (offer, &err); if (err != NULL) { GST_ERROR_OBJECT (self, "Error processing offer (%s)", err->message); goto end; } kms_sdp_message_context_set_type (ctx, KMS_SDP_OFFER); self->remote_sdp_ctx = ctx; if (gst_sdp_message_copy (offer, ©) != GST_SDP_OK) { GST_ERROR_OBJECT (self, "Error processing offer (Cannot copy SDP offer)"); goto end; } kms_sdp_agent_set_remote_description (self->agent, copy, &err); if (err != NULL) { GST_ERROR_OBJECT (self, "Error processing offer (%s)", err->message); goto end; } ctx = kms_sdp_agent_create_answer (self->agent, &err); if (err != NULL) { GST_ERROR_OBJECT (self, "Error processing offer (%s)", err->message); goto end; } answer = kms_sdp_message_context_pack (ctx, &err); if (err != NULL) { GST_ERROR_OBJECT (self, "Error processing offer (%s)", err->message); kms_sdp_message_context_unref (ctx); goto end; } /* inmediate-TODO: review: a copy of answer? */ kms_sdp_agent_set_local_description (self->agent, answer, &err); if (err != NULL) { GST_ERROR_OBJECT (self, "Error processing offer (%s)", err->message); goto end; } kms_sdp_message_context_set_type (ctx, KMS_SDP_ANSWER); self->local_sdp_ctx = ctx; self->neg_sdp_ctx = ctx; end: g_clear_error (&err); return answer; }
GstSDPMessage * kms_sdp_session_generate_offer (KmsSdpSession * self) { SdpMessageContext *ctx; GstSDPMessage *offer = NULL; GError *err = NULL; GST_DEBUG_OBJECT (self, "Generate offer"); ctx = kms_sdp_agent_create_offer (self->agent, &err); if (err != NULL) { GST_ERROR_OBJECT (self, "Error generating offer (%s)", err->message); goto end; } offer = kms_sdp_message_context_pack (ctx, &err); if (err != NULL) { GST_ERROR_OBJECT (self, "Error generating offer (%s)", err->message); goto end; } kms_sdp_message_context_set_type (ctx, KMS_SDP_OFFER); self->local_sdp_ctx = ctx; end: g_clear_error (&err); return offer; }
gboolean kms_sdp_session_process_answer (KmsSdpSession * self, GstSDPMessage * answer) { SdpMessageContext *ctx; GError *err = NULL; GST_DEBUG_OBJECT (self, "Process answer"); if (self->local_sdp_ctx == NULL) { // TODO: This should raise an error GST_ERROR_OBJECT (self, "Answer received without a local offer generated"); return FALSE; } ctx = kms_sdp_message_context_new_from_sdp (answer, &err); if (err != NULL) { GST_ERROR_OBJECT (self, "Error processing answer (%s)", err->message); g_error_free (err); return FALSE; } kms_sdp_message_context_set_type (ctx, KMS_SDP_ANSWER); self->remote_sdp_ctx = ctx; self->neg_sdp_ctx = ctx; return TRUE; }
static SdpMessageContext * kms_sdp_agent_create_offer_impl (KmsSdpAgent * agent, GError ** error) { struct SdpOfferData data; SdpMessageContext *ctx; SdpIPv ipv; SDP_AGENT_LOCK (agent); ipv = (agent->priv->use_ipv6) ? IPV6 : IPV4; ctx = kms_sdp_message_context_new (ipv, agent->priv->addr, error); if (ctx == NULL) { SDP_AGENT_UNLOCK (agent); return NULL; } kms_sdp_message_context_set_type (ctx, KMS_SDP_OFFER); data.ctx = ctx; data.agent = agent; g_slist_foreach (agent->priv->handlers, (GFunc) create_media_offers, &data); SDP_AGENT_UNLOCK (agent); return ctx; }
GstSDPMessage * kms_sdp_session_process_offer (KmsSdpSession * self, GstSDPMessage * offer) { SdpMessageContext *ctx; GstSDPMessage *answer = NULL; GError *err = NULL; GST_DEBUG_OBJECT (self, "Process offer"); ctx = kms_sdp_message_context_new_from_sdp (offer, &err); if (err != NULL) { GST_ERROR_OBJECT (self, "Error processing offer (%s)", err->message); goto end; } kms_sdp_message_context_set_type (ctx, KMS_SDP_OFFER); self->remote_sdp_ctx = ctx; ctx = kms_sdp_agent_create_answer (self->agent, offer, &err); if (err != NULL) { GST_ERROR_OBJECT (self, "Error processing offer (%s)", err->message); goto end; } answer = kms_sdp_message_context_pack (ctx, &err); if (err != NULL) { GST_ERROR_OBJECT (self, "Error processing offer (%s)", err->message); kms_sdp_message_context_unref (ctx); goto end; } kms_sdp_message_context_set_type (ctx, KMS_SDP_ANSWER); self->local_sdp_ctx = ctx; self->neg_sdp_ctx = ctx; end: g_clear_error (&err); return answer; }
static SdpMessageContext * kms_sdp_agent_create_answer_impl (KmsSdpAgent * agent, const GstSDPMessage * offer, GError ** error) { struct SdpAnswerData data; SdpMessageContext *ctx; gboolean bundle; SdpIPv ipv; SDP_AGENT_LOCK (agent); ipv = (agent->priv->use_ipv6) ? IPV6 : IPV4; bundle = g_slist_length (agent->priv->groups) > 0; SDP_AGENT_UNLOCK (agent); ctx = kms_sdp_message_context_new (ipv, agent->priv->addr, error); if (ctx == NULL) { return NULL; } kms_sdp_message_context_set_type (ctx, KMS_SDP_ANSWER); if (bundle && !kms_sdp_message_context_parse_groups_from_offer (ctx, offer, error)) { goto error; } if (!kms_sdp_message_context_set_common_session_attributes (ctx, offer, error)) { goto error; } data.agent = agent; data.ctx = ctx; data.err = error; if (!sdp_utils_for_each_media (offer, (GstSDPMediaFunc) create_media_answer, &data)) { goto error; } return ctx; error: kms_sdp_message_context_unref (ctx); return NULL; }