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