Esempio n. 1
0
int
sdp_message_m_media_add (sdp_message_t * sdp, char *media, char *port, char *number_of_port, char *proto)
{
  int i;
  sdp_media_t *med;

  i = sdp_media_init (&med);
  if (i != 0)
    return i;
  med->m_media = media;
  med->m_port = port;
  med->m_number_of_port = number_of_port;
  med->m_proto = proto;
  osip_list_add (&sdp->m_medias, med, -1);
  return OSIP_SUCCESS;
}
int test_add_codec(struct osip_rfc3264 *cnf, int codec_type,
		   int payload, char *attribute)
{
  sdp_media_t *med;
  sdp_attribute_t *attr;
  char *tmp;
  int i;
  if (payload>127) return -1;
  if (attribute==NULL || strlen(attribute)==0) return -1;

  i = sdp_media_init(&med);
  if (i!=0) goto error;
  
  tmp = malloc(4);
  snprintf(tmp, 3, "%i", payload);
  med->m_proto = strdup("RTP/AVP");
  osip_list_add(med->m_payloads, tmp, -1);

  i = sdp_attribute_init (&attr);
  if (i != 0)
    return -1;
  attr->a_att_field = strdup("rtpmap");
  attr->a_att_value = strdup(attribute);
  osip_list_add (med->a_attributes, attr, -1);


  switch(codec_type)
    {
    case AUDIO_CODEC:
      med->m_media = strdup("audio");
      osip_rfc3264_add_audio_media(cnf, med, -1);
      break;
    case VIDEO_CODEC:
      med->m_media = strdup("video");
      osip_rfc3264_add_video_media(cnf, med, -1);
      break;
    }

  return 0;

 error:
  return -1;
}
Esempio n. 3
0
static int
sdp_message_parse_m (sdp_message_t * sdp, char *buf, char **next)
{
  char *equal;
  char *crlf;
  char *tmp;
  char *tmp_next;
  int i;
  sdp_media_t *m_header;
  char *slash;
  char *space;

  *next = buf;

  equal = buf;
  while ((*equal != '=') && (*equal != '\0'))
    equal++;
  if (*equal == '\0')
    return ERR_ERROR;

  /* check if header is "m" */
  if (equal[-1] != 'm')
    return ERR_DISCARD;

  crlf = equal + 1;

  while ((*crlf != '\r') && (*crlf != '\n') && (*crlf != '\0'))
    crlf++;
  if (*crlf == '\0')
    return ERR_ERROR;
  if (crlf == equal + 1)
    return ERR_ERROR;		/* a=\r ?? bad header */

  tmp = equal + 1;

  i = sdp_media_init (&m_header);
  if (i != 0)
    return ERR_ERROR;

  /* m=media port ["/"integer] proto *(payload_number) */

  /* media is "audio" "video" "application" "data" or other... */
  i = __osip_set_next_token (&(m_header->m_media), tmp, ' ', &tmp_next);
  if (i != 0)
    {
      sdp_media_free (m_header);
      return -1;
    }
  tmp = tmp_next;

  slash = strchr (tmp, '/');
  space = strchr (tmp, ' ');
  if (space == NULL)		/* not possible! */
    {
      sdp_media_free (m_header);
      return ERR_ERROR;
    }
  if ((slash != NULL) && (slash < space))
    {				/* a number of port is specified! */
      i = __osip_set_next_token (&(m_header->m_port), tmp, '/', &tmp_next);
      if (i != 0)
	{
	  sdp_media_free (m_header);
	  return -1;
	}
      tmp = tmp_next;

      i =
	__osip_set_next_token (&(m_header->m_number_of_port), tmp, ' ',
			       &tmp_next);
      if (i != 0)
	{
	  sdp_media_free (m_header);
	  return -1;
	}
      tmp = tmp_next;
    }
  else
    {
      i = __osip_set_next_token (&(m_header->m_port), tmp, ' ', &tmp_next);
      if (i != 0)
	{
	  sdp_media_free (m_header);
	  return -1;
	}
      tmp = tmp_next;
    }

  i = __osip_set_next_token (&(m_header->m_proto), tmp, ' ', &tmp_next);
  if (i != 0)
    {
      sdp_media_free (m_header);
      return -1;
    }
  tmp = tmp_next;

  {
    char *str;
    int more_space_before_crlf;

    space = strchr (tmp + 1, ' ');
    if (space == NULL)
      more_space_before_crlf = 1;
    else if ((space != NULL) && (space > crlf))
      more_space_before_crlf = 1;
    else
      more_space_before_crlf = 0;
    while (more_space_before_crlf == 0)
      {
	i = __osip_set_next_token (&str, tmp, ' ', &tmp_next);
	if (i != 0)
	  {
	    sdp_media_free (m_header);
	    return -1;
	  }
	tmp = tmp_next;
	osip_list_add (m_header->m_payloads, str, -1);

	space = strchr (tmp + 1, ' ');
	if (space == NULL)
	  more_space_before_crlf = 1;
	else if ((space != NULL) && (space > crlf))
	  more_space_before_crlf = 1;
	else
	  more_space_before_crlf = 0;
      }
    if (tmp_next < crlf)
      {				/* tmp_next is still less than clrf: no space */
	i = __osip_set_next_token (&str, tmp, '\r', &tmp_next);
	if (i != 0)
	  {
	    i = __osip_set_next_token (&str, tmp, '\n', &tmp_next);
	    if (i != 0)
	      {
		sdp_media_free (m_header);
		return -1;
	      }
	  }
	osip_list_add (m_header->m_payloads, str, -1);
      }
  }

  osip_list_add (sdp->m_medias, m_header, -1);

  if (crlf[1] == '\n')
    *next = crlf + 2;
  else
    *next = crlf + 1;
  return WF;
}