aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--channels/chan_sip.c37
-rw-r--r--include/asterisk/rtp.h8
-rw-r--r--main/rtp.c19
3 files changed, 52 insertions, 12 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c
index 9023d0939..c9281c75f 100644
--- a/channels/chan_sip.c
+++ b/channels/chan_sip.c
@@ -5203,16 +5203,37 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req)
continue;
} else if (sscanf(a, "rtpmap: %u %[^/]/", &codec, mimeSubtype) == 2) {
/* We have a rtpmap to handle */
- if (debug)
- ast_verbose("Found description format %s for ID %d\n", mimeSubtype, codec);
- found_rtpmap_codecs[last_rtpmap_codec] = codec;
- last_rtpmap_codec++;
+ int found = FALSE;
+ /* We should propably check if this is an audio or video codec
+ so we know where to look */
/* Note: should really look at the 'freq' and '#chans' params too */
- ast_rtp_set_rtpmap_type(newaudiortp, codec, "audio", mimeSubtype,
- ast_test_flag(&p->flags[0], SIP_G726_NONSTANDARD) ? AST_RTP_OPT_G726_NONSTANDARD : 0);
- if (p->vrtp)
- ast_rtp_set_rtpmap_type(newvideortp, codec, "video", mimeSubtype, 0);
+ if(ast_rtp_set_rtpmap_type(newaudiortp, codec, "audio", mimeSubtype,
+ ast_test_flag(&p->flags[0], SIP_G726_NONSTANDARD) ? AST_RTP_OPT_G726_NONSTANDARD : 0) != -1) {
+ if (debug)
+ ast_verbose("Found audio description format %s for ID %d\n", mimeSubtype, codec);
+ found_rtpmap_codecs[last_rtpmap_codec] = codec;
+ last_rtpmap_codec++;
+ found = TRUE;
+
+ } else if (p->vrtp) {
+ if(ast_rtp_set_rtpmap_type(newvideortp, codec, "video", mimeSubtype, 0) != -1) {
+ if (debug)
+ ast_verbose("Found video description format %s for ID %d\n", mimeSubtype, codec);
+ found_rtpmap_codecs[last_rtpmap_codec] = codec;
+ last_rtpmap_codec++;
+ found = TRUE;
+ }
+ }
+ if (!found) {
+ /* Remove this codec since it's an unknown media type for us */
+ /* XXX This is buggy since the media line for audio and video can have the
+ same numbers. We need to check as described above, but for testing this works... */
+ ast_rtp_unset_m_type(newaudiortp, codec);
+ ast_rtp_unset_m_type(newvideortp, codec);
+ if (debug)
+ ast_verbose("Found unknown media description format %s for ID %d\n", mimeSubtype, codec);
+ }
}
}
diff --git a/include/asterisk/rtp.h b/include/asterisk/rtp.h
index cbcb6aae6..1ffa04d0d 100644
--- a/include/asterisk/rtp.h
+++ b/include/asterisk/rtp.h
@@ -170,8 +170,14 @@ void ast_rtp_pt_default(struct ast_rtp* rtp);
/*! \brief Copy payload types between RTP structures */
void ast_rtp_pt_copy(struct ast_rtp *dest, struct ast_rtp *src);
+/*! \brief Activate payload type */
void ast_rtp_set_m_type(struct ast_rtp* rtp, int pt);
-void ast_rtp_set_rtpmap_type(struct ast_rtp* rtp, int pt,
+
+/*! \brief clear payload type */
+void ast_rtp_unset_m_type(struct ast_rtp* rtp, int pt);
+
+/*! \brief Initiate payload type to a known MIME media type for a codec */
+int ast_rtp_set_rtpmap_type(struct ast_rtp* rtp, int pt,
char *mimeType, char *mimeSubtype,
enum ast_rtp_options options);
diff --git a/main/rtp.c b/main/rtp.c
index 624f1673d..7885a5778 100644
--- a/main/rtp.c
+++ b/main/rtp.c
@@ -1640,23 +1640,36 @@ void ast_rtp_set_m_type(struct ast_rtp* rtp, int pt)
ast_mutex_unlock(&rtp->bridge_lock);
}
+/*! \brief remove setting from payload type list if the rtpmap header indicates
+ an unknown media type */
+void ast_rtp_unset_m_type(struct ast_rtp* rtp, int pt)
+{
+ ast_mutex_lock(&rtp->bridge_lock);
+ rtp->current_RTP_PT[pt].isAstFormat = 0;
+ rtp->current_RTP_PT[pt].code = 0;
+ ast_mutex_unlock(&rtp->bridge_lock);
+}
+
/*! \brief Make a note of a RTP payload type (with MIME type) that was seen in
* an SDP "a=rtpmap:" line.
+ * \return 0 if the MIME type was found and set, -1 if it wasn't found
*/
-void ast_rtp_set_rtpmap_type(struct ast_rtp *rtp, int pt,
+int ast_rtp_set_rtpmap_type(struct ast_rtp *rtp, int pt,
char *mimeType, char *mimeSubtype,
enum ast_rtp_options options)
{
unsigned int i;
+ int found = 0;
if (pt < 0 || pt > MAX_RTP_PT)
- return; /* bogus payload type */
+ return -1; /* bogus payload type */
ast_mutex_lock(&rtp->bridge_lock);
for (i = 0; i < sizeof(mimeTypes)/sizeof(mimeTypes[0]); ++i) {
if (strcasecmp(mimeSubtype, mimeTypes[i].subtype) == 0 &&
strcasecmp(mimeType, mimeTypes[i].type) == 0) {
+ found = 1;
rtp->current_RTP_PT[pt] = mimeTypes[i].payloadType;
if ((mimeTypes[i].payloadType.code == AST_FORMAT_G726) &&
mimeTypes[i].payloadType.isAstFormat &&
@@ -1668,7 +1681,7 @@ void ast_rtp_set_rtpmap_type(struct ast_rtp *rtp, int pt,
ast_mutex_unlock(&rtp->bridge_lock);
- return;
+ return (found ? 0 : -1);
}
/*! \brief Return the union of all of the codecs that were set by rtp_set...() calls