From: Mark Michelson Date: Tue, 12 Feb 2013 20:31:52 +0000 (+0000) Subject: Do not allow native RTP bridging if packetization of media streams differs. X-Git-Tag: 11.4.0-rc1~71 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eecb9c36ff122925eb9b903a554c3f815408ec86;p=thirdparty%2Fasterisk.git Do not allow native RTP bridging if packetization of media streams differs. The RTP engine will no longer allow for local and remote native RTP bridges if packetization of streams differs. Allowing native bridging in this scenario has been known to cause FAX failures. (closes ASTERISK-20650) Reported by: Maciej Krajewski Patches: ASTERISK-20659.patch uploaded by Mark Michelson (License #5049) Review: https://reviewboard.asterisk.org/r/2319 ........ Merged revisions 381281 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@381306 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/main/rtp_engine.c b/main/rtp_engine.c index e7680ed52c..dc2983637c 100644 --- a/main/rtp_engine.c +++ b/main/rtp_engine.c @@ -1460,6 +1460,7 @@ enum ast_bridge_result ast_rtp_instance_bridge(struct ast_channel *c0, struct as struct ast_format_cap *cap0 = ast_format_cap_alloc_nolock(); struct ast_format_cap *cap1 = ast_format_cap_alloc_nolock(); int unlock_chans = 1; + int read_ptime0, read_ptime1, write_ptime0, write_ptime1; if (!cap0 || !cap1) { unlock_chans = 0; @@ -1568,6 +1569,18 @@ enum ast_bridge_result ast_rtp_instance_bridge(struct ast_channel *c0, struct as goto done; } + read_ptime0 = (ast_codec_pref_getsize(&instance0->codecs.pref, ast_channel_rawreadformat(c0))).cur_ms; + read_ptime1 = (ast_codec_pref_getsize(&instance1->codecs.pref, ast_channel_rawreadformat(c1))).cur_ms; + write_ptime0 = (ast_codec_pref_getsize(&instance0->codecs.pref, ast_channel_rawwriteformat(c0))).cur_ms; + write_ptime1 = (ast_codec_pref_getsize(&instance1->codecs.pref, ast_channel_rawwriteformat(c1))).cur_ms; + + if (read_ptime0 != write_ptime1 || read_ptime1 != write_ptime0) { + ast_debug(1, "Packetization differs between RTP streams (%d != %d or %d != %d). Cannot native bridge in RTP\n", + read_ptime0, write_ptime1, read_ptime1, write_ptime0); + res = AST_BRIDGE_FAILED_NOWARN; + goto done; + } + instance0->glue = glue0; instance1->glue = glue1; instance0->chan = c0;