Exemple #1
0
/**
 * \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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}