浏览代码

sdpops: find codec ids in sdp when not found in static table

- functions to keep/remove codecs by name work now with dynamic ids for
  codecs
- reported by Juha Heinanen
Daniel-Constantin Mierla 14 年之前
父节点
当前提交
511dc62e6a
共有 3 个文件被更改,包括 62 次插入6 次删除
  1. 57 3
      modules/sdpops/sdpops_data.c
  2. 3 1
      modules/sdpops/sdpops_data.h
  3. 2 2
      modules/sdpops/sdpops_mod.c

+ 57 - 3
modules/sdpops/sdpops_data.c

@@ -137,10 +137,54 @@ int sdpops_get_ids_by_name(str *name, str *ids)
 	return -1;
 }
 
+/**
+ * get codec ID from a= line based on name
+ */
+int sdpops_sdp_get_ids_by_name(sdp_info_t *sdp, str *cname, str *cid)
+{
+	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;
+
+	sdp_session_num = 0;
+	for(;;)
+	{
+		sdp_session = get_sdp_session_sdp(sdp, sdp_session_num);
+		if(!sdp_session) break;
+		sdp_stream_num = 0;
+		for(;;)
+		{
+			sdp_stream = get_sdp_stream_sdp(sdp, sdp_session_num,
+							sdp_stream_num);
+			if(!sdp_stream) break;
+			sdp_payload = sdp_stream->payload_attr;
+			while (sdp_payload) {
+				if(sdp_payload->rtp_enc.len==cname->len
+						&& strncasecmp(cname->s, sdp_payload->rtp_enc.s,
+								cname->len)==0)
+				{
+					*cid = sdp_payload->rtp_payload;
+					return 0;
+				}
+
+				sdp_payload=sdp_payload->next;
+			}
+			sdp_stream_num++;
+		}
+		sdp_session_num++;
+	}
+
+	cid->s = NULL;
+	cid->len = 0;
+	return -1;
+}
+
 /**
  * build the csv list of ids from csv list of names
  */
-int sdpops_build_ids_list(str *names, str *ids)
+int sdpops_build_ids_list(sdp_info_t *sdp, str *names, str *ids)
 {
 #define SDPOPS_MAX_LIST_SIZE	64
 	static char _local_idslist[SDPOPS_MAX_LIST_SIZE];
@@ -159,11 +203,21 @@ int sdpops_build_ids_list(str *names, str *ids)
 		tmp.len -= (int)(&codec.s[codec.len]-codec.s);
 		tmp.s = codec.s + codec.len;
 
-		if( sdpops_get_ids_by_name(&codec, &cids)==0) {
-			LM_DBG("codecs list [%.*s] - at name [%.*s] with ids [%.*s]\n",
+		cids.s = NULL;
+		if(sdpops_get_ids_by_name(&codec, &cids)==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);
+		} 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",
+					names->len, names->s,
+					codec.len, codec.s,
+					cids.len,  cids.s);
+			}
+		}
+		if(cids.s!=NULL) {
 			if(ids->len + cids.len>=SDPOPS_MAX_LIST_SIZE)
 			{
 				LM_ERR("the list with codecs ids is too big\n");

+ 3 - 1
modules/sdpops/sdpops_data.h

@@ -24,10 +24,12 @@
 
 #ifndef _SDPOPS_DATA_H_
 #define _SDPOPS_DATA_H_
+
 #include "../../str.h"
+#include "../../parser/sdp/sdp.h"
 
 int sdpops_get_ids_by_name(str *name, str *ids);
 int str_find_token(str *text, str *result, char delim);
-int sdpops_build_ids_list(str *names, str *ids);
+int sdpops_build_ids_list(sdp_info_t *sdp, str *names, str *ids);
 
 #endif

+ 2 - 2
modules/sdpops/sdpops_mod.c

@@ -356,7 +356,7 @@ int sdp_remove_codecs_by_name(sip_msg_t* msg, str* codecs)
 	LM_ERR("attempting to remove codecs from sdp: [%.*s]\n",
 			codecs->len, codecs->s);
 
-	if(sdpops_build_ids_list(codecs, &idslist)<0)
+	if(sdpops_build_ids_list((sdp_info_t*)msg->body, codecs, &idslist)<0)
 		return -1;
 
 	if(sdp_remove_codecs_by_id(msg, &idslist)<0)
@@ -491,7 +491,7 @@ int sdp_keep_codecs_by_name(sip_msg_t* msg, str* codecs)
 	LM_ERR("attempting to keep codecs in sdp: [%.*s]\n",
 			codecs->len, codecs->s);
 
-	if(sdpops_build_ids_list(codecs, &idslist)<0)
+	if(sdpops_build_ids_list((sdp_info_t*)msg->body, codecs, &idslist)<0)
 		return -1;
 
 	if(sdp_keep_codecs_by_id(msg, &idslist)<0)