|
@@ -138,17 +138,19 @@ int sdpops_get_ids_by_name(str *name, str *ids)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * get codec ID from a= line based on name
|
|
|
+ * get codec IDs from a= lines based on name
|
|
|
*/
|
|
|
-int sdpops_sdp_get_ids_by_name(sdp_info_t *sdp, str *cname, str *cid)
|
|
|
+int sdpops_sdp_get_ids_by_name(sdp_info_t *sdp, str *cname, str *cids, int n)
|
|
|
{
|
|
|
int sdp_session_num;
|
|
|
int sdp_stream_num;
|
|
|
sdp_session_cell_t *sdp_session;
|
|
|
sdp_stream_cell_t *sdp_stream;
|
|
|
sdp_payload_attr_t *sdp_payload;
|
|
|
+ int i;
|
|
|
|
|
|
sdp_session_num = 0;
|
|
|
+ i = 0;
|
|
|
for(;;)
|
|
|
{
|
|
|
sdp_session = get_sdp_session_sdp(sdp, sdp_session_num);
|
|
@@ -165,8 +167,10 @@ int sdpops_sdp_get_ids_by_name(sdp_info_t *sdp, str *cname, str *cid)
|
|
|
&& strncasecmp(cname->s, sdp_payload->rtp_enc.s,
|
|
|
cname->len)==0)
|
|
|
{
|
|
|
- *cid = sdp_payload->rtp_payload;
|
|
|
- return 0;
|
|
|
+ if(i==n)
|
|
|
+ goto notfound;
|
|
|
+ cids[i] = sdp_payload->rtp_payload;
|
|
|
+ i++;
|
|
|
}
|
|
|
|
|
|
sdp_payload=sdp_payload->next;
|
|
@@ -176,8 +180,15 @@ int sdpops_sdp_get_ids_by_name(sdp_info_t *sdp, str *cname, str *cid)
|
|
|
sdp_session_num++;
|
|
|
}
|
|
|
|
|
|
- cid->s = NULL;
|
|
|
- cid->len = 0;
|
|
|
+ if(i==0)
|
|
|
+ goto notfound;
|
|
|
+ if(i<n)
|
|
|
+ cids[i].s = NULL;
|
|
|
+ return 0;
|
|
|
+
|
|
|
+notfound:
|
|
|
+ cids[0].s = NULL;
|
|
|
+ cids[0].len = 0;
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
@@ -190,8 +201,10 @@ int sdpops_build_ids_list(sdp_info_t *sdp, str *names, str *ids)
|
|
|
static char _local_idslist[SDPOPS_MAX_LIST_SIZE];
|
|
|
str tmp;
|
|
|
str codec;
|
|
|
- str cids;
|
|
|
+#define SDPOPS_CIDS_SIZE 8
|
|
|
+ str cids[SDPOPS_CIDS_SIZE];
|
|
|
char *p;
|
|
|
+ int i;
|
|
|
|
|
|
tmp = *names;
|
|
|
ids->len = 0;
|
|
@@ -203,33 +216,34 @@ int sdpops_build_ids_list(sdp_info_t *sdp, str *names, str *ids)
|
|
|
tmp.len -= (int)(&codec.s[codec.len]-codec.s);
|
|
|
tmp.s = codec.s + codec.len;
|
|
|
|
|
|
- cids.s = NULL;
|
|
|
- if(sdpops_get_ids_by_name(&codec, &cids)==0) {
|
|
|
+ cids[0].s = NULL;
|
|
|
+ if(sdpops_get_ids_by_name(&codec, &cids[0])==0) {
|
|
|
LM_DBG("codecs list [%.*s] - at name [%.*s] with list ids [%.*s]\n",
|
|
|
names->len, names->s,
|
|
|
codec.len, codec.s,
|
|
|
- cids.len, cids.s);
|
|
|
+ cids[0].len, cids[0].s);
|
|
|
+ cids[1].s = NULL;
|
|
|
} else {
|
|
|
- if(sdpops_sdp_get_ids_by_name(sdp, &codec, &cids)==0) {
|
|
|
- LM_DBG("codecs list [%.*s] - at name [%.*s] with sdp id [%.*s]\n",
|
|
|
+ if(sdpops_sdp_get_ids_by_name(sdp, &codec, cids, SDPOPS_CIDS_SIZE)==0) {
|
|
|
+ LM_DBG("codecs list [%.*s] - at name [%.*s] with first sdp id [%.*s]\n",
|
|
|
names->len, names->s,
|
|
|
codec.len, codec.s,
|
|
|
- cids.len, cids.s);
|
|
|
+ cids[0].len, cids[0].s);
|
|
|
}
|
|
|
}
|
|
|
- if(cids.s!=NULL) {
|
|
|
- if(ids->len + cids.len>=SDPOPS_MAX_LIST_SIZE)
|
|
|
+ for(i=0; i<SDPOPS_CIDS_SIZE && cids[i].s!=NULL; i++) {
|
|
|
+ if(ids->len + cids[i].len>=SDPOPS_MAX_LIST_SIZE)
|
|
|
{
|
|
|
LM_ERR("the list with codecs ids is too big\n");
|
|
|
ids->len = 0;
|
|
|
ids->s = 0;
|
|
|
return -1;
|
|
|
}
|
|
|
- strncpy(p, cids.s, cids.len);
|
|
|
- p += cids.len;
|
|
|
+ strncpy(p, cids[i].s, cids[i].len);
|
|
|
+ p += cids[i].len;
|
|
|
*p = ',';
|
|
|
p++;
|
|
|
- ids->len += cids.len + 1;
|
|
|
+ ids->len += cids[i].len + 1;
|
|
|
}
|
|
|
}
|
|
|
if(ids->len>0)
|