/** * \brief creates SAP message: header + payload returned in a buffer * \param channelTable_entry * entry the entry in the channelTable associated to the socket * \param sap_msg_length a location to save the lenght of the SAP message * \param gboolean deletion specify if we should build the SAP deletion message * \return char* buffer that contains the SAP message (the UDP payload) */ static char* build_SAP_msg(struct channelTable_entry * entry, int *sap_msg_length, gboolean deletion){ GstSDPMessage *msg; /* create a new SDP message */ if (gst_sdp_message_new(&msg)){ g_critical("Failed to create SDP message\n"); return FALSE; } /* * build the SDP message */ create_SDP(msg, entry); /* extract the randomly generated session_version integer */ const GstSDPOrigin *origin = gst_sdp_message_get_origin (msg); int session_version = htonl(atoi(origin->sess_version)); /* Build the header */ char header[SAP_header_size]; build_SAP_header(header, session_version, deletion); /* Build the *payload */ char *payload = g_strdup (gst_sdp_message_as_text(msg)); /* concat header and payload */ int sap_msg_size = SAP_header_size+strlen(payload); char *sap_msg = (char*) malloc(sap_msg_size*sizeof(char)); memcpy(sap_msg, header, SAP_header_size); memcpy(sap_msg+SAP_header_size, payload, strlen(payload)); *sap_msg_length = sap_msg_size; // save the length if the message into sap_msg_length free(payload); return sap_msg; }
static gboolean copy_session_attributes (SdpMessageContext * ctx, const GstSDPMessage * msg, GError ** error) { const GstSDPOrigin *o1; const gchar *s; o1 = gst_sdp_message_get_origin (msg); if (gst_sdp_message_set_origin (ctx->msg, o1->username, o1->sess_id, o1->sess_version, o1->nettype, o1->addrtype, o1->addr) != GST_SDP_OK) { g_set_error_literal (error, KMS_SDP_AGENT_ERROR, SDP_AGENT_INVALID_PARAMETER, "Can not set origin"); return FALSE; } s = gst_sdp_message_get_session_name (msg); if (gst_sdp_message_set_session_name (ctx->msg, s) != GST_SDP_OK) { g_set_error_literal (error, KMS_SDP_AGENT_ERROR, SDP_AGENT_INVALID_PARAMETER, "Can not set session name"); return FALSE; } if (!sdp_utils_intersect_session_attributes (msg, intersect_session_attr, ctx)) { g_set_error_literal (error, KMS_SDP_AGENT_ERROR, SDP_AGENT_INVALID_PARAMETER, "Can not interset session attributes"); return FALSE; } return TRUE; }
static gboolean test_response_sdp (GstRTSPClient * client, GstRTSPMessage * response, gboolean close, gpointer user_data) { guint8 *data; guint size; GstSDPMessage *sdp_msg; const GstSDPMedia *sdp_media; const GstSDPBandwidth *bw; gint bandwidth_val = GPOINTER_TO_INT (user_data); fail_unless (gst_rtsp_message_get_body (response, &data, &size) == GST_RTSP_OK); gst_sdp_message_new (&sdp_msg); fail_unless (gst_sdp_message_parse_buffer (data, size, sdp_msg) == GST_SDP_OK); /* session description */ /* v= */ fail_unless (gst_sdp_message_get_version (sdp_msg) != NULL); /* o= */ fail_unless (gst_sdp_message_get_origin (sdp_msg) != NULL); /* s= */ fail_unless (gst_sdp_message_get_session_name (sdp_msg) != NULL); /* t=0 0 */ fail_unless (gst_sdp_message_times_len (sdp_msg) == 0); /* verify number of medias */ fail_unless (gst_sdp_message_medias_len (sdp_msg) == 1); /* media description */ sdp_media = gst_sdp_message_get_media (sdp_msg, 0); fail_unless (sdp_media != NULL); /* m= */ fail_unless (gst_sdp_media_get_media (sdp_media) != NULL); /* media bandwidth */ if (bandwidth_val) { fail_unless (gst_sdp_media_bandwidths_len (sdp_media) == 1); bw = gst_sdp_media_get_bandwidth (sdp_media, 0); fail_unless (bw != NULL); fail_unless (g_strcmp0 (bw->bwtype, "AS") == 0); fail_unless (bw->bandwidth == bandwidth_val); } else { fail_unless (gst_sdp_media_bandwidths_len (sdp_media) == 0); } gst_sdp_message_free (sdp_msg); return TRUE; }
SdpMessageContext * kms_sdp_message_context_new_from_sdp (GstSDPMessage * sdp, GError ** error) { struct SdpMediaContextData data; SdpMessageContext *ctx; const GstSDPOrigin *o; SdpIPv ipv; o = gst_sdp_message_get_origin (sdp); if (g_strcmp0 (o->addrtype, ORIGIN_ATTR_ADDR_TYPE_IP4) == 0) { ipv = IPV4; } else if (g_strcmp0 (o->addrtype, ORIGIN_ATTR_ADDR_TYPE_IP4) == 0) { ipv = IPV6; } else { g_set_error (error, KMS_SDP_AGENT_ERROR, SDP_AGENT_INVALID_PARAMETER, "Invalid IP version '%s'", o->addrtype); return NULL; } ctx = kms_sdp_message_context_new (ipv, o->addr, error); if (ctx == NULL) { return NULL; } if (!kms_sdp_message_context_parse_groups_from_offer (ctx, sdp, error)) { goto error; } if (!copy_session_attributes (ctx, sdp, error)) { goto error; } data.ctx = ctx; data.err = error; if (!sdp_utils_for_each_media (sdp, (GstSDPMediaFunc) add_media_context, &data)) { g_set_error_literal (error, KMS_SDP_AGENT_ERROR, SDP_AGENT_UNEXPECTED_ERROR, "can not create SDP context"); goto error; } return ctx; error: kms_sdp_message_context_destroy (ctx); return NULL; }