sip/sdp: Hack to get a GSM codec call connected
Extract IP and port once we have received the INVITE. In the near future we need to improve this!
This commit is contained in:
parent
c2474dc0be
commit
2a7cfb5c93
|
@ -90,7 +90,7 @@ success:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sdp_extract_sdp(struct sip_call_leg *leg, const sip_t *sip)
|
bool sdp_extract_sdp(struct sip_call_leg *leg, const sip_t *sip, bool any_codec)
|
||||||
{
|
{
|
||||||
sdp_connection_t *conn;
|
sdp_connection_t *conn;
|
||||||
sdp_session_t *sdp;
|
sdp_session_t *sdp;
|
||||||
|
@ -139,7 +139,7 @@ bool sdp_extract_sdp(struct sip_call_leg *leg, const sip_t *sip)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (map = media->m_rtpmaps; map; map = map->rm_next) {
|
for (map = media->m_rtpmaps; map; map = map->rm_next) {
|
||||||
if (strcasecmp(map->rm_encoding, leg->wanted_codec) != 0)
|
if (!any_codec && strcasecmp(map->rm_encoding, leg->wanted_codec) != 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
leg->base.port = media->m_port;
|
leg->base.port = media->m_port;
|
||||||
|
|
|
@ -8,6 +8,6 @@ struct sip_call_leg;
|
||||||
struct call_leg;
|
struct call_leg;
|
||||||
|
|
||||||
bool sdp_screen_sdp(const sip_t *sip);
|
bool sdp_screen_sdp(const sip_t *sip);
|
||||||
bool sdp_extract_sdp(struct sip_call_leg *leg, const sip_t *sip);
|
bool sdp_extract_sdp(struct sip_call_leg *leg, const sip_t *sip, bool any_codec);
|
||||||
|
|
||||||
char *sdp_create_file(struct sip_call_leg *, struct call_leg *);
|
char *sdp_create_file(struct sip_call_leg *, struct call_leg *);
|
||||||
|
|
17
src/sip.c
17
src/sip.c
|
@ -60,7 +60,7 @@ static void call_connect(struct sip_call_leg *leg, const sip_t *sip)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sdp_extract_sdp(leg, sip)) {
|
if (!sdp_extract_sdp(leg, sip, false)) {
|
||||||
LOGP(DSIP, LOGL_ERROR, "leg(%p) incompatible audio, releasing\n", leg);
|
LOGP(DSIP, LOGL_ERROR, "leg(%p) incompatible audio, releasing\n", leg);
|
||||||
nua_cancel(leg->nua_handle, TAG_END());
|
nua_cancel(leg->nua_handle, TAG_END());
|
||||||
other->release_call(other);
|
other->release_call(other);
|
||||||
|
@ -113,6 +113,21 @@ static void new_call(struct sip_agent *agent, nua_handle_t *nh,
|
||||||
leg->state = SIP_CC_DLG_CNFD;
|
leg->state = SIP_CC_DLG_CNFD;
|
||||||
leg->dir = SIP_DIR_MO;
|
leg->dir = SIP_DIR_MO;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FIXME/TODO.. we need to select the codec at some point. But it is
|
||||||
|
* not this place. It starts with the TCH/F vs. TCH/H selection based
|
||||||
|
* on the offered codecs, and then RTP_CREATE should have it. So both
|
||||||
|
* are GSM related... and do not belong here. Just pick the first codec
|
||||||
|
* so the IP addresss port and payload type is set.
|
||||||
|
*/
|
||||||
|
if (!sdp_extract_sdp(leg, sip, true)) {
|
||||||
|
LOGP(DSIP, LOGL_ERROR, "leg(%p) no audio, releasing\n", leg);
|
||||||
|
nua_respond(nh, SIP_406_NOT_ACCEPTABLE, TAG_END());
|
||||||
|
nua_handle_destroy(nh);
|
||||||
|
call_leg_release(&leg->base);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
leg->base.release_call = sip_release_call;
|
leg->base.release_call = sip_release_call;
|
||||||
leg->base.ring_call = sip_ring_call;
|
leg->base.ring_call = sip_ring_call;
|
||||||
leg->base.connect_call = sip_connect_call;
|
leg->base.connect_call = sip_connect_call;
|
||||||
|
|
Loading…
Reference in New Issue