aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libmgcp
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-09-01 10:50:22 +0200
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2014-09-02 09:22:19 +0200
commite46bc2714d3703ce11d71edcc3a0f060ff513ce3 (patch)
treee217c13f0327220d0f16e42caf050596ab732de8 /openbsc/src/libmgcp
parentfa80d07de0975fe3b00daeadd5d9f685abf62653 (diff)
mgcp: Store one more codec/payload type if it is present
In case of some RTP proxy from time to time we are offered both G729 and G711 but only one of them will work. I intend to adjust the codec at runtime in case we receive the wrong codec.
Diffstat (limited to 'openbsc/src/libmgcp')
-rw-r--r--openbsc/src/libmgcp/mgcp_protocol.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/openbsc/src/libmgcp/mgcp_protocol.c b/openbsc/src/libmgcp/mgcp_protocol.c
index fff2ece5c..a728b67c4 100644
--- a/openbsc/src/libmgcp/mgcp_protocol.c
+++ b/openbsc/src/libmgcp/mgcp_protocol.c
@@ -738,7 +738,9 @@ static int parse_sdp_data(struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p)
{
char *line;
int found_media = 0;
+ /* TODO/XXX make it more generic */
int audio_payload = -1;
+ int audio_payload_alt = -1;
for_each_line(line, p->save) {
switch (line[0]) {
@@ -758,10 +760,12 @@ static int parse_sdp_data(struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p)
if (sscanf(line, "a=rtpmap:%d %63s",
&payload, audio_name) == 2) {
- if (payload != audio_payload)
- break;
-
- set_audio_info(p->cfg, &rtp->codec, payload, audio_name);
+ if (payload == audio_payload)
+ set_audio_info(p->cfg, &rtp->codec,
+ payload, audio_name);
+ else if (payload == audio_payload_alt)
+ set_audio_info(p->cfg, &rtp->alt_codec,
+ payload, audio_name);
} else if (sscanf(line, "a=ptime:%d-%d",
&ptime, &ptime2) >= 1) {
if (ptime2 > 0 && ptime2 != ptime)
@@ -769,6 +773,7 @@ static int parse_sdp_data(struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p)
else
rtp->packet_duration_ms = ptime;
} else if (sscanf(line, "a=maxptime:%d", &ptime2) == 1) {
+ /* TODO/XXX: Store this per codec and derive it on use */
if (ptime2 * rtp->codec.frame_duration_den >
rtp->codec.frame_duration_num * 1500)
/* more than 1 frame */
@@ -777,15 +782,20 @@ static int parse_sdp_data(struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p)
break;
}
case 'm': {
- int port;
+ int port, rc;
audio_payload = -1;
+ audio_payload_alt = -1;
- if (sscanf(line, "m=audio %d RTP/AVP %d",
- &port, &audio_payload) == 2) {
+ rc = sscanf(line, "m=audio %d RTP/AVP %d %d",
+ &port, &audio_payload, &audio_payload_alt);
+ if (rc >= 2) {
rtp->rtp_port = htons(port);
rtp->rtcp_port = htons(port + 1);
found_media = 1;
set_audio_info(p->cfg, &rtp->codec, audio_payload, NULL);
+ if (rc == 3)
+ set_audio_info(p->cfg, &rtp->alt_codec,
+ audio_payload_alt, NULL);
}
break;
}
@@ -1486,6 +1496,7 @@ static void mgcp_rtp_end_reset(struct mgcp_rtp_end *end)
end->output_enabled = 0;
mgcp_rtp_codec_reset(&end->codec);
+ mgcp_rtp_codec_reset(&end->alt_codec);
}
static void mgcp_rtp_end_init(struct mgcp_rtp_end *end)