summaryrefslogtreecommitdiffstats
path: root/src/libosmocc/sdp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libosmocc/sdp.c')
-rw-r--r--src/libosmocc/sdp.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/libosmocc/sdp.c b/src/libosmocc/sdp.c
index 5afd3d6..8e44117 100644
--- a/src/libosmocc/sdp.c
+++ b/src/libosmocc/sdp.c
@@ -244,7 +244,7 @@ int osmo_cc_payload_type_by_attrs(uint8_t *fmt, const char *name, uint32_t *rate
*
* sdp = given SDP text
* return: SDP session description structure */
-struct osmo_cc_session *osmo_cc_session_parsesdp(void *priv, const char *_sdp)
+struct osmo_cc_session *osmo_cc_session_parsesdp(osmo_cc_session_config_t *conf, void *priv, const char *_sdp)
{
char buffer[strlen(_sdp) + 1], *sdp = buffer;
char *line, *p, *word, *next_word;
@@ -260,7 +260,7 @@ struct osmo_cc_session *osmo_cc_session_parsesdp(void *priv, const char *_sdp)
memset(&ccd, 0, sizeof(ccd));
/* create SDP session description */
- session = osmo_cc_new_session(priv, NULL, NULL, NULL, osmo_cc_session_nettype_inet, osmo_cc_session_addrtype_ipv4, "127.0.0.1", NULL, 0); // values will be replaced by local definitions during negotiation
+ session = osmo_cc_new_session(conf, priv, NULL, NULL, NULL, osmo_cc_session_nettype_inet, osmo_cc_session_addrtype_ipv4, "127.0.0.1", NULL, 0); // values will be replaced by local definitions during negotiation
/* check every line of SDP and parse its data */
while(*sdp) {
@@ -486,14 +486,14 @@ struct osmo_cc_session *osmo_cc_session_parsesdp(void *priv, const char *_sdp)
}
PDEBUG(DCC, DEBUG_DEBUG, " -> (rtpmap) payload type = %d\n", codec->payload_type_remote);
if (!(word = wordsep(&next_word)))
- break;
+ goto rtpmap_done;
if ((p = strchr(word, '/')))
*p++ = '\0';
free((char *)codec->payload_name); // in case it is already set above
codec->payload_name = strdup(word);
PDEBUG(DCC, DEBUG_DEBUG, " -> (rtpmap) payload name = %s\n", codec->payload_name);
if (!(word = p))
- break;
+ goto rtpmap_done;
if ((p = strchr(word, '/')))
*p++ = '\0';
codec->payload_rate = atoi(word);
@@ -502,10 +502,15 @@ struct osmo_cc_session *osmo_cc_session_parsesdp(void *priv, const char *_sdp)
/* if no channel is given and no default was specified, we must set 1 channel */
if (!codec->payload_channels)
codec->payload_channels = 1;
- break;
+ goto rtpmap_done;
}
codec->payload_channels = atoi(word);
PDEBUG(DCC, DEBUG_DEBUG, " -> (rtpmap) payload channels = %d\n", codec->payload_channels);
+ rtpmap_done:
+ if (!codec->payload_name || !codec->payload_rate || !codec->payload_channels) {
+ PDEBUG(DCC, DEBUG_NOTICE, "Broken 'rtpmap' definition in SDP line %d = '%s' Skipping codec!\n", line_no, line);
+ osmo_cc_free_codec(codec);
+ }
}
break;
}