int sdp_keep_codecs_by_id(sip_msg_t* msg, str* codecs) { sdp_info_t *sdp = NULL; int sdp_session_num; int sdp_stream_num; sdp_session_cell_t* sdp_session; sdp_stream_cell_t* sdp_stream; str sdp_codecs; str tmp_codecs; str rm_codec; if(parse_sdp(msg) < 0) { LM_ERR("Unable to parse sdp\n"); return -1; } LM_ERR("attempting to keep codecs in sdp: [%.*s]\n", codecs->len, codecs->s); sdp = (sdp_info_t*)msg->body; sdp_session_num = 0; for(;;) { sdp_session = get_sdp_session(msg, sdp_session_num); if(!sdp_session) break; sdp_stream_num = 0; for(;;) { sdp_stream = get_sdp_stream(msg, sdp_session_num, sdp_stream_num); if(!sdp_stream) break; LM_DBG("stream %d of %d - payloads [%.*s]\n", sdp_stream_num, sdp_session_num, sdp_stream->payloads.len, sdp_stream->payloads.s); sdp_codecs = sdp_stream->payloads; tmp_codecs = sdp_stream->payloads; while(str_find_token(&tmp_codecs, &rm_codec, ' ')==0 && rm_codec.len>0) { tmp_codecs.len -=(int)(&rm_codec.s[rm_codec.len]-tmp_codecs.s); tmp_codecs.s = rm_codec.s + rm_codec.len; if(sdp_codec_in_str(codecs, &rm_codec, ',')==0) { LM_DBG("codecs [%.*s] - remove [%.*s]\n", sdp_codecs.len, sdp_codecs.s, rm_codec.len, rm_codec.s); sdp_remove_str_codec_id(msg, &sdp_codecs, &rm_codec); sdp_remove_str_codec_id_attrs(msg, sdp_stream, &rm_codec); } } sdp_stream_num++; } sdp_session_num++; } return 0; }
int sdp_with_codecs_by_id(sip_msg_t* msg, str* codecs) { sdp_info_t *sdp = NULL; int sdp_session_num; int sdp_stream_num; sdp_session_cell_t* sdp_session; sdp_stream_cell_t* sdp_stream; str sdp_codecs; str tmp_codecs; str fnd_codec; int foundone = 0; int notfound = 0; if(parse_sdp(msg) < 0) { LM_ERR("Unable to parse sdp\n"); return -1; } sdp = (sdp_info_t*)msg->body; if(sdp==NULL) { LM_DBG("No sdp body\n"); return -1; } LM_DBG("attempting to search codecs in sdp: [%.*s]\n", codecs->len, codecs->s); sdp_session_num = 0; for(;;) { sdp_session = get_sdp_session(msg, sdp_session_num); if(!sdp_session) break; sdp_stream_num = 0; for(;;) { sdp_stream = get_sdp_stream(msg, sdp_session_num, sdp_stream_num); if(!sdp_stream) break; LM_DBG("stream %d of %d - payloads [%.*s]\n", sdp_stream_num, sdp_session_num, sdp_stream->payloads.len, sdp_stream->payloads.s); sdp_codecs = sdp_stream->payloads; tmp_codecs = *codecs; while(str_find_token(&tmp_codecs, &fnd_codec, ',')==0 && fnd_codec.len>0) { tmp_codecs.len -=(int)(&fnd_codec.s[fnd_codec.len]-tmp_codecs.s); tmp_codecs.s = fnd_codec.s + fnd_codec.len; if(sdp_codec_in_str(&sdp_codecs, &fnd_codec, ' ')==0) { LM_DBG("codecs [%.*s] - not found [%.*s]\n", sdp_codecs.len, sdp_codecs.s, fnd_codec.len, fnd_codec.s); notfound = 1; } else { LM_DBG("codecs [%.*s] - found [%.*s]\n", sdp_codecs.len, sdp_codecs.s, fnd_codec.len, fnd_codec.s); foundone = 1; } } sdp_stream_num++; } sdp_session_num++; } return (foundone + ((foundone)?notfound:0)); }